プログラム

MacFUSE + sshfs

Web+DB Pressで紹介されていたMacFUSE + sshfsを使ってみた。
これを使うことでsshで接続可能なサーバをMac側のネットワークドライブとしてマウントすることができるので、Finderから普通に操作することができる。
あと、アップロードも楽です。ドラッグ&ドロップすればいいだけなので。
ダウンロード先は http://code.google.com/p/macfuse/
設定も難しく無いし、使いやすいしMac使われているかたは是非御導入を。
詳細は雑誌 or Web。
雑誌は冒頭の記事 p.6〜 "Start MacBook" という記事。毎回必ず読んでる記事です。

WEB+DB PRESS Vol.40

WEB+DB PRESS Vol.40

  • 作者: 後藤 章一,竹端 進,竹下 肯己,高井 直人,吉田 和弘,高橋 征義,桐山 俊也,川村 丹美,西澤 晋,ひろせ まさあき,角谷 信太郎,池邉 智洋,松永 充弘,永安 悟史,高林 哲,児玉 サヌール,田中 ばびえ,たつを,小飼 弾,宮川 達彦
  • 出版社/メーカー: 技術評論社
  • 発売日: 2007/08/24
  • メディア: 大型本
  • 購入: 3人 クリック: 47回
  • この商品を含むブログ (53件) を見る

VisualStudio2005でデバッグ

先日乗り換えてしばらく他言語な人だったので触っていなかったのだが、最近再び利用中。
C++ & MFCでプログラムを書いていてブレークポイントを設定してステップしながらデバッグしようと思うのだが、次の様なダイアログが出てデバッグできない。f:id:hideack:20071003170934p:image
(現在の場所のソースコードを表示することができません)
で、当然ダイアログの中の逆アセンブルを自動表示…にチェックを入れればアセンブラが表示されて少々痛いことに。
あれこれ調べてみたところ、次の設定を変更すれば従来通りになる模様。

ツール→オプションのダイアログでツリーからカテゴリ「デバッグ」を選択し、『元のバージョンと完全に一致するソースファイルを必要とする』のチェックを外す
f:id:hideack:20071003170606p:image

ソースに修正を加えたりして差分を差し替えてリンクだけをやり直した場合にデバッグ情報と差異が出るため表示されるみたい。
VisualStudio2005では、これがデフォルトになっている模様。
2002や2003のときには一体どうしていたのだろう。(ここまで厳しくなかったのだっけ?)

指定した容量のダミーファイルの作り方

ITmediaの記事より。
ネットワークの転送速度の評価やファイルへの加工処理を行うときに特定の大きさのダミーファイルが欲しいな。というとき、今までtarで固めたりしていたのですが、こんなときにはddコマンドを使うとよいみたいですね。
ddは決めたサイズでのコピーを行うためのコマンド。

# dd if=/dev/zero of=(ファイル名) bs=1024 count=1000

ここで、bsはブロックサイズ。countは1ブロックがいくつあるかを指す。
この場合だと1kbyteのファイルを作成することができる。と。
覚えておこう…。

EthnaでAppObjectを使う

今までどうやってDBにアクセスしてたんだ?っとツッコミはさておき...。
EthnaではO/RマッパーとしてEthna_AppObjectが用意されているので、このオブジェクトを作ると用意にDBにアクセスできる様になる。
ethnaコマンドでオブジェクトを作る。
たとえば、personというテーブルがDB内にあったとき、そのテーブルにアクセスするオブジェクトを作るには、

% ethna add-app-object person

これで、プロジェクトディレクトリ内のAppディレクトリ内にファイルが生成される。
プロジェクト名が"sample"だと、app/Sample_Person.php が生成される。
これが生成されれば、後はインスタンスを生成して、そのインスタンスに対してsetメソッドで変数をセットした後、addメソッドを実行するとDBに反映される。
setメソッドの第一引数はプロパティ名で第二引数は値。

<?php
class Sample_Form_Main extends Sample_ActionForm
{
// 省略
}
class Sample_Action_Main extends Sample_ActionClass
{
function prepare()
{
return null;
}
function perform()
{
$person = $this->backend->getObject('person');
$person->set("name", "taro yamada");
$person->add();
return 'main';
}
}
?>

