2013年11月17日日曜日

AngularJS IN DART

dart には angularjs が移植されている。

angularjsの素晴らしさを整理してみる:http://pochi.hatenablog.jp/entry/2013/11/13/002504

angularjsのdartへの移植が進行中:http://www.infoq.com/jp/news/2013/06/angularjs-dart

クロージャ:http://dqn.sakusakutto.jp/2009/01/javascript_4.html

Google Dart 事始め

Google Dartの正式版がリリースされたので使ってみる。

公式ページ


https://www.dartlang.org/


APIリファレンス

1.0リリース前のコードからは変更も多数。最新のAPIをチェックすべき。

http://api.dartlang.org/docs/channels/stable/latest/

参考サイト

DARTことはじめ:http://usagi.github.io/intro-dart/#/
DART入門:http://zenback.itmedia.co.jp/contents/www.sssg.org/blogs/hiro345/archives/10994.html
What is Dart:http://sitekamimura.blogspot.jp/2013/09/dart-what-is-dart-kindle-kathy-walrath.html

言語仕様


  1. クラスを使う
  2. クラスの外側にメソッドが記述可能
  3. オプションと引数:Javaと違って省略引数可能。C++のように後ろの引数を省略 or 引数に名前をつけて省略
  4. 文字列インターポレーション:php的に、"Hello, ${name}"とできる
  5. マルチライン文字列: ($s=<<END;) のような文字列リテラル
  6. 動的メソッドハンドリング:実行時にメソッドがあるか確認する
  7. カスケード演算子: JavaScript の with。
  8. オプショナルな型:小さなアプリなら型をかかない、ちゃんとしたアプリでは型をかく、が選べる
  9. レキシカルスコープ:{}が識別子のスコープ。クロージャ(Java8で実装予定のλや無名関数で実現する関数オブジェクトの一種)やローカル変数キャプチャもOK。
  10. ライブラリ:Pub(オープンなリポジトリで便利)
  11. Isolate:マルチスレッドでお互いのメモリにアクセス出来ないので安全
Javaで出来て、Dartで出来ないのは、メソッドのオーバーロード不可能。intが初期値を代入しないとnullになる。継承は1つまで。

※マルチライン文字列リテラル(以下だったらENDで囲まれた文字列の改行を維持する)
my $s = <<'END';
aaaa
iiii
uuuu
END


※カスケード演算子
with (document) {
  //このブロックの中ではdocument.を省略できる
  var hoge = getElementById('hoge');
  ...
}
※邦訳版
http://www.cresc.co.jp/tech/java/Google_Dart/DartLanguageSpecification_about.html

コードのサンプル


コード動かす

トップページから必要なSDKをダウンロードして解凍すると、Dart Editor (もとはEclipse)が入っているので起動する。

HelloWorld

新しいプロジェクト(WebApplication)を作成すると、webディレクトリの配下に以下のファイルが用意される。

[プロジェクト名].css
[プロジェクト名].dart
[プロジェクト名].html

その他に、packages/browserディレクトリが出来て、中に以下のファイルができる。
dart.js
hiterop.js


編集するのは、「.dart」の拡張子を持つ dart ファイル。後は、htmlとcssを編集する。C系と同じようにエントリーポイント(main)からプログラムが実行される。

dartを編集してから、htmlを右クリックして「run as JavaScript」を実行するとdart2jsが動いてJavaScriptが生成される。

構文

文字列


  • 文字列リテラルはECMAScriptライク
  • ${xxx}や\nなど、シェルスクリプトライクな文法が使用可能
  • ${new Date.now().day -1}などの式を、文字列内に内挿可能


型と変数


  • bool / int / double / num
  • String / List / Set / Queue / Map / ...
  • final 修飾で定数宣言(C++ の const と似ている)


制御文

Javaの構文をほぼそのまま使える

  • for / for-in / while / do-while
  • switch case break / if else / ?:
  • break / continue
  • try throw catch


演算子

Java、C++にある演算子はほぼそのまま使える


関数とラムダ式



クラスの継承

前半にも書いたが、多重継承は不可。


ジェネリクス

使える。型制約も可能。


DART SDK


  • dart : Dart処理系(Dart VM) Dart VMを搭載したブラウザだと動作。V8より高速。
  • frogc(dart2js) : dartからjsへのコンパイラー 
これ直接使うのはしんどい。Dart Editorのバックエンドとして動いてるって知っておく程度。


DART用HTMLファイル

cssとdartファイル指定。JavaScriptを生成してWebサーバに配置すればOK.

毎日さっくりと使えるTODOリストが無かったのでサンプルから作成。


以上。ワクワクする仕様。何つくろうかな。

チュートリアル

https://www.dartlang.org/codelabs/darrrt/#set-up
https://www.dartlang.org/docs/tutorials/add-elements/#copy-app

JavaScript 事始め

JavaScript 事始め

node.js使いたいので勉強。

もともとブラウザ内で動的なコンテンツを生成するためにつくられた言語。
以下、事始めで使ったコード。

2013年11月13日水曜日

chrootユーザを作成する

sftp限定ユーザの作成

#useradd test
#passwd test
#usermod -d / test
#chown root:root /home/test
#chmod 755 /home/test
#mkdir /home/test/files
#chmod 755 /home/test/files
#chown test:test /home/test/files
#groupadd sftponly
#usermod -G sftponly test
#vi /etc/ssh/sshd_config
 Subsystem       sftp    internal-sftp
 Match group sftponly
        ChrootDirectory /home/%u
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp

2013年10月12日土曜日

OpenCVのjavaが進化してた

OpenCVをjavaで使うために、jniで苦労したことがあった。

OpenCVの2.4.6でjava版を覗いてみたらかなりapiが充実していたので驚き。

大規模じゃなければこっちでサクッとつくってみよう。

opencv246
http://opencv.org/


opencv246 java api
http://docs.opencv.org/java/


使い方は簡単。

opencvを展開したら、jarをライブラリパスに追加。dllを格納したディレクトリをjavalibrarypathに
追加するだけ。

opencv 3が出たらまたチェックしてみよう。


2013年8月14日水曜日

ジオコーダー&逆ジオコーダー Google API for Java

緯度・経度と住所の相互変換コード。
GoogleのAPIが便利。後は、LatLngに関係する情報をユーザに返すコードが出来れば、GPSとの連携ができる。


警視庁地域別オープンデータ

人口の地域別データは簡単に手に入るのですが、そのほかで使えるものがあまりありません。
以下が見つけたもの。

 ○警察署別 交通事故発生状況 http://www.keishicho.metro.tokyo.jp/toukei/bunsyo/toukei23/data/kt23_d010.xls

 ○警察署別 刑法犯罪状況 http://www.keishicho.metro.tokyo.jp/toukei/bunsyo/toukei23/data/kt23_d033.xls

 ○警察署別 泥酔者保護(笑) http://www.keishicho.metro.tokyo.jp/toukei/bunsyo/toukei23/data/kt23_d121.xls

 これらはすべて以下のページから取得できます。 警察署別のデータであれば、地域別にデータを分類できそうです。

EC2の起動・停止を費用の削減目的で実施

EC2インスタンスを使わないときは落そう。自動で。
以下の様に簡単にできる。

2013年8月13日火曜日

stringはそもそもchar配列

stringはそもそもchar配列という基本を確認。

Win8 Wi-Fiが不安定なとき

Win8ではハードウェアとの相性のせいか、Wi-Fiが不安定になるときがあります。 デバイスドライバを最新にしましょう。 http://www.intel.com/p/en_US/support/detect/wireless-display

2013年8月4日日曜日

Kinect 距離による表示フィルター RGBと距離カメラの位置補正を含む

距離カメラの情報が1次元データなので、RGBカメラ座標に変換するときに少し工夫する。


Kinectでフレームデータの更新を待つ方法

Kinectでフレームデータの更新を待つ方法


  1. INuiSensor::NuiImageStreamGetNextFrame() でタイムアウト値を設定する。
  2. INuiSensor::NuiLimageStreamOpen() に設定したイベントハンドルを使って、WaitForSingleObjectまたはWaitForMultipleObjectsで待つ
  3. INuiSensor::NuiSetFrameEndEvent() に設定したイベントハンドルを使って、WaitForSingleObjectで待つ。
1でタイムアウト値を使う場合は、INFINITE を使うと、タイムアウトを使用せず、ずっと待つようになる。これは、フレーム更新の間に他の処理を行わない場合に使える。もし、フレーム更新の間に他の処理を行う場合は、処理の長さによって、タイムアウトを決定する。




Kinectのインターフェース

Kinectは、以下のNUI ( Natural User Interface ) インターフェースを備えます。

何をしたいかで、どれを使えば良いかおおまかにわかります。

Natural User Interface


INuiSensor : Kinectセンサーのハードウェアアクセス機能を提供
INuiFrameTexture : RGB及び距離カメラのピクセルデータを取得


音声

INuiAudioBeam : 音源方向を取得する。QueryInterface()で音声入力や、設定プロパティへのアクセス機能を取得できる。

INui~とNui~

INuiはKinectを複数用いる。Nuiは1台。どちらも同じ関数、機能を提供する。


Kinectアプリケーションビルド時の注意点

Kinectアプリケーションは、x86アプリなのか、x64アプリなのか、明確にした上で環境設定を行うこと。

そうしないと、以下のエラーでビルドに失敗する。

fatal error LNK1112: モジュールのコンピューターの種類 ‘X64′ は対象コンピューターの種類 ‘x86′ と競合しています。

これは、x86のアプリで、x64のライブラリを使おうとする場合におこる。
逆の場合もありえる。
C++のWin32コンソールアプリを選んだ場合、KinectとOpenCVのライブラリを x86 で統一しておくと安全。

Kinect Basic Sample 01 RGB Camera View

