2018年4月26日木曜日

PHPからJavaを呼び出す

Webシステム側はPHPで書いてありますが、そこからJavaを呼び出して処理をさせます。
(1) Javaの設置
jarファイルで設置も考えましたが、変更もあり得るのでそのまま設置しました。
今回は以下を設置しました。
https://github.com/smzn/Sentiment
今回は外部jarファイルがあるので、/usr/local/lib にjarファイルを入れておき
$ vi ~/.bashrc
export CLASSPATH=/usr/local/lib/mysql-connector-java-5.1.45-bin.jar:/usr/local/lib/io.indico-3.15.0.jar:/usr/local/lib/io.indico-3.15.0-jar-with-dependencies.jar:$CLASSPATH
と設定しました。
全ユーザに対して設定する場合は /etc/profileに書きます。
実行できることを確認します。

(2)シェルスクリプトの作成
シェルスクリプトを作成し、置いておきます。クラスパスは必要です。
$ vi ~/indico/sentiment.sh


$ chmod +x ~/indico/sentiment.sh
シェルスクリプトから実行できることを確認します。
$ ~/indico/sentiment.sh

(3) PHPから呼び出し
PHPから呼び出すときに、exec関数を利用します。


これでPHPからJavaを実行できました。

2018年4月23日月曜日

Ubuntu 16.04 VNC利用

Ubuntu 16.04をVNCで利用します。
(0) SSHサーバのインストール
特にVNCにはいらないですが、便利なので入れておきます。
$ sudo apt-get install openssh-server

学内で利用する場合にネットワークを変更します。
ネットワークモード:ブリッジ
IPアドレス:DHCPでなく、固定IP

(1) VNCのインストール
$ sudo apt install ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
$ sudo apt install vnc4server

(2)vimのインストール
デフォルトではviが扱いにくいのでvimを入れておきます。
$ sudo apt-get install vim

(3)  VNCの設定
VNC用パスワード設定(そのユーザで設定)
 unix2018@ubuntu:~$ vncpasswd
Password:
Verify:
一旦起動すると設定ファイルが作成されます。
unix2018@ubuntu:~$ vncserver :1

New 'ubuntu:1 (unix2018)' desktop is ubuntu:1

Creating default startup script /home/unix2018/.vnc/xstartup
Starting applications specified in /home/unix2018/.vnc/xstartup
Log file is /home/unix2018/.vnc/ubuntu:1.log




一度停止します。
unix2018@ubuntu:~$ vncserver -kill :1
Killing Xvnc4 process ID 8576

設定ファイルを修正:下記を追記
$ vi ~/.vnc/xstartup

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
 もう一度起動します。
$ vncserver :1
VNCソフトでアクセスします。ディスプレイ番号をつけてやります。
IPアドレス:1
または
IPアドレス:5901

2018年4月21日土曜日

Matlab for Java : (11) DeepLearning(画像認識)

JavaからMatlabを使ってDeepLearning(画像認識)をやってみます。
(1) 画像の準備
今回は下記の画像を使いました。
http://gahag.net/010175-french-bulldog/
 画像の取り込みは、
ml.eval("img1 = imread('img/dog01.jpg');");
で直接やりました。

(2) DeepLearningの準備
今回はMatlabのAlexという学習済みネットワークを使います。
https://jp.mathworks.com/help/nnet/ref/alexnet.html
 
途中画像のトリミングをしないといけないので、
ml.eval("sz = deepnet.Layers(1).InputSize"); //ネットワークの最初の層の InputSize プロパティを使用して、ネットワークの入力サイズを求めます。
ml.eval("img = imresize(img1,[227 227]);");
のようにします。
https://jp.mathworks.com/help/images/ref/imresize.html
(3) Test
実際に画像が何かをテストします。scoreが0.01以上のものだけ出力します。
ml.eval("pred1 = classify(deepnet,img)");
ml.eval("categorynames = deepnet.Layers(end).ClassNames;");
ml.eval("[pred,scores] = classify(deepnet,img);");
ml.eval("highscores = scores > 0.01;");
精度も良さそうです。
(4)課題
hscoreがベクトルでJava側に渡す方法がわかりませんでした。

ソースコード

2018年4月19日木曜日

Matlab for Java : (10) マルコフ連鎖シミュレーション

JavaからMatlabを使ってマルコフ連鎖シミュレーションをやってみます。
    https://jp.mathworks.com/help/matlab/ref/mpower.html
    https://jp.mathworks.com/help/econ/create-and-modify-markov-chain-model-objects.html
    https://jp.mathworks.com/help/econ/visualize-markov-chain-structure-and-evolution.html


