Home > Tags > プログラミング

プログラミング

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させていたのが馬鹿のように思える。

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

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

Macでは「何回も何回も観てニヤニヤ」以外に何がバレるのか

高木浩光@自宅の日記 – Macでは「何回も何回も観てニヤニヤ」がバレる

mdls でファイルを開いた日付の一覧が見えるというので、他にはどんなものが見えるのかを調べてみた。

「Mac OS X システム管理」によると、属性の本体は各ボリュームの .Spotlight-V100 にある。わざわざインデックスを作りなおさせなくても、このファイルさえどうにかすればいいように見える。

ただ、内容的にかなり複雑なようなので変更は mdutil(1) を介せと同書にあった。mdutils を使うと、# mdutil -E / でインデックスの削除&再作成となる等いくつかの操作ができるようだ。

指定できる属性は、Apple の Spotlight Metadata Attributesに詳しい。

共通部分(Common Metadata Attribute Keys)だけでもこれだけあるので、本気で調べれば色々と見つかりそうだ。日付関連だけでも kMDItemAttributeChangeDate(最終変更日), kMDItemContentCreationDate(作成日), kMDItemContentModificationDate(変更日), kMDItemDueDate(到着日?不明), kMDItemLastUsedDate(最終利用日)とある。

  • kMDItemAttributeChangeDate
  • kMDItemAudiences
  • kMDItemAuthors
  • kMDItemCity
  • kMDItemComment
  • kMDItemContactKeywords
  • kMDItemContentCreationDate
  • kMDItemContentModificationDate
  • kMDItemContentType
  • kMDItemContentTypeTree
  • kMDItemContributors
  • kMDItemCopyright
  • kMDItemCountry
  • kMDItemCoverage
  • kMDItemCreator
  • kMDItemDescription
  • kMDItemDisplayName
  • kMDItemDueDate
  • kMDItemDurationSeconds
  • kMDItemEmailAddresses
  • kMDItemEncodingApplications
  • kMDItemFinderComment
  • kMDItemFonts
  • kMDItemHeadline
  • kMDItemIdentifier
  • kMDItemInstantMessageAddresses
  • kMDItemInstructions
  • kMDItemKeywords
  • kMDItemKind
  • kMDItemLanguages
  • kMDItemLastUsedDate
  • kMDItemNumberOfPages
  • kMDItemOrganizations
  • kMDItemPageHeight
  • kMDItemPageWidth
  • kMDItemPhoneNumbers
  • kMDItemProjects
  • kMDItemPublishers
  • kMDItemRecipients
  • kMDItemRights
  • kMDItemSecurityMethod
  • kMDItemStarRating
  • kMDItemStateOrProvince
  • kMDItemTextContent
  • kMDItemTitle
  • kMDItemVersion
  • kMDItemWhereFroms

kMDItemUsedDate が無いのは、何故だろう。Xcode 3.0 リファレンスマニュアルで MDItem Class を見ても無かった。謎だ。

OpenSocial@mixi

mixi Developer Center (ミクシィ デベロッパーセンター)

mixi がmixiアプリという名前でOpenSocial対応したとのことなので、試そうとしてみる。どうやら、専用に http://platform001.mixi.jp/ というサイトがあるので、そこに登録&利用する形態らしい。アクセスには別途の登録が必要なので、通常利用の人に利用してもらえるわけではないわけだ。ついでに言えば、goo と比べて若干API側で制限があるらしい。

というわけで、一気に気力が減退しつつも、OpenSocial の API と mixi 提供のサンプルを見比べて色々考えてみる。

アイドレスがらみで色々できると面白そうだなとは考えたのだが、文殊から取れるデータが、検索まではできそうだが国名が無かったり性質上個人ページに誘導できそうにない、などで若干利用するには難しい。藩国個々のページは多彩すぎてフォローしきれない。

おまけに最大の問題として、現在はまだ敷居が高いので対象層に使われない。フィードバックを受けることがなければその場の一発屋で終わる。

まあ、そういうわけで今回はほとんど調べただけ。

Ruby Gems の罠

仕事で久しぶりに CGI を組もうとして、gems の罠にはまる。

require ‘dbi’ した時だけエラーになると思ったら、gems で入れたものは rubygems を require してからでないと使えないとは。普通にコマンドラインだと何なく実行していたので、無断に半日程はまってしまった。

WordPress をキャッシュつきのまま iPhone/iPod touch 対応させる

p2ex を iPod touch で見てみると、きちんと対応しており、メニュー画面からして対応したものになってくれる。内容も、きちんとタップで引用箇所が見えたり、外部を別ウィンドウで開いたりで、なかなかに見やすくてGOOD。

勢いで、WordPress の方も Ktai Style (携帯対応プラグイン)WPtouchを入れて、モバイル対応にする。Ktai Styleは意図的にiPhone非対応なため、iPhone/iPod touch 用にわざわざ別に入れている。

実際に閲覧してみると、WP-Cache が効いてしまい PC 用の画面のままでうまく見えなかったので、Ktai Style のサイトにあるものを参考に、wp-content/wp-cache-config.php を編集し、$cache_rejected_uri の前にキャッシュ無視判定を入れる。なお、WordPress の管理画面から WP-Cache の設定を変更すると消えてしまうので要注意。


$ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match('/(iPod|iPhone)/', $ua)) {
        $cache_enabled = false;
        $super_cache_enabled = false;
}

なお、User-Agent の判定は、iPhone/iPod touch のUAが以下になっているとの情報(複数の情報より)から適当にマッチさせている。

Mozilla/5.0 (iPhone; U; CPU like Mac OS X; ja-jp) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A110a Safari/419.3
Mozilla/5.0 (iPod; U; CPU like Mac OS X; ja-jp) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3

Flickr の制限にひっかかった

無料アカウントでは表示するのが最近200枚までとの事なので、それ以上なら消すかプロアカウント($2/month)を買えということらしい。

Flickr を利用してきた理由は主に3つ。

  1. iPhoto から一括リサイズ/アップロードできる
  2. コメントをつけて alt や title に反映できる
  3. 画像だけサーバを分散することによるボトルネックと転送量の解消

まあ、どれもそんなにたいした理由ではないので、今迄のはそのままにして、今後は WordPress 本体の機能に戻してもいいかな。

と思って iPhoto 用の WordPress Upload Plugin を探してみたのだが、意外に無い。Photonは動かなかった。

妥協するとこんな感じかな。

  • export は自前でやる。リサイズも iPhoto で。
  • アップロードのみ自動化。
  • 貼り付けは今迄通り頑張る。

投稿プロトコルとして、RFC5023 に対応した AtomPub と、MT 等との互換性のある XML-RPC wp が使えるようだ。

…自作するしかないのか?

今回は全部手動でやったが、何故かウェブ上から表示画像がリサイズできなくて困る。しかもこれ、リサイズできたとしても表示画像の幅を変えているだけだから無駄なんだよねえ。はやくなんとかしないと。

Home > Tags > プログラミング

Return to page top

12