こんな感じで書けばActionが実行された際にpersonテーブルのnameカラムに"taro yamada"と設定されてDBが更新される。

質問

先日、研究室の後輩にあたる方からメールをもらった。
卒業研究にあたっての質問ということで、いくらかこちらから情報提供をしておいた。フレームワークEthnaが良いですよ。とか。
これで、また1ユーザゲット。(ナニカ間違っている)
ついでにエディタはvimが良いですよ。とかとも書いておこうかとも思ったが、あまりに道を反らすと怒られそうなのでやめておいた。
すごく丁寧なメールで、自分が学生のとき、ここまで丁寧にメール出せたかいな?と思ってしまうくらい感心してしまった。
間違いなく言えるのは、あの研究室に居るだけでいろいろと経験は積める*1 *2のは間違いないはず。と、おじさん私は思う訳だ。
しっかり頑張ってほしい。と、ここに書けば中の人がきっと適宜適切な形で助けてあげたりしてくれるだろう。

*1:校舎の前でサンマを焼いたり、床の上で寝袋に丸まって寝たり、パソコンの前で気を失って寝ていたりすることも含む

*2:いや、決して必須ではないと注意書き

System.arraycopy

さっきからJavaScriptをひたすら書いているのだが...。
JavaScriptJavaのSystem.arraycopyみたいなメソッドは無いのかしら?
普通にループ回すのみかねぇ。

勉強中。

MochiKitを勉強中。
というか、とあるライブラリを使おうと思ったらMochiKit必須だったのでダウンロードしてみて触っています。
結構おもしろいかも。

EthnaでCLI(コマンドラインインターフェース)用のプログラムを書く

Ethnaではゲートウェイを変更することでwebアプリ用のプログラムだけではなくて、サーバーで定期稼働させたりするコマンドラインのプログラムを作ることもできる。
ethnaコマンドを使ってスケルトン作成。feedcrawle2というプログラムの名前で作ってみる。

% ethna add-entry-point --gateway=cli feedcrawle2

file generated [/Users/〜/pj/feeddown/skel/skel.entry_cli.php -> /Users/〜/pj/feeddown/bin/feedcrawle2.php]
action script(s) successfully created [/Users/〜/pj/feeddown/bin/feedcrawle2.php]
file generated [/Users/〜/pj/feeddown/skel/skel.action_cli.php -> /Users/〜/pj/feeddown/app/action_cli/Feedcrawle2.php]
action script(s) successfully created [/Users/〜/pj/feeddown/app/action_cli/Feedcrawle2.php]

これを実行すると、Ethnaのプロジェクトディレクトリに上の実行結果の通りファイルが作成される。

  • ~/bin/feedcrawle2.php
  • ~/app/action_cli/feedcrawle2.php

あとは、webアプリをEthnaで書くときと同じ様にapp/action_cli/以下のModelをコーディングしていけばよい。
プログラムの実行は、

php -q bin/feedcrawle2.php

とすればよい。
ActionClassを継承しているので、$this->backend等々、普通に使える。
ただし、コマンドラインの引数を取得する仕組みは無い*1ので、グローバル変数 $_SERVER['argv']から取得する形になりそう。(これが正しいのかは現状、謎。)

今までこの仕組み使わずにそのまま直書きしていたのは愚かであった。徐々に書き直して行こうと思う。

*1:無いように思われる。というのが正解。

Javaでガウス分布(正規分布)の乱数を得る方法

メモを兼ねて。
Javaガウス分布正規分布)の乱数を得るためにはjava.util.RandomのnextGaussian()メソッドを使えば良い。
返り値として「乱数ジェネレータのシーケンスを使った、平均 0.0、標準偏差 1.0 のガウス (「正規」) 分布の double 型の次の擬似乱数」(APIの解説そのまま)が得られるそうだ。
原理を完璧に飲み込まないまま使うの、本当はよくないのだろうけどやむを得ない。
蛇足だが、普通にJavaのAPIリファレンス中で参照した文献として、KnuthのThe Art of Computer Programmingを参照してます。と書いてあることに驚いた。

Art of Computer Programming, Volume 4, Fascicle 2, The: Generating All Tuples and Permutations

