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

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

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

プリンターの「READY」をあなたならどう訳す?

2013.06.24 20:20 追記:超恥ずかしい間違いをしてたので修正。ああ恥ずかしい><;


始まりは LibreOffice の日本語議論用 ML のこのスレッド。

http://www.mail-archive.com/discuss@ja.libreoffice.org/msg02407.html

で、まあいろいろやり取りがあって、ぼくの中では:

  • READY = 「印刷可」
  • WAITING = 「待機中」

でほぼ決まってるのですが(というのはメールにも書いた)、なんでお前そんなことグチグチ悩むねん、ということをここに記録しておきます。

アプリケーションから見えるプリンターのステータス

そもそもアプリケーションはプリンターのステータス、えっとこんな感じで見えるやつです*1、をどう得てるんでしょうか。


Windows の場合は GetPrinter() という API があって、この引数 Level に 2 を渡して PRINTER_INFO_2 という構造体をもらって、その Status というメンバーを見るのが普通です*2

Value Meaning
PRINTER_STATUS_BUSY The printer is busy.
PRINTER_STATUS_DOOR_OPEN The printer door is open.
PRINTER_STATUS_ERROR The printer is in an error state.
PRINTER_STATUS_INITIALIZING The printer is initializing.
PRINTER_STATUS_IO_ACTIVE The printer is in an active input/output state
PRINTER_STATUS_MANUAL_FEED The printer is in a manual feed state.
PRINTER_STATUS_NO_TONER The printer is out of toner.
PRINTER_STATUS_NOT_AVAILABLE The printer is not available for printing.
PRINTER_STATUS_OFFLINE The printer is offline.
PRINTER_STATUS_OUT_OF_MEMORY The printer has run out of memory.
PRINTER_STATUS_OUTPUT_BIN_FULL The printer's output bin is full.
PRINTER_STATUS_PAGE_PUNT The printer cannot print the current page.
PRINTER_STATUS_PAPER_JAM Paper is jammed in the printer
PRINTER_STATUS_PAPER_OUT The printer is out of paper.
PRINTER_STATUS_PAPER_PROBLEM The printer has a paper problem.
PRINTER_STATUS_PAUSED The printer is paused.
PRINTER_STATUS_PENDING_DELETION The printer is being deleted.
PRINTER_STATUS_POWER_SAVE The printer is in power save mode.
PRINTER_STATUS_PRINTING The printer is printing.
PRINTER_STATUS_PROCESSING The printer is processing a print job.
PRINTER_STATUS_SERVER_UNKNOWN The printer status is unknown.
PRINTER_STATUS_TONER_LOW The printer is low on toner.
PRINTER_STATUS_USER_INTERVENTION The printer has an error that requires the user to do something.
PRINTER_STATUS_WAITING The printer is waiting.
PRINTER_STATUS_WARMING_UP The printer is warming up.

で、これらの値は、もとを正せば SNMPRFC 2790 Host Resources MIB の hrDeviceStatus、hrPrinterStatus とか hrPrinterDetectedErrorState とかになるわけです。RFC 3805 Printer MIB の "2.2.13.2. Overall Printer Status" の表がわかりやすいのでパクってくると:

Printer Status hrDeviceStatus hrPrinterStatus hrPrinterDetectedErrorState
Idle running(2) idle(3) none set
Busy/Active running(2) printing(4)
Non Critical Alert Active warning(3) idle(3) or printing(4) could be: lowPaper, lowToner, or serviceRequested
Critical Alert Active down(5) other(1) could be: jammed, noPaper, noToner, coverOpen, or serviceRequested
Unavailable down(5) other(1)
Moving off-line warning(3) idle(3) or printing(4) offline
Off-line down(5) other(1) offline
Moving on-line down(5) warmup(5)
Standby running(2) other(1)

でまあ、例えば Idle だったら PRINTER_INFO_2.Status はどのビットも立っていない PRINTER_STATUS_OK (0) なので READY とか、そんな感じになるでしょう。

なんでこんなめんどくさいマッピングをするのかというと、プリンターは複数の接続形態で PC と接続しうるわけで、例えば USB で接続してる場合は USB の Printer クラスはIEEE 1284 の互換のステータス情報で取れる用紙切れとかビジーといった情報に限られますし、WSD や IPP の場合もそれぞれスキーマが異なります。これをアプリケーションレイヤーで意識するのは馬鹿げているのでマッピングするわけです。それはいい。

で、マッピングしたからにはマッピングした人がスキーマに対して責任を持たなきゃいけないじゃないですか。じゃあその PRINTER_STATUS_WAITING とは一体何よ? というと、これがどこにも書いてないという……。ざけんな MS。

ぱっと考えただけでも二つ解釈があります。

  • PC 側からデータを受信したのだけど、途中から送られて来なくなった。だから続きを待っている (= WAITING)。
  • READY ではないのだけど (ちょっとした異常はあるの今すぐ印刷はできないのだけど) ジョブを受け付けることはできる。そういう意味ではジョブを待っている (= WAITING) とも言える。

後者の解釈、強引だと思いますか? でも、RFC 2790 の hrDeviceStatus にはこんな記述があるんですよ。


The warning(3) state indicates that agent has been informed of an unusual error condition by the operational software (e.g., a disk device driver) but that the device is still 'operational'. An example would be a high number of soft errors on a disk.

