exodus from presto opera

Blink Opera が version 20 に達した今もなお、うちの PC のメインブラウザは Opera 12.16 である。

2014 年 3 月の今現在においても、とりあえず、Presto Opera でもそれほど困る場面は多くはない。もちろん CSS3 をふんだんに使って Opera じゃ全然満足に表示できないとか、javascript の JIT がらみで Opera ごとすぽーんとプロセスが落ちたりするサイトはじわじわと増えてきている感はある。しかしメインブラウザの地位を脅かすほどのストレスをもたらすほどでは、まだない。

とは言ってもこれは時間の問題なのも確か。やがては、Presto Opera から移行しなければいけない時期が来るのは言うまでもないのである。その時のために、先立ってなぜ Presto Opera でなければいけなかったのか、の個人的な理由をまとめておこう。つまりこの要件を満たしてくれるブラウザがなければ将来であっても移行できないし、満たしてくれさえすれば今すぐにでも移行できる。

  • メーラがブラウザと一体化している: 正確にはブラウザと一体化しているのがメリットなのではなく、さまざまなアカウントのメールや、メーリングリストや、RSS フィードや、IRC や、その他もろもろをひとまとめにしてくれる。これはまあ必ずしもブラウザと一体化している必然性は実はあまりない。つまりまとめて面倒見てくれさえすればブラウザと一体化してなくても別によい
  • キーバインディングの自由度が高い: vi/vim に魂を捧げた人たちにはついていけないけど、hjkl にページスクロールを割り当てたり程度はする。また ctrl+H に [cci]Back | Close page[/cci] といった条件判断を伴うバインディングをする。あるいは、コンテンツ領域外、例えばアドレスフィールドに対して [cci]ctrl+N/P/F/B[/cci] を割り当てたりする。この全てを柔軟に聞き届けてくれるブラウザは今もなおそれほど多くはない
  • 充実したデバッガ: Dragonfly は様々な改善を経て、今では十分に使えるデバッガになっている。特にけっこう自由にキーバインディングできるのが非常によい。他のブラウザが持つデバッガはいずれもここまでの自由度は持っていない。持っていたら教えて下さい

願わくば、数年後にこれらの要件を Blink Opera が満たしていてくれればとても素晴らしいのだけど。

Opera Next 16.0

