11.30.2009

思い立ったらすぐやってみる派。

Objective-CでWindowsアプリな回で予想したとおり、SDL試してみました。

MinGW向けのSDLライブラリを、公式サイトからゲット。

で、ここを参考にコードを書く。
しばらく触ってなかったせいか、SDLの流儀的なものをすっかり忘れている。
チュートリアルサイトのコードがないと書けないとか、一時期SDLに取り組んでたとは思えない低能っぷり。実に恥ずかしいな。

#import <SDL/SDL.h>
#import <stdio.h>
#import <objc/Object.h>

#define SCR_WIDTH 640
#define SCR_HEIGHT 480
#define SCR_BPP 32
#define CAPTION "SDL Hello"

SDL_Surface *gScreen;

@interface Game : Object
- (BOOL)Initialize;
- (void)End;
- (BOOL)PollEvent;
@end

@implementation Game
-(BOOL) Initialize {
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) return NO;

SDL_WM_SetCaption( CAPTION, NULL );
gScreen = SDL_SetVideoMode(
SCR_WIDTH,
SCR_HEIGHT,
SCR_BPP,
SDL_SWSURFACE);

SDL_ShowCursor( SDL_DISABLE );
return YES;
}

-(void) End {
SDL_Quit();
}

-(BOOL) PollEvent {
SDL_Event ev;
SDLKey *key;

while(SDL_PollEvent(&ev)) {
switch(ev.type) {
case SDL_QUIT:
return NO;
break;
case SDL_KEYDOWN: {
key = &(ev.key.keysym.sym);
if( *key == 22 ) {
return NO;
}
}
break;
}
}
return YES;
}
@end

int main(int argc, char* argv[])
{
id G = [Game new];

if( ![G Initialize] ) {
printf("Initialized fail.\n");
[G free];
return 1;
}

while( 1 ) {
if( ![G PollEvent] ) break;
}

[G End];
[Game free];
return 0;
}


全然Objective-Cっぽくないという。
まぁ、Objective-Cの機能を使ったコードが通るってことを実証したかったわけで。

最初、BOOL型をboolとして怒られ、YESをtrueやTRUEとして怒られ、NOをfalseやFALSEとして怒られた。
文化の違いってやつだと思う。Booleanなのに、真偽じゃなく、YES/NOって……。
(どうでもいいけど、Accessだったっけか?YES/NO型ってのがあるの。)

ともかく、ざっくりと上記のようなコードを書き上げて、

gcc [filename] -lobjc -lmingw32 -lSDLmain -lSDL -mwindows

とかしてコンパイルしてやる。
もちろん、手元では-lobjcじゃ通らないから、直接ライブラリファイルを指定してるわけだけど、パスを書くのが面倒だから、ここでは-lobjcで代用しとく。

当然?とでも言うかのように、エラーも警告無くコンパイルが通って、exeファイルが生成される。
必要なDLLがそろってるディレクトリに移動させて、起動してやると、図のようなウィンドウが出た。



うん。OKなんじゃない?
もっとうまく、オブジェクト指向なコーディングが出来れば、なお使いやすそう。
お遊びに使うには十分すぎる性能を持っていると言えるカモね。

11.28.2009

Objective-CでWindowsアプリを作ってみる。

そんなわけで、Objective-Cな環境の導入に成功したので、

#import <windows.h>
#import <objc/Object.h>

@interface SayHello : Object
- (void) Hello;
@end;

@implementation SayHello
- (void) Hello
{
MessageBox( NULL, "HELLO WORLD", "MESSAGE", MB_OK);
}
@end;

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
id obj = [SayHello new];
[ obj Hello ];
[ obj free];
return 0;
}

とかいうプログラムをこさえてみた。

要はCと親和性が良いというなら、Cから使えるWin32APIだって呼べるんじゃねぇの?という発想。

コマンドラインから
$gcc objcwin.m C:\mingw\lib\gcc\mingw32\4.4.0\libobjc.a -mwindows

とかして、-mwindowsオプションをつけてMinGW-gccでコンパイルをかけてやると、アッサリ通った。
MessageBox程度だけど、すんなり行けちゃった事にオドロキを覚えた。

