[卒研メモ] IPAmj明朝フォント書体表示

 IPAでは,事由に利用できる美しい標準文字TTFをリリースしており,この1月に戸籍で使われている文字を収めたIPAmj明朝フォントをリリースしました。自体の確認のためにはインストールする必要があり,数文字だけ字体の確認をしたい場合は面倒です。

 そこで,以前作った春秋フォント表示スクリプトをちょっと改造して,IPAmj明朝フォントの書体確認ページを作ってみました。UCSコード表記か,文字列入力すると,このフォントから文字を読み出してグラフィックスとして表示できます。

 時間があったらPDFに埋め込むようにしてみようかしらん。

卒研メモ: Google Cloud Vision API

 情報セミナー2の自由制作のテーマとして,Google Cloud Vision APIを使った画像認識ツールの製作を行ってくれたのがK君です。基本有料ですが,1,000回/月までは無料で使えるとのこと。

 東海道五十三次の袋井宿の画像を解析してみると,「水辺」「旅行」「木」「空」「イラスト」「アート」等の単語が出てきます。残念ながら地名までは特定できていませんが,画像認識ツールとしては相当優秀ですね。

 結果はJSON形式で取得できるので,無料で使える範囲で他のサービスとの組み合わせができると面白そうです。

卒研メモ:openBD Search API実装

 毎年この時期は3年生の情報セミナー2の時間を利用して好きなものを作るようにしています。本年度は懸案だったopenBDの検索用API(openBD Search API)の実装を行ってみました。処理の流れを図示したものが下記になります。

 ⓪~⑥までの処理内容を書き出してみます。

⓪ openBD.jpから全書誌情報をダウンロードします。こちらのPythonスクリプトを土台として,MySQLに書誌情報を突っ込むように改良しました(Thanks Aくん)。
① ユーザからの検索要求を受け付けるWebフォームは,API gatewayにPOST(GETでもいいはず)できる仕様であれば言語は問いません。サンプルとして,JavaScriptからXMLHttpRequest関数を使って実装してみました。
② API gatewayに検索情報をPOSTします。この際,Webフォームを設置してあるサーバのドメイン向けに発行したAPIキーも一緒に送付する必要があります。
③ API gatewayでは,受診したAPIキーをRefererと合わせて認証し,通った場合のみ検索を実行します。
④ MySQLサーバで検索され,マッチしたデータはAPI gatewayに送られます。
⑤ 検索データをJSON形式に加工してWebサーバに送付します。
⑥ JSONデータをどのように表示するかはWebサーバ側で決めます。

 検索結果をJSON形式にした理由は,元々のopenBDの書誌情報がJSONで記述されているからです。今のところ混ぜて使う予定はありませんが,「検索機能付きopenbd.jpもどき」のようなものを作る際には楽になるかと。

 ちょっとトラブったのは,XMLHttpRequest関数が,デフォルトでは別ドメインへのアクセスを許容していないという仕様の問題。API gateway側で”Access-Control-Allow-Origin: アクセス許可ドメイン”をHTTPヘッダに追記すればよいとのことなので,JSON検索結果を返す直前に発行するようにしました。これで別ドメインからのアクセスがAJAXで可能になりました(その分,セキュリティホールを増やしているとも言える)。

 その他,APIキー発行システムを作ったり,大本のPHPスクリプトがバレないようにApacheのエイリアスを設定したりして,何とか今風のWeb APIっぽく実装出来たハズです。外部公開も可能な状態ではありますが,サーバの付加やopenBDの今後を見ながら考えていくことにしたいところです。つか,これ単独だと大して面白くないんで,SNS APIを通じて世評と組み合わせられるような仕組みに使えればいいかなぁと夢想中。

卒研メモ: Apache Cordova参考文献

 来年度の3年生向け実験講座のテーマを決めなきゃいかん時期になりました。久しぶりなのでOS環境から作る必要があり,3月下旬~4月上旬はこれにかかりきりになりそうな感じです。

 ということで,色々調べた結果,枯れた技術を使うのが安全なので,テーマとしては「Apache Cordovaを用いたハイブリッドアプリ開発」になりそうです。まだ作ったことないけど。他の先生方とテーマが被ることもなさそうです。

 参考文献は色々探すと,これなんか良さげなので,一冊入手しました。Webに転載されている分だけでも参考になります。とはいえ,何を作るかまでは本には書いてありませんので,いろいろ考えなきゃいかん訳です。2~3回の実習でできる範囲に留めておかなきゃいけません。この辺の塩梅が難しいところ。

 まぁ,チマチマ触りながらテーマを考えていきます。

卒研メモ:openBD全件サーチ高速化

 MySQL化に引き続き,検索の高速化を行ってみました。手っ取り早く,著者フィールドをindex化した結果,かなりの高速化ができることを確認しました。

 検索ワードを「高橋留美子」でやってみた結果です。index化前は

でしたが,index化後は

となり,1.69秒→0.00257秒で爆速となりました。このぐらいだとほぼWeb通信の遅延しか感じません。

 とはいえ,index化できるフィールドには限りがあり,出版社名,タイトル名まで一篇にはindex化できません。ということで,メインの書籍テーブルではタイトル名でindex化しておき,著者名,出版社名はそれぞれ個別にテーブルを作っておくことにしてはどうかと思案中です。これができると,ようやく最終目的である「openBD APIに著者名,タイトル名,出版社名の検索機能を追加する」ことができるようになります。予定では

  • 著者名検索 -> http://root-url/tklab_openbd/version/search?author=著者名
  • 出版社名検索 -> http://root-url/tklab_openbd/version/search?publisher=出版社
  • タイトル名検索 -> http://root-url/tklab_openbd/version/search?title=タイトル

となればいいかなぁ。マシンリソースが決定的に不足してますんで,API keyはPOSTで渡すようにして制限掛ける予定です。今月中にできればまぁ情報処理学会で話すぐらいは出来るでしょう。

 ちなみに,メイン書籍テーブルまるごとのMEMORYエンジン化は無理でした。メインメモリを山ほど積んだ,openDBの本家が展開しているような贅沢クラウド環境でないと厳しいですねぇ。
 フィールドを制限してテーブルサイズを小さくすると入ることは入りますが,1/4ぐらいの検索速度に留まりましたんで,index化の方が桁違いに速いことが分かります。

卒研メモ: openDB全件サーチMySQL化

 以前作ったOpenBD全件サーチ試作版ですが,卒研が佳境になってきたので,高速化の試みを行いました。A君の頑張りのおかげで,Memcachedをかませてコンマ000秒程度の時間で検索が可能であることが確認できました。とはいえ,一度検索を行った結果がCacheされて再利用できる場合にのみ,です。

 SQLiteからMySQLへの移行も行い(未公開),ついでにデータダウンロード用のPythonスクリプトをVersion 3対応しました。結果として,安定的に1秒台後半の検索が実現できています。

 ただやっぱり普段からGoogleの爆速サーチに慣れ切った身としては,1秒以上待たされるというのは「もったりすったり」感が拭えません。

 現状では検索対象データは100万件程度,1GBぐらいで収まってますので,このぐらいならどうにか全部On memoryで可能と考えています。とりあえずMySQLのMemory storage機能を使ってみたいところです。

 これで初手から検索が高速になるようなら,Memcachedも不要となるはずですが,データの肥大化にどこまで対応できますやら。