03_10_01


ピンチ。ジオシティーズメール終了だって
どうしようか。POP3な奴探さな…とりあえず、cpajk121@hct.zaq.ne.jpとmori_oto@hotmail.comはしばらく使えるはず。 hotmailのほうはあまり見ないので、何かあったらZAQのほうで。


昨日からダイエーファン。

大往生、四億。1-5ほぼ全繋ぎ。最後でハイパーと間違えてボム撃ったりしさえしなければ…

よく考えたら友人知人のサイトはほぼ全て閉鎖 or 停止してるような気がしてならない。
最後の生き残りって感じ。
ていうわけで、リンク消す。

03_10_03


やる気が出なくてなんか寝てしまう。
一日8,9時間は寝るような気がする。人として終わってるような。
更新しなかった時は寝たんだと思ってください。

あと、momiage_nagai@mail.fubako.comでよろしく。

あー、明日寝て過ごしそう…

03_10_04



思い付かないときは、適当に「〜やろーぜ」とかっていうふうに自分にネタ振りする方法をよく使ったりする。
昔、ファミ通で「ユージローのふたつにわかれてなんとか」っていうので 「する〜ず」っていうシリーズがあったんだけど、今考えると、「あれもそういう風にして生まれたんだろーか。」 とかそんなふうに思いを馳せたりしなかったり。


携帯電話でメール人口が増えてきたんだから、NTTとかはメールの "From:" っていうのは送り主が自由に設定できるということを もっと広く知らせるべきではないだろうか。
ちょっとSMTP詳しい人が簡単に何も知らない人を騙せたりするんじゃないだろうか。
意図的に誰かと誰かの仲を悪くしたりとかもできるんじゃないだろうか。

別に、僕は知ってるからどうでもいいんだけど。

まあ、メール送信の認証システムが弱すぎっていうのがあるんだけど、 そうじゃなくて、もっと身近にあるシステムの原理とかを理解しないといけない。
ネットワークを流れてくる情報はLANケーブルの中ではどんな電気信号になってるのか。 そういう基本的なこともわからないのに、どうして自分は人よりコンピューターに詳しい気分になれるのか。

メタルギアソリッド2で、 「あなたはそれがどうやって動いてるのか原理なんか知らないでしょ」 みたいな感じのセリフがあって、なんかやたら印象に残ってるんだけど、 まあ、そんな感じで、「e-Japan計画」とかがあったって、 大半の人は生活がちょっと便利になるぐらいしか思ってないけど、 その背景にある技術っていうのは長い歴史と何人もの天才、努力家達の結晶だったりするわけで。

で、その結晶は調べてるだけで十分楽しめる代物だと思うし、 身の周りの物の技術っていうのは調べ尽くそうと思えば、十分一生を棒に振れると思うし、 まあ、それだけ自分の知らない楽しい物が溢れまくってるんだから、 何かを悟った気になって「人生なんてつまらない」。なんて言っていてはいけない、と自分に言いきかせてたら 楽しい気分になれるのでいいと思う。


要するに、「"From:"は信用してはいけない。」っていう話。

03_10_06


適当にweb、っていうかここの文章見てると段落の一文字字下げって結構必要だと思った。

オブジェクト指向はオブジェクト指向っていう名前が悪い

オブジェクト指向が理解できる時っていうのはオブジェクト指向は オブジェクトに指向なんかしてないて気付いたとき。 っていう話。

オブジェクト指向(以下OO)の定義っていうと、まあ、よくわからんけど、 とりあえず、オブジェクト間でメソッドとかでメッセージのやりとりをするみたいな感じだろうか。

で、オブジェクト指向すると、なんか素晴らしくコーディングが楽になるという認識があるような気がする。 っていうか、前の授業で先生がそう言ってたし、まあ、そういう感じがしなくもない。

しかし、そのメッセージを発したり、受け取ったり処理したりとかを 誰がやるかっていう責任所在がはっきりしてるような状況っていうのは、おそらく C で書いたとしても 簡単に書けるような状態じゃないのかと思う。

