2017年11月17日金曜日

Raspberry Pi+Raspbian stretchでwkhtmltopdfを使ったホームページ画像化しGoogleフォトにアップロードする

事の発端は毎週のダイエットサマリーブログ

毎週掲載しているダイエットサマリーブログで、体組成データや筋トレチェック表を画像化して掲載しています。
以前ご紹介した画像化の方法でしばらく使っていたのですが、OSアップデートによる変更で動作しなくなったり、SDカードの破損で運用そのものが危ぶまれたり、踏んだり蹴ったりのトラブル続出で使用中止していました。
代替案で、他の端末からスクリーンショットをアップロードして使っていたのですが、その作業がとにかく面倒くさい😭
Raspbian stretchで強化されたセキュリティ関連のクセが、やっとここに来て飲み込めて来たので楽したくて再チャレンジしました😤

wkhtmltopdfに巡り合う

あれこれ探した末に見つけたのがwkhtmltopdfでした。
Google製のアプリで、HTMLレンダリングエンジンWebkitを使って展開し、それをPDFや画像ファイル化するためのものです。
対応OSもWindows・macOS・Linuxに対応しているので、私のようにあれこれ使う人にとってはとても助かります。

Raspbian stretch LITEにインストールするも動かず

インストール方法は、おなじみのaptを使います。

sudo apt-get install wkhtmltopdf
使い方は、下記のコマンドです。
wkhtmltoimage [URL] [画像ファイル]

Raspberry Pi Zero Wで使ってみたのですが、下記のようなエラーが出て動きません。

QXcbConnection: Could not connect to display
中止
フレームバッファが必要なのかも。

仮想フレームバッファ Xvfbで実行

前回画像化でも使った仮想フレームバッファ Xvfbを今回も使います。
まずは、インストール。

sudo apt-get install xvfb
次に、仮想フレームバッファをこのアプリで作成し、そこでwkhtmltopdfを実行します。
xvfb-run -a -s '-screen 0, 1024x768x24' wkhtmltoimage [URL] [画像ファイル]
これで、どんな環境でも使えると思います。

出来た画像ファイルをupload-gphotosGoogleフォトへアップロード

使わせていただいているブログサイト Bloggerの記事作成機能はとても便利で、Googleフォトの画像も直接貼り付けられます。
そこで、HTMLから作った画像を、upload-gphotosGoogleフォトへアップロードします。

upload-gphotosはTypeScriptで書かれていますが、JavaScriptへトランスパイルされたモノがnpmでインストール可能なので、今回はそれを使わせていただきます。

node.js、npm、nを最新に

Raspbianに標準インストールされているパッケージが古く、そのままでは動きません。
そこで、最新版のインストール作業から始めます。

まず、パッケージリストを更新します。

sudo apt-get update
次に、npmをインストール。
sudo apt-get install -y npm
次に、npmの最新版をインストール。
sudo npm install -g npm
npmをnpmでインストールってなんかだか不思議な感じですけどね😅
このブログを書いてる段階のRaspbian最新版September 2017では、下記のようなエラーがでます。
/usr/bin/env: ‘node’: No such file or directory
これは、node.jsのコマンドであるnodeがないために出るエラーです。nodejsという古い名前のままなので、nodeという名前でリンクを作ります。
sudo ln -s /usr/bin/nodejs /usr/bin/node
そして、再びnpmの最新版をインストールするコマンドを実行すると処理が始まります。 npm最新版になったら、次はnode.jsのバージョン管理パッケージnをインストール。
sudo npm install -g n
やっと、本題の最新版node.jsのインストールです。
sudo n stable
もし、最新バージョンがリリースされているにも関わらずError: invalid version~というエラーが出た場合、そのバージョンのターゲットCPUのパッケージがまだアップロードされていない可能性があります。
Raspberry Piは、現段階でARMv6/7/8の3種類のCPUアーキテクチャ商品があります。Raspberry Pi 2 V1.2と3(コンピュータモジュール含む)がARMv8、Raspberry Pi 2 V1.1がARMv7、その他はARMv6です。ARMv8は64bitアーキテクチャなのでARM64としてリリースされてる事が多いですが、Raspbianは互換性維持のために32bitで動かしているので実質ARMv7と思って良いと思います。
ご使用のRaspberry Pi用CPUアーキテクチャパッケージがアップロードされていない場合は、
sudo n [バージョン番号]
直接バージョン番号を指定してインストールしてください。
あるかどうかの確認は、ダウンロード先のnodejs.orgにブラウザでアクセスし、バージョン毎にディレクトリ(フォルダ)が分かれているので、その中にlinux-arm~l.tar.gzってのがあるか確認し、ある中から最新バージョンのモノを指定してください。
念のため、インストールしたnode.jsのバージョンを確認しておいてください。
node -v
もし、古いバージョンのままの時はリンク先が古いものを指してるはずですので、最新版に変更すればOKです。

