CircleCI で Hexo の 自動ビルド と デプロイ設定

CircleCI の アカウント作成 が できたので、ブログ生成に使っている Hexo の 自動ビルドとデプロイができるようします.

作業環境

  • CircleCI
  • Node.js 6.9.1 LTS
  • Hexo 3.2

CircleCI の 設定を追加

ソース・ルート直下に circle.yml を 配置することで CircleCI の 設定を行います.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
general:
branches:
only:
- source
machine:
timezone: Asia/Tokyo
node:
version: 6.9.1
test:
override:
- echo "skip test"
deployment:
deploy:
branch: source
commands:
- git config --global user.name "CircleCI"
- git config --global user.email [your e-mail]
- hexo clean
- hexo generate
- hexo deploy

general - branches - onlysource ブランチだけビルドするようにしています.
指定方法の詳細は、こちらの Specifying branches to build に なります. ビルドするブランチを指定する以外に、特定のブランチを無視したり、正規表現で指定できます.

test - override - echo "skip test" は、CircleCI が テストしないとビルドに失敗するようになっているので、テストがないことをコンソール出力するために設定しています.

git config --global で Git の ユーザ設定を追加します. user.name は CircleCI の ビルドであることが分かるようにしました. user.email は GitHub に 登録している自分のメールアドレスを指定しました.

circle.yml ファイルができたら、GitHub へ コミットしておきます.

CircleCI に リポジトリを追加

CircleCI の プロジェクト追加 ページ へ 行きます.
自分の GitHub アカウントが表示されているのでクリックし、右側のプロジェクト一覧から GitHub Pages の [username].github.io プロジェクト 右 の [Build project] ボタンをクリックします.

自動的にビルドが始まり、ビルド画面へ遷移します. しばらく待っているとビルドが失敗し、レッド の [FAILED] 表示がされます.
これは Hexo の デプロイ で GitHub へのアクセス権がなかったために起こるものなので、SSH キー を 追加します. このあたりの設定は GitHub security and SSH keys - CircleCI に 説明があります.
画面の上部中央にある [Project Settings] を クリックします.

プロジェクト設定画面が表示されるので、左側のメニューを下へスクロールし [Checkout SSH Keys] を クリックします. 右側に設定内容が出てくるので、[Authorize with GitHub] ボタンをクリックします.

GitHub の 画面が表示され、CircleCI へ Public SSH keys の 権限を許可するかを確認されます. 許可しないと始まらないのですが、問題ある場合は ここで止めて CircleCI の 自動デプロイをあきらめます.

上記画面で [Authorize application] ボタンをクリックすると CircleCI の 画面に戻ります.
右側の設定から [Create and add [username] user key] ボタンをクリックし、SSH キー を GitHub へ 追加します.

ボタンをクリックすると設定画面に [[username] user key] が 追加されているのを確認し、画面上部 の [View [username].github.io] リンクをクリックします.

前回のビルドが失敗している履歴が表示されるので、[rebuild] を クリックします.

自動的にビルドが始まり、ビルド画面へ遷移します. しばらく待っていると今度はビルドが成功し、グリーン の [FIXED] が 表示されます.


これで、無事に自動ビルドとデプロイができるようになりました. 以降は source ブランチ へ プッシュするたびに自動でビルドが行われ、デプロイもされるようになります.
ローカルでの確認は必要ですが hexo deploy 無しで、自動的に記事が公開できるので便利ですね.

CircleCI の アカウント作成

継続的インテグレーション(CI: Continuous Integration) の プラットフォームである CircleCI を 使って、GitHub に ある 様々リポジトリをビルドできるようにしたいと思います.
うまく流れるようになると GitHub の 特定のブランチにマージされると、ソースコードのビルと、テスト、パッケージング、デプロイ までの一連の作業が自動的に行われるようになります!
まずはビルドを行う前に、アカウントの作成をします.

作業環境

  • CircleCI

CircleCI とは?

こちらのスライド、はじめての CircleCI が しっかり まとめてくださっており、改めて書くことがないどころか、勉強になりました. 素晴らしいスライドありがとうございます!
ということで、やりたいことに特化してアカウント作成部分だけの記事にしたいと思います.

アカウントの作成

CircleCI の Signup ページ https://circleci.com/signup へ アクセスします.
GitHub と Bitbucket の どちらで認証するか聞かれます. 今回は GitHub を 選択しました.

GitHub の サイトへリダイレクトされますので、GitHub へ サインインします.

CircleCI へ 渡す権限の確認画面が表示されます.
ここで許可しないと次へ進めないのもありますが、CircleCI で Private Repository の ビルドなども行うので妥当な権限と思いますので [Authorize application] を クリックして許可します.
問題がある場合は [Authorize application] を クリックせず、CircleCI の 利用は断念します.

CircleCI へ 戻されます. 無事ログインできました.


GitHub と 連携するだけなので、アカウント作成は簡単にできますね.
この後、まずは Circle CI で Hexo を 動かせるようにして、投稿の編集を GitHub の draft-xxx ブランチで行い、source ブランチ へ マージされたら CircleCI が 回って、自動的にデプロイされるようにしたいと思います.

Raspbian Jessie Lite の SSH/公開鍵認証 設定

