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/

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]のところを対でコメントアウトします。
このように数を減らしていきながら、ファイルのコメントアウトを増やしていきます。

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

これで色々できます。

2015年12月26日土曜日

Cakephp : Googlechartでのグラフ表示

Cakephpで作ったページにGooglechartを使ってグラフ表示させました。
最初はいろんなところで提供されているCakephp用のHelperを使おうかと思いましたが、融通を効かせたかったので、本家のJavaScriptをそのままViewにいれて表示させることにしました。やり方は簡単で、表示させたいViewの部分に本家のコードをそのままコピーして、出力を修正するだけです。出力は基本echoでやります。以下挿入したコードです。

 挿入コード

 複数折れ線も表示してみました。
挿入コード





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

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時間で準備ができて授業間に合いました。一安心です。
とにかく、準備は早めに(まわりが迷惑)。

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

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の送り先:
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);

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

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から値を持ってきて配列にいれて計算を行う。

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

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

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

2015年11月1日日曜日

閉鎖型待ち行列ネットワークのPHPライブラリ

閉鎖型待ち行列ネットワークのPHPライブラリ

閉鎖型待ち行列ネットワーク全体のJavaプログラムをPHPに変換しました。

JavaからPHPの変換は結構大変。無事出来ました。

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に


とすると表示される


2015年10月29日木曜日

閉鎖型待ち行列ネットワークの正規化定数の求め方:平均値解析法

閉鎖型待ち行列ネットワークの正規化定数の求め方:平均値解析法


畳み込みの結果とスループットが一致しました。
※平均値解析法では、α1 = 1でないといけない。畳み込みは他の値でもOK。

閉鎖型待ち行列ネットワークの正規化定数の求め方(畳み込み)

閉鎖型待ち行列ネットワークの正規化定数の求め方(畳み込み)
 github

2015年10月27日火曜日

重力モデルを利用した推移確率行列計算

重力モデルを利用した推移確率行列計算

ガウスの消去法のプログラム

ガウスの消去法のプログラム

連立方程式の解を求めるのによく使うので、載せておきます。
https://github.com/smzn/gauss

2015年8月30日日曜日

CakePHP:CSVアップロード時に既存データとマッチングしてデータ格納

CakePHPで既存データがある場合に、そのデータとマッチングしてデータを格納する方法(基本的)です。

1. CSVアップロードの作成
[Controller] アクション名が「csv2」の場合
public function csv2(){
}
※空関数作成

[View] csv2.ctp

       

               
       
        echo $this->Form->create('Hospital',array('action'=>'import2','type'=>'file'));
        echo $this->Form->input('CsvFile',array('label'=>'','type'=>'file'));
        echo $this->Form->end('Upload');

        ?>
       






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/

2015年7月7日火曜日

Rでのカイ二乗検定

年毎の発生率の有意性を確認するために実施しました。
今回は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

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の権限は各コントローラで決定





2015年6月24日水曜日

vsFTPでユーザは自分のディレクトリのみ見られるようにする
(他のディレクトリは見えないようにする)

# vi /etc/vsftpd/vsftpd.conf

chroot_local_user=YES
のコメントをとり有効化する

# service vsftpd restart

2015年5月3日日曜日

MySQLユーザでアクセスできるデータベースを追加する場合

既存のユーザにさらに他のデータベースアクセスを許してデータベース管理をまとめたい場合があります。以下、phpMyAdminでrootで作業します。
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/