(1) データの準備
推移確率行列
double data_transition[][] = {{ 0.25, 0.25, 0.5, 0 }, { 0, 0.25, 0.5, 0.25 }, { 0.25, 0.25, 0.25, 0.25 }, { 0.25, 0.25, 0, 0.5}};
初期状態
double initial[] = {0.25, 0.25, 0.25, 0.25};

(2) 推移確率行列の可視化(有向グラフ)
これは2乗した時の、推移確率の様子を示しています。
 (3) 推移確率行列の可視化(Heat Map)
推移確率をHeat Mapで表してみます。これも2乗した時のです。
1 から 4への推移確率が低く、1への推移は低くなっています。

(4) 定常分布のシミュレーション
初期状態から世代を経て、確率分布がわかります。状態1は低く、状態3が高くなります。
5世代後の定常分布です。4世代目から動かなくなっていますので収束した状態です。
ソースコード

2018年4月18日水曜日

Matlab for Java : (9) 多変量正規乱数

JavaからMatlabを利用して、多変量正規乱数を作ります。
必要なものは、変数次元分のそれぞれの平均、分散共分散行列です。
関数はmvnrndを使います。
https://jp.mathworks.com/help/stats/mvnrnd.html
乱数を100個用意します。
double mu[] = {2,3};//平均
double sigma[][] = { { 1, 1.5 }, { 1.5, 3 }};//分散共分散行列
得られた乱数の平均を取ってみると、良さそうな値となりました。
ソースコード

Matlab for Java : (8) 線形計画法

JavaからMatlabを使い線形計画法をやります。

関数linprogを利用します。
https://jp.mathworks.com/help/optim/ug/linprog.html
線形不等式、線形等式、および範囲を含む単純な線形計画法を解きます。
x = linprog(f,A,b,Aeq,beq,lb,ub) は、解が常に lb ≤ x ≤ ub の範囲に存在するように、設計変数 x に上限と下限を定義します。等式が存在しない場合には Aeq = [] および beq = [] と設定してください。

実際に線形計画法を作ります。aが係数でbが右辺です。左辺<=右辺
Aeqが左辺の係数、beqが右辺で等式制約です。
lbが左辺、ubが右辺で範囲の制約です。
 目的関数の係数です。
解が求まると、xが最適値をとるときのxの値、fvalは目的関数の値、exitflag = 1は解が信頼できることを示す、output.iterations = 0 は、linprog が解決の前処理で解を見つけ、反復がまったく必要なかったことを示します。
ソースコード

2018年4月17日火曜日

ネットワーク速度の計測


1..speedtest-cliインストール
 ここから、今回使わせてもらうプログラムを持ってくる
 wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
 chmod +x speedtest-cli

2.通常実行
 引数なしで実行すると、自動的にサーバが選択されてパケットを送信
 $ python speedtest-cli/speedtest.py
 Retrieving speedtest.net configuration...
 Testing from Tsukaeru.net, Web Hosting Company, Japan (XXX.XXX.XXX.XXX)...
 Retrieving speedtest.net server list...
 Selecting best server based on ping...
 Hosted by JAIST(ino-lab) (Nomi) [215.39 km]: 18.061 ms
 Testing download speed................................................................................
 Download: 775.70 Mbit/s
 Testing upload speed................................................................................................
 Upload: 194.30 Mbit/s

3.引数を入れて実行
 詳しくはcliでインターネットの速度計測(speedtest.net)

 ・パケットを送ることができるサーバ一覧(日本のみ)
 $ python speedtest-cli/speedtest.py --list | grep 'Japan'
  6476) rxy (individual) (Osaka, Japan) [1.83 km]
  8832) prize3046 (Ikeda, Japan) [16.88 km]
 13641) NextechNetworkSolutions (Nara, Japan) [26.06 km]
  6368) gatolabo (Maibara, Japan) [98.72 km]
  6766) JAIST(ino-lab) (Nomi, Japan) [215.39 km]
  7976) denpa893 (Hikari, Japan) [338.27 km]
  8407) Allied Telesis Capital Corporation (Sagamihara, Japan) [363.95 km]
  6087) Allied Telesis Capital Corporation (Fussa-shi, Japan) [365.45 km]
  6508) at2wn (Yokohama, Japan) [384.12 km]
 15047) OPEN Project (via 20G SINET) (Tokyo, Japan) [395.14 km]
 15757) Speedtest.net (Tokyo, Japan) [395.14 km]
 15977) Speedtest.net (Tokyo, Japan) [395.14 km]
 14623) IPA CyberLab (Bunkyo, Japan) [400.95 km]
  6492) denpa893 (Sumida, Japan) [406.34 km]
 14515) CanopusAzusa (Nagaoka, Japan) [428.70 km]
  7139) SoftEther Corporation (Tsukuba, Japan) [438.61 km]
  8193) kamiari (Sendai, Japan) [621.91 km]
  6405) Allied Telesis Capital Corporation (Misawa, Japan) [841.79 km]
   811) GLBB Japan KK (Chatan, Japan) [1189.83 km]
  6581) haza (Haebaru, Japan) [1203.32 km]

 ・サーバを決めて実行&表示をシンプルなものに
 今回はサーバを大阪(6476)にした。
 $ python speedtest-cli/speedtest.py --server 6476 --simple
 Ping: 17.362 ms
 Download: 218.83 Mbit/s
 Upload: 109.91 Mbit/s