実際にプログラム書いてて悩まないといけないのは、複雑な処理をどうやって分割するのか、 どうやって抽象化するのか、多数のオブジェクト間でどうやって一貫性を保つかといったような オブジェクト間の関係に関する問題ばかりで、 そういった問題に当たった時、OOだからC言語よりもなんとかなるというものでもない。

-

いくつかOOの利点とかいうものについて考えてみる

カプセル化

カプセル化はOOにしたからといって何とかなるものでもないだろう。 上手な人がやればなんでも隠蔽されるし、下手な人がやれば何でも外に出てくる。

継承

継承は、「オブジェクト指向」という名前のせいで最も誤解を受けている物だと思う。

「オブジェクト指向入門」みたいな文章となると、「継承による差分プログラミング」

みたいな感じで書かれているが、継承による差分が使える状況っていうのは相当少ない。

まず、そもそもふたつのクラスに分割できるんだったら、オブジェクトコンポジションっていうか、 そのまま分割しておけばいいじゃん。みたいな感じだし、プログラミング時において、美しい "is-a関係" が生まれる状況っていうのは 実世界のそれと比べると非常に少ないだろうし。

それにも関わらず、「OOの最大の利点は継承による差分」みたいな宣伝をするから、 初心者が継承を使いたがって、結局理解できなくなってしまうんじゃないかと思う

ポリモーフィズム

継承が役立つ場合もある、といえば、9割方これじゃないだろうか。

オブジェクト側で動作を決定できる。と言えば、いかにもオブジェクトに指向してる(?)感じである。

しかし、何かがおかしいと思わないのか。オブジェクト側で動作が自動的に決まる。と言っても、 全てをライブラリで実装するとかそういう場合以外、結局オブジェクト側のコードも自分で書かないといけないのである。

"ポリモーフィズムこそOOだ"という意見は間違ってはいないと思うが、その意見は完全にオブジェクト利用側 から見た意見である。オブジェクトを作る側の気持ちを代弁してるとは言い難い。

ポリモーフィズムな感じっていうのは、オブジェクトを何とかする手段なのではなくて、 オブジェクトに対するインターフェースを抽象化する為の手段なのだと思う。 オブジェクトの為のインターフェースではなくて、インターフェースの為のインターフェース、 よくわからんけど。そのへんが何かおかしいんじゃないのか。と。

要するに、OO言語にしたからと言って変わる部分はほんのわずかしか無い。 それは、「ある問題の抽象化に対して高レベルなインターフェースを持っているかどうか。」だ。 気合いを出せば、Cでも書けるし、なんだったら機械語でも書ける(ていうか、全ての言語は結局のところ機械語なんだし)、 ただ、OO言語を使えば、それが少しだけ、楽に、間違い無く書けるということだ。

例えば、C言語で関数ポインタを使うのと、C++でvirtualメソッドを使う場合を考えれば明らかだろう

--

僕は、プログラミングというものは、「物体を〜っていうふうに操作したい…」、っていう問題があったとして、 その問題を細かく、細かく、頭の悪いコンピュータさんでも理解できるように噛み砕いていく作業だと思っている。

オブジェクト指向、っていうと、オブジェクトを楽に操作できるイメージを持ちそうになる。 問題を分割していくという手順を飛ばして、解答へ届いてしまいそうなイメージだ。

もし、そのイメージのせいで、初心者に「OOは万能」と思わせ、混乱させているとすれば、 「オブジェクト指向」という名前が悪いのだと思う。っていう話。

--

とりあえず、誰かに「オブジェクト指向って何?」と聞かれたら、

「別に、普通と何も変わらん」

と、答えるのが良いと思う。

03_10_08


二日に一回は寝てしまうような気がする。
早く寝たからといって次の日調子良いというわけではない、というか、 結局昼間寝るし、なんか駄目だ。
多分、「一生眠って暮らせたら幸せだろーなー」とか考えてるから罰が当たったんだろうと思う。