Kinectを使って身体の研究をするプロジェクトの第一弾。 最も簡単なSample。 RGBカメラの表示。

2013年7月18日木曜日

php curl でちょっとはまった

phpのcurlを使って、バイナリデータを送る際ちょっとはまったのでメモ。

RestfulなAPIへxmlデータをサーバに送信する際、key無しで送信するためには、以下のように「file_get_contents」関数を使ってファイルデータを取得して、POST 送信する必要がある。


2013年7月17日水曜日

Virtual Box の vdi のUUIDを変更する。

複数のPC(特に同一ネットワーク上)でVirtual Boxのイメージを使いまわそうとする場合に出ることがあった。

UUIDの重複エラー。以下でUUIDを変更

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" -nologo internalcommands sethduuid C:\VirtualBox_vdi\os.vdi
UUID changed to: ~

2013年7月6日土曜日

MongoDBの基礎

MongoDB

ドキュメント指向データベース NoSQL

パフォーマンス良い、スケーラブル良い→大量のデータを扱う

ドキュメント指向

カラムが固定されない=スキーマレス
 ユーザ、状況、データによって柔軟に変更可能

以下のような用語を使用する。()はRDBMSの用語

コレクション (Table)

ドキュメント (Record)

データ格納はJSON


ex)
[x, y, z] ←ただ値を格納したいとき
{"key":value, "key":value} ←keyとvalueの組で格納するとき 
{"key":value, "key":[x,y,z]} ←多重配列的に格納するとき

on Windows

Windowsでは、公式サイトからmongodbのバイナリzipを取得、解凍して、任意のディレクトリに
置いた後、以下のコマンドでdataを保存するディレクトリを指定してから使う。


> mongod --dbpath C:\mongodata\db\data

接続

> mongod

シェルでは JavaScript が使える。


データベース

show dbs:一覧表示

use [データベース名]:新しいデータベースの作成(これだけだとempty状態)

db.createCollection("コレクション名"):新しいコレクションを作成する

db.stats():一覧表示

db.dropDatabase();:データベースの削除


コレクション


db.createCollection("dictionary"); :dictionaryコレクション作成

db.createCollection("points"); :pointsコレクション作成

show collections :コレクションの一覧を見る

コレクションを操作したいときは、dbのあとの要素に操作したコレクションを「.」で結合する

db.points.drop(); :pointsコレクションを削除する

db.dictionary.renameCollection("textdic"); :deictionary コレクションの名前を textdic に変更


ドキュメント

mongodb textdic :textdicデータベースに接続

show collections :コレクションの一覧を見る

db.points.insert({["date":"vector", "word":"test1"}); :pointsコレクションにdate:vector、word:test1の要素をもつドキュメントを追加

スキーマレスなので、同じコレクションに大して、構造のドキュメントを追加する必要がない。

db.points.insert({"date":"vector","wordarray":["test2", "test3"]}); :pointsコレクションに上記とは違う構造のドキュメントを追加

db.points.find() :pointsコレクション内のドキュメント一覧

db.points.remove():pointsコレクション内のドキュメントを削除


大量のドキュメントの生成

JavaScriptが使える利点を使って、データを生成する。

ex)pointsコレクションにランダムな点データドキュメントをmod3でグループに分けて10点生成する。

> for (var i=0; i<10; i++) {
... db.points.insert(
... {"pointnum":i,
... "group":i % 3,
... "x":Math.floor(Math.random()*100),
... "y":Math.floor(Math.random()*100)
... }
... );
... }
結果を見る。

db.points.find()
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa12"), "pointnum" : 0, "group" : 0, "x : 5, "y" : 8 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa13"), "pointnum" : 1, "group" : 1, "x : 54, "y" : 45 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa14"), "pointnum" : 2, "group" : 2, "x : 47, "y" : 9 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa15"), "pointnum" : 3, "group" : 0, "x : 16, "y" : 31 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa16"), "pointnum" : 4, "group" : 1, "x : 84, "y" : 28 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa17"), "pointnum" : 5, "group" : 2, "x : 35, "y" : 71 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa18"), "pointnum" : 6, "group" : 0, "x : 8, "y" : 90 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa19"), "pointnum" : 7, "group" : 1, "x : 13, "y" : 53 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa1a"), "pointnum" : 8, "group" : 2, "x : 21, "y" : 11 }
{ "_id" : ObjectId("51d77bfe3e6506f15ba6aa1b"), "pointnum" : 9, "group" : 0, "x : 10, "y" : 63 }

ドキュメントの抽出

db.points.find():全件抽出
db.points.find({"group":0});:groupが0のもののみ抽出
db.points.find({"group":0}, {"pointnum":true});:gourpが0のものの、pointnumのみ抽出
db.points.find({"group":{$ne:0}}); :groupが0で無いもののみ抽出 $ne→not equals
db.points.find({"x":{$gt:5}});:xが5より大きい
db.points.find({"x":{$gte:5}});:xが5以上
db.points.find({"x":{$lt:5}});:xが5より小さい
db.points.find({"x":{$lte:5}});:xが5以下
db.points.find({"x":{$gt:5, $lt:30}});:xが5より大きく30より小さい

正規表現

db.points.find({"":{$regrex:/<正規表現パターン>/i}});:正規表現パターンに合致したものを抽出

ソート

db.points.find().sort({"score":1}); :scoreで昇順に取得、-1だと降順


件数制限

db.points.findOne(); :先頭から1件抽出
db.points.find().limit(3); :先頭から3件抽出
db.points.find().skip(2).limit(3); :添字2 (0開始) のドキュメントから3件抽出
db.points.find().count(); :抽出した件数


ユニークな値を取得

db.points.distinct("group"); :ユニークな値を抽出

包含関係

db.points.find({"group":{$in:[0 ,1]}}); :グループが0または1に含まれるものを抽出
db.points.find({"group":{$nin:[0 ,1]}}); :グループ0か1以外を抽出


存在

db.points.find({"group":{$exists:true}}); :groupが存在しているドキュメントのみ。

Index インデックス

> db.points.getIndexes(); 現在のインデックスを参照
[
        {
                "v" : 1,:
                "key" : {
                        "_id" : 1
                },
                "ns" : "textdic.points",
                "name" : "_id_"
        }
]
db.points.ensureIndex({"pointnum":1});:pointnumに昇順Indexはる、-1だと降順
db.points.ensureIndex({"pointnum":1}, {"unique":true}); :pointnumにuniqueな昇順Indexはる、
db.points.dropIndex({"pointnum":1}); :インデックスの削除

ドキュメントの更新

updateの引数:1つ目が抽出条件、2つ目が置き換えたい値

db.points.update({"pointnum": 2}, {$set:{"x": 2000}}); :pointnum2のドキュメントのxを2000に書き換える
db.points.update({"pointnum": 3}, {$inc:{"x": -10}}); :pointnum3のど球面とのxを-10する
db.points.update({"pointnum": 5}, {$unset:{"x":1}}); :pointnum5の要素xを削除する
db.points.update({"pointnum": 6}, {$rename:{"y":"z"}}); :pointnum6の要素のyの名前をzに変更

updateの引数:3つ目が「upsert」、あれば変更、なければinsert(3つ目をtrueにする)

db.points.update({"pointnum":"100"},{$inc:{"x":1000}}, true);

                                                     
updateの引数4つ目が「date更新件数」:4つ目がtrueだと全件に適用

db.points.update({}, {$inc:{"y": 3000}}); :最初の1件のみ
db.points.update({}, {$inc:{"y": 3000}}, false, true);

外部ファイルからコマンドを実行

方法1

コマンド を記述したファイルを用意。(JavaScriptなので拡張子はjsとする)

mongo [データベース名] [実行したいjsファイル]


方法2

mongoインタラクティブコマンドから実行

mongo [データベース名]で接続したら

load("[実行したいjsファイル名(windowsでは\を\\とすることに注意)]");

バックアップと復元

ダンプ

mongodump:バックアップを取得

コマンドの出力にバックアップバイナリファイルの出力先が出る。

mongodump --db textdic:

C:\Users\真宏>mongodump --db textdic
connected to: 127.0.0.1
Sat Jul 06 12:38:25.349 DATABASE: textdic        to     dump\textdic
Sat Jul 06 12:38:25.351         textdic.system.indexes to dump\textdic\system.in
dexes.bson
Sat Jul 06 12:38:25.353                  2 objects
Sat Jul 06 12:38:25.355         textdic.dictionary to dump\textdic\dictionary.bs
on
Sat Jul 06 12:38:25.357                  0 objects
Sat Jul 06 12:38:25.357         Metadata for textdic.dictionary to dump\textdic\
dictionary.metadata.json
Sat Jul 06 12:38:25.361         textdic.points to dump\textdic\points.bson
Sat Jul 06 12:38:25.361                  10 objects
Sat Jul 06 12:38:25.363         Metadata for textdic.points to dump\textdic\poin
ts.metadata.json

リストア

mongorestore --drop [dumpファイルの格納ディレクトリ]:元のデータをdropして、dumpから復元する



便利だが、はやく Json に慣れたい。

2013年7月3日水曜日

sage 基礎編

数理処理システム sage 


Mathmatica や Matlab の代わりを目指すオープンソース。

変数宣言

変数宣言しておくことで、以降の数式に利用出来る。
var('変数名')

複数宣言の場合、スペース区切り

var('変数名 変数名 …')

関数の宣言

[関数名] = [式]

ex)

f = (x - 3) * (4x - 5)

関数の計算

変数に値を代入して、関数を計算する。

[関数名]([変数] = [値])

ex)

f(x = 5)
戻り値は計算結果。


lambda式を使って関数を定義する

lambda 変数のリスト: 式

ex)

f = lambda x: x^3
f(2)
sageは 8 を出力する。


規則を代入する

定義した関数の一部を新たな関数で置き換えるなど

