肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

Mockingbird 0.1.0 alphaリリース & 第十回拡張機能勉強会レポート


告知・レポートもろもろ遅くなってしまって申し訳ないです。
OSC Shimaneにお出かけ中の dynamis さん*1が Mockingbird の紹介をするということでしたので、それまでにブログに記事あげようと思っていたのですが、寝てしまいました(ぁ


そんなわけで、先週金曜日に行われた、第十回拡張機能勉強会のレポートもあわせて、Mockingbird についてより詳しい説明を書きたいと思います。

Mockingbird 0.1.0 alpha リリース

もう表題のとおりではありますが、今週の頭からずっとくすぶっていたリリースをついに、インターン最終日の12日、ようやくリリースすることができました。
何がリリースをブロックしていたかというと、やはり使う上での致命的なエラーがなかなか解消されなくて、ひとつ解消してもまたひとつ、という形でどんどん出てきてしまったからで・・・w

まぁ、そんなこんなでようやく alpha と言えるものが出せました!
拡張機能勉強会のときに参加者のみなさんに試してもらったときよりも、品質はかなりに向上しています。


ダウンロードや使い方は、下記サイトを参照していただくことにします!


Mozilla Japan Blog にも、記事書きました。

そしたら、窓の杜さんにも取り上げていただきました!*2

すごく嬉しいです。

Mockingbird ってなに?という方は、

あたりも是非読んでいただきたいな、と思います。

拡張機能勉強会のレポート

拡張機能勉強会では、Mockingbird の設計まわりについても詳しく説明しました。
資料と簡単な説明を。もっと詳細な説明はまたボチボチエントリーにしていくことにします。
とりあえず、まとめて公開したほうが良いだろう+みんなSlideshareってなに?という状態だったので、私のアカウントで全部UPし、ここで公開させていただきます。

全体の発表の流れ


まず拡張機能の概要とデモを行いました。このデモでかなり質問をあび、へとへとになりましたがw、ここから各実装について、その部分の実装をメインに行っていたメンバー各人から説明を。

ログイン・通信まわりなど

XMLの解析にE4Xを使ってもらったのは、SimpleXML厨の私からの要望ですw
E4Xについてはまた語りたいなあ。

リリースされた0.1.0alphaではエラーダイアログ周りの実装がまた大幅に変わっています。

2段になっているタブまわり

XBM使いまくって苦労しましたよ、という話。
tabbrowerにバインディングして、tabbrowser-stripというのを増やす方法でタブを2段にしているのですが、Piroさんから、その外側にバインディングしてtabbrowser自体を増やしてしまったらどうか、という話があった。
まぁその後どうすることにしたかはまた別エントリーで。

あるいは本人がもしかしたらブログに書いてくれるかもしれません・・・*3

イベントのハンドリング

ページ切り替えの検出に、現在はタブのタイトルを切り替えるメソッドにバインディングをしているのですが、これについては、nsIObserverService の http-on-modify-request や http-on-examine-response を監視すれば良いんじゃないの?というアドバイスを、FireMobileSimulatorの発表で来ていた id:thorikawa さんにいただきました。

ただ、それから1週間の間にそういうことも試してみたのですが、

  • キャッシュされたコンテンツがあると通信は発生しないのに画面遷移が起こる可能性がある
  • ウェブページへの GET とその中身の画像や css などの GET の区別はどうする?

などという問題があがり、現在はこの実装のままになっています。 *4

それと、イベントを順に実行するというあたりの実装で、キューを作ってるのですがこのへんの実装には圧巻。(というのはプレゼン資料には書いてないんだけど・・・)

サーバサイド

私の発表ですが、全体の資料と自分の資料を作っていたため、こちらが面倒になり(ぁ、超手抜き。
まぁサーバサイドですが、普段 Ethna な人が CakePHP を使ったため、結構苦労してしまった。Controller に色々書きすぎていて、これでは MVC の意味が無いじゃん、という感じになってしまっていますので、貴公子にDISられるまえに早く修正したいと思います。

PHP勉強会で発表するかどうかは微妙だなあ・・CakePHPあたりの話は結構もう色々話が出てきちゃってるしなあ〜。とか思いつつ。

質問とか、いただいたアドバイスとか、その後とか

資料の公開等まとめが遅くなってしまったせいで、1週間の間にかなり実装も変わったりしました。
が、色々ありますが書いておきましょう。

tabbrowser-stripではなくてtabbrowser自体を増やしたらどうか

これは、上にも書きましたが、タブバーを2段にする実装の部分の話。

Piroさんが Split Browserを作る際にそこで苦労したそうです。

これはなるほど、ということでその後こちらでも検討はしたのですが、結局、パネルと tabs の間にタブバーを1つ増やさなくてはいけなくて、それをやろうとすると結局やらなきゃいけないことは一緒じゃないか、という話になり、現在の実装のまま開発が継続されることになりました。
まぁ詳しい話は id:goovypod が・・・w しなければ私がしちゃうかもしれません。

タブの閉じるを押したときの挙動はどうなってるの?

デモしているときにいただいた質問。
そして、この問題は、最初に4人でめちゃめちゃ話し合った問題。

やり方としてはいくつかあって、

  1. 誰かが閉じるを押したら全員のタブが閉じる
  2. 誰かが閉じるを押したら、共有解除はされるけどタブは閉じない
  3. 閉じるを押した人の共有のみ解除(+閉じる?)され、それ以外の人の共有は継続
  4. タブを作った人以外、閉じることはできない

おおまかにわけて、このあたりが議論になりました。

1.はおそらく「見ているのにいきなり閉じた」という事態が発生したときに、これはストレスがかかるという意味で却下、4.も、閉じたいのにあいつが放置してるから閉じられない、とうときにイラっとするから却下だったのですが、問題は2.と3.。
で、現状の実装がどうなっているかというと、 2. になっています。閉じるボタンを押した人のタブは閉じ、参加者全員のタブは、共有が解除されます。勝手には閉じませんし、共有を継続することもできません。色々話し合ったのですが、現状はこういった仕様になっています。
主な理由は

  • 閉じた以外の人で共有を継続して、その後そのそのタブで他のメンバーで話題が続いてしまったら、仲間はずれにするかもう一度共有しなおすかの手間がかかり、よろしくない
  • そのタブを他の誰が共有しているのかがわからなくなり煩雑になる。
    • これは、そのタブを「自分だけ」が共有解除できてしまう仕様だと、「おや?このタブってあいつまだ見れてるのだろうか?」という問題が起こりうるし、すべてのタブについてそれを表示させるようなインターフェースは望まれない

という2点です。

あとは、なんていうか、そこってある程度仕様をこちらから提供する場所であり、すべての人に都合のいいインターフェースにはできないよね、という感じがある。
たとえば、「自分は見終わったタブはとりあえず閉じてしまう派だ。残っていたら邪魔くさい」という人もいれば、「あとで使う可能性のある情報ならタブは残しておきたい」と考える人もいる。これは、人それぞれの考え方の違いであり、それをシステム側で吸収することはなかなか難しい。
なので、是非ここはコミュニケーションをとってもらいないな、と思う場所。

それと、いくつかの将来的に実装される機能として、

  • サイドバーにチャットを設ける(これで円滑なコミュニケーションをとりやすくなる)
  • 共有解除ちょっとまった!機能を設ける
    • これはどういうことかというと、「このタブをダレダレが共有解除したがっています!」という知らせを全員に渡し、5秒くらいの間に、「ちょっとまった!」をすると、解除されない、というもの。つまり全員の投票制です。*5

あたりの実装が予定されています。
特にチャットは必須ですね。「このタブ閉じていい?」と聞くだけでも友人とのコミュニケーションは十分ははず。

共有したログはずっと残るの?

残ります。
実は、今後このサービスでは、自分の部屋の過去ログをウェブ上で追えるようにしたいと思っていて、時系列で、どのURLを誰が開いてその間にどういうチャットが行われていたのか、というのが見れるようになる予定です。

もちろんこれはプライバシーにもかかわる部分が大きいのですが、そのあたりも詰めていきましょう、という形で進んでします。

ユーザ登録しなくても見れるようなルームを作れるようにしたほうが良い?

デモ中にアドバイスいただいた。
たしかに、たとえば何かの講演のときに、講演者の操作を同期させるために参加する、という目的だけのためにユーザとパスワードを決めなきゃいけないのは面倒だし、嫌だ。
この意見は次期実装に取り入れる予定です。

about:config とか chrome:// とか、開いてはいけないURLが共有可能

これはみんなに参加してもらったときに開かれてあせったw
脆弱性ww
javascript:とかも共有可能!!?w
これはひどい。
ということで、勉強会終了後、帰宅後すぐに Fix しました。*6



その他色々書ききれないくらいアドバイス・ツッコミなどいただいて、ホントに楽しかったです。


勉強会その後

実は、勉強会の段階ではあったバグが色々と解消され、とういか、解消せずにリリースしてもよかったんですが(どうせアルファだし的な・・)、いじっているうちにもっとクオリティ高めたい!もっとこれもやりたい!という開発者全員の欲も出てきて、結局リリースは3日4日遅らせることにはなりましたが、クリティカルなバグを解消し、その上選択範囲の共有までも実装することができた、という意味で、もっともっと面白い拡張機能ができてきたのではないかと思います。

というわけで、まぁ、プロファイルのバックアップをとって(笑)、試用してみてください。

私も実際使ってみたりしました。日帰り温泉の計画をたてるためにw*7


それと、応援に駆けつけてくれた id:yandod さんに、CakePHPバッヂをいただきました!ありがとうございます :) レポートもすぐ書いてくれたし、嬉しかったです。

CakePHPばっぢ

まとめ

実際使ってみると、結構面白いです。

さらにこの後も開発は続いていくつもりですし、やりたいこともたくさんあるので、是非いろんな場面で使ってもらいたいなーと思います。


色々やらなきゃいけないこともあるし、まだまだ足りないこともあるのですが、とりあえず形になり、人に見せられる形にしてきちんとリリースできたのが嬉しいです。


インターンのまとめについてはエントリー書きます。(といってなかなか書かないので早く書こう・・・)

*1:[http://www.ospn.jp/osc2008-shimane/modules/eguide/event.php?eid=8:title]

*2:やぱ記事のまとめかた上手だなあ・・・すごくうまくまとまってる!

*3:ブログ書きなよ!!!とアカウントつくらせたものの、全然書いてくれない→ id:goovypod

*4:ただ、これだとMacとLinuxで戻る進むボタンを押したときに切り替わらない問題があり、現在絶賛バグ中。違うメソッドが呼ばれてるのかなあ?

*5:投票制といっても、解除したくない、という意思があったら言ってね、という、そっちの投票です

*6:http://trac.getmockingbird.org/ticket/160

*7:チャットはSkypeでしていたのですが、やっぱブラザ上にあれば便利なのになーと思います。がんばります!