VirtualBox UbuntuにNervesをインストールしてみる
軽~い乗りで…
何故か福岡界隈で流行っているElixir。その組込み版/IOT版のNervesを、軽~い乗りでVirtualBox下のUbuntuにインストールしてみようと始めたが…その備忘録(涙)
超個人的な難所
いきなり個人的な難所の話である(汗)
Nervesのビルドツールのインストールは、個人的には3度目の作業なので予定通りスイスイ。。 が、想定内とは言え、VirtualBoxに周辺デバイスを繋ぐ設定で躓き転びまくった(>_<)。VirtualBoxウィザードにとっては何でもないissueなんだろうなぁ。残念ながら、こちとらVirtualBox初心者でい。
Nervesは、今の所 Raspberry PiシリーズとBeagleBoneシリーズのボードと共に遊べる。手元にレトロな Raspberry Pi Bが転がっていたので、これを使うことにしたのだが…
- Pi Bのシステムとして SDカードにNervesを焼く必要がある
- Pi BとホストPCを繋いで遊ぶために、ホストPC内臓の有線LANアダプタを使いたい[*1]
↑これってVirtualBoxにどう設定すれば良いのよ(- -;)
[*1] "WifiでHome内LANに参加すれば良いじゃないか"と言う親切なご意見は、我が家の劣悪な無線環境ならびに適当な無線LANドングルが無いと言うことで却下である
VirtualBoxゲストOSの基本設定
VirtualBoxのデフォールトの設定のままでゲストOSを使うと、あまりにもレスポンスが遅い。「おや、僕の(あたしの)PCは、仮想マシンを動かすにはパワー不足なのね。買い換えなきゃ」と間違った納得をする前に[*2]、VirtualBoxゲストOSのシステム/ディスプレイの設定をチューニングすべしd( ̄▽ ̄)
- [Oracle VM VirtualBox マネージャー]でゲストOSをマウス選択。
- 右クリックでコンテキストメニューから[設定]を選び、設定ダイアログを開く。
- [システム]の[マザーボード]タブでメイメモリーの容量(2GBぐらい)、[プロセッサー]タブでプロセッサー数(2つぐらい)を、
- [ディスプレイ]の[スクリーン]タブでビデオメモリー(128MBいっちゃえ)を好みにチューニングしよう。
つまり、リッチなPCではより贅沢に、プアーなPCでは我慢できる所まで贅肉を落としてと言うことねd(^^)
[*2]久しぶりにVirtualBoxにゲストOSをインストールしたので、危うく間違った納得をするところだった(^^;)
Nervesのビルドツールをインストール
ここはサラッと…いやホント、一点を除き嵌る所がない。基本的に、Nerves Projectに掲載のInstallationに沿って作業を進めればオッケー。
あっ、その前に。Nervesのビルドツールはasdf-vmと言うCLI Version Managementユーティリティ(?)の中にインストールする。そうその通り、裸のUbuntuへのErlangやらElixirやらのインストールは不要…より正確には無駄( ̄▽ ̄;)[*3]
[*3]つい最近までそのことに気付かなかった、わ・た・く・し orz
さぁ、VirtualBoxでUbuntuを起動して、Nervesをインストールしよう。デスクトップで端末を一つ開き、後はひたすら下のコマンドを実行するのだ。
> sudo apt install build-essential automake autoconf git squashfs-tools ssh-askpass > sudo apt install libssl-dev libncurses5-dev bc m4 unzip cmake python
おっと、fwupはCLIでサクッとインストールできないので、debパッケージをダウンロードしてからインストールすることになる
> git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.1 > echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc > echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc > source ~/.bashrc
↑ここが唯一の落とし穴(^_-)。
Nerves-Installationでは、asdfの起動スクリプトを .bash_profileに追記せよとなっているが、Ubuntuは .bash_profileを無視しているのだ。.bash_profileに追記した場合は、新たな端末を開く度に、「mixぅ、そんなの知らねぇよ」と言われてしまう。小まめな人は、毎回sourceほにゃららを実行するかも知れないが、あたしゃそんなのまっぴら御免
で、正解は .bashrcに追記。なにせ asdf-vm本家のInstallationにはそう書いてある。きっと、やさしく書いてある2次、3次...n次情報ばかりに頼って、1次情報を調べようとしない我々への戒めだなd( ̄▽ ̄)
> asdf plugin-add erlang > asdf plugin-add elixir > asdf install erlang 22.0.4 > asdf install elixir 1.9.0-otp-22 > asdf global erlang 22.0.4 > asdf global elixir 1.9.0-otp-22 > mix local.hex > mix local.rebar > mix archive.install hex nerves_bootstrap
これでNervesのビルドツールのインストールは完了。おつかれさまぁ~(^^)/
ん? いつの間にかNervesのバージョンがv1.5.0(erlang 22.0.4/elixir 1.9.0-otp-22?)に上がってる!!
難所を攻略する
わたくし的には、ここからが本題(汗)
難所1. VirtualBoxゲストOSからSDカードリーダーを使える様にするにはどうすりゃいいの?
ノートPCにはSDカードリーダーが付いている。故に、きっとこれを使うんだ、そうに違いない、間違いない、と思うのは人情である。
で、あれこれ調べて、VirtualBox付属のVBoxManageと言うツールを使って SDドライブのvmdkを作れば、ゲストOSにHDDとしてマウントすることが出来るということを突き止めた。早速、手順書通りにやってみたが…何だかおかしい。SDカードをリーダーから外すと2度と認識しなくなる??? そう、察しの良い人は気付いたと思うが、どうやらvmdkは固定ドライブを追加する為のものの様だ(間違ってるかも汗)。頻繁にSDカードを抜き差しする今回の用途には使えないらしい(T_T)
結局、見つけた対策は、USBポートに外付けでSDカードリーダを繋ぐことだった(- -;)
素のVirtualBoxではUSB 1.1しか扱えないので、まず最初にVirtualBox Extension Packをインストールしておく。バージョンを間違えないよーに。
- SDカードをセットしたSDカードリーダーをUSBポートに挿入する
- ゲストOSの設定から[USB]を選び、使用するUSBバージョン(2.0以上)のラジオボタンをチェックする
- USBデバイスフィルター・ペインの右にあるボタンのうち、フィルター追加のボタンを押す
- 認識済みのデバイスの一覧が表示されるので、SDカードらしきものを選択して登録する
- ゲストOSを起動し、メニューの[デバイス][USB]からSDカードに選択チェックを入れる
SDカードをリーダーに挿入すると、ゲストOSが自動的に認識/マウントする上に、mix burnもちゃんとSDカード見つけてくれる。賢いなぁ(≧▽≦)
難所2. PCのWifiはそのままで、もう一つの有線LANを Pi Bとクロスケーブルで繋ぎ、ローカルなネットワークにしたいんだけど?
そう、いたって個人的でわがままな要求である。こんなクライアントは、「システムは出来るだけシンプルにした方が、初期費用もランニング・コストも安くなるので、Wifiに統一しましょう」とやんわりと誘導する対象である。だが今回は不幸なことに、クライアントとデベロッパーが同一人物なのである。行く所まで行ってしまうのだ( ̄▽ ̄)v
ネットワーク系は造語(?)だらけで苦手なのだが…
VirtualBoxでは、ゲストOSは仮想ネットワークアダプターを経由して、ホストOSの実ネットワークアダプターに繋がっているらしい。デフォールトでは、仮想アダプターが一つ登録されており、これがNATによって実アダプターに繋がっている様だ。と言うことは、もう一つ仮想アダプタを用意し、有線LANアダプタに専属的に繋いでしまえば良いではないか…解決。楽勝(^^)
とはいかなかった(汗)。方向性はあっていたものの、NAT/NATネットワーク/ブリッジアダプター/内部ネットワーク/ホストオンリーアダプター/汎用ドライバーと、苦手とする造語らの攻撃。名前からは何者かよく分からない選択子が待ち構えていた。負けてなるものかと歯を食いしばって、いろいろ調べたり試行錯誤したりの結果、どうやらブリッジアダプターが今回の要求(わがまま)を満たすようだとわかった。わがままの勝利!!!
こうしてみると、Nervesのインストールと言うよりも、VirtualBoxと戯れていると言う結果となった。「なんだかなぁ」と思う今の気持ちを忘れないように、この備忘録にしたためておこう(^_-)
労多くして…
Pythonで「なのぼ~どAG」
「ちっちゃいものくらぶ」さんの"なのぼ~どAG"を、Pythonで遊ぶためのモジュールを作ってみました。"なのぼ"が持つ各種センサの読み取りと、モーター一個の回転を制御をすることができます。
"なのぼ"の作り方やPCとの繋ぎ方は、
こちらをどうぞ⇒なのぼ~どAGの作り方(2012年7月以降分) « ちっちゃいものくらぶ
#!/usr/local/bin/python # -*- coding: utf-8 -*- ################################################################################ # NanoBoardAG.py # Description: なのぼ~どAG用モジュール # # Author: shozo fukuda # Date: Mon Aug 11 08:31:02 2014 # Application: Python 2.7.6 # #<参考文献>##################################################################### # # 1)Scratch Board Technical Information # http://www.etecaprigio.com.br/scratch/ScratchBoard_Tech_InfoR2.pdf # 2)なのぼ~どAG最新ファームウエア # http://tiisai.dip.jp/wordpress/wp-content/uploads/NanoBoardAGWithMotorTrio_diag_sonerm412.zip # 3)なのぼ~どAG用Scratch - NanoBoardAGWithMotor.cs # http://squeakland.jp/abee/tmp/NanoBoardAGWithMotor.zip # ################################################################################ #<IMPORT> import serial import struct class NanoBoardAG: """ なのぼ~どAG ドライバ """ def __init__(self, com=4): """ NanoBoardAGが接続されているシリアルポートを開き、初期化する """ self.port = serial.Serial(com, 38400, timeout=1) # 内部状態を初期化 self.id = 0 # ch15 self.sensor = [0,0,0,0,0,0,0,0] def send_cmd(self): """ NanoBoardにコマンドを送る """ self.port.write('\x00') def update(self): """ NanoBoardにコマンドを送り、状態をアップデートする """ # コマンド送信 self.port.flushInput() self.send_cmd() res = self.port.read(18) # センサ入力をデコードする for h in struct.unpack('>9H', res): ch = ((h & 0x7800) >> 11) val = ((h & 0x0700) >> 1) | (h & 0x007F) if ch == 15: self.id = val else: self.sensor[ch] = val # センサー読み取り @property def resistanceD(self): """ Ch 0: アナログ・チャネルD """ self.update() return round((100*self.sensor[0])/1023.0) @property def resistanceC(self): """ Ch 1: アナログ・チャネルC """ self.update() return round((100*self.sensor[1])/1023.0) @property def resistanceB(self): """ Ch 2: アナログ・チャネルB """ self.update() return round((100*self.sensor[2])/1023.0) @property def button(self): """ Ch 3: ボタン・スイッチ """ self.update() return (self.sensor[3] != 0) @property def resistanceA(self): """ Ch 4: アナログ・チャネルA """ self.update() return ((100*self.sensor[4])/1023.0) @property def light(self): """ Ch 5: 光センサ """ self.update() if self.sensor[5] < 25: return 100 - self.sensor[5] else: return round((1023 - self.sensor[5])*(75/998.0)) @property def sound(self): """ Ch 6: 音センサ― """ self.update() val = max(0, self.sensor[6] - 18) if val < 50: return val/2 else: return 25 + min(75, round((val - 50)*(75/580.0))) @property def slider(self): """ Ch7: スライダー """ self.update() return round((100*self.sensor[7])/1023.0) class NanoBoardAGMotor1(NanoBoardAG): """ なのぼ~どAG w/モーターひとつ用のドライバ """ def __init__(self, com=4): """ NanoBoardAGが接続されているシリアルポートを開く """ NanoBoardAG.__init__(self, com) self.run = False self.speed = 0 self.direction = 0 def send_cmd(self): """ NanoBoardにコマンドを送る """ if self.run: self.port.write(chr((self.direction << 7) | int(0x7f * self.speed/100.0))) else: self.port.write('\x00') # モーター制御 def motorOn(self): """ モーター回転ON """ self.run = True self.update() def motorOff(self): """ モーター回転OFF """ self.run = False self.update() def motorDirection(self, direction): """ モーターの回転方向を設定する 0:正回転, 1:逆回転, 2:反転 """ if direction == 0: self.direction = 0 elif direction == 1: self.direction = 1 elif direction == 2: self.direction ^= 1 self.update() def motorSpeed(self, speed): """ モーターのスピードを設定する """ if speed < 0: self.speed = 0 elif speed > 100: self.speed = 100 else: self.speed = speed self.update() if __name__ == '__main__': nano = NanoBoardAGMotor1() print nano.slider nano.motorSpeed(50) nano.motorOn()
mrubyをVisual C++でビルドしてみました-再び
久しぶりにmrubyのGitHubリポジトリを訪れたら、おやっ!ビルド・ツールが CMakeから Rake(minirake)に代わっているではないですか。早速、新しいファイルセットを取ってきて Visual C++ 2008*1でビルドして見ました。備忘ログしておきます。
以下の説明では、mrubyファイルセットのルート・フォルダをmruby_localとします。
必要なものを集めましょう
まず最初に、必要なツール類をネットから集めましょう。何はともあれ必要なのは、Rubyです。これがないとRakeでビルドできません。
- Ruby for windows => http://rubyinstaller.org/の"RubyInstaller 1.9.3-p385 released"
あたりの活きの良いのをダウンロードしてインストールします。おっと、Rubyがインストールされた binフォルダをPATHに追加するのを忘れないように!
その他に必要なものは、
- Bison ⇒ Bison for Windows の"Complete package, except sources"
- Gperf ⇒ Gperf for Windowsの"Complete package, except sources"
- stdint.h ⇒ http://code.google.com/p/msinttypes/downloads/list の"msinttypes-r26.zip"
です。BisonとGperfはインストーラー付きなので、ダウンロードしたファイルを実行してインストールします。stdint.hは、ダウンロードしたzipファイルを解凍して、取り敢えずmruby_local/includeにコピーします*2。
以上で準備完了です。
Rakeでビルドしよう
ビルドは、CMakeと比べると拍子抜けするほど簡単です。
まず、ビルド設定を修正します。mruby_local/build_config.rbをエディタで編集して、toolcainを"gcc"から"vs2012"に書き換えます。
# load specific toolchain settings toolchain :vs2012
あとは、コマンド・ウインドでおもむろに
> ruby ./minirake
を実行すると、あれよあれよとビルドが進みます。最後に
================================================ Config Name: host Output Directory: build/host Binaries: mruby, mrbc, mirb ================================================
というメッセージが表示されればビルドは成功です…たぶん(^^;>。途中、ワーニングがばらばらと出てきますが、気にしなくても良さそうです。出来上がった実行ファイルは mruby_local/build/binに格納されています。えっと、Windowsのバージョンによってはマニフェスト・ファイルが出力されるので、手作業でマニフェストを実行ファイルにマージするなり、はたまたmruby_local/tasks/toolchains/vs2012.rakeをいじくって*3対処するなりして下さい。
でも、ビルドが正しく出来ているかどうか心配ですよね。ご安心あれ、同梱の回帰テスト(?)で確かめることができます。コマンド・ウインドで
> ruby ./minirake test
を実行しましょう。ビルドが正常なら下記の様なメッセージが表示されます。
mrbtest - Embeddable Ruby Test This is a very early version, please test and report errors. Thanks :) ................................................................................ ................................................................................ ................................................................................ ................................................................................ ................................................................................ ................................................................................ ........................................ Total: 520 OK: 520 KO: 0 Crash: 0 Time: 4.000002 seconds
はい!お終い。
あとは windowsで素敵なmruby生活を満喫しましょう。
Scratchの日本語情報リソース
積読していた"Programming with Scratch"を読み始めました。
Scratchは子供たちに、自在にコンピュータをプログラミングできるパワフルな道具を与えることで、子供たちの創造性を伸ばし知的なイノベーションを起こすことを狙ったプログラミング言語(環境)です*1。Scratchは所謂タイルプログラミング型のプログラミング言語で、ビジュアルかつカラフルで、楽しく簡単にプログラミングできます。姉妹にSqueakやAndroidのApp Inventorがいますね。
本を読み始めたのを機会に、Scratchの日本語の情報リソースをネットで調べてみました。
- オフィシャル/ボランティア・サイト
- OtOMO - 日本のオフィシャル・サイトかな?
- キッズクリエイティブ研究所 - 子供たち向けのいろんなワークショップをやっているようです
- みんなでたのしくスクイーク - 本家スクイークEtoysのScratchセクション
- チュートリアル
- スクラッチ入門 - オーソドックスなクイック・ツアー(高校生以上向きかな)
- 非プログラマのためのプログラミング講座 - ITちゃんの枕投げゲームをつくります
- スクラッチでプログラミング - 親子でわかるプログラミング、ゲームづくり
- SCRATCH WEEKLY - シューティング・ゲームをつくります
- アドバンスド・トピックス
- Scratchプログラミングの魅力 - オブジェクト指向や並列プログラミングなどプログラマー寄りの記事
- Scratch+Arduino - ScratchとArduinoを繋ぐ記事
Manningブックのハロウィン・ディスカウント・セール
今年もManning PublicationsのHalloweenディスカウントセール(10月26日〜31日)が始まりました。Manning Pubnsのホームページで、日替わりでeBookやpBookが50%引きのお得なお値段で買えるチャンスです。"In Action"シリーズが好きな人は必見です。
で、またもや下のMEAP本を衝動買いしてしまいました。
Single Page Web Applications
CONTENTS PART 1: PREPARING THE FOUNDATION 1. Building single page applications 2. Reintroducing JavaScript PART 2: CREATING THE CLIENT 3. Develop the shell 4. Add feature modules 5. Browser model 6. Browser database and the data layer PART 3: BUILDING THE SERVER 7. The web server 8. The server database 9. Ready the application for production APPENDIXES A. JavaScript coding standards
Single Page Web Applications: JavaScript End-To-End
- 作者: Michael S. Mikowski,Josh C. Powell
- 出版社/メーカー: Manning Pubns Co
- 発売日: 2013/09/27
- メディア: ペーパーバック
- クリック: 4回
- この商品を含むブログ (1件) を見る
ジュード・ジ・オブスキュアの二番花 + 驚異のニーム
ジュード・ジ・オブスキュアの二番花が咲きました。今度は、ほんのりピンクが入った花です。黄色系が強いバラと思っていたのでチョットした驚きです。香りは一番花よりも弱くなっているかな。秋の花はどうなるのか楽しみです。
クレア・オースチンも二番花を咲かせましたが、困ったことに葉にアブラムシがいっぱい付くようになりました。オーガニック・ローズ志向なので、農薬は使いたくないし、手で潰していたらキリがないし、どうしようかと思案していたところ、近くのホームセンターで「驚異のパワーニーム虫よさらば」なるスプレーが目に留まり買ってみました。半信半疑でクレア・オースチンにたっぷりと吹き掛けると、二三日でアブラムシは姿を消し驚きです。う〜む、如何にも怪しげなネーミングなんだけどなぁ。
《注意》ニームって生姜(?)くさいです。