【参考(メモ)】
1.googleのスピードテストを利用する
スピードテスト で検索
インターネットの速度をテストする - Google 検索 ヘルプ
https://support.google.com/websearch/answer/6283840?p=speedtest&visit_id=1-636594712311204344-474627145&rd=1

2.windowsのバッチで自動計測する→「BNRスピードテスト」を利用している
【実践編】通信速度を自動測定してグラフ化する方法 - 踊るびあほりっく
http://www.odorikoblog.net/entry/speedtest
インターネット回線速度を自動的に定時測定してみる(Windows7) / kghr IT備忘録
http://kghr.blog.fc2.com/blog-entry-26.html

3.スプレッドシートを利用して計測する→「peters/speedtest」を利用
定期的にスピードテストを実施して回線速度を記録する - Qiita
https://qiita.com/tomatosum/items/40cc34015b1aa96bfc63

4.speediest.netが提供している速度測定を利用する
回線速度の時間推移を測定してグラフ化する: あれやこれや備忘録
http://iici.cocolog-nifty.com/blog/2017/05/post-8810.html
cliでインターネットの速度計測(speedtest.net) - Qiita
https://qiita.com/tukiyo3/items/78ab5a63aec20632c162
Command line interface for testing internet bandwidth using speedtest.net
https://github.com/sivel/speedtest-cli

その他.Amazon Linux AMIを使った環境で回線速度を調べる
Linux上でネットワーク回線速度を計測する手段について整理してみた | Developers.IO
https://dev.classmethod.jp/server-side/network/measuring-network-speedtest-on-linux/

2018年4月12日木曜日

一定期間ログインしていないユーザの停止

手順
1.ユーザのログイン状況を確認
 root権限でサーバにログイン
 # lastlog

  最近のログインで、対象ユーザをピックアップ

2.ユーザの停止
 # usermod -L username
 で停止が可能。停止後はsshでログインしようとしてもパスワード入力後に跳ねられる。
  
3.DNSの停止
 DNSサーバにログイン
 対象部分を";"でコメントアウト 

参考
【 ユーザーのログイン履歴を参照する 】 | 日経 xTECH(クロステック)
 http://tech.nikkeibp.co.jp/it/article/COLUMN/20060228/231078/
 Linux ユーザーアカウントをロック・アンロックする
 http://kazmax.zpp.jp/linux/account_lock.html
【 usermod 】コマンド――ユーザーアカウントの情報を変更する:Linux基本コマンドTips(73) - @IT
 http://www.atmarkit.co.jp/ait/articles/1612/14/news022.html

2018年4月9日月曜日

Matlab for Java : (7) Neural Networkの利用

今回はMatlabを利用してJavaからNeural Networkを実施してみます。

(1) 利用データ
利用データは、ディープラーニングがわかる数学入門(技術評論社) を参考にして、手書き文字の「0」「1」を12個のデータで表したものを利用します。
csvから取り込みますが、最初の12列は画像データ(数値の0または1を0,1で表している)もので、13-14列目が数値の0または1を表しています(10が0、01が1)




これを取り込んで、target配列には最後の2列のみ入れておきます。

(2) Neural Networkの実行(初期設定)
まず隠れ層のサイズを決めます。
hiddenLayerSize = 3
net = patternnet(hiddenLayerSize)
https://jp.mathworks.com/help/nnet/ref/patternnet.html
(3) 学習
データを学習、検証、テストの各サブセットに分割します。
https://jp.mathworks.com/help/nnet/ug/divide-data-for-optimal-neural-network-training.html
net.divideParam.trainRatio = 70/100; //学習
net.divideParam.valRatio = 15/100; //検証
net.divideParam.testRatio = 15/100; //テスト
70% は学習に使用。
15% は、ネットワークが汎化されていることを検証し、過適合の発生前に学習を停止するために使用。
最後の 15% は、ネットワークの汎化の完全に独立したテストとして使用。
https://jp.mathworks.com/help/nnet/gs/classify-patterns-with-a-neural-network.html
学習します。
https://jp.mathworks.com/help/nnet/ref/train.html
[net,tr] = train(net,inputs,targets)
net : 新たに学習させたネットワーク
tr : 学習記録 (epoch および perf)

