NetBeans でクロスプラットフォーム開発環境を作る

BBBやRasPiで使うC/C++のプログラムをWindows上のNetBeans IDE で開発してしまおう、という話。 NetBeansはもともとJavaの開発環境だが、plugin で c/c++ もサポートしている。自分のようにWeekend hoby でプログラミングをやっているものにとってはAutocomplete やSyntax check、変数の使用状況のチェックなどを自動的にやって間違いを指摘してくれるeditor というのは重宝する。
こちらに、Eclipseを使ったアプリケーションの開発及びクロスコンパイルの方法を説明したビデオがあったので、NetBeansを使って同じようなことができないか調べてみた。

リソースの乏しいRasPi上ではなく、普通のデスクトップコンピューターでIDEを使ったアプリケーション開発を行い、コードの生成だけはRasPi上で行う。という環境を作りたかったわけだが、NetBeans.orgにちゃんとやり方の説明が載っていた。

設定は以外と簡単にできた。  Netbeans からLinux BoxにSSHで接続し、さらにLinuxBox からはSambaを使ってLinuxのfile system をWindows側にネットワークドライブとしてシェア、 netbeans のプロジェクトをこのシェアされたフォルダーに書き込んでいき、デバッグはLinuxBox側から行う。 設定さえきちんとできれば、すべてWindows上のnetbeans IDEから処理できる。
この場合、gcc, make, gdbなどのツールはlinuxbox 上に存在するものがsshを使って操作される。よって、こられのツールがLinux側にインストールされている必要があるが、きちんとインストールされていれば、設定の途中でnetbeansがちゃんと検出してくれる。
Linux Box 側からは以下の下準備が必要
1.Sambaのインストール及びsmb.configの設定。(sudo apt-get install samba samba-common-bin)
2.SSH (RasPiもBBBも初期設定でインストール済み)
3.g++, gcc, make, gdb のインストール(sudo apt-get install g++ gcc make gdb)

詳細はこのヘルプページの解説に従えばよい。 Sambaを使ってFolder を Shareする方法のほかにファイルの作成管理はWindows側で行って、コンパイル時にLinux側にすべてコピーするscpを使ったautomatic copy という方法も述べてある(小さなプロジェクトではこちらのほうが早いとある)のだが、自分の環境ではうまくできなかった。

Ruby と Python

どちらもInterpreter Languageだが、ひとつを選べと言われたらどちらを覚えたほうがよいのだろう。 
日本ではRubyがかなり人気があるようだが、WorldwideのUser BaseではPythonのほうが多い。 多いと言ってもPHPとかに比べるとかなり少ない。

Ruby

# Old "coke" program from 80's Basic programming book in Ruby
answer = Random.rand(1..100)
count,guess = 0,0
puts 'I am thinking about number between 1 and 100. Can you guess?'
while (answer != guess) 
  guess = gets.to_i
  count += 1
  if guess > answer 
     puts "#{guess} is too high"
  elsif guess < answer
     puts "#{guess} is too low"
  else 
    puts "you got it right in #{count} try!"
  end
end

Python

"""Old "coke" program from 80's Basic programming book, in Python"""
import random
answer = random.randrange(1,100)
print ("I am thinking a number between 1 and 100. Hope you can guess")
guess, count = 0,0
while (answer != guess ):
    guess = input ("what number am I thinking? ")
    guess = int(guess)
    count += 1
    if answer < guess:
        print ( guess, " is too high, try again")
    elif answer > guess:
        print ( guess," is too low. Try again")
    else:
        print ("Bingo! you guessed it right in ",count," tries!")

とりあえず調べて見えてきた部分で大昔、Basicで初期に書いた練習用プログラムを移植してみたが、ごらんのとおり、これくらいのサイズのプログラムなら、どちらで書いてもほとんど差がない。言語のパワフルなところを使ってみないとその差がわからない、という感じだが、 ルーズに行くならPythonかな?インデントでブロックを明示している、つまり単なる書式ではなく、言語の一部になっているのが、なんとも割り切っているところ。 これで{}も"End"も必要ない。 個人的には好きである。 どちらの言語も読み解きやすいのはまちがいなく、これをC++ で書こうとすると、

#include <iostream>
#include <cstdlib> //need this to use rand() 
#include <ctime> //need this to use time() 
using namespace std;

int main(){
    int answer, guess=0, count=0;
    srand(time(NULL));
    answer = rand()%100 + 1;
    cout << "I am thinking about the number between 1 and 100. Can you guess?";
    while (guess != answer) {
        ++count;
        cin >> guess;
        if (guess > answer) 
            cout << guess << "is too high";
        else if (guess < answer) 
            cout << guess << "is too low";
        else
            cout <<"You have it right in " << count << "  times!";
        cout << endl;
                    
    }
    return 0;
}

これよりは楽ですよ。

Raspberry Pi に頭をつけてみる。

