VirtualBox UbuntuにNervesをインストールしてみる

軽~い乗りで…

何故か福岡界隈で流行っているElixir。その組込み版/IOT版のNervesを、軽~い乗りでVirtualBox下のUbuntuにインストールしてみようと始めたが…その備忘録(涙)

超個人的な難所

いきなり個人的な難所の話である(汗)

Nervesのビルドツールのインストールは、個人的には3度目の作業なので予定通りスイスイ。。 が、想定内とは言え、VirtualBoxに周辺デバイスを繋ぐ設定で躓き転びまくった(>_<)。VirtualBoxウィザードにとっては何でもないissueなんだろうなぁ。残念ながら、こちとらVirtualBox初心者でい。

Nervesは、今の所 Raspberry PiシリーズとBeagleBoneシリーズのボードと共に遊べる。手元にレトロな Raspberry Pi Bが転がっていたので、これを使うことにしたのだが…

  1. Pi Bのシステムとして SDカードにNervesを焼く必要がある
  2. Pi BとホストPCを繋いで遊ぶために、ホストPC内臓の有線LANアダプタを使いたい[*1]

↑これってVirtualBoxにどう設定すれば良いのよ(- -;)

[*1] "WifiでHome内LANに参加すれば良いじゃないか"と言う親切なご意見は、我が家の劣悪な無線環境ならびに適当な無線LANドングルが無いと言うことで却下である

VirtualBoxゲストOSの基本設定

VirtualBoxデフォールトの設定のままでゲストOSを使うと、あまりにもレスポンスが遅い。「おや、僕の(あたしの)PCは、仮想マシンを動かすにはパワー不足なのね。買い換えなきゃ」と間違った納得をする前に[*2]、VirtualBoxゲストOSのシステム/ディスプレイの設定をチューニングすべしd( ̄▽ ̄)

  1. Oracle VM VirtualBox マネージャー]でゲストOSをマウス選択。
  2. 右クリックでコンテキストメニューから[設定]を選び、設定ダイアログを開く。
  3. [システム]の[マザーボード]タブでメイメモリーの容量(2GBぐらい)、[プロセッサー]タブでプロセッサー数(2つぐらい)を、
  4. [ディスプレイ]の[スクリーン]タブでビデオメモリー(128MBいっちゃえ)を好みにチューニングしよう。

つまり、リッチなPCではより贅沢に、プアーなPCでは我慢できる所まで贅肉を落としてと言うことねd(^^)

[*2]久しぶりにVirtualBoxにゲストOSをインストールしたので、危うく間違った納得をするところだった(^^;)

f:id:MrShoz:20190713122436p:plain f:id:MrShoz:20190713122737p:plain f:id:MrShoz:20190713122816p:plain

Nervesのビルドツールをインストール

ここはサラッと…いやホント、一点を除き嵌る所がない。基本的に、Nerves Projectに掲載のInstallationに沿って作業を進めればオッケー。

あっ、その前に。Nervesのビルドツールはasdf-vmと言うCLI Version Managementユーティリティ(?)の中にインストールする。そうその通り、裸のUbuntuへのErlangやらElixirやらのインストールは不要…より正確には無駄( ̄▽ ̄;)[*3]

[*3]つい最近までそのことに気付かなかった、わ・た・く・し orz

さぁ、VirtualBoxUbuntuを起動して、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

おっと、fwupCLIでサクッとインストールできないので、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をインストールしておく。バージョンを間違えないよーに。

  1. SDカードをセットしたSDカードリーダーをUSBポートに挿入する
  2. ゲストOSの設定から[USB]を選び、使用するUSBバージョン(2.0以上)のラジオボタンをチェックする
  3. USBデバイスフィルター・ペインの右にあるボタンのうち、フィルター追加のボタンを押す
  4. 認識済みのデバイスの一覧が表示されるので、SDカードらしきものを選択して登録する
  5. ゲストOSを起動し、メニューの[デバイス][USB]からSDカードに選択チェックを入れる

f:id:MrShoz:20190713145718p:plain f:id:MrShoz:20190713150656p:plain

SDカードをリーダーに挿入すると、ゲストOSが自動的に認識/マウントする上に、mix burnもちゃんとSDカード見つけてくれる。賢いなぁ(≧▽≦)