この調子なら、SDLあたりもいけそうかな。また今度試してみようと思う。
で、せっかくならこれを生かしてマルチプラットフォームなGUIアプリでも組めたら、さぞ面白いだろうと思ったんだけど、Cで実装されてるGUIライブラリで有名なものって、私の大嫌いなGtk+ぐらいしかないのね。

う~ん。となると、Objective-Cはお遊び用かなぁ。
C++と混在できれば、wxWidgetとか使えるんだろうけどな。
その辺も調べてみようと思いまつ。

11.22.2009

MinGWでObjective-Cを試してみる。

ちょっくらObjective-Cに興味があって、前々から調べていたんだけれども、この休みに……と思って、MinGW環境でObjective-Cを試してみた。

なんでわざわざMinGWを使う買って言うと、Linux環境では既に成功しているから。
せっかくだし、Windows環境でも動いたら嬉しいなと思ったのだ。

まずはMinGWの公式サイトにいって、アーカイブをもらってくる。
ここで注意しないといけないのは、普通に配ってるインストーラを使っての導入だと、gccのバージョンが3.x系になってしまうこと。
だから、Getting Startedにあるようにマニュアルインストールを行う。

リストに上がっている
binutils
mingw-runtime (dev and dll)
w32api
Required runtime libraries for GCC (gmp, libiconv, MPFR and pthreads)
gcc-core (bin and dll)

のほか、

gcc-objc (bin and dll) for Objective C



mingw-gdb for debugger
mingw32-make for make
mingw-utils for MinGW Utilities

総勢15のファイルを取ってきて、C:\MinGWフォルダ以下に展開しておく。
解凍には7-zipというフリーソフトを用いた。スゲー便利。

で、起動用バッチファイルを用意。
環境変数を直接いじってもいいんだけれども、なんとなく今回はバッチファイルを使うことにした。
mingw.cmdとかいう名前で、C:\MinGW直下に保存。
内容は今のところ
@echo off
set PATH=%PATH%;C:\mingw\bin
set INCLUDE_PATH=C:\mingw\include;C:\mingw\lib\gcc\mingw32\4.4.0\include
set LIBRARY_PATH=C:\mingw\lib;C:\mingw\lib\gcc\mingw32\4.4.0
set LIBPATH=C:\mingw\lib;C:\mingw\lib\gcc\mingw32\4.4.0
set LD_LIBRARY_PATH=C:\mingw\lib;C:\mingw\lib\gcc\mingw32\4.4.0
set TEMP=C:\TMP
set TMP=C:\TMP
set LANG=C
cd C:\mingw\src
@echo on

な感じ。まだ試行錯誤中なので、今後変わる可能性大。
ちなみに、最後のcdコマンドは作業ディレクトリに移動するためのコマンド。
C:\workで作業するならそれに書き換えてあげると楽。

で、ここまで出来たら、デスクトップにコマンドプロンプトのショートカットを作って、プロパティから、リンク先を
%SystemRoot%\system32\cmd.exe /k "C:\mingw\mingw"

とかしてあげる。

これができたら、そのショートカットからコマンドプロンプトを起動して、
$ gcc --version

でgccのインストールを確認する。

次に、Objective-CでHello worldを書く。
例えばhello.mの内容を
#import < stdio.h >
#import < objc/object.h >

@interface Test : Object
- (void)Hello;
@end

@implementation Test
- (void)Hello {
 printf("Hello Objective-C World\n");
}
@end

int main() {
 id obj = [Test alloc];
 [obj Hello];
 
 return 0;
}

とかしてあげる。たぶん、allocしたのにfreeしてないとか、ツッコミどころはあるんだろうけど、ネットで適当に拾ってきたソースの改変かつコンパイルのテストなので、そこは目をつむっておく。

これができたら、先ほどのコマンドプロンプトに戻り
$ gcc -lobjc hello.m

とかする。通常は、これでうまくいくらしい。
通常はと書いたのは、ウチでは以下のエラーを吐いて、コンパイル(正確にはリンク)がコケてしまったからだ。

