Home > Latest topics

Latest topics 近況報告

たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。

萌えるふぉくす子さんだば子本制作プロジェクトの動向はもえじら組ブログで。

宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

Page 38/248: « 34 35 36 37 38 39 40 41 42 »

Minefield 3.7a4preのタブバーの仕様変更に対してツリー型タブで取った対応方法 - Mar 29, 2010

タブバーがtabbrowser要素の中から取り出されて1つのツールバーになったということで、タブ関係の挙動を変える系のアドオンが死屍累々なんじゃないかと不謹慎にもwktkしてるわけですけれども。特に影響が大きくて話としても「あーそりゃそうなるわな」ってのが分かりやすいのは、やはりタブバーの表示位置の変更機能ですよね。

今まで

今までは、Firefoxのメインウィンドウの中身は簡単に言えばこんな要素構造になってた。

<toolbox>
  <toolbar/>
</toolbox>
<tabbrowser>
  <tabbox orient="vertical">
    <tabs orient="horizontal">
      <tab/>
      <tab/>
    </tabs>
    <tabpanels>
      <browser/>
      <browser/>
    </tabpanels>
  </tabbox>
</tabbrowser>

XULのレイアウトは主にMozillaの関係者からCSS3に提案中のflexible box layoutに基づいてるんだけど、

  • -moz-box-orient: horizontal(XUL要素の属性指定だとorient="horizontal")だとボックスの中身が横に並ぶ。
  • -moz-box-orient: vertical(XUL要素の属性指定だとorient="vertical")だとボックスの中身が縦に並ぶ。
  • -moz-box-ordinal-groupの値(XUL要素の属性指定だとordinalの値)の順にボックスが並べ替えられて表示される。

これだけの事を組み合わせれば、タブバーの位置を上下左右好きな位置に移動できた。

  • 初期状態では、tabboxのorientがverticalで、tabsにもtabpanelsにもordinalは指定されていないので、タブバーは上に来る。
  • tabboxのorientをhorizontalにしてtabsのorientをverticalにすれば、タブバーが左に来る。
  • tabsのordinalを2、tabpanelsのordinalを1にすれば、タブバーが下に来る。
  • 両方を同時に指定すれば、タブバーが右に来る。

という具合。

これから

ところが、bug 347930のパッチで要素構造が以下のようにガラッと変わった。

<toolbox>
  <toolbar/>
  <toolbar id="TabsToolbar">
    <tabs orient="horizontal">
      <tab/>
      <tab/>
    </tabs>
  </toolbar>
</toolbox>
<tabbrowser>
  <tabbox orient="vertical">
    <tabpanels>
      <browser/>
      <browser/>
    </tabpanels>
  </tabbox>
</tabbrowser>

こうなると、単純にボックスの並び順やら並べる方向やらを変えただけではタブバーの位置を動かせない。

  • toolboxの中にtabsがあるので、ordinalではtabbrowserより下にtabsを持って来れない。無理に持ってこようとするとtoolbox全体がtabbrowserの下に来てしまう。
  • toolboxの中にtabsがあるので、orientではtabbrowserの横にtabsを持って来れない。無理に持ってこようとするとtoolbox全体がtabbrowserの左に来てしまう。

ドン詰まりですね。

他のタブ関係のアドオンが採用した方法

alice0775さんの調べによると、タブバーの位置を変える機能を持ってる他のアドオンでは、tabsを一旦DOMツリーから取り外して別の位置に挿入し直すという方法で、タブバーの表示位置変更を実現しているらしい。

しかしこのやり方だと、tabsがDOMツリーから取り外されるより前に他のアドオンが行った初期化処理の効果がリセットされてしまう場合がある。リンク先のエントリでいくつか挙げられてる懸念がそれ。

本当だったらFirefox本体の方でなんとか面倒を見て欲しい(タブバーの位置変更を行う機能を持たせて、位置が変わる前と後でイベントを発行するようにするとか)所なんだけど、責任者の人達をIRCで英語で説得する自信は全く無いチキンでTOEICスコアめためたで英語音痴な僕は、アドオン側でなんとかする方法を考えないといけない。しかし、最も単純なやり方(DOMツリーの改変)だと他のアドオンとの競合という点で弊害が大きすぎる。

そういうわけで、ちょっと考えてみました。DOMツリーをいじらずにタブバーの位置を変える方法を。

ツリー型タブが採用した方法

ヒントになったのは、XUL/Migemoの「タブバーの下に検索バーを移動する」機能や、Unified Sidebarの「サイドバーを縦型タブバーの下半分に表示する」機能の実装方法。

これらのアドオンでは「検索バーやサイドバーを表示したい位置にmarginやpaddingでスペースを設けて、検索バーやサイドバーをCSS2のポジショニングでその位置に重ねる」という方法で、DOMツリーを改変することなく要素の表示位置だけを変更している。また、ウィンドウの大きさなどが変わった時には、resizeイベントを捕捉して表示位置や要素の表示サイズを自動調整するようにしている。

ツリー型タブのMinefield 3.7a4pre対応でも、基本的にはそれと同じ方法を使う事にした。ただ、タブバーの幅をリサイズできるようにするsplitterを、ポジショニングで表示位置を変えられた状態向けにゼロから作りなおすのは面倒だったので、tabboxの中にダミーのhbox要素を挿入して、splitterは普通にXULのsplitterを使い続ける事にした。

<toolbox>
  <toolbar/>
  <toolbar id="TabsToolbar">
    <tabs orient="horizontal">
      <tab/>
      <tab/>
    </tabs>
  </toolbar>
</toolbox>
<tabbrowser>
  <tabbox orient="vertical">
    <hbox/>
    <splitter/>
    <tabpanels>
      <browser/>
      <browser/>
    </tabpanels>
  </tabbox>
</tabbrowser>

このようにした上で、

  • hboxを含むtabboxの内容を、Firefox 3.6までの手法でレイアウトして、tabsの表示用のスペースを確保する。
  • hboxの上に同じ大きさでtabsを重ねる。
  • splitterによってhboxがリサイズされた時は、tabsの位置や大きさを自動的に更新する。

とする事で、ぱっと見は今までと同じような挙動を実現しつつ、タブ周りのDOMツリーは一切破壊しないという実装になった。