RasPiにキーボードとモニターを接続しようと思ったとき、キーボードはUSB接続のキーボードで20ドルくらいからあるし、昔のキーボードがどこかに転がっていればそれを転用するので大したことはないが、困るのはモニターである。 RCA入力端子のある中古のTVというのも選択肢としてはあるわけだが、せっかくならHDMIで高解像度を楽しみたいわけである。 AmazonやNewEgg,Tigers Directなどで探してみても100ドルくらいはする。 するとキーボードと合わせると120ドルから150ドルくらいの出費になってしまう。
ところが世の中よくしたもので、RasPiにぴったりのガジェットがある。 Motorola が出しているLapdockというスマートフォーン用のドッキングステーションなのだが、これが液晶モニター、キーボード、タッチパッドとUSBハブ付きで充電バッテリ内蔵なのだが、本来は400ドルくらいするはずのものが、あまりにも売れなかったらしく、安売りになっている。 自分は”Lapdock for AT&T Atrix 4G”というモデルを80ドルでアマゾンから入手。ネットの情報では50ドルくらいで手に入る、ということだったが、みな同じことを考えて購入するらしく、市場の原理が働いたようで、残念ながら50ドルというのは見つけることができなかった。

RasPiとの接続だが、コネクタがやや特殊である。 クレードルにはHDMIのミニコネクタとUSBのマイクロコネクタがついていて、これに接続すればよいのだが、それぞれオスのコネクタなので、ケーブル側にメスのソケットが必要になる。よって、HDMI D-Female からHDMI Maleというケーブルまたはケーブルとアダプタの変換をしないとRasPiにはつながらない。 またUSBのほうだが、これはクライエント側(下流)のコネクタではあるのだが、同時にスマートフォーンをチャージする機能を持っているので、+5Vが供給されている。 本来ならば、パワーライン(4本の心線のうち赤い線)を切断して、データラインだけ、USBホストコネクタ(RasPiの大きいほうのUSBソケット)と接続し、 ラップドックから電源供給を行う場合パワーラインのほうはここからマイクロUSBソケットに赤(5V)と黒(グランド)の心線をスプライスして供給する、あるいはUSBハブからのホストコネクションを使うべきなのだが、実はRasPiに関していえば、全部のラインをホスト側に差し込んでもOK。回路図を見ると、RasPi内部でフューズをかましているだけなので、5Vが保障されればどちらから供給されても問題ない設計になっている。 (きちんとパワーマネジメントICが入っているBeagleBoneでは恐ろしくてできない)
ラップドック自体はHDMIの接続と画面を開けた二つの信号を見て電源をオンする構造になっているようだ。 自分の環境ではHDMIケーブルのソケットの勘合が緩いようで、ショックなどで接触が悪くなると電源が落ちてしまう。 写真では電源を別に取ってあるのはそういうわけである。20130727_122330

参考にしたサイトは以下。
英語

http://rpidock.blogspot.com/
http://www.instructables.com/id/The-Raspberry-Pi-Lapdock-Connection/
http://www.raspberrypi.org/phpBB3/viewtopic.php?t=31416&p=272789
上記3つのサイトは写真が豊富 コネクタ・ケーブルなどの小売サイトへのリンクなどもある。
http://www.element14.com/community/groups/raspberry-pi/blog/2012/09/27/raspberry-pi-lapdock-hdmi-cable-work-around
このサイトはHDMIがRasPiをセンスしないと電源がONにならない、というところから議論をはじめていて、非常に参考になった。またHDMIが接続しっぱなしだと、センス電流が常時流れる状態になる、ということで、これをカットするためのスイッチを組み付ける方法の紹介がある。

American Piのほうが好きかもしれない。

というわけで、BeagleBone Black(以下BBB)である。 値段が$45ドル。Raspberry Pi (以下RasPi)の実勢価格が$42なので比較してしまうわけだが、あちらが英国製なのに対して、こちらはTIがサポートするコミュニティハードウエア・ソフトウエア。米国製なので、別名 American Pi  ハード的にはアームプロセッサも一つ格が上のグレード、そしてクロックも1Mhzと優位である。回路図を眺めるとちゃんとパワーマネージメントのICが実装されていて、Raspberry Piとは大違い。USBクライエントからの5Vととバレルプラグからの5Vの供給も別チャンネルでしっかり管理されている。(ICの仕様書では7V AC入力となっているんだけど、交流でも大丈夫ということか?)基盤上にはリチュームイオンセル用のパッドまで用意されている。 そのかわり、USBホスト側から5Vぶっこんで電源元にする、というRasPi では許されるいい加減なことがこちらではできない。RasPi に触発されてこの値段になったのは明らかで、前のGeneration (Beaglebone、以後BB)は90ドルくらいした。自由競争というのはいいことだ。  BBにはついていなかったHDMIソケットもBBBにはついていて、かつ2ギガバイトの内臓eMMCにはLinux が実装されているため、付属してくるUSBケーブルをPCに接続(してminiUSBソケットにPC側から電源を供給)するだけでとりあえずは始動する。 イーサネットを使わなければ、専用のUSBドライバーを組み込まないとWindowsとはお話しをしないが、Windows 8 ではコントロールセンターから第3者のドライバーを組み込むことを許可しないとWindows 側がインストールを拒否するので注意。 親機がLinuxの場合は専用ドライバは必要ない。何もしないでもUSB経由のIP接続が可能である。

