Hatena::ブログ(Diary)

Diary of strysd このページをアンテナに追加 RSSフィード

2016-09-25

PHP マニュアルの SVM 関数を一部翻訳しました

| 23:26 | PHP マニュアルの SVM 関数を一部翻訳しましたを含むブックマーク

最近、AI なるキーワードが週刊ダイヤモンドの特集として表紙をかざるなど、バズワードになっていますが、私もわけあって調べています。そんななか、PHP にも SVM (サポートベクターマシン) 関数 や FANN (Fast Artificial Neural Network) 関数があるのを見つけ、コンパイルするところから取り組んでみました。

PHP マニュアルのコンパイルの説明や一部の関数も翻訳してコミットしておきました :-)

PHP の SVM (サポートベクターマシン)関数を一部翻訳した http://php.net/svm

https://twitter.com/strysd/status/779481227904462848

ちなみに、サポートベクターマシンなど機械学習関連の参考書籍を探してみると面白いことに気が付きました。ただし、これはある特定の本屋の話なので、一般的にそうだ、ということではないです。

本屋で、IT関連の棚に置かれている機械学習の本を手に取る人は多いが、数学統計学の棚にあるパターン認識ベイズ統計学の本を手に取る人は少ない。

https://twitter.com/strysd/status/779530790459715584

もちろん IT 関連の棚に、機械学習だの人工知能だの、おいてあるのですが、週末に取り留めなくあちこちの棚を見ていくと、数学の統計学のところに下記の本がありました。(他の本屋では違うかもしれません)

この統計学の棚を見に来る人は、私がそこで20分くらい探し物をしている最中はゼロでした。(ちなみに金曜日の仕事が終わったあとの夜8時くらいです。機械学習の棚を見に来た人は数人程度なので誤差かもしれない?)

ちなみに統計学のところには、SPSS の本もあったりしますが、ベイズ統計学の本もあったりしますし、パターン認識について10年位前に書かれたような基礎理論を扱ったような本もあります。

パターン認識って、ベイズ統計学の応用分野なんだ、と気づきました。

もしベイジアンフィルターについて理論的なところから必要なら、統計学の棚も目を通すと良いかもしれません。Amazon だとキーワード検索でいろいろな本が一覧で出てきますが、リアルな本屋で本を探すときには、本によって別々の分野の棚に置かれているかもしれないので注意点ですね。

ちなみにおまけとして付け加えると、画像処理で使われる OpenCV についての本は 画像センサー、デジタルカメラの画像処理についてなどの本と一緒に、電気・電子・機械関係の棚にありましたので注意。

2016-07-23

最近の JIRA Software と Confluence のマイ・オプション

| 17:25 | 最近の JIRA Software と Confluence のマイ・オプションを含むブックマーク

最近、JIRA Software 7.1 と Confluence 5.10 をノートPC にインストールし直す機会があり、 Java のオプションをいろいろ変えてみたりしたので、自分が設定したオプションをメモのために残しておきます。OSWindows で 64bit 版です。

JIRA Software の bin フォルダーの setenv.bat は、下記のように変更しました。

- set JVM_SUPPORT_RECOMMENDED_ARGS=
+ set JVM_SUPPORT_RECOMMENDED_ARGS=-XX:-UseCodeCacheFlushing -Xverify:none -XX:+TieredCompilation -XX:TieredStopAtLevel=1
- set JVM_MINIMUM_MEMORY=384m
+ set JVM_MINIMUM_MEMORY=512m
set JVM_MAXIMUM_MEMORY=768m

verify:none 、TieredCompilation と TieredStopAtLevel は、起動高速化に役立つかどうか試すため入れてみました。(TieredCompilation と TieredStopAtLevel は、64bit OS の場合のみ有効な手段)

UseCodeCacheFlushing は、ReservedCodeCacheSize とともに Java 7u4 以降で使用できるオプションだそうです。注意点として UseCodeCacheFlushing のプラスではなく、マイナスを設定してます。

UseCodeCacheFlushing をマイナス設定すると、長期間継続使用するときのパフォーマンス劣化に効くらしいです。ただし、ノート PC では、デモ説明とか資料つくりとか、長くても8時間くらいでサービスを落としてしまうので、設定の効果はまだ明確にできていません。

JVM_MINIMUM_MEMORY は、JDK 付属の Java Mission Control の JMX グラフを見ながら、コミットされたメモリ量を参考に設定してみました。ちなみに、私の JIRA 上のプロジェクトや課題やボードは、作っては全部消すことを繰り返していていつもはデータがありません。本番環境だと、この 値では少ないかもしれません。

ちなみに最初は、MaxPermSize と PermSize も指定したのですが、起動直後のログを見て、Java8 ではこの2つが無視されることに気づき除外しました。