ここから PRINTER_STATUS_WAITING というステータス名を取ったのではない、という保証はどこにあるでしょう?*3 確かに直感的ではないにせよ、PC側から見れば「プリンターがジョブを確実に受け付けることができて、時が来ればちゃんと印刷できることが保証される」という時点で「印刷できる」と言えなくもないわけです。これについては後述します。


なお上記の話は Windows だけに限った話で、OS X および Linux でステータスをどう取っているか*4 という話もあるので、マルチプラットフォームアプリである LibreOffice はさらに話がややこしいですな。

実はまちまちなデータスキーマ

こういっちゃなんですけど、メーカー内のエンジニアには、英語の仕様書とか読むのしんどいなーとか思いつつ実装してる人がいるわけですよ。昔の私とか*5

で、私が例えは Host Resources MIB の実装をしろといわれたら、Waiting って字面を見て、「ああ、これはプリンターがジョブ待機してる状態だな」って思って、そうやって実装する可能性はないわけじゃない。正直、相互運用性テストとかやるとそういうしょうもない解釈間違いで落ちるわけですよ。なので RFC とかはかなり丁寧に「これはこういう意味だよ、こう解釈するんだよ」って書いてあるんだけど、逆にそれが「うわーこんなに沢山英語読まないと実装できないのか……」って思わせたり。

笑っちゃうかもしれないんですけど、某大手ベンダーさんが複数のネットワークプリンターに対応する管理アプリを作るって話になったとき、「オフライン」というごくわかりやすいデータですら、各ベンダーで解釈がまちまちだったってことがあるわけなんですね。そういう世界なんですよ。

「印刷可」の定義って?

これは元プリンター屋の私とみなさんの感覚が乖離してるのかもしれないのですが、皆さん、「印刷可」というとどのような状態を想像しますか?

「そんなの決まってるじゃないか、プリンターがあって、電源入ってて、ネットとかUSBでつながってて、特にエラーも起きてなくて、誰も使ってなければ、印刷可だろう」

って思うでしょうか。そうですね。それ「印刷可」だと私も思います。

じゃあ、複合機で、誰かが大量の部数のコピーを取っている状況を想像してください。コピーしてるんですから、当然そのときに印刷はできないです。しかし、「印刷」という行為を「PC側でぽちっと印刷ボタンを押す」ことだと捉えたら、それがエラーが起きずにプリンターにジョブが送られるのであれば、それは「印刷可」だとはいえないでしょうか。

たいていの中クラス以上の複合機はハードディスクなどがありますから、コピーとして利用している最中でもジョブは受付でき、コピーが終わったら自動的に印刷が始まるようになっています。このとき、プリンターはどう通知してくるのか? OSはそれをどうアプリケーションに伝えるのか? アプリケーションはどうユーザーに伝えるべきなんでしょうか?

オペパネの表示とリモートでの表示

ちょっとうまく伝わるかわからんのですけど、プリンターのオペパネで教えて欲しい情報ってどんなんでしょうか? 例えばさっき出たような「プリンターの印刷エンジンはガンガン使われてるけど、印刷ジョブの受付は可能」というような状態で「印刷可」という情報を伝えてもらって嬉しいかどうか。

「おおそうか、印刷できるのか、じゃあ自席に戻って印刷ボタンを押してこよう」って人は、きっと少ないですよね。なら、「今やってる印刷があとどれぐらいで終わりそうか」みたいな情報を出したほうがずっとありがたいんじゃないでしょうか。そしたら、「あと1時間ぐらいは使われてるのかー、じゃあ別のプリンターに印刷するかー」って判断できるでしょうし。いや、このユースケースだって私の思い込みであって、実際のとこはわかんないです。

一方、ネット越しにプリンターの情報を見るとき。これも二つの目的があると思うんですね。

一つはユーザーとして今のプリンターの状態を知りたいとき。LibreOfficeでステータスを表示するというのはそういう意図でしょう。多分。

もう一つは、部門なりなんなりの機器管理者が、自分の管理してるプリンターのヘルシーチェックをしたいとき。例えばトナーニアエンドでも印刷はできるけど、管理者はニアエンドならトナー発注しないといけない。そういう話。

なので、「オペパネにこう書いてあるときはこういう意味です、とマニュアルにはありますよ」というのは、ネット越しにプリンターを見るときのワーディングを決めるのに、参考にはなるけれども決め手にはならない、というのが私の考えです。

終わりに

私がプリンター屋だから無駄にこだわってるのかもしれませんけど、プリンター以外の用語であっても、「英単語を訳したという意味では間違ってはいないけど、背景にあるコンテクストを考えると不適切な訳はしたくない」と思って LibreOffice の翻訳には関わってるつもりで、プリンターだけ特別に考えているわけではないですし、「素人置いてけぼりで考えて変に用語をこねくり回したい」というわけでもないのです。

まあ、そそっかしいので間違えてることは少なからずあるとは思いますし、そこら辺はぜひ自由闊達にご意見をいただければ。

よろしくおねがいしまーす。

*1:Twitter で @baffclan さんにもらったキャプチャをちょい加工しました。感謝感謝。

*2:あとでソース見て追記するかも。

*3:いやー何を勘違いしたんでしょうねえ。WarningとWaitingを間違えるとは……。で、HR MIB にも Printer MIB にも Waiting ってステータスについての記述はないんですよねえ。

*4:Ubuntu で確認するとステータス取れてるの見たことないので、実際は取ってないんじゃないか疑惑もあり。あとでソース読まなきゃ……

*5:今は得意になったというわけではなく、メーカーから離れたというだけです。