eMMCに最初から組み込んであるLinuxはAngstromという組み込み系のもので、その起源を紐解けば、Free Zaurus などというものまで出てきて日本人としての因縁をかんじたりする。 自分の環境ではすぐにDebian Wheezy に書き換えてしまったが、これは単にRasPiのRaspbian がDebian そのもので、新しいディストロを覚える手間を省きたかったということが大きい。

で、これにNginx +mysql + php5を実装してWeb Serverを試してみた。 手順はRasPi のときとまったく同じなので、詳しく述べないが、ModX Revolutionという、バックエンドがかなり重いCMSをインストールしてみたところ、問題なく使える。 RasPi では、WEB作成画面の反応が遅くなって実用にならなかった。 RasPi でも少し軽めのModx Evolutionのほうは軽快に使えるので、それはそれで良いのだけれど、あらためて、パワーの違いを感じたわけで、 なんとなく、RasPiよりはBBBのほうになびくわけである。 ちなみに内蔵のeMMCメモリーへのアクセス速度は14MB/S と、RasPiでクラス10のSDカードを差した場合とほとんど変わらず、単純にプロセッサの能力の差がでているようだ。あとはramの違いかRAMの速度も400Mhzと同様。

その他に気が付くところとしては、
RTC が実装されている。
外に出ているIO ピンが 多い(実はそのうちの半分くらいはHDMIとeMMCの入出力ピンとして使われているので、全部使うにはこれらのデバイスを無効化する必要がある。が、それでもRasPiよりも多い。)。
このIOピンはメールコネクタヘッダになっていて、リード部品などそのまま差し込めるので、RasPiのヘッダーピンより使いやすそう。

パワースイッチ、リセットスイッチ、 そして、ブートをSDカードから行うためのスイッチ、とミニボタンスイッチが三つもついている。
パワーLEDのほかにユーザーがコントロールできるLEDが4つついている。
Shutdown -h now を実行すると、ちゃんと電源が落ちる。前述の電源コントローラICがついていることによると思われる。再起動はパワーボタンを押すだけ。
RasPiに比べて見劣りするのはUSBホストソケットが一つしかついていないことくらいか。
それとVideo Codecがハードウエア処理ではないので、HTPC用途ではRasPiに軍配が上がりそうだ。
BoneScriptというNode.js上で動くJavascript ライブラリがAngstromには実装されていて、これをやはり実装されているCloud9 というブラウザベースのIDE上で開発していく、ということらしいが、Debian で置き換えてしまったので、とりあえずはRaspiと同様、Pythonを使えばGPIOモヂュールを使って外部とのインターフェースも可能なようだ。(Adafruit.comに多くの教材がアップされている) BoneScriptもそのうちDebian/UbuntuをサポートするようなのでJavaScriptによる外部機器のコントロールのほうは少し待つとしようか。

Physical Computingとして、去年まで熱を上げてたArduinoはどうするよ、と自分に突っ込みをいれたくなるが、これが答えが出ていて、「両方とも使う」というもの。 Arduinoのスケッチ自体はサーバーとの通信とそれに基づく外部接続部品とのインターフェースに特化させ、つまり、簡略化したループを回し、難しいところはBBBでPytonなり BoneScriptを使って行ってシリアル通信でArduinoに指示をしたり、データを受け取ったりする、
従来はこのサーバーの側がPCでDelphiクローンのオープン版Lazarus。 いかにももったいない感じだったが、BBB/RasPiにすると見た目にも機能的にもバランスが取れると思う。

BBB とRasPi 比較表

Raspberry Pi、SD カードのアクセス速度と, カード破損の原因について

表題の件。自分はなんとなく、SDカードのアクセス速度はハードディスクのアクセス速度よりも早いのだ、と思っていたのだが、これは実は大変な思い違いだった。 思い込んでいた理由は、機械部品に読み書きするより、半導体のほうに読み書きするほうが早いのだろうと単純に考えていたのだが、どうも違うらしい。 SDカードの構造が関係しているようだが、同じカードでも初期のSDカードと現在普通に売っているSDHCでももちろん差がある。 それでもハードディスクのスピードにはかなわないのだ、という。
ちなみに Raspberry Piとlinux のddコマンドを使ってカードのアクセスの速度を簡易的に測ってみた報告が
このサイトに載っていたので、同じ方法で、今回自分のパイに使ったTranscend の8GBカードのアクセス速度を測ってみたら、15.7MB/Sと出た.

root@raspi1:/home/pi# time dd if=/dev/zero of=./ddfile bs=8k count=20000 && sync
20000+0 records in
20000+0 records out
163840000 bytes (164 MB) copied, 10.4644 s, 15.7 MB/s

real	0m10.657s
user	0m0.080s
sys	0m2.400s

