統一言語メーカーなるものを作りました

Posted at 2010-02-19T17:11:09+09:00 in Project

【統一言語」「メーカー」「なる」「ものを」「作りました】

空の境界の第六章に出てくるらっきょのさっちんこと玄霧皐月が使う、 統一言語っぽい文章を生成する統一言語メーカーなるものを作りました。

これは何?

さっきも書きましたが、統一言語メーカーは、 空の境界という奈須きのこ氏の作品の第六章に出てくる、 全寮制の女子高でなぜか教師をやってる魔術師、 玄霧皐月の扱う統一言語らしき文章を生成するジェネレーターです。

統一言語って何?玄霧皐月って誰?そもそも空の境界って何よ?

まず空の境界っていうのは1998年ぐらいにWeb上で公開され、 2004年に講談社によって出版された、奈須きのこ氏の長編伝奇小説です。 で、現在劇場映画化もされていて、講談社から新書版上下巻と文庫版三巻が発売されてます。

で、玄霧皐月ってのは、この空の境界の第六章に出てくる敵キャラで、 全寮制の女子高の礼園女学院でなぜか教師をやってる魔術師です。

んで、統一言語ってのはその玄霧皐月が扱う言語で、 バベルの塔以前の言葉を乱される前の言語、ということになってます。

で、統一言語メーカーって何?

で、玄霧皐月が扱う統一言語は、作中で、

【あなた」「には」「見えない】

という感じで表現されているのですが、 統一言語メーカーはこれっぽい文章を生成するジェネレーターなのです!!!

使い方

  1. まず統一言語メーカーにアクセス
  2. テキスト入力欄に文章を入力。
  3. 統一言語る!をクリックして送信

という感じで、統一言語っぽいフレーズを生成して楽しめます。

技術的な話

このBlogを読んでいる読者の方は当然技術的なことが気になると思うと書いておくと、 統一言語メーカーは、普通のPerl CGIによって作られています。

動作の流れとしては、

  1. トップページから入力を受け取る
  2. 受け取った単語を統一言語っぽく分割
  3. 出力ページを生成
  4. 出力ページへリダイレクト

という感じです。

肝となるのは受け取った単語を統一言語っぽく分割ってところですが、 これはText::TinySegmenterをつかって実現しています。

Text::TinySegmentertinysegmenterというJavascriptで書かれた 分かち書きライブラリのPerl移植版で、現在CPANから0.01がインストールできます。

で、このText::TinySegmenterで分かち書きしたフレーズは、 完全にバラバラで、統一言語っぽくないので、これを今度は部分的に結合します。

このあたりを書くとネタバレになるのであんまり書きたくない、と言いつつ書きますが、 助詞同士を結合して、助動詞を前の単語とくっつけるという作業をしています。

このあたりの処理を作るのに、ちょっと苦労しましたが、まあそんなにややこしいわけでもなく、 助詞と助動詞の正規表現作ってトークンがマッチしたら処理するって感じになってます。

ちなみに、この統一言語っぽく分割するルーチンの精度ですが、まあ6~8割って感じです。 【あなた」「には」「見えない】は完璧なんですが、【ここ」「では」「見えない】【ここで」「は」「見えない】になってしまってます。あと他の文章もちょっと変だし。

特にText::TinySegmenterの元となったtinysegmenterがひらがなだけで構成される文章が弱いらしいので、 統一言語メーカーもそのあたりの特徴を引き継いじゃってます。

まあこれでMeCab使うとさすがにオーバースペックだし、他の形態素解析器使うのアレなので、 多分これはこのままです。

説明終了。感想とか

まあ当然のことながら、TYPE-MOONとか奈須きのこ氏本人とか講談社から怒られた場合は公開を中止すると思います。 まあ多分そんなことにはならないだろうと思いますが、仮になった場合にはgithubあたりでソースを公開しようかと考えてます。

まあはっきり言って、空の境界知らない人は何コレって感じな代物ですが、空の境界を知ってる人はニヤニヤできると思います。 あとまあなんか要望等あればメールなりTwitterのダイレクトメッセージなりでお知らせください。 ちなみにTwitterのアカウントは@nyarlaです。

