まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:raspberry

ラズベリーパイ(以下「ラズパイ」)は普通にセットアップすると DHCP でセットアップされます。特にラズパイ3では標準で無線LANが使えるので、「無線LANでDHCP」を使う状態でセットアップされるケースが多くなると思います。

ある程度ラズパイを使い続けていると、SSH でリモートアクセスできるようにもして、その結果 DHCP ではなく固定アドレスで使いたくなることがあります。 

無線 LAN が利用できているのでネットワークそのものの設定は有効になっているのですが、DHCP を固定アドレス運用に変える機会があったので、その方法を紹介します。


答は /etc/dhcpcd.conf ファイルに以下の内容を追加する、です:
  :
  :

# 以下をファイルの最後に追加 interface wlan0 static ip_address=192.168.0.10/24 static routers=192.168.0.1 static domain_name_servers=192.168.0.1

※ IP アドレス 192.168.0.10/24 、デフォルトゲートウェイ 192.168.0.1、DNS サーバー 192.168.0.1 で設定した場合の内容です。


この変更をした上でラズパイを再起動すると、設定した固定アドレスで起動します。

先日の Maker Fair Tokyo 2017 でラズパイ用の小型 TFT モニタを購入しました:


Raspberry Pi2 / Pi3用タッチスクリーンTFTモニタセット(3.5インチ)



ラズパイ用のモニタにはメーカーやサイズで色々な種類がありますが、僕が購入したのは Physical Computing Lab という会社から提供されている、3.5 インチモニタ(上図)でした。


ラズパイの用途にもよるとは思うのですが、自分の場合はある程度のセットアップをした後は「リモートからアクセスして開発環境として使う」ことが多いです。それができる環境が1万円弱で揃うってすごい時代になったものです。

なお、今までにラズパイで色々やってきた記録はこちらを参照ください:
http://dotnsf.blog.jp/tag/raspberrypi


さてラズパイに直付けモニタは必要か?というと、上でも触れましたが「ある程度のセットアップが済んでいれば」必要ないと思っています。ラズパイが起動して、ネットワークに繋がっていて、IP アドレスが分かっていればリモートから SSH や VNC などでログインして使えばいいわけです。

問題になるのは「ある程度のセットアップを済ます前」です。例えばラズパイが起動して、ネットワークに接続されていても、その IP アドレスがわからないと外部からは接続できません。(MAC アドレス等を使って)外部から IP アドレスを調べる方法がないわけではないのですが、手っ取り早いのは HDMI ケーブルとキーボード&マウスを繋げて、画面で確認する方法です。つまり「モニターが必要なくなる段階になるまでにはキーボードだけでなく、HDMI モニタとケーブルが必要」なのです。キーボードはともかく、モニターを持ち歩くのは厳しい。このジレンマをなんとかしたくて、ラズパイ一体型の小型モニタを購入してみました。

やりたいことは上記のようにセットアップの最終段階、つまり「起動後の IP アドレスの確認」です。この目的のためであれば Window システムを使った GUI である必要はなく(むしろ画面が小さくて使いにくいので GUI でないほうがよく)、CUI(キャラクター端末インターフェース)で起動できれば充分です。というわけで、あまり事例のないキャラクター端末としての小型モニタ利用の手順を、(あらかじめ用意された OS イメージではなく)自分の利用中の Raspbian 環境で使う前提でまとめました。


まず普通にラズパイをセットアップします。使っているイメージは Raspbian Jessie の最新版で、マイクロ SD カードも自分で用意したもので構いません。この時点で HDMI を使っていてもいなくても構いません(IP アドレスが固定なら SSH でも構いません)。また TFT モニタはこの時点でラズパイに取り付けておきます(まだ何も写りません)。

まずラズパイでも他のシステムでも構いませんが、以下のページにアクセスして画面下のほうにある「ドライバー一式」という所で、最新版ドライバーのファイル名を確認してください。2017/Aug/08 時点では LCD-show-160811.tar.gz が最新でした:
http://store.techshare.jp/html/page147.html

2017080801