Raspbian Jessie Lite に SSH 公開鍵認証 の 設定を行います.

作業環境

  • Windows 7
  • Raspbian Jessie Lite

使用するアルゴリズムの選択

なるべく強度が高く安全なものを使いたいので、今回は Ed25519、エドワーズ曲線デジタル署名アルゴリズム を 使うことにします.

アルゴリズムや強度については、こちらの記事を参考にさせて頂きました. RSA で 鍵長を増やすことばかり考えていましたが、勉強になりました. ありがとうございます.

キー・ペア の 生成

ssh-keygen を 使い、キー・ペアを生成します. ed25519 は 鍵長 が 256 bit 固定とのことなので、-t ed25519 のみの指定となります.
ファイルの場所は特に問題ないのでデフォルトのままにしました. パスフレーズは設定したほうが安全です. 秘密鍵のファイルをとられてしまうと、守るものがなくなり素通しとなってしまいます.
ssh-keygen は Microsoft が 開発している Win32-OpenSSH を 使いました. (2017年3月13日 追記)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
c:\> ssh-keygen -t ed25519 -C ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\[username]/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\[username]/.ssh/id_ed25519.
Your public key has been saved in C:\Users\[username]/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:T69X1O58qiKv7Sp/aPJTI+PpzUdOZDO+EcD5ldc8ON8
The key's randomart image is:
+--[ED25519 256]--+
| . . .o.|
| + oo.+|
| o .ooo|
| B ..E|
| S .+ = . |
| ooo.= . .|
| . *.=.+ o |
| o B+o.= +|
| B*OB+...XX|
+----[SHA256]-----+

公開鍵 を Raspberry Pi へ 送る

生成したキーペアで認証ができるように公開鍵を Raspberry Pi へ 送ります.
ssh-copy-id コマンド が あると、簡単に転送できるのですが Windows 7 および Microsoft の Win32-OpenSSH では ssh-copy-id が ないので、scp で 転送してから、SSH 接続して鍵登録をします.

1
2
3
c:\> scp %USERPROFILE%\.ssh\id_ed25519.pub pi@raspberrypi.local:~
pi@raspberrypi.local's password: [PASSWORD]
id_ed25519.pub 100% 83 0.1KB/s 00:00

SSH で Raspberry Pi で接続し、公開鍵の設定をします.

1
2
3
4
5
pi@raspberrypi:~ $ mkdir ~/.ssh
pi@raspberrypi:~ $ chmod 700 ~/.ssh
pi@raspberrypi:~ $ cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys
pi@raspberrypi:~ $ chmod 600 ~/.ssh/authorized_keys
pi@raspberrypi:~ $ rm -f ~/id_ed25519.pub

Raspberry Pi の SSH サーバ 設定

公開鍵で認証できるようになったので、パスワード認証を止めます.
合わせて root ユーザ の ログインも禁止します. (パスワードも公開鍵もないのでログインのしようもないのですが明示的に止めておきます)
以下に設定部分を抜粋します.

1
2
3
4
5
6
7
pi@raspberrypi:~ $ sudo nano /etc/ssh/sshd_config
# Authentication:
PermitRootLogin no
RSAAuthentication no
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

設定後 SSH サーバ を 再起動します. 再起動する前に公開鍵認証でログインできていることを再度確認しておきます. パスワード認証が行えなくなるため、公開鍵認証で入れないと SSH で ログインできなくなります.

1
pi@raspberrypi:~ $ sudo systemctl reload ssh

pi ユーザ の パスワード削除

ついでに pi ユーザ の パスワードを削除します. これにより、Raspberry Pi へのアクセスは SSH からの 公開鍵認証 に しぼることができます. (ネットワーク障害などで完全に入れなくなることもありますが、その際には諦めるということで…)
とはいえ シングル・ユーザ・モード や 本体ごと or SD カード を 持っていかれれば簡単に入られてしまいますが、デフォルトで誰でも知っているパスワードを持っている必要もないので消しておきます.

1
2
3
4
5
6
7
pi@raspberrypi:~ $ sudo cat /etc/shadow | grep pi
pi:$7$anh205TS$KBB826BAAEqF/kSsT71NkzkaBAjh8bbKrnn6b4oikeABwQTPHHoGRnaXXX.KX9MEn1eDm9XMSurRWiqg1pVXXX/:17067:0:99999:7:::
pi@raspberrypi:~ $ sudo passwd -d pi
pi@raspberrypi:~ $ sudo cat /etc/shadow | grep pi
pi::17067:0:99999:7:::


これで、だいリモートアクセスを保護できるようになりました. ラズパイ自体が小さく(特に Zero)、また IoT デバイス のように使ったりするつもりなので シングルモード や SD カードが心配なので、追々調べていきます.

Raspbian Jessie Lite の Wi-Fi 設定

Raspbian Jessie Lite に Wi-Fi の 設定を行います. Raspberry Pi へは SSH で 接続しているものとします. 今回は Raspberry Pi Zero ではなく、Wi-Fi が ついている Raspberry Pi 3 で 設定していきます.

作業環境

  • Windows 7
  • Raspbian Jessie Lite
  • Raspberry Pi 3 Model B