どっちのやり方の方がいいのか

ツリー型タブのやり方とTab Mix Plus等のやり方のどっちがいいかは、一概には言えない。どちらにもメリットとデメリットがある。

ただ僕は、ツリー型タブで採用したやり方の方が「他のアドオンが全く動かなくなってしまうような衝突の仕方はしなくて、仮に衝突しても最小限の労力でなんとか回避できる可能性が高い」と信じている。

現在Firefox本体の側には、3.6以前のバージョンのFirefox向けに書かれたアドオンについて、Minefield 3.7a4pre以降でもそのまま動くようにするためのパッチも取り込まれている。ちょっとアドオンの作り方に気をつけさえすれば、タブをダブルクリックした時の挙動を変えるとか、リンクから開いたタブの位置を制御するとかいった単機能のアドオンは、ほとんど何も手を加えずにMinefield 3.7a4pre以降に対応できるようになってる。

しかしながら、Tab Mix Plusが現在採用している(らしい)DOMノードを切り貼りするやり方では、「ほっといても他のアドオンがちゃんと動いてくれる」ようにはなりにくい。「DOMノードの切り貼りでタブバーの位置が変更された事」を検知して何らかの特別な初期化処理を行うようなコード、を他のアドオンの側に加えてもらわないと互換性を保てない。僕は、僕のアドオンと競合しないで使えるようにするために、他のアドオンの作者がわざわざ気を使ってくれるとは思えない。僕が作ってる物が、そこまで他のアドオン作者から特別視してもらえる存在だとは、思えない。

なので、僕がアドオンを作る時はなるべく、他のアドオンの側に変更が必要になるような作りにはしないでおこうと思ってる。どうしてもそうなる時は、APIを提供してAPI経由でスッキリと連携できるようにしようと思ってる。そういう謙虚というか悲観的な姿勢が、「ユーザがどんなアドオンと組み合わせて使うかは全く分からない」アドオンを作る上では必要なんじゃないかと思ってる。

nsIVariantを使ってるアドオンが終了していた、と思ったら僕の知識の方が終了していた件 - Mar 23, 2010

SCRAPBLOG : JavaScript 製 XPCOM で配列構造・列挙構造のデータをメソッドの戻り値にする

独自に開発したXPCOMコンポーネントに対して配列を渡したり、あるいは戻り値を配列で受け取ったり、ということをやる方法はいくつかある。上記エントリではコメント欄も含めると4つの方法が紹介されていて、そのうちコメント欄にある2つはJavaScriptの配列をそのまま受け渡せるという点で有用だ。特にnsIVariantインターフェースを使うやり方は、戻り値に使う時に余計な引数を定義しなくていいので、実際にそのXPCOMコンポーネントをJavaScriptから使う時にとても使い勝手がいい。

ということでXUL/Migemoでは積極的にnsIVariantを使ってたんだけど、これがMinefield(検証したバージョンは3.7a4pre)で動かなくなってた。

結論から言うと、これはnsIVariantインターフェースのIIDが6c9eb060-8c6a-11d5-90f3-0010a4e73d9aから81e4c2de-acac-4ad6-901a-b5fb1b851a0dに変更されたせいで起こっている問題で、nsIDOMRangeのIIDが変更された時に起こった問題と同様の物だ。

変更が入ったのは昨年9月で、HTML5の新しい仕様に対応するための作業の一環として、何らかの必要があってインターフェースに機能を加えると同時にIIDも変わったらしい。nsIVariantはFROZENなインターフェースじゃないから、nsIDOMRangeの時のようにIIDが元に戻されることは多分あり得ない。よって、考えられる対策は以下のいずれかということになる 。

  • APIをXPCOM経由で提供する事を諦める。Firefox 2以前、Thunderbird 2以前を切り捨てて、JavaScriptコードモジュールとして書き直す。
  • Firefox 3.6以前用とFirefox 3.7以降用とでXPIDLのコンパイル後のバイナリを分けて、Firefoxのバージョン別に2つのXPIファイルを提供するようにする。

JavaScriptコードモジュールにするデメリットは、Thunderbird 2で利用できなくなってしまう点と、APIが変わってしまう点。バイナリを分けるデメリットは、リリースの時の作業がめんどくさくなる(XPIファイルが2つになるので)という点。どっちを選んでも大変なのは変わらない……

APIが変わってしまうことは避けたかったので、結局、後者の方で対処することにした。

前から使ってるXPI生成用シェルスクリプトに起動オプションでサフィックスを指定できるようにして、

こんなショボいスクリプトを作って、前出のスクリプトと一緒に

call xpidl.bat xulrunner-sdk-1.9.2
bash makexpi.sh -n xulmigemo -v 0 -s "1.9.2"

call xpidl.bat xulrunner-sdk-central
bash makexpi.sh -n xulmigemo -v 0 -s "central"

てな感じで実行するようにして(make.bat / make.sh)、MozillaのFTPサイトからXULRunner SDKのファイル一式を入手して

  • xulmigemo
    • make.bat (make.sh)
    • xpidl.bat (xpidl.sh)
    • makexpi.sh
    • install.rdfなど
  • xulrunner-sdk-1.9.2
    • bin
      • xpidl.exe (xpidl)
    • idl
  • xulrunner-sdk-central
    • bin
      • xpidl.exe (xpidl)
    • idl

という感じにファイルを配置するようにした。

XPIを作りたい時にはXULRunner SDKが必要になってしまうけど、スクリプトいっこ走らせれば xulmigemo-mozilla-1.9.2.xpi と xulmigemo-mozilla-central.xpi という風に複数のXPIを出力できるようになったので、リリースにかかる手間は少しは軽減された……のかな……

追記。Gomitaさんのコメントを見て、IDLファイルからincludeの行を消して試してみたら、それでちゃんとコンパイルできた。なんでだ……!!!

えーと。ずっと勘違いしてたんだけど、#include "nsISupports.idl" みたいな行は、interface xmIXMigemoFileAccess : nsISupports てな感じでインターフェース定義の継承元に別のインターフェースを使う場合にだけ必要で、戻り値や引数に使う分には単に interface nsIVariant; とだけ書いておけばいいみたいですね……そうすると、コンパイル時には余計なIIDが含まれなくなって、Firefox 3.6まででも3.7以降でも問題なく使えるXPTファイルが作られるみたい。