f6 = x^2 + 1;
f6

ここで、x^2 を y とすると、は以下の様に表現。

var('y')
f6.subs_expr(x^2 == y)


次は 図形 について、そして API についても早めにとりかかる。






数理処理システム sage の local sign in ができなくて困った

admin sage だった。 この情報がわかりづら!!

EXEファイルの仕組み

EXEファイルの構造

MZヘッダー、PEヘッダー、セクションヘッダー からなる。

  1. MZヘッダー:DOSヘッダー
  2. MZヘッダー:MS-DOS用スタブ
  3. PEヘッダー:シグネチャ
  4. PEヘッダー:ファイルヘッダー
  5. PEヘッダー:オプションヘッダー
  6. セクションデータ:セクションヘッダー1
  7. セクションデータ:セクションヘッダー2
  8. セクションデータ:…
  9. セクションデータ:セクション1
  10. セクションデータ:セクション2
  11. セクションデータ:…

DOSヘッダー

先頭はMZ。


MS-DOS用スタブ

This program cannot be run in DOS mode. を表示するプログラム


PEヘッダー

PEという2文字と2byte分の0からなるシグネチャが先頭。


セクションデータ

Windowsプログラム本体。いくつかのコード(命令)やデータのまとまり(セクション)に分けられている。
各セクションヘッダーの並びの後に、セクション本体が並ぶ。



EXEファイルの内容をダンプする


ダンプツール:dumpbin.exe → MZヘッダーを読み飛ばす。

以下のダンプ出力コードで、exeを作成すれば、すべて閲覧できる。



%02Xは16進数を表す%xに02: 最低2文字出力し、足りなければ 0 で埋める。と X: 大文字で表記を追加した書き方。
%08Xであれば、最低8文字で足りなければ0で、大文字表記。


上記をコンパイル&リンクすれば、良い。

cl dump.c
上記で作成した dump.exe でMZ(4D 5A)ヘッダも確認できる。 50 45 00 00 はPEヘッダー。


このダンププログラムは exe だけに使えるわけではなく、txt ファイルなどにももちろん使える。

たとえばある文字列が exe のヘッダに含まれていることを確認したければ、txt ファイルに文字列を
記述して dump した文字列が、exe のdump結果に含まれているか見ればよい。


PEヘッダーとセクションデータの内容

dumpbin /[オプション] EXEファイル名

FILE HEADER VALUES の number of sections の個数分、section ヘッダー があることを確認できる。

プログラム中に分散したコードやデータは、コードのセクションとデータのセクションにまとめれていることも確認できる。


セクションの内容を見る

dumpbin /rawdata EXEファイル名
RAW DATAのナンバーが、セクションナンバーの数だけある。


逆アセンブル

コマンド: dissm

dumpbin /disasm EXEファイル名

push や mov、call などから、callが関数、pushがそれに渡す引数のように使われていることがわかる。


簡単なプログラムを書いて、コンパイラがどのようにコードを整理するのか確認してみると
おもしろい

次は メモリーロード。






2013年7月2日火曜日

2013年6月30日日曜日

CPPを本格的に始める

データ型を重視した言語。

基本データ型



  1. int 整数型 4byte
  2. float 単精度浮動小数点型 4byte
  3. double 倍精度浮動小数点型 8byte
  4. char 文字型 1byte

コンパイルツール:cl


ex)
cl /c HelloWorld.c

/cはコンパイルのみ行うオプション。自動リンクを行わない。

リンカー:link 


書式:link オブジェクトファイル1 2 … N /OUT:EXEファイル名

プログラムの実行に必要なオブジェクトファイルが指定されていないと、以下のようにエラーとなる。

ex)
HelloWorld.obj : error LNK2019: 未解決の外部シンボル _printf が関数 _main で参照
されました。
LINK : error LNK2001: 外部シンボル "_mainCRTStartup" は未解決です。
HelloWorld.exe : fatal error LNK1120: 2 件の未解決の外部参照


objのシンボルテーブルを確認すると、何が足りないのか発見できる。


オブジェクトファイルの内容確認:dumpbin


ex)
dumpbin HelloWorld.obj /SYMBOLS

COFF SYMBOL TABLE
000 00CEEB9B ABS    notype       Static       | @comp.id
001 80000191 ABS    notype       Static       | @feat.00
002 00000000 SECT1  notype       Static       | .drectve
    Section length   2F, #relocs    0, #linenums    0, checksum
004 00000000 SECT2  notype       Static       | .debug$S
    Section length   68, #relocs    0, #linenums    0, checksum
006 00000000 SECT3  notype       Static       | .data
    Section length    D, #relocs    0, #linenums    0, checksum 9806FD4
008 00000000 SECT3  notype       Static       | $SG2940
009 00000000 SECT4  notype       Static       | .text
    Section length   14, #relocs    2, #linenums    0, checksum F829D91
00B 00000000 UNDEF  notype ()    External     | _printf
00C 00000000 SECT4  notype ()    External     | _main

上の_printfがUNDEFになっている。これが発見できなかったシンボル。


EXEファイルのスタートアップルーチン

スタートアップルーチン:_mainCRTStartup
EXEファイルの実行開始位置。main関数の呼び出し元。

以下で内容を確認できる。

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\crt0.c

この中で、_mainCRTStartupが__mainCRTStartupを呼び出し、_tmainを呼び出していることがわかる。引数は、mainの引数と同じ、引数の個数、コマンドライン引数の配列、環境変数の配列


規定のライブラリリンク

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\libcmt.lib
安全のために、上記libを任意のディレクトリにコピーしたあと、下記を実行すると、temp.txtにデフォルトオブジェクトの一覧を記述できる。

lib libcmt.lib /LIST:temp.txt
この中に、printf.objなどの普段何気なく使用するシンボルが並んでいる。

このようにlinkし、エラーとなったオブジェクトをlinkに加えと繰り返すことでリンクを完了させることができる。


次はEXEファイルの構成。


2013年6月21日金曜日

動画の輝度調整 ffmpeg

映像を明るくしたり暗くしたり、はっきりした色に調整する。

vf eq=brightness:contrast

brightness は輝度 -100 から 100 まで +1毎にRGBが2程度大きくなり明るくなる。
contrast はコントラスト比 -100 から 100 まで 配信用途では特に変更しない。

ffmpeg の出力例
ffmpeg -i in.mp4 vf mp=eq=3:0 out.mp4

2013年6月19日水曜日

OpenCV C++ のKeyPoint

特徴点情報を格納するeyPoint、以下の様な情報を保持します。

KeyPointメンバ 説明
pt 座標を表す構造体
size 検出時のBoxフィルタサイズ
angle 度単位で表される特徴方向
response 特徴の強さ
octave 検出されたオクターブ

2013年6月16日日曜日

phpからredisへアクセスする

ここでは、ローカルのredisにアクセスしてみます。

$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379);
$redis->set('hello','world');
$hello = $redis->get('hello');

これだけで、$helloにredisから取得したhelloのvalueを代入出来ます。
簡単で素晴らしい。

2013年6月15日土曜日

redisのインストールと基本

redisは永続化可能なインメモリKVSの一種。
インストールしてみましょう。

# redis用のユーザーとディレクトリを追加
groupadd redis
useradd redis -g redis -M -s /sbin/nologin

mkdir -p /var/redis/{data,tmp}
mkdir -p /var/run/redis
mkdir -p /var/log/redis

chown -R redis:redis /var/redis/ /var/run/redis /var/log/redis

# Redisをダウンロードしてインストール
wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz

tar zxvf redis-2.6.12.tar.gz
cd redis-2.6.12
make && make install

完了すると以下のコマンドが使えるようになります。

redis-check-aof   redis-cli
redis-benchmark   redis-check-dump  redis-server

redis-server
redisサーバ起動

サーバを起動するコマンドです。実行するとコンソールを呼び出せるようになります。

                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 2.6.12 (c6d4084b/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in stand alone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 3166
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'
強制終了は Ctrl + C :データ保存されないこ多いので、redis-cliから終了しましょう。

redis-cli
コンソール呼び出し

サーバのシャットダウンはコンソールから shutdown するとデータ永続化されるので、こちらを
使いましょう。


扱えるデータ型は主に以下。


  • string
  • list
  • set
  • sorted-set
  • hash
いくつか見ていきましょう。

単純な文字列型を挿入、取得。

redis 127.0.0.1:6379> set test value
OK
redis 127.0.0.1:6379> get test
"value"
複数登録するときは、
redis 127.0.0.1:6379> mset test value name masazblog
OK
redis 127.0.0.1:6379> mget test name
1) "value"
2) "masazblog"

型を取得。

redis 127.0.0.1:6379> type test
string

カウンターを使う。

redis 127.0.0.1:6379> incr counter
(integer) 1
redis 127.0.0.1:6379> incr counter
(integer) 2
redis 127.0.0.1:6379> get counter
"2"
この数値計算は、DBデータにもそのまま使えます。
redis 127.0.0.1:6379> set score 111
OK
redis 127.0.0.1:6379> get score
"111"
redis 127.0.0.1:6379> incr score
(integer) 112
redis 127.0.0.1:6379> incrby score 10
(integer) 122
redis 127.0.0.1:6379> decr score
(integer) 121
redis 127.0.0.1:6379> decrby score 20
(integer) 101

key一覧の表示(正規表現が使えます)

redis 127.0.0.1:6379> keys *
1) "test"
2) "name"
3) "score"
4) "sroce"
redis 127.0.0.1:6379> keys s*
1) "score"
2) "sroce"


存在確認

redis 127.0.0.1:6379> exists score
(integer) 1 ←ある
redis 127.0.0.1:6379> exists tttt
(integer) 0 ←ない

