2011年12月21日水曜日

【php】XMLを読み込んで複数のコマンドを実行する

前回のプログラムを少し拡張してみた。XMLをロードして複数コマンドを実行する。


<?php
doMultiProcesses($argc , $argv);
//コマンド
function doMultiProcesses($num,$param){
if($num < 2){
echo "コマンドが入力されていません。\n";
return;
}
execProcess($param);
}

//コマンドの実行
function execProcess($arg)
{
switch($arg[1]){
case "xml":
if(count($arg) < 3){ echo "引数が足りていません\n";return;}
$process = new XMLLoader($arg[2]);
break;
default:
echo "設定されていないコマンドです。\n";
return;
}
$process->execute();
$processes = new Launcher();
$processes->setProcesses($process->processes);
//$processes->isQueue = false;
$processes->execute();

}


/***********************
*
* 抽象クラス
*
**********************/
abstract class AbstractProcess{
abstract public function execute();
abstract public static function toString();
}

class Process
{
public $params;
public $name;

public function Process($name,$params){
$this->name = $name;
$this->params = $params;
}

public static function create($name,$params)
{
$className = $name;
$classParams = $params;
if(class_exists($className)){
$process = new $className($classParams);
}else{
echo $className . "という処理がみつかりません。\n";
}
return $process;
}
}

/***********************
*
* 複数コマンドの実行用
*
***********************/

final class Launcher extends AbstractProcess{

public $processes;
public $isQueue;

public function Launcher(){
$this->isQueue = true;
}

public function setProcesses($value){
$this->processes = $value;
}

public function execute(){
while(count($this->processes) > 0){
if($this->isQueue){
$process = array_shift($this->processes);
}else{
$process = array_pop($this->processes);
}
$process->execute();
}
}

public static function toString(){
return "Launcher";
}
}


/***********************
*
* コマンドローダー
*
***********************/

class XMLLoader extends AbstractProcess{



private $path = "";
public $processes;

public function XMLLoader($path){
$this->path = $path;
$this->processes = array();
}

public function execute(){

if(!file_exists($this->path)) {
echo "ファイルが存在しません\n";
return;
}
try{
$xml = simplexml_load_file($this->path);
}catch(Exception $e ){
echo "XMLの書式が間違っています\n";
return;
}

foreach( $xml->process as $process){
$name = (string)($process->name);
$param = (string)($process->param);
$prc = Process::create($name,$param);

if($prc instanceof AbstractProcess)
array_push($this->processes,$prc);
}
}

public static function toString()
{
return "XMLLoader";
}
}

/***********************
*
* サンプルコマンド
*
***********************/
class Test extends AbstractProcess
{
private $param;
public function Test($param){
$this->param = $param;
}

public function execute(){

echo $this->param . "\n";
}

public static function toString()
{
return "Test";
}

}




これを使って以下のXMLを読み込んで実行する。

<data>
<process>
<name>Test</name>
<param >param1</param>
</command>
<process>
<name>Test</name>
<param >param2</param>
</process>
</data>


実行


mr-elephant:php shuzo$ php process.php xml ./process.xml
param1
param2


とりあえず必要なものだけを実装してみました。
もうちょいなんか工夫できそうな気がします。

というかGithubにあげてみたいと思ったのですが、うまくいってません。orz

※インデントが気持ち悪いところだけ修正しました。
※commandという名前はあまりよくないというご指摘を受けたので、修正しました。
どうせなので、微妙にリファクタリングを追加。

2011年12月19日月曜日

【php】クラスの継承メモ

phpでコード生成のプログラムを書くことがちょくちょく増えてきたので、インターフェイスとかを統一しておきたい。まずはクラスの書き方から勉強。


<?php
cmd($argc , $argv);
//コマンド
function cmd($num,$param){
if($num < 2){
echo "コマンドが入力されていません。\n";
return;
}
commandExec($param);
}

//コマンドの実行
function commandExec($arg)
{
switch($arg[1]){
case "test":
if(count($arg) < 3){ echo "引数が足りていません\n";return;}
$cmd = new TestCommand($arg[2]);
break;
default:
echo "設定されていないコマンドです。\n";
return;
}
$cmd->execute();
}

/***********************
*
* スーパークラス
*
**********************/
abstract class AbstractCommand{
protected $states;
abstract public function execute();
abstract public function toString();
}

/***********************
*
* 子クラス
*
***********************/
class TestCommand extends AbstractCommand
{
private $param;
public function TestCommand($param){
$this->param = $param;
}

public function execute(){

echo $this->param . "\n";
}

public function toString()
{
return "TestCommand";
}

}



これを実行すると。


mr-elephant:php shuzo$ php cmd.php test hoge
hoge


出力されました。上の内容でちょっとつまずいたところは、




class TestCommand extends AbstractCommand
{
private $hoge;
public function TestCommand($param){

$hoge = $param;
}

public function execute(){
echo $hoge . "\n";
}

public function toString()
{
return "TestCommand";
}

}


上のやり方だと出力されず、メンバ変数へのアクセスには必ず$this->hogeを使うとのこと。省略しちゃだめってことですね。

2011年10月11日火曜日

Hello world

Dartでちょっと修正Hello World


int main() {

var hello = echo;

hello('Hello world!!');
}

echo(var str) => print(str);


結果

Hello world!!

http://try-dart-lang.appspot.com/s/Z0ET
うむ。

