Raspberry Piの書籍って

本屋さんの電子工作が並ぶ書架にいってみるとRaspberry Piの関係の書籍がたくさんあった。新刊ラッシュのようである。
ぱらぱらと立ち読みしてみると、php付きApacheサーバとMySQLサーバを立ててWordPressをインストールと言う記事が目にとまった。
本格的SQLサーバであるMySQLはデータ読み書きが頻発するであろうSQLサーバ(MySQL)である。SDカードで運用するRaspberry PiのSDカードへのダメージが大きそうである。というより、Raspberry Piでやらなくてもサクラレンタルサーバでも借りれば本格的でグローバルな環境が得ることができる。そこで思う存分やればいいことである。

迷走してないか?
Raspberry Piの書籍の作家さんも、もうちょっと頑張ってほしいものである。

グルー言語

ここからが本題である。グルー言語である。UNIXではもろもろのコマンドなど切り貼りして別の何かのコマンドに仕立てることが多い。この時に使用するインタプリタ言語をグルー(膠)言語と呼ぶ。bashなどシェル言語も強力なグルー言語であるが、より高度なPerlやPythonやRubyなどもグルー言語なのである。

Raspberry Piを関しては、Pythonのゲームサンプルあることをみるとグルー言語のスタンダードはPythonなのであろう。日本ではマイナー感があるPythonは、欧米で人気のオブシェクト指向のスクリプト言語である。逆に日本で人気のRubyは欧米ではマイナーなのである。

ばんとさんはPythonを知らないのでRubyでグルー言語の例題を書いてみた。Raspberry Piのメモリ状況によってLEDを点灯するプログラムである。wiringPiをインストールすると導入されるgpioコマンドを利用すれば、以下のように書ける。

#!/usr/bin/env ruby

def meminfo
  mem_file = open("/proc/meminfo","r")
  while line = mem_file.gets
    if /^MemTotal:/ =~ line then
      total_mem = line.scan(/^MemTotal:\s+([0-9]+)\s+kB/)[0][0].to_i 
    elsif /^MemFree:/ =~ line then
      free_mem = line.scan(/^MemFree:\s+([0-9]+)\s+kB/)[0][0].to_i 
    end
  end
  mem_file.close

  percent_mem = 100 - (free_mem*100/total_mem)

  return [total_mem, free_mem, percent_mem]
end

#  Main Start
########################################
system('gpio reset')
system('gpio mode 0 out')
system('gpio mode 1 out')
system('gpio mode 2 out')
system('gpio mode 3 out')

total, free, percent = meminfo

if percent < 25 then 
  system('gpio write 0 1')
  system('gpio write 1 0')
  system('gpio write 2 0')
  system('gpio write 3 0')
elsif percent < 50 then
  system('gpio write 0 1')
  system('gpio write 1 1')
  system('gpio write 2 0')
  system('gpio write 3 0')
elsif percent < 75 then
  system('gpio write 0 1')
  system('gpio write 1 1')
  system('gpio write 2 1')
  system('gpio write 3 0')
else
  system('gpio write 0 1')
  system('gpio write 1 1')
  system('gpio write 2 1')
  system('gpio write 3 1')
end

print "Memory usage:#{percent}% (Total:#{total}kB Free:#{free}kB)\n"

メモリ状況は仮想ファイルを読むことによって分かる。こんな感じである。

bant@raspberrypi ~ $ cat /proc/meminfo
MemTotal:         383752 kB
MemFree:          303192 kB
Buffers:           15924 kB
Cached:            42080 kB
SwapCached:            0 kB
Active:            30980 kB
Inactive:          37224 kB
Active(anon):      10224 kB
Inactive(anon):      188 kB
Active(file):      20756 kB
Inactive(file):    37036 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        102396 kB
SwapFree:         102396 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         10212 kB
Mapped:             7188 kB
Shmem:               216 kB
Slab:               4836 kB
SReclaimable:       1796 kB
SUnreclaim:         3040 kB
KernelStack:        1008 kB
PageTables:          604 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      294272 kB
Committed_AS:      81308 kB
VmallocTotal:     630784 kB
VmallocUsed:         780 kB
VmallocChunk:     416228 kB

この出力を

total_mem = line.scan(/^MemTotal:\s+([0-9]+)\s+kB/)[0][0].to_i 

のようにして正規表現を使ってマッチングさせ数値を取り出してる。

アプリ(コマンド)やファイルなどをグルー(膠)で接着し新しいアプリ(コマンド)を作ることができるのである。
Linuxが動いてるRaspberry Piはコマンドやアプリが充実してるので、グルー言語で接着してけば、存外高性能なアプリ(コマンド)を作れる。

Pythonも学習しようか

bashやPerlやRubyは分かるが、何となく触れる機会が少なかったPythonは知らない。これを機会に学習してみようか。