プログラム

MFCでチェックボックス制御

いつか調べていた気もするが再び忘れていたのでメモ。
VC++MFCを使ったプログラムのいて、IDC_RADIO1, IDC_RADIO2, IDC_RADIO3とラジオボタンにIDが振ってあり、IDC_RADIO2をデフォルトとしてあらかじめラジオボタンで選択した状態にしておきたい場合。

CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO2);

と、書けばよい。
あと、クラスウィザードでラジオボタンそれぞれに変数を割り当てる場合はあらかじめグループ化を行わないとNG。

YoutubeのURLの配列→MP4自動変換

気を紛らわせるためと勉強にコーディング。
プログラム中の配列にYoutubeのURLを貯めて作ったプログラムの引数に渡すと動画ファイルをサイトから取ってきてffmpegでMP4に変換して保管するプログラムを書いた。*1
あとは、URLをソーシャルブックマークRSSから取ってくる様にして、変換したMP4を自宅内のみからアクセスできるコンピュータからRSS生成してPodCastさせる*2様にすれば普段ブックマークしておいたYoutubeのリストからiTunes登録, iPod同期まで自動的にできる様になって結構楽しいかも。

いや、もっとも、そもそもうまくいくのかわかんないけど。…。と、今一度試したらうまく動かなくなってしまった。ううむううむ。

*1:厳密には以前書いていたの改良か...

*2:外に見せるとあまりよくない気がするので...

Ethnaのフォームヘルパ

EthnaにはフォームヘルパがあるのでActionFormに定義した内容を基に自動的にHTMLタグ(formとかinput)を出力してくれるのだけど、Ethnaのバージョンによる出力内容で少しトラブったのでメモ。
なお、元々書き方が甘かったということを前提に書きます。
しかも、今の最新バージョンは2.3.2であることを併せて書いておきます。(なぜか2.3.1と比較...)

早速。
ActionFormでは次の様に定義。

<?php
$form = array(
'hoge' => array(
'type'        => VAR_TYPE_STRING,
'form_type'   => FORM_TYPE_TEXT,
// 以下省略
),
);
?>

で、テンプレートに次の様に書くと...

{form ethna_action="main_foo"}
{form_input name="hoge"}
{/form}

HTMLヘルパが解釈してHTMLを出力してくれるのだけど、この出力結果がEthnaのバージョンによって微妙に違った。
Ethna2.1.2(class/Ethna_SmartyPlugin.php (rev1.14))のときは、

<form action="" method="post">
<input type="hidden" name="action_main_foo" value="true">
<input type="text" name="hoge" value="" />
</form>

これが、Ethna2.3.1(class/Ethna_SmartyPlugin.php (rev1.21))では、

<form method="post">
<input type="hidden" name="action_main_foo" value="true">
<input type="text" name="hoge" value="" />
</form>

となっていた。action属性がテンプレートに「{form ethna_action="main_foo" action="index.php"}」などと明記しない限り出力されなくなった。
一応、Ethna本体のソースを読むと、2.1.2の頃は、

<?php
// class/Ethna_SmartyPlugin.php (rev1.14)の一部
if ($action !== false) {
if (isset($action) == false) {
$action = basename($_SERVER['PHP_SELF']);
}
$s .= sprintf(' action="%s"', htmlspecialchars($action, ENT_QUOTES));
}
?>

となっていて、未指定の場合でも入る様になっていたのだけど、レンダラをSmarty以外にも使える対応が行われたとき修正された?のかもしれない。
もっとも自分がテンプレートにきちんとactionを明記しておくべきなのだけど、うっかり抜けている箇所があった…。と。
で、これでEthna2.1.2をEthna2.3.1に上げたときに一般のPC向けブラウザだと確認した限りでは問題なく動いてたり。
(ドキュメントを開いたコントローラと同じ箇所にaction属性が指定されたことになるみたい?)
ただ、問題があるのがケータイ。
iモード用ブラウザだと、出力HTML中にformタグにaction属性が抜けていると、formタグに挟まれた間にあるinputタグで表現される入力フォームが全く表示されない。(PCブラウザだと出力される)
2.1.2の頃は未記述でも空の「action=""」という属性がformタグに出力されていたので表示されていたのかなぁ。

ともかく、フォームヘルパで{form}と書くときにはactionを必ず指定する様にしたいと思います。。。

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

  • 作者: 後藤 章一,竹端 進,竹下 肯己,高井 直人,吉田 和弘,高橋 征義,桐山 俊也,川村 丹美,西澤 晋,ひろせ まさあき,角谷 信太郎,池邉 智洋,松永 充弘,永安 悟史,高林 哲,児玉 サヌール,田中 ばびえ,たつを,小飼 弾,宮川 達彦
  • 出版社/メーカー: 技術評論社
  • 発売日: 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必須だったのでダウンロードしてみて触っています。
結構おもしろいかも。