期限付きkey
redis 127.0.0.1:6379> set age 24
OK
redis 127.0.0.1:6379> expire age 8 ←keyの有効期間8秒
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379> exists age ←8秒すぎると無効
(integer) 0

List型 [key] [value]


追加:(l/r)push ←lは左から、rは右から
削除:(l/r)pop ←lは左から、rは右から

redis 127.0.0.1:6379> rpush mycolor pink ←末尾に追加していく
(integer) 1
redis 127.0.0.1:6379> rpush mycolor green
(integer) 2
redis 127.0.0.1:6379> rpush mycolor red
(integer) 3
redis 127.0.0.1:6379> rpush mycolor yellow
(integer) 4
redis 127.0.0.1:6379> rpush mycolor blue
(integer) 5
redis 127.0.0.1:6379> rpush mycolor purple
(integer) 6
redis 127.0.0.1:6379> lrange mycolor 0 5 ←要素の添字は0から。添字を指定して取得。
1) "pink"
2) "green"
3) "red"
4) "yellow"
5) "blue"
6) "purple"
redis 127.0.0.1:6379> lrange mycolor 0 -1 ←modの-1で指定することも可能。
1) "pink"
2) "green"
3) "red"
4) "yellow"
5) "blue"
6) "purple"
要素の削除
redis 127.0.0.1:6379> lrange mycolor 0 -1
1) "pink"
2) "green"
3) "red"
4) "yellow"
5) "blue"
redis 127.0.0.1:6379> lpop mycolor ←左端の要素削除
"pink"
redis 127.0.0.1:6379> lrange mycolor 0 -1
1) "green"
2) "red"
3) "yellow"
4) "blue"
redis 127.0.0.1:6379> lindex mycolor 2
"yellow"
redis 127.0.0.1:6379> ltrim mycolor 0 2
OK
redis 127.0.0.1:6379> lrange mycolor 0 -1
1) "green"
2) "red"
3) "yellow"


Set型

sadd:追加
srem:削除

一覧:smembers

和集合:sunion
積集合sinter
差集合:sdiff

redis 127.0.0.1:6379> sadd myset1 a
(integer) 1
redis 127.0.0.1:6379> sadd myset1 b
(integer) 1
redis 127.0.0.1:6379> sadd myset1 c
(integer) 1
redis 127.0.0.1:6379> smembers myset1
1) "c"
2) "b"
3) "a"
redis 127.0.0.1:6379> sadd myset1 d
(integer) 1
redis 127.0.0.1:6379> smembers myset1
1) "c"
2) "b"
3) "d"
4) "a"
redis 127.0.0.1:6379> srem myset1 d
(integer) 1
redis 127.0.0.1:6379> smembers myset1
1) "c"
2) "b"
3) "a"
redis 127.0.0.1:6379> sadd myset2 b
(integer) 1
redis 127.0.0.1:6379> sadd myset2 c
(integer) 1
redis 127.0.0.1:6379> sadd myset2 d
(integer) 1
redis 127.0.0.1:6379> sadd myset2 e
(integer) 1
redis 127.0.0.1:6379> smembers myset1
1) "c"
2) "b"
3) "a"
redis 127.0.0.1:6379> smembers myset2
1) "c"
2) "b"
3) "e"
4) "d"
redis 127.0.0.1:6379> sunion myset1 myset2
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"
redis 127.0.0.1:6379> sinter myset1 myset2
1) "c"
2) "b"
redis 127.0.0.1:6379> sdiff myset1 myset2
1) "a"
redis 127.0.0.1:6379> sunionstore myunion myset1 myset2
(integer) 5
redis 127.0.0.1:6379> smembers myunion
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"

すごい簡単で便利。
最後にDB選択と永続化、トランザクション的なものについて見て行きましょう。

データベース選択

0~15が用意されている。
redis 127.0.0.1:6379> select 0
redis 127.0.0.1:6379> select 1


データの保存

redis 127.0.0.1:6379> bgsave

データの保存先

redis起動ディレクトリの dump.rdb

データの保存を随時行いたい

AOF(同期書き込みサポート)を保存することになります。redis.confに以下の設定を行います。
appendonly yes
100倍くらい遅くなるので、安全を優先したい場合のみ使用しましょう。


トランザクション的なもの
複数の処理をまとめて行う。途中の終了した時のロールバックは無し。

multi
処理
処理

exec / discard

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr counter
QUEUED
redis 127.0.0.1:6379> incr visitor
QUEUED
redis 127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 1
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr counter
QUEUED
redis 127.0.0.1:6379> incr visitor
QUEUED
redis 127.0.0.1:6379> discard
OK
redis 127.0.0.1:6379> mget counter visitor
1) "1"
2) "1"




2013年6月12日水曜日

OpenCVのインストールディレクトリを変更する

OpenCVのインストールディレクトリをデフォルトから変更する方法。

今回は「/opt/lib/x86_64/opencv」に変更します。

2.4.3と2.4.5では以下のコマンドで行けます。

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/lib/x86_64/opencv -D BUILD_PYTHON_SUPPORT=ON -D WITH_TBB=ON -D WITH_GTK=ON .

2013年6月9日日曜日

sambaでシンボリックリンク先も辿りたいとき

/etc/samba/smb.confに以下を記述して再起動しましょう。

[global]

wide links = yes
unix extensions  = no


2013年6月7日金曜日

sshfsがXML例外で落ちるとき

以下の手順で復旧しました。

1. Download latest win-sshfs from http://code.google.com/p/win-sshfs/downloads/list.
2. Run the installer and De-install win-sshfs.
3. Delete folder C:\Program Files\win-sshfs if it still exists.
4. Make sure C:\Users\MyUser\AppData\Local\IsolatedStorage contains only one folder with 
   some random-crap name, then delete C:\Users\MyUser\AppData\Local\IsolatedStorage.
5. Restart, just because.
6. Run the installer again.  It shouldn't give you the option to Re/Un-install, 
   it should just install.
7. Restart, just because.
8. Reconfigure all the disks because the will all be GONE!

2013年6月2日日曜日

大量の画像サンプルの入手方法

Bing Search API on Azure を使用します。

Googleは取得出来る画像の枚数や制限が厳しいです。yahooはなぜかクレジッドカードの登録が必要なプランです。

https://datamarket.azure.com/dataset/bing/search

無料のプランを選択します。

もしくは、MITが提供している画像データを使ってみます。
これはデータセットをどんな風に用意するのかを勉強することも出来ます。

http://cbcl.mit.edu/software-datasets/

他には以下のようなデータセットもあります。

http://vasc.ri.cmu.edu/idb/html/car/index.html

http://www.vision.caltech.edu/html-files/archive.html

http://iris.usc.edu/Vision-Users/OldUsers/bowu/DatasetWebpage/dataset.html


ある物体の形状、例えば人や顔などを検出する場合は、データの準備が出来たら、大量に収集した画像のパターンを学習させます。
しかし、形状は同じだが内容が異なる、例えば本やCDのカバー、キャラクター(特徴的な形状)の場合は、様々な角度から見た画像を学習させる必要があります。

OpenCVには、ホモグラフィー変換を行う関数がついていて、自分でパターンを生成することも可能です。


もうひとつはOpenCVに付属しているopencv_createsamplesを使用する方法があります。

1つの画像からランダムにアフィン&ホモグラフィー変換した画像を、OpenCVで使用する独自の「.vec」ファイルで出力します。

引数は知っておく必要があります。

-img
学習の元画像を示します。

1枚の画像からではなく,集めたたくさんの学習画像から学習用正解ファイルを生成する場合,-imgの引数を-infoに変えて正解画像リストファイルを指定します。

-vec
出力ファイル名です。学習用画像データは全てこの1つのファイルにまとめられます。

-num
作成する学習サンプル画像の数です。positiveサンプルが少ないと分類が学習がうまくいかないことが多いです。少なくとも3000くらいは作成したほうが良いです。

-bgcolor
背景色を示します。ロゴなど、印刷されている媒体がはっきりしている場合には、背景色を指定します。そうでない場合は、以下のbgを指定します。

-bg
検出したいオブジェクトが,複雑な背景の中にある場合が予想されるとき指定します。negative画像で準備した画像リストファイルを指定するか、背景の風景が
似通っているならば、シュチュエーションにあった画像を指定します。

以下のwとhはサンプル画像の大きさです。検出出来る物体の最小サイズにもなります。
OpenCVでは顔の場合24x24、人の場合はもう少し大きくても良いと思います。
学習サンプル画像では,元の画像を回転させたものが生成されるため,遊びを持たせるために元画像よりも小さくする(例えば1/2のサイズ)を指定すると良いです。

-w
学習サンプル画像の横幅(ピクセル)を指定します。検出したい物体に合わせて調整が必要です。
-h
学習サンプル画像の縦幅(ピクセル)を指定します。

-show
このオプションを指定すると,実際にどのようなサンプル画像が生成されたかを見ることができます。
Waitkey状態で画像が1枚ずつ表示されます。押すことで,次のサンプル画像を見ることができます。画像の閲覧をやめる場合はESCキーを押すか,ウィンドウを閉じます。
事前にどのような画像が生成されるかを見ることで,その他のオプションのパラメータを最適化します。

次は、生成した画像を使ってBoostによる学習するコマンドです。


2013年5月30日木曜日

Tomcat Servletを簡単に使う

windowsでやったけど、Linuxでも同じだと思う。

■tomcatのcore版

http://tomcat.apache.org/download-70.cgi


適当なディレクトリに変更した後、

単体で動作するためには、
インストールディレクトリを環境変数CATALINA_HOMEとして登録。
binをPATHに追加。
JAVA_HOMEに使用するJDKを指定する。

その後、コマンドラインからstartup.batをたたくと、起動する。

以下のような標準出力があり、tomcat用のウィンドウが起動します。
ウィンドウにServer startup in ~msと出たらOKです。

