libqrencode を使用したサンプル QR コード作成ツール QRURL と静的ライブラリ libqrencode.a を公開。

OS X Mountain Lion が 7月25日(米国時間)に発売されました。最初のダウンロードは混むので、一日置いてから Mac App Store でダウンロードしました。何の問題もなく OS X Lion から OS X Mountain Lion アップデートできました。後、念のためクリーンインストールしようか、悩んでいます。

また、北米版プチコンmkII : Petit Computer が 2012年7月19日に発売されました。

Nintendo.com – Petit Computer – Game Info
http://www.nintendo.com/games/detail/_YpH-64pY4G4_tAy1wrKVecHp4pmWSzw
Top Page - Petit Computer
http://www.petitcomputer.com/
スマイルブーム.com
http://smileboom.com/blog/

上のブログによると QR コードも共通仕様なので、プチコンmkII 版のプログラムは、北米版 Petit Computer で遊べるみたいです。(一部、TALK 文などが対応していません。) 私の公開しているプログラムも英語の解説を付けたいのですが、英語が苦手なので無理ですね。ホームページのアクセス解析によると海外のアクセス数が増加しています。また、拙作プチコンmkII 版マインスイーパのリンクを紹介した海外サイトもあります。

話は変わって、以前から QR コードの作成プログラムに興味がありました。

ニンテンドーDSi ウェア ‘プチコンmkII’ は、ホームページ上で SDカードに保存したファイルを QR コード変換ツールを使って QR コードに変換します。

QR コード変換ツールを

PTCUtilities v0.7.3: ROBOMIC(ブログ)
http://micono.cocolog-nifty.com/blog/2012/05/ptcutilities--5.html
PTCUtilites
http://micutil.com/ptcutilities/top.html

上記 URL で公開した人がいます。

Mac 版と Windows 版が作成されていたので、どんなツールで作成されていたのか興味がありました。

実行ファイル PTCUtilities をマウスで右クリック、パッケージの内容を表示を選ぶと

PTCUtilitiesMac/PTCUtilities.app/Contents/MacOS/rbframework.dylib
PTCUtilitiesMac/PTCUtilities.app/Contents/Frameworks/MBS Real Studio Cocoa Plugin.rbx_16.dylib

と表示されます。rb の接頭語から、私が Mac OS 9 時代に使用していた REALbasic を思い出しました。Wikipedia で検索してみると

REALbasic - Wikipedia
http://ja.wikipedia.org/wiki/REALbasic
REALbasicの現状

今は REAL Studio という名称になって発売されているようです。

QR コード作成ツールを作ってみたいと思い、QR コードのライブラリを Google で検索してみました。

libqrencode
http://fukuchi.org/works/qrencode/index.html.ja

上記 URL で公開されている C のライブラリが良さそうです。開発環境をなるべくデフォルトの状態にしたいので、ライブラリのビルドは、Parallels DesktopOS X Lion 上でおこないました。

上記 URL から、ファイル qrencode-3.3.1.tar.gz をダウンロードし、ダブルクリックすると qrencode-3.3.1 という名前のフォルダが作成されます。ターミナルでそのフォルダに移動し、./configure を実行すると pkg-config のバージョンが古いというエラーが出ます。

それで Homebrew を使って

brew install pkg-config

最新の pkg-config をインストールしました。

./configure
make

で問題なくビルドに成功しました。しかし、静的ライブラリ libqrencode.a を作ってくれません。また、ビルドして作成される実行ファイル qrencode は、png ライブラリを使用しています。しかし、libqrencode ライブラリ自体は、どのライブラリにも依存していませんでした。

それで Xcode で無理やり、静的ライブラリを作成することにしました。png ライブラリを使用している qrenc.c 以外の拡張子が C のファイルと config.h 含むヘッダファイルをプロジェクトに追加し、C のファイルのヘッダ読み込み

#if HAVE_CONFIG_H
# include "config.h"
#endif

の箇所から

#if HAVE_CONFIG_H
#endif

を削除し、ビルドしてみました。警告が表示されますが、ビルドに成功しました。

簡単な QR コード作成ツール QRURL と静的ライブラリ libqrencode.a を一緒に公開します。

QRURL
libqrencode.a
http://kyoshiaki.sakura.ne.jp/osx/Sample/qrcode.zip