このファイルをモニタをセットアップしたいラズパイにダウンロードします。あらためてラズパイにログインし、以下のコマンドを実行してドライバーをダウンロードします(ファイル名は上記で確認した最新版ファイルの名前を指定してください、GUI であればブラウザから直接ダウンロードも可能です):
$ wget http://techshare.co.jp/raspiosimage/LCD-show-160811.tar.gz

ダウンロードが完了したらファイルを展開します:
$ tar xzvf LCD-show-160811.tar.gz

LCD-show というフォルダが作られ、その中にドライバファイル一式が入ります。最終的な目標は「キャラクター端末としてモニタを利用する」ことなので、まずこの時点でラズパイを CUI モードに変更します(GUI でモニタを使いたい場合はこの時点でラズパイを GUI モードに変更します)。画面モードを切り替える場合は raspi-config コマンドで変更します:
$ sudo raspi-config

最初にメニュー3番目の "Boot Options" を選択します:
2017080801


次の画面で一番上の "Desktop / CLI" を選択します:
2017080802


次の画面で変更したいモードを選択します。今回は CUI モードで、ログインプロンプトを出した状態で起動したいので、一番上の "Console" を選択します(変更した場合はここでラズパイを再起動します):
2017080803



再起動後、改めてラズパイにログインし、ダウンロードしたドライバを読み込ませた状態で HDMI モードで再起動します(LCD-hdmi コマンド実行後に自動的に再起動します):
$ cd LCD-show
$ sudo ./LCD-hdmi

何度か再起動を繰り返してここまできました。最後にラズパイを TFT モニタモードに切り替えます。改めてラズパイにログイン後、モニタのサイズに合わせて LCDxx-show コマンドを実行します(以下の例は 3.5 インチモニタ用):
$ cd LCD-show
$ sudo ./LCD35-show

このコマンドが成功すると、ラズパイに接続された TFT モニタに CUI コンソールが表示されるようになります。キーボードが接続されていればコマンドを入力してその結果を確認することも可能になりました:
2017080800


TFT モニタ(の解像度)がもう少し大きいものであれば話は違ってくると思いますが、この 3.5 インチはラズパイとほぼ同じサイズで、一体感があります。一方で、このサイズのモニタだと GUI で使うこと自体に無理があると感じています。 そうなると今回紹介したように CUI で使うのが現実的かな、と考えています。

で、CUI で使うための手順紹介をあまり見かけなかったので、自分でやって紹介してみた、というのが今回のブログエントリを書いた経緯でした。 同じように考えている皆さんの参考になれば。


自分はラズパイ(Raspberry Pi 3B)をリモートの開発環境として使っています。自宅内ネットワークで常時起動させ、OpenVPN 経由で外からもアクセスできるようにしています。その辺りの設定についてはこちらを参照してください:
OpenVPN でローカル(自宅)ネットワークに VPN 接続する


そんなラズパイに各種開発環境やら docker やら TensorFlow やら、、を導入しています。これで外からも利用できる開発環境を構築しています:
http://dotnsf.blog.jp/tag/raspberrypi


さて、コーディングして動かすところまではこういったツールだけで問題ないのですが、1点だけ不便に感じる点がありました。それが「cf ツール」です。作ったアプリケーションを IBM Bluemix (Cloud Foundry) 環境上にデプロイする際に使うツールなのですが、公式にはラズパイ用のバイナリは提供されていません。なのでラズパイで開発して、動かして、テスト&デバッグして、、というところまではこの環境でできるのですが、作ったアプリを IBM Bluemix 上で動かす、という最後のステップの際に別の(cf ツールの導入された)環境に切り替えて行う、というちと面倒な手順をとる必要がありました:
Releases cloudfoundry/cli

2017080601


これをラズパイ環境のままで行えるようにする、というのが今回の目的です。実はこれまでにも IBM LinuxONE 環境などで同様の経験はしていて、その時は自分でソースからビルドして対応したりしていました:
IBM LinuxONE コミュニティクラウド上で cf コマンドを動かす

2017080602
(↑メインフレーム上で cf を動かしたのは、もしかすると世界中で自分だけかも・・)