Art of Computer Programming, Volume 4, Fascicle 2, The: Generating All Tuples and Permutations

PHP Object Generatorのデータベースオブジェクトを使ってみる

お勉強がてらにPHP Object Generatorを使ってみた。そのときのメモ。読みにくいのはご愛嬌。
手順は以下の通り。

1. PHP Objct generator(http://www.phpobjectgenerator.com/)のページでDBオブジェクトの設定をする。
以下の様な内容で設定してみた。

  • テーブルの名前
    • userlist
  • DBの項目
    • NAME = VARCHAR(255)
    • AGE = INT
    • MAILADRS = VARCHAR(255)

設定を入力した際の画面は下の様な感じ。

f:id:hideack:20070805014754p:image

2. オブジェクト一式がzipに固められダウンロードできるのでダウンロードする。

3. ダウンロードしたパッケージを解凍する
解凍すると中身は以下の様な内容になっている。

  • configuration.php (DBに接続するためのパラメータ設定)
  • objectsディレクトリ
    • データベースオブジェクトが入っている模様
  • pluginsディレクトリ
  • setupディレクトリ
    • webサーバの公開領域に置いた際にブラウザから設定やテストができる模様

4. configuration.phpを設定する
おそらく目を通せば、そのままなのでわかると思う。
一部を示すと以下の様な形。そのまんま。

<?php
// edit the information below to match your database settings
$configuration['db']	= 'test';       // database name
$configuration['host']	= 'localhost';	// database host
// (以下続く)
?>

5. DBに実際にテーブルを用意する。
自分自身が手探り状態なので、とりあえず直接MySQLを操作して作る事にした。
で、ここで objects/class.userlist.php を見てみると、自動生成されたソースコードの上部のコメントに以下の様な内容が書かれている。

This SQL query will create the table to store your object.
CREATE TABLE `userlist` (
`userlistid` int(11) NOT NULL auto_increment,
`name` VARCHAR(255) NOT NULL,
`age` INT NOT NULL,
`mailadrs` VARCHAR(255) NOT NULL, PRIMARY KEY  (`userlistid`)) ENGINE=MyISAM;

最初の設定では、name, age, mailadrsの3列分の情報しか定義しなかったのだけど、Php Object Generatorはuserlistidというカウンタ値を付けて、それをprimary keyとして管理するということになっている模様。
なので、上記の定義をそのまま利用してMySQLにテーブルを作成する。

% mysql -u test -ptest
mysql> use test;
Database changed
mysql> CREATE TABLE `userlist` (`userlistid` int(11) NOT NULL auto_increment,`name` VARCHAR(255) NOT NULL,`age` INT NOT NULL,`mailadrs` VARCHAR(255) NOT NULL, PRIMARY KEY  (`userlistid`)) ENGINE=MyISAM;
Query OK, 0 rows affected (0.04 sec)

うむ。無事に出来た。

6. POGのDBオブジェクト経由でデータを書いてみる。
破竹の勢いで自動生成されたソースコードに目を通す。こんな感じで操作するとデーターベースに登録されそうだな。と、目星をつけて書いてみる。

<?php
require_once("configuration.php");
require_once("objects/class.database.php");
require_once("objects/class.userlist.php");
$db = new USERLIST("taro yamada", 30, "taro@hoge.com");
$response = $db->Save();
print "RESPONSE CODE=".$response."\n";
?>

これを実行してみると、

%php -q test.php
RESPONSE CODE=1

となる。ここで返却される数値はデータベースのテーブルのprimary keyとなっている項目(ここでは、userlistidという名前の列)の値であるので、書き込めたに違いないということで、MySQL経由で実際にテーブルを見てみる。

mysql> SELECT * FROM USERLIST;
+------------+-------------+-----+---------------+
| userlistid | name        | age | mailadrs      |
+------------+-------------+-----+---------------+
|          1 | taro yamada |  30 | taro@hoge.com |
+------------+-------------+-----+---------------+
1 row in set (0.01 sec)

おぉ、書けている!!
と、ここまでいった時点で久しぶりの夜更かし状態でかなり眠くなってきたので続きはまた明日。

<蛇足>
この使い方が正しい使い方なのか大きく謎ですので、その点はご了承ください。