GData.SpreadsheetsライブラリのListFeedに潜む罠

ほぼ1日ぐらいはまっていたのでメモ代わりに記録しておきます。 Googleの各種サービスはWeb APIを持っているだけでなく、.NET, Ruby, Python, Java等の各種言語向けSDKを用意しています。これを使ってGoogle Spreadsheetsを操作しようとして、ちょっとはまりました。 Spreadsheet APIのリファレンスには、spreadsheetを操作する2種類の方法を提供しています。ListFeed型(行単位処理)とCellFeed型(セル単位処理)です。 CellFeedは割と簡単で、指定した矩形範囲のセルを逐次処理させるのに向いている手段です。ただし、こちらにも若干の罠があって、デフォルトでは値の入っているセルのみしか操作できません。APIリファレンスのサンプルの書き方もそのようになっています。値の入っていないセルも捜査対象にするためには、CellQueryのReturnEmptyプロパティにReturnEmptyCells.yesを代入しておく必要があります。 上記のコードは、5×3のセルすべてにアクセスするためのコード例です。ReturnEmptyを指定しないと、値の入っていないセルはとばして結果を返してきます。 本題のListFeedの罠についてですが、まずAPIガイドのサンプルの一部を見てみます。 このコードをまっさらなシートに対して実行をすると、API側がHTTPステータス400を返すので、GDataRequestExceptionが発生します。 何が問題なのかというと、ListEntry.CustomのプロパティであるLocalNameは「1行目のカラムの値」との対応付けがなされている前提のAPIだからです。上記の例だと、1行目に”firstname, lastname, age, height”という値が入ったセルが必要だということです。このことについて気付いたのは、値の入ったシートに対してListFeedで読み出しをしてみたら、1行分だけ少ない結果が返ってきたからです。CellFeedはそういう制約がないため、1行目を含めて内容の取得、変更等ができます。 あとになってガイドを読み返したら、以下のような説明がありました。 list row Row of cells in a worksheet, represented as a key-value pair, where each key is a column name, and each value is the cell value. The first row of a worksheet is always considered the… Continue reading GData.SpreadsheetsライブラリのListFeedに潜む罠

Intel Celeron N2806のeMMC(RPMB)

ECS LivaというBay-Trail MベースのPCがあります。秋葉原の複数の店舗やAmazonで扱っています。2万円しない小型PCで、メモリ(2GB)とストレージ(eMMC 32GB)を搭載しているので、OSさえ用意すれば他には何もなくても使えるマシンです。 公式でUbuntu 14.04が動作すると書かれているのですが、やはりDebianを使いたいのでなんとかしてインストールしてみました。 しかし、wheezyのインストーラではストレージを認識できません。Linux kernel 3.8から入ったsdhc_acpiというホストドライバが必要なのですが、Debian wheezyの標準kernelは3.2と古いのが原因です。 結局、自分は一度Ubuntu Live USBイメージから起動して、debootstrapで頑張ってDebianをインストールするという手段で実現しました。Debianさえ入ってしまえば、backportsにある3.14 kernelがwheezyでも使えます。 最初はwheezy用のインストーラを作るべく頑張ってみたのですが、3.14 debian udebにsdhc-acpi.koが含まれていないというバグがあるため(kernel debにはある)、kernelパッケージを作り直す必要がありました。しかし作り直しても、eMMCデバイスは見えるけれどもアクセスすると固まるという問題があったため、挫折しました。 今のbackports kernelでは一応動いていますが、Replay Protected Memory Block(RPMB)と呼ばれる領域にアクセスできないという不具合があります。この警告はUbuntu kernelだと出ません。 [ 3.202626] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 [ 3.205033] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 [ 3.207399] mmcblk0rpmb: timed out sending r/w… Continue reading Intel Celeron N2806のeMMC(RPMB)

KAKASIのコードについて

