400 likes | 519 Views
次世代 Greasemonkey Tsukikage system の開発. 電気通信大学 人間コミュニケーション学専攻 中山心太. 自己紹介. 中山ところてん 電気通信大学 人間コミュニケーション学専攻 修士1年 現在求職中 研究分野 情報セキュリティ(とか) プログラマーじゃなくて SE コーディングは嫌い 設計は大好き. こんなことがしたかった. Web の内容を自然言語処理 自然言語処理結果からフィッシング判定 形態素解析( Mecab ) Yahoo! 検索 API ( HTTP ) Google 検索 API ( SOAP )
E N D
次世代GreasemonkeyTsukikagesystemの開発 電気通信大学 人間コミュニケーション学専攻 中山心太
自己紹介 • 中山ところてん • 電気通信大学 人間コミュニケーション学専攻 • 修士1年 現在求職中 • 研究分野 情報セキュリティ(とか) • プログラマーじゃなくてSE • コーディングは嫌い • 設計は大好き
こんなことがしたかった • Webの内容を自然言語処理 • 自然言語処理結果からフィッシング判定 • 形態素解析(Mecab) • Yahoo!検索API(HTTP) • Google検索API(SOAP) • 既存のソフトウェアで簡単にブラウザに組み込んだ形で実装できるか?
既存ソフトウェア • Greasemonkey • Firefox拡張機能 (Operaにも同様機能あり) • 任意のウェブページにJavaScriptを実行 • Proxomitron • ローカルProxy通過時に正規表現でデータ加工 • 正規表現で、JavaScript付加可能
駄目っぽい • JavaScriptの限界(文字列処理) • 正規表現とDOM制御 • 構造は制御できるが、内容の書き換え不能 • たとえばこんなことが出来ない • 漢字にルビを振る • 文章中に企業名が出てきたら脇に株価チャートを表示 • すべてのページではてなキーワード
そのほかの駄目なところ • JavaScriptの限界(ローカルリソースアクセス) • ファイルアクセス • マルチスレッド • クロスドメイン(グリモンならできる) • DLLアクセス • 外部デバイスの利用 iPod,PSP • データベースアクセス
Tsukikagesystem • 無いなら作ってしまえ • 自然言語処理機能を搭載した、HTML書き換えミドルウェア • 必要用件 • ブラウザと通信してHTML書き換え • HTMLを処理するインタプリタエンジン • ネイティブコードライブラリのコール機能 • 自然言語処理エンジン
ブラウザと通信してHTML書き換え • 通信方法 • IEプラグイン • Firefox拡張機能 • Proxy • 書き換え方法 • JavaScript • ブラウザの内部表現に手を入れる
案1Proxy方式 • ローカルProxyサーバ • HTML通過時にデータを加工 • スクリプトが走るようになったProxomitron • 問題点 • Proxy通過時に重い処理を行うことと、レイテンシーが増大してしまう。 • 動的コンテンツに対応できない
案2IEツールバー • ATL?何それ。 • 最後の書籍が出たのが99年 • 過去の遺産(負の遺産) • テストコードをたたいてみた。 • ATLの癖が強すぎ • C#でいけるっぽい? • 開発効率が悪すぎるので破棄
案3Firefox拡張機能 • 拡張機能からネイティブコード • いくら調べても見つけられなかった。 • そもそも俺は ユーザーだ • Firefoxの開発者向けリファレンス • 全然和訳されてねぇ……
案3Firefox拡張機能 私のTOEIC スコアは350です。 ですが英語論文が読めないわけでは ないので、ご心配なく
案4Greasemonkey+CGI鯖 • Localhostに任意のCGI鯖が立っていれば、GM_httpRequestで通信できる • CGI鯖が任意コードを実行すればいよい。 • 実験してうまくいくことは確認 • でも、本末転倒なので破棄
案5Firefoxの拡張機能+CGI鯖 • Greasemonkeyじゃなくて、自作拡張機能に • Greasemonkeyから作り直すことに…… • 全力で車輪の再発明 • だから俺はOperaユーザーなんだって。
問題は何か • 複数のブラウザへの対応 • ストレスなく使えるレイテンシー • Proxy単体なら両方満たしている。 • 通過時に大規模に書き換えると、処理時間でレイテンシーが低下する。 • Proxyの通過時にデータ書き換えではなく、通過後に書き換えればいいのでは?
案6Proxy+ローカルCGI鯖 • HTMLがProxy通過時にJavaScriptを付加 • xmlHttpRequestはクロスドメイン不能同じドメインの架空アドレスならいける • 架空アドレスへのアクセスをフックして、CGI鯖にリクエストを転送すればよい • CGIはメモリを保持できない毎回ファイルに保存しなければならない
案7Proxy+仮想CGI鯖 • Proxyの中にCGI鯖を持ってしまえばいい。 • Proxy本体がワーキングメモリを保持して、仮想CGIにワーキングメモリを渡せばよい • 案7を採用
Python実装のProxy • TinyHTTPProxy.py • MITライセンスのProxy • OKIOSSの中の人に感謝 • HTTPのリクエスト、レスポンスを解析 • 任意のJavaScriptを付加できるように • 特定のアドレスへの通信をフック
JavaScirptの付加 • GreasemonkeyのJSはメタデータを持っている // ==UserScript== // @name ユーザースクリプトの名称 // @namespace 開発者のURL // @description プログラムの説明 // @include どのURLで実行するか // @exclude どのURLで実行しないか // ==/UserScript== • 上位互換のために、この構文を踏襲 • @charset 文字コードを設定 • @libraryPrototype.jsなどをインクルード
架空アドレス通信のフック 元 http://hoge.co.jp/index.html 後 http://hoge.co.jp/index.html??Tsukikage&pythonscript¶m • ブラウザからは同一ドメインのアクセス • Proxyがこれをフックして、仮想CGI中のpythonscritpをparamで実行する。
仮想CGIサーバ • Pythonのスクリプトをプラグイン方式で実行 • グローバルストレージはProxyが引数で与える • スクリプト中から、C++のDLLリンク • Mecabもこの方式で利用 • Boost::python でライブラリ作成
レイテンシー計測 • Firefox+Firebugで計測 • IPAのトップページ • 100ms以下はエラー? • 直通 233ms • 串有 387ms • 遅延は150ms程度
御託並べてもしょうがないのでデモ • 自然言語処理による特徴語抽出 • Greasemonkeyスクリプトの上位互換 • ハードウェアアクセス
Greasemonkeyと比較したアドバンテージ • xmlHttpRequestが使えるブラウザで動作 • Prototype.jsなどのライブラリが利用可能ライブラリでブラウザ互換性を吸収 • Python、C++の高い拡張性を利用可能 • コアがPythonなのでOSに依存しない • 第四世代携帯電話、Wiiなどから利用可能 • Greasemonkeyのスクリプトの上位互換
Greasemonkeyに及ばない点 • GMはFirefoxの特権モードで動いている • JavaScriptからFirefoxのコアに触ることが出来る • Firefox依存の機能を使ったスクリプトは、Tsukikageで動作させることが出来ない • ライブラリで吸収させてほしい • バグのあるプラグインがあると、セキュリティホールになる
未踏の作業中に気づいたこと • Webとローカルは切り離されている • セキュリティの都合 • ウェブOS • マッシュアップ • ウェブとウェブの融合 • Webとローカルのマッシュアップだ
ウェブとローカルのマッシュアップ • ニコニコ動画の動画をローカルに落とす • もう散々やられている • 落とすと同時にエンコードしてiPodへGO • 専用ソフトなら出来る • Tsukikageならブラウザ上から出来る! • ブラウザに何も導入することなく
開発が終わっていない箇所 • ネイティブコードライブラリコール • Boost::Pythonの実験 • 自然言語処理エンジン • Mecabの利用は実装済み (形態素解析) • Cabochaは未実験 (構文木解析) • インストーラー作成 PascalScriptと格闘中 • UI,デモアプリケーション
おしまい • Greasemonkeyの上位互換をProxyで作った • Webを簡単に自然言語処理するミドルウェア(?)が開発できた。 • ブラウザに手を入れることなく、Greasemonkey以上の拡張性を得ることができた • 八月の予定 • 未実装箇所の実装、インストーラーサンプルアプリケーション
利用した言語 • Tsukikage本体 • Python • プラグイン • HTML+CSS • Python • JavaScript • C++ • インストーラー innosetup • Pascal スクリプト • バイト、趣味 • EXCEL+VBA、HSP
ソースコード量 • メインソースコード、コメント込み • 362行 14,370byte8/1現在 • 今回の未踏の中で一番コード量が少ない • 自分が何もやってないわけじゃなくて、それくらいPythonが強力なんです
開発スケジュール • 二月 卒論 • 三月 リサーチと、息抜き • 四月案2IEツールバー • 五月案3,4,5Firefox関連 • 六月案6,7Proxy関連の実装論文執筆 • 七月 ブラッシュアップ論文発表 • 八月 UI作成 ←今ここ 本格的にコーディング始めたのは六月から。