2013年12月19日

Qt + JSXあるいはJSの状況

JSXアドベントカレンダーのエントリーです。

2年ぐらい前から、QtをJavaScriptから使うというのをやっています。その延長でJSXから使うというのもずーっと、細く長くしぶとくチャレンジしています。12月12日に出たばかりのQt 5.2でうまくいきそうな感じなので、その成果を紹介します。コード片とかいっぱい書くのはめんどいので、コード片やサンプルはリンク先を参照してください。

Qt + JSの歴史

QtをJavaScriptから使うというのはかなり昔から先人たちによって行われてきたものの、今は誰も本気で取り組んでいなくて、ロストテクノロジーになりかけています。Qtは2007年5月リリースの4.3でQtScriptという名前でECMAScriptのエンジンを搭載しました。当初の目的はQtを使ったGUIプログラムのマクロ言語として使うというものでした。QtScriptEngineにQObjectを継承したオブジェクトを簡単に登録できるため、C++を使って作ったクラスを簡単にECMAScriptエンジンに公開することができます。簡単にECMAScriptの名前空間にメソッドや変数などを登録するAPIも持っています。当初はQt Script for Applicationsと呼ばれる処理系だったみたいですが、後にJavaScriptCoreが使われるようになりました。5.x系になって、V8が搭載されましたが、それはQMLとかQtQuickと呼ばれる環境向け限定で、スクリプティング用途では互換性のために相変わらずJavaScriptCoreが使われています。

当初はC++アプリケーションにスクリプティングを提供するのが目的でしたが、Qtのプログラム自体、全部JavaScriptで作ればいいんじゃね、ということで開始されたプロジェクトがQtScript Binding Genratorです。NokiaのQt Labsの公式です。ドキュメントとかほとんどないので経歴とかはよくわからないのですが、コミット日時をみると4.4のころにスタートしたみたいです。これはQtのクラスのうち、半分ぐらい(600/1200)のクラスのためのバインディングを提供します。コンストラクタ関数やら、可変長引数に対応したインスタンスメソッドやら、定数やら、protectedメソッドを予めオーバーライドしておいて、JSで定義されたメソッドにフォーワードするShell Classと呼ばれるクラス群を生成します。Qt Script Binding Generatorのソースコードを見ると、先行して開発されていたJava BindingのQt Jambiを流用して作らていることがわかります。4.6ぐらいまではNokiaがメンテしていましたが、その後メンテはとまっています。この間も、古いQt Labs、Google Code、新しいQt Labsといくつかリポジトリがありますが、Qt Labsが一応最後の公式リポジトリです。ちなみに最新の更新は2013年になっていますが、NokiaがQt事業をDigiaに譲渡だか売却した際の名義変更コミットだけで、更新はされてません。

その後は、Sarunas Valaskeviciusというイケメンイギリス人が5.0対応のコミットを大分前に行いました。5.0で内部のプライベートクラスの構造が色々変わったのですが、彼がそれへの対応をしました。ですが最終コミットが5.0正式リリース以前で、Generator(C++のヘッダをパースして、XMLを読み込んでコード生成する)は5.0対応になりましたが、言語間の差異を吸収するxmlファイルはほとんど変更されていませんでした。彼はその後、作ってV8を搭載したQML環境のためのBinding Generatorに注力しているため、5.0リリース前夜にpushされたコード以降メンテはされてません。。

僕はそのイケメンイギリス人のリポジトリをフォークして、ぼちぼちQt 5.0系の新しいモジュール構成に対応させたりしていました。5.1がリリースされたときに一度作りきったものの、生成したモジュールを動的にロードする部分が動かなくてあきらめていましたが、この前でた5.2ではめでたくうまく動いたのでようやく陽の目を見ることができそうな感じです。コード生成部を追加してJSXのJSラッパーコードも一緒に生成します。TypeScriptとかHaxeのラッパー作りたい人はどんどんフォークしてやっちゃってください。

Qt + JSの使い方

続きを読む
posted by @shibukawa at 15:55 | TrackBack(0) | 日記 はてなブックマーク - Qt + JSXあるいはJSの状況

ブラウザ上で動く検索エンジンOktavia

HTML5アドベントカレンダー向けのエントリーです。ブラウザでできることがどんどん増えています。2013年に一部で熱狂的な話題となった本の高速文字列解析の世界 を読んで意識が高まったので、勢いにまかせてブラウザで動く検索エンジンを作ってみました。写真は著者の岡野原さんにお会いしたときにいただいたサインです。

ブラウザ上の検索エンジンと転置インデックスと東アジアの微妙な関係

