第二回 Raspberry Pi 3をステルス機能が有効のアクセスポイントに接続させMacからSSHで接続する

第一回 Raspberry Pi 3のセットアップと初回起動に続き今回はネットワークに接続しSSHでMacからアクセスします。

Raspberry Piは現段階ではSSIDを公開しているアクセスポイントに接続するのはGUIからでもできますが、ステルスモードでSSIDを直接指定しないといけないアクセスポイントには接続できないようでした。今回は以下の記事を参考にコマンドラインでRaspberry Piのネットワーク周りの設定を行っていきます。

Raspberry Piを操作する

今回はキーボードの設定が少しおかしかったので、Raspberry PiにSSHで接続してMacから設定することにしました。Raspberry PiのTerminalから直接作業する場合はこの項目は飛ばしてください。

追記: キーボードの設定はMenu->Preferences->Mouse and keybord Settings->keyboard->Keyboard Layoutから変更できます。

まずRaspberry Pi 3を有線LANで接続し、ifconfigでローカルIPを調べMacからSSHで接続します。デフォルトのパスワードはraspberryです。ルーター側で接続できるマシンをMACアドレスでフィルタリングしている場合はここでMACアドレスをメモしておきましょう。

ssh pi@10.0.1.12

追記: ちなみにRaspberry Piはデフォルトでraspberrypi.localという名前でアクセスできるので上記のようにIPアドレスでなくても大丈夫のようです。経緯は忘れましたが、私の~/.ssh/configに上記のホストに書いてありました。それで、この追記の本題なんですが、このraspberrypi.localというのは二代目のRaspberry Piが追加されたらどうなるのだ?と思っていたら、意外と簡単に変えられるようです。これで用途に応じて名前をつけていけば良いですね。こちらのサイトが参考になりました。

Raspberry Piを無線LANに接続する

次に無線LANの設定をします。以下のコマンドを実行すれば無線LAN設定が/etc/wpa_supplicant/wpa_supplicant.confに書き込まれます。wpa_passphrase [SSID] [PASSPHRASE]を単体で叩いて出力された設定をsudo vi /etc/wpa_supplicant/wpa_supplicant.confで手作業で書き込んでもOK。

sudo sh -c "wpa_passphrase [SSID] [PASSPHRASE] >> /etc/wpa_supplicant/wpa_supplicant.conf"

ステルスモードの場合は更にscan_ssid=1という記述を追加します。sudo vi /etc/wpa_supplicant/wpa_supplicant.confとして設定ファイルを開いたら以下のようになるようにscan_ssid=1を追加してください。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB
network={
ssid="home"
#psk="password"
psk=d04b98f48e8f8bcc15c6ae5ac050801cd6dcfd428fb5f9e65c4e16e7807340fa
scan_ssid=1
}

書き込みが完了したらsudo shutdown -h nowで停止してからLANケーブルを外し、再度Raspberry Piを起動します。sudo rebootしてすかさずLANケーブルを外してもいいかもしれませんw

最後にもう一度IPを調べなおして再接続しましょう。

scan_ssidを追加しなくても接続できたんですが、再起動してから接続までに30秒ほど時間がかかり不思議に思っていましたが、この記述を追加することで、再起動後即時でアクセスポイントに接続されるようになりました。@longroofさんに教えて頂きました。ありがとうございました。

第一回 Raspberry Pi 3のセットアップと初回起動

ラズベリーパイ3を購入しました。説明書通りにテレビに繋いで電源を入れてみたんですがディスプレイに映像が出力されませんでした。試しにMac側でOSイメージを入れたSDカードを作成し、それをラズベリーパイ3に差し込んで起動した所ディスプレイに映像が出力されました。

Mac側でラズベリーパイのOSイメージをコピーする手順については以下のお二人の記事を参考にしました。設定しながら新たに学んだ所などもありますので、改めてここでも手順を書いていこうと思います。

RASPBIANのイメージの準備

これはRaspberry PiのOSイメージです。curlでダウンロードしていますが、wgetでもブラウザからダウンロードでもOKです。