upload-gphotosをインストール

ここまで来たらもう一息!
upload-gphotosのページの下のInstallationのnpm (Recommended)を参考にインストールします。
スーパーユーザーでインストールするので、sudoを付けて実行してください。

sudo npm install -g upload-gphotos
使い方はこんな感じ
upload-gphotos [画像ファイル名] -u [Googleフォトユーザー名] -p [パスワード] 
ログインエラーが出た場合、安全性の低いログイン技術を使ったアプリの利用許可がされていない可能性があります。 安全性の低いアプリによるアカウントの使用を許可するの説明を参考に、安全性の低いアプリの許可にアクセスして有効にしてください。

シェルスクリプトでサクッと実行

準備は整ったので、これを組み合わせて簡単に実行でいるシェルスクリプトを作ります。
便宜上スクリプト名はhtml2pngとします。

nano html2png
#!/bin/bash
# 一時ファイルを作る
tmpfile=$(mktemp --suffix=.png)

function rm_tmpfile {
  [[ -f "$tmpfile" ]] && rm -f "$tmpfile"
}
trap rm_tmpfile EXIT
trap 'trap - EXIT; rm_tmpfile; exit -1' INT PIPE TERM

xvfb-run -a -s "-screen 0, 1024x768x24" wkhtmltoimage --width $2 $1 "$tmpfile"
upload-gphotos "$tmpfile" -u [ユーザー名] -p [パスワード]
出来たら実行権限を追加します。
chmod +x html2png
使い方はこんな具合。
html2png [URL] [横幅px]

upload-gphotosでちょっと気になった不具合

例によって、Raspberry Pi Zero W+Raspbian Stretch Ver.September 2017ベースで試していたのですが、upload-gphotos実装直前までこぎつけて不具合を見つけました。それは、他のRaspberry PiからSSHコマンドを使ってリモート実行した時に起こりました。

1つ目は、アップロード時のプログレッシブバーが表示されません。
wkhtmltopdfのプログレッシブバーや他の文字は表示されているので、upload-gphotosで使われてるモジュール固有の問題のようです。
原因を調べてみると、TTYチェックしてる部分があってそうじゃない場合はそもそも表示しないようなのです。
なぜ除外してるかさらに調べた所、1行の長さを取得してる部分があってそれがTTYじゃないと取得できず、仮にチェックを無効にしてもその後の処理でエラーになってしまいました。
まぁ、仕様通りの動作ですし、進捗状況が未表示でも問題ないので、このまま使わせていただく事にしました。

問題だったのはもう1つの不具合でした。
アップロード終了後に諸々の情報を表示して終わるのですが、それがSSHコマンドからの直接実行だと終わらないのです。
通信処理を非同期で行っていて、それをメインモジュールで同期モードで動かしてるようなのですが、TypeScriptとJavaScriptのトランスコンパイルの部分で仕様差が吸収出来てないような気がしました。
そのままではいろいろ困るので、cli.ts(cli.js)の末行付近にある

console.info(JSON.stringify(photos, null, 2));
の次の行にプロセスの終了命令を追加しました。
process.exit();
これで、終了しない不具合は解消されました。

最後の最後でまさかの!?

やっとブログも書き終わる!と思った矢先に、まさかの不具合発覚。
曜日が表示されていないのです。なぜ?どうして??
原因は簡単でした。日本語フォントがインストールされてなかったんです😅
ということで、Google Noto Fontsをインストール。
sudo apt-get install -y fonts-noto

無事に曜日が表示されました。