ここしばらくKAKASIのソースをいじっています。いい加減あたらしいバージョンをリリースして、しばらくは他のことをやりたいのですが、次に戻ってきたときいろいろと忘れそうなので、記録として残しておこうと思います。 そもそもKAKASIとは何か オリジナルのKAKASIはたかはしもとのぶさんによって作成されたソフトウェアです。漢字、カタカナ、ひらがな、ローマ字を相互に変換する機能をもっています。SKKの辞書を用いて、 オリジナルのKAKASIに、単語を分割する「分かち書き」機能をパッチとして作成したのが、馬場さんです。馬場さんはこの機能を利用して、freeWAISやNamazuなどの全文検索ソフトウェアで日本語を扱えるようにしました。 自分もNamazuの開発にかかわる中で、パッチとしてKAKASIの機能をメンテナンスするのはしんどい、KAKASIのリリース自体長らく行われていない、といった理由で、Namazuの開発の一環としてKAKASIの開発を継承することをたかはしさんに打診し、受け入れられて今に至ります。 最近の作業 KAKASIのバージョンは長いこと2.3.4でリリースが止まっていました。2006年ごろ自分がリリースをしようとした痕跡があるのですが、その後Debian方面でlibtext-kakasi-perlのテストが通らなくなった等いろいろな要因で「これはリリースしないといけない」と思い、ようやく出せたのが2014/1/18です。このリリースで一番大きい変化はUTF-8のサポートです。といっても、iconvに依存しています。KAKASI本体がISO-2022-JP, EUC-JP, SJIS(cp932)の変換機能を持っているのですが、UTF-8対応のためにテーブルを持つのもどうかな、と思いiconvを使うようにして実装しました。 これでひとまず解決か、と思いきやperlモジュールでテストが通らない問題が直っていませんでした。何が起きていたかというと、分かち書きオプション-wを付加したときに、先頭に余計な空白を出力するために、期待されていた出力とは異なっていたのです。 このバグはDebianパッケージの自動ビルドで発覚しました。開発者がアップロードしたアーキテクチャ以外(mips, arm等)のパッケージは、自動的にビルドサーバーによってパッケージが作成されます。その時make testまで実行するので、ライブラリの変化によってバグが顕著化されました。 これを直すために作業を進めていたところ、さらに複数のバグが発覚し、それらの対応も必要になり、今に至ります。 KAKASIの基本データ構造Character kakasi.hで様々なデータ構造が定義されていますが、文字を格納する基本となる型Character(実体はstruct character)が入出力の基本となります。 typedef struct character { char type; unsigned char c1, c2; } Character; typeは文字の種別を表し、0~5, 127の値をとります。値の定義は同様にkakasi.hで行われています /* character set */ #define ASCII 0 #define JISROMAN 1 #define GRAPHIC 2 #define KATAKANA 3 #define JIS78 4 #define JIS83 5 #define OTHER… Continue reading KAKASIのコードについて

Debianでrootにaufsを使う(initramfsのカスタマイズ)

大掃除をしていたら初代EeePCが出てきました。最近いろいろあって実マシン環境が複数欲しかったので、この機会にDebianを入れて動かすことにしました。 箱が見当たらなかったので型番がわからないのですが、おそらく 初代EeePC 4G-Xと思われます。当時メモリも一緒に購入したので、RAMだけは2GBとそれなりにあります。

Published
Categorized as Debian

KAKASI 2.3.5をリリース

KAKASI 2.3.5をリリースしました。 実は2006年にリリースしようとしていたのですが、途中で頓挫してしまい実に10年超えのリリース周期となってしまいました。 結構前からCVS版がDebianには入っているのですが、libkakasiが壊れているという問題があるので、このタイミングでのリリースとなりました。あと、 NipponというRのKAKASIバインディングが出来たのが、新しいニュースです。 kanwadictの一新をやりたいところです。辞書は昔からほとんど変わっていないので…

Debianでbackportsにパッケージを登録する(ディストリビューション/パッケージマネージャー Advent Calendar 2013)

