Home > Tags > プログラミング

プログラミング

Quartz Comporserで遊んでみる

Macで5分でARアプリを作る方法(AR without programming in 5min)を見ていたら面白そうだったので、いじって遊んでみる。

簡単に言えばパッチを組みあわせて作るビジュアルプログラミング。

2Dでも3Dでも適当に貼りつけて動かせるし、なかなかに楽しい。並列操作が得意な分、シーケンス操作が難しそうだが、これはマクロでもつくれというものなのだろう。

わけのわからないパッチが山ほどあるので、もうちょっと触ってみるつもり。

きょ、今日はこのへんにしといてやる

調子が悪かったので、宴会に行かずさっさと帰宅。

Twitterの発言から、Mecabを試してみようとfinkでインストール。

試してみると、見事に文字化け。どうやら、標準だとEUC-JPで全部処理しているらしい。仕方がないので、本体と辞書をUTF8で作りなおしてインストール。すると、今度はrubyバインディングが動かなくなってしまった。どこか妙なライブラリをひろってしまったんだろうか。

面倒そうなので、一端ここまでで中断。なんというか、暑さで気力が続かない。

頭の体操

アイドレスの大元はプリミティブな仕様の裏で物凄く面倒なことをしているようだ。MVCのうち、Mだけが突出している正直表がRoRである必要性を感じないが(1セッションのコストを考えると特に)バックエンドや管理画面等で便利なことも多いのだろう。

とにかく、この過去との互換性を背負った複雑な書式にあいまいな記載のデータをつっこんで、きちんとした結果を出す、そのプロセスの複雑さは想像することすらできない。パーザの仕様を見てみたい。

Continue reading

最近のゲームAI

GDC2010 報告会の資料 「Killzone 2」「The Sims 3」のAIから辿って、デジタルコンテンツ制作の 先端技術応用に関する調査研究報告書 2008年度をざっと読んでみる。

画像に音楽AIに職業状況等多彩な情報が盛り込まれたいたが、一番の興味を引いたところは矢張りAI。近年のAIは知覚系-体-思考を完全に分離した上で、対応する状況の粒度を変えた階層構造を持ち、メタAIやメタメタAIが連携してタスクをこなす構造がスタンダードらしい。

それで思い出したのがGPMや絢爛舞踏祭なのだが、言及が無かったのは資料の開示があるかどうかが大きいのかな。絢爛は一応攻略本にAIの概説程度は書いてあったけれども、確か欲求ベースのモデルで、The Simsで示された例に近い構造を持っていたはず。あれは観察していてなかなか愉快なAIっぷりだった。

iPad/iPhoneは可搬型マイコン? それとも家電?

今回のプログラム縛りについてのMeCab作者の意見を読んだ。

きまぐれ日記: MeCabがiPhone,OSXに載っていると言うのは止めようと思う

違和感が何か見えてきた気がする。iPhoneは家電であって家電でないということかな。これがプログラムの外挿自体が特別な機器であるテレビや冷蔵庫やビデオレコーダ等…例えばApple TV上のガジェットならそう言われなかったのだろう。

携帯電話だとしても言語縛りは別に今まで問題とはなってこなかった。BREWでしか作れないと言われてもそんなものか、ですんでしまう。いわゆる従来からのスマートフォンの系譜にあるバイナリさえあれば言語は何でもいいというのと、今まで解放していたのが制限された、というのが反発しやすい条件になっているのだろう。自由の制限、というのはわかりやすいし。

私自身としては、libc相当から自前で書きおこしているdjb ware的なものを皆が使うと何か不安だよね、という程度の違和感なので、ミドルウェアは何だっていいじゃない、とは思う。一方で、市場が縮小する判断をしてまで安定性を重視したアップルの姿勢もわからなくはない。多分短期的には悪い方向に行くんだろうなあと思いつつ様子見といったところ。

Objective-C学習中

通勤中にヒレガス本を読んで、帰ってから課題の一つである文字列の入力とその文字数を数えるメッセージを出すというのをやってみた。場所でいうと「5.6 チャレンジ」(日本語版の場合p96、英語はp90)。

まずは素直に IBOutlet/IBAction を使うバージョン。NSTextField の outlet を二つ用意して、ボタンの押下を IBAction のメソッドで受ける。ついでに awakeFromNIB メソッドを定義してラベルの初期値を設定してみた。これは課題のページのすぐ前あたりでやっていることなので簡単。

さらに作りなおしてみる。Key-Value コーディングが面白そうだったので、がらっと違う方法で挑戦。