あと、"tar -zcf nanika.tar.gz nanika"ってやろうとして、"tar -zxf nanika.tar.gz"ってやって上書きして消してしまう罠。


C++初期化リストとリセットメソッド

C++に初期化リストっていうのがある。

class Nanika
{
	int a, b, c;
public:
	Nanika( )
		:a(0), b(1), c(2) // 初期化リスト
	{}
};

初期化リストは特に理由が無い限り使わないで、

class Nanika
{
	int a, b, c;
	void init() {
		a = 0;
		b = 1;
		c = 2;
	}

public:
	Nanika() {
		init();
	}
};

上のように書くほうがいいかと思う。

何らかの理由で、リセット処理みたいなものを行いたいという場合っていうのはあるかもしれない。 そうなった時に、init が実装済みの場合は、init を呼び出すだけでいいけど、 初期化リストで書いた場合は結局 init によく似た物を実装しないといけなくなってしまう。 そして、おそらく冗長性を減らすために結局コンストラクタの初期化リストを消して コンストラクタはinitを呼び出すことになるだろう。 結局2番目のコードの形になってしまうのだ。

class Nanika
{
	int a, b, c;
	void init( ) {
		a = 0;
		b = 1;
		c = 2;
	}

public:
	Nanika() {
		init();
	}

	reset() {
		init();
	}
};

必要になった時に書き直せばいいと思うかもしれない、けど

class Nanika
{
	Nanika_Sugoku_Fukuzatuna_Mono member;
public:
	Nanika()
		:member()
	{}
};

っていうようなクラスがあったとして、これにリセットメソッドを追加しようとしたとき、member にリセットメソッドが実装されてなかったら、memberにもリセットメソッドを実装しないといけなくなってしまう。 で、そのとき、memberも何かを包含していたとしたら、それにもリセットを実装……

っていうふうに、結構な量の「初期化リスト→再初期化メソッド書き換え」を行わないといけなくなってしまう。 で、エンバグに立ち向かう勇気なんてもちろん無いから、僕の場合、

class Nanika
{
	Nanika_Sugoku_Fukuzatuna_Mono *member;
public:
	Nanika()
		:member( new Nanika_Sugoku_Fukuzatuna_Mono() )
	{}

	reset() {
		delete member;
		member = new Nanika_Sugoku_Fukuzatuna_Mono();
	}
};

っていうふうになってしまうのである。別にこれでもいいんだけど、 C++的にはやっぱ無駄なアロケーションとかでメモリ構成悪くして断片化って嫌だし。

て、いうわけで、初期化リストはconstなメンバの初期化とかみたいな必要最低限な場合以外で 使う場合は注意したほうがいいよな。って最近思った。

03_10_09


Newtonっていう雑誌は結構面白いかもしれない。(今更)
で、Newtonさん曰く、 「脳は使えば使うほど正の方向にフィードバックが働いてどんどん良くなる。 逆に使わないとどんどん悪くなる」らしいので、まあ、要するに やる気ないままだとどんどん悪くなっていくので、適当に暮らしていては いけない。と、思った。

hash_map< const char*, int >とかした時、文字列のメモリ管理って誰がやるのん? いや、「hash_mapなんか使うな」っていう意見は無しの方向で。
とりあえず、
int main()
{
	hash_map<const char *,int> map;

	char *p = new char[4];
	strcpy( p, "abc" );

	map[p] = 4;

	free(p);

	printf("%d\n",map["abc"]);

	return 0;
}
ってやると駄目っぽかったので、自分でメモリ管理しないといけないのかもしれない。 っていうか、これ何回か調べたことあるような気がするんだけどな…忘れる。
std::string使うと、"hash<std::string>( std::string )なんて存在しねーよ"みたいな エラーが出たので、色々面倒。あと、コンパイル遅い。



