カテゴリー別アーカイブ: プログラミング

Google Calendar のデータをXMLに加工して monthly.js に 流し込む

所属している草野球チームのHP制作を担当していて、「スケジュールを載せたい」という要望が来ました。数週間ぐらい前に「そういえば何かカレンダーをキレイに表示させるJSライブラリがあったよなぁ」と「monthly.js」思い出して、Googleカレンダーとこれを使って表示させることにしました。

練習場所まで全世界に公開するのも気持ちが悪いので、Googleのカレンダーは「非公開」の設定のままで、どうにか情報を取得するすべはないものかと調べると、OAuth2なGoogle Calendar API というAPIを使えばいいと載っていました。( OAuth2じゃないAPIもあるっぽいですが、実装が複雑になるのでOAuth2の方式がいいよみたいな情報が公式ドキュメントに書かれていた。うろ覚え。)

しかし、肝心のPerlの解説がない。(仕事ではRubyがメインですが、草野球のホームページぐらいの規模ならPerlで書きたい。)ライブラリ自体は「Google::API::Client」という名前でCPANに登録されているのでこれを使うことにしました。

client_secret.json みたいなファイルをGoogle APIのページから取得すると(詳細は「celient_secret.json google」でググッて)あとは、以下のコードで、初回時のみ手動で認証してリフレッシュトークンを取得すると、それ以降はよしなにしてくれます。(ずっとアクセスを待ち受ける必要があるWebアプリにも組み込めます。)

以下のようにXMLが出力されます。

Googleカレンダーが終了時刻それ自体はイベントの期間に含めない(不等号に「=(イコール)」が付くかどうかの違いのようなもの) のに対して、monthly.js は終了時刻それ自体をイベントの期間に含めるという違いがあるため、endtime(enddateじゃなくて)がない場合は、enddate を一日早めるという面倒な処理が追加で必要になります。(上記のコードではそれが追加されていないので注意。)

上記の面倒な処理を終えて「monthly.js」のマニュアルを読んでWebアプリに組み込むと、以下のように美しく表示できるようになります。ちなみに、高速で「月」を切り替えるとイベントが移動したり増殖したりする「monthly.js」のバグを作り終えてから発見しました。(ぎりぎりクリティカルなバグでもないかというあんばいですが…)

スクリーンショット 2016-02-18 0.34.09

スクリーンショット 2016-02-18 0.34.24

お疲れ様です。( ´Д`)=3

KNPの解析結果をXMLで受け取る(照応解析)🐫

KNPの出力結果を眺めて、どうやって解析すればいいのか悩んでいたのですが、KNPに同梱のPerlライブラリでXML出力をサポートしているのを発見して安心しました。(「perldoc KNP::Result」すると書いてある。)

CaboChaができない照応解析をする必要があってKNPをインストールしたので、早速、人称代名詞を人称代名詞が指し示す人物名に置換するプログラムを書いてみました。

Perl 5.22.0 にアップデートしてから「Lingua::JA::Moji」が警告を吐くようになってしまったので、暇があれば作者にプルリクエストしておきましょうかね。

照応解析では、名前の女性名らしさや男性名らしさなどはさすがに考慮してくれないようなので、それも考慮させたい場合は、自前でなんとかしないといけません。

照応解析誤りが目立ちますが、「安倍 晋三」と「晋三」を同一人物と推定してくれるだけでも非常に助かります。

KNPの固有表現抽出と照応解析は以下が詳しいです。

置換🔞のベンチマーク🐍

re.comileを変数に入れるかどうかでは、正規表現が単純なためか、意外と変わらない模様です。

出力:

peeweeで既存のSQLite3のデータベースを扱う🐍

ほぼ下のURLに書いてある通りですが、生成されたモデルファイル内の「SqliteSequence」クラスと「UnknownField」クラスを削除する必要がありました。

https://peewee.readthedocs.org/en/latest/peewee/quickstart.html#working-with-existing-databases

データベースは、自分で設計したデータベースに青空文庫の全作品をダウンロードして格納したものを使いました。

モデルファイルの作成は以下のような感じ:

データベースから情報を取得するスクリプトは以下のような感じ:

アウトプット:

(青空文庫のすべての作品はNDCというもので分類されています。)

最近のCPAN活動

Pythonも少しやっていましたが、文字列処理はPerlのほうが強力で完全に乗り換える気にはなりません。おそらく、前処理はPerlでやって、統計解析やグラフ描画はPythonでやるのが一番楽だと思います。

Lingua::JA::NormalizeText
日本語正規化モジュール。2000万ツイート文を正規化しても問題が発生しなかったので Ver. 0.50 に上げました。コードに変化はありません。

Lingua::JA::KanjiTable
常用漢字と人名用漢字のユーザ定義文字プロパティを提供するモジュール。2015年1月7日に人名用漢字に「巫」が追加されたのでアップデートしました。

Lingua::JA::DocumentFrequency::AozoraBunko
青空文庫での文書頻度を返すモジュール。たまに欲しくなるので新規にアップロードしました。

他の言語をやればやるほどにCPANを素晴らしく思います。