まとめ。

  • IDLファイルの書き方を間違えておらず、最小限の記述だけにしてあれば、コンパイルしたXPTファイルはFirefox 3.6まででもFirefox 3.7以降でも使える。
    • 継承元に使うインターフェースはその内容が定義されたIDLファイルをincludeした上で interface インターフェース名; と書く。
    • そうでない物(引数や戻り値でしか使わないインターフェース)は interface インターフェース名; だけ書く。
  • Minefield 3.7におけるnsIVariantのIIDの変更の影響を受けるのは、nsIVariantを継承元としてさらに拡張したインターフェースを定義する場合だけ。

そんなわけで、xmIXMigemo.idlの頭の所はずいぶんスッキリしました。

#include "nsISupports.idl"
#include "nsIObserver.idl"

interface nsIObserver;
interface nsIFile;
interface nsIVariant;
interface nsIDOMWindow;
interface nsIDOMDocument;
interface nsIDOMRange;
interface nsIDOMElement;
interface nsIDOMNode;


/* Utilities: You can use them for your language without additional implementation. */

[scriptable, uuid(4aca3120-ae38-11de-8a39-0800200c9a66)]
interface xmIXMigemoFileAccess : nsISupports
{
(以下略)

Split Browser(分割ブラウザ)をFox Splitterに改名した - Mar 19, 2010

「Split Browser」という名前で公開してたアドオンについて、「名前かぶってるから変えてんか(大意)」というメールが来た。2004年からある「SplitBrowser」という名前のWebKitベースのブラウザの作者の人だった。

こっちの奴は2007年が最初のリリースなので、どう考えてもこっちが悪いですよね……ということで名前を変える事にした。edvakfさんが呟いた「SplitFox」という名前がナイスだと思ったんだけど、検索してみたところそういうハンドルで活動してる人がいたので、これも駄目かーと思ってちょっとひねって「Fox Splitter」にした。

リポジトリ上のファイルは全部修正したけど、リリースはしてないので、今インストールすると表示は「Split Browser」のままです。名前が変わるのは次のバージョンからという事で、今はまだWebページだけの変更。

ツリー型タブのサイドバーをAll-in-One Sidebarと連携させられないの?(I want the tree of tabs to be shown in the sidebar.) - Mar 19, 2010

Q

I was wondering if there is any way to have it open inside All-in-One Sidebar. If so could you please tell me how to do it?

ツリー型タブの縦型タブバーをAll-in-One Sidebarの中で表示する方法があるなら、教えてもらえませんか?

A

Unfortunately, there is no way. Tree Style Tab's vertical tab bar is not a "sidebar panel", so, it cannot be showin in the AIOS sidebar.

There is another addon "Tab Tree" which provide a sidebar panel of tree of tabs.

It is abandoned by the author, however, it is very similar to your requirement. He published it as a public domain software, so, if you can, you'll take over the project without any warranty.

By the way, I think that Unified Sidebar possibly help you.

残念ながら、方法はありません。ツリー型タブが提供する縦長のタブバーはサイドバー用のパネルではないので、All-in-One Sidebarの中に表示する事はできません。

他のアドオンで、タブのツリーのサイドバーパネルを提供する「Tab Tree」という物があります。

作者はこのアドオンをもう更新しないという事を公言していますが、これはあなたの求めているものによく似ています。彼はこのアドオンを、著作権を主張しないパブリックドメインソフトウェアとしているようなので、もしやる気があるなら、あなたはこのアドオンの開発を(許可を求めずとも)引き継ぐ事ができます。

あと、ひょっとしたらUnified Sidebarもあなたの役に立つかもしれません。

独自の文書型宣言を含めつつエラーを出さない方法(XHTML 1.1でXMLとして他の名前空間の要素を組み合わせて使いたい人向けの話) - Mar 17, 2010

僕はXHTMLのルビ(小さな字で読み仮名をふったりするアレ)を使いたくてXHTML 1.1を選択してるんですが、過去にXHTML2で検討されてたl要素(パラグラフより細かい単位の「行」を示すための物)やiframeやなんかをどうしても埋め込みたくなって、しかしそのせいでバリデータでエラーが出てしまうのも嫌だったので、見よう見まねで頑張って独自の文書型宣言を書いてみたんですよ。いつやったのか忘れたけど、結構前に。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
    <!ENTITY % XLINK.xmlns.attrib "xmlns:xhtml2 CDATA #FIXED 'http://www.w3.org/2002/06/xhtml2'">
    <!ENTITY % Inline.extra "| xhtml2:l | iframe">

    <!ELEMENT xhtml2:l (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
    <!ATTLIST xhtml2:l 
      id    ID    #IMPLIED
      class CDATA #IMPLIED
      style CDATA #IMPLIED
      title CDATA #IMPLIED>

    <!ELEMENT iframe (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
    <!ATTLIST iframe
      id    ID    #IMPLIED
      class CDATA #IMPLIED
      style CDATA #IMPLIED
      title CDATA #IMPLIED
      longdesc     CDATA               #IMPLIED
      src          CDATA               #IMPLIED
      frameborder  ( 1 | 0 )           '1'
      marginwidth  CDATA               #IMPLIED
      marginheight CDATA               #IMPLIED
      scrolling    ( yes | no | auto ) 'auto'
      height       CDATA               #IMPLIED
      width        CDATA               #IMPLIED
    >
]>

CGIを使ってIEにはこの文書型宣言を出さないようにしてますが、FirefoxとかChromeとかでトップページあたりを開いてソースを見れば、こういうのが頭にくっついてるのが分かると思います。

で、バリデータ的にはこれでvalidになったのでめでたしめでたしだったんですが、GeckoのDTDパーサ部分にバグがあるらしくて、この文書型宣言を正しく解釈してくれないんですよね。最後の]>ではなくその前の>の部分で文書型宣言が終わったものと見なされてしまうせいで、Firefoxでこのサイトのページを開くと、ページの頭に謎の]>という文字列がくっついてしまう状態になってたのです。表示が崩れるのが嫌だったので、この]>がテキストノードとしてページの頭に存在してる時は動的に削除するようなJavaScriptを書いて、長らくごまかしてました。