なんか色々描こうと思ったけど、全然描けないのでなんか投げ槍。
絵を描くのなんかやめて他のことに時間を使う方が良いっていうのは わかってんだけど、なんか、駄目だ。

03_10_10


お、三連休やること無い。

03_10_12


二日とも無駄に過ごしたし、明日も多分無駄に過ごす。


えーと、もっと修行します。はい。

とりあえず、就職したら忙しくなる(と、大人は皆言う)ので、 それまでは適当な生活を満喫することにしようと誓った。
今は結構楽しいので。

03_10_14


Unixコマンド達
便利かも

03_10_16


ちょっと休み。
一週間以内に元に戻る予定。

03_10_20


復帰。


linuxでp/eceとか
なんか今更な感じなんだけど。

もともと、まとまった文章書こうと思ってそのために色々調べたことをここに メモ代わりに書いていってたんだけど(X WindowとかC++ 例外とか)、 なんていうか、どれも中途半端だったので結局まとまった文書は書いてなかったような気がする。

ここんところ三日くらい「言語作るとしたらどーするか」っていうのをひたすら考えてたので、 次回からはその話。

03_10_21


寒くなってきて、熱い茶が必要になってきたので、 「冷たいお茶が出る」という吉野屋のアドバンテージは小さくなった(松屋は熱い茶はあるけど、冷たいのは水しかない)。  +10円で味噌汁が付くと思えば松屋のほうが大分得だと思うんだけど、っていうか、最近松屋ばっか。

--