Opera Next 16.0 が公開されていた。それほど目新しい新機能が追加されているわけではない(開発中のものは opera://flags から幾つか試すことができる)。

Presto Opera ユーザーが納得する出来に到達するには、Opera 18、いや 20 くらいまでは待つ必要があるだろう。

15、16、17 と…… Opera の人生暗かった。

Where do Opera go? #2

Opera 15 から、そのレンダリングエンジンは Blink に移行した、というよりアプリケーションの骨組みが Chromium ベースになった。これに従い、エクステンションの仕組みもまた Chromium のそれに準ずるようになった。Chromium エクステンションと同様の manifest.json を書き、Chromium が提供する API を使ってエクステンションを組み立てていくことになる。ただし API はサブセット(+ Opera 独自のもの)になっている。

どの程度のサブセットかは、Chromium が提供する API と、Opera 15+ の それ を参照のこと。

Opera 12 までのエクステンションは拡張子が .oex だったが、15+ では .nex になる。構造は Chrome の .crx とまったく同じ。Opera 15+ がサポートする API だけを使っているエクステンションなら、.crx のまま使えてしまうはずだ。

また、Opera のエクステンションカタログ(の開発者ページ)では登録済み oex に対する Convert 機能が追加されているようだ。これは何をするのかといえば、oex のアーカイブに oex の API をエミュレートするでっかいラッパーライブラリを付加して、全ファイルを含んだ zip を返してくれる。この oex エミュレーションライブラリがかなりの力作で、全体で 450KB くらいある。これを書いた人は本当によくがんばったと思う。

残念ながらというか幸いにというか、wasavi の場合はもともと Chrome でも動くようにしているので、そのライブラリを使うことはないのだが…。

あと、「一体 Opera は DOM3 Composition Events をいつ実装するの? 明日なの? 今年中なの? 今世紀中なの?」という諦め半分の心の叫びがタナボタ式に解決してしまったのが割というかかなり嬉しい。

Where do Opera go?

Opera の話。

今年の 2 月、Opera のレンダリングエンジンが Webkit に移行することが発表され、その後正確には Blink への移行であることが非公式に判明した。それ以来デスクトップ版については音沙汰がなかったのだが、いよいよその最初のバージョンが公開された。

その出来や評判がどうなのかは、件のエントリへの 1000 件を超えるコメントのほとんどが、Blink Opera が Presto Opera から様々な機能が削ぎ落とされ、つまり一言で表せば単なる Opera スキンをかぶった Chromium になっていることに対する失望で埋められているといえばここで改めて書くまでもないだろう。

で、日が明けてこういうエントリが公開された。つまり Blink Opera がそういう状態なのは最初のバージョンだからであって、バージョンが進むにつれ Presto Opera が持っている機能が再実装されるので心配しないでくれという表明だ。

Presto Opera に機能的に追いつくのはクリスマスプレゼントの時期になるんじゃないかなーと個人的には予想。

Opera migrates to WebKit

http://my.opera.com/ODIN/blog/300-million-users-and-move-to-webkit

Opera がレンダリングエンジンおよび javascript エンジンを Presto/Carakan から Webkit/V8 へ変更するそうです。ちょっと前から、Opera ICE という名で Webkit 版 Opera を開発していることは知られていたが、Presto との関係は明らかにされていなかった。今回、モバイル向け、PC 向けなどの Opera 全体のプロダクトの完全な Presto から Webkit への移行が発表された。

Extension は、Chromium ベースのものに移行させるためのチュートリアルやドキュメントを作成中だという。Extension の仕様自体が Chromium 準拠という形になるのか? はちょっと不明。

世の中びっくりすることばかりだね。

 * * *

Webkit に移行するとなると、Dragonfly はどうなるのかな。ディスコンするにはもったいないような。それを含めて、新しい Opera が Webkit Powered Opera になるのか、あるいは Opera flavored Chromium になるのかいまいちわからない。もちろん既存の Opera ユーザが望むのは前者のはずだが、より詳しい公式発表が待たれる。

 * * *

Opera の外の世界に目を向けると、現役のレンダリングエンジンから Presto が引退することで、Trident/Gecko/Webkit の 3 強時代になり、同時に Webkit 陣営の勢いがより増すことになる(Opera は Webkit への様々なコントリビューションを宣言している)。このような勢力地図の更新について、特に Mozilla がどのような意見を持っているのか、気になるところだ。

 * * *

Webkit の開発組織が、Opera が参入することでどう変質するのかも多少気になる。まあ間違っても、「蓋を開けたら Opera が Webkit を飲み込んだという構図になってた!」みたいなことは起こらないにしても。

Opera is bad #7

いろいろ弄っているのでまた wasavi で取り留めのないことを書いてみよう。

テレビ、具体的には公共放送の相撲中継を見ていて気になるのだが、解説の親方はじめ、あまりテレビ慣れしていないと思われる方々はなぜかインタビューされると「そうですね、」というのを最初に付けすぎだと思う。なんなんだ、イエスマン症候群か。

それ系のことに注意してテレビのインタビューを見ていると、能動態と受動態の混乱とか、「~だし、~だし、~だし、……」という「『し』の行進」とか、「○○は、××が△△という○○」みたいな口語ならぎりぎり許されるレベルのへんてこな文構造とか、「~なんですけどー」(けど、何?)という定型的な語尾とか、いろいろ気になり始めるのである。

しかしまあ、気にしたら負けなのだろう。たぶん。

 * * *

ちなみにここまで wasavi on opera で書いてみて、なんか笑っちゃうほど buggy なので結構がっかりしているところである。ああ……。

一応 Opera の名誉のために書いておくと buggy なのは Chrome/Opera/Firefox で同じような動作をさせようとしている wasavi のコードであって、Opera は悪いか悪くないかといえばとりあえず悪くはない。しかし根本的な原因をさかのぼれば、いろいろと回りくどい動作を強いる Opera が悪いのは言うまでもない。

Opera is bad #6

ぼちぼち、Google 日本語入力でも安定して入力できるようになってきた。とはいえまだびみょーにあれ? という点がある。それを洗い出すためにとりとめのないことでも書いてみよう。

今使っているキーボードは Thinkpad USB Keyboard with trackpoint というやつなのだが、最近になってというか昨日のことなのだが「=」キーの効きが悪くなった。押下して、感覚的に入力されるかな? というタイミングで入力されない。そこでキートップを外してみた。

キートップを外すのは割と簡単だ。パンタグラフの四隅が、キートップの裏のそれぞれのかみ合わせに引っかかるようになっている。そこでマイナスドライバーをまずキーの下側の真ん中に差し込み、くるっと回す。同様に上側からもドライバーを差し込み回す。回すのはゆっくりではなく素早くやったほうが良いようだ。

ちなみに tab キーを始めとする横に長めのキーは四隅というにはちょっと中心部分に寄ったところがかみ合わせになっているので、ドライバーでくるっ、も 4 回に分けたほうが無難だ。

というわけで外してみたところ、細い毛がラバーカップの上に乗っていた。こんな微妙な原因でキータッチの感覚が変わってしまうのかー。

などと書いていて早速気づいたが、変換した時に出てくる候補のポップアップが仮入力文字列の上にかぶさっていてとても見にくい。うーんテストページではちゃんと表示されるんだけどな。カーソルの要素が position:fixed なのが問題なのかしらん? とりあえずいろいろ調べて見ることにしよう。

 * * *

どうも Opera のバグのようだ。wasavi の iframe に box-shadow をかけて、さらにその iframe が position:fixed か position:absolute だったとき、おそらく内部的には原点が影の分だけ左上に移動するのだろうが、変換候補ポップアップについてはそれを考慮した補正を忘れている。とそんな感じだと思う。Chrome や Firefox ではそういった現象は起こらない。また、これが起こるのは Windows だけのようだ。

ということでバグレポした。DSK-380712。

Opera が悪い。

Opera is bad #5

勘違いだった。Google 日本語入力でも、イベントの発生の仕方は同じだった。wasavi 側の対応をちょっと修正。input モード時はカーソルを消去しないようにした。

ちなみに、キーボードの入力のテストは http://appsweets.net/wasavi/keytest/index.html で行うことができる。手元には Windows+ATOK とか、Mac OS X の環境がないので確認できない。それらの環境で、compositionstart、compositionupdate、compositionend イベントが Chrome や Firefox と異なる振る舞いをしていたら教えてください。

Ubuntu でも試してみた。iBus+Anthy、iBus+mozc の両方で、仮入力中はなぜか keydown イベントが発生しない。input や keyup イベントは発生する。うーんどういうことなのか。keydown イベントが発生しないとそもそも composition events のエミュレーションを開始すること自体ができないのだけど。これはどうすることもできないかもしれない。

いやー本当に、Opera は、ダメなブラウザだ。Opera が悪い。

Opera is bad #4

wasavi の設定は、基本的には exrc、つまりエクステンションが保持する localstorage の項目に書いておく。しかしこれだけだといろいろと煩雑だ。また、wasavi を使用するのは何かを送信するフォーム内の textarea というケースが最も多いと思うが、ajax を駆使したフォームでもない限り送信することでページが更新されるので、送信前の wasavi でテンポラリ的に :set なんちゃらした値は送信と共に失われてしまう。

これをなんとかしたい。つまり、wasavi の実行中に動的に変更したオプションを、ページの更新を超えて自動的に再現したい。

ここで難しいのは、ページ更新前に与えた wasavi の設定が、更新後の html 内のどの textarea に対応するか、という判定だと思う。たとえば textarea に id が振られていれば、それを判断の材料にできる。しかし id に頼るのは危険かもしれない。論理的には更新前後で同じ textarea だったとしても、サーバ側の都合で異なる id を振られている場合が考えられるからだ。

id ではなく、たとえば html のルート要素から textarea へ至るパスを頼るのはどうか。つまり html->body->div->textarea みたいな感じの文字列をキーにしたハッシュを保持して、それに設定を書いておく。実際は、html(1)->body(1)->div(3)->textarea(1) みたいに要素のインデックスも必要かも。

この構造が更新ごとにダイナミック、あるいは微妙に変化する html ページってあるかなあ。たとえば更新ごとに div 内の最初に textarea が配置されたり最後に配置されたりするページ。ないとは言えないか。そうすると、ノード名を単語とみなした sentence similarity measure を測ったりする必要があるかもしれない。めんどうだなー。

 * * *

よく考えたらこの話題は別に Opera に文句をつけるものではなかった。まあいいか! Opera が悪いのは事実だし!

Opera is bad #3

Opera で擬似的に composition events を実装する場合、様々な処理を最終的に keyup ハンドラ内で行うことになる。これはひとつ奇妙な振る舞いを引き起こす。キー入力は、基本的には keydown -> keypress -> input -> keyup の流れでイベントを発生させるのだが、しかし高速にキーボードを捌いたりすると、複数のキー入力の各サイクルがオーバーラップしてしまうことがある。

といっても Opera に問題があるわけではなく、つまりキーボードの打ち方の問題で、例えばあるキーを離す前に次のキーを押したりした場合だ。そうすると keydown -> keydown -> keyup -> keyup みたいな感じでイベントが発生する。

これを考慮しないと、正しく composition を認識できない。ので、考慮するようにした。

 * * *

keydown および input イベントの引数 e を蓄えておくキュー、keyup イベントの引数 e を蓄えておくキューを保持する。前者のキューの 1 項目は、

{
keyDownEvent: { ... },
currentString: '',
inputEvent: [ ... ]
}

てな具合。keydown イベントハンドラで、keyCode が 229 だったら IME に対する入力とみなし、ハンドラ本体の本来の処理はせず、キューに必要な情報を埋めるだけにする。keyup イベントハンドラで、keydown キューの長さ – 1 == keyup キューの長さではない場合、つまり keydown イベントが複数回連続して発生した状況である場合は、keyup キューに必要な情報を埋めるだけにする。

keydown キューと keyup キューのバランスが正しい場合は keyup ハンドラ本来の処理を行うが、それに先駆けて溜まったキューを処理する。イベントの引数 e をもって keydown、input イベントハンドラを直接呼ぶ。

 * * *

composition 文字列が更新されるごとに直前の文字列の長さを覚えておくようにし、暗黙的確定のようであれば直前の compositon 文字列のほうを採るようにした。つまり暗黙的確定にも対応した。

しかしだからといって Opera でも IME に対応しました! とはとても言えない。だいたい IME に対する入力時の keyCode、229 って何なのかさっぱりわからない(IE に準じているっぽいが)し、明示的確定では input イベントが連続して 2 回、暗黙的確定では 3 回とかどこにも文書化されてもおらずそもそもバグの産物なのかも知れず未来のバージョンでもそれが維持されるかもおぼつかない。ダメダメすぎる。Opera が悪い。