2016年1月2日土曜日

Cakephp:cronでのシェルの実行

Cakephpで作ったシェルをcronで動かす方法です。

1.シェルを作成
前回作ったシェルを利用(http://mizunolab.sist.ac.jp/2016/01/cakephp-shell.html

2.呼び出すためのスクリプトを作成
スクリプトはいらないかもしれませんが、作っときました。
app]$ vi Vendor/CakeShell.sh
#!/bin/bash

cd ~
cd www/app
Console/cake test

app]$ chmod +x Vendor/CakeShell.sh

3.cronに登録
app]$ crontab -e
* * * * * /home/garden/www/app/Vendor/CakeShell.sh >> /home/garden/cron.txt 2>>/home/garden/cron_err.txt

動作確認のため、ホームディレクトリのcron.txtとcron_err.txtに追記しておく(2つのファイルも作っておく)。

app]$ cat ~/cron.txt
動いていることが確認できた。
次はモデル、コントローラとの連携をして、実際の処理をしていく。

Cakephp : Shellの実行

裏で延々と処理させるスクリプトを作りたかったので、サンプルを作ってみました(はまりました)。

1.php環境の確認
 $ php -v
2.シェルの作成
appディレクトリで作業します。
掟その1:ファイル名(クラス名)はTestShell.php(クラス名:TestShell)のようにShellの前に任意の名前(頭文字大文字)をつけること。
掟その2:シェル実行時はtest (任意でつけた名前のすべて小文字)で実行
掟その3:必ずextends Shell(またはAppShell)すること
掟その4:シェルはConsole/Commandに配置すること

ということで、下記のコードを用意しました。
app]$ vi Console/Command/TestShell.php

class TestShell extends Shell {
  function main () {
    $this->out('Hello CakeShell');
  }
}
?>

3.シェルの実行
app]$ Console/cake test
でやるだけなのですが、結果も出てきましたが、Warningもでてきました。

4.環境の修正
Permissionエラーなので、調べてみるとmaskの問題みたいです。
app]$ vi Config/core.php
375, 388行目のmaskを追加しました。これでもうまくいかないので、
app]$ vi Config/bootstrap.php
Cache::config('default', array(
    'mask' => 0666,
));
を追加しました。
参考
http://www.iwaking.com/20121210/740/

まだうまくいきません。もう少し調べてみると、app/tmpのディレクトリの中身のPermissionがまだ悪いみたい。
参考:http://qiita.com/mochizukikotaro/items/f60f70b595f2a7a302c2
cakephp設置時に
app] $ chmod -R 777 tmp
としているが、Permissionが変わらなかったファイルがあるらしい。もう一度やったが
ダメだった。なのでrootで実行して変更した。もう一度実行してみると
となってやっとできた。
次は、cronの設定とコントローラ/アクションとの連携をしてみます。

2015年12月31日木曜日

GoogleChart : 時刻入りのグラフを描く

Arduinoから温度を取ってAndroidを中継しデータベースに入れてあります。これをGoogleChartでグラフ表示する方法です。
横軸が時刻が意外に苦労しました。
参考
http://nvnote.com/google-charts-create-graph-xaxis-date/

コントローラ
app]$ vi Controller/SensorsController.php

public function graph($datetime = '2015-12-17') {
                $this->Sensor->recursive = 0;
                $date=date("Y-m-d",strtotime($datetime));
                $this->paginate = array(
                        'conditions'=>array(
                                'Sensor.created BETWEEN ? AND ?' => array($date." 00:00:00", $date." 23:59:59")
                        ),
                        'order' => array('id' => 'asc'),
                        'limit'=>100000,
                );


                $this->set('sensors', $this->Paginator->paginate());
        }
※引数は自由に変更。date関数がちょうどいいかも
findの時、createdの型を指定して範囲を指定し持ってくる
参考
http://d.hatena.ne.jp/YamamoriSansa/20101101/1288611148

ビュー
app]$ vi View/Sensors/graph.ctp
[挿入コード]
コード
注意
・カラムの型をdatetimeにする
 data.addColumn('datetime', '日時');

・created の型が 2015-12-31 17:10:11のようにハイフンで区切られている。Date型が2015/12/31 17:10:11なので文字を変換する。

参考
http://www.ajaxtower.jp/js/date_class/index1.html

表示するとこんな感じ

2015年12月30日水曜日

CentOSへrJavaのインストール

CentOSにRがインストールできたので(http://mizunolab.sist.ac.jp/2015/12/centosr.html)、次はrJavaをインストールする。
rootで作業します。

1.R起動
# R

2.rJavaのインストール
> install.packages('rJava')
Installing package into ‘/usr/lib64/R/library’
‘/usr/lib64/R/library’にインストールされるらしい。

ミラーサイトでJapanを選択

インストールが始まり、1分位かかった。
rootでの作業を終了します。

> q()

利用するユーザに変わります。
# su - ユーザ名

JRI.jarファイルのありかを探す
~]$ ls -l /usr/lib64/R/library/rJava/jri/
とするとありました。

クラスパスの設定をします。R_HOMEの追加もしておきます。
 $ vi .bashrc
export CLASSPATH=/usr/lib64/R/library/rJava/jri/JRI.jar:$CLASSPATH
export R_HOME=/usr/lib64/R




$ source .bashrc

 ソースを書いてみます。
$ vi RSample.java

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class RSample {
        public static void main(String[] args) {
                Rengine engine = new Rengine(new String[]{"--no-save"}, false, null);
                engine.assign("a", new int[]{36});
                REXP result = engine.eval("sqrt(a)");
                System.out.println(result.asDouble());
                engine.end();
        }
}



コンパイル
$ javac RSample.java


実行
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ RSample
プロパティを指定して実行します。

ちなみにプロパティを指定しないと、下記になります。

 またR_HOMEが設定されてないと、下記になります。

参考
http://qiita.com/Kentrow@github/items/cdc17f1c65f99a01396f
http://binfalse.de/2011/02/20/talking-r-through-java/