curl -L -O https://downloads.raspberrypi.org/raspbian_latest

ダウンロードしてきたファイルが改ざんされていないかを調べます。まずは公式のダウンロードページからハッシュを確認します。
https://www.raspberrypi.org/downloads/raspbian/

今回はdb41f2a8c6236c0ca9150fe4db2017c09e7871fbでした。shasumでファイルのハッシュを確認し、公式のダウンロードページで確認したハッシュと同じかを以下のように確認します。

$ shasum 2016-03-18-raspbian-jessie.zip
db41f2a8c6236c0ca9150fe4db2017c09e7871fb  2016-03-18-raspbian-jessie.zip

問題なければ解凍

$ unzip 2016-03-18-raspbian-jessie.zip

SDカードをMacbook Airにマウント

Macbook Airには右側にSDカードを指す所があります。Raspberry Pi 3はmicroSDカードを差し込めますが、Macbook AirはSDカードなので、microSDカードを通常サイズのSDカードに変換するアダプターを使って差し込めば、Macbook AirにmicroSDカードをマウントできます。

マウントしたSDカードはdiskutil listの一覧で確認できます。

diskutil list

このコマンドがあることを今回はじめて知りました。diskutilコマンドについては以下参考。

今回は/dev/disk2にマウントされていましたので、/dev/disk2で話を進めます。ここはそれぞれの環境に合わせて以下補完してください。

SDカードのフォーマットとイメージのコピー

FAT32でディスク名はRPIという名前でフォーマットを行います

diskutil eraseDisk FAT32 RPI /dev/disk2

フォーマットが完了したらディスクをアンマウントしてからddコマンドでイメージをコピーします。

diskutil unmountDisk /dev/disk2
sudo dd bs=1m if=2016-03-18-raspbian-jessie.img of=/dev/disk2

完了するとこのようなメッセージが出ます。今回一時間近くかかっていますねw

$ sudo dd bs=1024m if=2016-03-18-raspbian-jessie.img of=/dev/disk2
Password:
3+1 records in
3+1 records out
4033871872 bytes transferred in 2878.558795 secs (1401351 bytes/sec)

マウントを解除しないでddコマンドを実行すると "dd: /dev/disk2: Resource busy" といったメッセージが出ます。OSが自動的にアンマウントしてくれるわけではないので、自分でアンマウントをしてあげます。これについては以下に詳しく解説されています。
http://www.lifewithunix.jp/notes/2013/06/13/how-to-use-dd-command-on-snow-leopard/

また話はそれますが、diskutil unmountDiskはアンマウントですが、逆にマウントする時はdiskutil mountDiskでマウントすることができます。

いよいよRaspberry Pi 3の起動

あとはラズベリーパイを起動するだけです。HDMIでテレビに接続し、マウスとキーボードのUSB(今回はロジクールの無線で試した)を指してから、最後にmicroUSB(電源)を挿せば起動します。

今回はうっかりマウスとキーボードの接続を忘れていて、あとからUSB指してもちゃんと認識してくれましたw

以上でRaspberry Pi 3の初回起動は完了です。Raspberry Pi 3を初期化して一からやり直したい時は上記手順を繰り返すことで何度でもやり直せます。

続き

第二回 Raspberry Pi 3をステルス機能が有効のアクセスポイントに接続させMacからSSHで接続する
http://qiita.com/setouchi/items/e9e2833d35e94af3d39d

Node.jsでメールの受信をトリガーにして任意の処理を実行するemail-trigger

node.jsでIMAP接続して新着メールが来たら任意の処理を実行するというピンポイントな目的のためにemail-triggerを公開しました。

使い方

npm install email-trigger
var emailTrigger = require("email-trigger");
emailTrigger({
user: "info@example.com",
pass: "password",
host: "imap.gmail.com"
}, function(mail) {
console.log(mail);
});
$ node app.js
connected to server

connected to serverと出れば接続完了です。新着メールが来るとconsole.log()でメールの情報が出力されます。この部分を書き換えて、特定のメールをSlackに転送したり、メールの受信をトリガーに外部のAPIを叩いたりできます。