そしたら先日、W3CのHTML5のルビに関する議論の中で紹介されてたXHTMLルビサポートのページを見たという方(Leif Halvard Silliさん)がメールを下さいまして、以下のようなハックを使えばページの頭に謎の]>が出てくる事を防げるよ、と教えてくれたんです。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
    <!ENTITY % XLINK.xmlns.attrib "xmlns:xhtml2 CDATA #FIXED 'http://www.w3.org/2002/06/xhtml2'">
    <!ENTITY % Inline.extra "| xhtml2:l | iframe">

    <!ELEMENT xhtml2:l (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
    <!ATTLIST xhtml2:l 
      id    ID    #IMPLIED
      class CDATA #IMPLIED
      style CDATA #IMPLIED
      title CDATA #IMPLIED>

    <!ELEMENT iframe (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
    <!ATTLIST iframe
      id    ID    #IMPLIED
      class CDATA #IMPLIED
      style CDATA #IMPLIED
      title CDATA #IMPLIED
      longdesc     CDATA               #IMPLIED
      src          CDATA               #IMPLIED
      frameborder  ( 1 | 0 )           '1'
      marginwidth  CDATA               #IMPLIED
      marginheight CDATA               #IMPLIED
      scrolling    ( yes | no | auto ) 'auto'
      height       CDATA               #IMPLIED
      width        CDATA               #IMPLIED
    >
<?parser-hack ><!-- ?>
]>
<!--><?!-->

強調箇所がそのハック。処理命令(PHPのコード片を埋め込んだりするのに使うのと同じ奴)の記法でコメントとして解釈できる文字列を埋め込んで、問題の部分を無視させるという物のようです。バリデータに通しても、これでもvalidです。素晴らしいです。

同じような事をやってる酔狂な人がもしいたら役立てて欲しいと思ったので、氏に許可を得てエントリにさせて頂きました。Thanks a lot, Leif!

文法的な解釈

何故これがvalidなのかも考えてみよう。

<?parser-hack ><!-- ?>
  • この行は、これ自体で1つの処理命令となる。
    • 処理命令は <?ターゲット名 任意のUnicode文字?> という書式なので、これはあくまで「><!-- という内容」を含んだ処理命令として解釈される。
  • 文書型宣言の定義では、[から]までの間に登場しうる内容として処理命令も含まれている。そして、上記の箇所は一つの完結した処理命令である。よって、文書型宣言中に登場しても何ら問題ない。
<!--><?!-->
  • この行は、「><?! という内容」を含んだコメントと解釈される。

という具合で文法的には何も問題ないので、W3Cのバリデータはこれをvalidと判断する。きちんとXMLパーサを実装しているブラウザ上でも同様です。

Geckoの解釈

一方、Geckoの解釈はどうか。これは「ソースを表示」での色分けを見るとよく分かる。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [

Geckoはまず、この部分だけで完結した文書型宣言と認識する。「[」で終わりと判断したのではなくて、その次の <!ENTITY が来た時点で「あ、もう文書型宣言は終わってたのね」と見なしてるようだ。

<!ENTITY ~>
<!ELEMENT ~>
<!ATTLIST ~>

この辺はすべて、それぞれ別々の宣言として解釈されている。という事で、

]>

何もハックをしない場合はこの部分だけが取り残されてしまって、Gecko的にはこれが「XML的には不正だけどSGML的にはアリ」なテキストノードとして扱われて、ゴミとして表示されてしまうわけだ。

では、ハック有りの場合はどうなるか。

<?parser-hack ><!-- ?>
]>
<!--><?!-->

Geckoはこれを3つのノードとして解釈している。

<?parser-hack >

まずGeckoは、これを1つの処理命令と判断する。XMLの仕様では ?> が来るまで処理命令の終わりにはならないんだけど、Geckoのパーサは > で処理命令が終わったものと見なしてしまう。

<!-- ?>
]>
<!-->

これは当然1つのコメントになる。

<?!-->

最後、これも <? から > までで1つの処理命令と見なされる。

という事で、ハック有りの時はどの文字もテキストノードとして取り残されずに済むので、画面上は何もゴミが表示されずに済む。

こんなのよく考えるなー、と、読み解いてみて改めて感心しました。

すべて彼女のために - Mar 11, 2010

撃たれると痛い「すべて彼女のために」 - 2010-03-01 - ゾンビ、カンフー、ロックンロールのレビューを見て気になったので、すべて彼女のためにを見てきた。東京だと有楽町、神奈川だと横浜、関西だと大阪で上映してるようです。って3館だけかい! これから増えるのかな? 毎週水曜の安くなる日でも夜の回は結構空いてました。

  • セリフがいきなり英語じゃなくて驚いたんだけど、これフランスの映画だったんですね。
  • 妻が逮捕された冤罪については、真実を解き明かすとかそういう展開は無いです。逃げようのない極限状態に追い込まれた時に、人は愛する人のために一体どこまでできるのか? という事を描くための背景設定でしかないので。
  • ギリギリの綱渡りばかりで、見てて非常にハラハラいたしました。
  • 親も兄弟も友達も仕事も住む所も、今の生活を全部捨ててでも取り戻したいモノ。それのためにどこまでも強くなろうとする、でもなりきれないで挫けそうになる、主人公の葛藤がすごい。妻が電話口で崩れ落ちる時の絶望感がすさまじい。

見終わった後、圧倒されて言葉が出てこなくなる。そんな映画でした。

Windows VistaからWindows 7へアップグレードした - Mar 08, 2010