お読み頂きありがとうございました。
次回もお楽しみに!

2017年11月14日火曜日

Pimoroni Button SHIMを動かしてみる

Pimoroni Button SHIMを実際に動かしてみる

ロングピンヘッダーソケットを取り付けたPimoroni Button SHIMの準備が整ったので、Raspberry Pi Zero Wのチェックも兼ねて動かしてみます。

OS Raspbianの準備

Raspbianは、GUI環境のDESKTOP版と、CLIのみの軽量なLITE版があります。
迷った時は、大は小を兼ねるのでDESKTOP版がオススメですが、その分サイズも大きく書き込みに時間がかかり大容量SDカードも必要になるのでLITE版もメリットがあります。
今回は、GUIを使わないのでLITE版を使います。
OSはディスクイメージファイルになって、公式ページのDOWNLOADSからダウンロードします。
DOWNLOAD ZIPとDownload Torrentの2種類のダウンロード方法があって悩ましいのですが、BitTorrentを使われてる方ならDownload Torrentのほうが若干早いです。BitTorrentは、ちょっと小難しい話になるので今回は割愛します。

イメージの展開はEtcherを使うと簡単です。
アプリをインストールした後起動し、ダウンロードしたイメージファイル(ZIPを展開した後のファイル)👉SDカードを指定👉実行
この他にも色々な方法がありますが、簡単で早くて対応OSもWindows・mac・Linuxに対応していて、さらにコマンドライン版もあるのでオススメです。

次に、起動前の/bootパーティションの設定を行います。
Raspberry Pi Zero Wは、OTGスレーブモードと呼ばれるUSB直結でSSH接続できる機能があるのでその設定から。

  1. SDカードの/bootパーティション(WindowsならSDカードを差した時に見られるドライブ)にssh.txtというファイルを作ります。中は空っぽでOKです。0バイトでも1バイトでも構いません。作り方はテキストエディタなりコマンドラインなりで適当に作ってください。
  2. config.txtの最後にdtoverlay=dwc2の1行を追記します。
  3. cmdline.txtの末尾に、改行せずスペースを1つ入れてmodules-load=dwc2,g_etherを追記します。

無線LANの設定もしちゃいます。/bootパーティションにwpa_supplicant.confというファイル名で下記の内容のファイルを作ります。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
  ssid="[SSID名]"
  psk="[パスフレーズ]"
}
起動時にこのファイルが/etc/wpa_supplicant/wpa_supplicant.confに上書きムーブされ、/bootに作ったファイルは消えます。

これで、OSの入ったSDカードの作成は終わりです。
OTGスレーブモードで起動する場合、Windowsはそのままでは認識しません。あらかじめ、AppleのiTunesかBonjourをインストールしておいてください。
macOSはそのままで大丈夫です。Linuxは、、、わかりません😅

Raspberry Pi Zero Wを起動

出来上がったSDカードをRaspberry Pi Zero Wに挿し、PCに接続して起動します。
最新版では、初回起動時にSDカードの容量最大までパーティションの拡張処理をするので少々時間がかかります。以前は、raspi-configでやらないとしてくれなかったのですが。
本体の緑色LEDの点滅が収まって、点きっぱなしになったら起動完了。
SSHクライアントアプリでraspberry.localにアクセスすると接続出来ます。
コマンドライン版なら

ssh pi@raspberry.local
これで繋がります。初期パスワードはraspberryです。
raspberry.localのraspberryはホスト名なので、起動後にraspi-configなどで変更した場合はその名前になります。

I²Cの設定と確認

Pimoroni Button SHIMは、I²C(あいすくえあどしーorあいあいしー)接続のボタン・LEDボードで、TCA9554A I/O エクスパンダが使われています。
Raspberry Piの学習で良くある、GPIOにLEDやスイッチを繋いで操作するモノとは違い、4線接続だけで5つのボタンと1つのフルカラーLEDを操作できる便利なボードです。
Raspbianは、初期状態でI²Cが無効になっているのでその設定をします。

raspi-configを起動します。
sudo raspi-config
すると、画像のような画面が出てきますのでInterfacing Optionsを選んでエンターを押します。

次に、I2Cを選んでエンターを押します。