同じく Confluence は、下記のように変更しました

- set CATALINA_OPTS=-XX:-PrintGCDetails -XX:+PrintGCDateStamps -XX:-PrintTenuringDistribution %CATALINA_OPTS%
+ rem set CATALINA_OPTS=-XX:-PrintGCDetails -XX:+PrintGCDateStamps -XX:-PrintTenuringDistribution %CATALINA_OPTS%
- set CATALINA_OPTS=-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M %CATALINA_OPTS%
+ rem set CATALINA_OPTS=-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M %CATALINA_OPTS%
- set CATALINA_OPTS=-Xloggc:"%atlassian_logsdir%\gc-%atlassian_timestamp%.log" %CATALINA_OPTS%
+ rem set CATALINA_OPTS=-Xloggc:"%atlassian_logsdir%\gc-%atlassian_timestamp%.log" %CATALINA_OPTS%
set CATALINA_OPTS=-Djava.awt.headless=true %CATALINA_OPTS%
- set CATALINA_OPTS=-Datlassian.plugins.enable.wait=300 %CATALINA_OPTS%
+ rem set CATALINA_OPTS=-Datlassian.plugins.enable.wait=300 %CATALINA_OPTS%
- set CATALINA_OPTS=-Xms1024m -Xmx1024m -XX:+UseG1GC %CATALINA_OPTS%
+ set CATALINA_OPTS=-Xms640m -Xmx1024m -XX:+UseG1GC %CATALINA_OPTS%
+ set CATALINA_OPTS=-XX:-UseCodeCacheFlushing %CATALINA_OPTS%
+ set CATALINA_OPTS=-Xverify:none -XX:+TieredCompilation -XX:TieredStopAtLevel=1 %CATALINA_OPTS%

Confluence の GC ログは、中身を見て何か対策する、ということができるところまでまだ私が至りません。そのため、ディスク I/O 減を優先して、一旦すべて GC ログ関係の設定をコメントアウトしてしまいました。

Xms は、初期値の 1024MB だとノートPC でほかにもいくつかソフト立ち上げたいときに困るので、JDK 付属の Java Mission Control の JMX グラフを見ながら、コミットされたメモリ量を参考に 640MB まで減らして設定してみました。ちなみに、私の Confluence 上のスペースやアイテムは、作っては全部消すことを繰り返していていつもはデータがありません。本番環境だと、この Xms 値では少ないかと思われます。

atlassian.plugins.enable.wait は、この設定をコメントアウトしたら何が起きるのか知りたかったのでコメントアウトしてみました。コンテンツもアドオンもほとんど何も入っていない環境だと、コメントアウトしても大丈夫みたいですね。

ちなみに、クラウド版のアカウントセットアップを行って JIRA Software や Confluence を使う場合は、これらのオプションのことは忘れてください

Java VM ヒープ領域調査用バッチファイル

| 16:55 | Java VM ヒープ領域調査用バッチファイルを含むブックマーク

今まで Windows に JIRA Software / JIRA Service Desk / JIRA Core のサーバー版をインストールする際、「サービスとして起動」のチェックボックスをチェックつけてました。

インストール後にわざわざサービス管理の画面で Atlassian JIRA サービスの「自動起動」を「手動起動」に変えて、必要な時だけ起動する使い方をしていたのですが、最近ヒープ領域の使用量について調べたいことがあり気づきました。

  • サービスとして起動すると、JDK の jps コマンドでプロセス番号が表示されない! ということは jstat コマンドなども使えない。。。

そんなわけで「サービスとして起動」のチェックボックスをチェックしないよう気を付けて再インストール。すると今度は、jps コマンドをたたくと、Bootstrap という名前で JIRA Software のサーバー版のプロセス番号が取れるようになり、めでたしめでたし。しかもサービス管理画面でいちいち自動起動を手動起動に直す手間いらないし。

jps コマンドと jstat コマンドを簡単に呼び出せるように、下記のような bat ファイルも用意してみました。JAVA_HOME は JDK のインストール先のパスを入れておくために用意した環境変数です。

echo off
cd "%JAVA_HOME%\bin"
java -version
jps
set /P MYVMID="Java VM の PID を入力してください:"
if "x%MYVMID%x" == "xx" goto myend
jstat -gcutil %MYVMID%
pause
exit

:myend
echo "指定されませんでした"
pause
exit

結果はこんな風に表示されます。

f:id:satoruyoshida:20160723165220p:image

2016-07-09

暑くなりましたので節電方法

| 14:03 | 暑くなりましたので節電方法を含むブックマーク

最近暑くなりましたね。なんか6月の半ばくらいから一気に暑くなった気がします。