C:\TMP\cczsTv17.o:hello.m:(.text+0x24): undefined reference to `objc_msg_lookup_
super'
C:\TMP\cczsTv17.o:hello.m:(.text+0x69): undefined reference to `objc_get_class'
C:\TMP\cczsTv17.o:hello.m:(.text+0x7c): undefined reference to `objc_msg_lookup'

C:\TMP\cczsTv17.o:hello.m:(.text+0x9d): undefined reference to `objc_msg_lookup'

C:\TMP\cczsTv17.o:hello.m:(.text+0xc4): undefined reference to `objc_msg_lookup'

C:\TMP\cczsTv17.o:hello.m:(.text+0xe7): undefined reference to `objc_msg_lookup'

C:\TMP\cczsTv17.o:hello.m:(.text+0x112): undefined reference to `__objc_exec_cla
ss'
C:\TMP\cczsTv17.o:hello.m:(.data+0x140): undefined reference to `__objc_class_na
me_Object'
collect2: ld returned 1 exit status


ネットを探しても、さしたる情報は出てこない。
ldでコケてるのは間違いないから、LD_LIBRARY_PATHとかを環境変数に追加してみたものの、一向にエラーは消えない。

Linuxなら、/etc/ld.so.confに代表される、ldの設定ファイルいじるとか(そもそもLD_LIBRARY_PATHがあるのに通らないのが変なんだけど)できるけど、Windowsはよく分からないのでお手上げ状態。

で、結局解決策として
$ gcc hello.m C:\mingw\lib\gcc\mingw32\4.4.0\libobjc.a

という、直接ライブラリを指定してリンクさせる方法を取った。
たぶん、作法的には汚いやり方なんだろうけど、他に解決策が思いつかないのだから仕方ない。
どなたか、このldのエラーについて解決策を知っていたら、ぜひとも知らせて欲しいデス。切実に。

他に同じエラーで困っている人が居たら、一応の解決策として上記みたいなことができるよってことで、メモ代わりにエントリを挙げときます。

11.21.2009

地味~に便利。

模型はもっぱら筆塗り派の私。

でも、模型の筆って塗装厨転がっていったりして不便なんですよね。

鉛筆のように6角形にするだけで、だいぶ違うと思うのは私だけではあるまい。。。

そんな中、ビックカメラ池袋西口店で発見したこのツール。



高いモノでもないし、それなりに能率が上がればめっけもんかなぁ。。。
なんて思って買ってみたんですが、地味に便利です。コレ。

筆をホールドする部分はスプリングで出来ていて、小さい筆から大きい筆までホールド可能。
100円ショップで買った筆も、バッチリホールドしてくれます。

さらに、筆の柄の先端部分があたるトレイには、凸モールドが施してあって、スプリングの力が弱かったり、挟めないくらい細いモノ(例えば竹串とか)でも、アームの角度を調整してやれば、がっちりホールド出来ます。

クリップでの保持が難しいくせに持ち手が必要なパーツの乾燥なんかにも使えて良いです。
久しぶりに良い買い物をしました。

11.15.2009

我が家も地デ鹿!!

ついに我が家も地デ鹿。
テレビ神奈川(TVK)が映らなくなったのが唯一の心残りか。
ケーブルテレビ会社に投書しようかしらん……。

これに合わせて、Wiiを大画面で、たのしくプレイするべく、デジタル出力対応のケーブルを購入する予定。
どのぐらい綺麗に映るのかなぁ?

11.09.2009

ノーベル賞学者は、言うことが違う。

ノーベル物理学賞受賞者である南部先生が、豊中市の市長を表敬訪問したときに語った言葉。

南部氏は子どもたちの理科離れについて「日ごろ、子どもたちと接触がないのでよく分からないが、高等教育では生徒のレベルはものすごく高く、まったく心配していない」と言及。また「ものを知ることより好むことが、好むことより楽しむことが大事。大きな夢を持って暮らしてほしい」
引用元の記事

そういえば、我が研究室の先生も、「イギリスでは、微分積分は大学に入ってから学ぶもの」「日本の高等学校における数学/理科教育は世界でもトップクラス」「世界学力テストなんて当てにならない」「君たちはもっと自信をもっていい」などとおっしゃていたのを、ふと思い出した。

そして、小学校の時に担任の先生から、「考えなくていいから、楽しんで理科をやりなさい」と言われたのを思い出した。
思い返してみれば、この時触れた理科が楽しくて、私はこういう方面に来たんだなぁと。
今更ながら感謝しなければいけないと思った。

