なるひこの Linux Printing お勉強日記 RSSフィード

ご注意!

ここはあくまでも私個人のブログであり、いかなる団体や組織の立場から離れた、私個人の知見なり学んだことなり勝手な思い(妄想ともいう)を書く場所であります。それを踏まえてお楽しみいただければ幸いです。

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

2012-01-15

cloudprint パッケージの中身を覗いてみる(その1)

長らくつまらないエントリーにお付き合いいただきましたが、今日が最終回でございます。いや、ブログエントリー自体はちょこちょここれからも書くつもりですが、毎日と縛りを付けて書くのはオシマイということで……。のつもりだったけど、このエントリーがあまりにも中途半端なので明日も書くでしょう。なんとまあ。

さて今日は、先日のエントリーで書いた Ubuntu の cloudprint パッケージの中をちょっと覗いてみましょうというお話。といっても自分、Python はあんまり得意じゃないので、そこんところはご容赦。


/usr/bin/cloudprint

短いので中身を全部転記しちゃってもいいですね。


#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'cloudprint==0.5','console_scripts','cloudprint'
__requires__ = 'cloudprint==0.5'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('cloudprint==0.5', 'console_scripts', 'cloudprint')()
    )

これはまぁ setuptools でパッケージ化したスクリプトはこんなかんじになるらしくて、名前の通り load_entry_point で条件を満たすエントリーポイントを持ってきてそれを実行してるんでしょうねえ。適当。

ホントは pkg_resources のリファレンスを確認しようと思ったんだけどなんか繋がらないのでここらへんはフィーリングで。


/usr/share/pyshared/cloudprint/cloudprint.py

んで、持って来られる実体はこちら。

とりあえずクラスは

  • CloudPrintProxy(object):
  • PrinterProxy(object):
  • App(object):

の三つです。というか CloudPrintProxy の責務が巨大すぎるってば……。

あとトップレベル関数が、

  • sync_printers(cups_connection, cpp)
  • process_job(cups_connection, cpp, printer, job)
  • process_jobs(cups_connection, cpp, printers)
  • usage()
  • main()

の五つ。とりあえず main() から見て行きますかね。


main()