ここで、振り出しに戻るのですが、

リンク集 - プチコンまとめWiki
http://wiki.hosiken.jp/petc/?Link
PTC2QR

上記 URL で Ruby のソース付きQR コード変換ツール PTC2QR が公開されています。

ocra-1.2.0 Documentation
http://ocra.rubyforge.org/

初めて知ったのですが、Ruby のソースファイルから Windows 実行ファイルを作るプログラム (ocra 上記 URL 参照) があるんですね!

PTC2QR のソースを Ruby から Objective-C に書き換えてみました。何とか動作するものができました。著作権上、公開は無理なので、スクリーンショットだけ載せておきます。

WWDC、E3、Objective-C のブロックと変数

WWDC 2012 基調講演が、11日午前10時 (日本時間、翌12日午前2時) に開催されました。Mac Book Air / Pro、iOS 6、OS X Mountain Lion の発表がありましたが、一番の関心は、Retina ディスプレイ MacBook Pro の発表です。iPadiPhone アプリ開発のために、iMac 27 インチを使用してきましたが、Retina ディスプレイ MacBook Pro でも問題なさそうです。所有してる iMac (Mid 2010) 27 インチは、Thunderbolt、USB 3.0 に対応していないので、購入時期も迫ってきています。Retina ディスプレイ iMac が発表されていたら、間違いなく購入していました。もう一年、我慢しようか、悩みどころです。

基調講演は、Apple のサイト

Apple - Apple Events - Apple Special Event March 2012
http://events.apple.com.edgesuite.net/123pibhargjknawdconwecown/event/index.html

で見れます。Podcast でも配信されています。

iTunes - Podcast - Apple Inc.「Apple Keynotes」
http://itunes.apple.com/jp/podcast/apple-keynotes/id275834665
iTunes - Podcast - Apple Inc.「Apple Keynotes (1080p)」
http://itunes.apple.com/jp/podcast/apple-keynotes-1080p/id509310064
iTunes - Podcast - Apple Inc.「Apple Keynotes (HD)」
http://itunes.apple.com/jp/podcast/apple-keynotes-hd/id470664050

1080p、HD 版も配信されています。

E3 も開催されていました。

E3 2012 - GameSpot.com
http://e3.gamespot.com/

上のサイト、左上の赤の背景に白色の文字で E3 2012 と表示されている部分をクリックし、Press Conferences を選ぶとそれぞれの基調講演を見ることができます。また、任天堂の基調講演は

任天堂 E3 2012情報 | E3レポート
http://www.nintendo.co.jp/n10/e3_2012/report/index.html

でも見れます。

以前、[id:KYoshiaki:20120429] iCloud プログラミングで書いた

Creating iOS 5 Apps: Develop and Design

Creating iOS 5 Apps: Develop and Design

[Kindle 版] と復習のために買った

Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)

Objective-C Programming: The Big Nerd Ranch Guide (Big Nerd Ranch Guides)

[Kindle 版] を読み終えました。

Blocks とスコープ外の変数について、理解が深まりました。

typedef void (^ArrayEnumerationBlock)(id, NSUInteger, BOOL *);
ArrayEnumerationBlock devowelizer;
NSMutableArray *newStrings = [NSMutableArray array];
devowelizer = ^(id string, NSUInteger i, BOOL *stop) {
NSMutableString *newString = [NSMutableString stringWithString:string];
for (NSString *s in vowels) {
NSRange fullRange = NSMakeRange(0, [newString length]);
[newString replaceOccurrencesOfString:s withString:@"" options:NSCaseInsensitiveSearch range:fullRange];
}
[newStrings addObject:newString];
};
[oldStrings enumerateObjectsUsingBlock:devowelizer];

上のように、block 内で

[newStrings addObject:newString];

とスコープ外の変数 newStrings の内容を変更することができます。これは、メソッドを呼んでいるからです。プロパティで代入する場合も、同じです。

typedef void (^SampleBlock)();
__block NSString *two = [NSString stringWithString:@"two"];
SampleBlock sampleBlock;
FooClass *fooClass;
fooClass = [[FooClass alloc] init];
sampleBlock = ^() {
NSString *three = [NSString stringWithString:@"three"];
fooClass.foo = [NSString stringWithString:@"Orange"];
two = three;
changeValue(8);
};
sampleBlock();