で、同様の問題がラズパイで発生しているということです。というわけで、ラズパイ環境でも同様に cf ツールをビルドしてみました。以下はその手順紹介ですが、基本的には上記の LinuxONE 環境と同じことをしています。

まず cf ツールは go 言語で書かれているため、ビルドには go 言語が必要です。ラズパイ用の go 言語導入については以下を参照して、go 言語が動く環境を作っておいてください:
ラズパイに go 1.8 をインストールする

go 言語が動くようになったら次はソースコードの入手です。以下のコマンドを実行します:
$ go get code.cloudfoundry.org/cli

これで $GOPATH/src/code.cloudfoundry.org/cli 以下にソースコードが展開されます。これをビルドします:
$ cd $GOPATH/src/code.cloudfoundry.org/cli
$ bin/build

ビルドが成功すると $GOPATH/src/code.cloudfoundry.org/cli/out/ 以下に cf コマンドが生成されます。試しに動くかテストしてみます:
$ cd $GOPATH/src/code.cloudfoundry.org/cli/out
$ ./cf -v
cf version 6.29.0+35e54cd.2017-08-06

バージョン番号が表示され、ちゃんと動くことが確認できました。後はこのコマンドを PATH の通った所に移動すれば完成です。
$ sudo mv $GOPATH/src/code.cloudfoundry.org/cli/out/cf /usr/local/bin
$ sudo chown root.staff /usr/local/bin/cf


なお、このラズパイ版の cf コマンドについては困っていた方が他にもいたようで、たまに有志でビルドされたものが見つかります。僕が動作確認しているわけではないし、動作保証もできないのですが、こういった所から入手して使うという手段もありそうです:

https://github.com/mmb/cf-cli-pi
https://cf-cli-pi.s3.amazonaws.com/index.html


Google が提供する機械学習ライブラリ TensorFlow公式にはラズベリーパイ用のモジュールは用意されていませんが、ラズベリーパイ向けのパッケージを作って公開されているものを見つけました:
https://github.com/samjabrahams/tensorflow-on-raspberry-pi


実際に導入してみた手順を紹介します。なお以下の情報は 2017/Jul/19 時点のものであり、実際に試した時の環境は以下のとおりです:
ハードウェア: Raspberry Pi 3 Type B
OS: Raspbian GNU/Linux 8.0(Jessie)
Linux カーネル: 4.9.28
TensorFlow: 1.1.0


【Pythonのインストール】
Python 2.7 または 3.3 以上が必要です。自分の環境では標準で 2.7 がインストールされていたので、これをそのまま使うことにしました。というわけで、以下の手順は Python 2.7 用のものです。


【pip 他のインストール】
TensorFlow 本体のインストール時に必要な pip や開発用依存モジュールをまとめてインストールします:
$ sudo apt-get update
$ sudo apt-get install python-pip python-dev

【TensorFlow のインストール】
ラズパイ用の TensorFlow 1.1.0 をダウンロードし、pip でインストールします:
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl

wheel パッケージが展開され、各種ライブラリ含めたビルドが行われます。実際には結構な時間がかかる作業です。


【mock ライブラリの再インストール】
最後に mock ライブラリの再インストール(一度削除して、もう一度インストール)が必要とのことで、その作業を行っておきます:
$ sudo pip uninstall mock
$ sudo pip install mock

【動作確認】
クラスメソッド様のサイトに「TensorFlow 版ハローワールド」的なサンプルプログラムがあったので、これをそのまま動かしてみます:
TensorFlowで Hello Worldを動かしてみた&その解説

テキストエディタで以下の内容を編集し、hello-tf.py という名前で保存します:
# hello-tf.py
import tensorflow as tf
import multiprocessing as mp
 
core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)
 
hello = tf.constant('hello, tensorflow!')
print sess.run(hello)
 
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)

これを Python で実行します:
$ python hello-tf.py
hello, tensorflow!
42

青字のような結果が出力されれば、とりあえず動作していることが確認できました。


 

ラズパイ(ラズベリーパイ)上で検索エンジンである ElasticSearch が動くことがわかったので、自分も試してみました:
2017070601