全然調べていないので、歴史とかよくわからないのですが、僕が始めてブラウザ上で動く検索エンジンと出会ったのは、Sphinxです。SphinxはPythonで書かれたドキュメントツールです。ドキュメントツールというとJavaDocを始めとして各種あります。大きく、自然言語中心のもの(Texとか)と、APIリファレンスの生成ツール(JavaDocとかDoxygenとか)があります。自然言語中心のものはAPIの変更を手で追従しなければならず、自動生成のリファンレスは人が理解しやすい順序に構成して文章を提供するということができません。Sphinxはマークアップで書かれた中に、ソースコードから抽出したドキュメントを埋め込めるようにして両方のいいとこ取りをしていて、PDFにすると3000ページを超えるというPythonのドキュメントを支えています。Pythonだけでなく、PHP系のコミュニティやさまざまなコミュニティで使われています。

SphinxにはjQueryを使って作成されたブラウザ上で動く検索エンジンがついています。仕組みはシンプルです。Sphinxを使って文章をビルドしたら、ドキュメント中の単語をキーとして、それが含まれるドキュメント番号と段落位置の配列を持った巨大なJSONファイルを生成します。ユーザが検索すると、JSONをダウンロードして、単語から、ドキュメント番号と段落位置の配列を持ってきて、ドキュメント番号からドキュメント名とURLを生成して、リストにして表示します。Sphinxでは変換元のテキストを持っていて、これもロードして、単語周辺の文章として表示します。サーバいらずの検索エンジンです。この単語をキーとした辞書/ハッシュを転置インデックスと言います。検索エンジンのもっとも基本的なパーツです。

このシンプルな検索は東アジア系の言語ではあまり実用的になりません。欧米系の言語は単語間にスペースがあるので簡単な正規表現で単語に分けられますが日本語・中国語・韓国語はそうなってません。日本語の場合は漢字・ひらがながあるので、文字種の境界を取得すれば熟語ベースで分けるとかは可能かもしれませんが、欲しい単語にマッチしにくいだろうということは想像に難くないですよね。

東アジア系の文章を単語に区切る処理は、形態要素解析と呼ばれていて、Chasen、MeCab、kuromojiといったツールを使えばできます。サーバ用の検索エンジンはだいたいこれらのどれかが使えるようになっています。東アジア系の言語はやっかいな言語で、単語の辞書がないと単語に分けることもできません。ブラウザで日本語を快適に検索しようとすると、インデックスとは別に日本語の辞書(MeCabでよく使われるので10MB程度)をダウンロードしなければなりません。

それ以外の方法としては、n-gramという方式があります。スペースとか関係なしに、2文字、3文字ずつ区切って、それを単語と見立てて転置インデックスを作ります。これも実装がシンプルなため、オープンソースなシステムで簡単に日本語検索を可能にするために昔からよく使われている方法(僕が知っていてお世話になったことがあるものだとMojixさん作のZopeの日本語トークナイザーとか、Hyper Estraierとか)ですが、インデックスがもとの文章の倍以上に大きくなる欠点がありブラウザ用の仕組みとして使うには実用的ではありません。新聞記者みたいな揺れのないしっかりとした文章を書く自信があって、単語のリストとかを用意できれば、TinySegmenterMakerを使ってうまくやることもできそうです。これは今後トライしたいところ。

FM-index

続きを読む
posted by @shibukawa at 00:00 | TrackBack(0) | 日記 はてなブックマーク - ブラウザ上で動く検索エンジンOktavia

2013年12月08日

JSDuckからコードの情報を生成する

JSXアドベントカレンダードキュメントアドベントカレンダーのネタです。

Ext.jsというJavaScriptのGUIフレームワークがあります。流行り廃りの早いウェブ関連の世界では比較的長い歴史を持ち、それゆえにIE 6.0から最新ブラウザまで対応しつつ、豊富なコンポーネントを備えたフレームワークとなっています。クラス数は数百あります。モバイル向けのSencha Touchもあります。Sencha Touchパーフェクトガイド という日本語の本もリリースされています。網羅的に書かれていて、バックエンドにDropboxを使う方法とか、モバイルの周辺をきちんと抑えてある本ですのでオススメです。

Ext.jsなどのプログラムには、GUIというとクラスがたくさん登場します。この型というものがライブラリにすでにたくさん定義されているのに、プログラミング時にそれを生かさないのはもったいないです。Ext.jsはドキュメント生成にJSDuckというツールを使っています。JSDuckには--export=fullと付けるとJSONでファイルを生成する機能があります。

$ jsduck --export=full --output st_jsonout ~/touch/src/