I2Cを有効にする?と聞かれるので矢印キーでYESを選んでエンターを押します。
するとちょっと間があき、有効になった確認画面が出るのでエンター。
最初の画面に戻るのでESCキーを押し、再起動するか?と聞かれるのでそこで再起動してください。

再起動してSSHで再接続したら、今度はi2c-toolsをインストールします。
sudo apt-get install i2c-tools -y
完了したら、そのままi2cdetectを実行。
i2cdetect -y 1
画像のように3fという表示が出てれば、Raspberry Pi Zero WにButton SHIMが認識されています。
もし、表示されていない場合は何らかの不具合です。

Pimoroni Button SHIMの商品ページ下に、Softwareという説明があります。
そこのButton SHIM Python libraryのリンクを押すと、Githubに移動します。
その下の説明にあるFull installの指示に従って、サクッとインストールします。

curl https://get.pimoroni.com/buttonshim | bash
完了するまで少し時間がかかります。終わるとPimoroniというディレクトリが作られます。
試しにサンプルプログラムを動かしてみましょう。
python Pimoroni/button-shim/examples/rainbow.py
実行すると画面にButton SHIM: rainbow.py~とメッセージが表示されます。
そこでButton SHIMのボタンA~Eをそれぞれ押すと、ボタンごとにLEDが点灯して色が変わります。
終わらせるときは、CTRL+Cを押すとプロンプトに戻ります。

サンプルプログラムは、rainbow.pyを含めて全部で3つあります。
volume.pyは、音量を変えたりミュートしたりする事ができます。なお、EボタンのHold to power offは、ボタン長押しするとLEDが点滅するだけで何も起きません。
keyboard.pyは、SSH接続では何も起こらないのですが、モニタを接続しているとキーボード入力と同じようにボタンごとにA~Eが入力されます。ただし、使うためには準備が必要で、

sudo pip install evdev
このコマンドを実行してevdev Pythonパッケージをインストールしなくてはならないのと、
実行にroot権限が必要なのでsudoを付けなくてはなりません。
sudo python Pimoroni/button-shim/examples/keyboard.py

なんとなくボタンが追加されるだけだろうと、軽い気持ちで注文購入したPimoroni Button SHIMでしたが、使ってみると結構面白く、またとても難しいです。
提供されるライブラリは、標準でボタンを押したとき、放したとき、長押しした時の3つのイベントが使えます。
サンプルコードでは5つあるボタンを個別に押して使っていますが、工夫すると複数ボタン同時押しに機能を持たせる事も可能です。
また、Raspberry Pi Zero/Wにはイヤホンマイク端子がありませんが、HDMI接続すれば映像と一緒に音声も出力できます。そこで、Pygameモジュール集を使い、ボタンを押した時に効果音を付けるだけでもピコピコ鳴って楽しいです。

1つ忘れていましたが、作業が終わって電源を切る時はシャットダウンしてください。

sudo shutdown -h now
そのまま電源切っても平気な場合がありますが、アプリによってはちゃんと終了処理してあげないと、次回起動時に立ち上がらなくなる事があります。
何らかの事情でシャットダウン出来ずにそのまま電源を切ってしまったときに、起動しようとしたらエラーが出て起動できなくなる事があります。そうした緊急事態に備えて、何か冒険したい時は安定して使える状態のSDカードをイメージバックアップして、いつでも元に戻せるようにしておく事をオススメします。

お読みいただきありがとうございました。
次回もお楽しみに!

2017年11月13日月曜日

Raspberry Pi Zero Wを買ったのでGPIOピンヘッダ取付け

スイッチサイエンスRaspberry Pi Zero W抽選販売に当選

ダイエットサマリーでお知らせしたとおり、スイッチサイエンスのRaspberry Pi Zero W抽選販売に当選したので買っちゃいました。
Raspberry Pi Zero同様、これもGPIOにピンヘッダが付いていないので、それを取り付けるところから始まります。

いつも通りハンダ付け

今は、金槌で叩き入れるだけで取付けられるGPIO Hammer Headerという便利なヘッダーピンがあります。
スイッチサイエンスでも販売されているので、これで楽させてもらおうかとも思いましたが、やはりハンダ付けは電子工作の醍醐味。
ということで、普通の2×20 ピンヘッダを一緒に購入し、今回もいつも通りハンダ付けする事にしました。
中学生の頃から使い続けてる愛用のgoot CA-40 キャップ付きはんだこてを引っ張り出してきて作業開始です。