会社で使ってるWindows Vistaがどういうわけか、ハイバネーションからの復帰にやたら時間がかかるわ復帰後ほっとくとブルースクリーンになるわで死にかけだったので、一縷の望みを託してWindows 7にアップグレードしてみることにした。(もしなんかのファイルが破損してるなら、そのファイルが使われなくなってくれないかなあ?と思ったので。)

  • 「エクスプローラ」改め「エクスプローラー」をファイラ代わりに使うにあたって、左ペインにフォルダのツリーを表示できなくなっていた。
    • フォルダーオプションで「全般」タブの「ナビゲーション ウィンドウ」で「すべてのフォルダーを表示する」と「自動的に現在のフォルダーまで展開する」にチェックを入れてやらないと、今までと同じ使い勝手にできない。
  • フォルダアイコンをデスクトップの端にドロップして作るツールバーが、Windows 7では使えない。これまでは、クイック起動をタスクバーから分離して、個別のツールバーとしてランチャ代わりに利用していたのだけれども、代替手段が無くなってしまった。
    • Windows 7のタスクバーはMac OS XのDockのパクリなので、一回起動してタスクバー上のボタンを右クリック→登録 でタスクバーにショートカットを登録できるんだけど、なにぶん数が多い(Firefox 2、Firefox 3、Firefox 3.5、Firefox 3.6、Minefieldのそれぞれで通常起動とコンソール付きの2通り、同じようなショートカットがThudnerbird用にもある)ので、登録し直すのが面倒でたまらない。
    • 登録し直してみたけど、それぞれのアイコンの横にラベルを表示できないみたいで、判別に苦労する。
    • ショートカットの実体は C:\Users\ユーザ名\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar に置かれるので、ここにショートカットを置けばタスクバーの方に反映されるのかな?と思って試してみたけど駄目だった。タスクバー上でピン留めしないと表示されなかった。
  • Windows 7のインストール時に、互換性のレポートでMicrosoft Virtual PC 2007 SP1がWindows 7での動作を保証されていないという警告が出た。
    • Windows 7になってからVirtual PCを起動すると、VMNetSrv.sysというファイルが見つからないとかなんとかいうエラーが出た。
    • このファイルは C:\Windows\System32\DriverStore\FileRepository\vmnetsrv.inf_x86_neutral_ランダムな文字列? の位置にあった。ファイルの検索で見つかったので、選択してやると、Virtual PCが起動してくれた。
    • 1回正常に起動した後は、それ以後も問題なく動いてるみたい。
    • クライアントOSのWindows XPとの間でドラッグ&ドロップでファイルをコピーする機能もちゃんと動いてる。

これでまだ落ちるようだったら無駄なことに時間を使ってしまったということになるのでとても悲しいです。

四次元ポケットを考えていたら、他のひみつ道具の原理も説明できた - Mar 02, 2010

ドラえもんの4次元ポケットについて真面目に考えてみた。

4次元ポケットの中には、外見から想像される容積より遙かに多くの物を格納することができる。また、内部空間はスペアポケットとの間で共有されているため、スペアポケットから入ってドラえもんのポケットから出てくるということもできる。(実際に、行方不明・回収不能になったドラえもんを発見するためにこの方法を使ったエピソードもある。)

4次元という物を正しく理解すると、どのようにすればこういった仕組みを実現できるのかが見えてくる。

4次元を理解するには、2次元と3次元を対比した場合を考えるのが手っ取り早い。

  • 2次元の住人である2Dドラえもんや2Dのび太達は、床の上に置かれた1枚の巨大な模造紙のようなレイヤである、2次元世界で生活している。
    • この世界は平面なので、X軸とY軸しか無い。
  • ここで、2Dドラえもんがお腹の3次元ポケットに2次元の物体を放り込んだとしよう。するとその物体は、2Dドラえもん達が生活しているレイヤから数mmだけZ軸方向にずれた所に平行に浮かんでいる別のレイヤに移動する。
    • つまり、物体は「3次元ポケットの中に入っている」のではなく、レイヤ同士を繋ぐ3次元ポケットという「ゲート」を通じて別のレイヤへ移動されているのである。
  • これらのレイヤの重なりの方向であるZ軸は、2次元世界のX軸とY軸に対してそれぞれ90度直交している。2次元世界の住人達はZ軸の存在を知らないし、Z軸方向に動くこともできないので、隣のレイヤにある物体を見ることはできないし、ぶつかることもない。
  • 同様のレイヤが、2Dドラえもんの生活する2次元世界や3次元ポケットの先のレイヤの他にも無数に存在していて、ミルフィーユのように積み重なっている。2Dドラえもんの3次元ポケットの出口をどのレイヤに設定するか――出口をどれだけZ軸方向にずらすかは、おそらく任意に決めることができる。
    • よって、スペア3Dポケットは、出口のレイヤの設定が同一である複数の3次元ポケット同士の事を指すのだと考えられる。
  • 2Dドラえもんとスペア3Dポケットが離れた所にある場合はどうなるか。レイヤを何らかの方法で折り曲げると、2Dドラえもん、スペア3Dポケット、そして「3次元ポケットの先のレイヤ」上の点とが重なる。こうして、スペア3Dポケットに入った2Dのび太は、海の底に沈んでいる2Dドラえもんのお腹の3次元ポケットから出てくることができる。
  • 同じ事が、ポケットの中に放り込んだ物を取り出す時にも言える。3次元ポケットの先のレイヤと2Dドラえもんがいるレイヤとの関係を逆にすれば、レイヤ状の好きなところにある物を、別のレイヤの2Dドラえもんがいる位置まで持ってくることができると分かる。

話を我々が暮らす3次元を基準にして考えてみよう。

  • 我々はX・Y・Zの3つの直交する軸が存在する3次元空間で生活している。
  • ここで3Dドラえもんがお腹の4次元ポケットに物体を放り込むと、その物体は、X・Y・Zのすべての軸に直交する第4の軸の分だけ「ずれた」所に移動される。その「ずれた」方向を我々は認識することもできなければ、その方向に我々自身が「ずれる」事もできないので、その物体は目に見えないし、触ることもできない。
  • スペアポケットに入ると、自分自身がその「ずれた」方向に同じだけ「ずれる」事になるので、4次元ポケットの中に放り込まれた物体達に遭遇する事ができる。さらにそこにある「出口」を通ると「ずれ」が元に戻るので、またしずかちゃんやジャイアンやスネ夫と再会する事ができる。4次元ポケットとスペアポケットのある位置が離れていても問題にはならない。

