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
2013年11月17日日曜日
Google Dart 事始め
Google Dartの正式版がリリースされたので使ってみる。
https://www.dartlang.org/
http://api.dartlang.org/docs/channels/stable/latest/
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
※カスケード演算子
http://www.cresc.co.jp/tech/java/Google_Dart/DartLanguageSpecification_about.html
[プロジェクト名].html
その他に、packages/browserディレクトリが出来て、中に以下のファイルができる。
dart.js
hiterop.js
編集するのは、「.dart」の拡張子を持つ dart ファイル。後は、htmlとcssを編集する。C系と同じようにエントリーポイント(main)からプログラムが実行される。
dartを編集してから、htmlを右クリックして「run as JavaScript」を実行するとdart2jsが動いてJavaScriptが生成される。
以上。ワクワクする仕様。何つくろうかな。
https://www.dartlang.org/docs/tutorials/add-elements/#copy-app
公式ページ
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
言語仕様
- クラスを使う
- クラスの外側にメソッドが記述可能
- オプションと引数:Javaと違って省略引数可能。C++のように後ろの引数を省略 or 引数に名前をつけて省略
- 文字列インターポレーション:php的に、"Hello, ${name}"とできる
- マルチライン文字列: ($s=<<END;) のような文字列リテラル
- 動的メソッドハンドリング:実行時にメソッドがあるか確認する
- カスケード演算子: JavaScript の with。
- オプショナルな型:小さなアプリなら型をかかない、ちゃんとしたアプリでは型をかく、が選べる
- レキシカルスコープ:{}が識別子のスコープ。クロージャ(Java8で実装予定のλや無名関数で実現する関数オブジェクトの一種)やローカル変数キャプチャもOK。
- ライブラリ:Pub(オープンなリポジトリで便利)
- 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ファイル
チュートリアル
https://www.dartlang.org/codelabs/darrrt/#set-uphttps://www.dartlang.org/docs/tutorials/add-elements/#copy-app
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が出たらまたチェックしてみよう。
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年9月2日月曜日
2013年8月14日水曜日
ジオコーダー&逆ジオコーダー Google API for Java
緯度・経度と住所の相互変換コード。
GoogleのAPIが便利。後は、LatLngに関係する情報をユーザに返すコードが出来れば、GPSとの連携ができる。
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
これらはすべて以下のページから取得できます。 警察署別のデータであれば、地域別にデータを分類できそうです。
以下が見つけたもの。
○警察署別 交通事故発生状況 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
これらはすべて以下のページから取得できます。 警察署別のデータであれば、地域別にデータを分類できそうです。
2013年8月13日火曜日
Win8 Wi-Fiが不安定なとき
Win8ではハードウェアとの相性のせいか、Wi-Fiが不安定になるときがあります。
デバイスドライバを最新にしましょう。
http://www.intel.com/p/en_US/support/detect/wireless-display
2013年8月4日日曜日
Kinectでフレームデータの更新を待つ方法
Kinectでフレームデータの更新を待つ方法
- INuiSensor::NuiImageStreamGetNextFrame() でタイムアウト値を設定する。
- INuiSensor::NuiLimageStreamOpen() に設定したイベントハンドルを使って、WaitForSingleObjectまたはWaitForMultipleObjectsで待つ
- INuiSensor::NuiSetFrameEndEvent() に設定したイベントハンドルを使って、WaitForSingleObjectで待つ。
1でタイムアウト値を使う場合は、INFINITE を使うと、タイムアウトを使用せず、ずっと待つようになる。これは、フレーム更新の間に他の処理を行わない場合に使える。もし、フレーム更新の間に他の処理を行う場合は、処理の長さによって、タイムアウトを決定する。
Kinectのインターフェース
Kinectは、以下のNUI ( Natural User Interface ) インターフェースを備えます。
何をしたいかで、どれを使えば良いかおおまかにわかります。
INuiSensor : Kinectセンサーのハードウェアアクセス機能を提供
INuiFrameTexture : RGB及び距離カメラのピクセルデータを取得
何をしたいかで、どれを使えば良いかおおまかにわかります。
Natural User Interface
INuiSensor : Kinectセンサーのハードウェアアクセス機能を提供
INuiFrameTexture : RGB及び距離カメラのピクセルデータを取得
音声
INuiAudioBeam : 音源方向を取得する。QueryInterface()で音声入力や、設定プロパティへのアクセス機能を取得できる。INui~とNui~
INuiはKinectを複数用いる。Nuiは1台。どちらも同じ関数、機能を提供する。Kinectアプリケーションビルド時の注意点
Kinectアプリケーションは、x86アプリなのか、x64アプリなのか、明確にした上で環境設定を行うこと。
そうしないと、以下のエラーでビルドに失敗する。
これは、x86のアプリで、x64のライブラリを使おうとする場合におこる。
逆の場合もありえる。
C++のWin32コンソールアプリを選んだ場合、KinectとOpenCVのライブラリを x86 で統一しておくと安全。
そうしないと、以下のエラーでビルドに失敗する。
fatal error LNK1112: モジュールのコンピューターの種類 ‘X64′ は対象コンピューターの種類 ‘x86′ と競合しています。
これは、x86のアプリで、x64のライブラリを使おうとする場合におこる。
逆の場合もありえる。
C++のWin32コンソールアプリを選んだ場合、KinectとOpenCVのライブラリを x86 で統一しておくと安全。
2013年8月3日土曜日
2013年7月18日木曜日
php curl でちょっとはまった
phpのcurlを使って、バイナリデータを送る際ちょっとはまったのでメモ。
RestfulなAPIへxmlデータをサーバに送信する際、key無しで送信するためには、以下のように「file_get_contents」関数を使ってファイルデータを取得して、POST 送信する必要がある。
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
正規表現
ソート
件数制限
ユニークな値を取得
包含関係
存在
updateの引数:3つ目が「upsert」、あれば変更、なければinsert(3つ目をtrueにする)
updateの引数4つ目が「date更新件数」:4つ目がtrueだと全件に適用
コマンド を記述したファイルを用意。(JavaScriptなので拡張子はjsとする)
方法2
mongoインタラクティブコマンドから実行
mongo [データベース名]で接続したら
mongodump:バックアップを取得
コマンドの出力にバックアップバイナリファイルの出力先が出る。
mongodump --db textdic:
リストア
mongorestore --drop [dumpファイルの格納ディレクトリ]:元のデータをdropして、dumpから復元する
便利だが、はやく Json に慣れたい。
ドキュメント指向データベース 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^3sageは 8 を出力する。
f(2)
規則を代入する
定義した関数の一部を新たな関数で置き換えるなどf6 = x^2 + 1;
f6
ここで、x^2 を y とすると、は以下の様に表現。
var('y')
f6.subs_expr(x^2 == y)
次は 図形 について、そして API についても早めにとりかかる。
EXEファイルの仕組み
EXEファイルの構造
MZヘッダー、PEヘッダー、セクションヘッダー からなる。- MZヘッダー:DOSヘッダー
- MZヘッダー:MS-DOS用スタブ
- PEヘッダー:シグネチャ
- PEヘッダー:ファイルヘッダー
- PEヘッダー:オプションヘッダー
- セクションデータ:セクションヘッダー1
- セクションデータ:セクションヘッダー2
- セクションデータ:…
- セクションデータ:セクション1
- セクションデータ:セクション2
- セクションデータ:…
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のナンバーが、セクションナンバーの数だけある。
逆アセンブル
コマンド: dissmdumpbin /disasm EXEファイル名
push や mov、call などから、callが関数、pushがそれに渡す引数のように使われていることがわかる。
簡単なプログラムを書いて、コンパイラがどのようにコードを整理するのか確認してみると
おもしろい
次は メモリーロード。
2013年7月2日火曜日
2013年6月30日日曜日
CPPを本格的に始める
データ型を重視した言語。
基本データ型
- int 整数型 4byte
- float 単精度浮動小数点型 4byte
- double 倍精度浮動小数点型 8byte
- 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月24日月曜日
jedis ( redis client for java )
jedisはjavaのredisクライアント。
使い方やソースコードは以下。
https://github.com/xetorthio/jedis/wiki/AdvancedUsage
以下からバイナリがダウンロード可能。
https://github.com/xetorthio/jedis/downloads
使い方やソースコードは以下。
https://github.com/xetorthio/jedis/wiki/AdvancedUsage
以下からバイナリがダウンロード可能。
https://github.com/xetorthio/jedis/downloads
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
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にアクセスしてみます。
これだけで、$helloにredisから取得したhelloのvalueを代入出来ます。
簡単で素晴らしい。
$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-server
サーバを起動するコマンドです。実行するとコンソールを呼び出せるようになります。
redis-cli
扱えるデータ型は主に以下。
期限付きkey
追加:(l/r)push ←lは左から、rは右から
削除:(l/r)pop ←lは左から、rは右から
sadd:追加
srem:削除
一覧:smembers
和集合:sunion
積集合sinter
差集合:sdiff
すごい簡単で便利。
最後にDB選択と永続化、トランザクション的なものについて見て行きましょう。
トランザクション的なもの
multi
処理
処理
…
exec / discard
インストールしてみましょう。
# 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サーバ起動
サーバを起動するコマンドです。実行するとコンソールを呼び出せるようになります。_._強制終了は Ctrl + C :データ保存されないこ多いので、redis-cliから終了しましょう。
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 2.6.12 (c6d4084b/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in stand alone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 3166
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
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この数値計算は、DBデータにもそのまま使えます。
(integer) 1
redis 127.0.0.1:6379> incr counter
(integer) 2
redis 127.0.0.1:6379> get counter
"2"
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 yes100倍くらい遅くなるので、安全を優先したい場合のみ使用しましょう。
トランザクション的なもの
複数の処理をまとめて行う。途中の終了した時のロールバックは無し。
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では以下のコマンドで行けます。
今回は「/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日日曜日
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月5日水曜日
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による学習するコマンドです。
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年6月1日土曜日
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を。
■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
通常の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
レイアウトはパフォーマンスにも影響するので、シンプルに構成する工夫をしたほうが良いです。
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のアプリケーションを作る場合は、特有のライブラリの読み込みと初期化があるので、
注意が必要です。
復習しておきましょう。
まずは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
取得したら、任意のディレクトリに解凍しておく。
ただしスペースが入らないディレクトリを選択するかつくるのが安心。
解凍は以下に行うという前提で進める。
・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に以下を設定。
プロジェクト → プロパティ → C/ C++ build → ビルドコマンドに以下を設定
プロジェクトをビルドする。
ビルドエラーが消えたら完了です。
サンプルを見て行きましょう。
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プロジェクト → Android Tools → Android Native Support
Value: C:\android-ndk-r8e
プロジェクト → プロパティ → 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月8日水曜日
2013年5月3日金曜日
Java コマンド実行 execとProcessBuilder
Javaから外部コマンドを実行する際にはexecでは無くProcessBuilderを使いましょう。
Javaの内部実装もProcessBuilderですし、何より標準出力と標準エラー出力のバッファが小さいことによるデッドロックが起こりません。
後、標準出力と標準エラー出力を簡単にマージできちゃいます。
ffmpegを使っているときに、標準出力サイズがとても大きくなることと、標準エラー出力と交互に出るので、execだとデッドロックが発生したり、Threadで対処したりいろいろ面倒くさかったのでメモ。
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しよっと。
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/
実用にいたるには、利用出来るところまでデータを取得、整理する必要がある。
認識技術を駆使して到達出来ないか。
・SAGE
http://www.sagemath.org/
・MATHMATICAのWEB版
http://www.wolframalpha.com/
2013年4月15日月曜日
viで置換する
文字列置換
:s/[old]/[new]
- [old]を[new]に置換する現在行の最初の old を new に置換する :s/old/new
- 現在行の全ての old を new に置換する :s/old/new/g
- 2つの # 間で語句を置換する :#,#s/old/new/g
- ファイルの中の全ての検索語句を置換する: :%s/old/new/g
- 'c' を加えると置換の度に確認を求める :%s/old/new/gc
2013年3月28日木曜日
sudoユーザのてっとりばやい作り方
最近メモばかりで…、ちゃんとしたロジックを上げていないけど、使うとき必ず検索するのでメモ。
wheelグループに追加するのが早い。
wheelグループに追加するのが早い。
usermod -G wheel user_name
visudo
%wheel ALL~の行がコメントアウトされているので有効にする
2013年3月25日月曜日
tomcatのログなどメモ
30日前まで保存
vi /etc/crontab#!/bin/bashLOGDIR='/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つの集団が異なる母集団と認めた上で、集団間に回答傾向の差が生じているのか検討する
→グラフィカルモデリング
知らないことたくさん聞けて楽しかった。
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月19日火曜日
2013年3月16日土曜日
eclipse EGitでbareリポジトリのcloneを作成する
EGitパースペクティブにリポジトリを設定する方法はここがわかりやすい。
EGitでは、リポジトリを登録する際、ソースを設置するディレクトリを指定出来る。
例えば以下の様な場所にソースが出来る。
/root/git/example
Javaプロジェクトのソースに、上記のパスを設定する必要がある。
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の準備が出来ました!
次回はバージョンとかタグの管理を行えることを目指す。
これでpullの準備が出来ました!
次回はバージョンとかタグの管理を行えることを目指す。
2013年3月13日水曜日
2013年3月12日火曜日
2013年3月11日月曜日
2013年3月6日水曜日
gitサーバからsshでcloneを作成出来る環境を作成する
サーバ側では、ベアリポジトリと呼ばれる特別なリポジトリを作成する。
bareリポジトリが出来たら、ssh経由でサーバに設置する。
これで、以下のコマンドで、設置したサーバにsshアクセス出来るユーザならばcloneを作成出来るようになる。
# git clone [user]@[ホスト or IPアドレス]:/[bareリポジトリパス]
大体git-scm.com見れば良い。
後日:
これって以下の作業を簡易的に行う方法だったぽい。
http://blog.s21g.com/articles/1312
# 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
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"pはコミットのdiffを表示するオプション
#(or $) git log -p [-N]
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日木曜日
使いやすいファイルを扱うツールまとめ
たくさんのファイルを扱うときに使いやすいツールまとめ
ファイルのサイズとか画像の解像度については、数万ファイルくらいで落ちたりめぼしいものが無かったので、自作したほうが良さそう。
ファイル名の変換をテキストベースで行えるツール。
- Neo FileNameModify http://www.vector.co.jp/soft/winnt/util/se492339.html
ファイル名の変換をディレクトリを回帰して行えるツール。一覧を作るときにも便利。
- Ralpha Image Resizer http://www.forest.impress.co.jp/library/software/ralpha/
画像ファイルの変換ツール。できることが多いのに使いやすい。
文字コード変換。直感的で使いやすい。
ファイルのサイズとか画像の解像度については、数万ファイルくらいで落ちたりめぼしいものが無かったので、自作したほうが良さそう。
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/[ボリュームのファイル] [マウント先]
/とかルートボリュームの直下には付けれなかった。
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だけのようですが、 日本でも使えるようになるんでしょうね~。
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という座標点の対応を入れる前提です。
$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_[設定した共有フォルダ名]
でマウントされます。
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。
そのままクリーンコマンドを打ってもエラーになると思うのでその時の対処法。
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
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クラウドには同様のバランサが見つからない…。
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
レートが今と異なるので、そこは計算する必要があるけど場合分けの参考に出来る。
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が使えるのでそっちが速いです。
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/
これで大体基本的なところは抑えられそう。
日本語ドキュメントのリンクがあったりなかったりなのでちょっと面倒。
まずは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値化
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を実行可能です。
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を実行可能です。
Linuxコマンド 権限情報などそのままコピー
権限情報とかそのままコピーしたいことが結構あるんですが、毎回調べてるのでメモ。
以下でOK。
cp -pR [バックアップファイル or ディレクトリ] [バックアップ先]
ちなみにシンボリックリンクもそのままコピーされます。
以下で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;
}
もっとちゃんと中心をもとめたい場合は回転を考慮する。
選択した点の大体の中心を求める時に使う。
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;
}
もっとちゃんと中心をもとめたい場合は回転を考慮する。
登録:
投稿 (Atom)