サーマルプリンタで印刷する: まとめ（再セットアップ＆自動起動編）

## 0. 前回までのあらすじ

1. サーマルプリンタをLinuxから印刷できるように[セットアップ](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)しました。
2. Raspberry Piから文字、画像を[テスト印刷](https://qiita.com/yuyakato/items/3309b0ede886c2698526)しました。
3. 画像を印刷するための[印刷サービス](https://qiita.com/yuyakato/items/24666dff3ea1a6a86672)を構築しました。
4. HTMLを画像に変換するために[レンダリングサービス](https://qiita.com/yuyakato/items/750364647bbb189016bb)を構築しました。
5. GitHubのIssue/PRをブラウザから印刷するために[Chrome拡張](https://qiita.com/yuyakato/items/2d6cd811065be0e8ebec)を構築しました。

これまでの記事については『[目次](https://qiita.com/yuyakato/items/288962fbc39446644668)』をご覧ください。

## 1. 概要

[これまでの作業](https://qiita.com/yuyakato/items/288962fbc39446644668)で、サーマルプリンタ、印刷サービス、レンダリングサービスなどが正常に動作することを確認できました。
いろいろと試行錯誤もあったので、一度環境をクリーンアップし、一通りのセットアップ手順を整理したいと思います。

## 2. ハードウェアをセットアップする

はじめに、ハードウェアをセットアップします。

### 2.1. 必要な機材を調達する

今回のシステムで使用した機材は以下の通りです。

| No | 種別 | メーカ | 型番 | コメント | リンク |
|---:|:---:|:---:|:---:|:---:|:---|:---|
|1|サーマルプリンタ|MunByn|ITPP068USE-BK|約11,000円のリーズナブルなサーマルプリンタ。RS232C、USB、Ethernetの3つのインターフェースに対応。|[Amazon](https://www.amazon.co.jp/exec/obidos/ASIN/B078TCB8H2/x7edimv35x-22/)|
|2|感熱紙|ビジコム|ST808012-5K|80mm幅。5巻で約1,400円。|[Amazon](https://www.amazon.co.jp/exec/obidos/ASIN/B00BFPXX2G/x7edimv35x-22/)|
|3|Raspberry Pi|-|3 Model B+|OSインストール済みmicroSDカード、スイッチ付き電源（便利！）などを含むコンプリートセット。約9,500円。|[Amazon](https://www.amazon.co.jp/exec/obidos/ASIN/B07CRY1JC1/x7edimv35x-22/)|

詳しくは『[セットアップ編](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)』をご覧ください。

### 2.2. サーマルプリンタを仮想COMポートモードに変更する（要Windows環境）

サーマルプリンタ「[MunByn ITPP068USE-BK](https://www.amazon.co.jp/exec/obidos/ASIN/B078TCB8H2/x7edimv35x-22/)」のUSBポートは、出荷時には「USBプリンタモード」に設定されています。
Linuxからこのサーマルプリンタを取り扱うためには「仮想COMポートモード」に変更する必要があります。ただ、設定用のツールがWindows向けにのみ提供されているため、設定にはWindows環境が必要です。

詳しくは『[セットアップ編](https://qiita.com/yuyakato/items/7d4db1c567d952a7ac91)』をご覧ください。

### 2.3. ハードウェアを接続する

今回のシステムでは、機材は以下のように接続されています。ディスプレイ、キーボード、マウスは必要に応じて接続してください。

* サーマルプリンタ -- （USBケーブル） -- Raspberry Pi
* サーマルプリンタ -- （DC電源ケーブル） -- AC/DCアダプタ -- （AC電源ケーブル） -- 商用電源（AC100V）
* Raspberry Pi -- （Ethernetケーブル） -- スイッチングハブなど
* Raspberry Pi -- （Type-A/Micro-B USBケーブル スイッチ付き） -- USB電源 -- 商用電源（AC100V）
* テスト時のみ: Raspberry Pi -- （HDMIケーブル） -- ディスプレイ
* テスト時のみ: Raspberry Pi -- （USB） -- USBキーボード
* テスト時のみ: Raspberry Pi -- （USB） -- USBマウス

## 3. Raspberry Piをセットアップする

続いて、Raspberry Piの基本的なセットアップを行います。

### 3.1. RaspbianをmicroSDカードに書き込む

以前はデスクトップ版のRaspbianを用いましたが、GUIは必要ないのでLite版に変更しました。具体的には以下のイメージを使用しました。

```text
$ unzip 2018-11-13-raspbian-stretch-lite.zip
$ ls -lh 2018-11-13-raspbian-stretch-lite.img
-rw-r--r--@ 1 yuya  staff   1.7G Nov 13 23:02 2018-11-13-raspbian-stretch-lite.img
$ shasum 2018-11-13-raspbian-stretch-lite.img
716a8c96bb108c396087a2e42dcf9eec2592e4fc  2018-11-13-raspbian-stretch-lite.img
```

今回は上記のイメージをmacOS上から`dd`コマンドを使ってmicroSDカードに書き込みました。書き込んだmicroSDカードを使ってRaspberry Piをブートします。

#### 参考:

* [Mac OS X で Raspberry PiのOSイメージを焼く - @ledsun blog](https://ledsun.hatenablog.com/entry/2014/10/26/174712)

### 3.2. Raspberry Piの設定を変更する

`raspi-config`コマンドを使って基本的な設定を行います。具体的には以下の通りです。なお、実行には`root`権限が必要です。

```sh
sudo raspi-config
```

* ホスト名を変更する。
    * 「2 Network Options」→「N1 Hostname」→「`raspi-3bp`」
* ロケールを設定する。
    * 「4 Localisation Options」→「I1 Change Locale」→「`en_US.UTF-8`」
* タイムゾーンを設定する。
    * 「4 Localisation Options」→「I2 Change Timezone」→「Asia」→「Tokyo」
* キーボードレイアウトを設定する。
    * 「4 Localisation Options」→「I3 Change Keyboard Layout」→「Generic 105-key (Intl) PC」→「Other」→「Japanese」→「Japanese」→「The default for the keyboard layout」→「No compose key」
* Wi-Fiの地域を設定する。
    * 「4 Localisation Options」→「I4 Change Wi-fi Country」→「JP Japan」
* SSHを有効化する。
    * 「5 Interfacing Options」→「P2 SSH」→「Yes」

### 3.3. Raspbianをアップデートする

`apt-get upgrade`コマンドを使ってインストールされているパッケージを更新します。

```text
$ ssh pi@raspi-3bp.local

pi@raspi-3bp$ sudo apt-get update
pi@raspi-3bp$ sudo apt-get upgrade
pi@raspi-3bp$ sudo reboot

pi@raspi-3bp$ uname -a
Linux raspi-3bp 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux

pi@raspi-3bp$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

## 4. ソフトウェアをセットアップする

続いて、Docker CE、各種サービスをセットアップします。

### 4.1. Docker CEをセットアップする

『[Raspberry Pi 3 Model B(Raspbian)にDockerをインストールする - Qiita](https://qiita.com/yuyakato/items/1cdc7fa511f7767c95ac)』に従ってDocker CEをインストールします。

```text
pi@raspi-3bp$ id
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),101(input),108(netdev),996(docker),997(gpio),998(i2c),999(spi)

pi@raspi-3bp$ docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:57:26 2018
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:17:57 2018
  OS/Arch:          linux/arm
  Experimental:     false
```

### 4.2. 印刷サービスをセットアップする

Web API経由でサーマルプリンタを使って印刷する「印刷サービス」をセットアップします。自動起動には`systemd`を使います。

```text
# リポジトリをクローンする。
pi@raspi-3bp$ mkdir -p ~/repo/github.com/nayutaya
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/
pi@raspi-3bp$ git clone https://github.com/nayutaya/thermal-printer.git

# タグをチェックアウトする。
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/
pi@raspi-3bp$ git checkout master
pi@raspi-3bp$ git pull
pi@raspi-3bp$ git checkout service-printing-v1.1.0
pi@raspi-3bp$ git branch -v
* (HEAD detached at service-printing-v1.1.0) 06aa2bc Merge pull request #16 from nayutaya/bump_version
  master 06aa2bc Merge pull request #16 from nayutaya/bump_version

# Dockerイメージをビルドする。
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/service/printing/
pi@raspi-3bp$ ./build_image.sh

# サービスの自動起動を設定する。
pi@raspi-3bp$ sudo cp printing.service /etc/systemd/system/
pi@raspi-3bp$ sudo systemctl enable printing
pi@raspi-3bp$ sudo systemctl status printing

# サービスを手動で起動する。
pi@raspi-3bp$ sudo systemctl start printing

# Dockerコンテナの状況を確認する。
pi@raspi-3bp$ docker ps | grep service_printing
27482f6cd5d6        thermal-printer/service/printing   "uwsgi --module=app …"   About a minute ago   Up About a minute   0.0.0.0:3030->8080/tcp   thermal-printer_service_printing
```

印刷サービスの起動に成功すると、サーマルプリンタからバージョン番号、デバイス名などが印刷されます。

詳しくは『[印刷サービス編](https://qiita.com/yuyakato/items/24666dff3ea1a6a86672)』をご覧ください。

### 4.3. レンダリングサービスをセットアップする

Web API経由でHTMLをPNG画像としてレンダリングする「レンダリングサービス」をセットアップします。

```text
# タグをチェックアウトする。
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/
pi@raspi-3bp$ git checkout master
pi@raspi-3bp$ git pull
pi@raspi-3bp$ git checkout service-rendering-v1.1.0
pi@raspi-3bp$ git branch -v
* (HEAD detached at service-rendering-v1.1.0) 06aa2bc Merge pull request #16 from nayutaya/bump_version
  master 06aa2bc Merge pull request #16 from nayutaya/bump_version

# Dockerイメージをビルドする。
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/service/rendering/
pi@raspi-3bp$ ./build_image.sh

# サービスの自動起動を設定する。
pi@raspi-3bp$ sudo cp rendering.service /etc/systemd/system/
pi@raspi-3bp$ sudo systemctl enable rendering
pi@raspi-3bp$ sudo systemctl status rendering

# サービスを手動で起動する。
pi@raspi-3bp$ sudo systemctl start rendering

# Dockerコンテナの状況を確認する。
pi@raspi-3bp$ docker ps | grep service_rendering
2be6f51649bf        thermal-printer/service/rendering   "/bin/bash --login -…"   14 seconds ago      Up 11 seconds       0.0.0.0:3031->8080/tcp   thermal-printer_service_rendering
```

なお、初回のレンダリングには各種の初期化が行われるため、5〜10秒程度の時間を要します。その後は1秒以下でレンダリングできると思います。

詳しくは『[レンダリングサービス編](https://qiita.com/yuyakato/items/750364647bbb189016bb)』をご覧ください。

### 4.4. HTML印刷ツールをセットアップする

WebブラウザからHTMLをサーマルプリンタで印刷するための「HTML印刷ツール」をセットアップします。

```text
# タグをチェックアウトする。
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/
pi@raspi-3bp$ git checkout master
pi@raspi-3bp$ git pull
pi@raspi-3bp$ git checkout tool-html-print-v1.1.0
pi@raspi-3bp$ git branch -v
* (HEAD detached at tool-html-print-v1.1.0) 06aa2bc Merge pull request #16 from nayutaya/bump_version
  master 06aa2bc Merge pull request #16 from nayutaya/bump_version

# Dockerイメージをビルドする。
pi@raspi-3bp$ cd ~/repo/github.com/nayutaya/thermal-printer/tool/html_print/
pi@raspi-3bp$ ./build_image.sh

# サービスの自動起動を設定する。
pi@raspi-3bp$ sudo cp html-print.service /etc/systemd/system/
pi@raspi-3bp$ sudo systemctl enable html-print
pi@raspi-3bp$ sudo systemctl status html-print

# サービスを手動で起動する。
pi@raspi-3bp$ sudo systemctl start html-print

# Dockerコンテナの状況を確認する。
pi@raspi-3bp$ docker ps | grep tool_html_print
362545fefce9        thermal-printer/tool/html_print     "serve --single --li…"   20 seconds ago      Up 17 seconds       0.0.0.0:3032->8080/tcp   thermal-printer_tool_html_print
```

http://raspi-3bp.local:3032/ に同一ネットワーク内のWebブラウザからアクセスすることで、HTMLをサーマルプリンタで印刷することができます。

詳しくは『[Webアプリ編](https://qiita.com/yuyakato/items/99f09875348539531da4#_reference-3638eb771d0352e14fa0)』をご覧ください。

### 4.5. Chrome拡張をセットアップする

Chrome拡張「GitHub Printer」をセットアップすると、Google Chrome（またはChromium）からGitHubのIssue、Pull Requestを印刷できるようになります。

詳しくは『[Chrome拡張編](https://qiita.com/yuyakato/items/2d6cd811065be0e8ebec#_reference-8739ff420179523b3767)』をご覧ください。

## 5. 終わりに

7つの記事に渡り、サーマルプリンタをより便利に使うためのツールなどを紹介してきました。これらの記事が何らかの参考になれば幸いです。