こうして考えてみると、どこでもドアや道路光線や通り抜けフープ、ビッグライトやスモールライトやガリバートンネルも、おそらく同じ基礎技術に基づいて開発されているのだろうと考えることができる。

  • どこでもドアは、途中で「外に出る」事ができないように、4次元ポケットとスペアポケットとを直結した物だと考えられる。なので、スキャン&再構築方式のどこでもドアのようなホラーな事態は起こらない。また、これならドアの出口の先が見えることの説明も付く。
    • そういえば、「宇宙開拓史」ではのび太の部屋の床下と宇宙船との間が繋がった(繋がりが切れそうになっている時には「入り口と出口の間の空間」も描写されてた)のが物語の発端だったなあ。
  • 道路光線や通り抜けフープは、入口を通ると4次元方向に「ずれた」所に移動して、出口を通るとその「ずれ」が元に戻されるのだと考えられる。単に4次元方向に「ずれる」だけなので、3次元的な移動は徒歩なりタケコプターなりで自力で行わないといけない。
  • ビッグライトは、光を当てた物体を4次元方向に強制的に「ずらす」物なのだと考えられる。2次元平面上に置かれた10円玉を持ち上げると、そこにできる影は大きくなる。同様に、物体を4次元方向にずらせば影は大きくなる。
    • ビッグライトとは逆方向に「ずらす」のがスモールライトであり、両方向に対応しているのがガリバートンネルであると考えられる。
    • 影じゃなくて物体そのものの4次元方向の何かを操作するのかも知れない。人間を3次元的に切り刻むともちろん死んでしまうけれど、4次元的に切り刻まれたりこねくり回されたりしても3次元的に問題なければいいということなのかもしれない。
  • のび太を上半身と下半身にぶった切った道具(人体切断機だっけ? 名前忘れた)とか、のび太としずかが首から下を交換したりドラえもんにしずかの脚をくっつけたりした道具とか、任意の動物と合体できる合体のりとか、あの辺の道具も実は4次元的な操作で実現してるのかも知れない。

同じような理屈で、移動する物や大きさを変える物、形を変える物の「原理」を色々と説明することができる。ひょっとしたらタケコプターすらも、同じ基礎技術を使っているのかもしれない。ドラえもんが開発された22世紀というのは、このような4次元を扱う技術が高度に発達した時代なのかもしれない。

この考えの中で一番問題になるのは、「空間を折り曲げる」という所ではないかと思う。

  • 4次元方向の軸に沿った「回転」や「すれる」動作は、多分それほど大きなエネルギーを使わなくても済むはず(位置が大きく変わるわけではないから)。
  • 4次元方向への軸に沿った操作が可能になった時にまず実現されるのは「通り抜けフープ」や「道路光線」の類だろう。これらは単に、4次元方向に「ずれる」だけで実現できるから。
  • しかし空間を曲げるとなると、物凄いエネルギーが必要になるのではないか? ブラックホールはその巨大な質量のせいで周囲の空間を歪めるそうだ。任意の2地点を繋げるように空間を歪めるとなると、ブラックホールと同じくらい、あるいはそれ以上の質量が必要になるのではないか?
  • その点が解決されない限り、4次元ポケットは「物を放り込んだり取り出したりする」事はできても「放り込んだ物を一緒に持ち歩く」事はできない(同じ場所でポケットを使わないと、入れた物を取り出せない)。

ところで4次元ポケットは、ドラえもんに限らず誰でも任意の道具を取り出すことができる。また、ドラえもん自身ですら、混乱している時には望みの道具を一発で見つけることができない。この事から、4次元ポケットは利用者の思考を何らかの方法で読み取ってそれに対応する内容物を返す、汎用的な物体格納・運搬デバイスなのだと考えられる。

  • ドラえもんは「子守用ロボット」であるが、上記のように4次元ポケットを考えた場合には、ドラえもん自体を「4次元ポケットというデバイスを子守という目的に有効活用するために、子供が与える曖昧なインプットに対して適切な道具を検索するデータベースおよび人工知能を備えたロボット」であると言うこともできるだろう。
  • ひょっとしたら、ドラえもんと同一のハードウェア仕様で検索用データベースや人工知能の思考エンジンだけが異なる、介助用ロボットや探査用ロボットというのも存在するのかもしれない。
    • エクステリアまで完全に同一仕様だと耐圧性能だとかそういう点で性能要求を満たせなかったり逆に過剰品質になったりしそうだから、コンピュータ部分だけが共通でそれ以外は別な方がいいかもしれない。

美撮り - Feb 16, 2010

ケータイ世代の女性が企画:男の知らない“きれい”とは――4000枚以上の写真から完成したカシオ端末の「美撮り」 - ITmedia +D モバイル

リンク先の記事にある写真を2つのタブで開いて何度かタブを切り替えてみると、違いがよく分かる。「美撮り」の方は肌をソフトに・目を若干大きめに加工してあった。リアルタイムに自動で行うちょっとしたフォトレタッチだけど、よく考えてみれば今の携帯端末はそれなりの性能のPCみたいなもんなんだから、ソフトウェアさえ載っければこういう事は造作もないんでしょうね。そういえば懐かしい記事で、美人フィルタなんてのもありましたね。

こういうので撮った写真を「偽物だ」と言うのは容易いけど、こういうリアルタイム自動フォトレタッチがあるといいなあと自分も思いますよ。

自分の携帯のカメラとかで彼女の事を撮っても、後で見返してみると、ちょっとションボリする写りで残念になる事がある。肉眼で見てその時感じた「この瞬間の画が欲しい」と思った映像と比べて、蛍光灯の光が青白かったり顔に影が落ちて薄暗くなってたり。一眼レフのカメラを借りて撮った写真は、それに比べるとまだ「思った通り」に近い写真になってたと思う。でもそれでも、肉眼で見た時の通りというわけではない。

人の目というのは、眼球を通して網膜に映った光を視神経で脳に伝えてそこで改めて映像として再構築する物らしいけど、思うに、その過程で周囲の様子とか音とか匂いとか思い入れとかいろんなものが反映されて、物理的な形状とは違う人それぞれの見え方になる物なのではないだろうか。だから、3次元の物理的な形状をレンズを通して2次元に写し取っただけの写真を見た時に、他の情報が欠けているために「あれ、なんでこんなにショボく見えるんだろう……」ってなってしまうんじゃないだろうか。動画の方がまだマシに見えるのは、情報の欠落が写真に比べればまだ少ないからじゃないだろうか。水彩画や油絵なんかの絵が時に写真よりも美しく見えるのは、僕ら凡人が実物を見ても感じることのできない美しさを、画家が敏感に感じ取ってキャンバスに描き付けるからだったりするんじゃないだろうか。