ピンヘッダーを現物合わせし、OKならはんだ付けを始めます。
ひっくり返して作業するので、Raspberry Pi本体がうまく水平になるように高さ調整します。

とりあえず、ピン1本を仮付けし、ピンの樹脂パーツがしっかり基盤に接地してるのを確認します。
ここで斜めになってるようなら、熱くならない部分のピンを指で押し付けながら、仮付けしたハンダをこてで溶かせばスッと入るので、すぐにはんだこてを離せば固まってしっかり止まります。

あとは、サクサクと1ピンずつハンダを流し込んでいきます。
それにしても、今の基盤ってとてもハンダ付けしやすいですよね。良く乗ります。
乗りが悪いときは、フラックスを塗るとよくなります。
ハンダがなかなか溶けない時は、はんだこてのコテ先が汚れてる可能性が高いです。
その時は、クリーニングスポンジに当てて汚れを取るか、それでもダメならヤスリで擦ると良くなります。汚れが熱を伝えにくくしているために起こります。

今回も上出来。40ピンのはんだ付けが出来ました。
使ったハンダは、もうかれこれ30年以上前のものですが大丈夫でした。

はんだ付けは電子工作の醍醐味よねぇ♪
Raspberry Pi Zero Wの完成です。

悪戦苦闘のButton SHIMロングピンヘッダハンダ付け

BME680ボードと一緒に買ったPimoroni Button SHIMでしたが、スタック用のロングピンヘッダソケットを付けたくて、部品が手に入るまで取付けを保留してました。
標準サイズのモノが秋葉原でも売られて無く、海外サイトで見つけたので注文して届くのを待っていたのですが、スイッチサイエンスでも取扱があってしかも安い!
2つあっても何かに使うだろうということで、先に届きそうだったスイッチサイエンスにも発注し、それを取り付ける事にしました。

はんだ付け前にロングピンヘッダをRaspberry Pi Zero Wに差し込み、そこにButton SHIMを付けてみました。
そこでとんでもない事に気がついたのですが、縦に付けられてるボタンスイッチと飛び出しているピンの間が狭く、愛用のはんだこてのこて先が入れにくかったのです。

四苦八苦した上、なんとかはんだ付け出来ました。
Raspberry Pi Zero Wの3倍の作業時間。こて先を基盤に当てすぎると熱で壊してしまうので、作業中それだけがとても心配でした。

使いやすいAdafruit Raspberry Pi Zero用ケース

スイッチサイエンスからRaspberry Pi Zero Wと一緒にAdafruit Raspberry Pi Zero用ケースも購入しました。
ツメ止め式のケースでネジ止めはありません。Raspberry Pi Zero/W共用ですが、本体を入れるのに少々コツがいります。
GPIO部は上面だけ利用可能で、底面の穴はありません。また、GPIO37/39ピン隣にあるTV/RUN端子用の穴も蓋にはありません。
カメラケーブルとマイクロSDカードスロットは穴が開いています。
Pimoroniのケースには、マイクロSDカードスロットの穴が無かったので脱着の多い時に不便を感じてました。
今は、Raspberry Pi ZeroにBME280を取付けて2階の環境測定用に固定接地してるので、逆にホコリなどが入りにくい分良いのですが。

悪戦苦闘してロングピンヘッダソケットを取付けたButton SHIMをスタッキングしてみました。
この後、Raspberry Pi Zero Wで動作確認やソフトウェアの開発をするので、しばらくこの状態で使うことになります。
出来たらRaspberry Pi 2に付け替えて使うつもりなのですが。

作業を終えて一段落。
ふと、スイッチサイエンスから届いた箱の蓋の裏側を見ると
秋の夜長の電子工作 時間はたっぷりありますよ🍁
年度初めの慌ただしい春とは違い、いろいろな事に取り組みやすい秋。まさに電子工作の秋といった感じでしょうか。

お読みいただきありがとうございました。
次回は、Pimoroni Button SHIMを使う話を書きたいと思います。
お楽しみに!

2017年11月12日日曜日