(ここで使っているddというコマンドはパラメーターの使い方を間違えるとハードディスクの中身が綺麗になくなってしまったり、こわれてしまったりする、というlinux killerとも言われる至極危険なコマンドなので、ご注意を。自分でやってみてファイルシステムの中身が蒸発したと文句を言われても責任を持てません。)
クラス10のカードなので保証最低速度が10MB/Sだからこんなものか。 上記のサイトの結果と比較しても同じくらいのスピードだ。
サイトの情報を眺めていると、SDカードが破損する、という報告が多数見られるのは、SDカードのメモリー構造が激しい書き換えで摩耗してしまう結果だから、一度SDカードからブートしたら、OSはUSBスティックのメモリー上で動作したほうがよい、というように書いてあるブログが結構ある。 SDカードでダメならUSBのフラッシュカードだって同じだろうと思うのだが真偽のほどは分からない。上のサイトでもUSBのサムドライブで動作させた場合のアクセス速度を測っているが、SDカードの約半分以下のスピード。測ったメモリースティックがSandisk 16GB Cruiser、一部のサイトで言っているようなスピードが改善した、というような結果にはなっていない。 他にも個人のブログでやはりスピードに改善はない、という報告がある一方、 早くなり、かつ動作が安定した、と言っているサイトには具体的な数値が出ていない。 一方、USB経由でHDDに接続した場合は速度向上の効果が得られそうだ。。 

ただ、興味をそそられる部分があって、それはOSのカーネルの立ち上がりからの処理は、USBに接続されたデバイスから実行することができる、SDカード上に必要なのは/bootフォルダに置かれたファイルのみ、と説明されているところで、つまりはSDカードに展開される2GBの実装イメージのうち、本当にSDカード側において置かなければならない部分はFATのパティションの部分のみ、ファイルサイズで言うと20メガバイトにも満たない、ということが判った。オリジナルの2GBのイメージはパティションが二つあり、一つは56メガバイトのFAT、もうひとつは(2GB-56MBの)Linuxのファイルシステムになっている。 この起動の途中からUSBデバイスを使う方法の説明はこのサイトに載っている記事がわかりやすいが、自分の場合、キーボードがダメになって放ってあったHPmini というネットブックに16GBのSSDが入っていたのでこれを取り出し、昔notebookのハードディスクのゴースティングをするために買ってあったUSBのSATA/PATA Enclosure に入れ込んで、Raspbian のイメージをコピーし、gpartedを使ってパティションをディスク容量分まで拡大。 SDカードのほうは、昔のカメラかなにかに使っていたと思われる東芝の256MBのSDカードを普通のPCでフォーマットしたのちにSSDのFATpatition の部分のファイルをすべてコピーし、 その中からcmdline.txt に書かれている /dev/blk0p2というブートデバイス指示を/dev/sda2と書き換え それぞれRPiに接続して準備完了。電源を入れてみれば256MBのSDカードから 見事に立ち上がった。

この状態で、SSDの読み書き速度を調べて見れば、
16GB SSD salvaged from HP mini notebook (ca. 2009) connected through SATA-USB enclosure.

root@raspi1:~# time dd if=/dev/zero of=./ddfile bs=8k count=20000 && sync
20000+0 records in
20000+0 records out
163840000 bytes (164 MB) copied, 3.83869 s, 42.7 MB/s

real	0m3.858s
user	0m0.050s
sys	0m2.380s

この42.7MB/S というのは、上記のサイトで報告されている、HDDの読み書き速度とほぼ同程度。 それでもSDHCのほぼ3倍の早さがでている。 SSDも半導体ドライブだが、こちらはHDDよりも早い、という宣伝文句で高くても皆文句を言わず買っているわけなので、もっと早くてもよさそうなものだが、290ドルのネットブックに付属してきたものなので、高性能を期待するのが無理か。 そもそもUSB2 の公称最高速が60MB/Sで、そのうち10~15%はオーバーヘッドというこどなので、50MB/SくらいでUSBのほうが飽和するから、そちらの影響かも。 どちらにしても消費電力は低いはず。

ちなみに256MB のSDカードのほうは、さすがに古いだけあって、 ご覧のとおり、たったの2MB/S。 つまりクラス2のカードで、RPiの要求仕様であるクラス4をも満たしていないが問題なく起動する。この使い方では書き込むことはなく読み込み専用. すぐにコントロールがUSB側のstorageに移るのでよしとしておく。
256BM SD card from old digital camera

root@raspi1:/boot# time dd if=/dev/zero of=./ddfile bs=8k count=20000 && sync
20000+0 records in0
20000+0 records out
163840000 bytes (164 MB) copied, 77.1608 s, 2.1 MB/s

real	1m17.178s
user	0m0.030s
sys	0m2.620s