Using CATALINA_BASE:   "C:\apache-tomcat\apache-tomcat-7.0.40"
Using CATALINA_HOME:   "C:\apache-tomcat\apache-tomcat-7.0.40"
Using CATALINA_TMPDIR: "C:\apache-tomcat\apache-tomcat-7.0.40\temp"
Using JRE_HOME:        "C:\Java\jdk1.7.0_07"
Using CLASSPATH:       "C:\apache-tomcat\apache-tomcat-7.0.40\bin\bootstrap.jar;
C:\apache-tomcat\apache-tomcat-7.0.40\bin\tomcat-juli.jar"

起動の確認は、localhost:8080にhttpアクセスします。


■Eclipseに統合
tomcat plugin
http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV33.zip

展開して、ディレクトリごとeclipseのpluginディレクトリ直下にコピー。

eclipseを起動(再起動)するとtomcatアイコンが追加されているはず。

起動したら設定のtomcatからパスを設定。

また、conf/tomcat-users.xmlに以下を追加して、guiでtomcatマネージャを
使用できる用に設定。

  <role rolename="manager-gui"/>
  <user username="admin" password="admin" roles="manager-gui"/>


■tomcatプロジェクト
tomcatプロジェクトを作成する。
tomcat用のディレクトリ構成は以下。

・WEB-INF/src・・ソースコードはここに置く。

・WEB-INF・・・・jar(ライブラリ)など外部からアクセスしないものを置く。

・work, bin, src・・とりあえずまだ使わない。

web.xmlはServletAPI3.0から必須では無いのでとりあえずは作らない。


WEB-INF/srcにパッケージを作成、Javaクラスも作成したら、まずはテスト。

ほとんどアノテーションで記述出来る。

@WebServlet(urlPatterns={"/AAA"})

これでwarパッケージ配下のurlを決定出来る。getもpostも簡単にサーバ側
APIの処理が実装出来る。楽しい。
目的はREST APIを簡単に実装することなので、次回はRESTを。


2013年5月26日日曜日

OpenCV2.4.5を使ったAndroidプロジェクトでClass not found

OpenCV2.4.5を使ったAndroidプロジェクトでClass not foundが出て悩まされた。

通常のJava Build Pathで無く、AndroidのLibraryにOpenCV Libraryを追加したところ実行出来た。

ただしIs Libraryをチェックしてはダメ。

http://stackoverflow.com/questions/6325826/unable-to-instantiate-activity-caused-by-classnotfoundexception

OpenCV2.4.5 for Android fpsと画角のデバッグ表示

xmlレイアウトファイルのカメラビューの要素に以下を指定する。

opencv:show_fps="true"

親レイアウトに以下を指定する必要がある。

xmlns:opencv="http://schemas.android.com/apk/res-auto"

Android LinearLayout RelativeLayout

LinearLayoutとRelativeLayoutをまとめた記事。
レイアウトはパフォーマンスにも影響するので、シンプルに構成する工夫をしたほうが良いです。


http://d.hatena.ne.jp/Korsakov/20110131/1296504108


・RelativeLayout 相対レイアウト

http://androidguide.nomaki.jp/html/layout/relative/relativeMain.html


・リニアレイアウト
View(ボタンやテキスト)を縦または横一列に並べて配置するために使用します。

http://androidguide.nomaki.jp/html/layout/linearlayout/linearlayoutMain.html

Androidアプリケーションのライフサイクル

Androidアプリケーションのライフサイクル

復習しておきましょう。

まずはactivityのスタート。

3つのメソッドが順番に呼ばれて起動します。


















































別のアクティビティを呼び出したら、以下のように遷移します。


















































別のアクティビティが表示される前に、元のアクティビティのonPause()が呼ばれます。
ここから元のアクティビティを表示する場合は、元のアクティビティのonResume()に戻り、
別のアクティビティを表示する場合は、onStop()に入ります。


他のアクティビティが表示されている状態から、再び画面に表示される場合には、
onRestart() → onStart() → onResume()で再び実行中になります。





























注意は、onStop()状態のアクティビティの状態保存は保証されず、メモリの状態によっては
強制終了されます。それを示したのが以下の図です。




















明示的にアクティビティを終了した場合の処理は、onDestroy()で終了します。














































状態の遷移によって発生する処理を記述するための各メソッドの総称がコールバックメソッド
です。
処理をしたい場合には、オーバーライドして記述しましょう。


OpenCVのアプリケーションを作る場合は、特有のライブラリの読み込みと初期化があるので、
注意が必要です。

2013年5月25日土曜日

OpenCV2.4.5 for Android サンプル clorbloddetect

clorbloddetectっていうサンプル。おもしろい。

リアルタイムにユーザがタッチした部分の色を取得して、近い色の部分を抽出してる。

このコード使って、リアルタイムに処理出来そうだな。

2013年5月24日金曜日

OpenCV2.4.5 for Android環境を作成する

Android環境の作成もとても簡単になっている。

Eclipseは、もともとAndroid開発環境が入っている「Android SDK付属のEclipse」を使用する。

・Android開発環境
http://developer.android.com/sdk/index.html


次は、OpenCV開発に必要な、OpenCVのモジュールとNDKを取得する。
for AndroidモジュールはJNIを使用してネイティブモジュールを呼び出している。
時間が許せば必要な部分のみJNIヘッダを作成するのが良い。

難しい場合、NDKを準備すれば、AndroidでOpenCVを使用することが出来る。


少し古い資料だが、以下のスライドが参考になる。
http://www.slideshare.net/ToruUenoyama/opencvandroid


さて、必要なモジュールは以下。

・OpenCV 2.4.5
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/O4A_SDK.html

・Android NDK
http://developer.android.com/tools/sdk/ndk/index.html


取得したら、任意のディレクトリに解凍しておく。
ただしスペースが入らないディレクトリを選択するかつくるのが安心。

解凍は以下に行うという前提で進める。

D:\android\OpenCV-2.4.5-android-sdk
C:\android-ndk-r8e

・OpencCVのインポート
 OpencCV-2.4.5-android-sdkディレクトリを、一般プロジェクトとしてインポートする。

まだビルドはうまくいきません。


・jdkを設定する。

 Window → プロパティ → Java → Installed JREs から、jdkを設定。

・プロジェクトのプロパティ → Android からターゲットを2.2に決定。
 OpenCVはAndroid2.2(target 8)から使える用になっているので、SDKマネージャからインストールしておく。

・Nativeサポートを追加する。
 Window → プロパティ →C/C++ → Build → Environmentに以下を設定。
Variable: NDKROOT
Value: C:\android-ndk-r8e
プロジェクト → Android Tools → Android Native Support
 プロジェクト → プロパティ → C/ C++ build → ビルドコマンドに以下を設定
${NDKROOT}/ndk-build.cmd

プロジェクトをビルドする。

ビルドエラーが消えたら完了です。

サンプルを見て行きましょう。


2013年5月13日月曜日

OpenCVで画像を連結する

画像の連結が必要だったので、OpenCVで実装してみました。
仕組みとしては、連結先画像のMat行列に、連結部品の画像のデータをコピーしていくようなものです。

モザイク画のような綺麗に整列したデータや、
結合する先の座標の指定が可能なのでパラメータをランダムに動かせば、予想外の画をつくることも出来そうです。



2013年5月11日土曜日

JNI JavaからCppを実行する


JNI Javaからcppを呼び出してみる。

■まずはJavaでコード書きます
https://gist.github.com/masazdream/5560075


■対応するCppファイルを書きます
https://gist.github.com/masazdream/5560082


※Javaのコードとの名称対応は大切です。


■JavaとCppのコードから必要なヘッダファイルとSharedObjectを作成します
そのために今回はantを使用しますので、antからgccコンパイルする環境を作成します。

・ant-contribのバイナリをantのlibに配置
http://sourceforge.net/projects/ant-contrib/files/

・ant-xercesのバイナリを取得して、antoのlibに配置

http://xerces.apache.org/mirrors.cgi

・ant-cpptasksを作成する。
http://sourceforge.net/projects/ant-contrib/files/ant-contrib/cpptasks-1.0-beta5/


デフォルトでついてくるbuild.xmlに以下の対策を施して、実行するとjarが作成出来ます。
■対策
①javacタグにincludeAntRuntime="true"を設定します。
②ソースをコンパイルするJavaのバージョンに注意しないと警告が
うるさいので処理します。
A. java.sourceとjavac.targetには、コンパイルするJavaのバージョンを
設定しましょう。
B. jt.jarのパスを表すpathを作成して、javacのbootclasspathに指定します。
<path id="compile.boot.path">
  <fileset dir="${java.home}/lib">
    <include name="rt.jar" />
  </fileset>
</path>
<javac ・・・
  <bootclasspath refid="compile.boot.path" />
</javac>

■必要なパスを通す
③xercesのライブラリをクラスパスに追加する
<path id="compile.path">
  <fileset dir="[最初のステップでjarを置いたディレクトリ]">
    <include name="*.jar" />
  </fileset>
</path>
<javac ・・・
  <classpath refid="compile.path" />
</javac>

これでコンパイル出来ます。
target/lib/cpptasks.jarがあるので、ant本体のlibディレクトリに
コピーします。

> echo $ANT_HOME

でhomeを確認が出来たら、配下のlibにコピーします。

■antの記述を整えます。
javahでヘッダーファイル作成を記述します。
ccタスクでcppファイルをコンパイルします。

<taskdef resource="cpptasks.tasks">でccタスクを使用する準備が出来ますので、
以下のようにccタスクを記述します。

<cc link="shared" outfile="[soを出力するディレクトリ名]/[クラス名]" obj="[ヘッダーファイルを出力したディレクトリ]">
  <includepath location="${env.JAVA_HOME}/include}" />
  <includepath location="${env.JAVA_HOME}/include/linux" />
  <fileset dir="[ヘッダーファイルを出力したディレクトリ]" includes="HelloWorldJNI.cpp" />
  <libset libs="stdc++">  ←cppの場合は指定。CとCPPが混じっている場合には、cppファイルのみにantで実行出来ます。
