Hexo に Google Analytics を 設置する

ブログを設置するからにはアクセス数などが見れるようにしたくなるものです.
よく アクセスカウンタ を 設置して訪問していただいた数を表示することをしていましたが、現在では Google Analytics などを使って詳細な分析をするのが定番ですね.
ということで、Google Analytics を 設置したいと思います.

作業環境

  • Windows 7
  • Hexo 3.2
  • Hexo Theme Landscape
  • Google Analytics

Google Analytics の アカウント作成

Google Analytics を 使うには、Google の アカウントがっ必要ですが Gmail で よいので、ここでは持っているものとして、Google Analytics の アカウント作成に入りたいと思います.
Google Analytics の ウェブサイトへアクセスし、[アカウントを作成] ボタンをクリックします.

Google アカウント の メールアドレスを入力し、[次へ] ボタンをクリックします.
GoogleApps で 独自ドメインを設定しているメールアドレスでも利用できました.

Google アカウントのパスワードを入力し、[ログイン] ボタンをクリックします.

アカウント作成のステップが表示されるので、画面右の [お申込み] ボタンをクリックします.

アカウントの設定情報を入力する画面が表示されます. 自分のウェブサイトに合わせた情報を入力していきます.
今回は、アカウント名を GitHub Pages の リポジトリに合わせました.
サイト名 や URL は ウェブサイトに合せます.
業種は特に選択する必要はないですが、設定してないと後で設定するようにアラートがでます.
タイムゾーンは日本に合わせ、データ共有設定は初期値のままにしました.

利用規約の確認画面が表示されます. 同意しないと始まりませんが問題があるようでしたら同意せず利用しないという選択になります.
“お住まいの国または地域の利用規約に同意” と あるように、英語で表示されているものを [日本] に 選択しなおし、内容を確認し問題ないようでしたら [同意する] ボタンをクリックします.

Google Analytics の アカウントが作成され、トラッキング ID が 発行されます.
この ID を コピーしておきます.

Hexo Theme Landscape に 設定

Hexo の デフォルト・テーマ Landscape は Google Analytics に 対応しています.
テーマの設定ファイル /[username].github.io/themes/landscape/_config.yml に Google Analytics の トラッキング ID を 設定します.
google_analytics は すでに用意されているので、トラッキング ID を 書くだけの簡単設定です. たすかります!

1
2
# Miscellaneous
google_analytics: UA-7153XXXX-4

※ Hexo の 設定ファイル /[username].github.io/_config.yml と 異なることに注意. ファイル名が同じですがテーマのフォルダの中になります.

いざ確認!

hexo generate して ローカルサーバで動作確認すると、<head> に Google Analytics のためのコードが追加されています.

トラック ID が 正しいことを確認し、hexo deploy で GitHub Pages へ アップします.
Google Analytics の リアルタイム・レポートを見ながら、もう一つのブラウザで本サイトへアクセスすると、アクセス数が表示されます.
うん、自分以外居ない… orz


無事、Google Analytics を 設置することができました.
トラッキング ID の 設定だけで追加してくれるので簡単ですね. 今後テーマを変えることもあるかと思いますが、できるだけ自動でやってくれるものを使いたいものです.

Slack に ボット を 設置する

Slack を CircleCI に 連携した ように、Slack は さまざまなサービスと連携できます. またボットを設置して会話への応答やアクションを実行することも可能です. 最近は Slack の ような チャット・ツールからインフラのオペレーションを実行する ChatOps というキーワードも登場しています.
今回は Slack に 簡単なボットを設置したいと思います.

作業環境

  • Windows 7
  • Node.js 6.9.1 LTS
  • Botkit 0.4.2

Slack の Bots を 作成

まずは Slack に Bots の カスタム連携 を 追加します.
Slack へ ログインし、ボットの追加画面 https://my.slack.com/services/new/bot へ アクセスします.
ボットの名前を入力し、[Add bot integration] ボタンをクリックします. 今回は bot と しました. (ちゃんと名前を付けてあげよう… orz)

ボットが作成されました. 各種設定が行える画面が表示されるので、通知名やアイコンなどを必要に応じて変更します. せっかくのボットなので、ちゃんと名前とアイコンを付けてかわいがりましょう. 変更した際には画面下の [Save Integration] を クリックします.
最後に、API Token を コピーしておきます.