Wi-Fi の 国コード を 設定

設定画面の説明に Set the legal channels used in your country と あるように、国ごとに利用できるチャンネルが異なるために設定を行います. 各国の利用できるチャンネルは List of WLAN channels に まとまっています.
sudo raspi-config コマンドから、以下の順で設定します.

  1. 5 Internationalisation Options を 選択
  2. I4 Change Wi-fi Country を 選択
  3. JP Japan を 選択

最後に Finish を 選択し、再起動します.

Wi-Fi へ 接続

まずは現在の設定とアクセスポイントの一覧を見てみます.
設定ファイルは /etc/wpa_supplicant/wpa_supplicant.conf で、先に設定した Wi-Fi の 国コード JP が 反映されているのが分かります.
また iwlist scan で アクセスポイントの一覧を見ることができます. iwconfig wlan0IEEE 802.11bgn と 出ているように IEEE 802.11n/g/b で 接続できるアクセスポイントとなります. (ちゃんとリスト確認しないで、IEEE 802.11n/a の SSID を 入力して接続できずにはまりました…)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pi@raspberrypi:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
pi@raspberrypi:~ $ iwconfig wlan0
wlan0 IEEE 802.11bgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
pi@raspberrypi:~ $ sudo iwlist wlan0 scan | grep ESSID
ESSID:"ABC-1234-56789X"
ESSID:"DEF-9876-54321X"
ESSID:...

接続するアクセスポイントが無事にリストに表示されていたら、wpa_passphrase コマンドで設定ファイルに接続情報を追記します.

1
pi@raspberrypi:~ $ sudo sh -c 'wpa_passphrase [SSID] [PASSPHRASE] >> /etc/wpa_supplicant/wpa_supplicant.conf'

その後、設定ファイルに書かれている平文のパスワードを消します. テキストエディタで編集します. Raspbian の デフォルト・エディタ nano で 開きます.
普段は vim なので使い慣れないですが、デフォルトとのことなので使ってみます. vim と 異なりファイルを開いた直後から編集ができます. 行削除はなさそうなので、#psk="xxx" の 行を地道に削除していきます. (範囲を指定しない切り取り ^K で 一行切り取りもありでした. 使い慣れてないので手間がかかってしまった.)
保存 は ^O で、終了 は ^X です. 画面下に表示されています. Windows では、それぞれ Ctrl + OCtrl + X に なります.

1
2
3
4
5
6
7
8
9
pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="ABC-1234-56789X"
#psk="----PLAIN-PASSPHRASE----" <- この行を削除します
psk=055f68fd257ed0b7d41c6adb757a0a44fe1400737cac7f0fbefd6196ac66bf9a
}

ネットワーク・インターフェースを再起動し、アクセスポイントへ接続できているか確認します.

1
2
3
4
5
6
7
8
9
10
11
pi@raspberrypi:~ $ sudo ifdown wlan0
pi@raspberrypi:~ $ sudo ifup wlan0
pi@raspberrypi:~ $ iwconfig wlan0
wlan0 IEEE 802.11bgn ESSID:"ABC-1234-56789X"
Mode:Managed Frequency:2.462 GHz Access Point: 21:5E:4E:97:XX:XX
Bit Rate=65 Mb/s Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
Link Quality=69/70 Signal level=-41 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

パワーマネジメント の 設定

Wi-Fi の パワーマネージメントによってネットワークアクセスが不安定になったり、遅延が生じるケースがあります. その際にはパワーマネージメントを切ることで改善されることがあります.
パワーマネージメントを切るということは、電力消費が上がったり、Wi-Fi モジュールの熱を逃がす時間が得られないなどのトレードオフが発生しますが、必要に応じて設定をします.

設定は /etc/network/interfaceswireless-power off を 追記します.
以下に wireless-power off を 記述した部分を抜粋します.

1
2
3
4
5
pi@raspberrypi:~ $ sudo nano /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet manual
wireless-power off
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

再起動し iwconfig wlan0 コマンドで Power Management:off に なっていることを確認します.

1
2
3
4
5
6
7
8
9
10
pi@raspberrypi:~ $ sudo reboot
pi@raspberrypi:~ $ iwconfig wlan0
wlan0 IEEE 802.11bgn ESSID:"ABC-1234-56789X"
Mode:Managed Frequency:2.462 GHz Access Point: 21:5E:4E:97:XX:XX
Bit Rate=65 Mb/s Tx-Power=31 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:off
Link Quality=69/70 Signal level=-41 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

設定については、こちらの Disable power management for Ralink RT5370 を 参考にさせて頂きました.

固定 IP アドレス を 設定する

avahi-daemon が 動作しているため Bonjour の クライアントが入っていれば、LAN 内では ホスト名.local で Raspberry Pi へ アクセスすることができます.
そのため 固定 IP を 設定しなくても困らないケースが多いとは思いますが、備忘録として 固定 IP の 設定方法を残しておきます. (ミニマム構成にするために avahi-daemon を 止めるというケースは想定されますね.)

環境

  • IP アドレス: 192.168.0.100
  • ネットマスク: 255.255.255.0
  • デフォルト GW: 192.168.0.1