近所のちびっ子達は、理科を楽しんでいるのかなぁ?

11.06.2009

買ってしまったとさ。

野次馬根性丸出しで、池袋にオープンしたヤマダ電機LABI1日本総本店へでかけてきました。

感想から言うと、「ただ広いだけ」。
敷地は広いんだろうけど、商品数ではその敷地面積を生かし切れておらず、無駄に広い通路と工夫されていない商品陳列が目に付きました。

また、近所の家電量販店で感じられるワクワク感が少なく、だだっ広い売り場に、ものが並べてあるだけという、「倉庫で買い物している気分」を味わうには最高じゃないでしょうか。

2万人近くが並んだそうですが、そんな価値は全くない店舗だと思います。
田舎のホームセンターが都会に出てきちゃって、場違い感をバリバリ演出しているような、そんな印象です。

また、今日オープンだというドリーム館なる旧池袋LABIにも行ってきましたが、こちらは更にひどい。

目と鼻の先にある日本総本店と同じものを扱っていたり、日本総本店と同じく、買い物のしやすさやワクワク感を考えているとは到底思えない商品陳列。

ゲームショウのような雰囲気に演出されたプレイステーションコーナーの脇に、こじんまりと何の演出もなく配置されたエックスボックスコーナーという、ひどいミスマッチ。

無駄に広い体験プレイコーナー。
ガンダムフロアの充実度こそ周辺の電気店以上でしたが、「それだけ」の印象。
もっと「模型・ホビー」の充実を願っていた私としては、ガッカリせざるを得ませんでした。

総じて無駄に広く、スペースを生かし切れていないことと、こちらも無駄に多く手の余っている店員の多さが目立ちました。
ゲーム体験コーナーに、客の整理目的以外でいちいち店員をおく必要は無いでしょう。

で、結局ヤマダ電機では何も買えなかった(買わなかった)ので、帰りに池袋トイザらスに寄ったところ、なんとガンプラ付きカップ麺を発見。

私の住んでいる近所では売れてしまっているのかそもそも入荷していないのか分からないものの、まったく見かけなかった商品です。