Slack の チャット画面に戻り、ボットが参加するチャンネルを表示し、/invite @[BOT_NAME] と コマンドを実行します. 今回は sandbox チャンネル で /invite @bot と しました.

無事、ボットがチャンネルに参加しました.

Botkit で ボットのプログラムを作成

ボットのプログラムを作成します. Slack の ボット というと、GitHub の Hubot が 有名ですが、開発が止まってしまったようです. 残念…
今回は Slack から 発表 された Howdy の Botkit を 使いたいと思います.

作業ディレクトリを c:\Develop\repos、プロジェクト名 を slack-bot とします. まずは npm init で プロジェクト作成を行います. 基本的にはエンターを押していくだけで問題ありません. license は 公開するならライセンス設定をしますし、今回は特に公開しないので UNLICENSED に しました.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
c:\Develop\repos> mkdir slack-bot
c:\Develop\repos> cd slack-bot

c:\Develop\repos\slack-bot> npm init
name: (slack-bot)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC) UNLICENSED
About to write to c:\Develop\repos\slack-bot\package.json:

{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "UNLICENSED"
}


Is this ok? (yes)

プロジェクト作成後、Botkit を インストールします.

1
c:\Develop\repos\slack-bot> npm install botkit --save

ボットのプログラムを作成します. プロジェクト直下に index.js ファイルを作成します.
まずは基本動作の確認からなので、Botkit の readme.md #Basic Usage になります.

1
2
3
4
5
6
7
8
9
10
const Botkit = require('botkit');
const controller = Botkit.slackbot();

controller.spawn({
token : process.env.token
}).startRTM();

controller.hears('hello', [ 'direct_message', 'direct_mention', 'mention' ], (bot, message) => {
bot.reply(message, 'Hello yourself.');
});

ボットのプログラムができたら起動します.
[API_TOKEN] は Slack からコピーした、ボットの API Token に なります.

1
2
3
4
5
6
7
c:\Develop\repos\slack-bot> set token=[API_TOKEN]
c:\Develop\repos\slack-bot> node index.js
info: ** No persistent storage method specified! Data may be lost when process shuts down.
info: ** Setting up custom handlers for processing Slack messages
info: ** API CALL: https://slack.com/api/rtm.start
notice: ** BOT ID: bot ...attempting to connect to RTM!
notice: RTM websocket opened

Hello ボット!

ボットのプログラムが起動すると、DIRECT MESSAGES の ボットのユーザ名(ここでは bot) の 左のアイコンに色がつき ● になります. 色がない ○ の 場合は接続できていないのでプログラムのログなどを確認し接続できるようにします.
接続できたら @bot hello と、メンション で hello を ボットに送ります.

ボット が Helllo yourself. と 返してくれました!

先ほどのプログラムの以下の部分が会話の処理になります.

1
2
3
controller.hears('hello', [ 'direct_message', 'direct_mention', 'mention' ], (bot, message) => {
bot.reply(message, 'Hello yourself.');
});

controller.hears() の 第1引数で反応するメッセージ、第2引数で聞く(反応する)イベントを指定しています.
今回は hello という 文字列を以下のイベントで待っているという処理になります.

  • direct_message: ダイレクト・メッセージ
  • direct_mention: 名前で始まるメンションのメッセージ (e.g. @bot hello)
  • mention: メンションのメッセージ (e.g. hello @bot)

第3引数 に イベントに対する反応の処理を渡します. bot.reply() なので、今回はメッセージに対して Hello yourself. と 返事をする処理になります.



Botkit を 使うことで、簡単にボットを実装することができました. メッセージ対して返事をするだけでなく、さまざまな処理ができますので、このボットを育てていきたいともいます.

CircleCI の 通知 を Slack へ 送る

CircleCI で ビルドが失敗した際にメールで通知されます. この通知をチャットの Slack へ 流れるようにしたいと思います. 今回は、これまで作成してきた Hexo の 自動ビルドとデプロイが失敗した場合に Slack へ 通知するようにします.

作業環境

  • CircleCI
  • Slack

Slack 側 の 設定

