インクジェットプリンターの目詰まりとの戦い

この記事はTech KAYAC Advent Calendar 2023の7日目の記事です。

こんにちは、@commojunです。記事を書くのは2年ぶりです。昨年は娘が生まれ、最近1歳になりました。知らない間に紙を食ったりしていて、目が離せません!!

はじめに

皆さんはご自宅にプリンターはお持ちでしょうか?我が家にはあります。ペーパーレス化が進んできた昨今、プリンターを持たないという人も増えてきていると聞きます。たまにしか印刷しないならコンビニで大丈夫だったりしますからね。

しかし、印刷物が必要になる出来事は突然やってきます。最近だと、保育園の入園申し込みをするために、市で公開されているPDFファイルを紙に印刷して、期日までに申し込み用紙を完成させる必要がありました。そんなときプリンターでさくっと申込用紙を出力できると頼もしいです。内容を書き損じたときも、気軽にもう一度プリントするだけですからね。コンビニ印刷の場合では、1枚印刷する労力と金銭的コストが違います。きっと必要事項の記入も命懸けとなったことでしょう。

我が家のプリンター

我が家のプリンターはこんなやつです。

プリンターです

EPSONの2017年式エコタンクモデルです。エコタンクといえば、大容量のインクを搭載して、印刷1枚にかかるインクのコストがとても安くて済む人気のモデルですね。

カートリッジ式 or エコタンク

現代において(インクジェット式の)プリンターを選ぶとき、インクカートリッジ式か、エコタンク方式のどちらのモデルを選ぶのかというのは誰しもが通過する究極の選択になっているように思います。カートリッジ式は本体価格が安く、カートリッジが高いため、導入コストは安いがランニングコストは高く、エコタンク式は、本体代金が高く、インク代が安いため、導入コストは高いがランニングコストが安いというのがざっくりとした特徴だと言われています。

僕も、今のプリンターを家電量販店で購入する際、店員さんにこんなようなアドバイスを受けた記憶があります。

「月に100枚以上印刷しますか?そうでなければカートリッジ式の方が良いですよ」

なんで?

なぜこのようなアドバイスが言われているかというと、プリンターの寿命がせいぜい5年くらいだとして、プリンタの寿命を全うするまでに印刷してかかったインク代の総コストをカートリッジ式プリンターと比較したとき、節約できるインク代の総額が本体代の差額を上回るのがだいたい「月に100枚(正確な数字は違ったかもしれません)以上の印刷」と言われていたようです。もしかしたら今はちょっと事情が違うかもしれませんが、僕がプリンターを購入した当時はそんな感じだったんだと思います。

そうじゃない

そんなアドバイスを聞いても僕は全く腑に落ちませんでした。「まぁ…月に100枚も印刷する自信なんてないし、カートリッジ式にします…」ってなりますか?僕はなりませんでした。

カートリッジ式は時代が古い!今はエコタンクの時代だ!!プリンターをコストで語るな!!俺が本当にほしいのは、「その気になれば何枚でも印刷できる無限のインクタンクがある」という優越感なんだよ!!

…と本当に店員さんに言ったわけじゃないですが、結局エコタンク方式のプリンターを購入しました。

結構良い

実際、結構良かったです。特に、「いざとなれば印刷物の量産もやぶさかではない」という余裕があって、結婚式をしたときにはいくつかのペーパーアイテムをこのプリンターで招待客の人数分印刷して手作りしたり…などのこともできました。エコタンク式のロマンだと思います。

目詰まりが…

しかし、インクジェットプリンターの宿命は、インクの目詰まりです。1ヶ月以上印刷をせず放置してしまうとインクが目詰まりするリスクがあります。実際、我が家はそんなにコンスタントに印刷を必要とする家庭ではないので、気がついたらいつの間にかインクの出が悪くなっていて、一生懸命ヘッドクリーニングを回したり…ということを繰り返してしまっていました。

このままではヤバい。印刷枚数も少ないまま、想定よりも早くプリンターがお陀仏になってしまう可能性がある。なんとか工夫をこらして、意地でもこのプリンターを何年も使い続けてやる!!と思いました。

定期的に印刷を

インクを扱う機材において、寿命を長持ちさせたいなら、インクフローを止めないことが最大の秘訣のようです。つまり、定期的になにか印刷をすればいいということです。1~2週間に一度はなにか印刷をしてみましょうとおすすめをするネット記事も多いです。

なるほど。では週に1度印刷をする工夫をしてみよう

作戦1 LINEボット通知

我が家には定期通知ができるLINEボットがいます。何曜日の何時何分に決められたメッセージを定期的にLINEボットが発言をする、という設定ができます。

以前執筆したこちらの記事で、プログラミング初心者でも比較的わかりやすいようにボットの作成方法を書いていますので、興味があればこちらもご覧ください。

qiita.com

こちらのボットを利用して、毎週土曜日の午前中になにか印刷をすることを思い出させる通知をしてもらうように設定してみました。

プリンターの使用を促す猫