難所2. PCのWifiはそのままで、もう一つの有線LANを Pi Bとクロスケーブルで繋ぎ、ローカルなネットワークにしたいんだけど?

そう、いたって個人的でわがままな要求である。こんなクライアントは、「システムは出来るだけシンプルにした方が、初期費用もランニング・コストも安くなるので、Wifiに統一しましょう」とやんわりと誘導する対象である。だが今回は不幸なことに、クライアントとデベロッパーが同一人物なのである。行く所まで行ってしまうのだ( ̄▽ ̄)v

ネットワーク系は造語(?)だらけで苦手なのだが…
VirtualBoxでは、ゲストOSは仮想ネットワークアダプターを経由して、ホストOSの実ネットワークアダプターに繋がっているらしい。デフォールトでは、仮想アダプターが一つ登録されており、これがNATによって実アダプターに繋がっている様だ。と言うことは、もう一つ仮想アダプタを用意し、有線LANアダプタに専属的に繋いでしまえば良いではないか…解決。楽勝(^^)
とはいかなかった(汗)。方向性はあっていたものの、NAT/NATネットワーク/ブリッジアダプター/内部ネットワーク/ホストオンリーアダプター/汎用ドライバーと、苦手とする造語らの攻撃。名前からは何者かよく分からない選択子が待ち構えていた。負けてなるものかと歯を食いしばって、いろいろ調べたり試行錯誤したりの結果、どうやらブリッジアダプターが今回の要求(わがまま)を満たすようだとわかった。わがままの勝利!!!

f:id:MrShoz:20190713155342p:plain


こうしてみると、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がインストールされた binフォルダをPATHに追加するのを忘れないように!

その他に必要なものは、

です。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生活を満喫しましょう。

*1:たぶんVisual C++ 2010,2012でも同じでしょう。

*2:GCCでもビルドする場合は、ファイルセットの外に置いて、vs2012.rakeを修正しましょう。この"stdint.h"はwindows専用だと叱られます。

*3:コンパイル・オプション/MDdを外すなりしてマニフェストが出ないようにするとか...

Scratchの日本語情報リソース

http://www.manning.com/marji/
積読していた"Programming with Scratch"を読み始めました。

Scratchは子供たちに、自在にコンピュータをプログラミングできるパワフルな道具を与えることで、子供たちの創造性を伸ばし知的なイノベーションを起こすことを狙ったプログラミング言語(環境)です*1。Scratchは所謂タイルプログラミング型のプログラミング言語で、ビジュアルかつカラフルで、楽しく簡単にプログラミングできます。姉妹にSqueakAndroidApp Inventorがいますね。

本を読み始めたのを機会に、Scratchの日本語の情報リソースをネットで調べてみました。

*1:MITのシーモア・パパート(LOGO)⇒アラン・ケイ(Smalltalk/Squeak)⇒ミッチェル・レズニック(Scratch)の潮流

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

Single Page Web Applications: JavaScript End-To-End

ジュード・ジ・オブスキュアの二番花 + 驚異のニーム

ジュード・ジ・オブスキュアの二番花が咲きました。今度は、ほんのりピンクが入った花です。黄色系が強いバラと思っていたのでチョットした驚きです。香りは一番花よりも弱くなっているかな。秋の花はどうなるのか楽しみです。

クレア・オースチンも二番花を咲かせましたが、困ったことに葉にアブラムシがいっぱい付くようになりました。オーガニック・ローズ志向なので、農薬は使いたくないし、手で潰していたらキリがないし、どうしようかと思案していたところ、近くのホームセンターで「驚異のパワーニーム虫よさらば」なるスプレーが目に留まり買ってみました。半信半疑でクレア・オースチンにたっぷりと吹き掛けると、二三日でアブラムシは姿を消し驚きです。う〜む、如何にも怪しげなネーミングなんだけどなぁ。
《注意》ニームって生姜(?)くさいです。
 

import antigravity

最近、Linkedinの"Python Community"を徘徊しています。
そこのAldo Ceccarelliさんが始めたディスカッションで、Pythonに"antigravity"(反重力?!%)なるモジュールがあることを知りました。

import antigravity

aha! これってFUNNYだね。