あとまあCGIで動いてるのは出力ページ生成器(mayday.cgi)だけなんで、アクセスが集中してもそうは重くならないと思いますが、 統一言語メーカーはこのBlogと同じサーバで動いてるので、このBlogとか無貌断片の方に支障が出てくるような場合には、 もしかすると公開を一時中止するかもしれません。まあこのあたり鳴かず飛ばずになるのか、 それとも大ヒットとなるのかはわからないんですが。

まあとりあえずものは形になったんでよかったら遊んで見てください。

それでは。enjoy !

おまけ。現在発売されている空の境界の商品一覧

新書版

空の境界 上  (講談社ノベルス)

タイトル 空の境界 上 (講談社ノベルス)
ASIN 4061823612
価格 ¥1155 (2010-02-21T08:03:51Z現在の価格)
発売元 講談社
発売日 2004-06-08

空の境界 下 (講談社ノベルス)

タイトル 空の境界 下 (講談社ノベルス)
ASIN 4061823620
価格 ¥1260 (2010-02-21T08:03:52Z現在の価格)
発売元 講談社
発売日 2004-06-08

文庫版

空の境界(上) (講談社文庫)

タイトル 空の境界(上) (講談社文庫)
ASIN 406275892X
価格 ¥620 (2010-02-21T08:03:53Z現在の価格)
発売元 講談社
発売日 2007-11-15

空の境界(中) (講談社文庫)

タイトル 空の境界(中) (講談社文庫)
ASIN 4062759209
価格 ¥800 (2010-02-21T08:03:56Z現在の価格)
発売元 講談社
発売日 2007-12-14

空の境界(下) (講談社文庫)

タイトル 空の境界(下) (講談社文庫)
ASIN 4062759462
価格 ¥800 (2010-02-21T08:03:57Z現在の価格)
発売元 講談社
発売日 2008-01-16

劇場版

劇場版「空の境界」 俯瞰風景 【通常版】 [DVD]

タイトル 劇場版「空の境界」 俯瞰風景 【通常版】 [DVD]
ASIN B0015ONF2U
価格 ¥5040 (2010-02-21T08:03:59Z現在の価格)
発売元 アニプレックス
発売日 2008-05-21

劇場版「空の境界」 殺人考察(前) 【通常版】 [DVD]

タイトル 劇場版「空の境界」 殺人考察(前) 【通常版】 [DVD]
ASIN B0015ONF3E
価格 ¥5040 (2010-02-21T08:04:02Z現在の価格)
発売元 アニプレックス
発売日 2008-06-25

劇場版「空の境界」 痛覚残留 【通常版】 [DVD]

タイトル 劇場版「空の境界」 痛覚残留 【通常版】 [DVD]
ASIN B0015ONF3O
価格 ¥5040 (2010-02-21T08:04:03Z現在の価格)
発売元 アニプレックス
発売日 2008-07-23

劇場版 「空の境界」 伽藍の洞 【通常版】 [DVD]

タイトル 劇場版 「空の境界」 伽藍の洞 【通常版】 [DVD]
ASIN B001HUN1OE
価格 ¥5040 (2010-02-21T08:04:05Z現在の価格)
発売元 アニプレックス
発売日 2008-12-17

劇場版 「空の境界」 矛盾螺旋【通常版】 [DVD]

タイトル 劇場版 「空の境界」 矛盾螺旋【通常版】 [DVD]
ASIN B001HUN1OO
価格 ¥6090 (2010-02-21T08:04:07Z現在の価格)
発売元 アニプレックス
発売日 2009-01-28

劇場版「空の境界」 忘却録音 【通常版】 [DVD]

タイトル 劇場版「空の境界」 忘却録音 【通常版】 [DVD]
ASIN B0028UMC3S
価格 ¥5040 (2010-02-21T08:04:10Z現在の価格)
発売元 アニプレックス
発売日 2009-07-29

劇場版「空の境界」殺人考察(後) 【通常版】 [DVD]

タイトル 劇場版「空の境界」殺人考察(後) 【通常版】 [DVD]
ASIN B002QBAACE
価格 ¥6090 (2010-02-21T08:04:11Z現在の価格)
発売元 Aniplex Inc.(SME)(D)
発売日 2009-12-09

Plack::Loader::GatewayCGIなるものを試作してみた

Posted at 2010-01-29T17:53:17+09:00 in Project

Ruby on Railsのgateway.cgi相当のモジュールをPlack::Loaderのサブクラスとして実装してみた