これを見ると
best_epoch: 19
best_perf: 2.4662e-07
図のように19回繰り返すことで一番良い値が得られていることがわかります。
https://jp.mathworks.com/help/nnet/ug/analyze-neural-network-performance-after-training.html

勾配も十分小さくなり、収束したことがわかります。validationからも特に過学習がないことがわかります。
(4) テスト
outputs = net(inputs)
混同行列を用いて、学習データとテスト結果から精度を表示します。
右上の赤はクラス2だったものがクラス1に分類された数
左下の赤はクラス1だったものがクラス2に分類された数
今回は全て正しく分けられている。
https://jp.mathworks.com/help/nnet/ref/plotconfusion.html

[c,cm] = confusion(targets,outputs)
c : 混同値 = 誤分類された標本の割合
cm : 2 行 2 列の混同行列
https://jp.mathworks.com/help/nnet/ref/confusion.html
fprintf('Percentage Correct Classification   : %f%%\\n', 100*(1-c));
fprintf('Percentage Incorrect Classification : %f%%\\n', 100*c);


plotroc(targets,outputs)
plotroc(targets,outputs) は、各出力クラスの受信者動作特性をプロットします。各曲線がプロットの左端および上端により多く沿っているほど、分類の精度が高いことを示します。
https://jp.mathworks.com/help/nnet/ref/plotroc.html
図では見えないほど、左端、上端にグラフがあるので精度は良いです。
最後にoutputsを出力しています。
ソースコード

2018年4月6日金曜日

Matlab for Java : (6) Regressionの利用

Matlabを使ってJavaから重回帰分析をやってみます。
(1) データの準備
今回は80歳以上人口を予測するのに、どの年代層が影響しているかをやってみます。
データは(19歳まで、20-39歳まで、40-59歳まで、60-79歳まで、80歳以上、世帯数)です。

https://github.com/smzn/MatlabJava06/blob/master/csv/population.csv

(2) コンストラクタで散布図描画
横軸:世帯数、縦軸:80歳以上人口で散布図を描きます。

(3)線形回帰を実施(1変数)
fitlm関数を使って線形回帰をやってみます。
https://jp.mathworks.com/help/stats/fitlm.html
横軸:世帯数、縦軸:80歳以上人口
mdl = fitlm(x)


この場合、決定係数: 0.842でした。


(4) quadraticで実施 
精度を上げるために他のモデルを指定してみます。
mdl = fitlm(x,'quadratic')

モデルは、切片、線形項、交互作用、二乗項を含みます。
決定係数: 0.843であり変わりませんでした。
変数が少ないためだと思います。

(5) ロバスト近似の利用
mdl = fitlm(x,'quadratic','RobustOpts','on')
決定係数: 0.884と上昇しました。
(6) 2変数( robust近似)
0-19歳人口を入れて80歳以上人口を予測しました(0-19歳人口、世帯数)。
決定係数: 0.906と上昇しました。

(7) stepwiselmで説明変数を選択
80歳以上人口を予測するために、全ての変数を使ってstepwiselmで説明変数を選択しました。
https://jp.mathworks.com/help/stats/stepwiselm.html
mdl = stepwiselm(x)
決定係数: 0.921となり、良い値になりました。
Var2(20-39歳人口) -0.32827となり、この年代とは逆の関係にありそうです。
Var4(60-79歳人口) 0.088571となり、高齢者が多い地域には80歳以上人口も多くなっています。
Var5(世帯数) 0.29659にも大きく+の影響があります。

ソースコード

2018年4月4日水曜日

Matlab for Java : (5) summaryの利用

MatlabのsummaryをJavaから利用します。summaryの戻り値は構造体になるので注意が必要です。

(1)データをtable配列に変換
Javaで取り込んだデータをtableに変換します。
https://jp.mathworks.com/help/matlab/ref/table.html

(2) summary戻り値の構造体
summaryは構造体で返しますので、その構造を知っておく必要があります。
Javaから実行すると、下記のような出力になります。
ml.eval("data = table(data(:,:));");
ml.eval("summary(data);");
 これを見ると、Var1の中にMin, Median, Maxの属性があるのでその値を取得します。
注意ですが、同じデータをMatlab本体で実施すると、ちょっと違った構造になります。
構造体の中は、VarName1などの構造体があり、その中に実際のMinなどの値があります。
JavaではVar1からそれぞれの属性、Matlab本体ではVarName1からそれぞれの属性となっているので注意が必要でした。
もう一つ注意として、Javaからs.Var1.Minを直接Javaからアクセスしようとするとできませんでした。そのため、一度変数に入れてからアクセスしました。
実行してみると、次の結果になります。
 ソースコード