bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

RaspberryPi でHaskellを使う

1.Raspberry Pi

Raspberry Piは、一番最初の頃のユーザーなのだが、その後、長いことご無沙汰だった。先日、ベトナムで酪農業の支援をしているコンサルタントの方と話をしているときに、地中、地表、地上のあちこちにセンサーを設けて、様々なデータを収集すると、酪農業のIT化ができるのではないかと夢が広がった。

このことがきっかけで、最近のRaspberry Piを調べてみると、外部との入出力がとても扱いやすくなっていることが判明した。そこで、最終的には、センサーでとったデータを収集して適切なアドバイスを施すようなを営酪農支援システムを構築したいのだが、しかも、Haskellを用いて実現したいと考えている。そこで、今回は、Raspberry PiのインストールからHaskellの実装までをしてみた。

箱入りのRaspberry Piはこのような感じである。MicroSDは奮発して64Gを用いた。
f:id:bitterharvest:20150614170243j:plain

箱から出すとこのような感じである。
f:id:bitterharvest:20150614170348j:plain

2.OSのインストール

OSのインストールはいたって簡単であった。Micro SDを別のパソコンを利用して、フォーマットした後、RaspbianのイメージをMicro SDに移せばよい。

このあと、OSがインストールされたMicro SDをRaspberryに装着し、電源を入れれば立ち上がってくる。最初は初期設定の画面が出てくるので、利用できるディスクの量を拡大したり、タイムゾーンやキーボードの種類を設定したり、SSHサーバの設定をしたりする。

インストールに当たっては、「Raspberry Pi 2 Model B をインストールしてSSH接続できるようにしてみる」という記事を参考にした(最後のネットワークの設定は行わなかった)。

3.Raspberry Piの手足をもぐ

Raspberry Piにモニター、キーボード、マウスをつけた状態で使うのは何とも煩わしい。部屋の隅にそっと鎮座していて、機能だけ提供してくれればよいので、リモートでコントロールすることとした。

そこで、別のパソコンの方にTera Termをインストールし、外部のパソコンからRaspberry Piを操作できるようにした。なお、Tera Termを利用するときは、IPアドレスが必要になるが、これはOSをインストールしたときにでも見ておくとよい。それにはifconfigを用いる。

また、ファイルも転送できるようにWinSCPも外部のパソコンにインストールした。

4.Haskellのインストール

これも、いたって簡単である。Tera Termの画面で、

sudo apt-get install ghc haskell-platform

を行えばよい。

それでは、Raspberry Pi上で実際にプログラムを動かしてみる。ここでは、nimというゲームを用いた。このゲームは、二人で競うゲームで、マッチの棒が5本、4本、3本、2本、1本置かれている五つの山がある。各プレーヤは、一回のプレーで、一つの山からいくつでもマッチ棒を取ってよい。最後のマッチ棒を取ったほうが勝ちである。このゲームは、今学期、大学院生へのある講義科目での課題の一つである。

プログラムは次のようになる。

a = [5,4,3,2,1]

stars = ['*','*'..]

print' [a1, a2, a3, a4, a5] = do
  putStrLn $ "1:" ++ take a1 stars
  putStrLn $ "2:" ++ take a2 stars
  putStrLn $ "3:" ++ take a3 stars
  putStrLn $ "4:" ++ take a4 stars
  putStrLn $ "5:" ++ take a5 stars

myplay a = do
  print' a
  putStrLn "ワタシ:何行目?"
  r <- getLine
  putStrLn "ワタシ:何個?"
  s <- getLine
  let row = read r :: Int
      star = read s :: Int
      b = [bi | i <- [1..5], let ai = a !! (i - 1), 
                let bi = if i /= row then ai else if ai - star > 0 then ai - star else 0]
  if b == [0,0,0,0,0] then return "I won!" else yourplay b

yourplay a = do
  print' a
  putStrLn "アナタ:何行目?"
  r <- getLine
  putStrLn "アナタ:何個?"
  s <- getLine
  let row = read r :: Int
      star = read s :: Int
      b = [bi | i <- [1..5], let ai = a !! (i - 1), let bi = if i /= row then ai else if ai - star > 0 then ai - star else 0]
  if b == [0,0,0,0,0] then return "You won!" else myplay b

main = myplay a

実行結果は次のようになった。
f:id:bitterharvest:20150614180616p:plain

最後に、Raspberry Piの電源を切るときは、

sudo halt

とする。

今回のRaspberry Piの値段は5960円、なんともコスト・パフォーマンスの良いパソコンである。