NSString を二つ(テキスト入力用、テキスト出力用)用意して、@property と @synthesize で setter/getter を自動定義。文字列の入力即文字数カウントとしたかったので、IBで入力テキストフィールドのContinuesを有効にして、setter だけ自前で書く。このへんでどハマり。

まず、NSString の更新ってどうなるんだっけ、と延々マニュアルをあさってみたりする。結局 textField = t; と単純なポインタ代入でよかったようだ。本当はその前にt を retainしたりtextField を release したり必要なはずだが、しばらくはメモリ管理は忘れたままでおきたいので、ガーベージコレクションをビルドオプションでつけて逃げる。

そして、あんのじょう値を直接更新したのに更新通知を飛ばしてしまい、willChangeValueKey と didChangeValueKeyに辿りつくまで長々と悩んでしまう。出力側のテキストの更新も少々悩んだが、こちらは self 経由で [self setLengthMessage:msg]; と @synthesize がつくってくれた setter を指定することで逃げた。

なんだかんだで2,3時間かけて課題完了。少しは勘所がわかってきた気がする。

NIBがないとわからないが、一応二番目の課題でつくったクラス AppController.h。

#import 

@interface AppController : NSObject {
	NSString *textField;
	NSString *lengthMessage;
}
- (id)setTextField:(NSString *)t;
- (int)countLength:(NSString *)t;
@property (readwrite, copy) NSString *lengthMessage;
@property (readonly) NSString *textField;
@end

ついでに AppController.m。

#import "AppController.h"

@implementation AppController
- (id)setTextField:(NSString *)t
{
	// set new textField
	[self willChangeValueForKey:@"textField"];
	textField = t;
	[self didChangeValueForKey:@"textField"];

	NSLog(@"%@ -> %@", textField, t);

	// update length message
	[self countLength: t];

	return self;
}

- (int)countLength:(NSString *)t
{
	NSString *msg;
	int length;

	// make message from textfield's length
	length = textField.length;
	msg = [[NSString alloc] initWithFormat:@"'%@' has %d characters.",
		   textField,
		   length];

	// set value using self-setter(automated)
	[self setLengthMessage:msg];
	NSLog(@"%@", msg);

	return length;
}

@synthesize textField;
@synthesize lengthMessage;
@end

これはヒレガス本ではない。ヒレガス本++だ。

ちょうどヒレガス本の日本語版が発売されていたようなので、何件かまわって購入してみた。原書で持っているだけに日本語で読めるというだけではちょっと買いにくいが、XCode 3.2/Snow Leopard 対応がされているというので「これはヒレガス本++とでも言うべき内容だ」と自分を納得させて購入。ああ、矢張り日本語で読むと楽だねえ(←そこが主眼だっだのか)

ObjectiveCふたたび

ちょっとアプリケーションっぽいものの構想ができたので、実現可能かどうか軽くXcodeに手を出してみることにする。教本は以前買ってあったヒレガス本と荻原本。荻原本は言語としての解説なので、Cocoaアプリからせめるヒレガス本と実によく馴染む。

うーむ、例がうまく動かん。「もうそれ使ってないよ」「将来消えるAPIだね」とかそういう警告は無視するにしても、何故だーー。

ヒレガス本の英語が優しくて助かる。

Processing 言語で遊ぶ

最近ビジュアライゼーションをやっていないので、Processingを試してみることにする。画像、アニメーション、音楽を容易にプログラムするための言語で、Javaに変換して実行される。そのため文法も Java っぽい。

まずは、ダウンロードしてOS Xにインストール。起動してみるとソースコードを入力するエディタが出た。千葉商科大学政策情報学研究科 プレゼンテーション法の講義を参考にいくつか改造しながら試してみると、大体要領がわかってきた。結構素直で使いやすい。

はまった点が一つ。Processing で obsolete な関数を使おうとするといきなりウェブに飛ばされてしまった。シンタックスハイライトしている部分と、そのページにあるChangesを見比べたところ、どうやら framerate(30); という部分が frameRate(30); になるらしい。一文字なおしたら無事makeが通るようになった。

しばし、MSXを思い出しつつサンプルコードをいじって遊ぶ。うーん、楽しい。矢張り結果がすぐ絵と音でわかるプログラミング環境って素晴しいものだ。

Gallery of Computationを見ると、色々な表現とそのソースコードが入手できる。しばらくはこれで遊べそうだ。

しかし、その前にIDE環境を整える必要がある。折角OS X にはXcodeという快適な環境があるので、使わないのはもったいない。