これはディストリビューション/パッケージマネージャー Advent Calendar 2013 17日目の記事です。 Debianの安定版(stable)と呼ばれるものは、一度リリースされると致命的なバグやセキュリティに問題がない限り、ソフトウェアのメジャーバージョンが上がることはありません。またリリース間隔が不定期なため、状況によっては古いソフトウェアを使い続けることになります。これはメリットであり、デメリットでもあります。 安定板でも新しいパッケージを使いたい、という要望に応えたものがbackportsです。かつてはwww.backports.orgで非公式サービスとして提供されていましたが、現在では公式なものとして扱われています。 どのようにしてbackportsにパッケージをアップロードするのかは、http://backports.debian.org/Contribute/に基本的にはすべて記述されています。ここでは実体験を交えて説明します。 ACL(Access Contorol List)への追加リクエスト Debian開発者であれば、backportsのACLに自分のIDを追加してもらうだけでアップロードができるようになります。ACLの追加は自力ではできないので、RT(Request Tracker)にチケットを作成してリクエストをします。 チケットの作成はメールで行います。backports@rt.debian.orgあてに”Debian RT”という文字列を含んだメールを送ることで、その内容がチケットになります。以下は私が出したメールの例です backportsに関する情報を得るために、debian-backports MLも購読しておきましょう。 さて、チケットを作って待つこと一週間、何も動きがありませんでした。催促の意味を込めて、次のようなメールをMLに投げました。 するとすぐACLに追加され、チケットはresolvされました。これでdebian/changelogのdistributionの項目に”wheezy-backports”などとしたパッケージを通常のincomingサーバーにアップロードすれば、backportsに登録されるようになります。 Debian開発者ではない人がアップロードをしたい場合は、sponsorを探す必要があります。debian-backports MLでsponsorを募集してみましょう。アップロード先にはhttp://mentors.debian.net/等を利用しましょう。 パッケージの作成 いよいよパッケージのbackportをやります。まず対象となるソフトのソースを入手しましょう。 dgetはdpkg-sourceまで実行してソースコードを展開してくれるので、次はdebian/changelogを更新します。dchには親切にも–bpoというbackportsのポリシーに合わせてバージョン番号を上げる機能がついているので、これを使います。 これで自動生成されるエントリーは以下のようになります。wheezyのdchはデフォルトでsqueeze向けのbpo情報を埋め込みます。 今回はwheezy向けにパッケージを作るので、バージョンとディストリビューションを修正します。 bpo60+1をbpo+72と、現在のwheezyのバージョン番号に合わせました。ディストリビューションもsqueeze-backportsからwheezy-backportsに変えました。 さて、実際にビルドしてみましょう。ビルドには、きれいな(純粋にwheezyのパッケージだけで構成された)環境の利用が推奨されています。pbuilder等の利用を検討しましょう。pbuilderの使い方については、今回ここでは行いません。 上記の例では、まず実環境でビルドしてdscファイルを生成し、それをもとにpbuilderでビルドを行っています。これでビルドに成功すれば、晴れて完成です。 足りないパッケージも作る 完成に見えたこのbackports用パッケージですが、実はこれだけではwheezyで動きません。mikutterのビルド自体はwheezyでできるのですが、インストールしてみといくつかのパッケージがwheezyに存在しないため、エラーになります。 ruby-addressableとruby-oauthはwheezyにもあるようですが。残りは存在しないようです。足りないパッケージを同様にしてbackport化しましょう。 debuildを実行するときには、-Fオプションを忘れないようにしましょう。初回のアップロード時にはupstreamのソースコードも必要だからです。 一通りのパッケージをインストールし、動作することが確認できたら、いよいよアップロードです。 stableが大好きな皆さんはbackportsを活用してゆきましょう。

git-builpackageを使う(Debian/Ubuntu JP Advent Calendar 2013)

これはDebian/Ubuntu JP Advent Calendar 2013 11日目の記事です。 Debianではパッケージを管理する際に、オリジナルのソースコードの上にdebianというディレクトリを作成し、その下にDebian固有のパッケージングに関する情報を記録してゆくようになっています。 かつてはこのファイルの管理はそう大変なことではありませんでした。しかし現在のDebianはoldstable, stable, testing, unstableという4つ(場合によってはexperimentalを含めた5つ)のdistributionを同時に管理しなければなりません。こうなると、やはりバージョンコントロールシステムが使いたくなるところです。 そのためのパッケージのひとつがgit-buildpackageです。名前の通りSCMにgitを使います。この記事ではその解説を行います。他にもsvnやcvs, bzrに対応したものがありますが、それぞれ設計思想から異なるのでここでは触れません。個人的にはsvn-buildpackageも使ってはいます。 ソースコードのインポート 一番最初に行うのは、すでにあるdeb用ソースコード一式のインポートです。これにはgit-import-dscコマンド(あるいはgit-import-dscs)を使います。 これでパッケージ名(この場合hallo)のディレクトリが作成され、そこがgitリポジトリになります このようにインポートされたdebianバージョンとupstreamのタグが作成されます。内容を更新し、新しいバージョンをリリースする際には同様に新しいdebianバージョンのtagを生成することになります。 変更 適当に変更をしてみます。このあたりは普通のgitリポジトリを扱うのと変わりはありません。 テストビルド 修正をコミットする前にテストビルドをするには、git-buildpackage build –git-ignore-newを実行します。–git-ignore-newオプション以外はdebuildと同じです。 問題がなければ、親ディレクトリにパッケージと各種ファイルが生成されます。これでよいと思ったら普通にgit commitしましょう。 リリース向けビルド リリース用のビルドは–git-tagオプションを付けることでできます 新しく作ったdebian versionのタグができていることが確認できます。 参考 PackagingWithGit (Debian Wiki)

