Home > Tags > プログラミング

プログラミング

意図的に手を出さないのは難しい

最近、設計レビューなどをする機会があるのだが、勘所をわかってもらうのが中々に難しい。

高次設計なのに、やけに具体的に書きすぎてしまったり、酷いといきなりchar*などが飛び出して実装を意識しすぎたり。とにかく目的を飛ばして手順だけ書く感じ。「何故その処理なのか」が無い。

そりゃあ実装寸前まで考えてからやれる規模ですし、私もそうしてますけれども、ソフトウェア工学的にはあくまで高次なわけで…。実装フリーな抽象化した記述というのが、難しい所なのだろう。

自分で手を出せる規模ではないので、レビューに徹するしかないのが良いのか悪いのか。こんな所で趣味や大学での余分な履修が役にたっています。余技程度とはいえ、好みのままにあれやこれやに手を出しておいて本当によかった。

プログラミング言語 Ruby が JIS 規格に

プログラム言語RubyのJIS規格(JIS X 3017)制定について

RubySpecとのからみはどうなっているのだろう。

ZenCoding

EmacsWiki: Zen Codingから、Carbon EmacsにZenCodingを導入してみる。

簡単に言えばHTMLをとことん省略記法で書こうというもの。ただし、難点として少なくともEmacs版(非公式)は行単位なので、inlineで書くのには役に立たない。

色々なエディタに組込めるようなので、マークアップ効率化 – zen-codingでコーディングを倍速にあたりを見るとわかりやすいかも。

Hadoopに興味はあるんだけど

オープンソースカンファレンスのHadoop講演資料を紹介します (Yahoo! JAPAN Tech Blog)

上司がいじっているのを見て、気になっている技術の一つ。基本的な仕組みはMap/Reduceということで理解はできるのだが、いざ実際に使おうとするとどういうパターンで使えばいいのかわからず、準備するのが面倒そうというのもあって手を出していない。

作っているとSQLならばこんな風[1]に、Key-Value系ならこんな風[2]に、というのはある程度見えたので、これも実例を試してみればいいのだろう。今一適当な題材が決まらないのが難点だ。

要するに即時性なし、大規模、分散可能なデータであればいいんだよな。攻撃パケットを適当に投げて、傾向分析でもすればいいのかしらん。…やっぱり使ってみないと勘所がよくわからなさそうだ。バッチで使ってもいいので、適当にブラウザゲームあたりをでっちあげて解析するのもありか。マッチメーカー系とか自分でもしてみたいし。

何にせよ、ある程度処理オーダーの壁を超えられるので、少しでも手を出しておきたい技術ではある。

…とりあえず、どれだけ資源を費せば最低限できそうなのかから調べてみるか。

  1. SQLを通じてDB直や、ORマッピングを介したデータ操作。 []
  2. Core DataなどのCocoa風味。あるいは試していないがmemcached系? []

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'

…面倒。やはり駄目か。

Home > Tags > プログラミング

Return to page top

123