Slack へ ログインし、こちら https://my.slack.com/apps/A0F7VRE7N-circleci から [Install] ボタンをクリックして CircleCI の 連携 を 追加します.
https://my.slack.commy は、それぞれ 自分の Slack へ 行ける 特殊なキーワードなので置き換え不要です. これ便利な機能ですよね!

CircleCI の 通知をポストするチャンネルを選択します. チーム開発などを行っている場合は、開発用のチャンネルへポストするようにします. 今回はブログのビルドとデプロイなので自分のプライベート・チャンネル(DM) へ ポストするようにしました. [Add CircleCI Integration] ボタンをクリックします.

無事、Slack に CircleCI 連携が追加されました. 各種設定が行える画面が表示されるので、通知名やアイコンなどを必要に応じて変更します. 変更した際には画面下の [Save Integration] を クリックします.
最後に、Step 2 に ある Webhook URL を コピーしておきます.

CircleCI 側 の 設定

CircleCI へ ログインし、連携するプロジェクトの設定ボタンをクリックします.

プロジェクトの設定画面の左メニューから [Chat Notifications] を クリックし、右の詳細から [Slack] の [Webhook URL] へ Slack の 設定からコピーした Integration の Webhook URL を 貼り付けます.
必要に応じてオプションを選択し、[& Test Hook] ボタンをクリックします.
今回はチャンネルの上書きは必要ないので [Override room?] を [OFF] にし、ビルドに失敗したときと復旧したときの通知に限りたいので [Fixed/Failed Only] を [ON] に しました.

Slack へ 通知を送るようになったので、メールの通知を止めます.
画面左の全体メニューから 歯車アイコン の [Account Settings] を クリックします.
アカウント設定画面の左メニューから [Notifications] を クリックし、右の詳細から [Don’t send me emails] を クリックします.

Slack に テストの通知が来てる!


これで CircleCI からの通知は、ビルドに失敗&復旧したときだけ Slack の DM へ 流れてくるようになりました.
Slack は いろいろな連携ができるので、引き続きいろいろな挑戦をしたいと思います.

Slack の アカウント作成

これまでのコミュニケーション・ツールはメールが中心でしたが、これからはチャットの時代と言われており、その起爆剤となったのが Slack とも言われています.
Slack を 使って様々なサービスを連携してコミュニケーション基盤を構築したいと思います.

作業環境

  • Slack

Slack とは?

IT 関連企業を中心に流行っているチャット・ツールです.
チャット・ツールはインターネット初期からあり人気を博してきたツールで、ウェブでのコミュニケーションから、企業でのビジネス・ツールとしても様々なツールがありました. 特別新しいものではないのですが、Slack は 登場してから “公開から24時間以内に8000の顧客にサインアップされた - Wikipedia“ とも言われるほどの人気を誇っています.

ソースコードのスニペット(断片)を貼り付けた際にハイライトされることや、マークダウンが使えるなどのエンジニア・フレンドリーであったことや、豊富な外部サービスとの連携が提供されていること、ボットなどで自由にカスタマイズできることなどが人気を得たとも言われています.

長い物には巻かれろ、ではないですが 人気/流行りのツールは情報も多いし、さらなる機能拡張なども期待できることから、しっかり流れに乗っておきたいと思います.

アカウントの作成

Slack の ウェブサイト https://slack.com へ アクセスします.
画面中央 の [Email address] へ サインアップするアカウントのメールアドレスを入力し、[Create New Team] ボタンをクリックします.
ここから入力することは後から変更可能なので思い切ってどんどん進めましょう.

コンファメーション・コードの確認画面が表示されます.
先に入力したメールアドレスへコンファメーション・コードが届いているので入力します.

ユーザ名とアカウントの姓名の入力画面が表示されます. Slack の 利用用途によりニックネームにしておくか本名かなどのルールがあるかと思います. 用途に合わせて入力します.

パスワードの入力画面が表示されます.
珍しく一発勝負のパスワード入力欄です. 間違えてしまったらメールによる再設定ができるので、二回入力させる必要がないのかもしれませんね. とは言え、一発勝負となると途中で間違えてないか、意味もなくドキドキします.

Slack チーム の 用途 と 規模 を 聞かれます. いくつかのチームを作ったことがあり、パターンも異なったのですが、ここでの選択が何かに影響している様子はないのでアンケートでしょうか. 選ばないと進めないので選択します.

