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月31日木曜日
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/
2015年12月28日月曜日
Java : 総組み合わせプログラムの実行
総組み合わせを算出するプログラムを作りました。プログラムとしては貧弱(最低)ですが、実行させることだけ考えて作りました。
プログラムソース
Linuxでベタに実行する方法です。
1.FTP等でファイルのアップロード
今回はパッケージ:roundrobin毎アップロード。今回はホームディレクトリにjavaフォルダを作ってその中にroundrobinをいれます。
2.mysql-connectorの設定
Javaの設定ももちろんですが、コネクタの設定もしておきます。
http://mizunolab.sist.ac.jp/2015/11/linuxjavamysql.html
3.コンパイル、実行
まずサーバにsshで接続します。rootで接続した場合(証明書あり)
# su -ユーザ名
$ cd java
またはユーザで接続する場合
ssh -l ユーザ名 ホスト名
[コンパイル]
java]$ javac roundrobin/*.java
[実行]
java]$ java roundrobin.Roundrobin_main
[データベースの確認]
今回使っているテーブルはcombinationsとpointsの2つです。
combinationsテーブルにアクセスすると、ID、Nのところに値が入ってきます。NはnCrのrの部分のところです。
そこのViewをクリックすると、関係してあるpointsレコードが出力され、ID, Facility_id, Combination_idに値が入ってきます。
※一番最初だけテーブルをtruncateしておいた方が確認しやすいかもしれません。
[総組み合わせの修正]
今回はnCrのnは固定(n=42)、rを変更していきます。
42C41を算出する場合
(1)
java]$ vi roundrobin/Roundrobin_main.java
int n = 42, k = 41;
kのところが41となっていることを確認します。
(2)java]$ vi roundrobin/Roundrobin_lib.java
for(idx[40] = idx[39]+1 idx[40] < n-k+41; idx[40]++){
・・・
・・・
}//40
のところが有効になっていることを確認します。
(3)コンパイル、実行、確認
java]$ javac roundrobin/*.java
java]$ java roundrobin.Roundrobin_main
データベースも確認します。
42C40を計算する場合
java]$ vi roundrobin/Roundrobin_main.java
int n = 42, k = 40;
kのところが40に変更。
java]$ vi roundrobin/Roundrobin_lib.java
// for(idx[40] = idx[39]+1 idx[40] < n-k+41; idx[40]++){
//}//40
この2行だけをコメントアウトします。
inputResult(index, idx);
mysql.insertCombination(k, idx);
index++;
はコメントアウトしない
このような感じで42C39を実行する場合も
java]$ vi roundrobin/Roundrobin_main.java
int n = 42, k = 39;
kのところが39に変更。
java]$ vi roundrobin/Roundrobin_lib.java
このようにidx[39]のところを対でコメントアウトします。
このように数を減らしていきながら、ファイルのコメントアウトを増やしていきます。
プログラムソース
Linuxでベタに実行する方法です。
1.FTP等でファイルのアップロード
今回はパッケージ:roundrobin毎アップロード。今回はホームディレクトリにjavaフォルダを作ってその中にroundrobinをいれます。
2.mysql-connectorの設定
Javaの設定ももちろんですが、コネクタの設定もしておきます。
http://mizunolab.sist.ac.jp/2015/11/linuxjavamysql.html
3.コンパイル、実行
まずサーバにsshで接続します。rootで接続した場合(証明書あり)
# su -ユーザ名
$ cd java
またはユーザで接続する場合
ssh -l ユーザ名 ホスト名
[コンパイル]
java]$ javac roundrobin/*.java
[実行]
java]$ java roundrobin.Roundrobin_main
[データベースの確認]
今回使っているテーブルはcombinationsとpointsの2つです。
combinationsテーブルにアクセスすると、ID、Nのところに値が入ってきます。NはnCrのrの部分のところです。
そこのViewをクリックすると、関係してあるpointsレコードが出力され、ID, Facility_id, Combination_idに値が入ってきます。
※一番最初だけテーブルをtruncateしておいた方が確認しやすいかもしれません。
[総組み合わせの修正]
今回はnCrのnは固定(n=42)、rを変更していきます。
42C41を算出する場合
(1)
java]$ vi roundrobin/Roundrobin_main.java
int n = 42, k = 41;
kのところが41となっていることを確認します。
(2)java]$ vi roundrobin/Roundrobin_lib.java
for(idx[40] = idx[39]+1 idx[40] < n-k+41; idx[40]++){
・・・
・・・
}//40
のところが有効になっていることを確認します。
(3)コンパイル、実行、確認
java]$ javac roundrobin/*.java
java]$ java roundrobin.Roundrobin_main
データベースも確認します。
42C40を計算する場合
java]$ vi roundrobin/Roundrobin_main.java
int n = 42, k = 40;
kのところが40に変更。
java]$ vi roundrobin/Roundrobin_lib.java
// for(idx[40] = idx[39]+1 idx[40] < n-k+41; idx[40]++){
//}//40
この2行だけをコメントアウトします。
inputResult(index, idx);
mysql.insertCombination(k, idx);
index++;
はコメントアウトしない
このような感じで42C39を実行する場合も
java]$ vi roundrobin/Roundrobin_main.java
int n = 42, k = 39;
kのところが39に変更。
java]$ vi roundrobin/Roundrobin_lib.java
このようにidx[39]のところを対でコメントアウトします。
このように数を減らしていきながら、ファイルのコメントアウトを増やしていきます。
Java : コマンドラインでのコンパイル&実行
ローカルで作ったプロジェクト(MacまたはWindows)をサーバ(Linux)で動かす時に使うコマンドです。
1.Eclipseで作ったプロジェクトを確認
今回は、パッケージ名:roundrobin、クラス:MySQL.java, Roundrobin_lib.java, Roundrobin_main.javaを利用します。
2.FTPでjavaを利用するディレクトリにアップします。
今回はjavaディレクトリを作り、その中にパッケージフォルダ(roundrobin)をいれておきます。
3. コンパイル
java]$ javac roundrobin/*.java
4.実行
java]$ java roundrobin.Roundrobin_main
これで色々できます。
1.Eclipseで作ったプロジェクトを確認
今回は、パッケージ名:roundrobin、クラス:MySQL.java, Roundrobin_lib.java, Roundrobin_main.javaを利用します。
2.FTPでjavaを利用するディレクトリにアップします。
今回はjavaディレクトリを作り、その中にパッケージフォルダ(roundrobin)をいれておきます。
3. コンパイル
java]$ javac roundrobin/*.java
4.実行
java]$ java roundrobin.Roundrobin_main
これで色々できます。
2015年12月26日土曜日
Cakephp : Googlechartでのグラフ表示
2015年12月25日金曜日
Cakephp : 複数の外部キーの設定
Cakephpで複数の外部キーを設定するときのメモ。
複数の外部キーといっても、同じテーブルに他の同じテーブルの外部キーを複数設定する場合です。つまり、operationsテーブルに2つのoperatorsテーブルのキーがある場合、(operator_id、evaluator_id)をoperationsテーブルに設定します。複数あるので、外部キーと自動的に認識してくれません(ViewではそのままIDとして表示)。
1. Operationsテーブルのモデルに設定
app]$ vi Model/Operation.php
var $belongsTo = array(
'Operator' =>array('className' => 'Operator','foreignKey' => 'operator'),
'Evaluator' =>array('className' => 'Operator','foreignKey' => 'evaluator')
);
あとはもう一度operationsテーブルのviewだけbakeしとけば、認識されるようになります。
2015/12/25追記
2.リレーション側でのbake
OperatorとEvaluatorキーを使う側のbakeではリレーションが自動認識されないので、自分で設定する必要があります。ひとまずOperatorキーがリレーションとして認識されたかったので設定しました。Operatorsテーブルのbakeです。
このあとC,Vと続けてBakeします。
参考
http://www.asterisk-works.jp/wiki/index.php/Bake%E3%83%A1%E3%83%A2
複数の外部キーといっても、同じテーブルに他の同じテーブルの外部キーを複数設定する場合です。つまり、operationsテーブルに2つのoperatorsテーブルのキーがある場合、(operator_id、evaluator_id)をoperationsテーブルに設定します。複数あるので、外部キーと自動的に認識してくれません(ViewではそのままIDとして表示)。
1. Operationsテーブルのモデルに設定
app]$ vi Model/Operation.php
var $belongsTo = array(
'Operator' =>array('className' => 'Operator','foreignKey' => 'operator'),
'Evaluator' =>array('className' => 'Operator','foreignKey' => 'evaluator')
);
あとはもう一度operationsテーブルのviewだけbakeしとけば、認識されるようになります。
2015/12/25追記
2.リレーション側でのbake
OperatorとEvaluatorキーを使う側のbakeではリレーションが自動認識されないので、自分で設定する必要があります。ひとまずOperatorキーがリレーションとして認識されたかったので設定しました。Operatorsテーブルのbakeです。
このあとC,Vと続けてBakeします。
参考
http://www.asterisk-works.jp/wiki/index.php/Bake%E3%83%A1%E3%83%A2
2015年12月16日水曜日
App Inventorのオフラインでの運用
今回高校の模擬授業の内容でApp Inventorをやりました。
学外での授業ということでインターネット接続が使えない環境でしたので、App Inventorをオフライン運用しました。モバイルルータでも良かったのですが、今後のことを考えてあえてオフライン運用にしました。
1.サーバの設定
今回利用したオフラインInventorは、App Inventor 2 Ultimateを利用しました。
http://sourceforge.net/projects/ai2u/files/ai2u%202.8/Installer/
から
AI2U 64bit v2.8.exe
をダウンロードしました。これはWindows版しかなかったので、仮想でWindowsを立ててインストールしました。
ホストOS(MAC)、ゲストOS:Inventorサーバ(WIndows)ともプライベートアドレスを振りました。ゲストOSはブリッジ接続です(NATではありません)。
ホストOS : 192.168.0.100/24
ゲストOS : 192.168.0.101/24
※学内ではグローバルIPを使っているので、そのままの環境でやろうとしたが、なぜか繋がらず。(多分できるはずだが、時間がなかったのでプライベートアドレスを振り直した。)
2.クライアント側の設定
今回はMACを使いました。
http://appinventor.mit.edu/explore/ai2/mac.html
からダウンロードして、インストールしました(デフォルト)。
今回MACを使った理由は
・AI Companionでのアプリ転送はローカルではできない(と思う)
・AI Companionを使わず、USBで転送することが必要。
USB転送がMACは簡単にできたが、Windowsではドライバの関係かすぐできなかった(時間がなくて)。
クライアントPC : 192.168.0.102〜/24
3.無線環境
無線APを用意。WAN接続はなく、単なるブリッジとして利用。
タブレットはUSB転送なので、接続しない。
4.課題
・クライアントPCがWindowsで出来ればもっと汎用的になる
・グローバルIPのままできれば学内の環境のまま持っていける
・準備は早めに
今回はインターネット環境に頼らず、オフラインで運用できたので運用の幅が広がったと思います。新たなクラウド環境(オフライン:持ち運び可能なオンプレミス)かな? ここまで2時間で準備ができて授業間に合いました。一安心です。
とにかく、準備は早めに(まわりが迷惑)。
学外での授業ということでインターネット接続が使えない環境でしたので、App Inventorをオフライン運用しました。モバイルルータでも良かったのですが、今後のことを考えてあえてオフライン運用にしました。
1.サーバの設定
今回利用したオフラインInventorは、App Inventor 2 Ultimateを利用しました。
http://sourceforge.net/projects/ai2u/files/ai2u%202.8/Installer/
から
AI2U 64bit v2.8.exe
をダウンロードしました。これはWindows版しかなかったので、仮想でWindowsを立ててインストールしました。
ホストOS(MAC)、ゲストOS:Inventorサーバ(WIndows)ともプライベートアドレスを振りました。ゲストOSはブリッジ接続です(NATではありません)。
ホストOS : 192.168.0.100/24
ゲストOS : 192.168.0.101/24
※学内ではグローバルIPを使っているので、そのままの環境でやろうとしたが、なぜか繋がらず。(多分できるはずだが、時間がなかったのでプライベートアドレスを振り直した。)
2.クライアント側の設定
今回はMACを使いました。
http://appinventor.mit.edu/explore/ai2/mac.html
からダウンロードして、インストールしました(デフォルト)。
今回MACを使った理由は
・AI Companionでのアプリ転送はローカルではできない(と思う)
・AI Companionを使わず、USBで転送することが必要。
USB転送がMACは簡単にできたが、Windowsではドライバの関係かすぐできなかった(時間がなくて)。
クライアントPC : 192.168.0.102〜/24
3.無線環境
無線APを用意。WAN接続はなく、単なるブリッジとして利用。
タブレットはUSB転送なので、接続しない。
4.課題
・クライアントPCがWindowsで出来ればもっと汎用的になる
・グローバルIPのままできれば学内の環境のまま持っていける
・準備は早めに
今回はインターネット環境に頼らず、オフラインで運用できたので運用の幅が広がったと思います。新たなクラウド環境(オフライン:持ち運び可能なオンプレミス)かな? ここまで2時間で準備ができて授業間に合いました。一安心です。
とにかく、準備は早めに(まわりが迷惑)。
2015年12月13日日曜日
CentOSへRのインストール
Rを使うための基本設定として、まずサーバにRをインストールします。
rootで
# yum install R
インストールが終了し(結構かかった68パッケージ)ユーザに変えて起動してみる。
$ R
> 3+4
[1] 7
> sin(pi/6)
[1] 0.5
> q()
動いているのが確認できた。ひとまず区切りとして次回rjavaをインストールして、JavaからRを動かしてみる。
追記
epelリポジトリが必要な場合
$ yum -y install yum-priorities
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -ivh epel-release-6-8.noarch.rpm
$ yum --enablerepo=epel -y install R
参考
https://gist.github.com/ochilab/5883781
rootで
# yum install R
インストールが終了し(結構かかった68パッケージ)ユーザに変えて起動してみる。
$ R
> 3+4
[1] 7
> sin(pi/6)
[1] 0.5
> q()
動いているのが確認できた。ひとまず区切りとして次回rjavaをインストールして、JavaからRを動かしてみる。
追記
epelリポジトリが必要な場合
$ yum -y install yum-priorities
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -ivh epel-release-6-8.noarch.rpm
$ yum --enablerepo=epel -y install R
参考
https://gist.github.com/ochilab/5883781
2015年12月10日木曜日
CakephpでのPOST処理
CakephpでのPOST処理のメモです。
[Cakephp側]
scoresテーブル用意
このテーブルをbakeしておきます。addアクションを利用してpostアクションを作成します。
app]$ vi Controller/ScoresController.php
addアクションをコピーして、postアクションとして、青の部分を追加します。
public function post() {
$name = $this->request->data('name');
$score = $this->request->data('score');
if ($this->request->is('post')) {
$this->Score->create();
$this->request->data['Score']['name'] = $name;
$this->request->data['Score']['score'] = $score;
if ($this->Score->save($this->request->data)) {
$this->Session->setFlash(__('The score has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The score could not be saved. Please, try again.'));
}
}
}
※修正
post関数を用意してもよいが、フィールド名が同じであればadd関数のまま使える。
[Android側]
POSTの送り先:
[Cakephp側]
scoresテーブル用意
このテーブルをbakeしておきます。addアクションを利用してpostアクションを作成します。
app]$ vi Controller/ScoresController.php
addアクションをコピーして、postアクションとして、青の部分を追加します。
public function post() {
$name = $this->request->data('name');
$score = $this->request->data('score');
if ($this->request->is('post')) {
$this->Score->create();
$this->request->data['Score']['name'] = $name;
$this->request->data['Score']['score'] = $score;
if ($this->Score->save($this->request->data)) {
$this->Session->setFlash(__('The score has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The score could not be saved. Please, try again.'));
}
}
}
※修正
post関数を用意してもよいが、フィールド名が同じであればadd関数のまま使える。
[Android側]
POSTの送り先:
String urlinput = "http://ホスト名/scores/post";
ソースコード:PostService
Android側でPOST送信をします。Cakephp側ではその情報を受け取り、DBに格納します。
参考
http://qiita.com/kazu56/items/7d344ccef56deef66a7a
2015年12月9日水曜日
multiple insertの利用(StringBuffer併用)
データベースの連続Insertの時に、かなり速度が遅くります。
multiple insertを使うことで劇的に改善されました。
INSERT INTO table名 (カラム1, カラム2, カラム3) VALUES (データ1, データ2, データ3), (データ4, データ5, データ6), (データ7, データ8, データ9), (・・・);
このようにvalues以下を並べて書けばいいです。SQLを発行するのは1回だけとなります。
参考
http://qiita.com/jkr_2255/items/12081b3c066d371516f5
Javaで利用するとき、valuesのところが文字列連結になってきます。今回繰り返し数が多いのでStringBufferを使いました。これもかなり早い。
参考
http://www.techscore.com/blog/2012/11/29/%E6%96%87%E5%AD%97%E5%88%97%E7%B5%90%E5%90%88-java%E7%B7%A8/
[利用例]
StringBuffer buf = new StringBuffer();
buf.append("INSERT INTO points(hospital_id, calclation_id,dea) VALUES");
for(int i = 0; i < constraint.length; i++){
double dea = (var[2]*constraint[i][2] + var[3]*constraint[i][3])/(var[0]*(-1)*constraint[i][0]+var[1]*(-1)*constraint[i][1]);
if(i == constraint.length -1)
buf.append("("+hospital_id[i]+","+calclation_id+","+dea+")");
else
buf.append("("+hospital_id[i]+","+calclation_id+","+dea+"),");
}
String sql4 = buf.toString();
stmt.execute (sql4);
multiple insertを使うことで劇的に改善されました。
INSERT INTO table名 (カラム1, カラム2, カラム3) VALUES (データ1, データ2, データ3), (データ4, データ5, データ6), (データ7, データ8, データ9), (・・・);
このようにvalues以下を並べて書けばいいです。SQLを発行するのは1回だけとなります。
参考
http://qiita.com/jkr_2255/items/12081b3c066d371516f5
Javaで利用するとき、valuesのところが文字列連結になってきます。今回繰り返し数が多いのでStringBufferを使いました。これもかなり早い。
参考
http://www.techscore.com/blog/2012/11/29/%E6%96%87%E5%AD%97%E5%88%97%E7%B5%90%E5%90%88-java%E7%B7%A8/
[利用例]
StringBuffer buf = new StringBuffer();
buf.append("INSERT INTO points(hospital_id, calclation_id,dea) VALUES");
for(int i = 0; i < constraint.length; i++){
double dea = (var[2]*constraint[i][2] + var[3]*constraint[i][3])/(var[0]*(-1)*constraint[i][0]+var[1]*(-1)*constraint[i][1]);
if(i == constraint.length -1)
buf.append("("+hospital_id[i]+","+calclation_id+","+dea+")");
else
buf.append("("+hospital_id[i]+","+calclation_id+","+dea+"),");
}
String sql4 = buf.toString();
stmt.execute (sql4);
2015年11月19日木曜日
Linux上でJavaからMySQL接続
Linux上でJavaからMySQL接続を実施
1. connectorのダウンロード
まずhttp://dev.mysql.com/downloads/connector/よりConnector/J
をダウンロード、展開する。
その中のmysql-connector-java-5.1.37-bin.jarをサーバにFTP等でアップロード。
2. クラスパスの設定
$ vi .bashrc
export CLASSPATH=/usr/local/lib/mysql-connector-java-5.1.37-bin.jar:/usr/local/lib/lpsolve55j.jar:$CLASSPATH
前回の設定分に赤の部分を追加しておく
$ source .bashrc
3. MySQL接続クラスをつける
class MySQL {
// JDBCドライバの登録
String driver;
// データベースの指定
String server, dbname, url, user, password;
Connection con;
Statement stmt;
ResultSet rs;
public MySQL() {
this.driver = "org.gjt.mm.mysql.Driver";
this.server = "localhost";
this.dbname = "naisyo";
this.url = "jdbc:mysql://" + server + "/" + dbname + "?useUnicode=true&characterEncoding=UTF-8"; this.user = "naisyo";
this.password = "naisyo";
try {
this.con = DriverManager.getConnection(url, user, password);
this.stmt = con.createStatement ();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Class.forName (driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void close(){
try {
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ResultSet selectAll(){
String sql = "SELECT * FROM naisyo";
ResultSet rs = null;
try {
rs = stmt.executeQuery (sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //try catchで囲む
return rs;
}
}
main関数から呼び出し
MySQL mysql = new MySQL();
ResultSet rs = mysql.selectAll();
try {
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID:" + id);
System.out.println("Name:" + name);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
これで表示されれば、データベースとの接続&情報取り出しOK
1. connectorのダウンロード
まずhttp://dev.mysql.com/downloads/connector/よりConnector/J
をダウンロード、展開する。
その中のmysql-connector-java-5.1.37-bin.jarをサーバにFTP等でアップロード。
2. クラスパスの設定
$ vi .bashrc
export CLASSPATH=/usr/local/lib/mysql-connector-java-5.1.37-bin.jar:/usr/local/lib/lpsolve55j.jar:$CLASSPATH
前回の設定分に赤の部分を追加しておく
$ source .bashrc
3. MySQL接続クラスをつける
class MySQL {
// JDBCドライバの登録
String driver;
// データベースの指定
String server, dbname, url, user, password;
Connection con;
Statement stmt;
ResultSet rs;
public MySQL() {
this.driver = "org.gjt.mm.mysql.Driver";
this.server = "localhost";
this.dbname = "naisyo";
this.url = "jdbc:mysql://" + server + "/" + dbname + "?useUnicode=true&characterEncoding=UTF-8"; this.user = "naisyo";
this.password = "naisyo";
try {
this.con = DriverManager.getConnection(url, user, password);
this.stmt = con.createStatement ();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Class.forName (driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void close(){
try {
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ResultSet selectAll(){
String sql = "SELECT * FROM naisyo";
ResultSet rs = null;
try {
rs = stmt.executeQuery (sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //try catchで囲む
return rs;
}
}
main関数から呼び出し
MySQL mysql = new MySQL();
ResultSet rs = mysql.selectAll();
try {
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID:" + id);
System.out.println("Name:" + name);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
これで表示されれば、データベースとの接続&情報取り出しOK
2015年11月18日水曜日
lp_solveでJavaプログラム実行(配列利用)
lp_solveを利用するときに配列を利用する場合
int constraint[][] = {{-18,-900,370,10},{-74,-230,550,20},{-34,-2090,340,11},{-80,-1410,452,15},{18,900,0,0}};
int object[] = {0,0,370,10};
のように、制約条件と目的関数の係数配列を用意
これをそれぞれ文字列として変数にいれておく
import lpsolve.*;
public class LP {
public static void main(String[] args) {
int constraint[][] = {{-18,-900,370,10},{-74,-230,550,20},{-34,-2090,340,11},{-80,-1410,452,15},{18,900,0,0}};
int object[] = {0,0,370,10};
try {
LpSolve solver = LpSolve.makeLp(constraint.length, object.length);//constraints, variables
solver.setOutputfile("debug");
String stc = "", sto = "";
for(int i = 0;i < constraint.length; i++){
stc = "";
for(int j = 0; j < constraint[i].length; j++){
stc += constraint[i][j];
stc += " ";
}
if(i == constraint.length -1 )
solver.strAddConstraint(stc, LpSolve.EQ,1);
else
solver.strAddConstraint(stc, LpSolve.LE,0);
}
for(int i = 0; i < object.length; i++){
sto += object[i];
sto += " ";
}
solver.setMaxim();
solver.strSetObjFn(sto);
solver.solve();
System.out.println("Value of objective function: " + solver.getObjective());
double var[] = solver.getPtrVariables();
for(int i = 0; i < var.length; i++){
System.out.println("var[" + i + "] = " + var[i]);
}
solver.deleteLp();
}
catch (LpSolveException e) {
e.printStackTrace();
}
}
}
このような形になる。次はDBから値を持ってきて配列にいれて計算を行う。
int constraint[][] = {{-18,-900,370,10},{-74,-230,550,20},{-34,-2090,340,11},{-80,-1410,452,15},{18,900,0,0}};
int object[] = {0,0,370,10};
のように、制約条件と目的関数の係数配列を用意
これをそれぞれ文字列として変数にいれておく
import lpsolve.*;
public class LP {
public static void main(String[] args) {
int constraint[][] = {{-18,-900,370,10},{-74,-230,550,20},{-34,-2090,340,11},{-80,-1410,452,15},{18,900,0,0}};
int object[] = {0,0,370,10};
try {
LpSolve solver = LpSolve.makeLp(constraint.length, object.length);//constraints, variables
solver.setOutputfile("debug");
String stc = "", sto = "";
for(int i = 0;i < constraint.length; i++){
stc = "";
for(int j = 0; j < constraint[i].length; j++){
stc += constraint[i][j];
stc += " ";
}
if(i == constraint.length -1 )
solver.strAddConstraint(stc, LpSolve.EQ,1);
else
solver.strAddConstraint(stc, LpSolve.LE,0);
}
for(int i = 0; i < object.length; i++){
sto += object[i];
sto += " ";
}
solver.setMaxim();
solver.strSetObjFn(sto);
solver.solve();
System.out.println("Value of objective function: " + solver.getObjective());
double var[] = solver.getPtrVariables();
for(int i = 0; i < var.length; i++){
System.out.println("var[" + i + "] = " + var[i]);
}
solver.deleteLp();
}
catch (LpSolveException e) {
e.printStackTrace();
}
}
}
このような形になる。次はDBから値を持ってきて配列にいれて計算を行う。
lp_solveをJavaで実行できるようにする
lp_solveをJavaで実行できるようにする
Javaをインストール
# yum install java
Java用のlp_solveを導入
http://sourceforge.net/projects/lpsolve/files/lpsolve/
から
lp_solve_5.5.2.0_java.zip
lp_solve_5.5.2.0_dev_ux64.tar.gz
をダウンロード。展開後
lp_solve_5.5_java/lib/ux64/liblpsolve55j.so
lp_solve_5.5_java/lib/lpsolve55j.jar
lp_solve_5.5.2.0_dev_ux64/liblpsolve55.so
を/usr/local/libにコピー
# chmod 755 /usr/local/lib/*
ライブラリへの環境変数の設定
ユーザで設定する場合
~]$ vi .bashrc
追加
export CLASSPATH=/usr/local/lib/lpsolve55j.jar:$CLASSPATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
環境変数の適用
~]$ source .bashrc
Javaファイル作成
~]$ vi Demo.java
[Demo.java] サイトより
import lpsolve.*;
public class Demo {
public static void main(String[] args) {
try {
// Create a problem with 4 variables and 0 constraints
LpSolve solver = LpSolve.makeLp(0, 4);
// add constraints
solver.strAddConstraint("3 2 2 1", LpSolve.LE, 4);
solver.strAddConstraint("0 4 3 1", LpSolve.GE, 3);
// set objective function
solver.strSetObjFn("2 3 -2 3");
// solve the problem
solver.solve();
// print solution
System.out.println("Value of objective function: " + solver.getObjective());
double[] var = solver.getPtrVariables();
for (int i = 0; i < var.length; i++) {
System.out.println("Value of var[" + i + "] = " + var[i]);
}
// delete the problem and free memory
solver.deleteLp();
}
catch (LpSolveException e) {
e.printStackTrace();
}
}
}
~]$ javac Demo.java
~]$ java Demo
で実行できる。
参考
http://d.hatena.ne.jp/yambi/20090916/1253111261
Javaをインストール
# yum install java
Java用のlp_solveを導入
http://sourceforge.net/projects/lpsolve/files/lpsolve/
から
lp_solve_5.5.2.0_java.zip
lp_solve_5.5.2.0_dev_ux64.tar.gz
をダウンロード。展開後
lp_solve_5.5_java/lib/ux64/liblpsolve55j.so
lp_solve_5.5_java/lib/lpsolve55j.jar
lp_solve_5.5.2.0_dev_ux64/liblpsolve55.so
を/usr/local/libにコピー
# chmod 755 /usr/local/lib/*
ライブラリへの環境変数の設定
ユーザで設定する場合
~]$ vi .bashrc
追加
export CLASSPATH=/usr/local/lib/lpsolve55j.jar:$CLASSPATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
環境変数の適用
~]$ source .bashrc
Javaファイル作成
~]$ vi Demo.java
[Demo.java] サイトより
import lpsolve.*;
public class Demo {
public static void main(String[] args) {
try {
// Create a problem with 4 variables and 0 constraints
LpSolve solver = LpSolve.makeLp(0, 4);
// add constraints
solver.strAddConstraint("3 2 2 1", LpSolve.LE, 4);
solver.strAddConstraint("0 4 3 1", LpSolve.GE, 3);
// set objective function
solver.strSetObjFn("2 3 -2 3");
// solve the problem
solver.solve();
// print solution
System.out.println("Value of objective function: " + solver.getObjective());
double[] var = solver.getPtrVariables();
for (int i = 0; i < var.length; i++) {
System.out.println("Value of var[" + i + "] = " + var[i]);
}
// delete the problem and free memory
solver.deleteLp();
}
catch (LpSolveException e) {
e.printStackTrace();
}
}
}
~]$ javac Demo.java
~]$ java Demo
で実行できる。
参考
http://d.hatena.ne.jp/yambi/20090916/1253111261
lp_solveの導入
lp_solveの導入
CentOS6.5にlp_solveをいれる方法
# yum install lpsolve
でインストール
ユーザに切り替えて例題作成
$ vi test.lp
max:370c+10d;
-18a-900b+370c+10d<=0;
-74a-230b+550c+20d<=0;
-34a-2090b+340c+11d<=0;
-80a-1410b+452c+15d<=0;
18a+900b=1;
線形計画法実行
$ lp_solve test.lp
CentOS6.5にlp_solveをいれる方法
# yum install lpsolve
でインストール
ユーザに切り替えて例題作成
$ vi test.lp
max:370c+10d;
-18a-900b+370c+10d<=0;
-74a-230b+550c+20d<=0;
-34a-2090b+340c+11d<=0;
-80a-1410b+452c+15d<=0;
18a+900b=1;
線形計画法実行
$ lp_solve test.lp
2015年11月5日木曜日
viの文字化けを治す
viで開くと文字化けしている場合があります。
簡単に解消できました。
vi ~/.vimrc
ファイルがない場合は新規作成
set encoding=utf-8
set fileencodings=iso-2022-jp,sjis,utf-8
を記述する
一度、ログオフしてログインすると反映される。
参考
https://www.softel.co.jp/blogs/tech/archives/2203
簡単に解消できました。
vi ~/.vimrc
ファイルがない場合は新規作成
set encoding=utf-8
set fileencodings=iso-2022-jp,sjis,utf-8
を記述する
一度、ログオフしてログインすると反映される。
参考
https://www.softel.co.jp/blogs/tech/archives/2203
2015年11月1日日曜日
2015年10月30日金曜日
Cakephpで独自クラスを利用する方法
Cakephpで独自クラスを利用する方法
独自クラス: MyMember.php app/Vendorに用意
class MyMember {
private $name;
function setName($name) {
$this->name = $name;
}
function getName() {
return $this->name;
}
}
呼び出したいコントローラに
App::import('Vendor', 'MyMember');
$mymember = new MyMember();
$mymember->setName("Mizuno");
$this->set('mymember', $mymember->getName());
を記述
そのViewに
とすると表示される
独自クラス: MyMember.php app/Vendorに用意
class MyMember {
private $name;
function setName($name) {
$this->name = $name;
}
function getName() {
return $this->name;
}
}
呼び出したいコントローラに
App::import('Vendor', 'MyMember');
$mymember = new MyMember();
$mymember->setName("Mizuno");
$this->set('mymember', $mymember->getName());
を記述
そのViewに
とすると表示される
2015年10月29日木曜日
2015年10月27日火曜日
2015年8月30日日曜日
CakePHP:CSVアップロード時に既存データとマッチングしてデータ格納
CakePHPで既存データがある場合に、そのデータとマッチングしてデータを格納する方法(基本的)です。
1. CSVアップロードの作成
[Controller] アクション名が「csv2」の場合
public function csv2(){
}
※空関数作成
[View] csv2.ctp
2. import2関数を作成
[Controller]
public function import2(){
if($this->request->is('post')){
$up_file = $this->data['Hospital']['CsvFile']['tmp_name'];
$fileName = 'post.csv';
if(is_uploaded_file($up_file)){
move_uploaded_file($up_file, $fileName);
$this->Hospital->loadCSV2($fileName);
$this->Session->setFlash('Uploaded');
$this->redirect(array('action'=>'index'));
}
}
}
3. モデルにCSVの格納処理を書く
[Model]
public function loadCSV2($filename){
$this->begin();
try{
//$this->deleteAll('1=1',false);
$csvData = file($filename,FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
//マッチングしたいデータの取得
$hospitals = $this->find('all',
array(
'fields' => array('id', 'tel'),
'recursive' => -1,
)
);
foreach($csvData as $line){
$record = split(',',$line);
//マッチングのループに入る
foreach($hospitals as $hospital){
if($hospital['Hospital']['tel'] === $record[0]){
$data =array(
'id' =>$hospital['Hospital']['id'],
'doctor' => $record[1],
'parttime' => $record[2],
);
$this->save($data);
break;
}
}
}
$this->commit();
}catch(Exception $e){
$this->rollback();
}
}
アップロードするデータ形式
420-8537,16,3
420-8876,20,3
・
・
・
郵便番号,データ1,データ2
文字コードはUTF-8, 改行コードLF
※改行コードをLFにしないと、CSVからのデータをうまく読めません。
1. CSVアップロードの作成
[Controller] アクション名が「csv2」の場合
public function csv2(){
}
※空関数作成
[View] csv2.ctp
2. import2関数を作成
[Controller]
public function import2(){
if($this->request->is('post')){
$up_file = $this->data['Hospital']['CsvFile']['tmp_name'];
$fileName = 'post.csv';
if(is_uploaded_file($up_file)){
move_uploaded_file($up_file, $fileName);
$this->Hospital->loadCSV2($fileName);
$this->Session->setFlash('Uploaded');
$this->redirect(array('action'=>'index'));
}
}
}
3. モデルにCSVの格納処理を書く
[Model]
public function loadCSV2($filename){
$this->begin();
try{
//$this->deleteAll('1=1',false);
$csvData = file($filename,FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
//マッチングしたいデータの取得
$hospitals = $this->find('all',
array(
'fields' => array('id', 'tel'),
'recursive' => -1,
)
);
foreach($csvData as $line){
$record = split(',',$line);
//マッチングのループに入る
foreach($hospitals as $hospital){
if($hospital['Hospital']['tel'] === $record[0]){
$data =array(
'id' =>$hospital['Hospital']['id'],
'doctor' => $record[1],
'parttime' => $record[2],
);
$this->save($data);
break;
}
}
}
$this->commit();
}catch(Exception $e){
$this->rollback();
}
}
アップロードするデータ形式
420-8537,16,3
420-8876,20,3
・
・
・
郵便番号,データ1,データ2
文字コードはUTF-8, 改行コードLF
※改行コードをLFにしないと、CSVからのデータをうまく読めません。
2015年7月14日火曜日
郵便番号情報のデータベース化
郵便番号のデータベース化を行います。
1.郵便番号データ
http://www.post.japanpost.jp/zipcode/dl/roman-zip.html
ダウンロードして開くと
"0640941","北海道","札幌市 中央区","旭ケ丘","HOKKAIDO","SAPPORO SHI CHUO KU","ASAHIGAOKA"
このようなデータ形式になっています。
2.保管用データベース作成
CREATE TABLE IF NOT EXISTS `postalcodes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(7) NOT NULL,
`ken` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`address` varchar(255) NOT NULL,
`kenread` varchar(255) NOT NULL,
`cityread` varchar(255) NOT NULL,
`addressread` varchar(255) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
3.サーバ側でアップロードできるファイル容量を増やしておく。
今回ダウンロードしたファイルは12.4MBありました。
今回はphpMyAdminでCSVアップロードで済ませてしまおうと思います。
phpMyAdminのデフォルトだと2MB位なので、増やしておきます。
# vi /etc/php.ini
memory_limit = 128M
;post_max_size = 8M
↓
post_max_size = 32M
;upload_max_filesize = 2M
↓
upload_max_filesize = 32M
4.データのアップロード
今回はphpMyAdminを利用して、CSVデータをテーブルに格納します。
phpMyAdmin->データベース選択->テーブル(postalcodes)選択->インポート
今回のCSVを選択します。
フォーマットがCSVになっていることを確認し、カラム名に
code,ken,city,address,kenread,cityread,addressreadを書いておきます。
実行ボタンを押すとアップロードが開始されます。
今回の環境では2分程度かかりました。
参考サイト
http://rensabanet.com/wordpress-tips/tukai/11733/
1.郵便番号データ
http://www.post.japanpost.jp/zipcode/dl/roman-zip.html
ダウンロードして開くと
"0640941","北海道","札幌市 中央区","旭ケ丘","HOKKAIDO","SAPPORO SHI CHUO KU","ASAHIGAOKA"
このようなデータ形式になっています。
2.保管用データベース作成
CREATE TABLE IF NOT EXISTS `postalcodes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(7) NOT NULL,
`ken` varchar(255) NOT NULL,
`city` varchar(255) NOT NULL,
`address` varchar(255) NOT NULL,
`kenread` varchar(255) NOT NULL,
`cityread` varchar(255) NOT NULL,
`addressread` varchar(255) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
3.サーバ側でアップロードできるファイル容量を増やしておく。
今回ダウンロードしたファイルは12.4MBありました。
今回はphpMyAdminでCSVアップロードで済ませてしまおうと思います。
phpMyAdminのデフォルトだと2MB位なので、増やしておきます。
# vi /etc/php.ini
memory_limit = 128M
;post_max_size = 8M
↓
post_max_size = 32M
;upload_max_filesize = 2M
↓
upload_max_filesize = 32M
4.データのアップロード
今回はphpMyAdminを利用して、CSVデータをテーブルに格納します。
phpMyAdmin->データベース選択->テーブル(postalcodes)選択->インポート
今回のCSVを選択します。
フォーマットがCSVになっていることを確認し、カラム名に
code,ken,city,address,kenread,cityread,addressreadを書いておきます。
実行ボタンを押すとアップロードが開始されます。
今回の環境では2分程度かかりました。
参考サイト
http://rensabanet.com/wordpress-tips/tukai/11733/
2015年7月7日火曜日
Rでのカイ二乗検定
年毎の発生率の有意性を確認するために実施しました。
今回は5年間のある事象の発生率に対し、有意性があるか検定します。
今回の対象はサンプル数10万件程度を仮定するので、ピアソンのカイ二乗検定を利用します。
今回のテーブルです。
帰無仮説 H0:発生の頻度と年代は独立である
対立仮説 H1:発生の頻度と年代は独立でない(関係がある)
実際にRでやってみます。
chisq.test(matrix(c(1325,94055,1358,34025,1655,38484,1873,75089,1424,65571),nrow=5,byrow=TRUE))
Pearson's Chi-squared test
data: matrix(c(1325, 94055, 1358, 34025, 1655, 38484, 1873, 75089,1424, 65571), nrow = 5, byrow = TRUE)
X-squared = 1245.7, df = 4, p-value < 2.2e-16
統計量であるカイ二乗値:X-squared = 1245.7
自由度:df = 4
p値(p-value): < 2.2e-16 < 0.001(有意水準0.1%)
よって帰無仮説H0を棄却する。
結論
有意水準0.1%で、事象の発生頻度と年代は独立でない。つまり年代と関係があるといえる。
参考
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/66.html
http://monge.tec.fukuoka-u.ac.jp/r_analysis/test_crosstable00.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1169222731
今回は5年間のある事象の発生率に対し、有意性があるか検定します。
今回の対象はサンプル数10万件程度を仮定するので、ピアソンのカイ二乗検定を利用します。
今回のテーブルです。
発生あり | 発生なし | |
2015 | 1325 | 94055 |
2014 | 1358 | 34025 |
2013 | 1655 | 38484 |
2012 | 1873 | 75089 |
2011 | 1424 | 65571 |
帰無仮説 H0:発生の頻度と年代は独立である
対立仮説 H1:発生の頻度と年代は独立でない(関係がある)
実際にRでやってみます。
chisq.test(matrix(c(1325,94055,1358,34025,1655,38484,1873,75089,1424,65571),nrow=5,byrow=TRUE))
Pearson's Chi-squared test
data: matrix(c(1325, 94055, 1358, 34025, 1655, 38484, 1873, 75089,1424, 65571), nrow = 5, byrow = TRUE)
X-squared = 1245.7, df = 4, p-value < 2.2e-16
統計量であるカイ二乗値:X-squared = 1245.7
自由度:df = 4
p値(p-value): < 2.2e-16 < 0.001(有意水準0.1%)
よって帰無仮説H0を棄却する。
結論
有意水準0.1%で、事象の発生頻度と年代は独立でない。つまり年代と関係があるといえる。
参考
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/66.html
http://monge.tec.fukuoka-u.ac.jp/r_analysis/test_crosstable00.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1169222731
2015年7月4日土曜日
MySQLのデフォルト設定(UTF-8環境)
いつもソフトウェア側でUTF-8を指定していたので問題無かったのですが、色々な用途で使うとデフォルトでしっかり設定したほうがよいです。
[現在の状況の確認]
phpMyAdmin等で次のSQL文を実行してみます。
SHOW VARIABLES LIKE "chara%"
デフォルトではこの中でcharacter_set_serverがlatin1になっています。これを修正します。
[変更]
# vi /etc/my.cnf
[mysqld]に追加
character-set-server=utf8
[client]作成
default-character-set=utf8
# service mysqld restart
[確認]
もう一度
SHOW VARIABLES LIKE "chara%"
を発行してみると
のようにUTF-8の環境になったようです。
参考
http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a
[現在の状況の確認]
phpMyAdmin等で次のSQL文を実行してみます。
SHOW VARIABLES LIKE "chara%"
デフォルトではこの中でcharacter_set_serverがlatin1になっています。これを修正します。
[変更]
# vi /etc/my.cnf
[mysqld]に追加
character-set-server=utf8
[client]作成
default-character-set=utf8
# service mysqld restart
[確認]
もう一度
SHOW VARIABLES LIKE "chara%"
を発行してみると
のようにUTF-8の環境になったようです。
参考
http://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a
2015年6月30日火曜日
Cakephpにおける認証設定
Cakephpにおける認証設定
1. AppControllerに太字部分を追加
app]$ vi Controller/AppController.php
public $components = array(
'Session',
'Auth'=> array(
// ログイン後に Users/index へジャンプ
'loginRedirect' => array('controller' => 'reports', 'action' => 'index'),
// ログアウト後に /Pages/home へジャンプ
'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
'authorize' => array('Controller')
)
);
public function isAuthorized($user) {
if (isset($user['role']) && $user['role'] == 'admin') {
return true;
}
return false;
}
roleがadminであればすべてのページがOK、他では全てダメ
2.各コントローラでuserの場合の設定
app]$ vi Controller/UsersController.php
public function isAuthorized($user) {
if(isset($user['role']) && $user['role'] == 'user') {
if($this->action == 'login')return true;
if($this->action == 'logout')return true;
}
return parent::isAuthorized($user);
}
roleがuserの場合、アクションがloginとlogoutを許可している。
app]$ vi Controller/ReportsController.php
public function isAuthorized($user) {
if(isset($user['role']) && $user['role'] == 'user') {
if($this->action == 'index') return true;
if($this->action == 'add') return true;
if($this->action == 'view') return true;
if($this->action == 'edit') return true;
if($this->action == 'delete') return true;
if($this->action == 'sum') return true;
}
return parent::isAuthorized($user);
}
もっとスマートな書き方があるはずですが、コントローラ毎に設定。
まとめ
role : adminの権限はAppControllerで決定
role : userの権限は各コントローラで決定
1. AppControllerに太字部分を追加
app]$ vi Controller/AppController.php
public $components = array(
'Session',
'Auth'=> array(
// ログイン後に Users/index へジャンプ
'loginRedirect' => array('controller' => 'reports', 'action' => 'index'),
// ログアウト後に /Pages/home へジャンプ
'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
'authorize' => array('Controller')
)
);
public function isAuthorized($user) {
if (isset($user['role']) && $user['role'] == 'admin') {
return true;
}
return false;
}
roleがadminであればすべてのページがOK、他では全てダメ
2.各コントローラでuserの場合の設定
app]$ vi Controller/UsersController.php
public function isAuthorized($user) {
if(isset($user['role']) && $user['role'] == 'user') {
if($this->action == 'login')return true;
if($this->action == 'logout')return true;
}
return parent::isAuthorized($user);
}
roleがuserの場合、アクションがloginとlogoutを許可している。
app]$ vi Controller/ReportsController.php
public function isAuthorized($user) {
if(isset($user['role']) && $user['role'] == 'user') {
if($this->action == 'index') return true;
if($this->action == 'add') return true;
if($this->action == 'view') return true;
if($this->action == 'edit') return true;
if($this->action == 'delete') return true;
if($this->action == 'sum') return true;
}
return parent::isAuthorized($user);
}
もっとスマートな書き方があるはずですが、コントローラ毎に設定。
まとめ
role : adminの権限はAppControllerで決定
role : userの権限は各コントローラで決定
2015年6月24日水曜日
2015年5月3日日曜日
MySQLユーザでアクセスできるデータベースを追加する場合
既存のユーザにさらに他のデータベースアクセスを許してデータベース管理をまとめたい場合があります。以下、phpMyAdminでrootで作業します。
1.ユーザが無い場合はユーザを発行します。
ユーザに属するデータベースを作る必要はありません。
2.phpMyAdminでユーザ一覧から「特権を編集」をクリック
データベースに固有の特権->データベースに固有の特権を追加->アクセスしたいデータベースを選択します。
画面が切り替わり、
データベースに固有の特権(すべてチェックする)をクリック->実行
これで、ユーザに対し、別のデータベースアクセス権限を追加できました。
1.ユーザが無い場合はユーザを発行します。
ユーザに属するデータベースを作る必要はありません。
2.phpMyAdminでユーザ一覧から「特権を編集」をクリック
データベースに固有の特権->データベースに固有の特権を追加->アクセスしたいデータベースを選択します。
画面が切り替わり、
データベースに固有の特権(すべてチェックする)をクリック->実行
これで、ユーザに対し、別のデータベースアクセス権限を追加できました。
2015年1月10日土曜日
LinuxでのGit設定と利用
1. Gitインストール(root)で作業
# yum install git
2. 鍵の生成(対象ユーザで行う)
$ ssh-keygen -C "github"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/j11000/.ssh/id_rsa):
そのままエンター
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
パスワードは任意
Your identification has been saved in id_rsa_github.
Your public key has been saved in id_rsa_github.pub.
これでホームディレクトリの.sshフォルダに id_rsa_github.pub, id_rsa_githubが生成されます。
3. GithubのサイトにSSHの公開鍵を登録
Githubのアカウントを作成し、ログインしてください。
https://github.com/
右上 Setting -> SSH keys -> Add SSH Key
Title : ホスト名など(例 j11000.sangi01.net)
Keyは
$ cat ~/.ssh/id_rsa.pub
を発行し、出力された結果を貼付けてください。
Add keyを押して登録します。
4. 秘密鍵をローカルに登録
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
5. アップロードのための設定
[Github側]
Githubに今回のリポジトリを作成します。図のようにNEWをクリックします。
Repository Nameだけ入力してCreate Repositoryをクリックします。
[ホスト側]
初期設定
$ git config --global user.name githubユーザ名
$ git config --global user.email githubに登録したメールアドレス
ホームディレクトリにあるwwwの中身をアップロードしてみます。
$ ls
www
$ cd www
$ git init
$ touch README
$ git commit -m 'first commit'
$ git remote add origin git@github.com:smzn/j11000.git
$ git add *
$ git commit
Are you sure you want to continue connecting (yes/no)? yes とします。
commitが完了しました。
Github側のリポジトリを見てみます
ファイルがアップロードされています。
参考サイト
http://nullpopopo.blogcube.info/2012/04/github_centos6.html
http://qiita.com/gitya107/items/0fc0c87ceaf7299e7fb3
http://tweeeety.hateblo.jp/entry/2014/08/08/213935
==2019/04/01追記==
・ssh接続の確認には $ ssh -T git@github.com
・$ git commitではコミットできない
→$ git push origin master でコミットできる
参考
https://qiita.com/tesoro/items/af4a80b7ebb9ad34e5fd
https://qiita.com/irxground/items/80dc6432e7d9d2b8b2a9
https://nishinatoshiharu.com/how-to-gitpush-with-ssh/http://blog.uso400.net/xibhuairunorokaraizu/
# yum install git
2. 鍵の生成(対象ユーザで行う)
$ ssh-keygen -C "github"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/j11000/.ssh/id_rsa):
そのままエンター
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
パスワードは任意
Your identification has been saved in id_rsa_github.
Your public key has been saved in id_rsa_github.pub.
これでホームディレクトリの.sshフォルダに id_rsa_github.pub, id_rsa_githubが生成されます。
3. GithubのサイトにSSHの公開鍵を登録
Githubのアカウントを作成し、ログインしてください。
https://github.com/
右上 Setting -> SSH keys -> Add SSH Key
Title : ホスト名など(例 j11000.sangi01.net)
Keyは
$ cat ~/.ssh/id_rsa.pub
を発行し、出力された結果を貼付けてください。
Add keyを押して登録します。
4. 秘密鍵をローカルに登録
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
5. アップロードのための設定
[Github側]
Githubに今回のリポジトリを作成します。図のようにNEWをクリックします。
Repository Nameだけ入力してCreate Repositoryをクリックします。
[ホスト側]
初期設定
$ git config --global user.name githubユーザ名
$ git config --global user.email githubに登録したメールアドレス
ホームディレクトリにあるwwwの中身をアップロードしてみます。
$ ls
www
$ cd www
$ git init
$ touch README
$ git commit -m 'first commit'
$ git remote add origin git@github.com:smzn/j11000.git
$ git add *
$ git commit
Are you sure you want to continue connecting (yes/no)? yes とします。
commitが完了しました。
Github側のリポジトリを見てみます
ファイルがアップロードされています。
参考サイト
http://nullpopopo.blogcube.info/2012/04/github_centos6.html
http://qiita.com/gitya107/items/0fc0c87ceaf7299e7fb3
http://tweeeety.hateblo.jp/entry/2014/08/08/213935
==2019/04/01追記==
・ssh接続の確認には $ ssh -T git@github.com
・$ git commitではコミットできない
→$ git push origin master でコミットできる
参考
https://qiita.com/tesoro/items/af4a80b7ebb9ad34e5fd
https://qiita.com/irxground/items/80dc6432e7d9d2b8b2a9
https://nishinatoshiharu.com/how-to-gitpush-with-ssh/http://blog.uso400.net/xibhuairunorokaraizu/
登録:
投稿 (Atom)