11月第1週(11/5~11/11) 体重は麓に
初めてのサントリーホール
新しい血圧計到着

冬が立ちました

2017年11月7日(火)は立冬でした。
朝の布団の中や日中の日差しの暖かさが心地よくなる季節。そして、風の冷たさが身に応える季節。
そろそろ、ホットドリンク用の水筒にチェンジしたいですね。コレ、温かいのを入れると漏れるので😅

体重は一気に麓に下山し小休止⛰️

67kgから一気に落として62kg台へ。
そこから63kg前後を行ったり来たりするようになりました。
何か決心とかあったわけでもなく、何となく食欲の無い朝の食事をキャンセルするようになり、午後の1食のみにしてから一気に落ちました。
日頃のトレーニングはそのままで、献血のプレッシャーから開放された結果です。
良く朝食は食べないと体に悪いといいますが、あれはあくまでその後の行動が空腹で出来ない人に向けての話。
起きて即トレーニングに入れるような、私みたいな人には無縁だったりします。
夜は食べては行けない神話も、私の経験上あまり意味が無くて、むしろ寝てる間に体が再生されるわけですから、その食事こそすごく重要です。
私にとって、睡眠中も体つくりの大切な時間です。

普段通り筋トレ実施

今週は、特にイレギュラーとか無く、普段通り筋トレを行うことができました。
同じメニューをただひたすら毎日やるだけの日常。そりゃ飽きます。慣れてくれば苦痛も無くなりますから、余計にそうなるでしょう。
飽きないようにするため、トレーニング最中は何か映像を見ながらとか音楽を聞きながらとか、あるいは考え事をしながらやる事が多いです。
おかげで「今何回だっけ?」とカウントを忘れてしまい、やり過ぎて翌日の痛みでそれに気がつく事がよくあるのですが😅

初めてのサントリーホールは凄かった

KDDI スペシャル アンドリス・ネルソンス指揮ボストン交響楽団を聴きに、初めてサントリーホールへ行ってきました。
テレビでは何度も見たことがある場所でしたが、実際に来館するのは初めて。
巨大なパイプオルガンが有名で、1度その演奏を聴いてみたいと思っていたのですが、今回はハイドン 太鼓連打とマーラー 巨人です。

現地に18時に到着し、表参道のGoogle Home mini PRイベントで頂いたドーナツと持参したさんぴん茶で腹ごしらえ。
開場時間の18時20分になると、入り口上の壁が開いて音楽が流れ始めました。

席は2階LC3列7番目。私の好きな左側の席で、ステージにも付かく、上から全体を見渡せる場所です。
映画館でも似たような席をよく選びます。
大ホールで行われたのですが、中は録音・撮影禁止でした。そのため、その時の模様を画像でお伝え出来ないのが残念でしたが、とても素晴らしい演奏でした。
個々の自由さ・表現力・演奏技術。そして、それが1つになったときに生まれる大きなハーモニー。
19時ころから始まり21時すぎに終了。素敵なヒトトキでした。

この日は、コンサートの前に東武東京メトロパスを使って、都内をあちこち回って買い物してました。
とてもお得な切符なので、ある程度の移動予定がある時には利用しています。

新しい血圧計到着

新しい血圧計が届きました。
海外製のものなので、日本の医療機器認定は受けていませんし、ご覧の通り表記はすべて英語です。
説明書もケースもなく、袋に入れられこのまま届きました。
サイズが少し大きめなのと、外国人向けに最高血圧の上限値が高いためか、最初の締め付け圧が少々高いように思います。
それ以外は、普通に使えていますし、数字も問題なさそうなのでしばらく使ってみたいと思います。

ダイエットサマリーは終わり。
前回ブログの最後に記したマイクロSDXCの故障修理でしたが、代替品が届きました。Check Flashでチェックしても異常なし。数週間かかるとの事でしたが、5日で届いたのでとても早い対応に感謝です。
代替えのSDカードで色々やっていたRaspberry Pi Zero Wが、これで本格的に使う事ができます。Raspbian Stretchカーネルもだいぶ安定してきたので、Raspberry Pi 2もそろそろバージョンアップかな?と思っています。

今週もお読み頂きありがとうございました。
次回もお楽しみに!