設定は /etc/dhcpcd.conf の 一番最後に以下の内容を記述します.

1
2
3
4
5
pi@raspberrypi:~ $ sudo nano /etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.100/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

interface wlan0 は 無線 LAN の ネットワーク・インターフェース、有線 LAN で IP アドレス を 固定する場合は wlan0eth0 にします.

DHCP の クライアント を 再起動し、設定した IP アドレス で アクセスできるか確認します.

1
pi@raspberrypi:~ $ sudo service dhcpcd reload


無事 Wi-Fi へ 接続できるようになりました. 小型なのがラズパイの魅力だから Wi-Fi で ネットに接続できることで更に取り回しが楽になりますね.

Raspbian Jessie Lite の 初期設定

Raspbian Jessie Lite に 最小限の初期設定を行います.

作業環境

  • Windows 7
  • Raspbian Jessie Lite

Raspberry Pi へ SSH 接続

Raspbian Jessie は avahi-daemon という Avahi の ソフトウェアが自動的に起動しています.
Avahi は Apple の Bonjour という ネットワークを自動設定するための仕様を実装したソフトウェアです. これにより PC に Bonjour の クライアントが入っていれば、LAN 内では ホスト名.local で Raspberry Pi へ アクセスすることができます.

Windows 7 は Bonjour を 利用することができないため、iTunesBonjour Print Services を インストールする必要があります.

SSH クライアントは Microsoft が 開発している Win32-OpenSSH を 使いました.

では、SSH で Raspberry Pi へ 接続します.
コマンド プロンプト から ssh pi@raspberrypi.local を 実行します.
初めてアクセスするためホスト鍵の確認がありますので、yes を 入力します.
最後にパスワードを聞かれるので、初期パスワード の raspberry を 入力します.

1
2
3
4
5
6
c:\> ssh pi@raspberrypi.local
The authenticity of host 'raspberrypi.local (fd91::3f13:2b1:fa24:XXXX)' can't be established.
ECDSA key fingerprint is SHA256:HDYEUoWS6x4RsD63mQgqbEdFsvnKyPBhT4forJCXXXX.
Are you sure you want to continue connecting (yes/no)? [yes]
Warning: Permanently added 'raspberrypi.local,fd91::3f13:2b1:fa24:XXXX' (ECDSA) to the list of known hosts.
pi@raspberrypi.local's password: [raspberry]

無事に接続ができ、Raspberry Pi へ SSH 接続できました. bash が 起動していることが確認できます.

1
2
3
4
5
6
7
8
9
10
11
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~ $ echo $SHELL
/bin/bash
pi@raspberrypi:~ $

ファイルシステム の 拡張

Raspbian インストール直後は、2GB 程度のディスク容量しかなく raspi-config で ファイルシステムを拡張する必要があるらしいのですが、dffdisk で 確認したところ、なぜか SD カード の 16GB が ちゃんと認識されているようでした…

1
2
3
4
5
6
7
8
9
pi@raspberrypi:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 15G 840M 14G 6% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 12M 451M 3% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
/dev/mmcblk0p1 63M 21M 43M 33% /boot

2017年3月22日 追記
リリース・ノート 2016-05-10 に 下記の記述がありました.
ファイルシステムは自動的に拡張されているので下記手順は不要でした.
“File system automatically expanded on first boot – Release notes

よくわかりませんが、念のためファイルシステムの拡張を実行しておきます.
sudo raspi-config コマンドから実行します.
1. 1 Expand Filesystem を 選択
2. OK する
3. Finish して再起動
再起動後 の df -h に 変化がないので 16GB が ちゃんと使えているようです.

ホスト名 の 設定

デフォルトのホスト名は raspberrypi に なっています. 複数 の Raspberry Pi が ある場合に、Bonjour の ホスト名.local で アクセスする際には、適切なホスト名を設定しておく必要があります.
sudo raspi-config コマンドから設定します.

  1. 7 Advanced Options を 選択
  2. A2 Hostname を 選択
  3. 設定したいホスト名を入力し、了解 を 選択

ロケール と タイムゾーン の 設定

sudo raspi-config コマンドから設定します.

以下の順でロケールを設定します.

  1. 5 Internationalisation Options を 選択
  2. I1 Change Locale を 選択
  3. [*] en_GB.UTF-8 UTF-8 で スペースを押して * を 外す
  4. [ ] ja_JP.UTF-8 UTF-8 で スペースを押して * を 付ける
  5. OK する
  6. Default locale for the system environment: と 聞かれるので、ja_JP.UTF-8 を 選択

最初のメニューに戻るので、以下の順でタイムゾーンを設定します.

  1. 5 Internationalisation Options を 選択
  2. I2 Change Timezone を 選択
  3. AsiaTokyo と 選択

最後に Finish を 選択し、再起動します.
SSH で 使っている分にはキーボード設定やフォントの追加は不要ですが、直接利用する場合は設定が必要ですが、PC ではないので SSH 接続だけで十分なので、そのままにしました.

パッケージ の アップデート

apt-get を 使って、パッケージをアップデートします.

1
2
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get dist-upgrade -y

