====== サーバ機のプログラミング ====== ===== エントリポイントの準備 ===== サーバー機では、Aloneの[[alcgi:start|CGIモジュール]]を使います。これには、apache httpdと協調動作をさせなければなりません。 いくつか方法がありますが、ここでは、[[detail:ディレクトリ構成とデプロイ|ディレクトリ構成とデプロイ]]の項でいうケース2の方針で実施します。 エントリポイントの雛形は、alone/htdocs/index.rb として用意してありますので、これを /usr/lib/cgi-bin へコピーします。併せて、htdocs以下の静的コンテンツも公開ディレクトリへコピーします。 sudo cp alone/htdocs/index.rb /usr/lib/cgi-bin/ sudo cp -R alone/htdocs/* /var/www/html/ コピーしたindex.rbを編集し、requre "al_config" のパスを絶対パスで書き換えます。 require "/home/pi/alone/al_config" ここまでで、Aloneのデプロイは終わりです。試しにアクセスしてみましょう。サンプルプログラムの一覧が表示されたら成功です。 http://192.168.1.11/cgi-bin/index.rb ===== REST API の設計 ===== REST APIは、以下のようにします。 **URL**\\  http://HOST/cgi-bin/index.rb?ctrl=data_post **メソッド**\\  POST\\ **データ形式**\\  data={JSON ENCODED DATA}\\  例:data={"pressure":"1013.12345", "temperature":"25.567"} 今回は簡単にするため、データJSONの前に、data= と付与してブラウザからのPOSTを模擬します。 また、アクションではGETとPOSTの識別までは行いません。 ===== データ保存型式の設計 ===== データ保存は、日付ごとのファイル名をつけたCSVファイルとして保存する仕様とします。\\ 本格的にはデータベース等を採用すべきですが、ここでは簡単のためにファイルシステムを使います。 /var/log/logger/data-YYYYMMDD.csv CSVファイルには、先頭にデータ受信日時を付加し、気圧、気温の順でコンマ区切りで記録します。 * CSVファイルヘッダはつけません * 日時は現地時間とし、タイムゾーンは省略します * 気圧はhPa単位とし、小数点2位まで記録します * 気温はセルシウス度とし、小数点1位まで記録します * 改行コードは、CRLFとします。 YYYY-MM-DD HH:MM:SS, ####.##, ##.# (CRLF) ===== Alone アクションとして実装 ===== ではこのREST APIをAloneのアクションとして実装しましょう。 コマンドラインで以下のコマンドを打って、雛形を作ってください。 cd alone/controllers/ mkdir data_post cd data_post データを保存するディレクトリも作りましょう。 sudo mkdir /var/log/logger sudo chown www-data:www-data /var/log/logger 次に、コントローラクラスにアクションメソッドを実装します。\\ 今回はデフォルトアクションでデータを受信するので、action_indexメソッドを実装します。アクションが正しく終了したこと見てわかるように、最後に"OK"と出力するようにもしておきました。 require "alone" require "json" class DataPostController < AlController FILENAME = "/var/log/logger/data-" def action_index data = AlForm.get_parameter(AlText.new("data")) log data data = JSON.parse( data ) now = Time.now filename = FILENAME + now.strftime("%Y%m%d") + ".csv" csv = now.strftime("%Y-%m-%d %H:%M:%S, ") + sprintf("%.2f, %.1f\r\n", data["pressure"].to_f, data["temperature"].to_f) open(filename, "a") {|file| file.write( csv ) } puts "OK" end end ===== 単体テスト ===== REST-APIが正しく動作するか、単体でテストしておきましょう。\\ 標準でcurlコマンドが用意されていますので、これを使って /var/log/logger 以下に正しくCSVファイルができるか確認してみます。\\ もし動かなければ、そのエラー理由が /tmp/al_cgi.log ファイルに記録されています。これをみながらデバッグします。 curl -X POST -d 'data={"pressure":"1013.12345", "temperature":"25.567"}' \ 'http://localhost:/cgi-bin/index.rb?ctrl=data_post'