SDカードの破損の原因だが、
1)電源のパワーが足りない。必要とされる700ミリアンペア以上を供給できない電源を使っていてうまく書き込むことができない。
2)SDカードが書き込まれている最中にカードを抜いてしまう。
などが、主原因であり、read/writeの回数が許容回数を上回ってしまうのだ、という議論は説得力が薄い、と個人的には感じている。 (今のセットアップで問題が起きれば考え直すかもしれない)
(追記:どうも初期のファームウエアにも問題があったようだ。firmware-update、raspberry piでググってみてほしい。)
RPiにパワースイッチがあれば2の問題は防げるのだが、コストカットの観点からスイッチはついていない。American Piとも揶揄されるbeaglebone black($45)にはしっかりついており、確実にパワーダウンできるのに比べると見劣りする。 ただ単に電源を接続するだけではなく、まずはシステムをシャットダウンしてのちに電源を落とす必要があるのだが、これを実現させるためのRPi用のパワースイッチは3rd Partyからいくつか発売されており(1)(2)、これを買い求めれば良いだけの話ではある。

Rpi , 256MB SD card and USB/Sata I/F with 16GB SDD.  8GBSD is now retired

Rpi , 256MB SD card and USB/Sata I/F with 16GB SDD.  8GBSD is now retired

NGINX ん、じんくす? 違わい、エンジンXだい!

nginxと書いてエンジンエックスと読むそうである。webサーバーとして動くことは勿論だが、その他, リバースプロキシとしてはWEBのみならず、mailも扱えるということなので、 今回raspberry piにインストールしてみた。 徐々に使い方を覚えていき、他のサーバーからの移行を画策していこうと思う(狙いは省電力化)が、とりあえずはPHPおよびmysql を一緒に実装し Lamp ではなく、LNMPとして動かすことをやってみる。 Wikipediaの解説によれば非同期のイベント駆動モデルを使っており、プロセス・スレッド駆動のapacheなどのサーバーに比べると高負荷になっても動きが鈍くならない、という利点があるらしい。なんとなくraspberry pi にぴったりのサーバーのような気がしてきたが、実際は如何に。

実装後のテスト画面は以下。ごらんのとおり、PHPが実装でき、phpmyadminが動いている、という証拠スナップ。

phpinfo()をRPi上で実行。

phpinfo()をRPi上で実行。クリックすると拡大画面になり、raspberry piのバージョン情報などが見える。

以下のconfig file を参照。

以下のconfig file を参照。

いくつかネット上の記事を参照したが、メインはこちらの記述に従った。 上記サイトのコピー記述になるのでどうかとも思うが、とりあえず実行したコマンドだけ羅列すると以下になる。
なお、ヘッドレスでアクセスをしているので、入力はすべてsshによるリモートターミナル経由だ。

mysql-server をまずインストール

sudo apg-get install mysql-server [Enter]

mysql のルートパスワードを要求されるので入力したパスワードは忘れないようにしよう。

次にnginx本体をインストール。 ところで、サイトによっては、「ディストロについてくるnginxは0.6とえらく古いのでソースを落としてきてコンパイルしよう、」とその方法を詳しく説明してるところがあったが、apt-get update; apt-get upgrade 後にインストールしたバージョンは1.2.1であった。 ソースをみるとすでに1.51がリリースされているが、ものすごく古い、というわけでもなかったので、パッケージ品をそのまま使うことにする。 自分も齢60歳。いちいち凝っている時間はもうないので次に次にと進むのである。

sudo apt-get install nginx [Enter]
sudo service nginx start [Enter]
sudo apt-get install php5-fpm [Enter]
sudo apt-get install php5-imagick [Enter]
sudo apt-get install php5-curl [Enter]
sudo nano /etc/php5/fpm/php.ini [Enter]

最後のコマンドではnano editor が起動するので、Ctl-W で、以下の部分を探し、修正。
“upload_max_filesize=2M” => “upload_max_filesize=10M”
Dynamic Extentions のセクションに 以下を追加

extension = imagick.so

あとはCtrl-O でセーブし、Ctrl-x で終了。

phpmyadminをインストール

sudo apt-get install phpmyadmin [Enter]

Web-server selection の画面でApache か lighttpdかどちらのサーバーかと、と聞いてくるが、どちらでもないので、チェックを外しておく。 次の画面でパスワードを設定。

sudo service php5-fpm restart

以上すべてsudo で暫定ルート権限で実行しているが、面倒であれば、sudo su でルートになれば、sudoは省ける。

ここまでで必要なサービス(nginx,mysql,PHP5)はすべて導入された。 ちなみにこの状態でRPiのIPアドレスをブラウザで見ると”Welcome to NGinx”という簡単なメッセージが出て、nginxが無事動いているということがわかる。

ただし、この状態では静的なファイルしか表示しない。 PHPファイルを認識させるにはconfig file をいじる必要があるが、その前にサイト用のダイレクトリを設定しておく。
ルートフォルダにある/srvにフォルダーツリーを作っていく.

sudo mkdir /srv/www [Enter]
sudo chown -R USER1:www-data /srv/www [Enter]
sudo chmod -R 755 /srv/www [Enter]
mkdir /srv/www/site1 [Enter]
cd /srv/www/site1 [Enter]
mkdir logs [Enter]
nano logs/access.log (ファイルを作るだけなので、カラのファイルをセーブして即クローズ)
nano logs/error.log (ファイルを作るだけなので、カラのファイルをセーブして即クローズ)