まず、ElasticSearch そのものにラズパイネイティブ版が存在しているわけではありません。 ElasticSearch は Java アプリケーションなので実行には Java が必要であり、Java が有効な環境であれば理論上は動きます。というわけで最初にラズパイに JDK 8 を導入します(導入済みであれば、ここは読み飛ばしても可)。
$ sudo apt-get install oracle-java8-jdk

$ java -version
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)

Java が使えるようになったので改めて ElasticSearch を導入します。ダウンロードページで確認すると、この記事を書いている 2017/Jul/06 時点での最新バージョンは 5.4.3 でした:
2017070602



これをラズパイ上にダウンロードして展開します:
$ cd ~
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.3.zip
$ unzip elasticsearch-5.4.3.zip
$ rm elasticsearch-5.4.3.zip
$ mv elasticsearch-5.4.3 elasticsearch
$ cd elasticsearch

さて、他のプラットフォームだとこのまま実行してもいいのですが、ラズパイの場合はシステムスペックの問題でデフォルトの設定のままだとメモリ不足になりやすいという問題があります。そこで実行前にメモリの設定を変更しておきます。22 行目と 23 行目(か、そのあたり)で、"-Xms2g" と "-Xmx2g" という指定がされており、これによって ElasticSearch に 2GB のメモリを使うよう指定されています。ここを以下の赤字のように書き換えて、メモリ使用量を 256MB にするよう変更します:
$ vi config/jvm.options

  :
  :
-Xms256m   ← -Xms2g から変更
-Xmx256m   ← -Xmx2g から変更
  :
  :

これでメモリの問題は解決した(はず)なので、改めて ElasticSearch を起動します:
$ ./bin/elasticsearch
[2017-07-06T10:41:17,203][WARN ][o.e.b.Natives ] unable to load JNA native support library, native methods will be disabled. : : [2017-07-06T10:41:39,511][INFO ][o.e.h.n.Netty4HttpServerTransport] [lonXjYa] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200} [2017-07-06T10:41:39,537][INFO ][o.e.n.Node ] [lonXjYa] started [2017-07-06T10:41:39,579][INFO ][o.e.g.GatewayService ] [lonXjYa] recovered [0] indices into cluster_state

いくつかの警告メッセージが表示されますが、ラズパイ上で ElasticSearch 5.4.3 が起動しています。確認のため、同じマシンから curl でアクセスしてみましょう:
$ curl http://localhost:9200/
{
  "name" : "lonXjYa",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "4hqvLhXQT0uqTaKOI02idg",
  "version" : {
    "number" : "5.4.3",
    "build_hash" : "eed30a8",
    "build_date" : "2017-06-22T00:34:03.743Z",
    "build_snapshot" : false,
    "lucene_version" : "6.5.1"
  },
  "tagline" : "You Know, for Search"
}

↑こんな感じのメッセージが表示されれば成功です。なお、ElasticSearch を終了するには実行中の端末で Ctrl+C を入力します:
    :
    :
[2017-07-06T10:41:39,537][INFO ][o.e.n.Node               ] [lonXjYa] started
[2017-07-06T10:41:39,579][INFO ][o.e.g.GatewayService     ] [lonXjYa] recovered [0] indices into cluster_state

^C[2017-07-06T10:52:09,484][INFO ][o.e.n.Node               ] [lonXjYa] stopping ...
[2017-07-06T10:52:09,579][INFO ][o.e.n.Node               ] [lonXjYa] stopped
[2017-07-06T10:52:09,581][INFO ][o.e.n.Node               ] [lonXjYa] closing ...
[2017-07-06T10:52:09,668][INFO ][o.e.n.Node               ] [lonXjYa] closed

$ 
  (↑Ctrl+C(赤字部分)を入力して終了する様子)


実はいま、個人的にはラズパイを開発環境として使う機会がそれなりにあります(ラズパイにリモートログインして vi でガシガシ、という感じ)。そのローカルシステム内に ElasticSearch 環境まで構築できる時代になったとは・・・今以上に開発がはかどりますね。


このページのトップヘ