まずはMac Dev Centerから最新版の Xcode を入手して、3.2→3.2.1にアップグレード。色々参考にして

  1. Java Applet でプロジェクトを新規作成
  2. /Applications/Processing.app/Contents/Resources/Java/core.jar を作成したプロジェクトの lib フォルダに放りこむ(CLASSPATHはどこで通すんだ…?)
  3. resource ディレクトリに Processing で使う画像やフォントを放りこむ。今回は必要なし

とまでやって後はアプレット風味で遊ぼうとしたところで本日は終了。面倒すぎるので素直にProcessing単体で遊ぶかも。

GDB7.0でトレース逆流

GDBで歴史をさかのぼれるように!なりました! GDB 7.0 の新機能Reverse Debuggingを使ってみた – 日記を書く [・w・] はやみずさん

ほほう、指定してからの部分だけとはいえ、break しなおさないでいいのは嬉しいな。スタックオーバフローでどの程度役にたつか試してみるか。

紀元前のWordPress(2)

ただひたすらに調べまくる。先日の調査は生温かったので、今度はきっちし追求。

WordPress, PHP , PHPのライブラリ、MySQL、DBの内容…全部しらべた結果、PHP の date(), gmdate() で ‘Y’ (4ケタ年号)を使った場合に問題となることが発覚。

PHPのBTSを見てみたところ、あった.PHP Bugs: #48276: date(‘Y’) returns 0000がそうらしい。

PHP 5.3.0RC2と、PHP 5.2.10あたりのバージョンで、アーキテクチャが PPC だと発現するようだ。そして今の環境は、PowerPC の Mac mini に、Leopard 付属の PHP 5.2.10。うん、あっている。

解決方法としては、こんなところかな。上のものほど根本的な解決。

  1. Apple がなおしてくれるのを待つ。
  2. PHP を独自ビルドにして、Apache が参照するモジュールを入れ替える。
  3. WordPress を適当にパッチをあてて動かす。

まず、Appleがなおしてくれるのは内容的に期待できない。脅威度が低かったりマイナーだったりするとセキュリティ上の問題でも延期するし。OSX Server ならばともかくクライアントだしね。

次のPHP独自ビルドは、できれば避けたい選択肢。きちんとmakeするのは正直しんどい。前にやった時は謎のドツボにはまって、画像がアップロードできないなんて状態になっていた。

というわけで、まずはお手軽に、それっぽい関数にパッチをあてて試してみる。案の定 wp-include/functions.php に current_time() なんてものがあったので、試しに改変。

return ( $gmt ) ? ereg_replace('0000', "20" . gmdate('y'), gmdate( 'Y-m-d H:i:s' )) : gmdate( 'Y-m-d H:i:s', ( time() + ( -9 * 3600 ) ) );

うーん、きいていないなあ。調べてみると各所で date(), gmdate() 使いまくりで全然使用されていない。ダメですな。

というわけで、gmdate() を使っている関数を列挙してみると…フムン。ふふ…いいさ…やってやるさorz

  • import/blogger.php
  • import/blogware.php
  • import/rss.php
  • includes/dashboard.php
  • includes/template.php
  • includes/upgrade.php
  • options-general.php
  • wp-admin/admin-ajax.php
  • wp-admin/gears-manifest.php
  • wp-admin/import/blogger.php
  • wp-admin/import/blogware.php
  • wp-admin/import/rss.php
  • wp-admin/includes/dashboard.php
  • wp-admin/includes/template.php
  • wp-admin/includes/upgrade.php
  • wp-admin/load-scripts.php
  • wp-admin/load-styles.php
  • wp-app.php
  • wp-content/plugins/ktai_style/tags.php
  • wp-content/plugins/post-gallery/thirdparty/phpthumb/phpThumb.php
  • wp-content/plugins/post-revisions/post-revisions.php
  • wp-content/plugins/wassup/lib/action.php
  • wp-content/plugins/wassup/lib/main.php
  • wp-content/plugins/wassup/lib/settings.php
  • wp-content/plugins/wassup/wassup.php
  • wp-content/plugins/wp-amazon/wp-amazon-plugin.php
  • wp-content/plugins/wp-cache/wp-cache-phase2.php
  • wp-content/themes/wp.vicuna.ext/functions.php
  • wp-includes/class-simplepie.php
  • wp-includes/classes.php
  • wp-includes/formatting.php
  • wp-includes/functions.php
  • wp-includes/general-template.php
  • wp-includes/js/tinymce/plugins/spellchecker/rpc.php
  • wp-includes/js/tinymce/tiny_mce_config.php
  • wp-includes/js/tinymce/wp-tinymce.php
  • wp-includes/link-template.php
  • wp-includes/post.php
  • wp-includes/registration.php
  • wp-links-opml.php
  • wp-mail.php
  • xmlrpc.php