きっと、これを逃したら買えないだろうという気持ちが先んじてしまい、4つも買っちゃいました(*´ω`)



徐々に秋葉原的な空気になって来たなと感じる池袋。
脱オタク化を果たそうとする秋葉原の受け皿となるのでしょうか?

zenwalk、ネットワークの設定

Slackware系ディストリビューションなんて、まともに使うのPlamo Linux3.x以来だから、重要なこともそうでないこともすっかり忘れてしまっていた(笑)

とりあえず、今日やったことをメモ

・ coLinuxを最新のdevel版に更新。カーネルが新しくなりましたが、zenwalkの動作には問題なし。
・ Zenwalkでネットワークの設定。
ネームサーバは相変わらず/etc/resolv.confにあって迷わなかったんだけれども、Debian系ではおなじみの/etc/interfacesがどこにあるか分からず、途方に暮れる。
結果、/etc/rc.d/rc.inet1.confなるファイルがその役割を担っていることがわかった。
でも、普通はnetconfigなるツールで設定してしまうみたい。
すごく楽に設定できた。
・すっかり忘れていたことだけど、LinuxとTAPは同じサブネットに配置しないとダメ。

こんなところか。
若干疲れてるから、書いてることがメチャメチャなのはご愛敬。

【追記】評判の良い6.2のcore isoイメージを見つけたので、それを入れてみることにした。

11.04.2009

Zenwalk入れてみた。

先日Ubu子さんがお亡くなりになったことで、原因究明して環境の復旧を目論むのも面倒なので、いっそ新しいディストリビューションを入れてみることにした。

白羽の矢を立てたのがZenwalk。
コンパクトでスマートなディストリビューションとして知られていて、netpkgなる独自のパッケージ管理ツールを有する、Slackwareベースのディストリビューションだ。(なんかDistroFreakっぽくなったけど、別にディストリビューションの説明するわけじゃないよ)

Slackwareなら、確かcoLinuxのwikiに導入方法が書いてあったんで、それをベースにしたコイツのcoLinux上への導入も手軽なんじゃないかと考えたワケ。

でも、ネット上を探してみると、より手軽に導入できそうな方法を発見。
参考にした(というか、まんま方法を拝借した)のはココ

2007年と若干古い記事だけど、今リリースされているdevel版でも、そのまま通用しました。
(但し、試したのはkernel 2.6.22.18版のほうで、kernel 2.6.25.20版でもうまく行くかは未確認。近々アップデートする予定なので、詳しくはその時にでも。)

用意したのは
・Zenwalk core 5.2のISOイメージ。
(6.2が最新だけど、Coreイメージは公開されていなかったので、ダウンロードサイズの関係からこちらをチョイス。別に6.2のイメージを使っても問題ない)
・QEMU for Windows+ Kqemu for windows(イメージを作るのに必要)
・dd(参考にしたページではCygwinのを使っているけど、私はWindows上で特別な手続きなしに使える、ここのを愛用している。)
・空のイメージファイル。(参考にしたページでは、fsutilあたりを使って作ってるけど、ここから適当なサイズ(3GBぐらい?)のものと、スワップイメージ用のファイル(1GB以下)を取ってくるのが楽。ちなみに、今回は前回使った10GBのルートイメージをそのまま使い回すので、なにも持ってきていない。)

以下、具体的な作業手順。
1.作業ディレクトリとしてC:\zenwalkを用意して、zenwalkのISOイメージと空のイメージファイルを放り込む。
2.QEMuをC:\qemuにインストールしておく。Kqemuはデフォルトのまま、適当にインストールしておく。
3.ddは、パスの通ったところに配置。
4.コマンドプロンプトを起動し、qemuディレクトリにcdした後、

qemu.exe -hda c:¥zenwalk¥rootfs -hdb c:¥zenwalk¥swap -cdrom c:¥zenwalk¥zenwalk-core-5.2.iso -m 128 -boot d -L .

でqemuを起動。

これで、インストーラが立ち上がる。

5.キーマップを選択。私はUS配列なので、それをチョイス。
6.パーティショニングを実施。sda1がrootfs、sda2がswapに認識されていたので、それぞれパーティションを切ってやる。変に分割せず、容量をまるまる全部割り当てると、トラブルが少ない。パーティション分割したいときは、別のイメージファイルを用意してやるといい。
7.インストール開始。フォーマットはext2,ext3,reiserfsのいずれか。それ以外だと、coLinuxでは起動できないので注意。
8.放置。終わるまで放置。小一時間かかった。(ブートローダをMBRに入れるのを忘れないようにする)
9.終わったら、いったんqemuを終了し、改めて

qemu.exe -hda c:¥zenwalk¥rootfs -hdb c:¥zenwalk¥swap -L .

として再起動する。(ウィザードに従っての再起動は失敗するので、この方法を取らざるを得ない)
10.ウィザードに従って、インストール後の基本的な設定を済ませてやる。
11.rootでログインし

cd /dev
for i in 0 1 2 3 4 5 6 7 8 9
>do
>mknod cobd$i b 117 $i
>done

としてcobdデバイス(coLinuxの使うスペシャルデバイス)を作成する。
(参考にしたサイトと違い、0から作っていることに注意)
12./etc/fstabをviなどで開き

/dev/cobd0 / ext3 defaults,noatime 1 1
/dev/cobd1 swap swap defaults 0 0
proc /proc proc defaults 0 0

とかする。コレをしないと、起動できないので注意。
13.shutdown -h nowとかしてシステムを終わらせ、qemuを閉じる
14.Windows上に戻り、C:\zenwalkディレクトリに移動。
15.例えば、coLinuxがC:\coLinuxディレクトリにあるとして、そこにイメージを吐き出すには

dd if=C:\zenwalk\rootfs of=C:\coLinux\rootfs bs=512 skip=63

などとする。63ブロックをスキップするのは、MBRを読み飛ばすため。
16.これでC:\coLinuxディレクトリに目的のイメージができあがるので、それを使ってcoLinuxを起動する。
あとは煮るなり焼くなりお好きにどうぞ。

おそらく、この方法を用いればほとんどすべてのディストリビューションをcoLinux上で動かせるようにすることが可能だと思う。

いやあ。便利な世の中になったもんだ。