前にPlack::Server::GatewayCGIなるものを試作してみたんですが、 その後Plackの開発を追っていたら、miyagawaさんがコミットメッセージで、 railsのgateway.cgiのようなものはPlack::Loaderのカテゴリがフィットするよ という趣旨のことを言ってたので、 前に書いたPlack::Server::GatewayCGIPlack::Loader::GatewayCGIとして実装しなおしてみました。

http://gist.github.com/289556

例によってコードはgithubへ見に行ってください。

今回の特徴としては、前はPlack::Server::AnyEventにベースのバックエンドサーバに依存してたのが、 今回はその依存がなくなり、Plack::Server::CoroとかPlack::Server::Standaloneとかが使えるようになりました。

今のところ、

  • Plack::Server::AnyEvent
  • Plack::Server::Coro
  • Plack::Server::POE
  • Plack::Server::ServerSimple
  • Plack::Server::Standalone

のサーバに対応しています。

一応Plack::Server::CGIでも動きますが、駐在プロセスとかできないので、 高速化は一切できません。

あとPlack::Server::FastCGIに関しては、サーバのホストとポートの取得の仕方がわからなかったので、 今のところ対応していません。誰かそのあたりのコードをプリーズ。

あ、それとPlack::Serverのネームスペースが非推奨になって、Plack::Handlerに変わったはずなので、 ここら辺これからPlackの開発がすすんでくると読み替える必要があるんで注意してください。

あとまた例によって今回書いたPlack::Loader::GatewayCGIはプロトタイプなので、 実際に実用しようと思うと、もうちょっとコードをリファクタリングする必要があると思います。

まあ実用するにはまだまだって感じなので、あんまり使い道はない感じですが、 ちょっと実験するぐらいなら使えるので、いろいろいじって見るのもいいかと思います。

以上Plack::Loader::GatewayCGIを試作してみたという話でした。

Plack::Server::GatewayCGIなるものを試作してみた

Posted at 2010-01-09T11:08:31+09:00 in Project

この記事は書かれてから約1ヶ月経っています。

Ruby on Railsのgateway.cgiをPlackに移植してみた:試作編。

Ruby on Railsにはgateway.cgiというアプリケーションを半駐在(一定期間駐在しその後終了する)させる CGIスクリプトが付属しているらしいんですが、そのgateway.cgiと同じようなことをする、 Plack::Server::GatewayCGIなるものを試作してみました。

http://gist.github.com/271857

試作品なんでコードはgistに貼り付けてありますんで、上記リンクから見に行ってください。

で、Plack::Server::GatewayCGIの仕組みは、

  • N秒後に終了するバックエンドサーバーが起動しているか確かめる
    • 起動してなかったらバックエンドサーバを起動する
  • バックエンドサーバの存在が確認されたら、Plack::Server::GatewayCGIはバックエンドサーバと起動CGIをつなぐProxyとして振舞う。

という感じです。

ソース見てもらえれば分かると思いますが、Plack::Server::GatewayCGIのバックエンドサーバである Plack::Server::GatewayCGI::BackendPlack::Server::AnyEventを継承して作ってます。

まあPlack::Server::AnyEventにこだわりがあるわけでは無く、単にN秒後に終了するというサーバを作るのに、 コードがいじりやすそうだったからという理由でPlack::Server::AnyEventを使ってます。 事実継承してちょっといじるだけだったのでPlack::Server::GatewayCGI::Backendの行数は40行程度に収まってます。 だから、他の実装をベースにできるんであれば、他の実装をベースにしても良いと思います。

で、Plack::Server::GatewayCGIを使うと、起動に時間のかかるPSGIスクリプトをある程度高速化できると思います。 が、単純なPSGIスクリプトだと、バックエンドサーバを起動したり、バックエンドサーバとのProxy処理なんかがあるため、 逆に遅くなってしまうと思います。

で、ローカルでテストしているplasxomのスクリプトを実行してみましたが、一回目のアクセスはちょっと遅かったものの、 二回目のアクセスは比較的早く処理されました。 まあでもベンチ取ったわけではないので、本当に高速化できてるか微妙な感じです。

あと多分ですが、一回目のバックエンドサーバを起動する時、なんとなく素のPlack::Server::CGI使ってるときよりも遅い気がするので、 アクセス数があんまり無いサイトでPlack::Server::GatewayCGIを使うと体感速度が悪化すると思います。 逆に一定間隔でアクセスがあるサイトで、起動の遅いPSGIスクリプト使ってる場合なんかは早くなるんじゃないかと。

