おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

Ubuntu を Google Cloud Print のサーバーにしてみる

本当は Google Cloud Print の中を覗いてみたかったんですが、今日中に調べて記事をかけるとは思えなかったので、ただ使うだけ。スミマセン。

Google Cloud Print とは

これ読め、で終わってしまうんですが……。

要は、クラウドの向こう側にあるアプリケーション (例えば Google Docs とか) から、クラウドの向こうにあるサーバーに対して印刷リクエストを投げると、サーバーに登録してあるプリンターからネットワーク上で作られたデータが降ってくるというものです。

というと、パーソナルコンピューティングではイマイチよさがわかんないんですけど、モバイルとの組み合わせで強さを発揮するんですよね。

例えば、スマートフォンから印刷するってシチュエーションを考えたときに、スマートフォンでわざわざ印刷したいリッチなドキュメントを作ってそれを印刷するっていうより、クラウドの向こう側にあるドキュメントをスマートフォンの画面から覗き込んで印刷するってシチュエーションの方がずっとありえると思いますし、そのときに、資源が少ないモバイルデバイスで印刷データを作るより、そこよりはずっと豊富な資源があるネットワークの側で印刷データを作ったほうがいいですよね。

ということで、私自身は iOSAndroid から直接印刷するソリューションはどっちかというとタブレット系端末向けで、スマートフォンについては Google Cloud Print の方が面白いんじゃないかと思ってます。そもそも Google 依存なのはどうなのよとか、それ以外にも面白くするためのアイディアもいくつかあるんですが、それはまたの機会に。

Google Cloud Print と Ubuntu のステキな関係

Apple AirPrint もそうなんですが、Google Cloud Print は本来、サポートしたプリンターを必要とします。ネットワークから降ってくる印刷データを受け取れる機能を持ってなきゃいけないんですね。

例えば我が愛用の HP Photosmart Wireless B110a

なんかだと、ePrint という「プリンターごとに割り当てられたアドレスに電子メールを送るとメールの内容と添付ファイルを印刷してくれる」サービスがあるんですけど、この機能と Google Cloud Print をヒモづけることで、Google Cloud Print 対応を実現しています。

もちろん Google さんも、プリンターベンダーがサポートしてくれないと自分たちのサービスが使えないってのは困るので、PC を「プロキシー」にして、PC に接続されたプリンターを使う仕組みを提供してます。これ、Google Chromeプラグインとして提供されてるんですけど、Linux 版ではまだサポートされてないんですよねー。というか、サポートするかどうかも怪しい。

ですが、実のところ Google Cloud Print は REST API でサーバーとお話ができ、PDF を印刷データ形式として食えればいいので、技術的には Linux マシンをプロキシーにするのはさほど困難ではありません。といってたら 作っちゃった人 がいて、これは Ubuntu 11.10 のときに標準化されたんですよね。

ソース見れば分かりますけど Python スクリプトで書かれてて、一個は Python で REST をサポートする API を提供するスクリプトで、本体はそれほど難しくないです。ので、いつかは中を読みといてみようかと。今日は使うだけ。

使ってみよう

説明するまでもなく簡単です。

まずは apt-get でインストールして、

$ sudo apt-get install cloudprint

お試しで使うならデーモンモードでコマンドラインから起動。

$ cloudprint -d
Google username: naruoga@gmail.com
Password:
Added Printer Ricoh-Aficio-MP-C4501A
Added Printer Generic-PostScript-foomatic
Added Printer Generic-PostScript
Added Printer HP-Photosmart-B110-series
Added Printer Ricoh-Aficio-SP-4100NL
Added Printer Generic-PCL-6-PCL-XL
$ started with pid 9176

ここで追加されてるプリンターたちは、CUPS で共有設定されてる奴です。それを Google Cloud Print のサーバーに登録してるというわけ。

んで Android から Google Docs アプリを開けて「Print...」を押すと、上記で登録したプリンターがぞろぞろって出てきて、それを選ぶとおもむろに CUPS にジョブが投入されて印刷されます。本来ならスクリーンキャプチャ撮って載せればよかったんですがめんどうだったので……あとで気が向いたら載せます。

投入された印刷ジョブを確認してみよう

d:id:naruoga:20120101:1325421043 のように foomatic のデバッグオプションを使って印刷ジョブの情報を確認してみましょう。

foomatic-rip version 4.0.9.241 running...
called with arguments: '78', 'naruhiko', 'terms-new', '1', 'ColorModel=FromPrintoutMode Duplex=None InputSlot=Default PageRegion=A4 PageSize=A4 PrinterResolution=FromPrintoutMode PrintoutMode=Normal.Gray xsrf_token=AIp06Dhimkcn7TCoD4aOkLaZc_DT4ssThg:1326459650523 job-uuid=urn:uuid:deffe527-eaa0-3327-66d4-46399f5a8336 job-originating-host-name=localhost time-at-creation=1326459657 time-at-processing=1326459657'

あんまり大したことはわかりませんが(をい)、第三引数に Google Docs の文書名がそのまま渡されていること、用紙サイズなどのデータはオプションで引き渡されること、などは見て取れますね。PrintoutMode=Normal.Gray なのはなんでだっけな。

終わりに

今回もやっつけエントリですみません。

明日は今日の続きで、外部から解析するか、/usr/share/python/pyshare/cloudprint/cloud.py の中を読むか、Google Cloud Print を叩く簡単なアプリを書くか、そのどれかをやってみようかと思います。……けど明日お出かけなんだよなー