グループ名を入力します. Slack では、基本的にチームで呼ばれていますが、なぜかここだけはグループなので気になりますが、チーム名を入力します.

チームのドメイン名の入力画面が表示されます. team.slack.com の スタイルで slack.com の サブドメインになるため、世界で一意になる必要があります. つまり早い者勝ちです. このサブドメインすら後から変更可能です. 自由だ!

サブドメインまで設定できると、最後に利用規約の確認があるので内容を確認し、同意する場合は [I Agree] ボタンをクリックして進めます.

メンバーの招待画面が表示されます. 後で招待もできるので [Skip For Now] ボタンをクリックします.

無事 Slack アカウント と チーム が できました!



Slack は いろいろなサービスと連携できるので、様々な通知を Slack に 集約できるようにしたいですね. またボットを使っていろいろな事もできるので、そちらにも挑戦したいと思います.
まずは、CircleCI の ビルド失敗時に Slack へ 通知できるようにしたいと思います.

CircleCI の 自動ビルド で Hexo の master ブランチをビルドさせない

前回 CircleCI で Hexo の 自動ビルド と デプロイ設定 で GitHub の source ブランチ に プッシュすると CircleCI が 自動的にビルドしてデプロイするようにしました.
これで記事が自動的に公開できるようになったのですが、CircleCI が 記事に使っている master ブランチもビルドしようとしてエラーが発生します. 今回はこのエラーの原因と対策をします. (止めないと記事を公開するたびに、ビルドエラーの通知が来てしまう…)

作業環境

  • CircleCI
  • Hexo 3.2

エラー の 原因

CircleCI の ビルド画面 や、エラー通知のメールを見るとわかりますが [NO TESTS] と なっています. 前回の記事の通り、CircleCI は テストがないとエラーとして扱うためです.
では このエラーはどこから来たのか、これは [master] と 書かれているように、master ブランチをビルドして、テストがないためにエラーとなったものになります.

はて、以下に抜粋した通り circle.yml で ビルドするのは source ブランチに限っているはずです. なぜ master ブランチでビルドが走ってしまったのでしょうか?

1
2
3
4
general:
branches:
only:
- source

原因は、Hexo と GitHub Pages で ブログ環境の構築 で ウェブサイトのソースをコミットする source ブランチを git checkout --orphan source コマンドで作成しているとことにあります.

git checkout --orphan は 親を持たない空のブランチを作成するオプション指定です. これにより mastersource は 関連を持たないブランチとなっています.
その関連のない source ブランチに circle.yml は あるので、mastercircle.yml を 持たない状態になっています. そのため、いくらビルドするブランチから master を 外してもビルドは行われる状況になっていたということになります.

master ブランチをビルドさせない対策検討

原因が分かったので対策に入りたいと思います.

まず浮かぶのは master ブランチ に circle.yml を 置く方法です. この方法だと公開されるウェブサイトにも circle.yml が 配置され公開されることになります. う~ん、いまひとつ…

ではどうするか、Skip a build - CircleCI に 書かれている、コミット・メッセージ に [ci skip] もしくは [skip ci] を 含めるというやり方があります.

この方法だと毎回のコミット・メッセージに [ci skip] を 入れることになりますが、ここのコミット・メッセージは Hexo が 自動で行っているため手間はかかりません.

また コミット・メッセージ に 毎回入れてよいかという観点では、master ブランチは GitHub Pages の ウェブサイト公開用で Hexo で 上書きされ更新履歴のトラックも使っていません.

以上の事から、コミット・メッセージに [ci skip] を いれても問題ないと考えられます.

コミット・メッセージ に [ci skip] を 入れる

Hexo の 設定ファイルである _config.ymldeploy セクション に message を 追加します.
今回はデフォルトのコメントの最後に [ci skip] を 追加する形にしました.
設定の詳細は、こちら Deployment | Hexo に なります.

1
2
3
4
5
deploy:
type: git
repo: git@github.com:[username]/[username].github.io.git
branch: master
message: "Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }} [ci skip]"