ついでに(チョイ修正)、

int main() {

var hello = echo;

hello('Hello world!!');
}
/*
echo(String str){
print(str);
}*/

echo(int str){
print(str);
}


結果

Hello world!!


http://try-dart-lang.appspot.com/s/iGUT
うーむ。

2011年9月8日木曜日

【AppleScript】ダイアログボックスを出す。

AppleScriptでダイアログボックスを出す。
あると便利だったりするのでメモ。

on run ARGV
tell application "Finder"
activate
set msg to item 1 of argv
display dialog msg
end tell
end run

コマンドラインで実行権限を与えてあげる

chmod +x alert.applescript

実行

osascript alert.applescript "Hello world"


結果

2011年6月22日水曜日

【JavaScript】jQueryを読んでみたい part.1

JavaScriptをしっかり勉強しようと思って、オライリーのJavaScriptパターン――優れたアプリケーションのための作法という本を読みながら実装をしたりしたんだけど、最初に見た先輩のAS3のコードがとても勉強になってすごいやる気が出た記憶もあり、やっぱり優れたプロダクトコードを見るのが一番勉強になると思うので、プログラミング言語人気TOP10の簡易解説という記事でも紹介されていたように、jQueryを読んでみようと思った。

思ったまではいいんだけど、まぁ、へたれなのでファイルを開いてとりあえず絶望したし、コードリーディングというものをどこからしていいのかわからない(現に使っているライブラリの挙動を見ようというイメージで触っていない)。
という訳でとりあえず”jQuery”という文字を利用している箇所を探すことにした。

bash-3.2$ grep -n jQuery jquery-1.6.1.js >> output.txt

でるわでるわ、ですぎるわ。
という訳で改めて。

bash-3.2$ grep -n ^jQuery jquery-1.6.1.js >> output2.txt


としたら割とまとまりのある感じに出力された。
とりあえず

var jQuery = (function(){

で始まっている最初の部分から少しずつ読んでみようかなー。というところで今日はおしまい。

正直、意味あるのかはわからないけれど、とりあえずgrepの使い方は、なれといて損はなさそうだとは思った。
part2は、どうしよう。

2011年5月17日火曜日

【OpenCV】cvSobel / cvLaplace

画像のエッジ抽出をするのにcvSobelとcvLaplaceがでてきたのでメモ。
そもそもエッジ抽出をするとはどういう事なのか?と言うところから。
画像内にみることのできる輪郭線を抽出する、つまり色や形の変化がはっきり見えるところを特徴として抽出すると言う事、正確に言うと濃度の変化が大きいところをエッジと言うらしい。
つまり濃度の変化の値(つまり変化の傾き)が大きいところ、言い換えると変化を表す曲線の接戦がより垂直に近いところがエッジとなる。結果的に言うと2次微分をしたときに、その傾きの値が0になる点をエッジとなると見なせばよい、と言う事だそうだ。

そこで使うのがcvSobelと、cvLaplaceと言う事らしい。
Sobelを調べたけど元のいみはわからず。でてきたのは↓こちら。※一次微分と言う意味かと思ったらそれはGradientと言うらしい。
ソーベルフィルター《画像処理での edge detection filter の一つ; 水平方向と垂直方向のものがあり, 組み合わせて用いることもある; Prewitt filter に比べ, そのピクセルのある行・列の重みが高くなっている》.

「Weblio 辞書 / 英和辞典・和英辞典」より

ちなみにLaplaceはLaplacian(2次微分)で元はピエール=シモン・ラプラスという数学者からなんだそうな。
2 階線型の偏微分方程式である。
「wikipedia / ラプラス方程式」より


と書いてあったけど、正直のところぼんやりとしかわからない。とりあえず読み込んだ画像をグレースケールに直して、cvSobelとcvLaplaceをそれぞれ適応させてみると、以下のような結果を得ることができた。




ちなみにSobelは一次微分なので、X、Y方向を指定してあげて抽出する。みた通り、X、Y軸方向それぞれのエッジを検出することができる。また、Laplacianに比べて細い部分は取得できていないものの、細かいノイズを気にしなくても良いそう。

と、ここまでやってなんとなくどういうところに使えるかや、根本的な原理はなんとなくわかったものの、処理そのものがあまり理解できていないので、もう少し詳しくみた方が良さそう。

メモ:こちらのPDFが参考になそう。
http://www.osakac.ac.jp/labs/hild/IPslide7.pdf

2011年4月26日火曜日

【OpenCV】画像の二値化。CV_THRESHOLD_○×△

Thresholdってよく聞くけど何なのさ、と前も書いたようなデジャブに襲われましたが、【閾値】だそうですね。なかなかおぼえられん。OpenCVで画像の二値化を行ったときにちょっと気になったことがあったのでメモ。
画像の二値化は以下の方法にて。


doble cvThreshold( const CvArr* src, CvArr* dist, double threshold,
double max_value, int hreshold_type);

というメソッドを使う場面がありまして、このときthreshold typeの部分にいくつかデフォルトで定数が用意されているようなので、その内容が気になったので結果を表示してみました。invって何だって思ってたんですけど昨日書いたINVERTつまり逆って事なんですねー。

CV_THRESH_BINARY



CV_THRESH_BINARY_INV



CV_THRESH_TRUNC



CV_THRESH_TOZERO



CV_THRESH_TOZRO_INV