いや、単に、僕のカメラの扱いがなってないだけというのも多分にあるとは思いますけどね。カメラの使い方を心得てる人達なら、同じカメラでもきっと、僕が撮った写真よりずっといい写真を撮れるはず。

ともかくフォトレタッチというのは、写真というメディアの特性や、あるいは撮影者の腕のヘボさによっていくつかの情報が欠落してしまった結果の画像に対して、欠落していた情報を加味した補正を加えて、自分の目でその人や風景を直接見た時に感じていた物に近い情景を再現する作業なのだと僕は思う。「偽物の像を造る」作業ではなく、「自分の記憶に焼き付いた唯一無二の『本物』を復元する、再現する」作業なのだと思う。CGを駆使した映画というのも、偽物を作ってるんじゃなくて、監督の頭の中に思い浮かべられた映像を再現してるんだと思う。(絵を描くという作業だってそもそも、思い浮かべたイメージを画面上に正確にトレースする作業なんですよね。だから、完成図を細部まで思い浮かべる想像力と、それを正確に描写する力とが重要になる。グラデーションがどうとかのテクニックは、思い浮かべた物を画像として再現するための道具でしかない。)

写真を撮るのが下手糞な僕でも、彼女を見て「かわいいなあ」と思った時の感動をそのままフレームに収められたら嬉しいだろうなあと、僕は思うんですよ。そのために何十万円もするカメラやレンズや撮影環境を整えなくとも、いつでも持ち歩けるサイズの携帯電話の組み込みのプログラムで補えるのなら、それはそれで手軽に使えて嬉しい便利な道具だと思うのです。

続きを表示する ...

Some reasons why I say that eval is not absolutely dangerous than other hacks. - Feb 08, 2010

This is an translated version of my another entry, evalが危険でそれ以外の方法が安全だと思ってる人へ . This is an objection for the entry: Five wrong reasons to use eval() in an extension written by Wladimir Palant.


Recently I updated Source Viewer Tab and Tree Style Tab. However, when I uploaded the latest version to AMO, both files were retained in the sandbox, never made public by AMO editors. They said with one mouth: "Your add-on uses the 'eval' function unnecessarily, which is something we normally don't accept. There are many reasons *not* to use 'eval', and also simple alternatives to using it. You can read more about it here: http://adblockplus.org/blog/five-wrong-reasons-to-use-eval-in-an-extension"

I know the point of their blames very well, because I read and translated the entry to Japanese for my understanding. When I got a rejection about another addon, I got just same comment.

Now I have an objection about indiscriminate rejections by "too many eval()s" like this.

Both "wrong" and "right" are infelicitous adjectives about eval.

First of all, there is no "wrong" use of eval in any JavaScript codes (not only my addons). All of evals are "right" if it does its own work correctly.

For example, by the HTML specification, <em> is defined as "means emphasizing", "cannot appear in <title>", and so on. If you write <em> against the definitions, your HTML will be "invalid".

How about eval? 15.1.2.1 eval (x) in the ECMAScript specification describes about the function. It just says: runs the specified string as a script. There is no cautionary statement about the purpose of using eval.

There is no "wrong" use, it is just "dangerous" use. There are many usecases: some is high-risk, some is low-risk. But, they all evals are "right" use if it works as required by the spec. So, I think that it is a suitable subject for the entry: "Five dangerous use of eval() in an extension".

Risks of eval have to be managed, in other words, risk-managed evals are useful tool to extend Firefox. For end users, I think some eval should be allowed if it is safe enough in the case. "Eval? No, no, it is evil function! Don't use it anyway!" - I think that is slapdash work.

When you get 5-minute recipes via HTTP, do you untrust it anyway? Because it is insecure protocol, you cannot trust any information without SSL? Note, VeriSign certifies that the website you are accessing via HTTPS is surely hosted by the author, but he doesn't certify that the author is not evil. If you cannot trust any people via internet, you have to live offline - it's a internet phobia. In many cases you maybe trust them anyway if it is low-risk.

In the entry, he negates any eval without considering about its risk if it is out of the "valid uses". I think it is just a eval phobia.

Can the eval eat codes from the Web, really?

I agree to blame some cases of 5 cases in the entry. The 1st (parsing JSON), the 2nd (accessing to properties dynamically), and the 4th (running event handlers of HTML or XUL elements) - those three cases must be blamed because they possibly run untrusted scripts from the Web as privileged. This is just same to caution about SQL injections for web apps.

I totally agree this topic. I also think any developer must be careful to make eval isolated from the Web. If my addons are rejected because they have this security issue, I totally back the judgment up.

So, how about my cases?

Both addons, Source Viewer Tab and Tree Style Tab, use eval only for injecting codes to functions in Firefox (and other addons). They never get codes from the Web. If editors decided to reject those addons by the reason, like "This is dangerous because it includes eval! Eval can run codes from the Web!", then it means: they reviewed addons without reading codes, and just checks warnings by the "not perfect" validator.

If so, I cannot agree to the decision. We shouldn't overestimate the power of the validator on the AMO system, because it can detect only a few patterns which are defined as "dangerous". It doesn't parse the JavaScript, it only reports the matching result about simple regular expressions, it cannot detect dangerous codes from obfuscated programs.

You have to judge case by case whether the eval is danger or not. Same about XBL hacks, CSS hacks, replacing of functions, and others. "Yes, this doesn't use eval. I accept it." "Oh, this uses eval. This is wrong. I reject it." Such a rash judgment possibly jeopardize people who download addons from AMO. I believe that we should review sources by our eyes to detect dangerous code cleverly obfuscated, even if it take time.

Is injection by eval absolutely dangerous than other hacks?

All of evals in Source Viewer Tab and Tree Style Tab are used to inject codes to functions of Firefox, it is the 5th case described in the entry. In the entry, he blames this use because:

  • When the definition of the target function changed, terrible problem (crashing, data loss, etc.) possibly appear.
  • It possibly invites "already fixed" security issues again.

And, he said that we should use "less dangerous" ways like:

  • Use closure, and wrap up the original function by a new function. In the function, call the original function by func.apply(this, arguments).
  • Watch changes of values of some property by Object.watch().
  • If you cannot do it with those safer ways, you should not do it. Give up.

In other words, in the entry he said that "those ways are safer than eval".