気温と雨量の統計 weather.time-j.net という Web サイトで、一番近い主要都市の気温グラフを探すと、横浜のものがありました。

f:id:satoruyoshida:20160709131541p:image

自分の体感的には、気温が28度以上になると暑く感じるようです(個人差があると思います)

さて、最近自宅に帰宅すると真っ先にすることがあります。それは、一番換気扇から遠い場所の窓だけを開けてしばらく換気扇を回すことです。最初は部屋の中も暑いし、壁や床も熱を持っているのですが、換気扇を10分くらい回しているうちに気温が2〜3度下がって、壁や床も冷えてきます。そのように冷めてきてからエアコンをONにするよう心がけています。

あとは、休日は朝からエアコンをONにしておいて、急激に温度が上がるのを防いだり、エアコンにあたる日光を減らすため、エアコンのうえにすだれをかけたりして、少しでも節電に心がけています。

あとは休日の朝に洗濯物を早く済ませて干してしまうことですね。これは以前エアコンがない家に住んでいたときからの習慣です。太陽の光を若干さえぎってくれます(笑

パソコンを自宅でも使われているかたは、パソコンが熱を持つことにもお困りかもしれません。

すぐ簡単にできることとして、視覚効果をOFFにすることができます。

  • 最初にコントロールパネルを表示して、その中の「システムとセキュリティ」を選択します。

f:id:satoruyoshida:20160709134315p:image

  • 次にその中の「システム」を選択します。

f:id:satoruyoshida:20160709134554p:image

  • 左側のメニューの「システムの詳細設定」を選択します。

f:id:satoruyoshida:20160709134159p:image

  • 「システムのプロパティダイアログが表示され、5つのタブがあります。そのうち中央の「詳細設定」タブを選択し、そのタブの上の部分にある「パフォーマンス」という枠の中の「設定」ボタンを押します。

f:id:satoruyoshida:20160709134317p:image

  • 「パフォーマンス オプション」ダイアログが表示され、3つのタブがあります。そのうち左の「視覚効果」タブを選択します。最初は、一番上の「コンピューターに応じて最適なものを自動的に選択する」のすぐ左の丸印にチェックが入っています。「パフォーマンスを優先する」の丸印にチェックをつけ直して右下のOKボタンを押します。
    • どうしても使いたい視覚効果がありましたら、「パフォーマンスを優先する」の代わりに「カスタム」を選んで必要なもののみチェックをつけていただけましたら幸いです。

f:id:satoruyoshida:20160709134316p:image

  • お待ちください、と表示された後、画面の表示が全体的に変わります。「システムのプロパティ」ダイアログが表示されます。
  • 「システムのプロパティ」ダイアログの右下のOKボタンを押します。
  • コントロールパネルの表示を右上の×印で閉じます。

画面表示がダサい感じにはなってしまいますが、PCをしばらく使っているうちに前よりも熱を持ちにくいことに気づいていただければ幸いです。

2016-05-07

Oomph をベースにした Eclipse Installer は安定したか

| 20:53 | Oomph をベースにした Eclipse Installer は安定したかを含むブックマーク

Eclipse 4.5 (Mars) とともに 2015年6月 にリリースされた Eclipse Installer は、Mars がまだ Developer Build のときに一回試したことがあります。そのときは起動直後にこけて、まだまだ使えないと感じていました。

今日、次の 4.6 (Neon) の Developer Build から JavaScript Development Tool をパッケージとしてダウンロードする代わりに、Eclipse Installer を使ってみました。すんなり動いて感動。

下の画像の矢印の先で示した Windows 32bit 版を使用しました。

f:id:satoruyoshida:20160507203139p:image

一回 Eclipse Installer をダウンロードしてから、その Installer を起動して目的の開発環境やライブラリーをダウンロード、と少なくとも2段階の作業になります。なので、ADSL 回線などの細い回線をお使いの場合はパッケージとして固まっているものをダウンロードするほうが手っ取り早いです。

光回線をお使いの場合は、Eclipse Installer を使用することにより開発環境作成時の自由度が高くなりますね。

私も今後は積極的に Eclipse Installer を使っていこうと思います。

2016-04-29

JavaScript で作業時間数計算

| 10:43 | JavaScript で作業時間数計算を含むブックマーク

必要があって、作業開始時刻から終了時刻までの時間数を計算するロジックを JavaScript で組んでみました。開始時刻と終了時刻を最大5組まで入力して 0.25時間単位で計算します。


JavaScript 部分はこちら。

function allclear() {
	var myst = document.getElementsByName("myst");
	var myen = document.getElementsByName("myen");
	var res = document.getElementsByName("res");
	var len = myst.length;//入力行の数
	var total = 0;

	for ( var i = 0; i < len; ++i) {
		myst[i].value = '';
		myen[i].value = '';
		res[i].value = 0;
	}

	PLAN.allres.value = total;
}

function calc() {
	var myst = document.getElementsByName("myst");
	var myen = document.getElementsByName("myen");
	var res = document.getElementsByName("res");
	var len = myst.length;//入力行の数
	var total = 0;

	for ( var i = 0; i < len; ++i) {
		//:記号と空白を除去し、入力欄の値に反映します。
		stvalorg = myst[i].value.replace(/^\s+|\s+$|\:/g, '');
		envalorg = myen[i].value.replace(/^\s+|\s+$|\:/g, '');
		myst[i].value = stvalorg;
		myen[i].value = envalorg;

		//未入力、数値ではない、時刻逆転の3種類の場合、計算対象外にします。
		if (stvalorg == '' || envalorg == ''
		|| isNaN(stvalorg) || isNaN(envalorg)
		|| stvalorg > envalorg) {
			myhr = 0;
		} else {

			//4桁未満の入力の場合に対応
			stval = '0000' + stvalorg;
			enval = '0000' + envalorg;

			//時と分を2桁ずつ切り出します。
			stmn = stval.substr(-2, 2);
			enmn = enval.substr(-2, 2);
			sthr = stval.substr(-4, 2);
			enhr = enval.substr(-4, 2);

			//15分単位で割り算し切り捨て後、時間単位に変換
			myhr = Math.floor(((parseInt(enhr) - parseInt(sthr)) * 60
			     + parseInt(enmn) - parseInt(stmn)) / 15) / 4;

			//1200以前に開始し、1300以降に終了した場合だけ1時間減。
			//1200過ぎに開始した場合、1300より前に終了した場合は考慮していません。
			if (stval.substr(-4, 4) <= '1200'
			&&  enval.substr(-4, 4) >= '1300') {
				myhr -= 1;
			}
		}

		res[i].value = myhr;
		total += myhr;
	}

	PLAN.allres.value = total;
}

入力欄を表示するための HTML 部分はこちら。

script タグの部分は JavaScript 部分を別ファイル (calcworktime.js) にした場合の書き方です。もちろん、src 属性を使わずに script タグの内部に JavaScript 部分を書いてもかまいません。

<html>
<head>
<meta charset="UTF-8">
<title>作業時間計算</title>
<script type="text/javascript" src="calcworktime.js"></script>
</head>
<body>
<form name="PLAN">
	<table>
	<tr>
		<th>開始時刻</th>
		<th>終了時刻</th>
		<th>時間数(0.25単位)</th>
	</tr>
	<tr>
		<td><input type="text" name="myst" size="6" maxlength="5" tabindex="1"></td>
		<td><input type="text" name="myen" size="6" maxlength="5" tabindex="2" onblur="calc()"></td>
		<td><input type="text" name="res" size="4" value="0"></td>
	</tr>
	<tr>
		<td><input type="text" name="myst" size="6" maxlength="5" tabindex="3"></td>
		<td><input type="text" name="myen" size="6" maxlength="5" tabindex="4" onblur="calc()"></td>
		<td><input type="text" name="res" size="4" value="0"></td>
	</tr>
	<tr>
		<td><input type="text" name="myst" size="6" maxlength="5" tabindex="5"></td>
		<td><input type="text" name="myen" size="6" maxlength="5" tabindex="6" onblur="calc()"></td>
		<td><input type="text" name="res" size="4" value="0"></td>
	</tr>
	<tr>
		<td><input type="text" name="myst" size="6" maxlength="5" tabindex="7"></td>
		<td><input type="text" name="myen" size="6" maxlength="5" tabindex="8" onblur="calc()"></td>
		<td><input type="text" name="res" size="4" value="0"></td>
	</tr>
	<tr>
		<td><input type="text" name="myst" size="6" maxlength="5" tabindex="9"></td>
		<td><input type="text" name="myen" size="6" maxlength="5" tabindex="10" onblur="calc()"></td>
		<td><input type="text" name="res" size="4" value="0"></td>
	</tr>
	<tr>
		<th colspan="2">合計:</th>
		<td><input type="text" name="allres" size="4" value="0"></td>
	</tr>
	</table>
	<br />
	<input type="button" onclick="calc()" value="再計算" tabindex="11">
	&nbsp;&nbsp;
	<input type="button" onclick="allclear()" value="クリア" tabindex="12">
</form>
</body>
</html>
  • 注意
    • 0900, 1330, 2515 のように入力してください。 :記号や時刻一桁だけ (例: 900) も OK
    • 12時以前に開始して13時以降に終了する場合だけ 1 時間引いています。
    • IE では使用できません。FireFox 45.0.2 で動作確認済です。