Published
Categorized as Debian Tagged

HTMLタグを含むpoファイルからプレーンテキストにまで加工して形態素解析にかけてみてtypo等を見つける (Doc-ja Advent Calendar 2013)

これはDoc-ja Advent Calendar 2013 5日目の記事です。 www.gnu.orgでは、現在GNU website Japanese Translation Teamにてチーム体制でwebの翻訳を進めています。実態はほとんどgniibeさん一人で、私は今のところ翻訳チェックぐらいしかできていませんが… gnu.orgのwebはメッセージの中にHTMLタグも含んだ状態で、poファイルによって管理されています。レビューをする上では、なかなか扱いにくい形式です。 そこで、私は一度poから日本語訳文のテキストを生成し、もう少し見やすくした状態でレビューをしています。この記事では、その方法を紹介します さらに、結果を形態素解析にかければ、若干typo等が見つけやすくなります 今時の形態素解析器はできるだけ細かく分解する方向の実装・辞書が多いので、KAKASIなどを使った方がよいかもしれません。

GNUプロジェクトについて知るワークショップ参加

先の「GNUプロジェクトについて知るワークショップ」に参加してきました。私は「自由ソフトウェアによるライブストリーミング」という内容の発表をしました。 当日gniibeさんに指摘を受けたのですが、この発表ではストリーミングに用いるデバイスは民生品の利用を前提としています。 業務用のデバイスではDRMなどがかからないもの多くあり、不自由なテクノロジーに縛られないストリーミングが可能なはずです。

squeezeからwheezyへのアップグレード

最近いくつかのDebian squeeze(6.0)環境をwheezy(7.0)にアップグレードしたので、その時に直面した問題などをここに記録してゆきます。何かあったら随時追記します。 makefile style init script(insserv) devfsdというかなり古いパッケージがずっと残っていたのですが、これのせいでinit scriptの依存関係がループを起こし、insservがエラーを出してパッケージのconfigureが完了しない、という事態が起きました。 init scriptはsqueezeから依存関係が記述できるようになり、可能な限り並列でdaemonを起動しようとするのですが、devfsdはそれより古いパッケージ(そもそも現在使われていない)ものだったので、デフォルトで与えられる依存関係情報とmdadm-raidの依存関係とが循環参照を起こし、止まってしまいました。一時的にmdadm-raidからdevfsdの記述を削除することで、この問題は解決しました。 本来ならdevfsdなんてインストールすらされていないはずなので、バグレポートはしていません。 phpとrep2ex 2011年ごろのかなり古いrep2exをずっと使っていたのですが、wheezyのphp(5.3.3)で動いていたrep2exがsqueezeのphp(5.4.4)で正常に動作しなくなりました。 確実に動かないのはImageCahe2で、これは新しいphpでDataObjectクラスがsqlite2をサポートしなくなったことが原因です。MySQLかPostgreSQLを使うようにすれば動作します。 ただ、何も考えないとデータベースが移行できないので、データベースの初期化だけ行ってから、sqlite2 image.sqlite .dumpコマンドでエクスポートし、INSERT文だけ抽出してデータベースに食わせることでデータを引き継いでいます。 他に板の名前など一部の日本語が表示されない、という問題が起きているので、これの解決に取り組もうとしています。 最新のrep2exにアップグレードすることも検討したのですが、ディレクトリ構造を含め大きく変わっているので、とりあえず今のrep2exが使える状態になってから取り組もうと思っています。 今後進展があれば、随時更新してゆきます。 追記1(5/27) rex2exの日本語が出ない問題は、php 5.3->5.4でのhtmlspecialcharsの挙動の変化が原因でした。デフォルトでは、エンコーディングの指定がないと5.3ではISO-8859-1、5.4ではUTF-8で処理しようとします。基本的に2chはSJISなので、日本語を含む文字列の変換に失敗して空の文字列を返してしまうようです。 あちこちにhtmlspecialcharsが存在していますが、ある程度機械的に置換してSJISを明示してやることで、大体動くようになりました。これで様子をみつつ、最新のrep2exに追従したいと思います。