プリンターの「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. |
で、これらの値は、もとを正せば SNMP の RFC 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 の翻訳には関わってるつもりで、プリンターだけ特別に考えているわけではないですし、「素人置いてけぼりで考えて変に用語をこねくり回したい」というわけでもないのです。
まあ、そそっかしいので間違えてることは少なからずあるとは思いますし、そこら辺はぜひ自由闊達にご意見をいただければ。
よろしくおねがいしまーす。