Python でテクストファイルを読み書きする。

With と For iterater を使うとファイルを明示的にクローズしないでもよいそうだ。
例題でやっているのはTest.txtというファイルから一行ずつ読み込んでリストを作成し、それをリストオブジェクトのSortedメソドで並び替えをしたのち、test2.txtというファイルに書き戻す、という作業。 なんか簡単にできるし(簡単だけど)、コメントを入れなくても読み解きやすい感じ。このあたりがPythonの強みか。

a_list=[]
with open("test.txt", mode="r",encoding='utf-8') as a_file:
     for a_line in a_file:
         a_list.append(a_line.rstrip())

a_list = sorted(a_list)

with open("test2.txt", mode="w", encoding='utf-8') as a_file:
    for a_line in a_list:
        a_file.write(a_line+'\n')

敷居が低すぎる?

ブレッドボーディングするのに簡単な回路図を作成するアプリをさがしていたのだが、目的にぴったりのWEB Serviceを見つけた。
最初はEAGLEというeCAD ツールを使おうと思っていた。 これ自体、配線板のラウティング機能もついた本格的なもので、しかも手のひらサイズの二層までの配線板なら無料バージョンで可能という秀逸品だが、 今回発見したのは
Circuitlab.com というWEBアプリケーション。 回路図の作成がこんなに簡単でよいのか?というくらいに簡単なDrag and Dropで作図ができる。 しかも回路シュミレーション機能がついている。 ホームページに簡単な紹介ビデオがあるが、 作成した回路図をWEB上でシェアすることもできるようになっている。 1週間に20分までなら無料。 商用に使わなければ1年間の使用料が$39ドル。 エディター使い放題でSPICE解析もできるといういことで いわゆる趣味の電子工作、電子回路の自宅学習には非常に便利と思う。
3分の紹介ビデオを見れば使い方はほぼわかるので是非お試しを。 こんなに敷居が低くてよいのか、と思わず思ってしまうのである。

CubieBoard っていうのもある。

Raspberry Pi でポピュラーになったHobbyist development board. BeagleBone Blackについては以前にも書いたけれど、他にも色々ある。 先月CubieBoard2というのを入手した。 値段は59ドルだが、corteck A7 デュアルコア 1Ghz、1GB RAM, 4GBNand, 2USB, SATA I/F, HDMI などなど、現時点でこのプライスレンジのボードではダントツのスペック性能をほこる。 これはCubieTechという中国の会社の製品。 SOCはやはり中国のAllwinner製A20。  RaspberryPiがBoradcomm, BeagleBoneがTIとそれぞれの国のSOCを使っているわけで、日本で同じものをつくろうという有志はいないものか?そもそも日本の国産のSOCってあるのかしらん。 閑話休題

この値段で中国から購入したのだが、送ってくるのが船便みたいで、到着するのに約3週間かかった。(当方米国の中西部在住)
また、このボードが売り出されたのが今年の4月ころということもあってfirmware が固まっておらず、 内臓のMali400 Gpu などの性能を十分にひきだせるようなドライバーがまだまだ開発途中。 ユーザーベースも他のボードにくらべて小さい、ということもあり、初心者入門としてはきちんと動くようにするには少しハードルが高い。またADAFRUIT, ELEMENT 14などのリテイラーのパトロンもついていないので米国で周辺部品を入手するにも苦労しそうだ。

というわけでせっかくGPIOが96ピンもでているわけだが、結局、Debian のディストロを導入してHome Server にした(Name Server, Mail server, Web server, reverse proxy)。 導入の仕方はRaspberry Pi, BeagleBone Black でおこなったのとほとんど同じ。 同じLINUXのディストロを使う強みである。 性能的にはBBBでも十分だったが、 このCubie2、専用のケースに入れてみると、Home Server としての貫録十分であるしさすがに1Ghzのデュアルコア。きびきび動いている印象大。 これでBBBとRasPiはPhysical computing のお遊びにつかえるようにしようと我が家のホームネットワークのクリティカルタスクデューティからは外れたわけである。

Computing is fun, once again

image of zx80

My first “system”

This was my first personal computer, Sinclair ZX-80 from U.K . (BTW, It’s not ZEE-X. It should be pronounced, Zedd-X) for $199. You still needed a TV monitor. So I had to shell out another $70 for portable tube based TV. Membrane keyboard was so primitive it took me 30 minutes to enter a simple basic program. It came with 1k byte of S-RAM and Z80 CPU operated on 1Mhz speed. The screen memory was shared with program memory, so if you enter long program, it starts reducing the displayable screen lines. It did not have dedicated display driver so every time key is pressed, the screen would blink. Still I had a lot of fun from this “system” back in…. 1981.
 
 
 
Fast forward to today. The core of the system is Raspberry Pi , so called $35 computer from UK. It actually cost me $42(plus shipping) from Amazon.com. There is also BeagleBone Black (aka “American” Pi) for $45 that can be used in approximately the same way. The Raspi runs on 700Mhz Arm processor and comes with 512MB of RAM. (BBB runs on a bit more powerful Arm processor@1GHz with 512MB or RAM) You use2GB or larger SDHC card to copy bootable linux image downloaded from the internet and pop into the SD card slot. (BBB has 2GB internal memory that is already prepped) The system will boot up Linux OS.
It connects to USB keyboard and HDMI monitor. Since it has Ehternet connection, one can also use it headless. I ran mine headless and use terminal program from my PC to control it.
 
It has some of I/O pins exposed so you can connect it to electronic components such as LED or motor, or get input from temp sensor or switch or whatever. If you goof up and destroy it, it will cost you mere $42 to replace it, so, have no fear.
 
As said, to make a complete computer out of it, you will need a keyboard and monitor.
USB keyboard is cheap, but HDMI monitor is not. Enter “lapdock” from Motorola. This was sold as a docking station for Motorola smart phones but apparently was a big flop although Lapdock itself appears to be a beautiful device. It looks like a Macbook Air.
One time you could buy this thing for $40 from Amazon. Original price was more than $500. Then somebody “discovered” that the lapdock can be used with the Pi. Now the instruction of how to connect the Pi (or BBB, or whatever the dev board you want to connect) to the Lapdock is everywhere on the Internet. As of today, the cost of “Atrix 4G Motorola Lapdock” is about $120. I got mine for about $80 just a few weeks ago. Economy of scale must be working nicely. Spend another $20 for cables and you really have a real computer for less than $200.
Computing is fun, once again.

$35(Raspi)+$80(Lapdock)+$20(cable Set)+$8(SD Card) + S&H($12)=$155 system

$35(Raspi)+$80(Lapdock)+$20(cable Set)+$8(SD Card) + S&H($12)=$155 system

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も導入可能になったはずだ。