C++ では template のインスタンス化ってのを < > という括弧で書きます。 これによって型をパラメータにとる関数(に見えるもの)が実現できるので、 色々と応用範囲が広くよく使われるのですが、こいつはいささか目立ちすぎるのです。 なんかもう、また出たよテンプレートが、って感じ。テンプレートという 「ひな形」 に物をピタリとはめ込んで完成させるのがインスタンス化なはずなのに、 はめ込んだ後もそのひな形の形が<くっきり>と見えているその姿には、 少し不自然さを覚えなくもありません。
そこで2分前に麦茶を飲みながら思いついたのです。 <T> じゃなくて _T と書けるようにするとどーよ? と。
variant<int, string, pair<char,int>> v(4);
...
int n = get_int(v); // × get<int>(v);
自然だ。
vector<string> c;
...
sort( c.begin(), c.end(), greater_string() ); // × greater<string>()
実に自然です。
template<class TypeList> class FactoryOf : ... {};
FactoryOf<list<slime, bigcrow, mudhand>> monsterFactory;
monsterFactory.create_slime(); // × create<slime>(v);
めっちゃナチュラルでござる。
いやまぁ、複数引数テンプレートはどうするんだとか、 問題点がたちどころに100個くらい出てくるのは承知ですけど、 しかしこの案けっこう使えるんじゃないかと。
前々から思っていたのですが、@niftyのデイリーポータルZは面白すぎます。今日の 「目玉をつけてみる」 で改めてその感を強くしました。個人サイトでもないのにこのノリは最高。 勝手に自分の好きな特集ピックアップをしてしまうと、こんなところ。
この「だからどうしたっ」としか言いようのない無駄ネタっぷりがもう。
自分のWebサイト上に発表するソフトや文章は、他の人のフィードバックを受けたら、 あるいは自分で気付いたことがあったら、基本的にすぐに改良を加えて更新ができる。 とりあえず超高速で作ったプロトタイプを置いておいて、 あとからゆっくり切ったり張ったりして細部を整えていく、というのもありだ。
…… この、「いつでも直せる」を前提としたスタイルに自分が慣れすぎてしまったことを、 最近痛感しています。書き上げたバージョンでいったん固定しなけりゃいけない、 という状況だと、それを意識してしまってなかなかキーボードが進みません。むー。
ついはやりものの Reactive Programming について色々読んで時間を潰してしまってます。時間ないんだけど。要するに、 イベントドリブンと制約プログラミングとグラフ書き換え系が合体したような感じ、 とゆーか。この辺り のデモ…はいまいちだけれど、LL3であったらしい デモ はなかなか印象的です。
アプリの設定項目と、それに依存するコンポーネントと、それを書き換えるさまざまな UI とを、「それぞれの関係」と「相手の値が決定したときの自分の動作」 を書いておけば、上手く組み合わせて任意のタイミングでどう設定が変化しても 正しく追従してくれるフレームワーク。そんなものを C++ で作ろうと昔妄想していたのですが、ReactiveProgramming をサポートする環境の上なら簡単に実現できるかもしれません。
窓の杜大賞 投票開始だそうな。むぅ、長期間使ったことのあるソフトが 「CD Manipulator」と「真空波動研」 の2つしかない。 そもそも半分以上が記憶にない名前のソフトだ。アンテナ低いぞ自分~。
個人的には、今年流行ったオンラインソフト、というと浮かぶのは Samurize と POPFile 辺りかな。あ、あと流行ったということなら今年の顔は MovableType か。 何かこれぞ、という一押しのソフトあります?>ALL
中村友次郎さんの 非タブ化計画 を見てFirebirdをいじったりしていました。 「非タブブラウザ化拡張」欲しいなぁ。
最近「した。」と「なぁ。」で文を終わらせすぎなので少し考えよう。
テレビゲームの展覧会「レベルX」 を、突発的にSBを誘って見に行ってきました。初日なので混みまくっているかと思ってたけど、 そうでもありませんでした。平日だからか。
メインは、歴代のファミコンソフト1200本の外箱をずらりと並べたもの。 「星をみるひと」ってこういう箱だったのかへぇ~とか言いながら、 懐かしのタイトルの数々を思い出してました。 幾つかのソフトは遊べるように展示されていたので、 スーパーマリオ1をひとしきり遊んでみたり。情けないことに二人とも 8-4 のクッパまでたどり着けず。。。 入り口には特大スクリーンと特大スピーカでゼビウスが。
あと、高橋名人がいました。スターソルジャーをやっていた。
「音いろえんぴつ」を聴いています。4曲目の「赤い空」がいい感じ。
2日前に夕飯を食べているときに舌を噛んでしまったのです。 それが今になって痛くなってきました。どのくらい痛いかというと、 思わずGoogleでtongueacheなどと検索してしまうくらい。
Metagene というプロジェクトを発見。ML風の言語で書いたメタプログラムを、 C++のtemplateを使ったスタイルへ変換してくれるもの。C++ のメタプログラムを生で書くと <> と typedef の嵐になりがちですが、 それが綺麗に読みやすい形で書けるようになるとのことです。次の例が
$$
let rec fact = function
n -> n * (fact (n - 1))
| 0 -> 1
let fact4 = fact 4
$$
こう変換されるらしい。
template<unsigned N>
struct fact {
enum {res = N * fact< N - 1 >::res};
};
template<>
struct fact<0> {
enum {res = 1};
};
enum {fact4 = fact< 4 >::res};
確かに純粋にtemplate上で閉じる計算については劇的に書きやすくなりそう。
ただ、逆にメタプログラム中に C++ のコード片を埋め込むのに
<@ @>
という括弧が必要となるため、
実際に使うよなコードを色々書いてみると、結局可読性は大差ないという印象でした。
私が後者の記法に慣れすぎているという問題もありますが。
これを拡張して可変個引数メタ関数を簡単に記述できるようにして、 C++に変換するときに 「マクロ混じりの疑似可変引数テンプレート」 を出力するようにできると凄そう。
突然、CD-ROMドライブが音楽CDを吸い込んだまま開かなくなってしまった。 開閉ボタンを押してもLEDが数秒光るだけで反応なし。そのCDも読み込めてないし… 何か変な入れ方したかな。仕方がないので、 確か「CDケースを突然開けるだけ」という素敵なジョークソフトが存在したはず! という記憶を頼りに、検索開始。それで完全に電気的に開ければ開くかもしれない。
とだけ書かれた実に豪快なソフトが見つかったので、早速使ってみる。… … … 開いたー!ばんざい!!(…と喜ぶ横でCDドライブが出たり入ったりしている。) よく考えたら、緊急用の小さな穴をピンで突っついて完全に物理的に開かせる、 って方法があった気もするけど、気にしないことにしよう。(出たり入ったり)
あっさりとネットワークも動きました。よっしゃ。 Haruを使う方法 もメモ。
できたらやってみたいことがあるので資料集め。
Zeta 入れました。インストールは困難なことが判明致しました
、
なんていう情報があったのでドキドキでしたが、私の環境ではほぼ何事もなく起動。
自動でグラフィックカードとサウンドカードとプリンタが認識されるなんて、
なんと感動的なことでしょうか。今まで使ったBeOS系ディストリビューションの中で
一番楽だったかも。
もうこの感激の前には、R5では使えたUSBマウスが動かなくなってるとか 日本語フォント環境が相変わらずヘチョいのとか、 ネットワークが全然繋がらんとかは些細な問題です。というのは嘘で、 ネットワークは困ったなぁ。(…と思ったら、R5のドライバを引っ張ってくればOKらしい! 今度やってみよう。)
サービスパックか日本語化パックかを当てたら、Zetaメニューから
GoBeProductive へのリンクが無効になってしまった。手動で張り直して解決。
あと Mozilla の起動ファイル(/boot/apps/Internet/mozilla の mozilla と
mozilla-bin)に実行属性が付いてなくて起動できなかったので、
chmod a+x mozilla mozilla-bin
で修正。
色々動かしてみるテスト。あまり関係ないけど、この KQ という RPG、 ファイナルファンタジー…というか MysticQuest っぽくて楽しそう。
切腹もののミス。
private や protected、同じキーワードを使っていても、 言語によってアクセス許可する範囲が微妙に違って大変だったりするところ。 クラス自体や派生関係は全部publicなものとして、 さて、メンバ x をどう宣言したらどこまでアクセス可能になるでしょう。
module_or_package MyModule
{
class Base {
member x; // private,protected,public, or...?
method( Base otherObj ) {
x // (1)
otherObj.x // (2)
}
}
class Derived extends Base {
method( Base otherObj ) {
x // (3)
otherObj.x // (4)
}
method( Derived otherObj ) {
otherObj.x // (5)
}
}
class Unrelated {
method( Base otherObj ) {
otherObj.x // (6)
}
}
}
module_or_package OtherModule
{
class Derived2 extends MyModule.Base {
method( MyModule.Base otherObj ) {
x // (7)
otherObj.x // (8)
}
method( Derived2 otherObj ) {
otherObj.x // (9)
}
}
class TotallyUnrelated {
method( MyModule.Base otherObj ) {
otherObj.x // (10)
}
}
}
だったと思う。他は試さずに書けるほど自信がない…
ってゆーかそんな重箱の隅知らない…。C# は「アセンブリプライベート」の意味の
internal
ってのがあって、protected internal、とか混ぜられるらしい。
Objective-C は C++ と似てるけれど省略時は@protectedで、メソッドは全部@public。
SmallTalkは変数は(1)のみ、メソッドは全部OKと聞いた気がする。
その方面の言語はメソッドのカプセル化は「カテゴリ」で何とかするとか。
OCamlは変数は(1)、メソッドはprivateが(1)でpublicが全部でしたっけ。
更に export とか published とか friend とかが入るともう大変だ。
どっかに一覧表ないかなぁ。
Zetaきたーーーーーーー!
長い時間を経て、ついに BeOS が装いを新たにして帰ってきました。 マイクロカーネルが、データベース風ファイルシステムが、根っから UTF-8 な国際化っぷりが、SVGアイコンが、標準添付の Many Emulators が(って、 これが標準添付ってアレだな)。経緯については mycomの記事 が詳しいようです。週末にインストールの予定。
通は Turbine ですよと友人に言われたりしたのでそっち方面も覗いてみたり。 あ、どもですー。
Webアプリってどんなもんか、というのを少し理解したつもりになってみると、 何故 Cocoon の開発という場で「継続のSerialization」が必要だったのかがやっとわかりました。 なるほどエレガントな策だ。
乙一さんと羽住都さんのサイン会があるらしいと聞いたので、どーせ当日そっちの方に出かける用事もあることだし、 ってことで整理券を入手しに新宿へ。まあ夜の6時に行ったんじゃ、 全然残っていないわけですが。
前々から Struts という存在が気になっていて、しかしWeb上にある解説サイトを流し読んでも 「一体何をするソフトウェアなのか」すらさっぱり掴めなくて困惑していました。 「Webアプリケーションのフレームワークである」らしいことはわかる。OK。 その次にどの紹介でも「フレームワークとは何ぞや」が語られている。 フレームワークなんて今更解説しなくてもこの業界では一般的な名詞だと思うんだけど、 まあいいや。で、「Webアプリケーションの」フレームワークって何をしてくれるの?
…と、どうも私の問題点はStruts云々ではなくて、「Webアプリケーション」 ってのがどんな形をしているものなのか理解していないことにある模様。 「Windowsアプリのフレームワーク」って言われたらイメージは湧くしなぁ。 と反省して『Jakarta プロジェクト徹底攻略』 を買ってみました。
この本によると、Struts は
画面遷移の管理・クライアントリクエストの検証&オブジェクトへ自動格納・
レスポンスの作成・国際化されたメッセージ資源・ロギング・コネクションプーリング
の機能を提供しているらしい。なるほど。そう言われるとやっと把握できた。
Struts の枠組みに合わせて書けば上のような機能が自然に実現されるんだろう、
きっと。ちゃんと調べて見ようっと。
.np - ドットニッポン ドメインとな。何が格好いいって、ネパールの国別ドメインとしても従来通り使いつつ、 日本向けにも提供することで .np を共有しちゃおうとしている点。 本当かどうか知らんけどネパールでは .com.np や .org.np が利用されているため かぶらないらしい。ネパールなのか日本なのか微妙に国籍不明な雰囲気が漂いそうで、 いい感じ。
Diki ってのを書いてみた。 書いてみたというか、数ヶ月前に書いてたのを引っ張り出してきて公開してみる。 YukiWikiMini の劣化コピーです。ここのサーバの libg++ が古いもんだから dmd が動かないので、デモをお見せすることができないのが情けないところ。
httpD が凄い!
Embedding Domain-Specific Languages in Haskell というテーマで並んでいる文献を端から読んでいたりします。 C++のSpiritとかFC++やxpressive、HaskellのHaskoreみたいな、 「言語内言語」を埋め込むことで表現力を増そうという試みが色々。 どれも、上手いこと実現するもんだなぁ、と感心させられます。 しかし見ているとやっぱり、この手の"ミニ言語埋め込み"を綺麗に記述できる それが目的のプログラミング言語、というのを設計したくなってきます。
…がツボにはまった。
流行り物ということで、学習型メール振り分けソフト POPFile を導入してみようかどうか考え中。便利そうだし楽しそうなんだけど、 間違ってSPAMと判定してゴミ箱行き…ってことが起きてしまうと困るし。 鍛えたらどのくらいの精度になるもんなんでしょう。
青くする実験 やりたいなぁ。曜日によって色素を変えて七色の食事風景にしたりするの。 うわ嫌だ。
自宅マシンからスパイダソリティアを削除して、学校の環境では .cshrc にて
"alias xjump sl
" しました。よし、これでうっかり間違って遊んでしまうことはなくなった。
月島から八重洲口まで40分あれば歩けることが判明したので、 今後東京駅付近にいるときの夕飯はもんじゃ焼きになりそうです。
下の記事でリンクをはったJavaScript2.0草案、この文書を翻訳された方のサイトが情報豊富で面白い。 思わず読みまくってしまいました。Effective JavaScript って、自分もこの名前で何か書きたいなと思ってたのだけど、 先駆者でしかも素晴らしい文書が既にあったのですね。関数にコンストラクタを渡して template だーなんていう素敵な技の紹介が見られるとは! あと、今公開停止中のようだけれど、Alphaなるエディタがサロゲートペアまで含めてきっちりUnicode対応してるらしい。
boost::regex のインターフェイス、もうちょい一貫性があるものにならんかなぁ。
OCamlの標準ライブラリにString.mapがないのはなんでだろう。 ExtLib は皆入れるのが当たり前、だったりするんでしょうか>識者。
ちょっと前から気になっていた 『Epimetheus』 をCVSから落としてみました。まだ確定してない仕様である ECMAScript4 とゆーか JavaScript2.0 とゆーかの実験的な実装です。
私が今現在もっとも好きなプログラミング言語はJavaScriptなんですけど、 最新のJS2.0の仕様はざっと眺めた限りでは、クラスとか名前空間とかパッケージとか、 どっかで見たような機能ばかりで全然面白くなさそうなので敬遠してました、実は。 しかし先日この文書をじっくり端から追ってみるに、いややっぱりこれは要チェックだ、 と心を入れ替えた次第。
で、Epimetheus。JavaScript開発者のWaldemar Horwat氏はとてもhard core language guy
であるという話は聞いていたんですが、しかし、言語全体の Semantics が
Lisp で書かれてソースのディレクトリ内に含まれているほどとは。すげぇ。
「草案には入ってたんだけど規格化の段階で抜いた項目一覧」とかも面白そうだから何かの機会に復活させてくれないかな。
…などと言いつつコンパイルして実行してみたところ、 少し複雑な式をいれるとランタイムエラーで墜落してしまうことが判明。 うーん。もう少し待つか。