で、なんですが、何でこんな妙なもん作ろうかと思ったかというと、まあなんとなく作ってみようかなと思ったのが一つと、 CGI環境しか用意できない人でも、PSGIスクリプトを高速化できたらいいなぁと思ったのが一つです。

まあ自宅サーバとかVPS、専用サーバなんかを用意できて、FastCGI、SpeedyCGI、mod_perl、mod_perlite、mod_psgiなんかが使える環境では、 素直にそれらの環境を使っておいた方がいいです。

あと僕の公開サーバの環境だと、なんかCPU使用時間が跳ね上がりそうなので、今回作ったGatewayCGIは今のところ使うつもりはありません。 まあ作った意味があんまり無いですね><。まあ面白そうだからなんとなく作ったってだけですし。

ま、Plack::Server::GatewayCGIPlack::Server::GatewayCGI::BackendのライセンスはPerlと同等としておいたので、 誰か引きついでモジュール化したいという方がいれば、是非ともやってください。 僕は動くものを試作できたってことで満足なので、これ以上発展させるつもりは無いです。

まあこれ本当に使い道あるのかな?って気がしなくもないんですが、 良かったら試しに使ってみてください。

IPアドレスをリモートホスト名に変換するPSGI scriptを書きました

Posted at 2010-01-03T13:01:45+09:00 in Project

この記事は書かれてから約1ヶ月経っています。

IP addressをhostnameに変換するPSGI script

Google App Engineで何か作ろうかなぁと思ってGoogle App Engineについて調べてたとき、 2010年一月現在リモートアドレスは取れるけどリモートホストが取れない というのを発見して、GAEでリモートホスト取れないんなら、他のサーバでリモートホスト取ってこればいいんじゃね? と思い、PerlでIPアドレスをリモートホストに変換するPSGIスクリプトを書いてみました。

http://github.com/nyarla/ip2hostname

使い方はREADME.mdとかip2hostname.psgiのPODに書いてありますが、 PSGIスクリプトをplackupとかmod_psgiとかで起動して、 http://{yourdomain}/{IPv4}にアクセスすると、IPアドレスをホスト名に変換したテキストを返します。

あとはまあGoogle App Engineでリモートホストが取得したくなったときに、 他のサーバで公開したip2hostname.psgiを経由してリモートホストを取得すればいいなかぁという感じです。

まあGoogle App Engineでリモートホストを取れるようになればいらない子になるのは確実ですが、 今のところGoogle App Engineでリモートホストが取れるようになってないんで、 しばらくは役に立つかと思います。

あとライセンスはもうパブリックドメインとしたので、煮るなり焼くなり自由に使ってください。

Amazon Auth ProxyをPSGIアプリケーションにしてみました

Posted at 2009-10-31T16:12:10+09:00 in Project

この記事は書かれてから約3ヶ月経っています。

Amazon Auth ProxyをHTTP::EngineアプリケーションからPSGIアプリケーションにしてみた。

えーっと、最近空繰再繰をplasxomで再構築中なんで更新を控えてたりしたんですが、 今から10日前ぐらいに、前に書いたAmazon Auth ProxyをPSGIアプリケーションとして書き直したりしました。

http://github.com/nyarla/amazon-auth-proxy

例によってあんまり動作確認してないのと(plackupで起動するのは確認した)、 使い方なんかはまあ前とそんなに変わってないのでその辺り省略。

が、設定項目が変更になってたりするのでそのあたり注意。まあその辺りはREADME読んだら分かります。 あと前のHTTP::EngineベースのAmazon Auth Proxyはhttp-engineブランチとして残してあります。

まあ今から十日も前なんで作った感じはどうだったかとかすっかりわかんなくなっちゃってますが、 割りとすんなりと修正できたような気がします。

あと、PSGIアプリケーションになったので、mod_psgiで永続化したり、 Plack::LoaderとかPlack::ServerとかPlack::Builderとかが使えるようになりました。 これが大きな利点。これからメジャーになっていくと思われるPlack/PSGIで動かせるのは大きなメリットなんじゃないかと。

まあそんな感じでAmazon Auth ProxyはPSGIアプリケーションになったので、 良かったら使ってみてください。

About Me

name
Naoki Okamura
nick
nyarla
contact
nyarla[ at ]thotep.net
Category
Log
Banners
Powered by
plasxom