はじめに
Raspberry Piとは
こんにちは。皆さんは Raspberry Pi をご存じでしょうか。簡単に説明すると、イギリス発の教育向けワンボードマイコンです。
Raspberry Pi
クレジットカードサイズでたったの$35(日本だと送料込みで¥5000程度)。それでもれっきとしたLinuxが動作するRaspberry Piは、発売以来3年で通算500万台以上を売上げ、イギリスのコンピュータメーカーとして最大の出荷数を誇っているそうです。
Raspberry Piの売上が500万台を突破…イギリスのコンピュータメーカーとして新記録 – TechCrunch
本体以外に最低限必要なものは、USBコネクタ経由の電源(PCの500mAだとちょっと足りないかも)とMicroSDカードです。電源はスマートフォンの充電用が大抵使えますし、MicroSDカードの8GBでClass10以上という要件も1000円程度でクリアできます。
今年2月、従来の512MBメモリに700MHzシングルコアというスペックから1GBのメモリに900MHzのARMプロセッサコアを4つ備えたクアッドコア構成としてモデルチェンジされました。6倍とも言われる性能向上により、本格的なWebシステムを動かすこともできる能力を備えています。
Railsを動かしてみよう!
ということで、今回はパワーアップしたRaspberry Pi 2を使ってRailsアプリを動作させてみたいと思います。
動かす対象は弊社ダニー作の KPTBoard (https://github.com/f96q/kptboard)を使いました。
KPTBoardは、我々がプロジェクトのカイゼンの一環として行っているプラクティス「ふりかえり」を遠隔地の人間とも一緒にできるようにアシストしてくれるWebアプリケーションです。
※ 本記事はLinuxもしくはPC-UNIXの基本的な操作や設定方法を把握している読者を対象に書かれています。
Raspberry Pi セットアップ
何はなくとも、買ってきた本体を設定するところから始めなければなりません。長くなるので DocBase にまとめました。
Raspberry Piメモ – DocBase
Linuxを使ったことがあれば難しいところはありません。また、事例集なんかも書いてあるので、ご興味ある方は是非ご覧ください。
※ 内容について動作を保証するものではありません。各自の責任の下で実行をお願いします。
MySQL インストール
$ sudo apt-get install mysql-server libmysqlclient-dev
MySQLの初期設定は記述を省きます。適宜ユーザとデータベースを作成しましょう。Debianってパッケージインストール中にMySQLの管理者ユーザのパスワード初期設定できるんですね。新鮮でした。
今回使うためにデータベースを適宜作成しておきましょう。create database kptboard default character set utf8;
でいいと思います。
Ruby インストール
RASPBIANに標準で入ってるバージョンは1.9.1で古いので、rbenvを入れて最新版を導入します。
rbenv インストール
https://github.com/sstephenson/rbenv#installation
https://github.com/sstephenson/ruby-build#readme
上記通りにrbenvとruby-buildをインストールします。
これで、rbenvからRubyをバージョン指定でインストールする用意ができました。
$ rbenv install --list
で表示されるバージョンのRubyをインストールできます。
Ruby 2.2.0 インストール
今回は 2.2.0 を使うことにします。
$ export MAKE_OPTS="-j4"
$ rbenv install 2.2.0
1行目でmakeにクアッドコアであることを伝えるオプションを設定しています。~/.bashrcに書いておいてもいいでしょう。実行中、別セッションでtopコマンドを実行し1を押すと、ビルド中に全CPUコアを活用してくれることが確認できました。
%Cpu0 : 97.0 us, 2.3 sy, 0.0 ni, 0.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu1 : 97.0 us, 3.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 96.4 us, 3.3 sy, 0.0 ni, 0.0 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 97.0 us, 3.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
それでもインストール完了まで非常に時間がかかります。実測47分でした。気長に待ちましょう。終わったら $ rbenv global 2.2.0
で今のログインユーザのデフォルトバージョンを2.2.0に設定します。
ここまで来たら、動作を確認します。以下のように2.2.0が確認できればOKです。
$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [armv7l-linux-eabihf]
Bundlerインストール
$ gem install bundler
Rails セットアップ
今回 /var/www/vhosts/kptboard 以下に置くとして、以下のように設置します。
$ git clone git@github.com:f96q/kptboard.git /var/www/vhosts/kptboard
$ cd /var/www/vhosts/kptboard
$ bundle install
bundle install が遅いです。強力なx86マシンと比べるのは酷ですが、遅いです。遅すぎて一部Gemのインストールがタイムアウト(?)して落ちましたが、再実行で解決しました。自分だけでしょうか。
また、後から知りましたが、bundlerに-jオプションを渡すことでインストールを並列化できるそうです。
Ruby 各インストールコマンド高速(並列)化まとめ – Qiita
$ bundle install -j4
config/database.yml を設定する
パッケージで入れたMySQLのSocketファイルの場所はデフォルトだと /var/run/mysqld/mysqld.sock です。(わざわざこれを書いたのは、自分が普段Debian使ってないのでちょっと探しちゃったからです)
readline足りない対策
マイグレーションで下記のエラーになります。
$ bundle exec rake db:migrate
rake aborted!
LoadError: cannot load such file -- readline
rails consoleで `require’: cannot load such file — readlineになる件
に書かれた通り、Gemfileにrb-readlineを追記して対処しました。
Rails起動
まずはdevelopmentモードで起動しましょう。
$ RAILS_ENV=development bundle exec rails s
=> Booting Thin
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Thin web server (v1.6.3 codename Protein Powder)
Maximum connections set to 1024
Listening on localhost:3000, CTRL+C to stop
Started HEAD "/" for 127.0.0.1 at 2015-02-24 11:25:10 +0900
ActiveRecord::SchemaMigration Load (1.5ms) SELECT `schema_migrations`.* FROM `schema_migrations`
Processing by RetrospectivesController#index as */*
Completed 401 Unauthorized in 302ms
うまく起動しました。
しかし……
ログを見ていると、ログインフォームを表示させようとしただけで Segmentation fault を告げてRailsが落ちます。
Started GET "/users/sign_in" for 127.0.0.1 at 2015-02-24 12:16:45 +0900
Processing by Users::SessionsController#new as */*
Rendered users/shared/_links.haml (74.8ms)
Rendered users/sessions/new.html.haml within layouts/application (217.9ms)
/home/pi/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/therubyracer-0.12.1/lib/v8/context.rb:99: [BUG] Segmentation fault at 0x30c124
ruby 2.2.0p0 (2014-12-25 revision 49005) [armv7l-linux-eabihf]
-- Control frame information -----------------------------------------------
c:0198 p:---- s:0988 e:000987 CFUNC :Run
どうやら TheRubyRacer が原因で落ちている模様。Gemのバージョンを指定したり色々対策してみましたが、ARMv7環境では解決していないようです。
TheRubyRacer 0.12.1 Segmentation Fault #317
仕方ないので Gemfile から therubyracer の記述を削除して、別途JSの実行エンジンとしてNode.jsをインストールしました。
ExecJS
$ sudo apt-get install nodejs
その後、 bundle install を再実行すれば完了です。bundle exec rake assets:precompile も通りました。
動いた!
以上の作業を経て、無事Railsが動作するようになりました。Nginxもインストールした結果のスクリーンショットはこんな感じです。
残念ながら Raspbian のパッケージリポジトリに用意されているNginxはバージョンが古いため、KPTBoardが要求するWebsocketのプロキシができません。Apacheと組み合わせるなど別の案を考える必要があります。
ここまで紆余曲折はありましたが、作業自体はx86ベースのPC環境と同じように作業を進められることがご理解いただけたかと思います。繰り返しますが、これでたったの $35 です。
ほか、どんなことに使えるの?
AirPlayサーバとしてリモートから音楽を再生させる環境なんかはすぐに作れました。上の写真はAndroidからAirPlayできるソフトを使っていますが、当然iOSでも同じ事ができます。
USBに接続するDACやアンプは様々なものが市販されていますので、Raspberry Piと組み合わせてオーディオシステムにするのも簡単です。
他にも、スマホから操作できる赤外線リモコンにしたり、音楽を詰め込んでジュークボックスにしていたり、色々な人が色々な使い方をしているようです。DocBaseに具体的な方法を載せている事例をまとめてみました。
Raspberry Pi Cookbook まとめ – DocBase
Raspberry PiのDIY文化
Raspberry Piの大きな特長・強みとして、外部ハードウェアと接続できるGPIOピンが用意されていることが挙げられます。これがRaspberry Piを「ただの小型PC」から一歩抜きんでた存在とし、多くの人を惹きつけている原因の一つではないでしょうか。
イギリスではトラックの運転手が自分でトラックの追跡システムを作成したそうです。かっこいい!
Make: Japan | Raspberry Piで大型トラックの追跡システムを作ったトラック野郎
ちなみに、自分はどうにか高輝度LEDを光らせることができたところです。まだまだ基本的なところで試行錯誤しています。
最後に
IoTだとか、フィジカルコンピューティングだとか色々な言葉で今のムーブメントが語られていますが、自分は「ホビイストの手にコンピュータが戻ってきた」というのが大きいと思っています。
勿論、ソフトウェアであれば今までもオープンソースがこれだけ浸透し、一般の人々の手にあるのは確かです。ArduinoやRaspberry Piの出現はそれを更に押し進めて、ハードウェアまで含めて自由な環境を提供してくれました。これからが楽しみです。
あ、書き忘れましたが Raspberry Pi をお求めの方は下記リンクからどうぞ。2015年2月現在、届くまで2週間くらいかかります……。
宣伝
チームのための情報共有サービス DocBase がベータ公開中で無料で使えます。
DocBaseとは
DocBaseは、1人の知識がチーム全員の知識となり、チームが力を最大限発揮できるようにするための情報共有サービスです。
DocBaseはドキュメント共有のためだけのツールではありません。
メモという形で、様々な情報をチームに共有できます。気になるニュースやブログをブラウザから簡単に共有したり、ビジュアルイメージを展開したり、参考となるスライドや動画を共有したりできます。
詳しくはこちらから。
https://kray.jp/news/docbase_beta
このエントリーに対するコメント
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
「いいね!」で応援よろしくお願いします!