ブロック内で

fooClass.foo = [NSString stringWithString:@"Orange"];

と代入することができます。ここでは、説明しやすいように

self.foo = bar;

とします。

実際には、ドット演算子を使ったプロパティは

The Objective-C Programming Language: Declared Properties
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1
▼ Declared Properties
▼ Property Declaration and Implementation
Property Declaration
Key-Value Coding Programming Guide: Key-Value Coding Fundamentals
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.html#//apple_ref/doc/uid/20002170-BA
▼Key-Value Coding Fundamentals
Dot Syntax and Key-Value Coding

を利用しているので

[self setFoo:bar];

または

[self setValue:bar forKey:@"foo"];

と同一です。故にメソッドを使っているので、block 内で代入できます。

foo = bar;

は、block 内で使えないので注意してください。foo が Objective-C のオブジェクト、または int、double などのスカラー型いずれの場合でも、__block を宣言しない限り、ブロック内では代入できません。

sample(bar);

上のような C の関数は、ブロック内で使えます。

結局、Cの関数、Objective-C の method は、ブロック内で使うことができます。また、プロパティを使ったドット表記も、実際には method を使っているので、ブロック内で使えます。ブロック内でスコープ外の変数に = (イコール) を使った代入は、__block を宣言しないと使えません。

サンプルとして zip ファイルを公開します。

VowelMovement.zip
http://kyoshiaki.sakura.ne.jp/osx/Sample/VowelMovement.zip
Creating iOS 5 Apps: Develop and Design

Creating iOS 5 Apps: Develop and Design

[Kindle 版] で見つけた面白い Blocks の使い方のサンプルも下記 URL で公開します。

Weights.zip
http://kyoshiaki.sakura.ne.jp/osx/Sample/Weights.zip

サンプルは、[ Creating iOS 5 Apps: Develop and Design ] [Kindle 版] のソースから、面白い使い方の箇所を抜き出して修正したものです。

//
//	Weights.m
//
- (void)processWeightEntryUsingBlock:(void (^)(NSNumber*)) block
{
NSLog(@"Weights.entries: %@", self.entries);
for (NSNumber* entry in self.entries) {
block(entry);
}
}
//
//	States.m
//
-(void)doStates
{
NSMutableArray *array;
array = [NSMutableArray array];
[self.weights processWeightEntryUsingBlock:^(NSNumber *number) {
int value;
NSNumber *num;
value = [number intValue];
num = [NSNumber numberWithInt:value*2];
[array addObject:num];
}];
NSLog(@"processWeightEntryUsingBlock: %@", array);
}

ニンテンドーDSi/DSi LL/3DS の DSi ウェア 'プチコンmkII' 上で動作する Neko version 1.0.0 の QR コード公開

ニンテンドーDSi/DSi LL/3DSDSi ウェア ‘プチコンmkII’ 上で動作する Neko version 1.0.0 の QR コードを下記 URL

プチコンmkII 版 Neko Version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/petitcom.html#neko100

で公開します。

いろいろな OS に移植されている Neko

Neko (ソフトウェア) - Wikipedia
http://ja.wikipedia.org/wiki/Neko_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)

を ‘プチコンmkII’ 上で動作するようにプログラミングしたものです。

簡単に言うとペンでタッチした方向に、猫が駆け回るプログラムです。

画像データは、Zaurus の BASIC ‘9B’ 上で動作する拙作 Neko Ver 1.0 のデータを

DSPCBMP_153
プチコン MkII プログラム
http://www.aogondo.net/PetitCom/

DSPCBMP を使って CHR データに変換しました。このプログラムがなければ、こんなに簡単に移植できなかったと思います。

また、

UX_CHRED
プチコンmkII うpろだ | uploader.jp
http://ux.getuploader.com/petitcom_mkII/index/2/date/desc

UX_CHRED を使って画像を修正しました。

上の画像は CHR データを UX_CHRED で表示した状態です。UX_CHRED は、SPRITE や BG 用のキャラ画像をつくる純正の CHRED にはない高機能なツールです。

プログラムの変数、SPMAXを書き換えることで猫の数を変更できますが、猫の衝突処理や実行中に猫の数を変更できるようにすると面白いかもしれません。