上でやっているのは、nano で空のファイルを二つ作るということだが、空のファイルを作る技としてはほかに

touch filename

さらには

> filename

なんてのもある。最後のコマンドは無入力をfilenameにリダイレクトする、という技で、20年前に感心して覚えたのをすっかり忘れてた(爆)


mkdir public [Enter]

上の例では自分はUSER1というユーザー名でログインしてると仮定し, /srv/www/というフォルダーにsite1というフォルダーを作成する。 srv/www/site1/pulicを、作ろうとしているサイトのルートとしてここにWeb 構造を展開して使う魂胆である。ホストできるサイトは一つだけではないので、その場合はsite2, site3など、任意名のフォルダーを作って割り当てていけばよい。
次にCONFIG FILE で上の情報をつなぎ合わせるわけだ.
デフォルトのCONFIG FILE は /etc/nginx/nginx.conf というファイルで、これはすでに存在している。 ネット上の多くの説明では、このファイルを直接いじるような印象だが、 今回インストールされたnginx.conf を見てみると、ほとんどコメントアウトされていてコメントを抜くと、フレームワークがあるだけで、ほとんど何も実際のコマンドになっていない。 ただ、webサーバーを指定しているhttpブロックをよく見てみると 以下の記述があることに気付く。

include /etc/nginx/sites-enabled/

で、このsites-enabled のフォルダーを眺めてみると、default というファイルを見つけたわけだが、このファイルは実体のないソフトリンクされているポインタであり、実際のファイルは/etc/nginx/sites-available/default というファイルだったりする。

このsites-available, sites-enabled というフォルダーはapache2 でもおなじみで、サイトの構成ファイルをsites-available のほうに、one site= one file 単位でセーブしておき、 有効にしたいサイトのみ、ソフトリンクでsites-enabledにソフトリンクする、という仕組みになっているようだ。 ”welcome to nginx”というメッセージはこのdefault の中に以下の記述がある。

root /usr/share/nginx/www;
index index.html index.htm;

これは「このサイトのルートページはローカルマシンの/usr/share/nginx/www フォルダーですよ、html とhtmのエクステンションを探して表示しましょうね、」と言っている。 ちなみに、このフォルダーをみてみると、index.htmlというファイルがおいてあるので、その中身をみると、やはり”welcom to nginx”とhtml で書いてあるわけだ。
今回は/srv/www/site1/public/をルートにしようとおもっているので、別のconfig ファイルをつくり、そのファイルをsites-availableにセーブし、ソフトリンクでsites-enableに登録するという作業を行う。 ファイルの名前をsite1として話を進める。

sudo nano /etc/nginx/sites-available/site1 [Enter]

実際のファイルの中身は以下のようになる。

server {
access_log /srv/www/site1/logs/access.log;
error_log /srv/www/site1/logs/error.log;
root /srv/www/site1/public/;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/site1/public$fastcgi_script_name;
}
location /phpmyadmin {
root /usr/share/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+\.php)$ {
try_files $uri =404;
root /usr/share/;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /usr/share/;
}
}
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}
}

このファイルをソフトリンクするついでにdefaultをsites-enabled から削除(リンクを解除) さらにサービスを再スタート

sudo ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/site1
sudo rm /etc/nginx/sites-enabled/default
sudo nginx restart

まだルートフォルダにはページをつくっていないので、このままでは何も表示しない。 phpinfo() というphp関数を実行するだけのファイルを作成してルートフォルダーにセーブする。

nano /srv/www/site1/public/index.php

以下の一行を記述

<php? phpinfo(); ?>

ctl-o で書き込み、ctl-x でクローズ

キーボード、モニター付きのRPiなら、あとは”localhost”とブラウザに打ち込むわけだが、外部のマシンからのブラウザアクセスをする場合にはIPアドレスを入力してやる必要がある。自分の環境ではローカルマシンでbind9というDNSをうごかしている。ここに192.168.1.97というローカル固定IPをraspberrypi.home.lanというドメインネームとして登録した。早速これを使って http://raspberrypi.home.lanと入力すると一番上の画面が出てきた。 さらに http://raspberrypi.homel.lan/phpmyadmin と入力してphpMyadminのログイン画面が出た。 このアプリはPHPで動くので、PHPの作動確認OK. さらに ログインしてmysql のデータベースもちゃんと使えることを確認して本日のところは終了。 config の部分についてはnginx.org/document/ のビギナーズガイドが非常に参考になった。
外部からのアクセスができるようにするにはserver_name などのパラメータを追加していく必要があるはずなので、今後ぼちぼち試行錯誤していこうと思う。理屈としてはこれでWordPress などのCMSも導入可能になったはずだ。

Laspberry pi とLinuxの調理

今回のRPiは電子機器とのインターフェースというよりもサーバーとして使おうとしているので、少しLinuxが使いやすくできるように調整しておく。
まずは新規ユーザー名を追加する。Piと同じグループアクセスを行えるように、まずはpiの所属するグループ名をチェック