</cc>

※outfileに指定したパスのファイル名をつかって、libhello.soなどの名前が決定されます。

最終的に以下の様なファイルになる。https://gist.github.com/masazdream/5560085


■Javaの実行
soファイルの入ったディレクトリを環境変数「LD_LIBRARY_PATH」に指定してから実行します。

実行結果は、Hello World。
せっかくなのでcやcppで記述したファイルをドンドンJavaで実行していましょう。


2013年5月3日金曜日

Java コマンド実行 execとProcessBuilder

Javaから外部コマンドを実行する際にはexecでは無くProcessBuilderを使いましょう。

Javaの内部実装もProcessBuilderですし、何より標準出力と標準エラー出力のバッファが小さいことによるデッドロックが起こりません。
後、標準出力と標準エラー出力を簡単にマージできちゃいます。


ffmpegを使っているときに、標準出力サイズがとても大きくなることと、標準エラー出力と交互に出るので、execだとデッドロックが発生したり、Threadで対処したりいろいろ面倒くさかったのでメモ。

2013年4月30日火曜日

JavaFXでGUIつくる

GUIがつくりたい。
C#も良さそうだけど、Javaでやりたい!!

ということで、javaFXを使ってみる。

ずっとEclipse派でしたが、JavaでGUIのツールを
作ろうとするとNetBeansが有利みたいなのでNetBeansにて。

目標はコマンドラインから使ってるプログラムのGUIをつけて
誰でも使いやすくすること。

・NetBeansのダウンロード
http://ja.netbeans.org/


・NetBeansを利用して、JavaFXプロジェクトを作成する。
https://netbeans.org/kb/docs/java/javafx-setup_ja.html


・チュートリアルを読む。
http://docs.oracle.com/javafx/

JavaFXを使う上で重要なこと。

1.The main class for a JavaFX application extends the javafx.application.Application class.
The start() method is the main entry point for all JavaFX applications.

JavaFXのmainクラスはjavafx.application.Applicationクラスを継承し、start()メソッドは全てのJavaFXアプリケーションのエントリーポイントになる。

represent
2.A JavaFX application defines the user interface container by means of a stage and a scene. The JavaFX Stage class is the top-level JavaFX container. The JavaFX Scene class is the container for all content. Example 1-1 creates the stage and scene and makes the scene visible in a given pixel size.

JavaFXアプリケーションはstageとsceneによって、ユーザインターフェイスを定義します。
stageクラスはJavaFXのトップレベルコンテナです。seeneクラスは全てのコンテンツのコンテナです。
例1-1(Hello World!)では、stageとsceneを作成し、していたピクセルサイズのシーンを表示します。

In JavaFX, the content of the scene is represented as a hierarchical scene graph of nodes. In this example, the root node is a StackPane object, which is a resizable layout node. This means that the root node's size tracks the scene's size and changesrepresent when the stage is resized by a user.

JavaFXでは、シーンのコンテンツ(内容)はnodeの階層的なsceneグラフとして表されます。
例では、ルートノードはサイズ変更可能なノードであるStackPaneオブジェクトです。この意味は、ルートノードサイズは、ユーザがサイズ変更したステージ上のシーンのサイズ変更に追随するということです。

The root node contains one child node, a button control with text, plus an event handler to print a message when the button is pressed.

ルートノードは、一つの子ノードが含んでいます。それはプラスボタンを押すと、メッセージを表示するイベントハンドラを含む、テキストのボタンコントロールです。

The main() method is not required for JavaFX applications when the JAR file for the application is created with the JavaFX Packager tool, which embeds the JavaFX Launcher in the JAR file. However, it is useful to include the main() method so you can run JAR files that were created without the JavaFX Launcher, such as when using an IDE in which the JavaFX tools are not fully integrated. Also, Swing applications that embed JavaFX code require the main() method.

mainメソッドは、JavaFXのランチャーを埋め込むJavaFXパッケージツールを使用して作成されたとき、JavaFXアプリケーションに
必要ありません。ただし、完全にJavaFXツールが統合されていないIDEを使用する場合などの
JavaFXランチャーなしで作成されたJarファイルを実行出来るように、もしくはJavaFXをSwingアプリケーションに
埋め込みたい場合には、mainメソッドが有用です。

ここまででEclipseを使っていれば、NetBeansの学習コストはほとんど0でしてぐんぐん進めます。

次に、以下の記事が参考になります。

http://itpro.nikkeibp.co.jp/article/COLUMN/20120731/413043/?ST=develop&P=7

FXMLの一番簡単な導入が出来ます。
次に、FXMLをGUIで簡単に設定したくなるので、JavaFX Scene Builderを導入する。

http://www.oracle.com/technetwork/java/javafx/tools/index.html

このScene Builderの担当部分はViewで、モデルとコントローラは自作します。
ただし、Viewとコントローラの関連付けはアノテーションで書くだけです。

後は、TaskとThreadの使い方がわかれば、基本的なアプリケーションが割りと簡単に出来ます。


流れとしては以下のような感じです。


①NetBeansからJavaFX Scene Builderを起動して、おおまかにUI部品を配置。

②FXMLを編集してfx:idとアクションに対するメソッドを記述。

③fx:idに対する変数とメソッドを@FXMLアノテーションを使って記述。

④非同期処理はTaskとThreadで記述。


コードが整理出来たらGithubしよっと。

2013年4月22日月曜日

数式処理システム

おもしろく素晴らしい処理システム。
実用にいたるには、利用出来るところまでデータを取得、整理する必要がある。
認識技術を駆使して到達出来ないか。


・SAGE

http://www.sagemath.org/


・MATHMATICAのWEB版

http://www.wolframalpha.com/



2013年4月15日月曜日

viで置換する


文字列置換


:s/[old]/[new]

  1. [old]を[new]に置換する現在行の最初の old を new に置換する :s/old/new
  2.  現在行の全ての old を new に置換する :s/old/new/g
  3.  2つの # 間で語句を置換する :#,#s/old/new/g
  4.  ファイルの中の全ての検索語句を置換する: :%s/old/new/g
  5.  'c' を加えると置換の度に確認を求める :%s/old/new/gc 



2013年3月28日木曜日

sudoユーザのてっとりばやい作り方

最近メモばかりで…、ちゃんとしたロジックを上げていないけど、使うとき必ず検索するのでメモ。

wheelグループに追加するのが早い。


 usermod -G wheel user_name

 visudo

    %wheel ALL~の行がコメントアウトされているので有効にする

2013年3月25日月曜日

tomcatのログなどメモ


30日前まで保存

vi /etc/crontab
#!/bin/bash
LOGDIR='/home/tomcat/Logs'
find ${LOGDIR} -mtime +31 -type f -exec rm -rf {} \;


 tomcatのログのlogrotateで管理

/etc/logrotate.d配下に以下のファイルを名前「tomcat」で配置


# Logrotate file for Tomcat

/opt/apache-tomcat-7/logs/catalina.out {
missingok
copytruncate
daily
rotate 30
sharedscripts
postrotate
/bin/rm -f /opt/apache-tomcat-7/logs/`date --d '31 days ago' '+*%Y-%m-%d.log'`
endscript
}


2013年3月23日土曜日

第25回データマイニング勉強会+WEB東京に参加してきた。

はじめに。

http://www.slideshare.net/hamadakoichi/tokyo-webmining-openingtalk


自己紹介。全員 ^o^;
ところどころメモ。


○コンバージョン
http://www.okuramkt.com/dic/effect/conversion.html


○Hadoop from PFI
http://www.slideshare.net/pfi/hadoop-2525724/36


○WEBHIVE from リクルート
https://github.com/recruitcojp/WebHive


○Cloudera Impala:HIVEをより早くしたもの(x10~30、x2~3、最速はx97)
→cloudera manager
→Impala:METAデータを自動で更新しない
http://www.slideshare.net/shiumachi/tokyo-webmining-20130323slideshare?ref=https://twitter.com/search?q=%23TokyoWebmining&src=hash


○データ分析する上で、SQLとか基本的な部分は押させておかないといかん。


○レコメンデーション運用
サービスをもっとよくする取り組み。
Amazonみたいなやつ。
PCとスマホ。
たくさん使ってくれる人にパーソナライズする。

予習・復習が出せたら面白いだろうな。

○ネット調査モニター
マーケティングリサーチ会社intage
動機付け。
理解出来なかった場合、わからなかった場合どうする?
ずっと同じデータだったらいい加減なんじゃないかと推測出来る。

楽しさ、達成感
→感情的なアプローチ

構造方程式モデリング SEM
:複数の要因感の関係を分析する統計手法。

測定値の背後に構成概念をつける。その集合として潜在変数を数値化。

例えば「学力」も潜在変数。各強化の得点や環境でなんとなく割り出されるもの。
SEMモデルと分析データを比較し、推論が合っているかどうか確認する手法。


多母集団同時解析
:2つの集団が異なる母集団と認めた上で、集団間に回答傾向の差が生じているのか検討する

→グラフィカルモデリング


○Hadoopと~
fusionIO

ムーアの法則
TOCの理論
ROI


知らないことたくさん聞けて楽しかった。
次回は解析手法と最適解探索アルゴリズムにつながる機械学習の話とかも聞けたら嬉しい。

2013年3月16日土曜日

eclipse EGitでbareリポジトリのcloneを作成する

EGitパースペクティブにリポジトリを設定する方法はここがわかりやすい。

EGitでは、リポジトリを登録する際、ソースを設置するディレクトリを指定出来る。

例えば以下の様な場所にソースが出来る。

/root/git/example

