トップ 最新 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2004-12-01 あらまあ [長年日記]

% [FreeBSD] vim と 5.3R 問題のまとめとか

結局、例の問題は mblen() の仕様が変わって、半端なバイト片を与えてエラーになった時に、内部状態を保持するようになってしまったのが直接の原因。

…って言うか、今さらだけどこんなメールを発見。おっかしいな、ports-jp は購読してるんだけど、まったく記憶に無い(爆

それにしても、

というのも間違っていて、半端なバイト列を渡したときは

In this case, mblen()'s internal conversion state is

undefined.

の状態になってしまうからか、「-1」と「1」とが交互に返されるようです。

[[ports-jp 14673]より引用]

% ってとこまで来てるなら、わしと同じ結論に至っててほしかった。今回の件、かなりの部分を同じ経緯をなぞってる気がするぞ(苦笑

ちなみに、mblen() が状態を保持することの是非についてだが、こんなページを見付けた。ここの…

統一 UNIX 仕様で定義されている関数が mblen() を呼び出す場合は、内部に保持された状態情報を保存しなければなりません。

[Wide-Character Conversionより引用]

% って辺りがとても微妙。あと、さっきのメールの一連のスレッドでも指摘されてるが、どうもこの機能は C99 規格での仕様らしい。規格書読んでないから、ほんとかどうかは知らんけど。

というわけで、個人的にはふざけた仕様だと思わなくもないんだが、あれはあれで正しいということなのかも知れない。んで、あれが正しいとするなら、いずれ gilbc 辺りもそのようになっていく可能性もある。そうすると、Linux などでも例の問題が出るようになる。……ということは、FreeBSD ports に send-pr するよりも、vim の方に報告するべきだったか?

どっちにしろ mblen(NULL, n) は『0 を返す』と決まっているだけで、あとは何もしないんだから、今からあの一行パッチの修正を入れてしまっても問題は無いと思うわけで……

% [FreeBSD] mblen() 問題、続き

いちいち blockquote で引用するのはめんどいので、もう適当にやります(爆

んで、さっきのページの話だが、『状態依存符号化の場合、文字ポインタ引き数 s にヌル・ポインタを指定して呼び出すと、この関数は初期状態になります。』と書いてある。そこでふと考える。これって裏を返せば『状態保存の機能は状態依存符号化のためにある』ってことじゃないのか?もし、そうだとすれば、5-stable (5.3R を含む) における mblen() の実装は『やりすぎ(もしくは手抜きか)』の感がある。

ちなみに『状態依存符号化』ってのはおそらく iso-2022-jp のようなシフト状態を持つエンコードのことだろう。euc にもシフト状態はあるが、それは 1byte 目が 0x8e (半角カナ) か 0x8f (補助漢字) のときだけだ。それ以外の 8bit on な値は、すべて単なる 2byte 文字の断片だ。シフト状態なんか関係無い。それを律儀に内部状態に溜め込むってのはどうなんだろうなあ?

現在の実装でありがたいのは、きっとこんなことをする場合なんだろう。

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
int main(void)
{
   const char *sample = "123あいう456えお";
   char *c;
   int n = 0;
 
   setlocale(LC_ALL, "ja_JP.eucJP");
 
   for (c = sample; *c != '\0'; c++) {
      if (mblen(c, (size_t)1) > 0) {
         n++;
      }
   }
 
   printf("number of character : %d\n", n);
   return 0;
}

% とりあえず、ヘンテコな for ループについては置いといて欲しい。話の肝はそこじゃなく、for の中身で mblen() を使っているところだから。念のため説明すると、sample という文字列を、1byte ずつ mblen() に渡している。で、mblen() の返り値が正の値 (正しい文字) の場合を数えてる。実際に試してはいないけど、ループを抜けた時点で 5.2.1R なら n = 6 (1byte 文字の数)、5.3R なら n = 11 (全ての文字数) になるんじゃないかと思う。

要するに、文字列を単なるバイトストリームとして扱いながら、マルチバイト文字としての文字数を取得できる。mbtowc() を使えば、同じような方法で wchar_t の配列に変換したりも可能だろう。

……でもさあ、『だからどうしたの?』って感じでもあるよね(苦笑)。他にもメリットってあるかしらん?

% [PC] Mono & Boo

せっかく FreeBSD も 5.3R にアップグレードしたことだし、記念に(?) lang/mono をインストールしてみた。もちろん、現状では他に使い道が無いので、例の Boo も拾ってきて動かしてみる。

   % ledit mono /boo_dir/bin/booish.exe

% 動いた。相変わらず ledit 大活躍(笑)。とりあえず print "Hello World" と打つ。ちゃんと動いてます。おめでとう。でも、もう何をしたら良いのかわからんので終了(苦笑)。ま、これからちまちまいじってみましょう。

Boo をソースからビルドするには nant とかいうツールが必要らしいが、どこにあるのかわからない。もしかして lang/mono とは別に存在するのかと思ったが、それらしきものは見つからず。仕方ないので (と言うか無理にソースから作る必要も無いんだろうが) ビルド済みのものを拾ってきて使ってる状態。

ちなみに、mono を起動した時点で実使用メモリは 10MB 弱。boo のプロンプトで何か実行すると、それが一気に倍近く増える。だいたい、groovysh (まあ、こっちの場合はほとんど JavaVM の分だが) と同じくらいか。

まあ、なんつーか、Java と groovy の関係によく似てますな、CLI(Mono) と Boo って。System.Console.ReadLine() とか使えてちょっとおもしろい(笑)。System.IO.Path.GetTempPath() とか実行すると '/var/tmp/' なんて得られたり。

% [PC] vim (と言うか libiconv) が文字コードの自動認識に失敗したら…

.vimrc に set fileencodings=iso-2022-jp,utf-8,utf-16,ucs-2-internal,ucs-2,cp932,shift-jis,japan とか書いて文字コードの自動認識を使っている場合の、tips なんぞ。って言うか、滅多に起きないせいで、たまに起きると対処法を忘れていて焦るってことがよくあるので、備忘録のようなもの(苦笑

普通の文章だと、それほどでもないんだが、ソースコード (に、ちょこっと日本語のコメントが入れてあるようなの) なんかだと結構あるのよね、自動認識失敗。

さて、自動認識に失敗すると、当然文字化けしまくりなわけだが、そんなときも慌てず騒がず、:set fenc=euc-jp (正しいエンコードを指定) して、:e! で再読み込み……って読み込んだ時点でまた自動認識が動いて、当然また間違えるので永久ループ!?(爆

なんか、毎回これやって「あれ?どうすんだっけ?」と悩んでるわしはバカか。ちなみに fenc は fileencoding の省略形です。んで、正しい対処の仕方だが、fenc ではなく fencs (fileencodings の略) の方を設定します。例えば、正しいエンコードが euc-jp なら :set fencs=euc-jp として、そこで :e! で再読み込みをすれば、よろしい。

それから fenc は、保存するときのエンコードを指定するものだと憶えておくと良い。つまり、euc-jp のファイルを読み込んで、:set fenc=cp932 としてから :w で書き込めば、euc-jp から cp932(sjis) に変換されたファイルのでき上がりと言うわけ。

おまけ。gvim のメニューとかツールバーがウザい場合は、:set guioptions="" (空にする)。ちなみにわしは、mlterm の設定に合わせて :set guioptions=l (左側にスクロールバーのみ。右にするなら r を入れる) にしてる。…それ gvim の意味あるの?(笑


2004-12-02 ほほぅ、これは… [長年日記]

% [PC] 特定の設定で読み込む

昨日の vim ネタに自前フォロー。なんか、

:e ++ff=unix filename ←開く時に指定

:e ++enc=iso-2022-jp filename ←開く時に指定

[Welcome to vim-jpより引用]

% なんてのがあるらしい。へぇ〜(x3)。てことは、昨日のネタのような自動認識に失敗した場合には

:e! ++enc=euc-jp

% とかすれば、OK だと。こりゃ良いこと知った。・・・忘れそうだけど(爆

% [game] Nintendo DS を買った

…と言うか買えてしまった。予約してないから買えないと思ってたのに、冷やかしで見に行ったらあるんだもの(苦笑

とりあえず、ソフトは一本だけ。ワリオかどっちにするか迷ったんだけど、結局『きみしね』に。どっちもタッチスクリーンを使ったミニゲームものだけど、頭の悪さっぷりはこっちの方が上でしょう(笑

説明書の操作説明のところで、『…はあこがれの彼女です。むやみにタッチするのは絶対にやめてください。』とか書いてあって、それは要するに『タッチしろ』と言うことですね?と言うことでタッチしてみると、セクハラしまくりだった(笑)。すげぇ、無駄な作り込みっぷり。あと、ボスシーンの後のラブシーン (これもミニゲーム) が微妙にえっちぃです(苦笑

『ダンス』があっぷだうんあっぷだうんちゅーちゅーちゅーって感じだったり。って言うか、「ここ、無人島みたい、どうするの?」に対してすることがダンスってどうよ(笑

『マイク』では「あいしてる」とか叫べって言われるんだが(苦笑)、とてもじゃないがそんなこと叫べるわけがないので、代わりに「はどそ〜ん」と叫んであげましたよ。彼女は喜んでました(爆

ともかく、あまりのバカバカしさがステキに楽しいです。


2004-12-04 鼻炎の発作が出てツライっす [長年日記]

% [game] とっぷり DS にハマリ中

さすがに任天堂は『ゲーム機』と言う物の作り方をわかってるよなあ。でも、市場的には以前の N64 vs PS の状況を思い出してしまうのよね。『数は少ないけど質が良い』のと『粗製乱造されてるが、パッと見だけは良い』ものの戦いは、後者が勝ったってのは皆さんご存じのとおり。

PS に良質なゲームが出始めたのは、はっきり言って市場的に勝ち組になってからなんだよね。それまでは、ただ見た目が派手でキャッチーなだけのゴミみたいなソフトばっかだった。DS と PSP の戦略って、あの時の状況と思いっきり重なる気がするのはわしだけ?

常に新しい遊びを模索してる任天堂とは対照的に、ソニーは「ゲームなんてマルチメディアの内の単なる一部門でしょ」みたいな姿勢が見えておもしろくないんだよな。職人とサラリーマンとでも言うか……ともかくわしは職人が好きなんだ。セガもハードを作ってた頃は明らかに職人だったが、最近はよくわからなくなったな(苦笑

% [game] スーパーマリオ64 DS

『きみしね』はたしかにおもしろいんだが、さすがにこれだけだと DS を堪能しきれないと思って、もう一本何か買おうと物色。んで、なんかすごく懐かしかった (N64 版の移植だ) んで、これを買ってみた。いきなりプレイヤーキャラがヨッシーになっててビビる(笑

単なる移植じゃなく、いろいろ要素が増えてるので、懐かしいだけじゃないです。タッチパネルで操作するのはおもしろいけど、難しいぞ(苦笑

% [game] きみしね日記

植物がツレぇ!!

なんだかんだで相当やり込みまして、星は残り 6 個 (現在 176 個)。内訳は『ヘビ』が 4 個、『ショクブツ』『ナイトメア3』で一つずつ。あとは全部コンプ済み。ノーミスで植物倒すの難しいよ(泣

ストーリーをクリアするとハードモードが遊べるんだが、今はそっちのナイトメア三連荘で詰まってる。結局ネックは植物なわけですが。つーかノーマルでも、ものすごく泣きそうになりながらクリアしたんだい。

ウサギがなかなか集まらん。こっちも結構ちゃんと探したんだけどなあ。まだ半分くらい残ってるってホントかよ?


2004-12-06 某国の首相は実は軍国主義者なんじゃないかと思う今日この頃 [長年日記]

% [雑談] 思考の飛躍と思い込み

人間がコンピュータに対して優っているところというのは、『思考の飛躍』ができるということらしい。「ここがこうだということは……おそらくあそこはこういうことだろう……であれば、そっちはこうなるはずだから……ここはこうなるだろう」みたいな考え方ができるということだ。なんかすごく漠然としてるが(苦笑

逆に、コンピュータというものは基本的には一から十まで律儀に計算するものだ。だが、技術の進歩によって、その計算の能力が人間を遥かに上回るものになっているために、『飛躍』という言わばショートカットをしなくても、十分な速度が出せる。そして、実はこれが重要なんだが、『飛躍』をしないからこそ、コンピュータは間違えない。バグは常に人の手によるものだ。

人を人たらしめる『思考の飛躍』は、いまだコンピュータが成り代われない分野を支えている。いわゆる芸術という分野などは、その最たる例だろう。人間が『思考の飛躍』という能力を持つことは、とても素晴らしいことではあるが、だがそれは多くの利点と同時に、欠点も持っている。

思考の飛躍というのは、思い込みというものと表裏一体である。こまごました部分をすっ飛ばして、要点を押さえる…という能力は、思考の飛躍を利用した人間ならではのものだ。だが、そこには常に『思い込み』というバグが入り込む可能性がある。

得てして人は『自分がひねり出した結論』が正しいものだと思いたがるものだ。そして、一旦そう思い込むと、何度見直してみても『同じように間違える』というのも悲しき人のサガだ(苦笑

だから、人は『己は間違える生き物なのだ』『そして、思い込みが激しい生き物なのだ』ということを常に自覚していなければならない。思ったように事が進まない時、そんな時はきっと何かを間違っているのだ。そして、意外な思い込みによって、それに気付くことができないのだ。

だが、当人にとっては『意外』であっても、他人から見れば全然意外でも何でもない場合というのはよくある。何かに行き詰まった時に頼るべきは『違った視点』である。何かがおかしいんだけど何がおかしいのかわからない……そんな時は誰かにそれを説明してみよう。もし誰もいなかったら、仕方がないから自分で何とかしなくてはならない。その場合は、発端 (問題の最初の切り口) を変えて検討し直してみると良い。

……こんなことを、何か失敗する度に思い出すのは、わしがへたれだからでしょうか。失敗してから思い出すんじゃ遅いってのになぁ(苦笑

% [雑談][PC] 思考の飛躍をするコンピュータ

どうもこの、『PC』というカテゴリ名はあまりよろしくないな。ノリで決めていくからこういうことになる(苦笑

前にちょろっと立ち読みした量子コンピュータの本には、量子コンピューティングによって思考の飛躍をするコンピュータが現れる可能性ってのが書いてあった。AI (人工知能) にロマンを感じるわしとしては、なかなか興味深い話だ。なんか量子テレポーテーションを利用してどうのこうの…って話だったが、わしには荷が重いので、中身の話はパスだ。

しかしこの話、人と同等の AI (こういうのを『Strong AI』とか言うそうだ。今巷に溢れている AI もどきは『Weak AI』と言うんだとか) を作るという点に関して言えば魅力的なのかも知れないが、果たして単純に『コンピュータの問題』として考えるとどうなのかなぁという気はする。

思考の飛躍を身につけることによって、コンピュータは人に近づくのかも知れないが、その代わりに『間違える』ようになってしまうんじゃないのか?果たしてそれは嬉しいことなのやら……


2004-12-07 隊長、体調が悪いです・・・ダメすぎ [長年日記]

% [Eclipse][PC] エディタには gvim を

この前の SoftwareDesign に、Eclipse の Java エディタを vi っぽくするプラグインというのが紹介されていたが、効果のほどはどんなものなのか。なんか『似て非なる物』なせいで余計なストレスが溜まる気配がぷんぷんなんですが(苦笑

最近はへたれてきて vim の Visual Mode にどっぷりはまってるので、もうわしは vim じゃないと生きてけません。対象とするブロックを『目で見ながら』選択して、そこに vi コマンドだろうが ex コマンドだろうがなんでもやり放題なんですよ。ステキです。ちなみに Visual Mode は vi モードで v (通常)、V (行単位)、^V (矩形ブロック)ですよ、お試しあれ。

そんなわけで、Eclipse だろうがなんだろうが、エディタには vim を使いたいのです、わしは。で、前にも書いたけど、Eclipse から外部のエディタを使用するようにして gvim を使ってます。

もちろん端末上で vim ってのもアリだけど、Eclipse と連携をするなら gvim の方がお薦めです。なんでかってーと、編集中のファイルが外部で (要は Eclipse 側で) 更新された場合に自動的に通知してくれるから。端末上の vim だとそれをしてくれません (もしかしたら設定次第であるかも知れないが)。んで、:e! で読み直すの忘れて編集して、せっかく Eclipse 側で直した部分を捨ててしまうってのがたまに・・・

ちなみに、わしは端末エミュレータでは最近は一貫して東雲明朝の 12dot を使っている。以前は要町を使ってたが、なんかの拍子に東雲を使い始めてからすっかり慣れてしまった。まあ、それはそれとして、gvim を使うときも同じ見た目になって欲しいわけです。ちなみに Windows では某所から Windows 用東雲をいただいてきて使ってます。

FreeBSD ではいつの頃からか gtk2 版 の gvim を使っている。と言っても、Eclipse を使うようになるまでは全然使ってはいなかったんだが(苦笑)。gtk1 版だと東雲も使えるんだが、gtk2 だと Xft を使ってるからなのか、うまく使えない。と言うことで、わしは Xft なんて嫌いだ宣言をしているが、それにしても東雲が使えないのは寂しい。

ただ、東風フォントの埋め込みビットマップ部分は東雲だったりするので、アンチエイリアスをオフにして東風フォントを使えば、実は東雲と同じだったりして。と言うわけで、わしはこんな設定でやってます。

% cat ~/.Xresources
(抜粋)
Xft*antialias:  False
Xft*dpi:        96
 
% cat ~/.gvimrc
set guifont=Kochi\ Mincho\ 9
set columns=100
set lines=30
set guioptions=l

% これで、gvim も端末で vim を動かすのとほとんど同じ見た目に。メニューとかツールバーはウザいだけで使いもしないので、当然オフです。ちなみに Xft*dpi を設定してないときは、フォントのサイズは 12 になりますね。って、よく見ると東風明朝だと ascii 文字が東雲明朝と違うなぁ。東風ゴシックの方が良いのかも……

ただ Eclipse 内部のファイルの関連付けに gvim を設定して使おうとすると、ちょっと変な状態があるので注意。すでに Eclipse のエディタで開かれているファイルを、『アプリケーションから開く』で、登録した gvim で開こうとしてもなぜか開けないのだ。ただ、『システム・エディター』を選ぶと開けるし、逆に先に gvim で開いている時に Java Editor で…という場合ならうまく開ける。どうも微妙。

Windows 版の場合は、システム側の関連付けで設定しておいて『システム・エディター』で OK だが、Linux 版ではたぶん Gnome とか使ってないとそういうのってできないよね。まあ、仕方ないので、gvim は自分で起こして、適当に該当ファイルを読み込ませるようにしてるけど。

% [PC] C のポインタはアドレスなのか

世の中には2種類の人がいる。『C のポインタはアドレスである』という人と、『ポインタは参照である。アドレスなんかを意識する必要はない』という人だ。どっちも一理あるんだが、最近はこの両者の意見って実はイマイチ噛み合ってないんじゃないかという気がしてきた。

アドレスなんか意識するな、と言う人は、おそらく (下手に識っているがために) アドレスというとメモリアドレスのことだと認識しているのだろうと思う。でも、ポインタはアドレスだと主張する場合の『アドレス』がメモリアドレスである必要はないのと違いますか。もちろんそういう意味で主張してる人もいるんだろうけど。

と言うことで、わしの主張はこうだ。『C のポインタは、線形のオブジェクト空間を指し示す位置情報(アドレス)である』

C に『ポインタ演算』なんつー変なものが在る以上、『ポインタってのはどこかにある実体を指し示しているものである』というだけでは説明しきれない。かと言って、実際のメモリ構造 (OS があるなら仮想メモリ構造だろうけど) とかの泥臭いものを考慮に入れるのは、高級言語としてふさわしくない。ちなみにわしは、(多分に希望的観測も入ってるが) C 言語は『低レベルな処理も可能な高級言語』であると思っている。

C におけるオブジェクトってのは、要するに変数のことだ。C では変数ってのは箱のようなものだからして、名前が付いているものはもちろんのこと、malloc() なんかで確保される領域も『無名の変数(箱)』と言うことができる。

変数の確保される場所 (ここではオブジェクト空間と呼ぶ) は、ポインタ演算が無い言語であれば単なる空間で良い (平面でも三次元空間でもイメージのしやすいもので結構) わけだが、ポインタ演算を説明するためにはオブジェクト空間は線形である必要がある。

泥臭いイメージを少しでも隠すために、少しだけ抽象化…と言うかモデル化 (同じか?) をしてみる。C におけるオブジェクト空間を 30cm の定規に例えてみよう。基本的な単位は cm である。mm の目盛りもあるが、基本的には cm で考えよう。これは要するに byte と bit の関係と同じだ。

さて、ここで要素数が 3 の short の配列があるとしよう。それを 4cm の位置に確保したとする。short のサイズは大抵の場合 2cm なのである。また、その配列を指すポインタ (short *) を 10cm の位置に確保する。ポインタ変数も変数だから当然オブジェクト領域を使用するのである。だからこそポインタのポインタなんてのも存在する。ちなみに、ポインタ変数の大きさは、現状では大抵 4cm なのである。そろそろ 8cm の時代も近い気がするが、まあそれは今はどうでも良い。

...4cm   5     6     7     8     9     10    11    12    13    14    15    ...
   |-----------|-----------|-----------|
     short(2cm)
      ary[0]      ary[1]      ary[2]
 
   |-----------------------------------|
           short ary[3] (2x3=6cm)
                                       |-----------------------|
                                             short *sp (4cm)

% ここで short * の変数 sp に入っているのは、指し示すオブジェクトの場所の情報だ。ゲンミツには指し示すオブジェクト (ary) の先頭の位置の情報となる。だから、この場合は『4cm』である。これは絶対値だ。

ポインタ演算をすると、そのポインタの指す型のサイズを基準に計算が行なわれる。だから、ここで sp++ としたとすると、sp というポインタが指す型である short の大きさ (2cm) かける 1 の分だけ値がずれる。つまり 4cm だった sp の値が 2cm 増えて 6cm という値になるのである。そして、その状態での *sp (sp が指す実体) は ary[1] である。

なんかイマイチまとまらないが以上。まあ、なんつーか、C 言語においては (モデルとして) いろんな物は一直線に並んでるんですよ…と。んで、そのモデルが現実のメモリ空間に酷似しているのは…そういうもんだとしか(苦笑

% [雑談] このところ変なコラムみたいなネタが多いのは…

良く言えば、気分転換と頭の体操のため。悪く言えば……逃避行動(爆)。どっちかと言うと後者である確率高し。・・・ダメ人間め(泣

% [PC][FreeBSD] glibc 2.3.3 の mblen()

別に FreeBSD の話題でもなんでもないんだけど(苦笑

ports の distfile を整理してたらなぜか glibc-2.3.3.tar.bz2 なんてのがあったので (たしか uim が依存している m17n-lib に必要だった) せっかくだから例の mblen() の実装がどうなってるか見てみようと思った…のだが。

・・・混沌としていて、さっぱりわけがわかりません(爆

な、何なの、この不必要なほどの複雑さは。FreeBSD で言うところの euc.c にあたる実際の処理部分が全然見つけられない。FreeBSD5.3R のソース見て「読みづれえ」とか思ってたのは甘すぎでした(笑)。glibc は読みづらいどころか、どこに何があるのかさっぱりわかりません。これに比べたら FreeBSD のソースなんて、とてもとても人に優しいです。

ctags や cscope でちまちま追いかけてくんじゃ、とてもじゃないが見つからないので、この際思い切って怪しいファイルを絨毯爆撃しようかしら。って言うか、これをメンテしてる人ってスゴイなあ。本気で感心するぞ。

% [PC][FreeBSD] glibc 混沌巡り後編

iconvdata/euc-jp.c というそれらしきファイルを発見・・・そして驚愕。全編マクロだ(泣

共通する部分として iconv/loop.c てのがあって、それを随時 include する (あり得ねえ!!) ことで、実際の関数が自動生成される仕組み。いや、この仕組みを考えた人は、たしかに賢いのかも知れない……知れないが……敢えて言おう「glibc は関わりたくないプロジェクト No.1 です!!」

デバッグとかどうすんの?コレ。なんかもう、あまりの気持ち悪さに読む気が失せましたよ(苦笑)。これをメンテしてる人って……(以下略)。


2004-12-08 勢いだけで行くのはやめとけ [長年日記]

% [雑談] いつも夜中はハイテンション

完全夜型人間ですから〜(爆

んで、そのノリでガガガッと書いて、次の日に見たときに「なんじゃこりゃ!?」となることってあるよね、ね?

・・・まあ、そゆときは人知れず直しておくようにしよう、うん。

って言うか、short[3] ary とか書いちゃうのは Java の呪いと思われ。しかも中途半端に混ざってるからタチが悪い(笑

% [PC][vim] enc, fenc, fencs

謎の三段活用(笑)。今まで漠然としか理解していなかった vim の設定について、例の件でソースを読んだり、いろいろ調べたおかげで理解が深まった気がするので、まとめてみようと思う次第。カッコ内は略称。

encoding (enc)
   vim が内部で使用するエンコード。
   特に指定しない場合は、locale に応じて設定される。
 
termencoding (tenc)
   vim が表示に使う (端末の) エンコード。
   特に指定しない場合は、encoding と同じになる。
 
fileencoding (fenc)
   ファイルのエンコード。保存するときに使われる。
   特に指定しない場合は、encoding と同じになる。
 
fileencodings (fencs)
   読み込むファイルのエンコードを自動認識する際に検査するリスト。
   リストの頭から順に検査して、一致した段階で fenc を設定する。

% だいたいこんな感じ。vim には『表示』『内部』『ファイル』の三種類の領域で別々のエンコードが使われていても、ちゃんと動くようになってるというわけですね。まあ、iconv があるのが前提だけど。

% [雑談] FPGA

Free Programmable Gate Array だと思ってたんだが、Field Programmable Gate Array だった。『Free』じゃなくて『Field』だったんだね。『自由に』じゃなく『現場で』って意味らしい。

それはそれとして、はてなのキーワードはスペル間違ってませんか(苦笑)。裏通り?

% [雑談] 思わず笑ったスパム

たいていこの手のものは読まずに捨てるんだが、Subject があまりにもキャッチーすぎた(笑

Subject: 復活!金メダリスト
 
噂の同志のサイトが復活しました。
ひたむきな根性丸出しの彼らの出会いは如何に!?
http://okokoknet.net/gold/
 
====問い合わせ・メルマガ解除====
大連 周 富金
erooyaji_usa@yahoo.co.jp
================================

% わけわからなすぎる。こういうシュールなのに弱いです、わし(苦笑)。思わず見に行っちゃいそうだったぞ。URL とかメールアドレスもアホ丸出しでステキだね(笑

まあ、この URL にアクセスしても、これ以上に笑える展開は無いと思われるが、試しに行ってみたい人は自己責任でどーぞ。


2004-12-09 今日は良い天気ですねえ(ネタに詰まっている) [長年日記]

% [PC] 今日の新言語 『Io

情報元は osdev-j。(ほとんど) すべてがオブジェクトにメッセージを送ることで動くということで、Ruby や Soopy を連想する言語。

Io のオブジェクトとはすなわち、「キー」と「値」のペアからなる辞書である。「キー」と「値」のペアを「スロット」と呼ぶ。「キー」は文字列であり、「値」はどんな種類のオブジェクトでもありえる。メソッドは単純に、method/block (無名の関数) か CFunction プリミティブを値とするスロットである。インスタンス、そして(または)「クラス」変数はそれ以外のオブジェクトを値とするスロットである。Io の名前空間のルートは、Lobby という名のオブジェクトである。

[Io プログラミングガイドより引用]

% なんか言語の仕様と実装の説明がごっちゃになってる気がしないでもないけど、要は何でもオブジェクトだと言ってるわけだよね。んで、この『スロット』の扱いがちょっとおもしろい。代入はこのスロットに値を入れる行為になるわけだけど、その代入の仕方が二種類ある。

hoge := Object clone
hoge = Object clone

% 『:=』を使うとスロットを新規に作成し、『=』を使うと既存のスロットを上書きする。『=』のときに指定した変数が存在しない場合は例外が上がるらしい。

なんてことない機能のようにも見えるが、Ruby なんかを使ってると『代入する変数名を間違ってしまってデバッグに苦しむ』という状況がたまにあったりしなくもないので、そういうのが未然に防げそうではある。

ちなみに『clone』はオブジェクトを新規に生成するメソッド。『new』じゃなくて『clone』なのは、この言語がプロトタイプベースだから?

制御構造もメソッドのようだ。ゲンミツに言うと、ルートオブジェクトである『Lobby』が持つメソッドらしい。メソッドだからなのか、見た目がちょっと不思議な感じ。

if ( a > 0, "True" print, "False" print )
for ( i, 0, 9, i print )
while ( i < 10, i print; i ++ )

% 変だ(苦笑)。でも、おかげでぶら下がり文は自動的に駆逐できるね。

メソッド定義がまたおもしろい。オブジェクトは何でもスロットに入ってるものなので…

hoge := Object clone                   # 新規にオブジェクトを生成
hoge fuga := method("FUGA\n" print)    # "fuga" というメソッドを追加

% こんな風だ。『:=』じゃなく『=』で既存のメソッドを上書きしてやればオーバライドになるだろう。

実はまだ実際に動かしてみたわけじゃないんだが、わりとおもしろそうなので、いずれ暇をみて触ってみよう。

% [OCaml] List.fold*

List.fold_left とか List.fold_right とかって、いったい何に使うんだろう?とか思ってしまうのは、わしがヌルいせいですか?

とりあえず、すぐに思い付く使い道と言えば、リストの中身を全部足すとか。

# let n = List.fold_left (fun x y -> x + y) 0 [1;2;3;4;5;6;7;8;9;10];;
val n : int = 55
# let s = List.fold_left (fun x y -> x ^ y) "" ["This ";"is ";"a ";"pen"];;
val s : string = "This is a pen"

% ん〜?こんなのは iter でできるんじゃないの?…と思ってしまったが、よく考えるとリファレンスとか使わないとできないな。どうも Ruby の感覚でものを考えてしまう。

Ruby なら…
   n = 0
   [1,2,3,4,5,6,7,8,9,10].each { |item|
      n += item
   }
Ocaml だと…
   let n = ref 0;;
   List.iter (fun item -> n := !n + item) [1;2;3;4;5;6;7;8;9;10];;

% 美しくないと言えば美しくないか…

ちなみに某所で「納得がいかない」と言われていた fold_left と fold_right で引数が逆さまな理由は、カリー化なんかを考慮した使い勝手云々…とかじゃなく、どっちかと言うとイメージ的な問題なのかなぁという気がする。

fold_left の場合
   fold_left f a [b1;b2;b3;...;bN]
   a を基準に左に左にと折畳まれていく
   f a b1 → f (左の結果) b2 → ...
   イメージ的にはこう… ((((a b1) b2) b3) ... bN)
fold_right の場合
   fold_right f [a1;a2;a3;...;aN] b
   b を基準に右に右にと折畳まれていく
   f aN b → f a(N-1) (左の結果) → ...
   イメージ的にはこう… (a1 (a2 (a3 ... (aN b))))

% 実用的なシチュエーションが頭に描けないんでアレだけど、この方が覚えやすいというのはあるかも。

ところで fold_right は末尾再帰になっていないそうなので、デカいリストなんかだと案外…

List.fold_right f a_list b;;

% とする代わりに、

List.fold_left f b (List.rev a_list);;

% とかやった方が速かったりするのかな。まあ、少なくともスタックを溢れさせる心配は無くなるわな。引数が逆なのがイヤだと言われたらどうしようもないが(苦笑)。まあ、美しくないけど引数を逆さまにするだけの関数書けば済むわけだし、ガマンしてもらうしか(笑

彼のやろうとしてることには、わりと期待しているので、がんばってもらいたいです。

% [PC] Decorators on Python2.4

Python は別に好きでもないんだが、なんとなくこういうとことかはチェックしてしまう。んで、『function/method decorators』てのが気になって PEP318 を見てみると、@accepts とか @returns ってのがあって、「ぬお、型の指定が可能に!?」とか思って試してみると……使えませんでした...orz

使えるようになってるのは @classmethod とかだけみたいだ。ざんねん!!(某侍風に) って言うか、こいつについての記述がドキュメントに追加されてない気がするんだけど、どうなの?使い方わかんないよ。

% [PC] 障害は忘れた頃にやってくる

ちょっと焦った。このところの作業データが入ってるマシン (Debian/sarge) がいきなり固まってドキリ。未コミットな修正が結構溜まってるのに〜と泣きそうになりながら涙のリセット。幸い何の問題も無く立ち上がってくれました。ふぅ……ハード障害とかじゃなくて良かった。うーん、Mozilla 使ってる時だったから、もしかしたら NIC かなあ。蟹だしなあ(苦笑

ともあれ、すっかりビビり入ったので、キリの良いところまで行ったら…と思ってたコミットをとっととやってしまうことに。中途半端なのが気持ち悪いけど、どうせ今のところはわし一人だから問題無かろう。

昨日、妙に調子良かったから、それが闇に葬られると泣くところだったよ。んで、昨日の勢いで今日も…と思ってたんだが、すっかりテンションが切れたんで、もう止めだぁ。『焦っても良い事無い』がわしの座右の銘です。焦るくらいなら多少遅れそうでも、休むときは休む、これ大事。って言うか、実際のところ座右の銘って言うより経験則だからなあ(苦笑

% [PC] Python のメソッド定義

やっぱ馴染めねえ。decorator を試してみようとして、こんなコード書いてしまった。

class Hoge:
   @classmethod
   def fuga():
      print "fuga"
 
Hoge.fuga()

% これを対話環境 (python を引数無しで起動した状態) で実行すると、こんなエラーが出ます。

Traceback (most recent call last):
  File "", line 1, in ?
  TypeError: fuga() takes no arguments (1 given)

% Python におけるメソッド定義の変なクセを思い出すまでは、激しく悩んだ。要するにクラス定義のときにメソッドを定義するには…

...
   def fuga(self):
            ^^^^ これが必要
...

% こうしなきゃならないんだったよね。やっぱ気持ち悪いよなあ。直感的じゃない。こんなのは実装上の問題なんだから、コンパイラで自動で補えよ。

本日のツッコミ(全1件) [ツッコミを入れる]

% soutaro [OCamlのList.fold_rightは末尾再帰じゃありませんが、extlibのは末尾再帰になってるそうです。私..]


2004-12-10 ちきゅう…ほんはんばー (要するに雪が無いぞと言いたいらしい) [長年日記]

% [雑談][PC] 『サルでもわかるモンキーPython』

昨日の件やなんかで頭がちょっぴり Python モードなところに、タイミング良く(?)情報が入ってきたので、ちょっくら立ち読んでみた。

パラパラ〜っと斜め読みしていって…最後に「えっ!?」と驚いた。Python の一番の特徴と言っても過言ではない『インデントが文法になっている』ことについて全く触れていない。すごく意外だ。

狙ってやってるのか、初心者向けのネタ (GUI ネタを持ってきている) を選んだら自然とそうなったのかはわからんが、かなり意表を突く展開。サンプルコードも、インデントが付く部分が全く無いものになってたりして芸が細かい (…のか?)。

しかし、コーディング規約 (のようなもの) を言語側が強制するってのも、ある意味無茶だよな。でもまあ Ruby の変数名によるスコープルールだって似たようなもんか。あれなんかも本来はコーディング規約で決めるようなことを、言語が強制してるという見方ができる。でも、Ruby の変数はあのルールのおかげで便利になってると思うけど、Python のインデントルールはどうなんだろうなあ。個人的には利便性よりも、無用な締め付け感を感じてしまうけども。だいたいわしはソフトタブ派なので、スペース一個間違って消しただけで、スクリプトが動かなくなるんですよ?ムカツクしょ(苦笑

ともあれ、わりとおもしろげに始まった連載だけど、Linux Magazine は 3 月号で休刊だそうで。今回のようなペースで行ったとして、残り二回で一体何ができるんでしょうか……不憫だなあ。


2004-12-11 あまりにも雪が無いからまさかと思ってたが、スキー場は地味にオープンしてたりするらしい [長年日記]

% [FreeBSD] ports の vim が更新されてたが…

わしのパッチは入らず。Non-critical じゃなく Critical にしときゃ良かったかな。つーか、vim の方に報告した方が早かったかも。まあ、ともかく、例の問題で困ってる人は、editors/vim/files に例の一行パッチを入れたファイルを突っ込んどいてくださいな。

% [game] 大合奏!バンドブラザーズ (NDS)

なんとなく買ってみたが……しまった、これって大人数でやらなきゃおもしろくないじゃん(爆

% [雑談] 飲尿療法

ビニール袋の持つところに首を入れてしまって抜けなくなったウチの猫が、大パニックを起こして家中を走り回った。もう飛ぶは跳ねるはの大騒ぎ。

そして、何とか救出しようとするわしの顔に体当たり・・・な、なんか濡れてますよ?

よく見ると、そこら中に謎の飛沫が点々と。しかもわしは顔に付いただけじゃなく、かすかに口の中にまで・・・しょっぱい味が ... orz

なんだかヒトとしての尊厳が揺るがされたような気がした一日でした。


2004-12-13 冬本格化 [長年日記]

% [雑談][game] どうでも良いが、NintendoDS のカートリッジは…

小さすぎて無くしそうだ。なんぞ手頃なケースでもないものか。

% [雑談] CCCD を入れると DVD ドライブが壊れる?

…という都市伝説があるようなんだが、そんなこと有り得るんだろうかねえ。

いや、わしのマシンの DVD-ROM ドライブが (元から調子は悪かったんだが) 最近ますます調子悪いんで、CCCD のせいだってことにしてしまえば、いくらか溜飲が下がるかなと(苦笑

買ったときからすでに微妙に調子悪かったんだよね、コレ。もう少しはっきり調子悪ければクレーム付けたんだけど、これがまたほんとに微妙なわけよ。んで、仕方なく騙し騙し使ってて、最近いよいよダメっぽくなってきたという塩梅でして。

% [Java] null な要素を取り除いて切り詰めたいことってあるよねぇ

java.util.ArrayList とか使っててさ、要素を取り出すときにいちいち null かどうか調べるなんてアホらしいから、とにかく null の要素は切り詰めたいと思うときってあるじゃないですか。・・・え、あるよね?

ほんで、例えば Ruby なんかだと、Array#compact なんてのがあるわけで、そのノリで行ってしまいたいわけだけど、それに相当するものが無い。で、仕方なくこんな風に…

ArrayList a = new ArrayList();
...
/* なんぞもろもろの処理 */
...
for (Iterator i = a.iterator(); i.hasNext(); ) {
   if (i.next() == null) {
      i.remove();
   }
}

% …書いてるわけだけども……なんかこう、イマイチ不毛って言うか。まあ、Iterator のおかげで、

for (int i = 0; i < a.length; i++) {
   if (a.get(i) == null) {
      a.remove(i);
   }
}

% …と書くよりは幾分泥臭さが薄れてるけど……大して変わらんか(苦笑

うーん、できればこんなもんは ArrayList がメソッドとして持ってて欲しいもんだが、かと言って実際に追加するとなるといろいろ問題なんだろうなあ。多分 List 型の変数で扱ってる場合がかなりありそうだから、そのためには List に追加しなくてはならない。そうすると、自前で List を implements して作ってるようなクラスは全滅だ。まあ、普通は AbstractList なんかを拡張するだろうし、それほど問題にはならんかも知れんが…

……まあ、なんつーか、ちょっとした愚痴です。現実的には別にね、在るものは使うし、無いものは使わない、それだけですから。きちんと何とかしたいなあ、とか思うほど Java って言語に惚れ込んでるわけでもないし(苦笑

% [雑談] 今日のファフナー

ひでえ話だな(苦笑)。エンディング曲も最近じゃ悲しい方のバージョンしかかかんないし。エヴァもどんどん悲惨になってく展開だったけど、これもまた派手じゃのう。しかも名のある登場人物が多い分、そいつらがガンガン死んだり再起不能になったりしていくのが、やたら悲惨さを助長してる。

スパロボに出すときに大変だなあ…とか変な心配してみたりして(笑)。最近のスパロボは人が死なないようになってるからなあ (たぶん続編が作りやすいようにだと思う)。


2004-12-14 これもまた逃避行動の一つなのか [長年日記]

% [PC] Objective-C を覚えたい

ずっと前から思ってはいるんだが、最近とみにそう思うわけでして。まあ「そんなもん覚えてどうする」っていう世知辛い意見もあるだろうけどもな(苦笑

C++, Java 辺りの C モドキなオブジェクト指向言語の中では、一番おもしろげな言語だと思うんだけどね。

でも、いまだにまともな文書を読んだことがないから、文法とか謎すぎてわけわかりません。つーか、C++ とか Java とかは C さえ知ってれば (あと、多少オブジェクト指向の概念を知ってれば)、少なくとも『なんとなく読める』と思うんだが、objc の場合はそうもいかんよな。interface の宣言なんて、一体なんだありゃ。+ だの - だの、なんかのパッチかと思ったぞ(笑

以前ちょこっとだけ勉強した分もすっかり頭の奥底に圧縮されてしまったので、ぜんぜん思い出せません。だいたい言語なんて、必要に迫られないと覚えられるもんじゃないんだけど、objc なんて必要になるシチュエーション皆無じゃないすか。真っ当にスキルとして認められるのは MacOSX (含む Darwin) の世界くらいのもんで、それ以外では完璧趣味の世界でしょ。前に ports で GNUstep 入れようとしたら、コンパイルエラーでインストールできなかったという苦い思い出とかも……

なんか、MacOSX の本じゃなくて、単純に Objective-C の本って何か良いのないですかねえ。Cocoa API の説明ばっかりされても困るんだよな(苦笑

% [game] 『きみしね』コンプリート

したよ〜。ヘル (ハードの次) のナイトメア 1-3、ラストバトル、ファイナルバトルは死にそうにツラかった。ファイナルは難しいとかじゃなく、超速こすりを長時間持続させるのがポイントだから、純粋に体力の問題だったが(笑)。肩抜けそうになったぞ。

ちなみにヘルモードをクリアすると、究極の服が手に入ります。ぶっちゃけて言うと『正直者にしか見えない服』です(笑)。え?ぶっちゃけてないですか?まあ、それはそれとして、服の他に頭飾りも大量に手に入るんだが、かなりヘンなラインナップでしたよ。ソニック、チャオ、アミティ(ぷよぷよフィーバーの主人公)、リアラ(ナイツのライバル)、ウララ(チャンネルはそのまま)、と言った具合。なぜナイツじゃなくリアラ?とか謎っぽさたっぷり(苦笑

その後、うさぎさんマークをコンプリートするべく奮闘。メモリーズの星はしばらく前にコンプリートしてたんだが、うさぎさんマークはなかなかコンプれなくて難儀してた。でも、実は大量に残ってたのが、ほとんど二か所の分だけだったのにはちょっと自分が情けなくなったよ。ちなみに、『サイン』の三コマ目のパネルや、『ダンス』の三コマ目の音符にごっそりうさぎさんが隠れてます。

% [PC] Objective-C の基本をおさらい

気になりだすともうだめなので、ちょろちょろっと調べてみる。ああ、そうそう、そうだったよなあ。せっかくだから備忘録も兼ねてまとめておこう。

・クラスの宣言 (ヘッダに書こう)
 
// Object(GNU Objective-C の基底クラス)を継承した Hoge クラスを宣言。
@interface Hoge : Object
{
   char *name;    // これはインスタンス変数。ブレースで囲む。
}
 
+ (void) hoge;    // 頭が + はクラスメソッド。
- (void) fuga;    // - はインスタンスメソッド。
 
- (void) shout :(char *) string;
                  // : に続くのはメソッドの引数。
                  // メソッドや、その引数は型をカッコで囲む。
                  // 型を省略すると id 型(void* のようなもの)になる。
@end
・クラスの実装 (実装ファイルに書こう。拡張子は .m)
 
// Hoge を実装
@implementation Hoge
+ (void) hoge
{
   printf("class is hoge\n");
}
 
- (void) fuga
{
   printf("instance is hoge\n");
}
 
- (void) shout :(char *) string
{
   printf(string);
}
@end
・メッセージ式
  オブジェクト指向な操作を行なうにはメッセージ式というものを使う。
  具体的には [ オブジェクト メッセージ(メソッド) : 引数 ] といったもの。
 
#import <stdio.h>
#import <objc/Object.h>
#import "hoge.h"  // 上記の宣言を hoge.h に書いているものとして。
 
int main(void)
{
   id obj = Nil;        // Nil は java で言うところの null。
                        // id は全てのインスタンスを保持できる型。
   obj = [Hoge new];    // クラスメソッド new によりインスタンスを生成。
 
   [Hoge hoge];         // Hoge クラスの hoge メソッドを call。
   [obj fuga];          // obj インスタンスの fuga メソッドを call。
   [obj shout :"Hello World\n"];  // 叫んでみる。
   [obj free];          // インスタンスの解放は free メソッドで。
}
・カテゴリ
  Ruby の特異クラスのようなもの?
  既存のクラスに任意のメソッドを追加できる。
 
@interface Hoge (Foo)   // Foo がカテゴリ名
- (void) foo;
@end
 
@implementation Hoge (Foo)
- (void) foo
{
   printf("foo\n");
}
@end
・初期化
  コンストラクタやイニシャライザに相当する操作は、
  Object クラスの init メソッドをオーバライドすることで行なう。
  init は new メソッドを呼ぶと自動で呼ばれる。
@interface Fuga : Object
- (id) init;
@end
@implementation Fuga
- (id) init
{
   [super init];  // 親クラスの init を呼ぶのを忘れない。
 
   // もろもろ初期化処理。
 
   return self;   // 自分自身を返すこと。
}
@end

% 他にも、Java の interface のようなものとして protocol なんてのもある。

Objective-C は C++ のような『C との互換性を持たせた別の言語』ではなくて、『C のスーパーセット』のようなものらしい。FreeBSD 5.3R の環境では、リンク時に『-lobjc -pthread』の指定が必要だった。(Linux なんかだと -pthread じゃなく -lpthread だろう)

基本は C 言語でありながら、オブジェクト指向の部分は動的型付け (と言うか、動的にメソッド検索をするらしい) だったりしてかなりおもしろい。一度これで何か書いてみたいけど、ネタがなあ……

% [PC] ああ、Objective-C 良いかも…

基本は動的型付けで、必要に応じて型指定 (id 型じゃなく Object* な変数に入れるようにする。あるいはプロトコルを使って id <Hoge> みたいに制限する) もできるってのは、わし向きかも。GC は付属はされてないけど BoehmGC が、わりと簡単に使えるみたい。_objc_malloc とかのグローバル変数に GC の関数ポインタを入れてやれば、メモリアロケーションについて簡単に上書できるようになってるらしい。あと、GNUstep には何となく GC の仕組みがあるように見える(…が、よくわからない)。

id 型ってのは Java で言えば Object 型みたいなもんなんだけど、決定的に違うのは id 型のままで全てのメソッドが使えるってこと。Java の場合は Object クラスに定義されていないメソッドは、結局ダウンキャストしなければ使えなくて、すごくコードが汚くなる。C++ も virtual メソッドとして定義してなければ、スーパークラス型の変数からはサブクラスのメソッドは使えない。その点、Objective-C の場合は、Ruby の感覚にとても近い。

メソッドの検索が動的なせいで、C++ よりは遅いんだろうけど、今どきそれほど気にする必要も無い気はするし、問題はやっぱりライブラリかねえ。GNUstep がどれほど使えるものになってるかが肝かしらん?あとは例外機構か。あるはずだとは思うけど、動的な部分が多いからその分、C++ や Java よりも役割としては重要な気がするし、半端なものじゃツライだろうと思うわけで、その辺どうなんでしょうな。まあ、ぼちぼち調べよう。


2004-12-15 ちょっぴしショック [長年日記]

% [PC] つーことは MacOSX で遊べってことですか?

Obejctive-C で例外機構を使うには、コンパイル時に -fobjc-exceptions オプションを付けると良いらしいと知り、さっそくこんなソースで試してみる@FreeBSD。

#import <stdio.h>
#import <objc/Object.h>
 
int main(void)
{
   @try {
      printf("throw exception.\n");
      @throw [Object new];
   }
   @catch (Object *e) {
      printf("%s\n", [e name]);
   }
   return 0;
}

% …が、こんなエラーが出てコンパイルできず。

% cc -fobjc-exceptions main.m -lobjc -pthread
main.m: In function `main':
main.m:6: error: storage size of '_stackExceptionData' isn't known
main.m:6: confused by earlier errors, bailing out

% ……しばし悩んでから /usr/share/info/gcc.info.gz を見てみる。(man cc では情報が無いので)

`-fobjc-exceptions'
     Enable syntactic support for structured exception handling in
     Objective-C, similar to what is offered by C++ and Java.
     Currently, this option is only available in conjunction with the
     NeXT runtime on Mac OS X 10.3 and later.

% ショック...orz ちなみに、上記のコードは MacOSX 10.3 では何事も無く動きます。

もしかして、GNUstep の方のライブラリを使えば良かったりとか?と思って、

% cc -fnext-runtime -fobjc-exceptions main.m \
   -L$GNUSTEP_SYSTEM_ROOT/Library/Libraries -lobjc -lgnustep-base -pthread

% などとしてみたが、コンパイルは通るもののリンク時に undefined reference が出まくってダメでした。くそ〜 NSException とかあるくせに、あるくせに〜〜(泣

% [PC] 悔しいので NSException.h をよく読んでみた

ははあ、なるほど。新しく追加された @try 〜 @catch 構文じゃなく、setjmp とマクロででっち上げた仕組みが別にあったわけだね。んで、以前はこれを使うのがお約束だったのか。ほうほう。と言うことでテストしてみよう。

/* nsexception_test.m */
#import <stdio.h>
#import <objc/Object.h>
#import <Foundation/NSException.h>
#import <Foundation/NSString.h>
 
int main(void)
{
   NS_DURING {
      printf("raise exception.\n");
      [NSException raise :NSGenericException format:nil];
   }
   NS_HANDLER {
      printf("exception is %s\n", [[localException name] cString]);
   }
   NS_ENDHANDLER;
 
   return 0;
}
% cc -I$GNUSTEP_SYSTEM_ROOT/Library/Headers nsexception_test.m \
   -L$GNUSTEP_SYSTEM_ROOT/Library/Libraries -lobjc -lgnustep-base -pthread
% ./a.out
raise exception.
2004-12-15 12:25:19.000 a.out[2660] Unknown time zone name `JST'.
2004-12-15 12:25:19.000 a.out[2660] Using time zone with absolute offset 0.
2004-12-15 12:25:19.000 a.out[2660] autorelease called without pool for object (8097e48)
   of class GSCInlineString in thread <NSThread: 809f248>
2004-12-15 12:25:19.000 a.out[2660] autorelease called without pool for object (8097ec8)
   of class NSException in thread <NSThread: 809f248>
exception is NSGenericException

% こんな感じか。想定される出力二行の間にヘンな診断メッセージみたいのが出てるが、これは GNUstep のランタイムが出している模様。回避法がまだよくわかりません。NS_DURING や NS_HANDLER の後のブレースはいらないと思うんだが、無いとなんだか気持ち悪いので付けてみた。そうしないと vim の cindent がうまく働かなくてウザいし(苦笑

NS_DURING から NS_HANDLER までが try 節、NS_HANDLER から NS_ENDHANDLER までが catch 節に相当する。んで、NSException クラスのメソッド raise (クラスメソッド、インスタンスメソッド両方あり) で例外を挙げる。raise された例外は NS_HANDLER 内で localException という変数に代入されるので、それを用いていろいろ処理をする。ちなみに NSException の name メソッドは、Object - name と違って (const char *) ではなく (NSString *) を返すので、cString メソッドで char* の値を取得している。

とりあえず、例外については GNUstep 必須なのが判明したので、もう少し GNUstep の勉強をしようかね。

そうそう、昨日 Nil が Java の null に相当すると書いたが、null に相当するのは nil だった。nil が空インスタンスで、Nil は空クラスらしい。まあ、objc/objc.h を見ると…

#define nil (id)0
#define Nil (Class)0

% とかになってるから、あんまり気にすることもないのかも知れないがね。所詮 C だからどっちを使ったって勝手にキャストされてくれるでしょう(笑


2004-12-16 今日はスパロボの発売日 [長年日記]

% [雑談] 予言しよう

明日(金曜日)、わしは徹夜する。必ずだ!!(いばることじゃない)

% [PC][objc] Ruby もこんな風にならんかなあ…と思った

Objective-C では、コンパイル時に『予測』できるメソッド未定義エラーについては警告してくれる。具体的にはこんな感じだ。

 1 /* undefined_method_error_test.m */
 2 #import <stdio.h>
 3 #import <objc/Object.h>
 4 
 5 @protocol Runner
 6 - (void) run;
 7 @end
 8 
 9 @interface Hoge : Object <Runner>
10 @end
11 
12 @implementation Hoge
13 - (void) run
14 {
15    printf("%s is running.\n", [self name]);
16 }
17 @end
18 
19 @interface Fuga : Object
20 - (void) walk;
21 @end
22 
23 @implementation Fuga
24 - (void) walk
25 {  
26    printf("%s is walking.\n", [self name]);
27 }
28 @end
29 
30 int main(void)
31 {
32    id <Runner> obj1 = [Hoge new];
33    id <Runner> obj2 = [Fuga new];
34    Hoge *obj3 = [Fuga new];
35 
36    [obj1 run];
37    [obj1 walk];
38    [obj2 run];
39    [obj2 walk];
40    [obj3 run];
41    [obj3 walk];
42 
43    return 0;
44 }
% cc undefined_method_error_test.m -lobjc
undefined_method_error_test.m: In function `main':
undefined_method_error_test.m:37: warning: method `walk' not implemented by protocol
undefined_method_error_test.m:39: warning: method `walk' not implemented by protocol
undefined_method_error_test.m:41: warning: `Hoge' does not respond to `walk'

% 『id <Runner>』としてるのが、protocol による制限。このように指定された変数(オブジェクト)に対して、指定した protocol で定義されていないメッセージを送ろうとすると警告が出る。ただ、こう指定した変数に、Runner じゃないオブジェクトが代入されることについては、なんのおとがめも無い。まあ、動的型付けである以上、どんなもんが代入されるかなんて、コンパイル時に把握しつくせるわけがないわけで。たまたま、この例では [Fuga new] とかやってるからおかしいのがわかるけど、どっかで extern されてる id 型の変数とかから代入されたら、コンパイラにはもうわからんでしょ。

同じように、『Hoge *』としてるのが、クラスによる制限。実際には見てのとおり Hoge* 以外でも入れられるが、Hoge クラスが持っていないメソッドを呼ぼうとしていると警告が出る。

あくまでも『警告』なのは、結局動的束縛だから『動いてみないと、ほんとのところはわからない』からで、実際、この例で出ている警告のうち、ほんとにエラーになるのは 37 行目の [obj1 walk] だけだろう。逆に、警告が出ていない 38,40 行目がエラーになるはずだ。まあ、これはわざわざ有り得ないインスタンスを入れちゃってるのが悪いんだけども(苦笑

それでも、Ruby のように、動かしてみるまでまったくわからないよりは、これだけでも随分助けにはなるような気はする。こういう警告が出ないように作りこんでおけば、メソッド未定義でエラーが出ても、問題箇所を見つけやすいんじゃなかろうか。

少なくとも、スペルミスによるエラー(バカバカしいくせに、わりと悔しい)なんかは、かなりの割合いで駆逐できそうだが。レアケースでしか実行されないメソッドをスペルミスしてたりすると、いざエラーになったときにすんごく悔しいんだよね(苦笑)。いや、テストしないのが悪いってのもあるけど、そういう場合って、ロジック自体はどうでも良い単純なものだったりするんで、境界条件だけ抜き出してテストしたらそれで終わりにしちゃうってのがわりと……

% [PC] C 言語では int がデフォルト

今どきは、C を勉強する…と言いつつ、やってるのは C++ だったりすることも多いんじゃないかと思ったりするわけで。実際、C の入門と称しつつ、main 関数が…

int main() {
   ...

% などと書かれているものの、なんと多いことか。いいですか? C 言語で型の指定が省略された場合は、すべからく int です。だから上記の例は…

int main(int) {
   ...

% という意味なのです。もちろん仮引数名が付いていないので、引数に (直接は) アクセスできませんが、関数を呼び出すときに int の引数を与えることは可能です。こんな風に。

/* test.c */
#include <stdio.h>
 
int num()
{
   return 1;
}
 
int main(void)
{
   int i = num(5); /* 引数無しだと思ってたのに… */
   return 0;
}

% これをコンパイルしてごらんなさい。少なくとも gcc では警告すら無しに (unused variable i ってのはあるけど) コンパイルできてしまいます。ちなみに、C++ でこのコードをコンパイルするとエラーになりますね。(too many arguments to function `int num()')

まあ、どうでも良いっちゃあどうでも良いお話でした。しいて言えば、関数の呼び出しのときに int の分だけスタックの消費を抑えることが(爆

それよりも、『C++ は C の上位互換だ』と思ってる人が多いことの方が問題なんじゃないかなあ。『C++ は C のソースを (ほぼ) そのまま取り込めるようにした、別の言語だ』というのが真相だと思うんだがねえ。オブジェクトファイル内の識別子も C とは別だから、C のオブジェクトとリンクするには、extern "C" {} みたいな変なことをしなきゃいけない。

その点、Objective-C は間違いなく C の上位互換です。…のはずです。少なくとも、extern "C" みたいな変な小細工はいらないはず。

% [objc] C の文法だけで Objective-C のプログラムを書こう

Objective-C のランタイム部分は C で書かれていて、コンパイル時に C のコード(に相当するもの)に翻訳されているだけだという話だ。なら、C から Objective-C のオブジェクトを操作するのも問題無く可能であろう…ということで挑戦してみた。まず Objective-C のコードから。

/* test.m */
#import <stdio.h>
#import <objc/Object.h>
 
int main(void)
{
   id obj = [Object new];
   const char *ret = [obj name];
 
   printf("%s\n", ret);
   return 0;
}

% …で、これと等価 (だと思う) な C のコード。

/* test.c */
#include <stdio.h>
#include <objc/objc.h>
#include <objc/objc-api.h>
 
int main(void)
{
   Class object_class = objc_get_class("Object");
   id obj = class_create_instance(object_class);
   SEL sel = sel_get_any_uid("name");
   IMP msg = objc_msg_lookup(obj, sel);
   retval_t ret = msg(obj, sel);
 
   printf("%s\n", (char *)ret);
   return 0;
}
% cc test.c -lobjc -pthread
% ./a.out
Object

% ちゃんと理解してるわけじゃないが、いちおうこれで動きますね。セレクタ(SEL)ってのは、よくわかんないけど、メソッドリストを検索するときに使われるキーみたいなものか。IMP は関数ポインタ。メソッドの実体への参照になっていると思われる。retval_t はメソッドの返り値用の型で、中身は void* だ。

C から Objective-C のインスタンスに触れるということは、当然 C++ からも可能だろう。んで、そこら辺を一歩進めて、両者のコードを混在できるようにしたのが、おそらく Objective-C++ というやつなんだと思うが…とりあえず、わしはそっちに手を出す予定無し。つーか C++ 怖いし(笑

% [game] スパロボ GC 初夜

とりあえずサウンドテスト。うわっ!!ダイオージャ懐かしい〜。って言うか思いっきり歌詞が頭に浮かぶのは、正直どうかと思うよ(苦笑

それにしても、新システム『部位ダメージ制』と来て、そこにわざわざファーストガンダムのストーリーを持ってくるってのは、もうあのイベントがありますよ、って言ってるようなもんだよな(笑

% [objc] AutoRelease

スパロボ買いにヨドバに寄ったので、ついでに Cocoa な本を立ち読みしてみた。目当てはメモリ管理について。

Apple Objective-C (NeXT/OPENSTEP を元にしてる GNUSTEP も同様だが) の基底クラスである NSObject はリファレンスカウンタを持っていて、それが 0 になることで自動的に free されるようになっているらしい(そもそも NSObject に free メソッドは無いようだ)。カウンタの増減には retain , release メソッドを使用する・・・自分で。

はあ、自動で増減するならまだしも、自分でやるんじゃ Gabage Collection とは言わないんじゃ?(言うのかな)と思って、もう少し読み進めてみると、リファレンスカウンタに関する機能で、もう一つ autorelease と言うのがあった。生成したインスタンスに対して autorelease メソッドを使用すると、NSAutoreleasePool にカウンタが制御されるようになって、そのインスタンスを生成した関数(メソッド)のブロックを抜けた時点で、自動的に release してくれるらしい。

なるほど、使い捨てにするようなインスタンスに関しては、autorelease で勝手に消えてもらうようにして、きちんと管理すべきものは自分でちまちま retain と release を使うという方式なんですな。まあ、案外バランスが取れた良い方式かもしれない。リファレンスカウンタのおかげで double free をする可能性は無いだろうし、あとは autorelease なり release なりを忘れないようにしてメモリリークしないように気を付けるという寸法ですな。基本的には手動だからフルスペックの GC みたいなオーバーヘッドも無い。

ちなみに、図らずも昨日のヘンな診断メッセージの正体もわかりましたな。おそらくどこかで autorelease が使われているんだろうけど、NSAutoreleasePool のインスタンスが存在しないので警告が出たってことなんでしょう。昨日のコードの main 関数の最初に

...
#import <Foundation/NSAutoreleasePool.h>
 
int main(void)
{
   id pool = [NSAutoreleasePool new];
   ...

% と書いてやると例のメッセージは出なくなりました。

new メソッドではなく、例えば NSString + stringWithCString みたいな、いわゆるファクトリメソッドのようなもので返されるインスタンスは、あらかじめ autorelease されているらしい(長く持っていたければ retain すれば良い)。ヘッダを見ても、autorelease されているかどうかが判断付かないのが問題だが(苦笑)、基本的にこの手のものは全て autorelease されていると思っても良いようだ。

NSAutoreleasePool のインスタンスはスレッドごとに持つ必要があるようだが、NSThread はそれを保持するための構造体をメンバに持っているので、おそらく init の時点で自動で生成されるような気がする。と言うことは、これの問題を気にするべきなのは、こういうシングルスレッドのプログラムのときだけということかも。


2004-12-17 予想どおり… [長年日記]

% [雑談] 寝坊した…

ああ、しましたとも、それが何か?逆ギレかよ(笑

今日は電池切れで寝ちゃうかも……眠いっす。

% [objc] メソッドのアクセス制限

全て public です。以上。……微妙にショックだけど、まあ、運用でなんとかなりそうだしね。例えば…

public の場合:
   普通に定義、実装。
protected の場合:
(と言うか、Java の default のように内輪だけに公開…てな感じ)
   category でその部分だけ切り離して、それを interface まで含めて、
   (ヘッダではなく) 実装ファイルの方に書いてしまう。
   んで、公開ヘッダには public なメソッドが書かれるようにする。
private の場合:
   一つのファイルにクラスは一つ…って決めとけば、static 関数で良いじゃん?

% みたいな感じとかね。

ちなみに、インスタンス変数にはアクセス制限がありますね。C++ みたいな感じ。

@interface Human : Object
{
@public
   char *family_name;
@protected
   char *first_name;
@private
   char *middle_name;
}

% 指定したところから下が、その指定した制限を受けます。デフォルトは protected (意味は Java のそれとほぼ同じ) で、public にすると、構造体のメンバ参照と同じようにアクセスできるようになります。でも、そんなことすると SEGV の元だから (間違って変なインスタンスが入ってたらアウツっしょ)、よっぽど速度に問題があったりとかじゃない限りは、おとなしく setter&getter を使っておいた方が無難だとは思うけども。

アクセス制限なんかよりも、Java の package や C++ の namespace に相当するものが無い(っぽい)のが問題かもなあ、大規模開発だと。まあ、C と同じで命名規則で乗りきれば良いんだろうけど、あんましモダンじゃないよね(苦笑

% [雑談] 今日の素敵スパム

このシリーズおもしろすぎ(笑)。何をしたいんだかさっぱりわからんのがステキだ。

Subject: 掃除フェチの貴方へ
 
メガネは顔の一部です。
年末の掃除の前にメガネ掃除しましょう!
http://yahyahyah.info/free/
 
====メルマガ解除・問い合わせ====
山東省 袁 掃除
maribabaclub@yahoo.co.jp
================================

% いやぁ、スパム業界もいろいろやってるねえ(苦笑)。そういや、前は5千万の収入が得られる話だったのが、いつの間にかグレードアップして8千万になってたなあ。さらにウソくさくしてどうする(笑

% [objc] Boehm GC を使ってみよう

…と思って、こんなスケルトンコードを書いてみた。

/* gc_test.m */
#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#import <objc/Object.h>
#import <objc/objc-api.h>
#import <gc.h>
 
/* GC_calloc() : copy from /usr/src/contrib/libobjc/misc.c */
static void *GC_calloc (size_t nelem, size_t size)
{
   void *p = GC_malloc (nelem * size);
   if (! p) {
      objc_error (nil, OBJC_ERR_MEMORY, "Virtual memory exhausted!\n");
   }
   memset (p, 0, nelem * size);
   return p;
}
 
static void init_gc(void)
{
   _objc_malloc = GC_malloc;
   _objc_atomic_malloc = GC_malloc_atomic;
   _objc_valloc = GC_malloc;
   _objc_realloc = GC_realloc;
   _objc_calloc = GC_calloc;
   _objc_free = GC_free;
   GC_INIT();
}
 
int main(void)
{
   init_gc();
 
   /* do something. */
}

% …んだが、GC がちゃんと動いてるのを確かめるには、この後どんなコードを書いたら良いんだ?とりあえず、libobjc のソースを眺めた限りでは、これで Object +new (と言うか +alloc) を呼んだときに、通常の malloc() の代わりに GC_malloc() が呼ばれるようになってるはずではあるんだが。そうすると、もう free メソッドは呼ばなくて良いってこと……なんだよね?たぶん。

ただ、libobjc のソースには、Boehm GC 対応(?)のための部分もあって、OBJC_WITH_GC を定義してやるとその部分が有効になるようだ。んで、そこでは (上に書いたようなこともやってるんだが) もう少し複雑なことをやってるみたい。ちょっとパッと見ただけじゃ何やってるかわからなかったんだが……

libobjc.so を OBJC_WITH_GC で作り直してみようかとも思ったけど、それをやると逆に GNUSTEP と相性が悪くなりそうな気がしたんで止めた。GC_free とかを下手に使われると具合悪そうだし、実際リファレンスカウンタが 0 になると勝手に使われるんだろうし、結構不安だもんな。……と思ったら、一応 GC と一緒に使う工夫もされてるっぽいな NSObject.h とか見ると、GS_WITH_GC の定義で対応できるっぽい。まあ、そうなればライブラリ全部作り直しな気がするけど。

とりあえず、GNUSTEP の方で遊ぶときは素直に本来のメモリ管理をすることにしよう。その方がつぶしが利きそうだし (MacOSX とかで)。GNUSTEP 無しで遊ぶときは free がめんどいから GC に頼るのも良いかも知れない。ちょっと GNUSTEP 無しでやってみたいことがあるんだよね、何の役にも立たない自己満足のお遊びだけど(苦笑


2004-12-19 ある種の病気だなあ…とか思った(謎 [長年日記]

% [game][雑談] 「動くなよ…」

スパロボをやっていると、何人かのキャラが攻撃のときにそう言うわけです。で、そのとき必ず「弾がはずれるから」って脳内補完してしまうわしは、もうやばいかもしれません(笑

たぶん、最後は核爆弾の解除に失敗して爆発してジ・エンドだと思われ。

% [game] DS のカードを入れる入れ物

小さすぎて無くしそう…と評判の(?) NintendoDS のカートリッジ (カード) だが、とてもちょうど良いケースを見つけたので活用することに。何かって言うと、GAME GEAR のカートリッジケース。ああ、カートリッジが一つ入るようになってるケースに、10 枚くらいは DS のカードが入ってしまいそうな予感(笑


2004-12-20 やっと盛り上がってきた [長年日記]

% [game] スパロボ GC 日記

あまりの地味さにどうしたものかと思っていたスパロボ GC だが、20 話目にしてやっと新たな展開に突入。ようやくエルガイムが出てきました。って言うか展開遅すぎ。一年戦争をあんなに引っ張るなんてどうかしてる。Z ガンダム以降も、レイズナーもまだ出てきてないしなあ。つーか、出てくるタイミングはほぼ読めたが、そこまで辿り着くのに、後何話かかるのかは想像も付かん。その前にダイオージャのストーリーが入りそうだし。

今回は、特殊技能に『切り払い』が無いので、F の時に猛威を振るったネイのオージェも全然へっちゃらです。それにしてもエルガイムもバッシュも飛行可能なのがちょっと違和感あり。まあ、モビルスーツなんかに比べれば滞空能力は高いんだろうけど、飛ぶってのは違わんか?

しかし、20 話超えてもアムロがガンダムに乗ってるってのが、あり得なさ満点ですわ。ゲンミツには G-3 ガンダムに乗り換えてはいるんだけど、性能的には大して変わらんしなあ。ガンキャノンとかガンタンクがいまだに主戦力として生き残ってるのもあり得ない(笑

% [雑談] 今日のファフナー

ああ、次は最終回か。先週の悲惨っぷりから打って変わって、希望が見えてきたね。わりとハッピーエンドになるのかな。って言うか、先週遠見は死んだと思ってたがあっさり生きてたなあ。一応ヒロインらしいから死んじゃまずいのかも知れないが(苦笑)。でも脱出カプセルが飛び出したようには見えなかったんだが…インチキじゃないのか?


2004-12-21 ぐあぁ… [長年日記]

% [本日のリンク元] google 検索 (Vector 添字 2次元配列 java)

これは何が調べたかったのかなあ。Vector (と言うかまあ List 全般だろう) で二次元配列を作ると、添字の指定の仕方がウザいって話でしょうかね。たしかにねえ、こんな感じだし。

import java.util.List;
import java.util.ArrayList;
 
public class ListTest {
   public static void main(String[] args) {
      List lst = new ArrayList();
 
      // ary[5][3] に相当するものを作るとすれば…
      for (int i = 0; i < 5; i++) {
         lst.add(new ArrayList());
         for (int j = 0; j < 3; j++) {
            ((List)lst.get(i)).add(null);
         }
      }
 
      // 添字でアクセス
      // ary[3][2] に何かを入れるなら…
      ((List)lst.get(3)).set(2, "hoge");
      System.out.println(((List)lst.get(3)).get(2));
   }
}

% Lisp かよ…ってくらいカッコ地獄ですな(苦笑)。パッと見何やってるかわかりづらいし。もし、これが Ruby や Objective-C のような言語だったら…

...
   // 添字でアクセス
   lst.get(3).set(2, "hoge");
   System.out.println(lst.get(3).get(2));
...

% …くらいで書けるのにね。これならまだガマンできる範囲かな。まあ、わしなら、ほんとに List を使った二次元配列が必要であれば、そのためのクラスを書きますね。こんなウザいの、いちいち書いてられん。

って言うか、その前に、ほんとうに両方の次元が List である必要があるかどうかを考えた方が良いかも。List の嬉しいところってのは、要するに簡単に伸び縮みさせられるってところなわけで、もし伸び縮みする必要が無いなら普通の配列を使った方が絶対楽だ。二次元配列って、大抵どっちか (あるいは両方) の次元は大きさ固定じゃないですか?

もし、Java に可変長引数があれば、汎用の多次元配列クラスを作ってみてもおもしろいんだけど……無いからなあ。まあ、添字を new int[] { 3, 5, 8 } みたいな配列で渡す (タプルみたいに) 方式にすれば何とかなりそうだけど、それはそれで何だか不毛(苦笑)。もちろん、いちいち new するんじゃなく配列を用意しておいても良いが、違う添字を使うたびにそれを代入する作業が入るのもクールじゃないなあ。


2004-12-22 マジかよ!! [長年日記]

% [雑談] 中性脂肪が…

要再検を通り越して要精密検査とか出ましたが!!…って言うか勘弁してください ...orz

「酒量が多いようです」…とか言われても、最近そんな飲まんし、何かの間違いじゃないのかなあ。検査なんか受けに行きたくないよ、めんどくさい……


2004-12-24 中性脂肪が高い人はケーキとか食って大丈夫ですか? [長年日記]

% [Mac] Xcode ってスゴイのな

最近ごぶさたとはいえ、わしは元々は Mac な人なのである。以前は iMac (G3/450MHz) をメインマシンにしていたので、暇さえあれば ProjectBuilder & InterfaceBuilder をいじってみては挫折する(爆)生活をしていたものだ。

まあ、そんなわけでちっとも身に付かなかった (当時は Objective-C もさっぱりだったんで、Java で何とかしようとしてたなぁ) 思い出の品である ProjectBuilder だが、今ちょっとそれ系のものの UI (User Interface) を研究したい欲求があるんで、後継である Xcode (InterfaceBuilder 含む) をいじってみてるのであった。

しかしこれ、入力補完とかがあるみたいだが、どこまで使えるんだ?Java はまだしも、Objective-C はツラいだろ。……まあ、それは追々試してみよう。そうじゃなくて、書きたかったのは InterfaceBuilder のことだった。

前にいじってた時も、イマイチちゃんと理解できてなかったんだが、それはともかく。以前の InterfaceBuilder では部品同士のコネクションを設定する部分があったはずなんだが、なぜか Xcode の InterfaceBuilder にはそれが見当らない。おかしいなあ、どうなってんのかなあ、と思いながら、それではと Xcode の解説本を立ち読み (たまには買えよ)。

なんと、『コントロールキーを押しながらドラッグすることでコネクションの設定が可能』…みたいなことが書いてある。要するに配置した部品を使って直接設定できるようになってるわけだね。すげえなあ……

元々部品の位置決めの時に出るガイド (自動で調節されるグリッドラインみたいなの) とか、ステキすぎる要素満載だったんだが、さらに磨きをかけてましたか。……なんか、本気で勉強してみたくなってる今日この頃だったりしますよ。マジで本買おうかな。「それで一体何を作る気だ?」というセルフツッコミを入れつつ(苦笑

% [雑談][PC] メール消失

わしはメーラには mutt を使っていて、現在関係のあるネタのメールだけデフォルトのスプールに残して、あとは別の分類用ディレクトリに放り込むという運用をしてるんだが、なんか知らんけどスプールのメールが消えていた。・・・それは今まさに必要なメールなんです、勘弁してください ...orz

まあ、メーリングリストを使って配信されてるものだから、もう二度と見れないってわけじゃないんだが……それでもショック。なんだかスレッド単位で消えてるから、寝ぼけて Ctrl-D 連打とかしちゃったんかなあ。はあ、鬱だぁ。


2004-12-25 特にイベント無し [長年日記]

% [game] スパロボ日記

あり得ねえ!!やっと地球に戻ってきてクワトロが仲間になったと思ったら、なぜか予備機にシャア専用ゲルググ&ズゴック&ザクの3機が。ちゃんと金をかければ結構使えそうだが、だからってどうしろと?(笑

うーん、そろそろカイとかハヤトが役立たずになってきたから、そいつらでも乗せてみるか。


2004-12-27 はふぅ [長年日記]

% [雑談] ファフナー最終回

はあ、キレイにまとまったなあ。見応えたっぷりだったし。派手な戦闘あり、泣ける場面ありって感じで。作品を通したキーワードを、最後にちょっと違う意味で使ってたのも良い感じ。つーか、最終回を一時間スペシャルにしちゃう辺りが粋だねえ。そのために結構無理を通したのか、あり得ないほど CM の回数が多かったが(苦笑

なんとなくエヴァを連想する作品だったけど、アレとは違って最後をきっちり締めてくれたのがとてもよろしい。つーか、それが当たり前なんだけどな(笑


2004-12-31 [長年日記]

% [雑談] たまにはこういう日があっても良い

何年も前に買ったまま積んであった MG Zガンダムを作成。実は今年の正月に一念発起して、作り始めたは良いけど、ほんのさわりの段階で誰かから電話で呼び出しを受けて、そのまま今まで放置していたという(笑

いやぁ、それにしても、ただ単に素組みしただけなのに、結構良い感じに仕上がって関心しきり。でも、素組みだけのくせして六時間とかかかったのは、部品多すぎ複雑すぎ…

なんか、実際に変形させてみて、Zガンダムが主力モビルスーツになれなかったワケがわかったような気がしますよ。複雑すぎだよね。その上、装甲も貧弱だし、コスト負けを絵に書いたような機体だ(苦笑

それにしても、どうやってもハイメガランチャーを構えさせるのは無理でしょうか? 20 分ほどねばってみたが、わしには無理だった。仕方ないからビームライフルでガマン。


トップ 最新 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com