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
動いていることが確認できた。
次はモデル、コントローラとの連携をして、実際の処理をしていく。
2016年1月2日土曜日
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の設定とコントローラ/アクションとの連携をしてみます。
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
表示するとこんな感じ
横軸が時刻が意外に苦労しました。
参考
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/
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/
登録:
投稿 (Atom)