Javaプロジェクトのソースに、上記のパスを設定する必要がある。

gitリポジトリにcommitしてpush、pullする

ソースをcommitしてリポジトリAに反映しても、リポジトリAから作成したbareリポジトリB(開発者はそこからソースを取得する)には反映されないので、各開発者がpullしても、bareリポジトリにpushすることが必要。

コマンド、もしくはEclipseなどのツールで行う。

コマンドの場合は、リポジトリAからbareリポジトリBに対して以下のコマンドを実行する。

# git push ssh://example.com/opt/git/example.git

Eclipseの場合、commitと同自にpushが出来るので利用すると楽。
これでpullの準備が出来ました!

次回はバージョンとかタグの管理を行えることを目指す。

2013年3月12日火曜日

2013年3月6日水曜日

gitサーバからsshでcloneを作成出来る環境を作成する

サーバ側では、ベアリポジトリと呼ばれる特別なリポジトリを作成する。

# git clone --bare [元のリポジトリ] [bareリポジトリ名]

bareリポジトリが出来たら、ssh経由でサーバに設置する。

# scp -r [bareリポジトリ名] [user]@[ホスト or IPアドレス]:/[bareリポジトリを設定したディレクトリパス]

これで、以下のコマンドで、設置したサーバにsshアクセス出来るユーザならばcloneを作成出来るようになる。

 # git clone [user]@[ホスト or IPアドレス]:/[bareリポジトリパス]



大体git-scm.com見れば良い。


後日:
これって以下の作業を簡易的に行う方法だったぽい。

http://blog.s21g.com/articles/1312

eclipseでgitを使う

以下がわかりやすかった。

Git事始め 基本コマンドの整理


インストール

# yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel
...
Complete!
# git clone git://git.kernel.org/pub/scm/git/git.git (最新版取得)
Initialized empty Git repository in /home/git/.git/
remote: Counting objects: 149959, done.
remote: Compressing objects: 100% (38734/38734), done.
remote: Total 149959 (delta 109920), reused 149194 (delta 109288)
Receiving objects: 100% (149959/149959), 34.94 MiB | 1.86 MiB/s, done.
Resolving deltas: 100% (109920/109920), done.
# yum install git-core

ユーザの登録

#(or $) git config --global user.name "[現在のログインユーザ名]"
#(or $) git config --global user.email "[メールアドレス]"

設定の確認

#(or $) git config --list

gitのヘルプ

#(or $) git help <verb>


管理したいディレクトリでGitを使用するコマンド

必要なファイルを追跡対象にする

#(or $) git init
#(or $) git add *.java
#(or $) git add *.properties

.gitが設置してあるディレクトリでステータスを確認したい場合

#(or $) git status

何も変更が無ければ以下のように出力される。
# On branch master
nothing to commit (working directory clean)

例えばREADMEファイルを一つ追加すると
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   README
nothing added to commit but untracked files present (use "git add" to track)

のように、Untracked filesがあることを知らせてくれる。
前回のスナップショットにこのファイルが無い場合、明示的に指示しない限りgitはこのファイルをバージョン管理・追跡に含めません。


新しいファイルの追跡


#(or $) git add README

これでREADMEファイルを追跡対象に含みました。
(ディレクトリを指定すると、配下のファイルすべてを追跡)
以下のようにstatusにnew fileが記載されます。

#(or $) git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# new file:   README
#

Changes to be committedによって、ステージされていると判断できます。
RAEDMEファイルを変更してgit statusを実行すると以下ようになります。

#(or $) git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# new file:   README
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified:   README
#

注意すべきは、ファイルを変更したら必ずgit addして、ファイルをステージすること。
ステージしたものがコミットできるものと認識しておくことが必要です。

無視したいファイル


ログファイルやビルドシステムが自動生成するファイルは、.gitignoreファイルに記載しておく。
ワイルドカードが使用できる。

例えば以下のように、.oまたは.aで終わるファイルとアーカイブファイルを無視します。

#(or $) cat .gitignore
*.[oa]
*~

logやtmp、pidといったファイルをここに入れてきます。
.gitignoreのファイル記述パターン

.gitignore ファイルに記述するパターンの規則は、次のようになります。

空行あるいは # で始まる行は無視される
標準の glob パターン(正規表現)を使用可能
ディレクトリを指定するには、パターンの最後にスラッシュ (/) をつける
パターンを逆転させるには、最初に感嘆符 (!) をつける

他の例