続いて rpi-update コマンドで、ファームウェアの更新をします. ファームウェアの更新というと ROM を 更新するようなイメージがありますが、Raspberry Pi の 場合は SD カード にある OS の Kernel を 更新します. SD カード を 初期化すると元に戻ります. ファームウェア更新後は再起動します.

1
2
3
4
5
6
7
8
9
10
11
12
13
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST 2016 armv7l GNU/Linux
pi@raspberrypi:~ $ apt-cache search rpi-update
rpi-update - Raspberry Pi firmware updating tool
pi@raspberrypi:~ $ sudo apt-get install rpi-update -y --no-install-recommends
pi@raspberrypi:~ $ sudo rpi-update
pi@raspberrypi:~ $ sudo reboot
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.4.33-v7+ #927 SMP Sat Nov 19 18:15:38 GMT 2016 armv7l GNU/Linux

最後にクリーンアップします.

1
2
3
4
5
pi@raspberrypi:~ $ sudo apt-get autoremove
pi@raspberrypi:~ $ sudo apt-get autoclean
pi@raspberrypi:~ $ sudo apt-get clean
pi@raspberrypi:~ $ sudo rm -rf /var/lib/apt/lists/*
pi@raspberrypi:~ $ sudo rm -rf /var/cache/apt/archives/*


以上で、最小限の初期設定ができました. これから、いろいろと細かい設定をしていきますが、まずはこれで使い始められますね. ラズパイでの開発、楽しみ.

Raspbian Jessie Lite の インストール

Raspberry Pi に 公式の OS である Raspbian の 最小構成 Lite を インストールしたいと思います.
NOOBS(New Out Of the Box Software) という OS の インストーラーが用意されており、これを使うことで簡単に Raspberry Pi へ OS を インストールすることができますが、ディスク容量を圧迫する、USB の キーボード と マウス が 必須であることから、OS イメージ を 直接 SD カードへ書き込む方法を取ることにします.

作業環境

  • Windows 7
  • Raspbian Jessie Lite

SD カード の 準備

使用する Raspberry Pi の モデル に 合わせた SD カード を 用意します.
今回 は Raspberry Pi Zero を 使いますので、microSD カード と PC で 使うための SD Adapter を 用意しました.

続いて、SD カード を フォーマットします.
OS の ツールではうまくいかないケースがあるので、SD カード フォーマッター を ダウンロードして使いました.
ダウンロードは、こちらから → https://www.sdcard.org/jp/downloads

SD カード フォーマッター を 起動し、[オプション設定] を クリックします.

論理サイズ調整 を [ON] に 設定し、[OK] を クリックします.
通常は OFF で 問題ないとのことですが、OS 付属のツールでフォーマットしたりすると論理サイズが異なったりと問題が出るケースがあるらしいです. その場合は ON に することで解決できるとのことですが、後でトラブルがあった際に問題の切り分けをするのもめんどくさいので ON に しました.
論理サイズ調整については、SD カード フォーマッター の マニュアルの記載Raspberry Pi フォーラム の ポスト などに情報があります.

元のウィンドウに戻るので、[Drive] と [Volume Label] が 正しいかを確認し、フォーマットを実行してよければ [フォーマット] を クリックします.
クイックフォーマットと、フォーマット中に関する注意事項のダイアログが表示されます. 内容を確認し問題なければ、それぞれ [OK] を クリックして作業を進めます.

フォーマットが終わったらダイアログが出るので、SD カード を 取り出し、[OK] を クリックし、また元のウィンドウ の SD カード フォーマッター も [終了] を クリックして閉じます.

OS イメージ の 書き込み

Raspbian の サイト https://www.raspberrypi.org/downloads/raspbian から Raspbian Jessie Lite を ダウンロードします.
ここでは、[C:\Develop\images] に ダウンロードしたものとします.

ダウンロードしたファイルが正しいかハッシュ値を確認します.
Windows PowerShell 4.0 以降は、Get-FileHash が あるので、それを使います.
Raspbian の ウェブサイトに記載されているハッシュ値と同じなので正しくダウンロードできたようです.

1
2
3
4
5
c:\> powershell Get-FileHash -Algorithm SHA1 "C:\Develop\images\2016-09-23-raspbian-jessie-lite.images"
Algorithm Hash
--------- ----
SHA1 3A34E7B05E1E6E9042294B29065144748625BEA8

続いて、OS イメージ を SD カード に 書き込みます.
今回は 公式ドキュメント で あげられていた [Win32 Disk Imager] を 使います.
ダウンロードは、こちらから → https://sourceforge.net/projects/win32diskimager/

Image File に ダウンロードして ZIP を 解凍した images ファイルを指定し、[Write] を クリックします.
ここでは、[C:\Develop\images] に 解凍したものとします.

SD カード と ドライブを確認し、問題なければ [Yes] を クリックします.

書き込みが完了したら、Complete の ダイアログが出るので、[OK] を クリックし、元のウィンドウ の Win32 Disk Imager から [Exit] を クリックして閉じます.

SSH 有効化 の ファイル作成 (2017.03.07 追記)

本ポストを書いていた 2016.11.19 現在 2016-11-25-raspbian-jessie-lite.zip の OS イメージ を 使用していましたが、次のリリース 2016-11-25-raspbian-jessie-lite.zip からは SSH が デフォルトで無効になりました. そのため 2017年3月 現在、以下の手順も必要となり追記します.

ブート・パーティション に “ssh” というファイルを作成します.
Windows からは、エクスプローラー で SD カード の ドライブを開いて、”ssh” というファイルを作成します.

作るファイルのもとは何でもよく拡張子を削除して作るだけになります. 今回はビットマップ イメージを選び、最初から入力されていた 新しいビットマップ イメージ.bmp を 消して ssh としました. “拡張子を変更すると、ファイルが使えなくなる可能性があります。” と 警告表示されますが、今回は特に問題ないので [はい] を クリックして進めます.

“ssh” というファイルが置かれました. これで完了、後は起動するだけです.

このあたりについては 最近インストールした Raspbian Jessie Lite で SSH 接続できない? の ポストも、もしよろしければご覧ください.

Raspbian Jessie Lite 起動!

OS を 書き込んだ SD カード を Raspberry Pi へ セットし、電源を接続して起動します.
HDMI を ディスプレイ や テレビ に 接続することで、起動画面を確認することができます.
各種デーモンが [OK] で 起動していき、最後に [raspberrypi login: ] が 表示されたら起動成功です.


つきにラズパイを起動することができました!!
まだ初期設定などをしていく必要がありますが、まずは立ち上がったことに感動です. 引き続き設定していって、いろいろと楽しみたいところです.

Raspberry Pi Zero の 購入

The Raspberry Pi Foundation より、”The $5 computer” と、謳われる $5 で 買えるミニマムな Zero が 登場したとのことで、さっそく試してみたいと思い、Amazon.co.jp で 探してみたところ なんと 4,000円近い金額からとなっています…(2016年11月現在)
何とか妥当な金額で買えないかを探してみます.


公式の販売店を確認する

どのサイトも1人1つまでの制限があるようで、まとめ買いができません. 少し前までは品薄で手に入らなかったようなので、これでもだいぶ改善されたのでしょう. とはいえ、普通に $5 の ふれこみ通りで買うことができそうです.

販売店 価格  備考
Pimoroni £4.00  1人1つの制限あり、日本への送料 £5.50~.
The Pi Hut £4.00  1人1つの制限あり、日本への輸出できず.
Adafruit $5.00  1人1つの制限あり、日本への送料 $30~.
CanaKit $5.00  1人1つの制限あり、日本への送料 $16.95~
Micro Center ?  買い方が分からず…

いざ購入!

さっそく £4 の Pimoroni にて購入してみます.

Pimoroni の Raspberry Pi Zero の ページ https://shop.pimoroni.com/products/raspberry-pi-zero へ アクセスします.
“Max 1 Pi Zero Per Customer!” と あるように、1人1つしか購入できません. この画面上では何個でもカートに追加できますが、チェックアウト時にエラーになります. ちなみに1回に1個ずつであれば何回でも買えます. 送料が毎回かかってしまいますが…
在庫切れの場合は [In stock] の 部分が [Out of stock] となり購入できませんが、クリック後にメールアドレスを入力することで入荷時に通知がもらえます.

購入するセットを選び [Add to basket] を クリックします.
Raspberry Pi Zero は ミニ HDMI のため変換ケーブルをセットで買ったり、ケースとのセットや、電源、ブレッドボードなどの各種セットを選ぶことができます. 今回 は [Pi Zero only] を 選びました.

その後、右上 の [Checkout] を クリックします.

カート画面に進み、購入内容が正しいかを確認し、ページ右下 の [Checkout now] を クリックします.

ここで、関連製品のお勧めを紹介されます. ケース単体で追加するなどがある場合は、ここでも追加できます.
追加等が終わったら画面を下の方までスクロールし、[Take me the checkout!] を クリックします. ボタンんがグレーで一瞬、押せない or 違うボタン に 思えますが、普通にクリックできます.
※ £4 の Camera Cable は カメラっぽい画像がありますが、ケーブルなので注意が必要です. カメラ本体 は £27.50 で こちら → Raspberry Pi Camera v2.1 with mount

支払方法の選択 と 送付先の入力画面 に 進みます.
今回は PayPal を 使うので、[PayPal] を クリックします.
PayPal は 持っていると海外での買い物用などに便利なことが多いので、この際作っておくのも手です. ここで PayPal か Amazon を 選択しないで進んだ場合は最後に支払情報を選択します. クレジットカード(VISA, Master, Maestro)、Bitcoin が 選べます.
※ Amazon は EU の サイトにつながり、日本 の Amazon.co.jp の アカウントでは使用できませんでした.

PayPal の 認証画面へリダイレクトされるので、メールアドレス と パスワードを入力しログインします.

支払方法の確認画面が表示されます.
£4 が £3.33 に なっているのは、日本への輸出には 付加価値税(VAT) が かからないため、その分値引きされているからです.
内容を確認し、[同意して続行] を クリックします. ここで続行しても支払は確定しません. PayPal を 使うということの確認になります.
※ 配送先の住所はサンプル用に東京駅を借りてます.

Pimoroni の 支払確認画面に戻ります.
PayPal から渡された情報が入力されますが、念のため半角のアルファベットのローマ字住所に直した方が良いでしょう. 画像は東京駅から借りた情報をサンプルにしています. また [Company] と [Apt, suite, etc.] 以外はすべて必須入力です.
入力後 [Continue to payment method] を クリックします.

配送方法の選択画面が表示されます.
通常の郵便なら [International Standard] を 選択します. 今回はこちらを選びました.
[Royal Mail Tracked & Signed] は 輸送状況を確認できます.
[UPS Sever] は 1日、さすが早いですね!
選択したら [Continue to payment method] を クリックします. 支払方法をあらかじめ選択している場合は、ここで完了となります.

注文の確定画面が表示され、送付先情報で入力したメールアドレスにメールが届きます. これで無事に注文が完了し、後は届くのを待つのみです.
Google Maps で 届け先が表示されるなど、ちょっと洒落てますね.
※ サンプル用で某駅を指してます.

到着♪

International Standard で 注文すると、5~7日で届きます. 以下のようなパッケージで届きました.
今回 は 7日フルでかかりました. しかも、その後に追加注文したものが5日で同時に到着…
パッケージ右側のモザイク部分が住所ですがシールが貼ってあるのは、うっかり日本語で住所入力したら、日本語が出力できなかったのか、Japan と 番地の数値だけが元の台紙に印刷されており、上からシールで日本語の住所が貼られていました. 日本語でも届きましたが、ちゃんと半角のアルファベットのローマ字で住所を入力したほうがよいですね.

外装の中はこんな感じのグレーの透明な袋に入っています.


英語のサイトで、海外からの輸入となるので少しドキドキしますが、特に難しいことはなく簡単に購入することができました.

Raspberry Pi Zero に 限らず、ケースも安く買えますし、HAT/pHAT などの Raspberry Pi の 上につける拡張ボード的なものも手に入ります. よほど急ぎでない限り Pimoroni で 買おうかなと思います.

microSD カード や SD Adapter と 並べてみると、よりはっきりしますが Raspberry Pi Zero は 小さいですね. これから色々なもの作りにチャレンジしてみたいと思います.

ところで、Hexo って 何て読むんだろ?

ブログ環境の構築で Hexo を 使ってきましたが、いよいよ「ところで、Hexo って 何て読むんだろ?」という疑問が止まらなくなってきました. また公式サイトなどを見ても読み方は言及されていないように思われます. (どっかに書いてあって気づいてないだけ?)

とりあえず 辞書系で “hexo” を 調べる

オンラインで使える英語辞書、英英辞書などを調べてみました. そもそも英単語して hexo が ないため、前方一致で別単語として出てきました. 英英辞典では入力ミスとして別単語の一覧が出ることに…
とはいえ、検索結果から見ると「ヘキソ」になるみたい.

  • 英辞郎 on the WEB
    以下のように何のことかよくわからない品物が沢山出ましたが、基本的に「ヘキソ-」で 始まるものばかりでした. 唯一 “ヘキサン酸” が 例外でした.

    • hexone 《化学》ヘキソン
    • hexoprenaline 《薬学》ヘキソプレナリン
    • hexoic acid ヘキサン酸
  • goo辞書 英和和英
    こちらも英辞郎同様でしたが、”hexo- [連結詞] hexa-の異形” が 入ってました. “hexa-“ ですと “ヘキサ (Hexa). ギリシャ語で、「6」。 – Wikipedia“ ですね.

    • hexo- [連結詞] hexa-の異形.

ネット で Hexo を 使っている人の声

やはり皆さん何て読むんだろうという 疑問 が 多く、「これだ!」と 明言されている方はいらっしゃらないように感じました. いくつか記事を引用させていただきます.

Hexo の 導入記事を公開されている 株式会社 LIG さん の 記事.

ところで、HEXOの読み方は…何て読むんでしょうね。へくそ?
所要時間3分!? Github PagesとHEXOで爆速ブログ構築してみよう! | 株式会社LIG

WordPress から Hexo (& 他ツールの調査) 記事を書かれている Uragami さん の 記事.
“名前って大事だよね” まさに、その通りです! 読めない、カッコ悪いでは他の人に紹介もいたしかねる…

まず、その「名前」。正確な発音わかりませんが、”へくそ”って・・・・
最後までGravにするかHexoにするか悩みましたが、その悩みの原因はこの名前です。
機能的問題あるわけじゃないけど、、、名前って大事だよね。
WordpressからHexoに乗り換えました - URAGAMI

YOMIKATA - ちょっと読み方決めようぜ さん
こちら、面白いサービスですね. 日本人的な読み方を ゆるく決めてしまうコンセプトが楽しい. Hexo は 投票数が少ないですが 一応「ヘキソ」ですね.

ヘキソ 6pt 67%
ヘクソ 2pt 22%
エグゾ 1pt 11%
hexo の読み方|YOMIKATA

最後に、Google 先生 は?

ニューラルネットワークの力を手に入れた Google 翻訳 では どうなるか. 教えて Google 先生!

せんせぃ… orz


スパッと決まらなかった感がありますが、私は「ヘキソ」で 行きます. もぅ頭の中は「ヘクソ」に固定化されつつありますが「へっクソ」「へっクソ」「クソ」と、リフレインするのはつらいので、がんばろう…

Hexo の フィード と サイトマップ を 設定

Hexo の トップ画面の右上にはフィードのアイコンとリングが配置されています. インストール直後では、機能しておらずクリックすると ステータスコード “404 Not Found” で “Cannot GET /atom.xml” の 文字列が画面に表示されてしまいます.

カッコ悪いのでフィードが出力されるようにし、合わせてサイトマップも出せるようにしたいと思います.

作業環境

  • Windows 7
  • Hexo 3.2

フィードの出力

Hexo の Plugin リスト から フィード関連 の Plugin を 探すと オフィシャル の hexo-generator-feed が あります. こちらを設定します.

Hexo の ソースがあるフォルダで npm install hexo-generator-feed --save を実行します. (下記例の [username] は 自分の GitHub ユーザ名)
また、実行前にアップデートも行っておくとよいでしょう.

1
2
3
4
5
C:\Develop\repos\[username].github.io> npm update
C:\Develop\repos\[username].github.io> npm install hexo-generator-feed --save
`-- hexo-generator-feed@1.2.0
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules\chokidar\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.0.15: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

続いて HEXO の 設定ファイルである _config.yml に フィード出力の設定を追加します.
Atom と RSS2 の どちらかが出力できるようで、今回は Atom を 選択しました. また出力数は limit で 設定できます.

1
2
3
4
5
## hexo-generator-feed (https://github.com/hexojs/hexo-generator-feed)
feed:
type: atom
path: atom.xml
limit: 20

設定後 hexo generate すると、無事にフィードが生成されていることが確認できます. 確認できたらデプロイします.

サイトマップの出力

同じく Hexo の Plugin リスト から サイトマップ関連 の Plugin を 探すと オフィシャル の hexo-generator-sitemap が あります. もうひとつ hexo-generator-seo-friendly-sitemap が ありますが、とりあえずオフィシャルのものを設定します.
機会があったら違いなどを調べたいですが、まずは今の環境構築を優先で.

こちらもフィードと同様に Hexo の ソースがあるフォルダで npm install hexo-generator-sitemap --save を実行します.

1
2
3
4
5
C:\Develop\repos\[username].github.io> npm update
C:\Develop\repos\[username].github.io> npm install hexo-generator-sitemap --save
`-- hexo-generator-sitemap@1.1.2
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules\chokidar\node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.0.15: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

_config.yml に サイトマップ出力の設定を追加します.

1
2
3
## hexo-generator-sitemap (https://github.com/hexojs/hexo-generator-sitemap)
sitemap:
path: sitemap.xml

設定後 hexo generate すると、無事にフィードが生成されていることが確認できます. 確認できたらデプロイします.


オフィシャル で Plugin が 用意されており、また Node.js の npm で 簡単に導入することができました.
hexo-generator-feed で PubSubHubbub による通知もできるようなので、こっちも設定しておきたいでが「それはまた、別の話」にて.
Hexo で PubSubHubbub 通知をする の 記事を追加しました. (2017年1月6日追記)

Hexo の 新規投稿テンプレート を カスタマイズ

Hexo で 新しい投稿を作成する際のテンプレートをカスタマイズして記事を書きやすくしたいと思います.

作業環境

  • Windows 7
  • Hexo 3.2

テンプレート の 配置場所

テンプレートは /scaffolds フォルダ に 配置されています. デフォルトで3つファイルが用意されています.

  • draft.md : hexo new draft "記事タイトル" で 作成した場合に使われる、ドラフト投稿用のテンプレート
  • page.md : hexo new page "ページ・タイトル" で 作成した場合に使われる、固定ページ用のテンプレート
  • post.md : hexo new "記事タイトル" で 作成した場合に使われる、投稿用のテンプレート

ちゃんとドラフト機能を使っている場合は、draft.md を カスタマイズして使いますが、post.md とは date: の 行が有るか無いかの違いだけになります.

post.md の 初期状態は以下にです.

1
2
3
4
5
---
title: {{ title }}
date: {{ date }}
tags:
---

テンプレート の カスタマイズ

今回は投稿用のテンプレートをカスタマイズするので draft.md を 修正します.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
title: {{ title }}
date: {{ date }}
categories:
tags:
-
---
![](/images/ "")
序文
**作業環境**
- Windows 7
## 章タイトル
コンテンツ
- - - -
まとめ

カテゴリを追加しました. カテゴリの階層は深くしたくないので行内に収めるようにし、タグは1つの場合でも複数指定する書き方で統一するようにしました.

またトップ画像を常に配置するつもりなので、![](/images/ "") を 先頭においています.

ほとんど技術系の記事が占めると思われますので作業環境を明記するようにします.

後は章のタイトルとコンテンツの繰り返しになるので、アウトラインとして1つだけ入れておき、まとめ が 入るようにしました.

ファイル上部の --- に 囲まれている部分は Front-matter と よばれるもので、詳細 は こちらのドキュメント Front-matter | Hexo に なります.


あまり使わないかもしれませんが、date: の 行の違いなので、draft.md も 合わせて修正しました.

アウトラインを決めておくだけでも、だいぶ書きやすくなりますし自然と書き方もそろい記事に集中できるようになりそう.