一応野良ビルドのほうも試してみる。phpinfo() から適当にオプションをひっこぬいて…と。

./configure  '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--with-apxs2=/usr/sbin/apxs' '--with-ldap=/usr' '--with-kerberos=/usr' '--enable-cli' '--with-zlib-dir=/usr' '--enable-trans-sid' '--with-libxml' '--enable-exif' '--enable-ftp' '--enable-mbstring' '--enable-mbregex' '--enable-dbx' '--enable-sockets' '--with-iodbc=/usr' '--with-curl=/usr' '--with-config-file-path=/etc' '--sysconfdir=/private/etc' '--with-mysql-sock=/tmp/mysql' '--with-mysqli=/usr/local/mysql/bin/mysql_config' '--with-mysql=/usr/local/mysql' '--with-openssl' '--with-xmlrpc' '--with-xsl=/usr' '--without-pear'

…面倒。やはり駄目か。

Amazon の Product Advertising API に対応してみた

amsearch

WordPress で利用していた Amazon Reloaded の代わりを作成するべく調査。適当にRubyでライブラリを漁ってみると、Yoosee さんのAmazon Product Advertising API を Ruby から使うがひっかかったので読んでみる。これならば今回の目的に合いそうだ。

することは単純

  1. Amazonの検索フォーム
  2. 検索結果を中サイズの画像と、アフィリエイトリンクで出す
  3. リンクからSEO用の書名部分を削る
  4. できたものを、コピー&貼り付けしやすいように textarea 要素で表示する

70行程で目的のものが完成。ほとんどの部分は、ベタでHTMLを埋めこんだ(今回は自家用かつ小規模なのでこれで充分)行数。

うむ、これならば使えそうだ。

Amazon の Product Advertising API に挑戦してみた

8/15から、Amazon の検索結果を外部から使うAPIが、サービスの秘密鍵を取らないと利用できなくなる。

仕方がないので、まずは Amazon のアフィリエイトのページから、API のキーを取得しようとしてみる。うぇ、これは米国 Amazon で取得だからアカウントが別なのか。別ページに日本語で逐次解説が用意されていなかったら、投げだしていたな。そんなこんなで Access Key ID と Secret Access Key を取得。

WordPress で現在利用しているのはAmazon Reloaded for WordPress。しかし、これは最新のAPI変更に対応していない。仕方がないので他に適当に数個試してみるも、使い勝手が良いものがなかなか無いし、そもそもAPIに対応していないものばかり。

wp-amazon (Amazonリンク生成)も試してみたけれども、何故か検索結果が出ない。

またか、また作るしかないのか。そりゃ、やろうと思えばできるけどねえ。面倒な。

しばらくはテキストのみでAmazonのページで一々リンク生成するしかないか。と思って試してみたら、1×1 のウェブバグ画像が漏れなくついてくる罠。なんだこの行儀の悪いものは。誰か私に素直に画像とリンクを張りつけさせてくれ。

フォト蔵用俺ツール作成

Photozou

使っていたサービスがエラーしか返さないようになったので、さくっと作ってみる。要求仕様はこれ以上にない位明確なので、設計も実に明快。

横240pxのサムネイル画像と、元ファイル本体へのリンクを作るだけのものを Ruby の cgi, xmlsimple あたりででっちあげて終了。

これで写真がとりあえず復活。

ソースコードは短いのだが、セキュリティ対策を考えずに作った自家製ツールのため非公開とする。流石に職業柄抜けており少々の手間で治るとわかっているものをそのまま出すのは恥かしい。

シェルコード! シェルコード!

会社の上司Aの肝煎りで、一日部内で業務を止めてシェルコードに関する集中勉強会をする。

普段は Ollydbg ばかりで、Immunity Debuggerは初めて使ったが、DLL 内のトランポリン用命令の探索がさくっとできるのは便利そうだ。一々ダンプさせてgrepさせていたのが馬鹿のように思える。

そして、今はシェルコードですらインタラクティブ+ヴィジュアルで構築の時代なのか。昔ちまちまと禁止文字を考えながらやっていた時代は遠くなったものだ。まあ、それでも色々と手法は必要なわけで、初心者がすると大変なわけだが…。

知っている知識の実践と確認という点があるとはいえ、色々とためになる時間だった。

Home > Tags > プログラミング

Return to page top

12