プログラマだったら一度は「自分言語を作ろう。」と思ったことがあるかもしれない。 でも、実際に実装なんか全然することなんかなくて、即没。っていう人が9割以上だと思う。 もし、実際に実装したとしても、生き残って広く使われるとなると、その確率は ごくごくわずかだと思う。(ちなみに、Xftのkeith氏も言語作ってたりする - http://nickle.org/。 全然関係無いけど。)

それでも、本気で自分言語の仕様について考えてみる価値はあると思う。

経験とかライブラリの知識とかの都合上、あるひとつの言語弄ってばっかり。 っていう状況は十分考えられるだろう。結果として、 その言語マンセーな状況、いわゆる「信者」になってしまうんだと思う。 大抵のプログラマは大なり小なり何らかの言語の信者だ。

でも、プログラマ、というか、技術者にとって、何かを盲信するというのは 最も避けるべき行為だ。そういうのは客観的に長所、短所を見極める際の障害になってしまう。

で、そういうのを避けるために自分言語を考えるのである。 自分言語を作るとすれば、もちろん、その言語を世界最高の言語にしようとするだろう。 そうすれば、自然と、他の言語の欠点を探そうとするんじゃないだろうか。 そして、その時は自分が信じる言語さえも客観的に見れると思う。

でも、そういううんちくはどうでもいいとして、 自分言語を考えるってゆーのは結構楽しい。 まあ、暇潰しとかにもってこいだ。

--

で、色々考えてて、結構考えがまとまってきたし、 今日は何か他の言語からパクってこようと思って、D言語調べてたら 僕が考えてたアイデアがもっとしっかりした形で十分実装されてたので なんか、もうD言語でいいや。とか思ったんだけど、続きます。

D言語紹介の日本語訳

03_10_22


ねむー。

メッセージ投稿付けてみた。なんか面白かったら引用するかもしれないので、嫌な時は引用するな。 って書いておいてください

--

C言語は世界で最も広く知られ、使われているプログラミング言語だ。多分。 少なくとも書かれたコードの量では世界一だろう。

C言語以降、「俺の言語はC言語よりも素晴らしいYO!」な感じのモダンな言語は 数多くあるにもかかわらず、C言語がトップの座にいるのには何らかの理由があると思う。 その理由は何だろうか。

まあ、色々あると思うけど、僕は「ランタイムライブラリが不必要」 というところにあるんじゃないかと思う。 標準ライブラリだとかそういうのではなくて、 暗黙的なサブルーチン呼び出しが存在しないという意味だ。

今生き残っている言語の中でこの特徴を持っているのは Cぐらいだと思う(FORTRANはどうか知らないが、 あれは強力な言語とは呼べないので考えないことにする)。

「Cよりも強力な言語」の力っていうのは便利な 暗黙のルーチン呼び出しによる部分が大きいんじゃないだろうか。 まあ、そういうのは殆どの場合便利なんだけど、それで Cと比べて強力っていうのは、卑怯なんじゃないだろうか。スタートラインが違うというか、なんというか。 ランタイムライブラリ無しで得られる強さのギリギリのところをCは持っていると思う。

けど、Cは生まれてから長いこと経つので、いくつか古臭い部分を持っていることも確かだ。 特にプリプロセッサの中途半端さは改善すべきだろう。 マクロは言語を無茶苦茶にする能力は強力だけど、文法を強化する能力は弱いし、 #includeは機構が単純過ぎるし。

要するに、

「C言語の哲学を残しつつもモダンな感じを採り入れた言語を作る」

と、いうことだ。どうせ、完成しないと思うし、気楽にやっていこうと思う

続く

03_10_25



僕は使わないからいいけど。

mvmの説明
一旦HTML全部忘れて、一から覚えなおすか、XHTMLに移行かなんとかしないと、 どうも適当なHTMLばっか書いてしまう…

あと、文体をどーするかっていうのは結構問題だ。
だ、である調で書くと、なんか適当に書くわけにいかなくなってくるし、 ですます調で書くのは少し精神的に苦痛だ。
かといって、ふざけた文体で書き続けるのはかなり難しい。特に技術系の文章は。

03_10_26


昨日の更新
フォント周りもできるようにしたんだけど、 javaコンパイラが勝手にShift_JISからUTFに変換したりして困ります。 助けてください。

$LANG=Cとかでやったらそのままバイト列とみなしてくれて 大丈夫かと思ったら、なんか「これはUTFとして有効なシーケンスではありません」 かなんかそれっぽいエラーメッセージが出たのでなんかどうでもよくなった。


言語作る話は実装しながら進めていく予定なのでゆっくりになると思う。

03_10_28


10月も残り少なくなってきたってゆーか、 「大阪で過ごせる残り半年を有意義に過ごす」って決めて とりかかった10月だったにもかかわらず、いまだかつてないくらい適当に過ごした ような気がする。別に構わないけど。

文法とか構文解析(といってもyacc頼りなんだけど)とか面倒になってきたので、 とりあえずアセンブリ吐くところまでやろうとして途中。

今はプロトタイプだと思って386限定で最適化ほぼ無しでいいかと思ってるんだけど、 実際に何か言語作ろうと思ったときは、GCCのフロントエンドとして動かすのがいいと思う。

GCCは "何か言語→RTL(Register transfer language)→アセンブリ" っていう形をとっていて、 C言語とかでも一回RTLに変換している。
で、GCC は中間表現である RTL の段階での最適化がかなり熱いので、 フロントエンドは適当にRTL生成しておくだけでそこそこ質の良いコードができるという話だ。
さらに、同時に色んなCPUにも自動的に対応してくれるというおまけ付きだ。
ARM とか MIPS とかみたいな見知らぬ CPU にも対応できるかもしれない。 かなりおいしい話だと思う。

EmacsとかLinuxとかはライバルがいなかったから頂点になれたような感じがあるけど、 GCCはフリーソフトウェアで唯一商用パッケージと勝負して勝てるツールだと思う。 何の勝負か知らないけど。

GCC Frontend HOWTO
タイトルと目次だけしか読んでないからわからん。
どのバージョンからかわからないけど、GCCにtreelangっていうフロントエンドのサンプルみたいなのが デフォルトで付いてるのでそれも参考にするといいかもしれない。これも流し読みしただけなんだけど。
コンパイラ
図書館で適当にコンパイラの本でも借りようと思った時に目に入ったのがこれだった。
386で具体的に説明してあるので、そこそこ無駄の無いコード生成ルーチンをわかりやすく理解したいんだったら非常に良いかもしれない。


それと全然関係無いけど、猫である。まじでどうでもいい話っていうか気分を害する話なので時間が無い人は読み飛ばすといいと思う。 前にも書いたかもしれないけど、自転車で通学すると結構グロいのを見る。
昨日も見た。今日は血痕だけになっていたけど。 いつも思うのだけど、ああいうの掃除する仕事の人がいるんだろうか。保健所っていうのはそういう仕事もしてるんだろうか。
で、昨日なんだけど、しばらく轢かれた猫を見てなかったので結構ビビった。 気付いた距離が近かったのもあるかもしれない。距離は結構重要だ。
「猫轢かれてるYo!」
って気付いてから何秒かは「見たくない」よりも「潰れたところどうなってるのか見てみたい」 っていうほうが勝るので凝視してしまうのである。
遠くのほうで気付いたら、まあ、はっきりしないうちに目を逸らすことができるけど、近い時は結構しっかり 見てしまう。今回は胴体は結構しっかり残ってたけど、頭のほうは飛び散ってるっていうようなところまで 確認できた。肉片らしいものも確認できた。
榊さんが見ていたイリオモテヤマネコの轢殺死体画像は嘘だ。 僕が見た物は全て何か飛び散っているか、薄っぺらくなってるかのどっちかだった。


で、そういうのばっかり見てると、なんか「猫かわいい」とか思えなくなってくる。 なんか「猫=グロい」っていうのがあって、猫見る度に
「ああこの猫も轢かれたらあんな風になんねんな…」
とかって思ってしまうのである。

あと、それと学校行くとき、「阪神優勝セール立看板割引き」 っていう立て看板が立ってた。昨日までは無かった。

03_10_29


たまにゲームやってる夢を見る。なんか末期っぽいけど。
今日はプロギアやってた。前ゲーセンに行った時レバーの調子が悪かった事を 無意識のうちに相当根に持ってたのかもしれない。
で、前、大往生の夢見た時もそうだったんだけど、プレイしててテンション上がって そのまま目がさめてしまうのである。だからどうしたっていう話なんだけど。

髪の毛っていうのは頭守るために、まあ色々ホコリ被ったりして 結構思ったより汚れているものだと思う。だから、手洗ったついでに 鏡あるからっていうので髪の毛いじったりしたら手洗った意味無くなるんじゃないかな… って、ふと思った。

レポートしないといけない。面倒だなぁ

03_10_30


mvmとりあえず参照カウント&mark sweepハイブリッドにしてみようと思って実装 してみたんだけど、問題が。
xLOADとかxALOADとかは整数とかと参照とで区別付いてるから大丈夫と思ったんだけど、 PUTFIELDとかって区別がないよな…
てゆーか、そもそもフィールド自身数値と参照と区別無いんだからどうしようもないか…
だから
class Nanika
{
	int x=0x208000; // 参照っぽい値
}


new Nanika();
new Nanika();
System.gc();
とかってやって、もし0x208000にオブジェクトがあったら解放されてしまう。
参照カウントは無理か…
思ったよりもメモリ余ってたから世代別とかやってもいいかも。って思ったんだけど、 実装難しそうだしな…どうなんろうか。
とりあえずpceHeapFreeは遅いらしいのでアロケータとかなんとかしないと。


http://k-of.jp/
こういうのはどうなんだろうか。
行ってみたい気もするし、行ってどうするんだっていうのもあるし。
学生率ってどのくらいなんだろうか。


Bookoff下のお好み焼き屋が最近ずっと閉まってるように感じる。つぶれたんだろうか。
松屋ができた影響だろうか。1枚200円っていうのは非常に財布に優しかったんだけど。

あと、メッセージのところIEで見たら一行になってた。