I think it is an unfair suggestion. If you talk about risk of those cases, you should think other risks too, which are not listed in the entry. We also would like to avoid eval if at all possible. However, in our cases eval is the way really better than others.

Risk: possibilities of conflicting to Firefox features and other addons

Methods to extend Firefox can be sorted as:

  1. Using stable APIs provided by Firefox or other addons. (Toolbar buttons, sidebar panels, contents filtering by nsIContentPolicy like AdBlock Plus, Jetpack Features, etc.)
  2. Using other unstable ways.
    1. Using XBL hacks.
      1. Applying new XBLs.
      2. Replacing existing XBLs. (Tab Mix Plus, etc.)
    2. Using JavaScript hacks.
      1. Replacing existing functions. Using closure, wrapping up original functions in new functions.
      2. Hooking operations of existing functions by Object.watch() or other ways.
      3. Injecting codes to existing functions by eval.
    3. Using CSS hacks. (Personas, third-pirtys' themes, etc.)

One addon can use multiple ways above, but we can call it "safe" addon if it uses only "stable APIs". Otherwise they are possibly unstable. Any addon using unstable ways possibly breaks Firefox and other addons. Themes also.

He said that the "less dangerous" way is safer than eval. But, actually it possibly isn't. For example, I tried to watch the toggling of the Sidebar in Firefox 3.6, by document.getElementById("sidebar-box").watch("hidden", ...). Then it breaks the original behavior of XUL element - the Sidebar was never toggled. (So I had to use an event listener for the "DOMAttrModified" generic event.)

Another case, if you wrap the original function by a new function, any other addon which aimed to inject codes to the original function will never work. Hmm, "Because it is evil. Evil addons using eval must die!" Don't say that. It is the fact, you didn't take care about people who use addons with eval.

By the way, there are features which cannot be implemented without injecting codes into existing functions. Dorando told about those addons in the comments to the entry. The conclusion of the entry is "don't do it, you should not do it". However, if you cannot explain how dangerous eval is than others, it is just a tautology: "you should not do it, because it is wrong use of eval." and "it is wrong use of eval, because you should not do it."

Risk: possibilities of causing troubles with updating of Firefox

On this point, both methods (eval and the "less dangerous" way) have same risk. He said that eval will never work if the definition of the function changed. However, the "less dangerous" way will collapse too if the original function is renamed. It is just a bias that functions will be never renamed in security updates. There is no "rule" like this.

Moreover, if you wrapped two functions A and B, expecting they work as "A-mod => B-mod", the hack will break down if only one mate changed by security fix. We cannot imagine how terrible thing caused is. Not only updating of Firefox, but conflicting to other addons too.

Anyway, we addon developers must catch up changes in any update of Firefox. It is the common issue for any addon which uses unstable ways to extend Firefox. I think blaming like "how terrible eval is than wrapping original functions" is nonsense. More importantly, I believe that we should talk about providing failovers for unexpected matters.

To put it bluntly, any addon is just a "dynamic patch". If you use Linux, you possibly download patches from ML or other places, apply it to the source, and build binaries. It is not uncommon sight. And, it is also important note in those cases: Don't apply the patch to any revision different from the base of it. Using addons on unverified versions of Firefox is just same to that.

Risk: possibilities of less maintainability and/or readability

If we use eval hack, only "codes should be replaced" and "codes should be injected" will appear in the source.

Generally reading source codes like this is certainly hard, because we have to refer the codes of the function which is being overwritten. Instead, there are less codes and sources become compact. If it is very simple like replacing from "width" to "height", it will be human readable enough. So know-how to keep maintainability and compatibility is important for this hack.

Even if you choose the way to wrap original functions, only fragmentary codes will appear in the source too. "Pre-operations", "post-operations", "wrapping functions", "watching functions for property changes", and others. Moreover, if you cannot get the result of operations by the original function as its returned value, eventually you have to know well how the function work.

In this case, if you want to implement a feature which require injection of some codes into the logic of an existing function, you need to copy the complete codes of the original function into your addon (of course you have to modify it.) Then, too many codes are possibly duplicated, so:

  • You possibly cannot include the codes of the original function because their licenses conflict.
  • It possibly re-invite security issues fixed by updates of Firefox, as told in the entry.
  • Too many codes simply make themselves hard to be read.

Risk: possibilities of rejection by editors

This is common to the topic about maintainability. AMO editors finally have to review addons with reading of their sources. If there are tricky codes or too many/long lines, then the cost of reading source codes increases. On this point, both eval hacks and wrapping hacks are similarly tricky.

Although if updates of addons are always rejected by the reason: "there is any eval", then, it becomes a new common practice: writing codes without eval anyway, with tricky hacks, even if they become hard to read. Otherwise the update won't be accepted. It is also a tautology: "we should not use eval, because they never accept codes including eval." and "they don't accept eval hacks because we should not use it."

The conclusion

As I described, I think evals in Source Viewer Tab and Tree Style Tab are not unnecessarily. In other words I believe that those evals are the best way to implement the feature with keeping compatibility. I think those evals are not absolutely dangerous than the "less dangerous" ways described in the entry, and I also think there are no alternative ways to do it.

How many people who says "eval is dangerous than others" actually read and reading the source codes of Mozilla products? Trying to extend Firefox even if there is no stable API? Catching up updates of Firefox constantly? Trying to solve compatibility problems with other addons? I'm feeling blue.

Only XPCOM components are really stable APIs, which are marked "FROZEN" in their IDL files. Otherwise they are absolutely unstable. There are only a few "FROZEN" APIs, preferences I/O, W3C DOM, etc. JavaScript functions in the browser window are very unstable. Even the FUEL - which was the component advertised as providing stable APIs independent from Firefox versions - is possibly removed from the next major release of Firefox. Yes, this is the Mozilla. I think it is just a kidding: "eval is dangerous, wrapping original functions by new functions with the name same to originals is safer than it."

In conclusion, I think it is unjust treatment that addons are retained in the sandbox because "they have evals".


To reject spams, you have to answer a quiz to comment to this entry. "今の日本の首相の名字(ひらがなで回答)" means: the family name of the current prime minister of Japan, in "hiragana". You'll see the answer from wikipedia (Japanese version of the page).

Page 38/248: « 34 35 36 37 38 39 40 41 42 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき