Intel EdsionでNode.jsのサーバを動かす
続いて、Node.js + expressでWebサーバを立ち上げてみます
パッケージマネージャの更新
Yoctoではapt-getとかではなく、opkgというパッケージマネージャを使うようです。これを最新にしておきます。 こちらを参考に
# cd /etc/opkg # curl http://nonnoise.github.io/Edison/_sources/Edison/base-feeds.conf # curl http://nonnoise.github.io/Edison/_sources/Edison/intel-iotdk.conf # curl http://nonnoise.github.io/Edison/_sources/Edison/mraa-upm.conf
アップデートしておきます
# opkg update # opkg upgrade
Node.jsの確認
とりあえずコマンド叩いてみましょう
# node > (^C again to quit) >
間違いなくNode.jsが入ってます。バージョンは
# node -v v0.10.28
そして、Nodeのパッケージマネージャであるnpmも入ってます
# npm Usage: npm <command> where <command> is one of: add-user, adduser, apihelp, author, bin, bugs, c, cache, completion, config, ddp, dedupe, deprecate, docs, edit, explore, faq, find, find-dupes, get, help, help-search, home, i, info, init, install, isntall, issues, la, link, list, ll, ln, login, ls, outdated, owner, pack, prefix, prune, publish, r, rb, rebuild, remove, repo, restart, rm, root, run-script, s, se, search, set, show, shrinkwrap, star, stars, start, stop, submodule, t, tag, test, tst, un, uninstall, unlink, unpublish, unstar, up, update, v, version, view, whoami npm <cmd> -h quick help on <cmd> npm -l display full usage info npm faq commonly asked questions npm help <term> search for help on <term> npm help npm involved overview Specify configs in the ini-formatted file: /home/root/.npmrc or on the command line via: npm <command> --key value Config info can be viewed via: npm help config npm@1.4.9 /usr/lib/node_modules/npm
expressのインストール
npmが入っているので、npmでexpressをグローバルインストールします。
# npm install -g express
expressコマンドを使いたいのですが、そのままではパスが通っていません。どこにインストールされたのか調べます
# find / -name express /usr/lib/node_modules/iotkit-agent/node_modules/.bin/express /usr/lib/node_modules/iotkit-agent/node_modules/express /usr/lib/node_modules/iotkit-agent/node_modules/express/bin/express
どうやらグローバルインストールされたコマンドは.bin以下にシンボリックリンクが配置されるようなので、ここにパスを通します。ただしYoctoでは".bashrc"とか".bash_profile"ではなく、".profile"を読み込むようなので、ホームディレクトリに".profile"ファイルを作成して、そこにexportでパスを追加します。vimも無いようで、viエディタを使います。
# vi .profile
.profileにパスを追加します
export PATH=/usr/lib/node_modules/iotkit-agent/node_modules/.bin:$PATH
読み込み直します(rebootしてちゃんと読み込まれることを確認した方がいいでしょう)
# source .profile
パスを見てみます
# echo $PATH /usr/lib/node_modules/iotkit-agent/node_modules/.bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
expressでNode.jsサーバを作成
ここまで出来たら、あとはカンタンです。expressでフレームワークを生成して、Nodeを起動するだけです。テンプレートエンジンはejsを使います。
# express -e server create : server create : server/package.json create : server/app.js create : server/public create : server/public/javascripts create : server/public/images create : server/public/stylesheets create : server/public/stylesheets/style.css create : server/routes create : server/routes/index.js create : server/routes/user.js create : server/views create : server/views/index.ejs install dependencies: $ cd server && npm install run the app: $ node app # cd server && npm install # node app.js
ifconfigで調べたEdisonのIPアドレスにポート3000でアクセスしてみましょう。
というわけで、カンタンにWebサーバを起動させることができます。
Intel Edisonのセットアップ
買おうかどうしようか考えていましたが、なぜか手元にあるので、セットアップを備忘録的にまとめておきます。
Intel Edsionとは
IntelがIoT向けに発表した超小型でLinuxが動作するチップセット。購入して動かすには単体購入だけでは面倒なため、どちらかの拡張ボードと一緒に購入することになります。
本体はArduino Unoと比較しても小さいですね。
今回はBreakout Board Kitを入手したので、そのセットアップを書いておきます。Breakout Boad Kitはこんな感じです
起動
2つのマイクロUSBケーブルを用意します。1本は電源取得用。もう1本はいわゆるデバッグシリアル用です。
デバッグシリアルはFTDIドライバが入っていれば認識します。Macのscreenコマンドでボーレートを115200に設定しておき、電源をつなぐとしばらくすると起動ログが流れます。
そしてログイン画面(デバイス名をすでに変えているのでedison0となっています) LinuxのディストリビューションはYocto Projectです
初期ログインは"root" パスワードはありません。
ファームウェアのアップデート
購入直後(2014/10/28)時点のファームでは、文字入力時に最初の1文字を取りこぼすなど、不安定なのでまずはファームウェアを書き換えて最新にします。
バーションは以下のコマンドで確認できます
# cat /etc/version edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19 <-- 書き換え後なので現時点の最新
Macでの書き換えはこのページに記述がありますが、以下に手順を
Edisonの電源をUSBケーブルでMacから取っていれば、Mac上にEdisonというUSBメモリがあるはずです。まずはその中味を全て削除しておきます。Mac上で
※削除コマンドは気をつけて下さい
$ cd /Volumes/Edison $ rm -rf * $ rm –rf \.*
ファームウェアはIntelの公式ページの最新版「Edison Yocto complete image」をダウンロードしてきます。てっきりイメージファイルかと思ったら、そうではありません。zipファイルを展開して、マウントされているEdisonのUSBメモリに展開されたファイルを全てコピーします。
今度はEdison上から、以下のコマンドでリブートさせつつ書き換えを行います
# reboot ota
自分の場合、2回リブートしたような気がしましたが、ファームウェアの更新が成功すれば、ログイン状態になります。書き換えが成功したかどうかは
# cat /etc/version
で確認しましょう。
セットアップ
最新の状態にしたら、Edisonの初期セットアップを行っておきます。設定項目は以下になります。
- Edisonのデバイス名を設定
- rootログインのパスワード設定
- WiFiの設定
セットアップ用のスクリプトが用意されているので、それを使います
# configure_edison --setup
以下設定画面(CUI)はこんな感じ
Configure Edison: Device Name Give this Edison a unique name. This will be used for the access point SSID and mDNS address. Make it at least five characters long (leave empty to skip): ----- Configure Edison: Device Password Enter a new password (leave empty to abort) This will be used to connect to the access point and login to the device. Password: *********** Please enter the password again: *********** ----- Configure Edison: WiFi Connection Scanning: 1 seconds leftt 0 : Rescan for networks 1 : Manually input a hidden SSID 2 : hogehoge 3 : fugafuga Enter 0 to rescan for networks. Enter 1 to input a hidden network SSID. Enter a number between 2 to 15 to choose one of the listed network SSIDs:
全ての設定が終了すると以下のメッセージが出ますので、まずはifonfigを叩いてIPアドレスが付与されているのを確認しておきましょう。
Initiating connection to honypod. Please wait... Attempting to enable network access, please check 'wpa_cli status' after a minute to confirm. Done. Please connect your laptop or PC to the same network as this device and go to http://192.168.**.** or http://edison0.local in your browser. root@edison0:~#
メッセージにもありますが、どうやら自動的にhttpサーバーが起動するようなのでアクセスしてみます。
設定したデバイス名とIPアドレスが表示されます
※どこかでSSHを有効にするかどうか聞かれたような気がするけど、覚えてない....
参考ページ
Intel Galileoはじめの一歩
やっとIntel Galileoが来たので、とりあえず最初にやっておくことひと通り
ファームウェアのアップデート
まずはファームウェアのアップデートをやっておかないとならないのですが、いきなりここでハマりました。3回くらいファームのアップロードをやってやっと成功。やり方がまずかったかもしれませんが、シリアルポートがハングアップすることがありました。
アップデートはなぜかGalileo用のArduino IDEから行います。まずはここからマシン環境にあったIntel Galileo Arduinoを落としてインストールします。いわゆる通常のArduino IDEは使用できないので注意です。Macの場合はドライバは必要ないようです。
起動したら設定を行う
Macの場合、どうやらここで「tty.XXX」ではなく、「cu.XXX」を選択しないとダメなようです。僕は最初「tty.XXX」を指定してやったらハングアップしました(^_^;)
さてファームウェアのアップデートを行います。ヘルプから「Firmware Update」を選択します。
こんな感じで警告がでます。ACアダプタをちゃんと挿しておきましょう。
OKを押すとファームウェアのアップデートが開始されます。
途中5分くらい掛かるよ。というメッセージに変わり、終了すると終了メッセージが出ます(スクショ忘れ)ちなみに実際には5分以上掛かっていました。かつ、アクセスランプの点滅等が無いので、ほぼ進行状況が掴めないという優しくない仕様・・・
(僕は最初tty.XXXを選択していたためか、ここで10分ほど放置した結果、ハングアップしてると判断して電源引っこ抜きました・・・)
Lチカで動作確認
ファームウェアのアップデートが完了したら、サンプルのLチカを実行してみます。Arduinoのメニューから「Blink」を選択して、ビルド・ダウンロードするだけです。
手前のグリーンのLEDがチカチカと点滅すればOKです
まとめ
まずはここまでやっておけば、あとはArduinoで何かすれば普通にできそうです。とはいえ、ただのArduino互換で使うには勿体無いというか、これ一応Quarkの開発ボードなので、メインはLinux動かしてなにかやる方だと思いますが。しかしこのQuarkチップは熱持ちすぎですね。触ると数秒で手を離すレベルです。これではCES2014で発表したIntel Edisonは熱とか大丈夫なんでしょうか?この発熱だととてもIoT用のチップとしては使えない気が・・・(´ε`;)ウーン…
とりあえず次は手元にあるArduinoシールド動かしてみるかな...
BeagleBone Blackにcloud9をインストールする
UbuntuをインストールしたBeagleBone Blackにcloud9 IDEをインストールしてみます。
cloud9 IDEとは
BeagleBone Blackに標準インストールのAngstrom上にプリインストールされている、Node.jsを利用したブラウザIDE環境です。今回はUbuntuに入れ替えてあるので、ここにcloud9 IEDを追加でインストールします。
cloud9 IDEのインストール
cloud9 IDEはgitihubに公開されていますので、これをインストールすれば動くはずです。
Requirements:
- NodeJS
>= 0.6.16
- NPM
>= 1.1.16
- libxml2-dev
となっていますが、すでにNode.jsは0.8.22をnodebrewを使ってインストール済みで、同時にNPMもインストールされているので、libxml2-devをインストールします。
$ sudo apt-get install libxml2-dev
次にcloud9をインストールします
$ git clone https://github.com/ajaxorg/cloud9.git $ cd cloud9 $ npm install
cloud9 IDEの起動
cloud9はデフォルトで起動すると、localhostからしかアクセスできないので、外部からブラウザ経由でアクセスするためには。以下のように起動します。
$ bin/cloud9.sh -l 0.0.0.0 make: Nothing to be done for `worker'. Linux ARM connect plugin start Connect server listening at http://0.0.0.0:3131 IDE SERVER PLUGIN: auth IDE SERVER PLUGIN: git IDE SERVER PLUGIN: gittools IDE SERVER PLUGIN: hg IDE SERVER PLUGIN: npm IDE SERVER PLUGIN: filelist IDE SERVER PLUGIN: search IDE SERVER PLUGIN: revisions IDE SERVER PLUGIN: settings IDE SERVER PLUGIN: shell IDE SERVER PLUGIN: state IDE SERVER PLUGIN: watcher IDE SERVER PLUGIN: node-runtime IDE SERVER PLUGIN: npm-runtime IDE SERVER PLUGIN: python-runtime IDE SERVER PLUGIN: apache-runtime IDE SERVER PLUGIN: ruby-runtime IDE SERVER PLUGIN: php-runtime Started '/home/ubuntu/cloud9/configs/default'! IDE server initialized. Listening on 0.0.0.0:3131
ポートは3131で起動していますので、BeagleBone BlackのIPアドレスを調べてアクセスしてみましょう。
LEDの点灯・消灯サンプル
clou9が起動したら、サンプルアプリを動かしてみましょう。「New File」で新規ファイルを作成します。led.jsとかファイル名を付けておきます。下記はBoneScriptを使って、LEDを制御するプログラムです。
/** * LED点灯、2秒後に消灯 */ var b = require('bonescript'); // LEDの設定 b.pinMode('USR0', b.OUTPUT); b.pinMode('USR1', b.OUTPUT); b.pinMode('USR2', b.OUTPUT); b.pinMode('USR3', b.OUTPUT); // LEDをONに b.digitalWrite('USR0', b.HIGH); b.digitalWrite('USR1', b.HIGH); b.digitalWrite('USR2', b.HIGH); b.digitalWrite('USR3', b.HIGH); // 2秒後にLEDをOFFに setTimeout(function() { b.digitalWrite('USR0', b.LOW); b.digitalWrite('USR1', b.LOW); b.digitalWrite('USR2', b.LOW); b.digitalWrite('USR3', b.LOW); }, 2000);
実行してみます。
Running Node Process Your code is running at 'http://0.0.0.0:21479'. Important: in your scripts, use 'process.env.PORT' as port and '0.0.0.0' as host. fs.js:338 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ Error: EACCES, permission denied '/sys/class/leds/beaglebone:green:usr0/trigger' at Object.fs.openSync (fs.js:338:18) at Object.fs.writeFileSync (fs.js:756:15) at Object.f.pinMode (/home/ubuntu/cloud9/node_modules/bonescript/index.js:132:20) at Object. (/home/ubuntu/cloud9/myScript/led1.js:7:3) at Module._compile (module.js:449:26) at Object.Module._extensions..js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.runMain (module.js:492:10) at process.startup.processNextTick.process._tickCallback (node.js:245:9)
どうやら、LEDへのアクセス権が無いということで怒られてしまいました....cloud9をroot権限で実行してやらないと、デバイスへのアクセスは出来ないようです。
$ sudo bin/cloud9.sh make: Nothing to be done for `worker'. Linux ARM bin/cloud9.sh: 18: bin/cloud9.sh: node: not found
今度はnodeが無いと怒られてしまいました。nodebrewをubuntuユーザでインストールしたため、rootユーザにnodeがインストールされていません。これを回避するには
- rootでnodeをインストール
- rootでcloud9を起動し、ubuntuユーザのnodeパスを指定
のどちらかを選択することになりますが、今回はnodeがすでにインストールされているので後者の方法で起動します。cloud.shを下記のように書き換えます。
Linux*arm*) echo "Linux ARM" /home/ubuntu/.nodebrew/current/bin/node server.js "$@" -a x-www-browser ;;
BeagleBone Blackは"Linux ARM"なので、ここの部分をnodebrewのcurrentのnodeが起動するように修正します。これでもう一度起動して、先ほどのプログラムを実行します。
$ sudo bin/cloud9.sh -l 0.0.0.0 make: Nothing to be done for `worker'. Linux ARM connect plugin start Connect server listening at http://0.0.0.0:3131 IDE SERVER PLUGIN: auth IDE SERVER PLUGIN: git IDE SERVER PLUGIN: gittools IDE SERVER PLUGIN: hg IDE SERVER PLUGIN: npm IDE SERVER PLUGIN: filelist IDE SERVER PLUGIN: search IDE SERVER PLUGIN: revisions IDE SERVER PLUGIN: settings IDE SERVER PLUGIN: shell IDE SERVER PLUGIN: state IDE SERVER PLUGIN: watcher IDE SERVER PLUGIN: node-runtime IDE SERVER PLUGIN: npm-runtime IDE SERVER PLUGIN: python-runtime IDE SERVER PLUGIN: apache-runtime IDE SERVER PLUGIN: ruby-runtime IDE SERVER PLUGIN: php-runtime Started '/home/ubuntu/cloud9/configs/default'! IDE server initialized. Listening on 0.0.0.0:3131
今度はLEDが一斉に点灯して、2秒後に消灯するように動くはずです。
おわりに
BoneScriptは簡単にLEDやGPIOを制御できる便利なライブラリです。以前BoneScriptのライブラリ構成を調べましたが、socket.ioやserialportも入ってると思ったのですが、これらはBoneScript配下で使用されるようで、自分で意識して扱う場合には別途インストールする必要があるようです。
cloud9 IDEはBeagelBone Black上でGPIO制御などの動作確認やプロトタイピングにはいいのですが、実際にNode.jsサーバを動かすといった場合には、いつものようexpressなどを使うのが良いと思われます。おそらくBoneScriptはそのまま使えるので、上手く利用できるでしょう。
BeagleBone BlackのUbuntuにbonescriptをインストールする
デフォルトのAngstromではなく、Ubuntuの方にbonescript入れてやればいいよね?的な発想でインストール
Node.js v0.10.21でインストール
前々回にインストールしたv0.10.12でbonescriptをインストールしてみます
ubuntu@ubuntu-armhf:~$ npm install -g bonescript npm http GET https://registry.npmjs.org/bonescript npm http 304 https://registry.npmjs.org/bonescript > bonescript@0.2.3 preinstall /home/ubuntu/.nodebrew/node/v0.10.21/lib/node_modules/bonescript > node-gyp clean || (exit 0); node-gyp configure build make: Entering directory `/home/ubuntu/.nodebrew/node/v0.10.21/lib/node_modules/bonescript/build' CXX(target) Release/obj.target/misc/misc.o ../misc.cpp:1:0: warning: "BUILDING_NODE_EXTENSION" redefined [enabled by default] <--中略--> make: *** [Release/obj.target/misc/misc.o] Error 1 make: Leaving directory `/home/ubuntu/.nodebrew/node/v0.10.21/lib/node_modules/bonescript/build' gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/home/ubuntu/.nodebrew/node/v0.10.21/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:267:23) gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:98:17) gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:789:12) gyp ERR! System Linux 3.8.13-bone30 gyp ERR! command "node" "/home/ubuntu/.nodebrew/node/v0.10.21/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "build" gyp ERR! cwd /home/ubuntu/.nodebrew/node/v0.10.21/lib/node_modules/bonescript gyp ERR! node -v v0.10.21 gyp ERR! node-gyp -v v0.10.10 gyp ERR! not ok npm ERR! weird error 1 npm ERR! not ok code 0
おうふ・・・
bonescriptは対応Nodeバージョンがある
ググったところ、こんな情報を発見。Installing Ubuntu 13.10, Node.js, bonescript.js on BBB
I had to make some changes when installing node.js in order to get bonescript.js installed. Bonescript.js is only compatible with node.js v0.8 Github issue #53.
たしかにAngstromの場合v0.8.22でした。というわけで、v0.8.22をインストール。こういう時にnodebrewを使ってると便利ですね。
Node.js v0.8.22をインストール
ubuntu@ubuntu-armhf:~$ nodebrew install v0.8.22 -- ビルド約1時間-- ubuntu@ubuntu-armhf:~$ nodebrew ls v0.8.22 v0.10.21 current: v0.10.21 ubuntu@ubuntu-armhf:~$ nodebrew use v0.8.22 use v0.8.22
あらためてbonescriptをインストール
ubuntu@ubuntu-armhf:~$ npm install -g bonescript > serialport@1.0.6 install /home/ubuntu/.nodebrew/node/v0.8.22/lib/node_modules/bonescript/node_modules/serialport > node-gyp rebuild -- 中略 -- make: Entering directory `/home/ubuntu/.nodebrew/node/v0.8.22/lib/node_modules/bonescript/node_modules/serialport/build' CXX(target) Release/obj.target/serialport/src/serialport.o CXX(target) Release/obj.target/serialport/src/serialport_unix.o SOLINK_MODULE(target) Release/obj.target/serialport.node SOLINK_MODULE(target) Release/obj.target/serialport.node: Finished COPY Release/serialport.node make: Leaving directory `/home/ubuntu/.nodebrew/node/v0.8.22/lib/node_modules/bonescript/node_modules/serialport/build' bonescript@0.2.3 /home/ubuntu/.nodebrew/node/v0.8.22/lib/node_modules/bonescript ├── systemd@0.2.0 ├── i2c@0.1.4 (bindings@1.1.1, repl@0.1.3, underscore@1.2.4, coffee-script@1.3.3) ├── winston@0.6.2 (cycle@1.0.3, stack-trace@0.0.7, eyes@0.1.8, colors@0.6.2, pkginfo@0.2.3, async@0.1.22, request@2.9.203) ├── express@3.1.0 (methods@0.0.1, fresh@0.1.0, cookie-signature@0.0.1, range-parser@0.0.4, debug@0.7.4, buffer-crc32@0.1.1, cookie@0.0.5, commander@0.6.1, mkdirp@0.3.3, send@0.1.0, connect@2.7.2) ├── socket.io@0.8.7 (policyfile@0.0.4, redis@0.6.7, socket.io-client@0.8.7) └── serialport@1.0.6 (bindings@0.3.0, sf@0.1.3, async@0.1.18, optimist@0.3.7, node-gyp@0.6.2)
expressやらsocket.io, serialportなども同時にインストールされるようです。リストを取ってみます
ubuntu@ubuntu-armhf:~$ npm list -g /home/ubuntu/.nodebrew/node/v0.8.22/lib ├─┬ bonescript@0.2.3 │ ├─┬ express@3.1.0 │ │ ├── buffer-crc32@0.1.1 │ │ ├── commander@0.6.1 │ │ ├─┬ connect@2.7.2 │ │ │ ├── bytes@0.1.0 │ │ │ ├── formidable@1.0.11 │ │ │ ├── pause@0.0.1 │ │ │ └── qs@0.5.1 │ │ ├── cookie@0.0.5 │ │ ├── cookie-signature@0.0.1 │ │ ├── debug@0.7.4 │ │ ├── fresh@0.1.0 │ │ ├── methods@0.0.1 │ │ ├── mkdirp@0.3.3 │ │ ├── range-parser@0.0.4 │ │ └─┬ send@0.1.0 │ │ └── mime@1.2.6 │ ├─┬ i2c@0.1.4 │ │ ├── bindings@1.1.1 │ │ ├── coffee-script@1.3.3 │ │ ├── repl@0.1.3 │ │ └── underscore@1.2.4 │ ├─┬ serialport@1.0.6 │ │ ├── async@0.1.18 │ │ ├── bindings@0.3.0 │ │ ├─┬ node-gyp@0.6.2 │ │ │ ├─┬ fstream@0.1.25 │ │ │ │ ├── graceful-fs@2.0.1 │ │ │ │ └── inherits@2.0.1 │ │ │ ├─┬ glob@3.2.7 │ │ │ │ └── inherits@2.0.1 │ │ │ ├── graceful-fs@1.2.3 │ │ │ ├─┬ minimatch@0.2.14 │ │ │ │ ├── lru-cache@2.5.0 │ │ │ │ └── sigmund@1.0.0 │ │ │ ├── mkdirp@0.3.5 │ │ │ ├─┬ nopt@2.1.2 │ │ │ │ └── abbrev@1.0.4 │ │ │ ├─┬ npmlog@0.0.6 │ │ │ │ └── ansi@0.2.1 │ │ │ ├── osenv@0.0.3 │ │ │ ├── request@2.9.203 │ │ │ ├── rimraf@2.2.5 │ │ │ ├── semver@1.1.4 │ │ │ ├─┬ tar@0.1.19 │ │ │ │ ├── block-stream@0.0.7 │ │ │ │ └── inherits@2.0.1 │ │ │ └── which@1.0.5 │ │ ├─┬ optimist@0.3.7 │ │ │ └── wordwrap@0.0.2 │ │ └── sf@0.1.3 │ ├─┬ socket.io@0.8.7 │ │ ├── policyfile@0.0.4 │ │ ├── redis@0.6.7 │ │ └─┬ socket.io-client@0.8.7 │ │ ├── uglify-js@1.0.6 │ │ ├── websocket-client@1.0.0 │ │ └── xmlhttprequest@1.2.2 │ ├── systemd@0.2.0 │ └─┬ winston@0.6.2 │ ├── async@0.1.22 │ ├── colors@0.6.2 │ ├── cycle@1.0.3 │ ├── eyes@0.1.8 │ ├── pkginfo@0.2.3 │ ├── request@2.9.203 │ └── stack-trace@0.0.7 └─┬ npm@1.2.14 ├── abbrev@1.0.4 ├── ansi@0.1.2 ├── archy@0.0.2 ├── block-stream@0.0.6 ├── chmodr@0.1.0 ├── chownr@0.0.1 ├── fstream@0.1.22 ├─┬ fstream-npm@0.1.3 │ └── fstream-ignore@0.0.6 ├── glob@3.1.21 ├── graceful-fs@1.2.0 ├── inherits@1.0.0 ├── ini@1.1.0 ├─┬ init-package-json@0.0.6 │ └── promzard@0.2.0 ├── lockfile@0.3.0 ├── lru-cache@2.2.2 ├─┬ minimatch@0.2.11 │ └── sigmund@1.0.0 ├── mkdirp@0.3.5 ├── node-gyp@0.8.5 ├── nopt@2.1.1 ├─┬ npm-registry-client@0.2.18 │ └── couch-login@0.1.15 ├─┬ npmconf@0.0.23 │ └─┬ config-chain@1.1.5 │ └── proto-list@1.2.2 ├── npmlog@0.0.2 ├── once@1.1.1 ├── opener@1.3.0 ├── osenv@0.0.3 ├─┬ read@1.0.4 │ └── mute-stream@0.0.3 ├── read-installed@0.1.1 ├── read-package-json@0.2.2 ├── request@2.9.203 ├── retry@0.6.0 ├── rimraf@2.1.4 ├── semver@1.1.4 ├── slide@1.1.3 ├── tar@0.1.16 ├── uid-number@0.0.3 └── which@1.0.5
これでUbuntuでもbonescriptを使ったNodeアプリが書ける・・・はず>たぶん次回
BeagleBone BlackのAngstrom Linuxに入ってるNode.jsについて
ちょっとだけ調べてみました。
Nodeのバージョン
root@beaglebone:~# node -v v0.8.22
Node Package Managerも入っているようです
root@beaglebone:~# npm Usage: npm <command> where <command> is one of: add-user, adduser, apihelp, author, bin, bugs, c, cache, completion, config, ddp, dedupe, deprecate, docs, edit, explore, faq, find, find-dupes, get, help, help-search, home, i, info, init, install, isntall, issues, la, link, list, ll, ln, login, ls, outdated, owner, pack, prefix, prune, publish, r, rb, rebuild, remove, restart, rm, root, run-script, s, se, search, set, show, shrinkwrap, star, stars, start, stop, submodule, tag, test, tst, un, uninstall, unlink, unpublish, unstar, up, update, version, view, whoami npm <cmd> -h quick help on <cmd> npm -l display full usage info npm faq commonly asked questions npm help <term> search for help on <term> npm help npm involved overview Specify configs in the ini-formatted file: /home/root/.npmrc or on the command line via: npm <command> --key value Config info can be viewed via: npm help config npm@1.2.14 /usr/lib/node_modules/npm
Nodeのパッケージを調べてみる
root@beaglebone:~# npm list -g /usr/lib ├─┬ bonescript@0.2.2 │ ├─┬ express@3.1.0 │ │ ├── buffer-crc32@0.1.1 │ │ ├── commander@0.6.1 │ │ ├─┬ connect@2.7.2 │ │ │ ├── bytes@0.1.0 │ │ │ ├── formidable@1.0.11 │ │ │ ├── pause@0.0.1 │ │ │ └── qs@0.5.1 │ │ ├── cookie@0.0.5 │ │ ├── cookie-signature@0.0.1 │ │ ├── debug@0.7.2 │ │ ├── fresh@0.1.0 │ │ ├── methods@0.0.1 │ │ ├── mkdirp@0.3.3 │ │ ├── range-parser@0.0.4 │ │ └─┬ send@0.1.0 │ │ └── mime@1.2.6 │ ├── UNMET DEPENDENCY serialport 0.7.5 │ ├─┬ socket.io@0.8.7 │ │ ├── policyfile@0.0.4 │ │ ├── redis@0.6.7 │ │ └─┬ socket.io-client@0.8.7 │ │ ├── uglify-js@1.0.6 │ │ ├── websocket-client@1.0.0 │ │ └── xmlhttprequest@1.2.2 │ ├── systemd@0.2.0 │ └─┬ winston@0.6.2 │ ├── async@0.1.22 │ ├── colors@0.6.0-1 │ ├── cycle@1.0.2 │ ├── eyes@0.1.8 │ ├── pkginfo@0.2.3 │ ├── request@2.9.203 │ └── stack-trace@0.0.6 └─┬ npm@1.2.14 ├── abbrev@1.0.4 ├── ansi@0.1.2 ├── archy@0.0.2 ├── block-stream@0.0.6 ├── chmodr@0.1.0 ├── chownr@0.0.1 ├── fstream@0.1.22 ├─┬ fstream-npm@0.1.3 │ └── fstream-ignore@0.0.6 ├── glob@3.1.21 ├── graceful-fs@1.2.0 ├── inherits@1.0.0 ├── ini@1.1.0 ├─┬ init-package-json@0.0.6 │ └── promzard@0.2.0 ├── lockfile@0.3.0 ├── lru-cache@2.2.2 ├─┬ minimatch@0.2.11 │ └── sigmund@1.0.0 ├── mkdirp@0.3.5 ├── node-gyp@0.8.5 ├── nopt@2.1.1 ├─┬ npm-registry-client@0.2.18 │ └── couch-login@0.1.15 ├─┬ npmconf@0.0.23 │ └─┬ config-chain@1.1.5 │ └── proto-list@1.2.2 ├── npmlog@0.0.2 ├── once@1.1.1 ├── opener@1.3.0 ├── osenv@0.0.3 ├─┬ read@1.0.4 │ └── mute-stream@0.0.3 ├── read-installed@0.1.1 ├── read-package-json@0.2.2 ├── request@2.9.203 ├── retry@0.6.0 ├── rimraf@2.1.4 ├── semver@1.1.4 ├── slide@1.1.3 ├── tar@0.1.16 ├── uid-number@0.0.3 └── which@1.0.5 npm ERR! missing: serialport@0.7.5, required by bonescript@0.2.2 npm ERR! not ok code 0
ふむふむ、bonescriptはもちろん、express, socket.io, serialportなどがグローバルインストールされていました。ということは、AngstromのままでもNode.jsでプログラム書いて動かして遊ぶのもいいですね
BeagleBone BlackにNode.jsをインストールする2(セルフビルド)
見事にビルドに失敗・・・ググってみたら、傘のお肉はどこにあるの?知り合いの@iwata_nのブログに引っ掛かったw
つまりは
./configure --without-snapshot
が必要ということなので、nodebrewのソースを修正して対応します。
nodebrew本体のコード(~./nodebrew/nodebrew)の「sub _cmd_install」にあるConfigureに--without-snapshotを追加します
system qq[ cd "$src_dir/$target_name" && ./configure --without-snapshot --prefix="$self->{node_dir}/$version" && make && make install ];
これでもう一度インストールしてみます。一旦さっきのバージョンをuninstallしておいてから再度インストール。
ubuntu@ubuntu-armhf:~$ nodebrew uninstall v0.10.21 v0.10.21 uninstalled ubuntu@ubuntu-armhf:~$ nodebrew ls not installed current: none ubuntu@ubuntu-armhf:~$ nodebrew install v0.10.21 fetch: http://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz ######################################################################## 100.0% { 'target_defaults': { 'cflags': [], 'default_configuration': 'Release', 'defines': [], 'include_dirs': [], 'libraries': []}, 'variables': { 'arm_fpu': 'vfpv3', 'arm_neon': 0, 'armv7': 1, 'clang': 0, 'gcc_version': 46, 'host_arch': 'arm', 'node_install_npm': 'true', 'node_prefix': '/home/ubuntu/.nodebrew/node/v0.10.21', 'node_shared_cares': 'false', 'node_shared_http_parser': 'false', 'node_shared_libuv': 'false', 'node_shared_openssl': 'false', 'node_shared_v8': 'false', 'node_shared_zlib': 'false', 'node_tag': '', 'node_unsafe_optimizations': 0, 'node_use_dtrace': 'false', 'node_use_etw': 'false', 'node_use_openssl': 'true', 'node_use_perfctr': 'false', 'node_use_systemtap': 'false', 'python': '/usr/bin/python', 'target_arch': 'arm', 'v8_enable_gdbjit': 0, 'v8_no_strict_aliasing': 1, 'v8_use_arm_eabi_hardfloat': 'true', 'v8_use_snapshot': 'false'}}
「'v8_use_snapshot': 'false'」になっています。失敗した時のログを見てみると
fetch: http://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz ######################################################################## 100.0% { 'target_defaults': { 'cflags': [], 'default_configuration': 'Release', 'defines': [], 'include_dirs': [], 'libraries': []}, 'variables': { 'arm_fpu': 'vfpv3', 'arm_neon': 0, 'armv7': 1, 'clang': 0, 'gcc_version': 46, 'host_arch': 'arm', 'node_install_npm': 'true', 'node_prefix': '/home/ubuntu/.nodebrew/node/v0.10.21', 'node_shared_cares': 'false', 'node_shared_http_parser': 'false', 'node_shared_libuv': 'false', 'node_shared_openssl': 'false', 'node_shared_v8': 'false', 'node_shared_zlib': 'false', 'node_tag': '', 'node_unsafe_optimizations': 0, 'node_use_dtrace': 'false', 'node_use_etw': 'false', 'node_use_openssl': 'true', 'node_use_perfctr': 'false', 'node_use_systemtap': 'false', 'python': '/usr/bin/python', 'target_arch': 'arm', 'v8_enable_gdbjit': 0, 'v8_no_strict_aliasing': 1, 'v8_use_arm_eabi_hardfloat': 'true', 'v8_use_snapshot': 'true'}}
こちらはtrueになっていました。
さてまたしても1時間経過・・・ビルド完了
symlinking ../lib/node_modules/npm/bin/npm-cli.js -> /home/ubuntu/.nodebrew/node/v0.10.21/bin/npm updating shebang of /home/ubuntu/.nodebrew/node/v0.10.21/bin/npm to /home/ubuntu/.nodebrew/node/v0.10.21/bin/node ubuntu@ubuntu-armhf:~$ nodebrew ls v0.10.21 current: none ubuntu@ubuntu-armhf:~$ nodebrew use v0.10.21 use v0.10.21 ubuntu@ubuntu-armhf:~$ node >
というわけで、無事Node.jsが起動できるようになりました。