注意

Gmailでテストする場合は設定の変更が必要です。

Googleアカウントのアカウント設定からログイン項目内の安全性の低いアプリのアクセスをオン(許可)にしましょう。

http://liginc.co.jp/web/service/facebook/153850

技術メモ

内部的にはinboxmailparserを使わせて頂いております。inboxはかなり使いやすかったので、細かい操作をしたい場合はinboxを使って一から書くのがおすすめです。

最初Gmail APIを操作していたんですが、こっちの方が学習コストも導入のハードルも低かったし、Gmail以外でもIMAP接続できれば活用できるので、これにしました。

参考

http://ayapi.github.io/posts/observingimaponnode/
http://masato.github.io/2015/05/01/meshblu-mqtt-gmail-slack/

JavaScriptでWebページのテキストを方言などに変換するためのテキスト置換ライブラリ

JavaScriptでWebページ上のテキストを方言に変換するために、ページ上のテキスト置換を簡単に行えるJavaScriptのライブラリを作りました。デモではページ上にある「私」という文字列を「わたし」に変換し、「です。」を「で御座います。」に変換しています。

デモ: http://setouchi.github.io/namari/
ソースコード: https://github.com/setouchi/namari

使い方

すぐ使うなら以下のタグを貼り付けるだけで動作します。rawgitのCDNを使っています。

<script src="https://cdn.rawgit.com/setouchi/namari/gh-pages/namari.js"></script>
<script>
  window.addEventListener('load', function() {
    new Namari().replace([
        { regex: /私/g, text: 'わたし' },
        { regex: /です。/g, text: 'で御座います。' }
    ]);
  }, f
</script>

jQueryを使っている環境ならこれで動作します

<script src="https://cdn.rawgit.com/setouchi/namari/gh-pages/namari.js">
<script>
$(function() {
  new Namari().replace([
      { regex: /私/g, text: 'わたし' },
      { regex: /です。/g, text: 'で御座います。' }
  ]);
});
</script>

importして使う場合はこのようにします

import Namari from './src/core.js';
window.addEventListener('load', function() {
new Namari().replace([
{ regex: /私/g, text: 'わたし' },
{ regex: /僕/g, text: 'ぼく'   }
]);
}, false);

経緯

ギャル文字変換というサイトが昔からあります。ああいうのを動的に実装するために作成しました。タグを貼り付けるだけでページがギャルっぽくなったら楽しいですよね。しかし、置換ライブラリ作った段階で力付きました。

本体は./src/core.jsですので、ぜひこれをimportして置換パターン込みJSをビルドしてもらって再配布したりしてください!

特にgalgo.jsとか、kansaiben.jsとか、okayamaben.jsなどを期待しております!難しい技術に関する事を書いているのに、ギャル語になってたりしたら面白いですよねw

技術メモ

置換はテキストノード単位で行っているため要素をまたぐテキストノードの置換には対応していません。<span>h<u>o</u>ge</span>という構造の場合、/hoge/で置換することはできないのです。

これに対応する場合はテキストノードを一文字ずつ分解、マッピング、置換して最後にノーマライズする必要があると思うんですが、実際に実装してみたら置換処理が長くなってIEなどでは動作がもっさりとなります。したがって、速度を重視したシンプルなテキストノード単位の置換としました。

でも複雑な方言置換を極めて行くと、長文に対して置換をかけることがあるかもしれません。そんな素敵な正規表現を書いてもらえる程になったら実装してみようかと思います。速度の関係もあると思うので、別の機能としてdeepReplaceみたいなオプションを実装してみますw

ちなみに、document.body.innerHTMLを直接置換することでもっと処理を実装を簡略化できますが、その場合は中身のHTMLが傷ついて要素が壊れたり、バインドされているイベントが消えてしまうと思います。特に要素の属性の中身にまで置換処理が及ぶのは避けたいです。よって、テキストノードのnodeValueそのものを置換することで、その辺りのデリケート部分を保護することにしました。