# コメント。これは無視されます
*.a       # .a ファイルは無視
!lib.a    # しかし、lib.a ファイルだけは .a であっても追跡対象とします
/TODO     # ルートディレクトリの TODO ファイルだけを無視し、サブディレクトリの TODO は無視しません
build/    # build/ ディレクトリのすべてのファイルを無視します
doc/*.txt # doc/notes.txt は無視しますが、doc/server/arch.txt は無視しません


変更内容の確認



引数無git diffは、変更したけれどステージしていない内容を見れます。

次にコミットするステージされた内容も知りたいときは、以下を使用します。

#(or $)git diff --cached

これで、ステージされたすべての変更を見ることができます。
すべてステージするとgit diffは何も表示しなくなるので、git commitを
行うと、すべてコミットができる。

git addをしたく無いとき、する必要が無いときには、git commit -a
とすることで、変更状態から自動的にステージしてコミットすることができます。

gitのリポジトリからファイルを削除したい

以下を使用します。

#(or $) git rm [対象ファイル]

gitの追跡からのみファイルを削除するには(HDD上には残します)

以下を使用します。

#(or $) git rm --cached [対象ファイル]


ファイル名の変更(mvコマンドを使用する)

#(or $) git mv [file_from] [file_tc]

コミット履歴の閲覧

以下のコマンドが便利です。

#(or $) git log --pretty=format:"%h - %an, %ar : %s"
#(or $) git log -p [-N]
pはコミットのdiffを表示するオプション
Nは直近いくつのエントリーを表示するかを指定します。

#(or $) git log -stat
各コミットのちょっとした統計データを確認する

オプションはたくさんあります。

オプション 説明
-p  各コミットのパッチを表示する
--stat  各コミットで変更されたファイルの統計情報を表示する
--shortstat --stat コマンドのうち、変更/追加/削除 の行だけを表示する
--name-only コミット情報の後に変更されたファイルの一覧を表示する
--name-status   変更されたファイルと 追加/修正/削除 情報を表示する
--abbrev-commit SHA-1 チェックサムの全体 (40文字) ではなく最初の数文字のみを表示する
--relative-date 完全な日付フォーマットではなく、相対フォーマット (“2 weeks ago” など) で日付を表示する
--graph ブランチやマージの歴史を、ログ出力とともにアスキーグラフで表示する
--pretty    コミットを別のフォーマットで表示する。オプションとして oneline, short, full, fuller そして format (独自フォーマットを設定する) を指定可能

履歴を見るとても便利な機能 gitk

以下でインストールするとgitkコマンドで使用可能。

#(or $) yum install gitk



作業のやり直し

直近のコミットをもう一度やり直す。
これは、ステージングエリアの内容をコミットに使用します。

#(or $) git commit --amend


ステージしたファイルの取り消し

git statusコマンドでreset用のコマンドを確認することもできます。

ex)
#(or $) git reset HEAD [ファイル名]


ファイルへの変更の取り消し

git statusコマンドでcheckout用のコマンドを確認することもできます。
ファイルの変更をすべて取り消す危険なコマンド

ex)
#(or $) git checkout -- [ファイル名]


リモートリポジトリについて

確認

名前に対応するURLも一緒に表示
#(or $) git remote -v

リモートリポジトリの追加

#(or $) git remote add pd [gitURL]


他のリポジトリから情報を取得する

#(or $) git fetch [リモートリポジトリ名]


リモートへのプッシュ

プロジェクトがみんなと共有できる状態に達したら、上流にプッシュします。

#(or $) git push [remote-name] [branch-name]


2013年2月15日金曜日

VirtualBoxで可変ディスクの容量を変更する


vdiファイルのあるディレクトリに移動する。

> "C:\Program Files\Oracle\VirtualBox\VBoxManage" modifyhd CentOS63_gui.vdi --resize 15360

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

で完了。
resizeの単位はMB単位。上記は15GBを指定。

2013年2月14日木曜日

使いやすいファイルを扱うツールまとめ

たくさんのファイルを扱うときに使いやすいツールまとめ

ファイル名の変換をテキストベースで行えるツール。
ファイル名の変換をディレクトリを回帰して行えるツール。一覧を作るときにも便利。
画像ファイルの変換ツール。できることが多いのに使いやすい。
文字コード変換。直感的で使いやすい。

 ファイルのサイズとか画像の解像度については、数万ファイルくらいで落ちたりめぼしいものが無かったので、自作したほうが良さそう。

EC2へ新規EBSをマウントする

毎回コマンドを忘れるためメモ。

EC2のマネージメントコンソールからEBSを目的のインスタンスにアタッチしたら、
EC2にログインする。

ボリュームの確認

# fdisk -l | grep /dev


サイズとか名前でどれをアタッチしたかはわかると思うので、ファイルシステムを作成

# mkfs -t [ファイルシステム CentOS6.3ならext4] /dev/[ボリュームのファイル]


mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536000 inodes, 262144000 blocks
13107200 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
8000 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848

Writing inode tables:    0/8000   1/8000   2/8000   3/8000   4/8000




Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done



後はマウント

# mount -t [ファイルシステム CentOS6.3ならext4] /dev/[ボリュームのファイル] [マウント先]


/とかルートボリュームの直下には付けれなかった。

2013年1月31日木曜日

Amazon Elastic Transcoder

AWS、またもや急に発表。

Amazon Elastic Transcoder

音声や動画の変換サービス。
様々な端末で再生することのある場合に必ず必要になる。

http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/introduction.html


痒いところに手が届く。

2013年1月23日水曜日

とうとうサービス開始。AWSの240GBメモリインスタンス

去年ニュースにあった、240GBメモリインスタンス。 

http://www.infoq.com/jp/news/2012/12/aws-big-data

 とうとう利用できるようになったようですね。

 まだ使えるのはUS East (N. Virginia) regionの3つのzoneだけのようですが、 日本でも使えるようになるんでしょうね~。

2013年1月19日土曜日

アフィン変換行列を求めるのに必要な連立方程式をphpで解く

結構めんどくさいんですが、一度書いてやれば使いまわせます。

$pointには0~2までx1→x2、y1→y2という座標点の対応を入れる前提です。


2013年1月17日木曜日

Virtual BoxにCentOS6.3を入れる

VirtualBoxにCentOS6.3を入れて良く使うので必要なリンクをメモ。

1. OSイメージ系

以下のURLは6.3の場合。

OSのネットインストールイメージ
http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.3/isos/x86_64/CentOS-6.3-x86_64-netinstall.iso


HTTPインストールURL
http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.3/os/x86_64/


2. Guest Additions

入れないと実用に耐えられないほど不便。

Guest Additionsインストール用イメージ
http://dlc.sun.com.edgesuite.net/virtualbox/4.2.2/

インストールする前にyumでkernel-develをインストールしておきましょう!

インストールしたら、/usr/src/kernels配下のkernelディレクトリを環境変数KERN_DIRに設定します。


#yum install gcc
#yum install make
#yum install kernel-devel-2.6.32-279.el6.x86_64

# export KERN_DIR=/usr/src/kernels/[kernelディレクトリ]

カーネルのバージョンが違う場合、guest additionsインストール時にエラーになる。
エラーメッセージの中に書かれているカーネルバージョンでもう一度インストールすればOK。

3. 共有フォルダ

ゲストOSのサイズを抑えて作成するには共有フォルダを使います。

自動マウントを設定した共有フォルダは

/media/sf_[設定した共有フォルダ名]

でマウントされます。

2013年1月14日月曜日

SVNでローカルロックが起こった時の対応

SVN UPしたら、ローカルのファイルが何らかのソフトのせいで書き込み禁止になっている場合に、ロックが発生する。
 そのままクリーンコマンドを打ってもエラーになると思うのでその時の対処法。

1.Copy edited items to another location.
2.Delete the folder containing the problem path.
3.Update the containing folder through Subversion.
4.Copy your files back.
5.Commit

 例)たとえばファイルをエディタで開いていたことによるロック。 

エラーになったファイルを別のところへコピーして退避。
そのあと、エラーになっているファイルを削除。
クリーンを念のため行う。
 これでOK。

2013年1月12日土曜日

apacheでデータの送受信量を確認する

データ転送量を見積もるときに使ったのでメモ。

apacheのモジュールとして、以下の2つが必要。

・mod_log_config

・mod_logio

たぶんデフォルトで有効なはず。

次に、httpd.confのLOGFORMATに以下の書式で追加。

%I:リクエストとヘッダを含む、受け取ったバイト数。 0 にはならない。
%O:ヘッダを含む、送信したバイト数。0 にはならない。


最後にhttpdを再起動で完了。


詳しい説明はこちら。

http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html

例)

LogFormat "%h %l %u %t \"%r\" %>s %b %O %I \"%{Referer}i\" \"%{User-Agent}i\" %D" combined



AWS プライベートIPを負荷分散できるELB

AWSにはプライベートIPを負荷分散できるELBがある。

http://aws.typepad.com/aws_japan/2012/06/internal-elastic-load-balancers-in-the-virtual-private-cloud.html

つまり、プライベートアドレスのみを割り振ったのEC2インスタンスの負荷分散を行うことが出来る。

設定も簡単で、ELB作成時に

「Create an internal load balancer」のチェックボックスにチェックを入れるだけ

とのこと。


GMOクラウドには同様のバランサが見つからない…。


S3とCloudFrontについて役に立つスレッド

S3とCloudFrontについていい質問をしてくれている人のスレッド


https://forums.aws.amazon.com/message.jspa?messageID=325095


後、課金される場合分けがわかりやすいのが以下。

http://d.hatena.ne.jp/tune34/20090210/1234209209

レートが今と異なるので、そこは計算する必要があるけど場合分けの参考に出来る。


putty ダウンロードページ

puttyのダウンロードページ

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

ec2のチュートリアルで使ってる。

※でもteratermでpemが使えるのでそっちが速いです。


AWS入門記事一覧

AWSを使い始めるにあたって便利な入門書一覧。

まずはEC2インスタンスを使い始めるには以下のEC2入門。

http://aws.amazon.com/jp/documentation/ec2/


日通り終わったら、以下のリンクから次のステップを目的に合わせて選択する。

http://docs.amazonwebservices.com/ja_jp/AWSEC2/latest/GettingStartedGuide/WhereGoFromHere.html


VPCについて。


http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/GettingStartedGuide/GetStarted.html


ロードバランサ(ELB)について。

http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/Welcome.html


CroudFrontについて。

http://codenote.net/amazon/cloudfront/1453.html


s3が以下。

http://aws.amazon.com/jp/documentation/s3/


これで大体基本的なところは抑えられそう。
日本語ドキュメントのリンクがあったりなかったりなのでちょっと面倒。



OpenCVで画像をぼかす。その他フィルタリングする。

以下は、LinuxのOpenCV環境ですぐに試せそう。やってみよう。

http://opencv.jp/sample/filter_and_color_conversion.html

・ぼかす(平滑化)
・境界線
・閾値処理
・2値化


CentOS6.3にOpenCV2.4.3をソースから入れてEclipseで動かす

○ライブラリのインストール

yum install cmake
yum install gcc
yum insatll gcc-c++
yum install gtk2-devel
yum install libjpeg-devel
yum install libtiff-devel
yum install jasper-devel
yum install libpng-devel
yum install zlib-devel
yum install pcre-devel

# v4L2(カメラデバイスを使う場合にいれましょう)
yum install v4l2*
yum install totem
yum install xine
yum install unicap-devel
yum install autoconf

# swig
cd /[ソフトダウンロード用の好きなディレクトリに]
wget http://sourceforge.net/projects/swig/files/swig/swig-2.0.9/swig-2.0.9.tar.gz
tar -xvzof swig-2.0.9.tar.gz
cd swig-2.0.9
./configure
make
make install


※説明
・gtk2 http://ja.wikipedia.org/wiki/GTK+ gui ライブラリ
・swig http://ja.wikipedia.org/wiki/SWIG C/C++で書かれたライブラリをスクリプト言語やJavaなどの言語に接続するためのツール

○OpenCVのインストール
sourceforgeからopenCVを取得して、展開する。
(今回は2.4.3のtar.bz2ファイル)

cd /[ソフトダウンロード用の好きなディレクトリに]
cd OpenCV-2.4.3
cmake -DBUILD_DOCS=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=RELEASE -DWITH_TBB=ON -DINSTALL_C_EXAMPLES=ON -DWITH_CUDA=OFF -DWITH_OPENNI=ON -DWITH_UNICAP=ON -DWITH_V4L=ON -DWITH_XINE=ON .
make
make install
ldconfig

これで、/usr/local/include/opencv及び/usr/local/include/opencv2にインストールされ、ライブライが/usr/local/libに入った状態。


○Eclipseの設定
C++の開発環境(CDT)が入っているのが前提。
プロジェクトのプロパティの設定を行ってコンパイル&実行可能にする。

「C/C++ Build」-「Setting」に移動。

「GCC C++ Compiler」-「includes」に以下を追加。
・/usr/local/include/opencv
・/usr/local/include/opencv2

「GCC C++ Linker」-「Libraries」に以下を追加。
Librariesに
・opencv_core
・opencv_highgui
・opencv_imgproc
・…用途によって減らしたら増やしたりしましょう。



Library search pathに
・/usr/local/lib

これでコンパイルは可能。
後は実行時のパスを追加。

デバッグセッティングのEnvironmentに以下を追加

LD_LIBRARY_PATH = /usr/local/lib


以上でEclipse上でOpenCVを実行可能です。



OpenCV2.4.3 ラプラシアンフィルタをかける

OpenCV2.4.3でラプラシアンフィルタをかけるサンプル

Linuxコマンド 権限情報などそのままコピー

権限情報とかそのままコピーしたいことが結構あるんですが、毎回調べてるのでメモ。
以下でOK。

cp -pR [バックアップファイル or ディレクトリ] [バックアップ先]


ちなみにシンボリックリンクもそのままコピーされます。


【PHP】複数座標点の外接矩形から中心点を求める

与えられた複数座標に外接する矩形の中心点を求める。
選択した点の大体の中心を求める時に使う。

  public static function getCenterCoordinate($coordinates){
    // 初期化
    $max_x_value = $coordinates[0]['x'];
    $min_x_value = $coordinates[0]['x'];
    $max_y_value = $coordinates[0]['y'];
    $min_y_value = $coordinates[0]['y'];

    // 座標点を含む矩形の中点を作成して返す
    foreach($coordinates as $coordinate){
      if($coordinate['x'] < $min_x_value){
        $min_x_value = $coordinate['x'];
      }
      if($coordinate['y'] < $min_y_value){
        $min_y_value = $coordinate['y'];
      }
      if($coordinate['x'] > $max_x_value){
        $max_x_value = $coordinate['x'];
      }
      if($coordinate['y'] > $max_y_value){
        $max_y_value = $coordinate['y'];
      }
    }
    $center_value = array();
    $center_value['x'] = ($max_x_value + $min_x_value) / 2;
    $center_value['y'] = ($max_y_value + $min_y_value) / 2;

    return $center_value;
  }

もっとちゃんと中心をもとめたい場合は回転を考慮する。