最初に起動オプションの確認をして、それから pycups ((system-config-printer の付属成果物として作られた CUPS ライブラリPython バインディング) を使って CUPS とコネクションを張り、CloudPrintProxy() のインスタンスを cpp という変数に格納します。

それから必要なら Google Cloud Print の認証を取って、sync_printer() で CUPS の共有プリンターGoogle Cloud Print サーバーに登録されているプリンターを sync して、最後に daemon モードの場合は python-daemon を使ってデーモン化し、そうでない場合はそのときに Cloud Print に投入されているジョブだけ処理したらその場で終了するようですね。


終わり?

うわー中途半端。でも今日はここで切ります。明日は sync_printers と process_job/process_jobs を読んだ後、CloudPrintProxy() の中に入っていきたいなと。

2012-01-14

Dynabook AZ の Lubuntu 化その後

昨日日記かかずに(訂正、飲み会の帰りに書こうと思ってたら爆睡してて)寝てしまったので一日落としてしまいました。ので、今から慌てて保管します。しょぼネタで。

まえにも書いたとおり Dynabook AZUbuntu 化したのですが、アレから少しチューニングしました。完璧ではありませんが、まあ参考になれば。


Lubuntu 化

これはもう単純で:

$ sudo apt-get install lubuntu-desktop
$ sudo apt-get purge ubuntu-desktop

だけです。

ディスプレイが割れちゃった一号機は LightDM を使ってたんですがなんか遅い気がしてたので lxdm にしました。関係があるのか分かりませんが、前よりは軽い気がします。


キーマップの変更

やっつけですけど……。

まずは:

$ sudo setxkbmap -model jp106 -layout jp

してから、これだと | や _ が入力できないので、.Xmodmap に:

みたいな記述を追加しました。メニューキーに Super_L を割り当てたりしたんですが、いまんとこ使ってませんのでこのやり方であってるかは分かりません (^^;

あとこの記事書いてる途中にフリーズしてリブートしたんですがそしたら元に戻っちゃった……なんでや? まあ、それは今後の課題。


12.04 にする

まぁあんまりむずかしいことを考えずに /etc/apt/sources.list を:

# /etc/apt/sources.list

deb http://ports.ubuntu.com/ubuntu-ports/ precise main restricted universe
deb http://ports.ubuntu.com/ubuntu-ports/ precise-security main restricted universe
# deb http://ports.ubuntu.com/ubuntu-ports/ precise-updates main restricted universe

と書き換えて apt-get update ; apt-get upgrade ; apt-get dist-upgrade しただけです。いまんところは大きな不具合はないですね。


Twittering-mode の導入

なにせイオンSIMで使うことがメインのつもりなので、あまり重量級のクライアントは辛い。ので、Twittering-mode を使ってみようと思いました。

やったことは:

$ sudo apt-get install emacs twitterling-mode

して、 ~/.emacs.el に:


(require 'epa-file)
(epa-file-enable)
(require 'twittering-mode)
(setq twittering-use-master-password t)
(setq twittering-icon-mode t)
(setq twittering-timer-interval 300)

って追加したんですが、これは Emacs Wiki 丸パクリなのであってるか不明。

Twittering-mode 超よくできてるので非常に気に入ってます。


Emacs-w3m の導入

Twittering-mode で URL つっつくとおもむろに Web ブラウザが起きるのうざったいなーと思って Emacs-w3m を入れることにしました。これも何も考えずに apt で入れます。特に設定してないけど使えてるからまあいいや。でもときどき文字化けするのはなじょして?


終わりに

中途半端ですみませんが、まぁかなりいい感じになった気がします。ちょっと翻訳したり文章書いたりするだけならこれで十分じゃんみたいな。なんといっても劇遅とはいえスタンドアロンFOMA網が使えるというのは大きい。

後はメーラーだなー。Sylpheed 試しに使ってみたんですが、これですらまだちょっと重い気が。


さて、明日(もう今日だ)は最終回。原点に帰って印刷ネタ&プログラミングネタですかねー。

2012-01-13

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

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


Google Cloud Print とは

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

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

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

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

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


Google Cloud PrintUbuntu のステキな関係

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

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

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

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

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

ソース見れば分かりますけど Python スクリプトで書かれてて、一個は PythonREST をサポートする 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 を叩く簡単なアプリを書くか、そのどれかをやってみようかと思います。……けど明日お出かけなんだよなー

2012-01-12

いまさらながらUbuntu 11.10でAndroid

今更なネタですみませんね。

何度か書いているように私はあんまり創造的な人間ではないので、Android についてもアプリを作りたいなーというのはあんまり思わなかったのですが、前から書いている通りエンドユーザーコンピューティングにおいて、開発者とエンドユーザーをつなぐ仲介役として技術を発揮できればなーなんてことを思っているわけでして、そうなると Android についても最低限のことはやっておかなきゃダメだよねということで……。

ところで、私のメインの環境は Ubuntu なんですけど、ついこないだ、Oracleライセンス改訂によっていわゆる sun-javaUbuntu コミュニティによる配布が止められてしまいました。AndroidJava 6 なわけですが、OpenJDK 6 はいろいろ地雷だと聞いているので、まぁそこらへんから解決しないといけない。

そんなわけで、超今更ではありますけどまとめておくことにします。

基本的には Android SDK のインストール方法に従うだけではあるんですけどね。もしかしたら勘違いしてたりすることもあるかもしれません。そしたらコメントとかついったで教えてくださいね。


必要なもののチェック

まずは System Requirements をチェックしましょう。

OS の要件

最初に OS についての条件が書いて有ります。Linux の場合 は以下の通り

  • glibc 2.7 以上
  • Ubuntu なら 8.04 以降
  • 64bit OS の場合には 32bit 環境が実行できること

私の場合は 32bit PAE なので問題ないです。デスクトップ環境で 64bit を使うと、こういうことを考えなきゃいけないのでちょっとめんどくさいですね*1。まあそれが楽しいという意見はありますが :)

サポートしている開発環境

Eclipse 必須じゃないらしいですが、いろんなドキュメントは Eclipse を想定して書かれてるので、ここは長いものに巻かれます。

Eclipseapt-get で入れると 3.7 (Indigo) が入るのでそのまんま使うことにします。また JDT も依存関係で勝手に突っ込まれるので問題なし。問題はさっきも書いたけど、 JDK 6 なんですよねー。しょうがないので Oracle のを入れることに。


Oracle 謹製 Java 6 のインストール

これはもう @chonan さんのエントリーをさくさくっとパクります。ごく単純にいえば:

  • /opt/jvm にファイルを置くことにして
  • Oracle のサイトから配布パッケージを取ってきて
  • 自己展開スクリプトを --noregister 付きで*2 実行して
  • 環境変数を ~/.profile で設定

ってことですね。まぁそれ以外のやり方でもいいんですが、@chonan さんのいうとおり「こういうやり方をする会社とはそれなりに付き合う」ようにしたほうがよろしいと私も思います。


Android SDK の導入

これはもう手順に書いてあるままで、

ってな感じで。


ADT Plugin のインストール

これも ADT Plugin のインストール説明の "Downloading the ADT Plugin" 以下に書いてあるとおりやればいいはず……なんですが、なんかハマった気がする。なんだっかなー。確かエラーが出て

怒られた気がする。記録取ってなかったので覚えてないんですが、確か出たエラーでぐぐってそこの指示に従えばよかったと思います。役に立たないレポートですみません(^^;


Android SDKインストール

さっき導入した SDK は一種のコアパッケージとでもいうものらしく、実際に例えば Android 2.3 とか Android 4 とかの開発を行うには、そのための SDKインストールする必要があります。

そのためには EclipseWindows > Android SDK Manager を起動してやります。

f:id:naruoga:20120112222758p:image

んで、必要な SDK をぽちぽちっとクリックして入れると。私の手持ちの IS11CA は 2.3.3 なので、とりあえず 2.3.3 の SDK を入れておきましたが、あとで学びたいスキルに依っては追加したりなんだりするかもしれませんね。そこらへんは適当に。


AVD のインストール

AVD = Android Virtual Device で要はエミュレータのこと。これも EclipseWindows > AVD Manager で起動します。

f:id:naruoga:20120112222759p:image

んで、さっきインストールした SDK と同じバージョンのエミュレータを入れておけばおけ、と。


動作確認

まぁとりあえず Hello World なチュートリアルでもひと通りやってみて、ちゃんと開発できることは確認しました。ふぅ。


終わりに

なんかマトモなエントリをぜんぜん書けてなくてごめんなさいです……orz

とりあえず開発環境は作れたんで、なんかチュートリアルでもぼちぼちやっていこうかねーとは思ってます。Java とかぜんぜん書いたことないけど〜

明日のネタ、どうするかなぁ……印刷ネタに戻ってなにか書きたいところではありますね。

*1:とはいえ、仮想化ソフトウェアに依っては 32bit ホストに 64bit ゲストがのらないものもあるので、普段のデスクトップ環境はともかく、64bit の環境も使いたいという場合は選択の余地がなかったりしますね。

*2Oracle なんかもう信用しないもんねという意思表示を付けて

2012-01-11

Dynabook AZをLubuntu化

今日はネタがないので……というか、ネタを仕込むべき時間を他のことに使ってしまったので、そのことについて。


Dynabook AZ とは

通称「あずにゃん*1 こと Dynabook AZ

TOSHIBA dynabook AZ クラウドブック Android2.1搭載 10.1型ワイド PNAZ05MNA

TOSHIBA dynabook AZ クラウドブック Android2.1搭載 10.1型ワイド PNAZ05MNA

Android 搭載機のくせに Android Market は使えず、「本製品は Windows OS 搭載機ではありません」のロゴが燦然と輝くこの機械、昨年末からアキバIOSYS にて 19,999 円で売ってるんですよね。それでもバカ売れしてるってわけじゃないのがまたポイントという、一種鬼っ子なマシンなわけですが……。


AZ を買いました

これがですね、今の Ubuntu には Dynabook AZ 用の公式イメージがあるんですねー。ということで今ナウなヤングUbuntu ユーザーは AZ を買って Ubuntu を入れるというのが常識になっておりまする。

さらに IOSYSAZSIM がついてないんですが、超トロいけれども低価格で有名なイオン SIM が使えると言うじゃないですか。おー、ということは FOMA 3G しかつかえない田舎にいってもネットがいちおうつなげるということではないか。カヤックなり山なりで田舎に行くことが多いぼくとしては結構嬉しい。

つーことで買ったわけですよ。年末に。

んで、さっそく Ubuntu 化して、イオン SIM も買って、でもあれー、なぜか認識しないぞー?? まぁポケファイで通信はできるし、週末スキーにいくから、そのときにちょこちょこいじろうって思ってカバンに詰めてもっていったら、見事に滑って転んでカバンの上に見事に着地してですね……液晶が割れちゃって悲しいことになりましたとさ。orz

そんなわけでもう一台今日買ってきましたとさ。アホだね私は。


今までやったこと

まずはイオン SIM ですが、最初差してもやっぱり認識しなくて、くそーこいつ使えねーって思って、ダメもとで抜いて挿したら認識しましたw

んで、ついったで教えてもらいつつ AZ 付属の Android で通信できることを確認。うーん、たしかに死ぬほどトロいわこれ……。

ここまでやったら次は Ubuntu 化であります。といってもこのページのとおりやっただけ。

前回は問題なかった記憶があるんだけど、今回はなぜかキーボードレイアウトインストール時に変更すると固まってしまったので、一旦 US キーボードインストールして、インストール後に JP106 にしました。といっても AZキーボードは JP106 ともぜんぜん違うので、ちゃんとキーボードレイアウト作ってあげないといけません。

んでさすがに Unity 重たいので Lubuntu 化を今やってるところ。ここまでは液晶が割れた前の子でやったことと同じです。


この先の予定

まずはちゃんとキーマップ書いてあげないとツラすぎですよね。Lubuntu なので原始的に xmodmap で。というか、誰か書いてたりしないかな。

あとやっぱりイオン SIM ツラすぎるので、Twitter とか Gmail みたいなのは Web UI じゃないほうがよさそう。ということで、適当なクライアントを探さないと。Twittering-mode と Wanderlust でいいのかなー? いや、私は別に Emacs 教徒じゃーないですよ。

それから、手元にある唯一の ARM マシンなのでいろいろいじらないとつまらない。ので、やっぱり Precise にすべきかしらねぇ〜。

そうそう、ディスプレイが死んだだけで一応動いてる初代も活用を考えてあげないとなー。常時電源ONにしてなんか面白いことできないだろうかねー。アイディア募集です。


終わりに

あー今日もダラダラ日記になってしまった。よくないなー。

明日こそはちゃんと技術ネタを。いまのとこ Microtech ePrint Free の Android 版 について調べてみようかなって思ってます。

あと、仮エントリのまま放置してある二つの記事もなんとかしなきゃね。

*1:どうやらアニメの登場人物のことらしいのですが、私そういうの全然知らないのですスミマセン。