groups pi

自分の環境では以下が出力された

pi : pi adm dialout cdrom sudo audio video plugdev games users netdev input

これを参考にしてuser1というユーザーを追加するには

sudo useradd -m -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input user1

次に以下のコマンドを入力し、入力を即されたらパスワードを入力(2回)

sudo passwd user1

sshを使ってコマンドラインのみでヘッドレスで動かしているわけだが、ターミナルモードからRaspbianのGUIにアクセスすることもできる。 このためにはTightvncというパッケージを使う。英語のHowtoはここに詳しいが、いかに簡単に手続きだけを述べておくと

sudo apt-get install tightvncserver //vnc server をインストール
tightvncserver //vncserverを起動 password設定を催促されるので8文字以下で入力
vncserver :0 -geometry 1440x900 -depth 24 //画面精度に合わせて適宜調整

これをいちいち入力するのは面倒なので、上記のサイトではConfig fileの書き方などが書いてある。
これでxウィンドウがセットされるので、Windows あるいはLinuxが動いているパソコンからVNC準拠のViewerでIPアドレス、パスワードを入力すればGUI画面がアクセスできる。
tightvnc-pi

インストールされているアプリケーションは左下のスタートメニュー(?)をクリックすればカテゴリーごとに選択できるようになっている。いつも使うアプリケーションについては項目を右クリックし、add to desktopを選べばデスクトップ上にアイコンを置くことができる。

手間をかけてGUIを実現させた理由はWifi-adapterの設定をコマンドラインでやった経験がないからで、(爆) GUI上だとwpa_guiというwifi network への接続設定ツールが使える。 まあほかにもScratchとかRaspberry PiのGUI体験を実感したいという理由も無きにしも非ず。

デスクトップ画面をパソコン上に出した状態で、 作動が確認されている、ということでRPiと一緒に購入したEdimixのEW-7811UNというWireless nano USB Adapterをusbポートに差し込み、internetカテゴリーからwpa_guiを起動する。アダプタはあっさりwlan0と認識されているので、あとはscanを実行し、自宅のRouter のwifi networkをみつけてパスワード等を入力し接続すればよい。 これはシステム上に記憶されるので一度の設定であとはリブートするごとに自動接続される。 これでEthernetケーブルをはずしてもネットワークに接続できるようになった。

電源プラグ、SDカードおよびusb wifi mini adapter で一丁前のコンピューター

物理的につながっているのは電源プラグのみ、SDカードおよびusb wifi mini adapter装備 で一丁前のheadlessコンピューター

現在使っているCISCOのWifi Router にはネットアダプターのMACアドレスに固定IPアドレスを割りつける機能がある。 router のBasicセットアップのページからDCHP Reserveというボタンをクリックすると 現在割り当てらているIPアドレスの一覧が出るので、それでraspberry piを選び、固定アドレスを指定するという作業になる。 raspberry piの電源を一度落としてから再度起動すると新しい固定アドレスが割り当てられた状態でネットワークに接続される。

ここまでできたら、あとはApache, PHP, MYsqlをインストールすればdynamic web server が完成するわけで、そういうチュートリアルもネットを探せばいくらでもあるわけだが、それでは面白くないので、apacheの代わりに近頃勢いを得つつあるnginxを導入してみることにする。 説明を読んでいるとReverse proxyにも使えるということなので、現在NASで構築してるsquidを使ったreverse proxy をついでに置き換えることができないかとも思っているわけである。 その顛末は次回。

Raspberry Pi を 頭を使わずに食べてみる(Eating Raspberry Pi Headless)

旅行から帰ってきたらRPi が届いていたので早速食べてみた。本来ならば、キーボードとモニターを接続して初期設定することになるのだが、最初から小規模のhtmlサーバーとして使おうと考えているのでモニターやキーボードは接続せず (いわゆるheadless)、EtherNetへの接続だけでの設定を試みた。 ネット上から拾ってくるオフィシャルOSであるRaspbian ”wheezy” (Debian LinuxのRPiポート)のイメージではsshが最初から組み込まれているのでこのイメージを展開したSDカードをスロットに挿入し、ネットワークケーブルを接続しておいてから電源を接続する。 RPiのLEDが華やかに点滅を始めるので、これが一段落したのちに、ラウターのDHCPテーブルを眺めてみるとRaspberrypiの名前でIPが設定されているのでこのIPに対してSSH接続を行う。自分の環境では192.168.1.122 に設定されていたので

 ssh pi@192.168.1.122

これをcygwin ターミナルから入力する。

最初の設定ではuser がpi, password がRaspberry と設定されている。
なお、母艦はWindows 8なのだが、巷で人気のあるPutty ではaptitude や、raspi-configなどAscii Codeでグラフィック表示を行うアプリでは表示が崩れるようなので、ここではcygwin からオプションでインストールしたSSHクライアントを使ってアクセスしている。

Putty terminal でrapsi-configを実行。

Putty terminal でrapsi-configを実行。