以上で master ブランチのビルドを止めることができました.
CircleCI の ビルド・ログ にはスキップしたことが残ってしまいますが、基本的にエラーが発生しない限りは CI の 画面は見ないですし、不要な設定ファイルをウェブサイトのツリーに配置するよりはよいと思うので、まずは形で行こうかなと.
とはいえ、もっと良い方法があるといいのだけど.

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:::


Raspberry Pi 3

ラズパイを始めるには 全部入りの Raspberry Pi 3 が 手ごろではないでしょうか. Raspberry Pi Zero - ラズベリー・パイ ゼロRaspberry Pi Zero W - ラズベリー・パイ ゼロ W は 国内では入手しずらいため値上がりしてしてますし、GPIO ピン も 自分で付ける必要があったりと色々と手がかかります. その分楽しいというのもありますが.
届くまで時間がかかってもよい場合は こちら Raspberry Pi Zero の 購入 で 記事にしました Pimoroni さん から購入する手もあります.

Raspberry Pi 3 の 電源

Raspberry Pi 3 は 5V/3A の 電源が必要になります. スマホの充電アダプタでは出力が足りない場合もあるので確認が必要です.

マイクロ SD カード

ラズパイ の OS や ストレージに必要です. 16GB あれば十分だと思いますが、用途次第なので お好みのサイズで用意します.


これで、だいリモートアクセスを保護できるようになりました. ラズパイ自体が小さく(特に 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

SD カード 作成時 に Wi-Fi 設定をしておく (2017.03.07 追記)

Raspberry Pi 3 や Raspberry Pi Zero W の OS イメージ を Raspbian で 作る際に、あらかじめ wpa_supplicant.conf を 作っておくことで、初回起動時から Wi-Fi へ 接続しておくことができます.

詳しくは、こちら ラズパイ の OS イメージを焼くときは Etcher が 便利 & UI カッコいい を ご参照ください.


Raspberry Pi 3

ラズパイを始めるには 全部入りの Raspberry Pi 3 が 手ごろではないでしょうか. Raspberry Pi Zero - ラズベリー・パイ ゼロRaspberry Pi Zero W - ラズベリー・パイ ゼロ W は 国内では入手しずらいため値上がりしてしてますし、GPIO ピン も 自分で付ける必要があったりと色々と手がかかります. その分楽しいというのもありますが.
届くまで時間がかかってもよい場合は こちら Raspberry Pi Zero の 購入 で 記事にしました Pimoroni さん から購入する手もあります.

Raspberry Pi 3 の 電源

Raspberry Pi 3 は 5V/3A の 電源が必要になります. スマホの充電アダプタでは出力が足りない場合もあるので確認が必要です.

マイクロ SD カード

ラズパイ の OS や ストレージに必要です. 16GB あれば十分だと思いますが、用途次第なので お好みのサイズで用意します.

USB の WiFi モジュール

内臓 WiFi が 無い Raspberry Pi 2 や Raspberry Pi Zero の 場合は、USB の WiFi モジュール を 使いすることで使えます. いろいろな種類がありますが PLANEX さん のがよさそうです.

USB の 変換アダプタ

Raspberry Pi Zero で USB 機器を使う場合に、マイクロ USB の 製品があると便利ですが、上記 WiFi モジュール のように マイクロ USB ではない場合は、この製品が便利です.
なんと USB の コネクタ内に入ってしまうので、通常の変換製品より圧倒的に出っ張りが少ないです!


無事 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/*


Raspberry Pi 3

ラズパイを始めるには 全部入りの Raspberry Pi 3 が 手ごろではないでしょうか. Raspberry Pi Zero - ラズベリー・パイ ゼロRaspberry Pi Zero W - ラズベリー・パイ ゼロ W は 国内では入手しずらいため値上がりしてしてますし、GPIO ピン も 自分で付ける必要があったりと色々と手がかかります. その分楽しいというのもありますが.
届くまで時間がかかってもよい場合は こちら Raspberry Pi Zero の 購入 で 記事にしました Pimoroni さん から購入する手もあります.

Raspberry Pi 3 の 電源

Raspberry Pi 3 は 5V/3A の 電源が必要になります. スマホの充電アダプタでは出力が足りない場合もあるので確認が必要です.

マイクロ SD カード

ラズパイ の OS や ストレージに必要です. 16GB あれば十分だと思いますが、用途次第なので お好みのサイズで用意します.


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