JSONには、クラスのメンバーとかいろいろ情報が含まれていますし、HTMLのドキュメントとかも含まれています。JSDuckで生成すると、独立した1ページのドキュメントが複数出力されるわけではありません。ajax的なページ片が生成されて、一部ずつロードされるようなファイルが生成されます。ブラウザの中にタブが出てきて、複数のクラスを同時に閲覧したり・・・というのはこういったバックエンドの仕組みに支えられています。

さて、クラスの情報が出力されたら、それを元に開発に使える形にします。ここで登場するのがJSXです。JSX用のラッパーができたら、コードを書いてコンパイルすればエラーチェックとかができちゃいます。それではJSONからJSXラッパーを生成するようなツールを用意しましょう。JavaScriptはフリーダムすぎる言語で、どのドキュメントツールもセマンティックスを付与できるようにたくさんのタグが提供されています。JSDuckも例外ではありません。また動的言語ということで、コールバックの返り値に対する説明が省略されがちだったりという問題もありますし、ドキュメントの型が一部間違っているということもありえます。コードコメントから生成ツールを作る場合には、元コードへのコミット権がないのであれば、ドキュメントに足りない説明を後から付与できるようにする必要があるでしょう。

それではツールを作ってみましょう。はい、できました。JSDuck2JSXというのがこのためのツールです(ここで頭のなかで3分クッキングのBGMを想像してください)。これで生成したテンプレートを使えば、GUIをJSXで生成できるようになります。ただし、Ext.jsのクラスの仕組みが複雑怪奇すぎるので、モデルとか気の利いた機能はまだ使えないです。ここはなんとかしたいところ・・・このコードを修正したら、HaxeとかTypeScript用のラッパーも作れるかもしれません(他の人がメンテするのは考えてないコードになってますが)。もちろん、手でラッパーを書くのも場合によっては悪くない選択肢になります。node-redis なんかはAPIは自動生成でシグニチャに関する情報がコード中に全然ないので、使い勝手の良いJSXラッパーを作るには手書きしかないでしょう。逆に、今回のSenchaの場合はクラス数が500を超えるので手で書くのは現実的ではないです。

ドキュメントを読むのは人間だけじゃないよ、というお話でした。

当初、ドキュメントアドベントカレンダーに登録した時にこちら用に書いた記事でしたが、Doc-jaという似たアドベントカレンダーを見て、「あれ?登録したはずなのにないや、JSXの方に流用しちゃえ」とそっち向けに公開しました。その後間違えに気づいたので、元のアドベントカレンダーの方にも登録しました。関係者のみなさん、ごめんなさい。原稿は11月中に書いて12/8時限公開設定してたよ、落としたわけじゃないよ。
posted by @shibukawa at 00:00 | TrackBack(0) | 日記 はてなブックマーク - JSDuckからコードの情報を生成する

2013年12月06日

果てなき渇望

本エントリーは果てなき渇望 Advent Calendar 2013の最初のエントリーである。当初より週一連載なので落としたわけではない。興味がわいた人はどんどん追加してもらってもかまわない。

握力王とか握力神といえばその道の人に通じるという、その人新沼大樹氏から本書 の3章の存在をほのめかされたのはいつだっただろうか。Kindleにはなっていないので、日本に帰るタイミングにあわせて氏が出演しているDVD と一緒にAmazonで注文してピックアップしたが、読み始めた瞬間、この本の持つすさまじい熱量の多さに圧倒されてしまった。

本書で説明しているのは、マイナースポーツにカテゴライズされる、日本のボディービルディングである。マイナーとはいえ、専門雑誌が刊行されており、競技会も多くあり、ビジネスの規模や、多くの人に(畏怖を持って)知られているあたりは、僕がやっていたインラインスケートよりもメジャーとは言えるかもしれない。ただし、その知名度に反して「やったことがある」「観たことがある」という人はおそらく多くはなく、ある種遠くのリアルではないもの、昔話の怖い話とかそういうたぐいの認識をしている人が多いのではないかと思う。

僕自身、ボディービルは目指そうと志したことすらないが、ymotongpooが「歪んだ世界が見えた」と表現したように、本書に書いてある内容は自分が見てなかった視点からのすさまじいリアルであると感じた。それと同時に、対象は異なるものの、鏡を見ているかのような感覚を抱くことも数多くあった。

続きを読む
posted by @shibukawa at 13:27 | TrackBack(0) | 日記 はてなブックマーク - 果てなき渇望
検索ボックス

Twitter

www.flickr.com
This is a Flickr badge showing public photos and videos from shibukawa.yoshiki. Make your own badge here.
<< 2013年12月 >>
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
最近の記事
カテゴリ
過去ログ
Powered by さくらのブログ