cygwin TerminalからのSSH アクセスで raspi-configを実行

cygwin TerminalからのSSH アクセスで raspi-configを実行


最初のログインでは「まずRaspi-configを起動して設定を行ってください」というような意味のメッセージが出る。 モニターとキーボードを使っていれば、自動的に起動するようだが、headlessではマニュアルで進めることになる。
sudo raspi-config

このraspi-config の設定画面、インターネットなどで見る設定画面とはメニュー構成が異なっている。バージョンが上がっているのだろう。 去年の今頃から発売開始になって以来、環境は日々進化しているようなのでネット上の情報は十分吟味する必要がありそうだ。ネットでみると大変そうな作業がツール側の対応が進んでいて実は簡単にできるようになっていました、というような事例が多々ありそうだ。

例えば、最初に使うOSのイメージは2GBなので、サイズの大きなSDカードを使っている場合、このRaspi-configの最初のオプションexpand rootfsを実行することにより、ファイルシステムのサイズをSDカードのサイズいっぱいまで拡大する作業、 は必須項目なのだが最初のころはこれも手作業でやっていたようなのだ。

次の項目、Change Password は、後々別のユーザーを追加するにしても、やっぱりやっておいた方がよい。
Boot to desktopは、モニターを使っていた場合、いちいちstartxとコマンドラインから立ち上げるのではなく、直接GUIを立ち上げてしまおう、というオプションだが、今回の使用目的とは関係ないのでスキップ。

Internationalized option ではkeyboard、locale,time zoneなどが変更できる。 Default ではUKのキーボード配列、使用場所英国になっているため、適宜変更。
Advanced option ではメモリースプリットやhostnameなどが変更できる。モデルBの512MBバージョンではGPUに64MBが振り分けられている。headless で使うということであまりグラフィック関係にメモリーは必要ない、と考えられるのでメモリースプリットにかんしては16MBに変更しておく、
OverClock は興味のある分野ではあるが、とりあえずはパス。 ちなみにつかうとRPi内部のフューズが切れて例えクロックを元に戻しても履歴がわかるようになって、保証対象外となるそうである。というのは古い情報で、Raspi-configで設定するオーバークロックはターボモードと称し、温度が85度以上になると自動的にステップダウンする仕組みになっているらしい。補償対象内の設定だそうだが、チップのばらつきにより、設定によってはブートしなくなる可能性あり。この場合、シフトキーを押しながらリブートしろ、とあるが、こちらはヘッドレスで動かしているので、復帰の仕様がない。
Enable Camera というのはそのうち出てくるPI カメラモジュールに関した設定。
Add to RasTrack はRPiのユーザーがそれぞれ自分のPiを登録し、それをマップで確認できるサービスで登録するのは任意だ。日本はまだ100個台の登録状況であるが、隠れユーザーはこの何倍もいるはず。 街のレベルまで登録するので、ご近所さんで食べてる人が何人いるか確認できてそれなりに楽しい。

Finish を選択するとリブートするか聞いてくるのでYESを選択。

ファイルシステムのサイズ変更にしばらくかかるので他の仕事をやりながら気楽に待ち、LEDの点滅が落ち着いたら、もう一度sshでログイン。 このタイミングでraspbianのアップデートも行っておく。

sudo apt-get update
sudo apt-get upgrade

(Update でデータベースのアップデートをおこない、upgradeで最新のモジュールに更新する。)

自分はDebian Base のUbuntuをデスクトップで使ったり、使っているNAS(Wester ditigal 製 Mybooklive)がDebian で動いているなどの経緯からDebian Linuxはある程度馴染みがあるのででほとんどストレスがなく設定できた。

ところでRPiには電源スイッチがない。電源を落とすにはプラグを抜くことになるのだが、その前にシステムをシャットダウンしておくのが利口なようだ。プラグを引っこ抜いてSDカード上のイメージが破損してしまった、というような報告がネット上に散見される。

sudo shutdown -h now

五個あるLEDのうち電源表示の赤いLEDだけの点灯になったら多分安全。 ここでプラグを抜くのだが、機械的ストレスをPRi本体に与えない、という観点からRPi側ではなく、電源プラグ側のコードを抜く。

電源だが、700mA以上必要、となっている。 携帯の充電器では 400mA定格が多いという記述もネット上で見ていたので、手持ちのスマホ携帯の定格を調べてみたがいずれも1Aとなっており、問題なさそうだ。

裸のままのRPiではケーブルをいくつも接続すると非常に不安定になる、のでケースは必須に思われる。ネット上では厚紙で作るケースの設計図なども落ちてはいるのだが 自分は見栄えに引かれてアクリルの透明なケースを買った。が、電源を入れっぱなしにしておくと、結構暖かくなる。 オーバークロックなどヘビーな使い方をするのであればヒートシンクを追加するか、最初からアルミのケースのほうがよいかもしれない。

次回は母艦からのGUIアクセスのためのTightVNCの導入、Wifi モジュールのインストールおよびIPアドレスの固定をおこなった後、nginx, php, mysqlの導入の顛末を述べる。