ああ^〜!!プリンターの長寿命化に貢献するなんともお偉いお猫様であること〜〜!@!!?!

人間は怠惰である

しかしダメです。週に一度通知が来ても、実際に印刷という行動を起こすのは人間。毎週同じ通知をするだけでは、その通知が右から左へ通り過ぎていったり、「今週はめんどくさいからいいや」という慢心を引き起こします。

結局、この作戦は長くは続かず、1ヶ月以上プリンターを放置してしまうこともだんだんと増えてしまいました。

作戦2 cron

通知なんて回りくどいことしてないで、週に一度勝手に印刷が始まればいいんです。

それを実現するのがこれです。

github.com

これは、みなさんがお持ちの自宅サーバ上で、CUPSというプリントサーバを立ち上げ、対象のプリンターを登録しておきます。そうすると、コマンドラインインタフェースで印刷ができるようになります。そしてさらに、crontabを設定し、週に一度所定のPDFファイルを印刷するといったソリューションとなります。このgithubリポジトリでは、それら一連の定期印刷サービスを一つのDockerコンテナで実現するものとなっています。

利用方法や仕組みを少し紹介します。

事前に必要な物

  • 自宅にDocker(およびdocker compose)が利用できるサーバがあること
  • そのサーバと同一なネットワークにプリンターが接続していること
  • プリンターの設定でIPP等のネットワークプリントを有効化していること
  • 何らかの方法でプリンターのIPアドレスを固定するか、もしくはプリンタ自体がBonjour等を搭載し、特定のホスト名でアクセスできること

我が家では、プリンターのmacアドレスを調査し、ルータのDHCP固定割り当て機能を使ってIPアドレスを固定しましたが、プリンタ自体もBonjour機能も搭載していました。

設定

リポジトリをcloneしたら、 .env.sample を参考に、 .env ファイルを作成します。.env ファイルにはプリンターが印刷を受け付けるためのURLを記載します。こちらの例はIPPプロトコルのURLになります。プリンターのプロトコルは他にも様々あるようなのですが、詳しいことはあまり調べておりません…。

$ cp .env.sample .env
PRINTER_URI=http://printer-ip:631/ipp/print

EPSONのプリンターであれば、ブラウザでアクセスする管理画面(Web Config)でIPP(および各種の)プロトコルの有効/無効化とURLが確認できるのではないかと思います。

あとはコンテナイメージのビルドおよびコンテナを起動するだけです

$ docker compose build
$ docker compose up -d

少し解説

コンテナのエントリポイントとなっている run.sh はこのようなことを記載しています。

# ジョブコントロールを有効にする
set -xm

crontab $CRONTAB_FILE
cat $CRONTAB_FILE
echo "crontab installed"

# cupsサーバの開始
/usr/sbin/cupsd -f &

# 少し待つ
sleep 10
# プリンターの登録
lpadmin -p printer -E -v $PRINTER_URI -m everywhere

cron -f

CUPSサーバを立ち上げたあと、少し待ってから lpadmin コマンドでプリンターの登録をします。オプションはそれぞれこんな意味のようです。

  • -p : プリンタ名の指定。好きな名前をつける
  • -E : プリンターを有効にする
  • -v : プリントキューのURIを指定する
  • -m : ドライバ指定に関するオプション。 everywhere を指定することで、ドライバレス印刷となる

登録が終わったら、cronを開始します。

crontabにはこのようなことを記載しています。

TZ=Asia/Tokyo
SHELL=/bin/bash

# 土曜日の朝9時
0 9 * * 6 lp -d printer -o fitplot /test-print.pdf > /proc/1/fd/1 2>&1

印刷を命令するコマンドとして lp コマンドを使っています。印刷を取り扱うコマンドは他にもいろいろあって、違いがよく分からなかったのですが、ひとまずこの組み合わせで目的は達したのでよしとしています。

lp コマンドで使っているオプション

  • -d : 利用するプリンタ名を指定。 lpadmin で登録したときの名前を使う
  • -o : 用紙などさまざまな印刷設定。 fitplot は、用紙サイズに合わせて拡大・縮小

画像ファイルなど様々なファイルを印刷ができるらしいですが、テストプリント目的であれば、A4用紙設定をしたPDFファイルをあらかじめ用意しておけば、細かな印刷設定をコマンドラインオプションで指定する必要がなく、楽でした。

動作の様子

テストプリントの様子

ああ^〜!プリンターの寿命が伸びる音とともにお猫様が〜〜〜!!

かくして、毎週1枚はカラー印刷が実行されるようになりました。ちなみに毎週土曜日の朝、プリンターが突然印刷を始めるので、油断しているとびっくりするというデメリットはあります。

おわりに

これでできればまだ数年間はこのプリンターを使い続けていきたいです。みなさんもよかったらマネしてみてください!

それではまた!

カヤックではサーバで生活を便利にしたり、コンテナ技術、猫に興味のあるエンジニアも募集しています!

hubspot.kayac.com