トップ 最新 追記

日々の破片

著作一覧

2006-02-01

_ C#日本語プログラム

上美谷さんの日記の「最近書いたコードの日本語度」。多分、実際の仕事コードか、それの擬似コードだと思うが、テーブル名、カラム名、メソッド名に日本語を利用しているようだ。

newrow.オーダー番号 = 決済用オーダー番号算出(ds);という行が象徴的。業務システムのソースコードの1つのあるべき姿だろうな、と感じる。

VS.NETにmigemoが欲しいというのは納得。

#難点にも気付いた。日本語文書が横に長いと読みにくいというやつだ。慣れの問題かも知れないけど。ソースコードの説明度は(一般論として)極めて高いが、視覚表現としては微妙な印象。

#と書いたこのエントリー自身を読むとそれほど読みにくくない……。ASCII漢字仮名混じりの行が横に長いと、英字部分が落ち込むから横に追いにくくなるのか? (主観度高し)

_ ぐは、

遅い遅いと思ったらRewriteRuleのdispatch.cgiをdispatch.fcgiに直し忘れていた。

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

_ babie [お客様側で使ってる用語が、ふさわしくない・誤解を招くような言葉だった場合困るなぁ。]

_ arton [それはわかる気がする。]


2006-02-02

_ サーバー立てるの続き

非マニアックな人がルータの内側でHTTPサーバを立てるとしたら何が良いかにコメントくださった方々、Blog/日記でご教示くださった方々(RefererとTBしか確認できてないけど)ありがとうございました。

(ちょっとここで迷い――さすがにそれはさもしいだろうという悪魔の声と、やっぱり利便性ってのはあるよねという天使の声とが聴こえてくるから天使の声に耳を傾けることにしてアマゾンを開いてASNを引っ張ることにするので一度中断)

ダントツ(bakelattaさんbabieさんたださんogijunさん上美谷さん)で

B0007YT8WA

まさか、こういう時代が来るとは思わなかったのだけど、主な理由は以下の通り。

・静か、小さい―の中では圧倒的に高速

・アップデートは簡単(これがある意味では最も重要)

・基本的になんでも入っている(Apache、Ruby)

・直接操作する場合にきれい(これは確かに。最初にSafariで世界を見たときの衝撃は忘れられない)

追記:とは言うのものmputさんから「 Mac mini でサーバするのはちょっと玄人向け」(というか読むとちょっとどころかほぼやめとけと読める)という反論あり(というかbindが出てきたあたりから最初の前提より深くなっている気がするけど)。

LinuxならばDebian GNU/Linuxbabieさんwoodsさん、おれ)

・安定版は安定していることが期待できる

aptの存在(それなりに敷居は高いとは思うけど、十分に許容範囲だと思う。というかapt-getもできないでサーバー立てるとはと小一時間)

・神の本がある

Debian GNU/Linux徹底入門第3版 Sarge対応(武藤 健志)

#というか、Fedoraを恐れもなく使う勇者が本当に勇者なら良いのだが(るいもさんwoodsさん、僕も同意)。

個人的にはSolaris 10も良いと思う。

・でも、Sun Solveは相当敷居が高い。

・とか見ていくとマニアックでしたか……とすると、woodsさんFreeBSDと変わらないか。

番外:Windows(Lady.BUGさんwoodsさん上美谷さん、僕もこれもありだとは思う)

・ソフトウェアの自動更新はでかい

・RubyのインストールはASRがある(が、近い将来署名が無いからだめになるのではないかという恐れも)

・というか普通(!= ふつう)だし

・でもライセンス―というか現在は実際の制約になっていると思ったし、やはり微妙過ぎて上のような選択肢がある以上Pro版やHome版をサーバーにするのは勧められない。ということで現実的には上美谷さんがポイントしれくれたMicrosoft Action Pack サブスクリプションが37,800円で良い線。

番外の番外:KKさんのWindows98+AnHTTP。確かにこれもわかる。(Windows98 SP2だとは思うけど)が、さすがにこれは古過ぎ。

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

_ muwmuw [ちょっとずれるかもしれませんが、MacOSXで実験用サバ立上げるなら、MAMP(http://www.mamp.in..]

_ arton [どうもありがとうございます。 実はPowerBook(僕が利用できるOS X)だとどこにApacheが入っているのか..]

_ arton [あ、でもこれはテスト用なのか。確かに趣旨とは違いますね。でも、それはそれで便利そうなので(というか僕には使い道がある..]


2006-02-03

_ 似て非なるもの

拡張メソッドとstatic import。

どっちも外部のstaticメソッドをあたかもあらかじめthisに結合しているかのように記述できる。

でも、static importはimportしたクラスの記述にのみ影響。拡張メソッドは引数で指定したthisに影響。その意味では拡張メソッドのほうが応用がきく(というよりも応用例が先にあってそれを実現するために考えられたようだ)。

どちらもmixinのように見えるが、インスタンスの内部に入り込むのではなく外部操作を与えるだけなので少なくてもRubyのmixinとは異なる(mixinの定義次第ではある)。

_ LINQの実現(MDC 2006)

どうやってLINQを実装するか、というヘルスバーグのセッションがおもしろかった。

最初にLINQ構文があって、それを実現するために.NET Framework2.0を変更せずにコンパイラの変更だけで済ませる。

導入したのは

・無名タイプ

・オブジェクト初期化構文(一見Javaのイニシャライザみたいだが、インスタンス生成後に実行されることと、外部からのnew呼び出しでの記述となる点が異なる)

・型推論(式から求められる型=無名型をそのスコープで有効な型として扱う−インテリセンス対象になるのだから編集時にも見ている?)

・ラムダ式(デリゲートに変換される)−クロージャの例も示していたがrefを利用したとしてもスタックが畳まれた後も生き残るのだから、値型については実際にはrefではなくコピーが取り込まれるのだと思う)

・拡張メソッド(外部のstaticメソッドをthisのメソッドルックアップの対象として組み込む)

特に無名タイプというのは、猛烈に便利そうな機構だと思った。

大前提としての強型付け(=Visual Studioでインテリセンスが有効であること。と、コンパイル時の名前解決とは言わなかったがこれが重要なのは多分合っていると思う)を生かすための無名タイプのコンパイル時(編集時?)生成というのがキモに見えた。

とにかくヘルスバーグはプレゼンがむちゃくちゃにうまい。スライドの内容を暗記しているのはもちろんのこと(だからスクリーンに映されているのは日本語版。一箇所資料の左右を間違えて説明した箇所があったが途中で気づいて言い直した)、緩急自在、立ち居振る舞い、トピック切り替えのタイミングなど。プレゼンってのもデザインなのであるな、と思った。

#そうか、無名クラスと呼ぶとJavaの無名クラスのように見えるが、LINQの場合結果セットを格納するためのオブジェクトで、メソッドのセットを作るためのJavaの無名クラスとは目的が異なるから、無名タイプと呼ぶのかも。

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

_ arino [う、ヘルスバーグ、面白かったですか… 行けばよかったなぁ。 知ってる話題が多かったし、ヘルスバーグの話の為だけに横..]

_ arton [PDCでのC#3.0の拡張を追っていれば目新しい話題ということはないと思います(僕はちゃんとは追っていなかったという..]


2006-02-04

_ 横浜ではないMS

「Dave Provert」(soutaroにっき)の講義の実際。

さらにリンク先の登さんのところがおもしろい(本当に雑談なのだけど)。Priusに乗りたがるところとか。

#今日の薀蓄。HALはHardware Adaptation Layerが正しい。(だからどうというわけでもないけど、MS Pressの公式の呼び方と実際に作ってるところで名前が違うという点。確かにあるな)

_ LINQ続き

今は資料が手元にあるので、セッションの内容を書いてみる(適当にこちらで再構成して、さらに省略してある)。

出発点

public class Foo {
    public Foo(string r, int z) { bar = r; baz = z; }
    string Bar;
    int Baz;
}
public class Foos {
    public static Foo[] GetItems() {
        return new Foo[] { new Foo("a", 0), new Foo("b", 1), new Foo("c", 2) };
    }
}
LINQは、SQL専用の構文ではなく、コレクションに対する統一した操作を提供するものだ。したがって、上のFoosを処理できなければならない。
var v = from foo in Foos.GetItems()
        where foo.baz > 0
        select new { foo.bar };
この結果としてvには
class ? {
    public ?(string s) { bar = s; }
    string bar;
}
?[] { new ?("b"), new ?("c") };
が入る。
したがって
foreach (var i in v) {
    System.Console.WriteLine(i.
と打つとインテリセンスがbarを表示する。
.NET Framework 2.0は変えないのだから、LINQの構文はオブジェクトに対するメソッド呼び出しに落とし込む必要がある。
var v = Foos.GetItems().Where(foo => foo.baz > 0).Select(foo => new { foo.bar, boo.baz});
ここで新たに加わった言語要素が、
  • varというローカル変数の型推論指定子
  • WhereSelectという外部メソッド(Foo[]がWhereを実装する必要があってはならないことは自明)をオブジェクトのメソッドルックアップの対象とする機構(拡張メソッド)
  • ラムダ式 (パラメータリスト=>ブロック本体)
  • new { 初期化指定 }という無名型とその初期化構文
実際には、ここに至るまでの検討も相当あったようだ。たとえば拡張メソッドという仕組みがなければ、すべてのクラスにWhereやSelectというメソッドを実装することを強制すれば良い。が、これは.NET Framework 2.0の既存クラスに影響を与えるし、そもそも無駄(代替手段があれば)。
次に
public static class Sequence
{
    public static IEnumerable<T> Where<T>(IEnumerable<T> source, Func predicate) { ... }
    ...
}
というユーティリティを作ってそれを直接呼ばせる方法。そうすれば
var v = Sequence.Select(Sequence.Where(Foos.GetItems(), foo => foo.baz > 0), foo => new { foo.bar, boo.baz});
というようにスタティックメソッドのネストを利用することができる。
この場合の問題点として、ヘルスバーグが挙げた理由は可読性の低さ(Selectの構文に対して「何だって?」)。

#でも、この展開はコンパイラがLINQの構文から自動的に行うのだから、それほど必然性は無いようにも思えるな、今、思い返すと。
ただし、もしLINQ構文を利用しないのであれば、引数そのものにはインテリセンスは効かないのに対して、Foos.GetItems().と打った時点でWhereを出すことができる拡張メソッドのほうがVisual Studioを前提とした場合には望ましいということはわかる。

拡張メソッド構文では上のSequenceの定義が次のように変わる。
public static class Sequence
{
    public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { ... }
    ...
}
第1引数をthisで修飾すると、第1引数の型のメソッドルックアップテーブルにメソッドが追加される。
というのがさわりの部分だった。
本日のツッコミ(全2件) [ツッコミを入れる]

_ babie [「と打つとインテリセンスがbarを表示する。」で bar の code タグが閉じられていないので、以降全ての文字が..]

_ arton [修正しました。どうもありがとう。]


2006-02-05

_ ソリューション、サービス、アプリケーション、システム

プログラムはプログラムだからどこにも疑問の余地はない。

でも、ソリューション、サービス、アプリケーション、システムという言葉は便利過ぎて適当に使える。

このうち最初の2つはプログラムを後置できないところが多分、ミソではないだろうか。後の2つはプログラムを後置すると対概念っぽく見える。

あるコンピュータをハードウェアとソフトウェアの2つに分割した場合、ソフトウェアはアプリケーションとシステムに2分割できる。この場合のシステムというのはOSのカーネルやデバイスドライバーだ。ではたとえばXはシステムプログラムなのかアプリケーションプログラムなのか? グラフィックドライバーやネットワークシステムプログラムから見れば上位にあるからアプリケーションプログラム、でもXeyeから見ればシステムプログラムだ。

ソフトウェアはレイヤーに分かれているのでアプリケーションとシステムという見方は相対的にならざるを得ない。したがって今となってはそれほど意味のある区別がつけられないように見える。しかもプログラムというのが単一の実行(むしろロード)単位として利用されるようにモジュラー化されているため、アプリケーションの中にシステムもあればシステムの中にアプリケーションがあることもある(ように見える)。

システムというのはこれまた便利な言葉である。Wordはアプリケーションであってシステムではない。でも、Officeはシステムと言えそうだ。つまり結合されて全体として何かの機能を提供するものはシステムと呼ぶことができる。

そこでより抽象化してしまって、ソリューションとサービスと呼ぶほうが具合が良いということだろうか。

この場合、ソリューションというのはほとんどの場合、システム化されたアプリケーションを意味するように見える(が、その下にはハードウェア構成や運用までもカバーしている)。そのように見ると、Officeソリューションと呼ぶことも可能だ。

でも、Officeサービスとは(多分)呼ばない。

ではサービスとは何かと考えるとWebサービスという使い方が典型だろうが、ソリューションの一部かも知れないが、その外部にあって呼び出して利用する別のソリューションと考えるとしっくりするように思える。だが外部、内部というのもまた相対的なものである。

サービスとソリューションはむしろ所有の有無や制御権の有無に関する分類かも知れない(そもそも、その2つを対概念として考えなければそれまでだが)。

というようなことを、ソリューションを考えながら考えるのであった。

_ この本は何?

アマゾンアフィリエイトの良い点の1つは知らない本が買われることで自分の知識が増える点だ。

で、興味を惹かれたのが

Software Estimation: Demystifying the Black Art (Developer Best Practices)(McConnell, Steve)

タイトルを直訳すると、「ソフトウェアの見積もり:黒い技法を詳細解説」という感じ。結構売れているようなのだが、全く知らなかった。というかThe Black Artとはなんだろう?

(後でMSDNで調べる予定のメモ)

調べた:

Software Estimation: Demystifying the Black Art

Often referred to as the “black art” because of its complexity and uncertainty, software estimation is not as difficult or puzzling as people think. In fact, generating accurate estimates is straightforward―once you understand the art of creating them.

複雑さと不確実さからブラックアート扱いされているが、そう思われているほどは難しくもなければこんがらがっているわけでもない、ということか。

といわれても、普通はそりゃそうですな、とは納得しないから本になるのだろけど。

ただ、real-worldという言葉の適応対象が、Wordみたいなシュリンクラップだと、そんなに役には立たない(とは言い切れないとも思う)わけで、どういう分野を想定しているんだろうか、というのはよくわからない。

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

_ 福盛 [> Software Estimation: Demystifying the Black Art あ、恐らく僕が..]

_ arton [>恐らく僕が注文したものです それは、どうもありがとうございます。 それはそれとして、Code Completeの人..]


2006-02-06

_ 機内持ち込み制限

ガラス片は凶器になるわけだし、そうでなくても割れれば危険だから、メガネは機内持ち込みはもちろん荷物に入れるのも禁止。X線で見つけやすいから良いね。

というような規制は厄介だな、と思う。

日本人は結構迷惑するんじゃなかろうか。メガネを使う人が多い国に対する嫌がらせのような。


2006-02-07

_ もう7日か

変な感じ。

_ RoRでフォワード

リダイレクトは一度クライアントへ返してからリダイレクト先URLを再アクセスさせることで、renderは、指定したレンダリングをすることだ、ということはわかった(というか前者はわかるも何もそういうものだけど)。

フォワードに相当するのが見つからない。つまり、コントローラを通したい(だからrenderじゃだめ)がクライアントと往復する必要が無い場合。

でRdoc見ても見つからないのだけどふと、直接メソッドを呼べということか、と思い当たった。が、本当にフォワードするにはそれしかないのだろうか。

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

_ dan5 [scaffold で作ったコントローラには以下のようアクションができますが、こんな感じのことですか。 def i..]

_ arton [そうです。ということはやはり直接呼ぶのが正解なのですね。 どうもありがとうございます。]


2006-02-08

_ リファラspam

くそーポーカーとかチープとかは入れてなかったorz。

止めるのも手ではあるが、ブックマークにも利用しているからそれも詰まらんし。

後で消す(このエントリじゃなくてリファラ)。

(つうか、まだしつこく砲撃を続けてるのか……)

_ OS Xでサーバー

僕は勘違いしていたようだ。(追記:というわけでもないのかな。PowerBookを見ると/etc/apache/httpd.confが入っているのでServerが付かないOS XにもApacheは導入済みなのかと思ったけど、バイナリそのものが見つからない――単に見る場所が違うだけかも――ので、最初から全部入りというはOS X Serverのことなのか、と思ったとかいろいろ。最初想定していたのはServer抜きのOS Xだったんだけど後からogijunさんやmputさんが書かれていたのはServer付きの話なのかと思って冒頭の「勘違い」という書き方になった)

Mac OS X Server v10.4 10クライアント(-)

10クライアントライセンスということならば、Windows XP Proと同じ条件なのか、もしかして。でも値段は良いぞ。

【旧商品/サポート終了】Microsoft Windows XP Professional Service Pack 2 通常版(-)

でも、unlimitedバージョンを見てから

Mac OS X Server v10.4 Unlimitedクライアント(-)

Windows 2003 serverを見ると

Microsoft Windows Server 2003 Standard Edition 5クライアントアクセスライセンス付(-)

は5クライアントとなっているな。

#ファイルサーバーとしてのクライアント数とHTTPサーバーとしてだけのクライアント数って別なのか(追記:ogijunさんが先に書いてくれたけどOS Xの場合ファイルサーバーとしての(認証が必要な)クライアント数ということだそうです)、とか考えたり調べたりするくらいならDebian GNU/Linuxのほうが良いと思わざるを得ないのだが(Solaris 10もあるけど)。

追記:上美谷さんの日記も参照

_ CodeZine傑作選1

開発者のための実装系Webソースコードマガジン CodeZine(コードジン)傑作選 Vol.1(SE編集部)

出ました。僕のも1つ載ってます。

いまや稀少なコードが主体な紙媒体なので(出自はWebだけど)、続くと良いですね、と思います。

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

Before...

_ arton [>「Web共有」向けにApacheはインストール済みです おお、どうも。ってことは探し方が悪かったようですね。もっと..]

_ otsune [今使っているServerではない普通のMac OS X 10.4.4でwhich httpdしたら/usr/sbin..]

_ arton [あ、衝撃でもないけど飛んでもない事実が明らかに。いつもapacheそのものを意識するときは/etc/init.d/a..]


2006-02-09

_ IDEは戦車

というような言葉を「暗黙的インタフェースの実装」を眺めていて思いついた(程度の話)。

もちろん、それほどは困らない。もし、元のclassがfinalでなく、かつメソッドのセットが十分に小さければ。

class Purse {
    public boolean isStolen() {
        return this == null;
    }
    public Coin[] parse() {
        return new Coin[0];
    }
    public void add(Coin c) {
    }
    public boolean isBroken() {
        return true;
    }
}
があるとして
class UsefulPurse extends Purse {
    Map coins = new HashMap();
    public boolean isStolen() {
        throw new IllegalOperationException("wakarukai");
    }
    public Coin[] parse() {
        return CashDispenser.sort(coins);
    }
    public void add(Coin c) {
        CoinBag bag = coins.get(c.getFace());
        if (bag == null) coins.put(c.getFace(), bag = new CoinBag(c.getFace()));
        bag.add(c);
    }
    public boolean isBroken() {
        return false;
    }
}

問題は、そういうことを何も考えていないクラスの場合にある。

class PerfectPurse {
    public boolean isStolen() {
        return this == null;
    }
    public boolean isBroken() {
        return true;
    }
    public void addFiveCent(Coin<FiveCent> c) {
    }
    public void addDime(Coin<Dime> c) {
    }
    public void addQuarter(Coin<Quarter> c) {
    }
    public void add1Yen(Coin<Yen1> c) {
    }
    public void add5Yen(Coin<Yen5> c) {
    }
    public void addPenny(Coin<Penny> c) {
    }
    public void addOkinawaKinenCoin(Coin<OkinawaKinenCoin> c) {
    }
    ...
    public void add(Coin<FiveCent> c) {
    }
    public void add(Coin<Dime> c) {
    }
    public void add(Coin<Quarter> c) {
    }
    public void add(Coin<Yen1> c) {
    }
    public void add(Coin<Yen5> c) {
    }
    ...
}

インテリセンスって素晴らしい。山ほどメソッドがあっても適切なメソッド名をドロップダウンから選択できる。そればかりか型をチェックするIDEの機能もすばらしいものだ。メソッドを記述すると引数に与えられる変数の絞り込みまでしてくれる。でも、その上等な料理にハチミツをぶちまけるかのごとくクラス設計ができるのはいかがなものか(from monky on a raft)。

使える財布にしようと思ったら(幸いなことにまだ232個しかない)メソッドをオーバーライドしてやれば、この財布が直接newされていない限りはまともな財布に交換することができるかも知れない。

でも、233個もメソッドがあったら、すでに作られてしまったアプリケーションを全部廃棄処分にしたくなるだろう。

それはオーバーライドする手間がばかばかしいからだ。

「いや、それは怠慢ですよ」とこの素晴らしいインテリセンス−エイブルな財布の考案者が語りかける。「IDEでこのクラスをポイントしてから<派生>コマンドをクリックしてください。voila!」

するとIDEが新たな編集画面を開いてくれる。

class MyPerfectPurse extends PerfectPurse {
    public boolean isStolen() {
        return super.isStolen();
    }
    public boolean isBroken() {
        return super.isBroken();
    }
    public void addFiveCent(Coin<FiveCent> c) {
        super.addFiveCent(c);
    }
    ...
}

「ささ、この完全無欠な財布に何か付け加えるものがあると言うのでしたら、いくらでも追加してください。ささ、ささ。」(と、チケットピアの相撲取りのごとく、ささするのであった)

どうも、何かが違うようだ。問題は、「オーバーライドする手間がばかばかしい」という手間の問題だと考えてしまった点にあるようだ。

教訓:臭い匂いは元から絶たなきゃダメ

_ 手も足も出ないというのは

日記は書けるが、サーバーのメンテナンス(この場合は、ログの直接編集とか.htaccessの設定とか、tdiary.confの設定とかだ、というか本日のリンク元を最新版にするとか)ができないというのは、実にいらいらするものだ。まだ、ポーカーとチープな肥満薬が来てるのか……(もしかして日本語が読めるのかな? 読めないと思ってカタカナで書いてるのだが、「おお、話題にしてくれてる。こりゃ効果が出てるぞ」と喜んでるとか?)

_ 感想

トランザクションがないのに金になるシステム」を読んで。

「事前の負荷限界」がある世界とそうでない世界には、それぞれ違う種類の高度な技術があるということだと思います。

ということが本当に、いろんな場所でコメントをするたくさんのyamatoさんたち(という名前の1人をさすのではなく、そういう主張の人たち)や、その逆の人たちには理解できないのだろうか?

そうは思えない。

本当にバカの壁ってあるんだろうか? やはり、そうも思えない。

そこまで世の中に視野が狭い人であふれてるってことはないんじゃないかなぁ。もしそうなら、集団知という相互作用はいつまでたっても生まれることはなく、単に狭い仕切りで区切られた箱のようなものしか出てこないように思える。いくらふっても仕切りの中身は混ざらないから、どこまでいっても単にカタログとしてしか扱いようがない。それはつまらない。

では、なぜ、そういう壁があるかのようにしか見えない意見が出てくるのだろうか。むしろ、そっちに興味が湧く。

いろいろ考えてみると、それは発言に対する壁ってやつなのかも。たとえば、僕(以下の「僕」はこの仮想的な人格だというのは自明だけど一応、注)が都市銀行のATMのネットワーク構成を考え、保守プランを考え、運用プランを考える技術者だと仮定する。

僕は自分の職業的ミッションのすさまじいまでの困難さとそれを解決するための知恵と技術に誇りを当然だが持つ。たまに複数の事象が原因で起きた予測不能な障害のために5分間停止して新聞に叩かれまくるときっとへこむよりも、その特殊な事象の発生と予見の不可能性に対する無知と無理解に対して、怒りを覚えるだろう。

でも、僕はその僕が持つ高度な技術の実際についてあるいはそれによって獲得したさまざまな知見や技術的な考察、技術的な展望――そういった種々の技術的な知識や知恵について、公の場で誇ったり説明したりすることは、多分できない。なぜならばそのネットワークの企業的知的財産の保護に引っかかることが容易に想像つくし、仮にそうでなくてもそういう行動に出ること自体が保守プランに対する穴を開けることになるし、さらには職業的倫理に反することになると思える(し、それに反しないことがまた高い誇りに繋がる)からだ。

ところが、どうもそれに比べると屁みたいに見える(が、そこには当然別の技術があることは当然ながら理解できるのは、幾つかの点において技術は技術で自明だからだ)技術について、語らっていたり誇っていたりするのを、Web上で良く(では実際にはなくても、職業的な興味からは突出して見えるので「良く」となる)見かける。

おもしろくない。なぜ僕はもっと賞賛されないんだろうか?

一発コメントでも書いてへこましてやるとするか。もっと僕を誉めてくれよ。は無理だから、僕のほうがすごくて君のほうがへたれだと、一言入れてやることにするか。

――と、(ここから先の「僕」は仮想人格ではなく、本来の「僕」に戻る)いうような考えにあるのではないだろうか。

これがもし正しいとすれば、壁は視野の狭さにあるのではなく、職業倫理による発言の封じ込めにあると考えることができる。

ネットは、匿名を許容する。たとえば、僕が誰かは僕と直接面識のある人しか知らないことになっている。だから僕は、壁を基本的には無視できる。なぜなら、匿名の人間は壁抜け男だからだ。

壁抜け男 (角川文庫)(マルセル エイメ)

いや、こっちのオノレシュブラックか。

アポリネール傑作短篇集 (福武文庫―海外文学シリーズ)(ギヨーム アポリネール)

で、そういう人たちも壁を抜けていろいろそのへんについて書いてくれれば良いのにな、と僕は思うのであった(抜けないまでも高さを低めることは可能なはずだ)。

注)実際にはいくつかのBlogでそういう壁抜けを見ることがある。だが、たくさんのyamatoさんがそうであれば良いな、と思う。その場が現在は2chとコメント欄にしかないところが、あまりおもしろくない点なのだ。2chはノイズが多いし、コメント欄にはノイズしか乗らないように見える。

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

_ hyuki [「インテリジェント・コピペ」という用語を思いつきました :-) > IDEは戦車]


2006-02-10

_ リファラがカウントされている謎

リンク元を見るとFastCGIのほうにリダイレクトされるほうのURLなのに、なぜ読めるんだ?

#この時点では/diary/はFastCGIが死んでいるのでタイムアウトするはず。/diary/index.rbだと読めるけど。(と、注記)

#追記:携帯側はアクセスできる。

_ Y

いやーおもしろいなぁ。法定相続とか国民にも敷衍しちゃえば楽しそうだな。気に食わない弟の息子とか、顔もみたこともない祖父の兄のひ孫とかにばんばん遺産とか渡っちゃうわけ。長女がどんなに可愛かろうが権利なし。

そうなれば、子供減少も解決かも。男が生まれるまで遺産と言えるだけのもの(家なんか買っちゃったらもうそうなるだろうね)ばんばん子供作りだすよ。

ああ、そうか。Yの人たちの深慮遠謀なわけか。国家繁栄、人口減少の歯止めのための。


2006-02-11


2006-02-12

_ 天気

良く晴れている。


2006-02-13

_ リファラspam

溜まっていた分を処理。

それにしても、どの程度のマーケティング効果が上げられるものなんだろうか。あまり役に立ちそうにもないのだが(木馬のダウンロード基地とかだったらわからないでもないけど、そこまで悪質そうなのは今のところ見てないんだが)。

_ 寸志

寸暇は惜しむものだが、寸志は与えるものだ。

とは言うものの、一体、その職業は何かというのが気にかかる。

芸術家はすべてを芸術のために捨てる必要はない。が、画家は絵を描いているときだけが彼の仕事時間ではないだろう。いや、画商と交渉している時だけが彼のビジネスタイムなのだろうか? だとしたらいつ絵を描けば良いのだろうか。

あるいは企業に属するという言葉が本質的には2つの意味を持つということも考えるべきではないだろうか。1つはたまたまその企業に草鞋を脱いだという状態。股旅者はもしかしたらある日突然去るかも知れず、居心地良ければ居つくかも知れず。その一方で、心身ともに属するという状態もある。その企業が廃業すれば明日からの身の振り方に頭を抱えることになる。

股旅者が長ドスの手入れを怠らないのは、去るべき日が来る可能性があることを知っているからだ(仮に今の日がどれほど心地よかろうと)。

去る気のない子分衆に、家へけえってからドスを研げと言うのはせん無きことだ。またそれを勧めるのは確かに偽善であるかも知れない。

しかし、股旅者ならばまた異なる振舞いもあろうというものだ。

とか、思った。そこでやくざものの話になるのは、たまたま目の前にこんなのがあるからだが。

旅人(たびにん) 国定龍次〈上〉(山田 風太郎)

蛇足を追記:

しかし仮にも一宿一飯以上の義理もあれば一緒に釜の飯を食った仲でもある。そこで一家と共に心中覚悟の子分衆にやはり一言声もかけたくなるのもまた人情。差し出がましいとは思いもするが、おいおめぇら、何の因果か渡世の世界に身をおいちまったのを恨むなら恨め、お天道様の下は何もここばかりじゃない。でいりに負けて夜逃げの算段することもありゃ親分の勘気に触れて出入り禁止になることもあらぁな、だからと言ってそのまんま食いっぱぐれになることぁなかろう。そんときものを言うのはてめぇの脇のその長ドスひとつ、ちったぁ磨いてやってもバチがあたることぁあるめぇ。

#しかし、自動小銃を発明するという方法論もある。

どちらも出来なければ、それまでだ。


2006-02-14

_ なんだかなぁ

開発者応援キャンペーン

Visual Studio 2005の発売を記念して開発者応援キャンペーンが本日からスタート! 抽選で8名様にムービーも見れるiPod 30GB Blackをプレゼント!

「ら」抜き表現orz(そこかよ)−ただしMSDN Flashだけで読めるわけだが。

_ 良い記事

Linuxにおけるソケット機能の向上

(しかしヒント4を除けばLinuxに限定する意味はまったく無い)

このヒント1についてHTTPに限定して見ると、イントラでは相当意味がある反面、インターネットではほとんど意味がなかったりする(というかNODELAYは悪というほうが良かったり)。

勘違いでなければ、スィッチ全盛(だからイントラ限定)の現在ではNagleアルゴリズムは無効と考えるのがデフォルトではないだろうか。コリジョンデテクション(パケット数が少ないほうが有利)とキャリアセンス(パケット長が長いほうが有利)って今でも有意なんだっけ?

_ レクラ

正確な発音がわからない……と考えることもないので日本語訳もつけているわけだが。

もともと好きなモノから意味に意味を重ねて響きに響きを乗せて作った言葉なので意味はないけど、カタカナで書けばレクラデジュール。英語だとthe fragment of the days。だがfragmentではなく、ウアクセンテギュの硬質な響きを持つエクラ。

どんな意味や響きを重ねていたのだろうか?

日々の泡 (新潮文庫)(ボリス ヴィアン)

トムとジェリーが戯れる日光がきらきらと泡化したもの。

うたかたの日々(岡崎 京子)

伊東守男による微妙に意図的な誤訳っぽい意訳。だけど浮雲のような生活をイメージさせるという意味では必ずしも間違いでもなく。

ディーバ [DVD](リシャール・ボーランジェ)

100年前から、ジュール、ジュール、フランス人はこれだから保守反動の権化みたく言われるのよ。

海底2万マイル (講談社青い鳥文庫)(ジュール・ベルヌ)

でもベルヌ条約は守りたいかも。

Ritual in Memoriam Maderna / Eclat / Multiples(Boulez)

しかしすべては一連のつながり(セリエ)をぶつ切れにしたところから再生する。

浅草六区(リザード)

仲見世通りを駆け抜けて夢のかけらを探すのさ。

アドヴェンチャー(テレビジョン)

日々よ(ジョイディビジョンのこれらの日々というのも脳裏をかすめている)。

おまけ(ブレーズのを検索して見つけた)。どんなんだろう?

L'Eclat Du Ciel Etait Insoutenable(Hrsta)

飯は天(シエルがついたエクラ)。

#まあ、中二病の自分も大切に、というようなのが真意だったり。

あと、リエゾンがある(関係性を失わない)というのも重要(L'eみたいなのもリエゾンでいいんだかどうだかは忘れた)。

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

_ ムムリク [ついついプチロワイヤルを引いてしまいました。]

_ babie [いやぁ、ごちそうさまでした。満腹です。>エクラ丼]


2006-02-15

_ 卵から孵ったばかり

イクラでちゅー

うまいな。

イクラ→イスクラ


2006-02-16

_ こういうJava

ブックマーク整理してたら出てきた。ken Perlin

main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x
=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0;
j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}

フラクタルとかトロンとかワニとか。

クラスへ向かう生徒たちをクリックするとペリンメソッド(クリックベースプレゼン)。

トロン [DVD](ジェフ・ブリッジズ)
1982: two years before Gibson's Neuromancer!

そうだったのか。というかそうだな、そりゃ。

_ Scripting Games

February 13 - 24, 2006

なんておもしろそうなことやってんだ。

_ 微妙

「おんなのこ物語」復刊リクエスト。(無事復刊されたようでおめ)

っていうか、全部読んで無さそうな気がしてきた(途中でうんざりしたのかな?)。

_ 僕はおもしろいと思ったがそこに新規性があるかどうかは知らないVisual Studioの機能

GDNJが終わる

その理由が、MSDNフォーラムの開設にあり、しかも

MSDN フォーラムでは、GDNJ 掲示板のユーザーエクスペリエンスを保ちつつ、Visual Studio 2005 および SQL Server 2005 の各製品との統合を図り、Visual Studio 2005 の IDE から MSDN フォーラム内を直接検索する機能、過去に投稿したスレッドを一覧するマイ スレッド機能、投稿内容の評価などのさまざまな機能を追加し、皆様の開発環境がより快適になるよう機能強化を施しました。

この「統合」というのは読む限り(というかVS2005Jは手元に届いたが今インストール可能なマシンが無いので確認できない)文字通りにIDE内のコンテンツとして(きっとAlt-Hのどっかなんだろうけど)VS内に表示されるように見える。

#バグが出た時のレポート送信機能に双方向性を持たせたもの+2.0という感じか。

#言語対応はどうなるのか? コンテキストベースだったり。コンパイルエラーになった時点でAlt-H-なんちゃらすると、その言語の「コンパイルエラーの愚痴をたれるスレ」とかに飛ぶとか。

とかいろいろ考えるのだが、あらゆるアプリケーションで可能な方策であり、かつその双方向性に対して課金するとかのサービスの方向とか。

#ガレージバンドとかにそんな機能があるとか、イラレとかワードとか、いろいろありそう。

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

_ むらまさ [VS2005の「スタートページ」にはMSDN Onlineの最新情報が表示されたり、ヘッドラインが表示されたりします..]

_ arton [おおなるほど。どうもありがとうございます。]


2006-02-17

_ ナニワSI道

さて、るいもさんがうんざりしたりあきれたり感動したりしているし、それに対してmarsさんが感心したりしている。

それに対してsakitoさんがネタを出している。

ふむ。

もう結論のうち幾つかはわかっている。でもそれは誰でもわかっている業界の了解なので取り上げてもしょうがない。

ネタがネタに過ぎないのは、教育対象がずれているからだから良しとして、るいもさんのほうの話にフォーカスを当ててみる。

問題は

逃げ去る恋〔フランソワ・トリュフォー監督傑作選4〕 [DVD](ジャン=ピエール・レオー)

にある。よくできたシステムのことだ。これが元凶の1つであり、したがって教育がどうしたが的外れだという点にある。だって、既に教育された人間を雇ってる(はずな)んだからね。

そこでやっぱり国民総背番号制の導入ですよ。

脱税や隠し口座もばっちり摘発できるし。

で、納入するプログラムはすべてRFID内蔵チップに焼くこととして(ハードウェア納入ってことね)それを背番号と紐付けて、そうだな経産省でもいいや、のマスターデータベースで管理する。

バグったら地の果てまでも追跡可能とする。絶対に修正させる。本人が隠れたら保証人を追い込む。

「あの、求人広告を見て応募にうかがったのですが……」

「どうぞはいってください」

……

「じゃーこれ。我が社は筆記試験があるんだよ」

「はい、がんばります」

「時間は十分にあるからね。できたら呼んで下さい」

「はい」

――実践Javaを読んでおいてよかった。これなら全部できる

実践Java(るいも, 宇野)

カリカリ

――カンペキだ

「フムー勉強してきたのかね」

「はい」

「立派な心がけだ。ヨシ待ってろ。社長に報告してくる」

……

「入りたまえ」

「ひさしぶりに優秀な新人が現れましたよ、社長!」

「ほんとうかね。キミの評価は当てにならないからね!」

「いや、こんどはまちがいおまへん。満点でっせ、満点!!」

「どれ見せてみろ、フムーいいじゃないか。28歳か。年齢も問題ないな、宇野君とってみたまえ」

「はい」

……ピピピルルルツーツーピリッ

「どや該当ナシやろ」

「いいえ、SI屋1社で去年と今年、無意味なコメントと意味のない条件分岐が入ったソースを納入して、しかもデッドロックを3回起こしてます。でも修正してますけど……」

「エーッ、彼がつまんでいたって! しょうがない野郎だな」

「そらみろキミの評価はあてにならん! 東島君! 我々はソフトウェアを扱う商売なんだぞ! いったんバグを出したヤツは 必ずまたバグをだすもんなんだ!」

「ハッ、こころえております」

「そういうヤツを入れると事故のもとや! 断りたまえ!」

……(テストは満点にも関わらず不採用の結果を聞かされ憤然とする灰原)

「わかりました。失礼します」

「ああ、ちょっと待ち。ワシの忠告やがな。あんたはまともなSI屋は雇わんと思うで。まあ、Web系やったらわからんけどなー」

ナニワ金融道(1) (講談社漫画文庫)(青木 雄二)

この強烈なトレーサビリティーの導入によって、日本のエンタープライズアプリケーションプログラミングの世界は壊滅したのであった。いや、おれなんか真っ先に国外追放されそうな気がする。

_ 欲しいマシン

タブレットiMacが出たら買う。すぐ買う。バッテリ内蔵で、台が携帯の置物みたく充電器兼ねててすぐ取り出せるようになってる必要はあるけど。当然、マウスとキーボードはBT。電源とつながってるのは充電器なわけだし、LANはWiFiだから早い話があの白い塗り壁だけをすぐに持ち運び可能になっているのだ。当然、iBookのように出っ張りがないつるつるデザイン。iBookじゃなくてiMacなのはでかさが20インチのほうが嬉しいからだ。多分、Appleは小さいノートは出さないだろう。だったらでっかなタブレットのほうが便利であるな。

たとえば、デスクトップで使ってて、疲れたとする。そこで充電器兼置き台からスポッと抜いてペンを持って小脇に20インチを抱えてカウチへ行き、寝転がって作業だ。重さを考えると仰向けは無理だな。うつぶせか。とするとカウチじゃないほうが良いかも。

あるいは、デスクトップでWeb見てたら良い料理ページがある。そのままスポッと充電器から持ち上げて台所へ塗り壁持ってって見ながら料理だ。

Googleマップを出しておいてスポッと抜いて車へ……ちょっと無理があるかも。でも、iTunesをiPod抜きで使えればそれで良いような。だって車を運転している時はデスクトップ上のコンピュータに用は無いし、逆もまた真。

(問題は、タッチスキャナを付けると液晶の質が低下する可能性が高いことだな。すると、ジョブスがこんな汚い画はMacじゃないとか言って怒って製品化できない)

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

Before...

_ arton [いや、そもそも1度でもバグを入れたら追放されるシステムだから、そうなったら最後、世界にプログラムが存在できません。と..]

_ むらまさ [「あきれたり」と「感動したり」のリンク先が同じなのは意図的でしょうか?]

_ arton [バグです。後で直します。]


2006-02-18

_ ASRのコンパイラを変更する予定

現在、VS6でビルドしてMSVCRT6と一緒にASRを作成しているけど、次からはVS2005でビルドすることにします。

除外ライセンスについての規定が

再頒布可能コードのソースコードを改変または再頒布すること

と明示的に限定されているからです。ASRのソースコードにはATLを継承したものは含まれていますが、それは「ソースコード形式で改変し」とは異なることは明らかです。

と、一応、書いておく。

の使い#ライセンスを読むとバイナリー(msvcrtをスタティックリンクしたものを含む)をWINEなどのWindowsプラットフォーム以外のプラットフォームでの実行を目的としての配布はできない(やらないけど)。

#でも、メインマシンには当分インストールできそうにない。どうしようかな。

#実際にはMSのライセンスには抵触していなくてもGPL2には抵触している(少なくても付随条項の追加が必要であるが無視している)ということは一応書いておく。というか、付随条項を入れれば良いのか。

_ 迷彩

迷彩記憶を開いて何か間違えたかなとすぐ閉じてしまって後でまだ読んでないことに気付いて開きなおしたり。使ってる人を見ないのでなんとなく自分専用のような意識になってたようだ。

_ ネストメソッド

こういうことかな?
#!/usr/bin/env ruby -Ks
class Calculator
  def initialize()
    change_behavior(?+)
  end
  def change_behavior(o)
    if o == ?+
      def calc(x,y)
        x + y
      end
    elsif o == ?-
      def calc(x,y)
        x - y
      end
    end
  end
end
 
c = Calculator.new
p c.calc(1, 5)
c.change_behavior(?-)
p c.calc(1, 5)
c.change_behavior(?+)
p c.calc(1, 5)
動かすと
C:\tmp>ruby calc.rb 
6
-4
6

こうやるとインスタンスではなくクラスの振る舞いに影響するのか。

c.change_behavior(?-)
p c.calc(1, 5)
c2 = Calculator.new
p c.calc(1, 5)
とすると、c2のためにinitialize()が走り、cのcalcが元の動作に戻る。

_ 尻尾を咥えようとする蛇のゲーム

defを呼ぶのが先か、メソッドを呼ぶのが先か、微妙な処理順によってうまく動いたりmethod_missingになったり。もちろんmethod_missingになったらゲームオーバー。(defするスレッドと呼び出すスレッドのレースゲーム)


2006-02-19

_ openssl-0.9.8aをvc8(vs2005)でmake

結局ノートパソコンにVS2005をインストールした。ということは、readline、zlib、openssl、tcl/tkとか全部作り直し。

……とやっていって、opensslで負けた。

ntdll.makから/WXを削除の刑。

1. extern int read()みたいなのがあって警告→停止

2. time_tを無条件にlong(unsigned long)に代入

このあたりまではまじめにソースを修正していたのだが

3. ある一点でaccessを修正したとたん、stdioあたりで_W64というシンボルに関するsyntax errorが山ほど出るようになった。解決できん。_W64が__w64に展開されるところでsyntax errorに変わることまでは追えたがどのような関連があるのかがつかめない。深追い禁止。

ms/testはcompleteだと言っているからOKとは思うが。

_ 後でどうにかする

取りあえず眠くなってきたし、別件もあるので、ここまで(警告もすごい数がでる。ただしOg-が非推奨、-G6が不明オプションというのがほとんど)。
	.\miniruby.exe ./../win32/mkexports.rb -output=msvcr80-ruby18.def msvcr80-ruby18-static.lib
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
./../win32/mkexports.rb:6: [BUG] Segmentation fault
ruby 1.8.4 (2005-12-24) [i386-mswin32]
 
NMAKE : fatal error U1077: '.\miniruby.exe' : 	.\miniruby.exe ./../win32/mkexports.rb -output=msvcr80-ruby18.def msvcr80-ruby18-static.lib
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
./../win32/mkexports.rb:6: [BUG] Segmentation fault
ruby 1.8.4 (2005-12-24) [i386-mswin32]
 
NMAKE : fatal error U1077: '.\miniruby.exe' : 
Stop.
Stop.

_ 続き

stable snapshotだとMSC_VERを見るように修正されていた。さすが。

で、今は、「../.././../ext/openssl/ossl.c(118) : error C2065: '__func__' : 定義されていない識別子です。」を見てるとこ。

……なぜ、HAVE_VA_ARGS_MACROが立っているんだ?

if try_compile("#define FOO(a, ...) foo(a, ##__VA_ARGS__)\n int x(){FOO(1);FOO(1,2);FOO(1,2,3);}\n")
  $defs.push("-DHAVE_VA_ARGS_MACRO")
end

チェックが甘いのか……。__func__を含めれば良さそうだな。

……ではなくて、__func__が標準ということだから、

#if !defined(__func__)
 #if !defined(__FUNCTION__)
   #define __func__ "unknown"
 #else
   #define __func__ __FUNCTION__
 #end
#end

とすれば良いような。というか、標準マクロとgccのマクロとVC8のマクロと全部押さえないとどうすれば良いかというのは難しい……

_ cc

うむ、testのrecursive_collectがccと言って終わる。途中まで動いているからgcなのかな?

……いや、単純にgcを起こさせてもccとは言わない。


2006-02-20

_ スリランカ

スリランカカレーを食いに行った。サモサのスリランカ版みたいなやつ(三角のと春巻きみたいな形のと2種類あった。芋とひき肉が具の基本みたいだが名前は覚えられなかった。パンはチャパティとナンの間みたい。チャパティをさらに層を増やして油分を補ったという感じ。

これでパキスタンとインドとスリランカとネパールは制覇した(というか、横浜のほうでもスリランカは食ったらしい)。

あとはバングラディッシュだな。

ところでブータンって何を食ってんだろう?

_ This is a hack but joel

Rails' Ridiculous Restrictions, a Rant.

最後のカキコ(How many posts does it take to make the point that Joel did not write the rant?)。

_ osfinfo.c

_get_osfhandleに3を引数として与えたところでワトソンの呼び出しが走ることが原因らしい。

VS2005ってPDBの位置の指定方法がなんだか良くわからん(前のVSはスタックフレームをクリックした時にシンボルの位置を聞いてきたと思うんだが)。


2006-02-21

_ るびま

13号

青木さんのが最高におもしろい。

でも、これを作るのが面倒で、アドホックにやってしまったり。

そこで思うのだが、このあたりをprototypeとして標準添付しといてくれると楽なんじゃなかろうか(――ここの括弧に何か疑念とかあやふやなものがいろいろ入る――)。

_ マリオカート

一応ミラーを含めて全部終了。ブラック大魔王(であってるか?)みたいなのも出てきたし。

でも世界を相手に走るにはチキンリトルなおれがいる。

_ 失礼と無礼の差

オープンソースカルチャーにおける作法

いきなり冒頭でオープンソースに限らないと書いているところが面白すぎるが、「失礼」という言葉の使い方がなんとなく気持ちよさそうに見えた。

rudeか。コンサイス6版だと不作法とか激しいとか自然のままのとか猥褻とか書いてある。

ルーディーキャントフェイル。

なんか概念が混乱しているような言葉だ。

これ以外にも猥褻な行為はさまざまにあるが、そのほとんどはオープンソースカルチャに限定されるものではない。

どんな行為だろう。(追記:そりゃやっぱりソースを剥き出し―オープン―にすることだな)

自然のままというのは、洗練されていないという意味だから不作法に通じるものがあるが、

これ以外にも自然な行為はさまざまにあるが、そのほとんどはオープンソースカルチャに限定されるものではない。

とすると文意が全く変わってしまう。

#記事の内容は至極妥当だと思います。それとは別に失礼という言葉に興味が惹かれたということ。

_ ApacheベースDBMS

るびまの咳さんの記事読んでてRWikiとオブジェクトシリアライズのあたりに感動した。

シリアライズした結果がHTML(*)で、リンクがリレーションシップで、一意キー(というかオブジェクトID)がURLということなのかな。

*)RWikiの場合はRDだと書いてあるけど、一般化して考えたのでHTMLとここでは書いている。が良く考えなくてもシリアライズした結果は別にHTMLの必要はないことに気づく。URLの付け替えすれば良いのだから、deserialize.cgi?objid=20050808.objを外に見せるときには20050808.htmlにすれば良いだけの話か。で、deserializeのプラグインか何かでHTMLにするとかXMLにするとかオブジェクトそのものにするとかして返せば良い。

こういう発想はしたことなかったが、確かにWebサーバーとそのコンテンツというのは、DBMSそのものだ(でそこに言語としてRESTが来るのか?)。

#Wikiっていうのはその観点からはすごく筋が良いとあらためて思う。リレーションシップの作り易さ。

#というか、リレーションシップの自由度がネットワークデータベースみたいだ→ODBMSと、DBMSにOを前置できる。

_ インフラ

そこにあっていつでも使えるだけに文句も出てくればけちもつける。

が、最初にそれを作った人たちがいたのだぞ、という

ソフトウェア技術者ってのは特に(多分、ストールマンの影響も多分にあるはず)、その感覚(つまりはリスペクト)を持ち合わせてるはずなので、それは大事にしたい、と思うのであった(誓うというほど大げさなことではなく、あたかも水の如くそう自然に思うという感じ)。


2006-02-22

_ RubyとVS2005続き

まだ、時々追っていたり。

とりあえずテストが死ぬ場所は特定できた。とは言うものの

      (@obj2soap[obj_class] ||= []).unshift([soap_class, factory, info])

soap/mapping/registry.rbのここだよ。うーん、次のじゃ再現しない。

class A
  def initialize
    @a = {}
  end
  def add(b)
    (@a[b] ||= []).unshift(b)
  end
end
a = A.new
p a
a.add(:a)

で、(@obj2soap[obj_class] ||= []).unshift...@obj2soap[obj_class] = [];@obj2soap[obj_class].unshift...にすると問題なし。(とは言え、さらに進めると最終的には_get_osfhandleで落ちる。というか、nmake test-allと、cd test;ruby runner.rbで死に方が異なるというのがなんとも……

というとこまで。

_ Struts

Strutsについて思うところを書いてみる。

もし、5人の特攻野郎Aチームなら

(ここにテンプレから生成したキャラクタ紹介が入る)

いらない。より優れた代替を作る、保守する、文句なし。

もし、1人(おれ)なら

いらない。ケースバイケースで対処する。生JSPあり。

もし、1人(おれ以外)なら

やっぱり、いらない。指示が必要ならケースバイケースで考えてやるし、不要な勝手におまかせ、だけど0からフレームワークを作るのは勘弁な。

もし、30人以上のビジネスパートナー混成チームなら、おれはHTML出力チームとビジネスロジックチームと副官に分けるね。副官にはActionとXML、ビジネスロジックチームのサポートを依頼する。おれは、CSSとXMLの管理だ。Strutsはこういう場合にとっても役に立つ。

そういうことだ。

_ CodeZine

JavaでHTTPサーバーを作るシリーズ第3弾の「自作HTTPサーバーのマルチスレッド化と動作検証」です。

今回は何も考えないマルチスレッド化と、考えたマルチスレッド化であるスレッドプールの実装、これまでと同じくシングルスレッドの3通りの実装です。

無名内部クラスを当然のようにそこにある技術として利用してます。


2006-02-23

_ Strutsの続き

さて、そのようにViewとModelそしてControllerという分業ってのは絶対的なものだろうか? というと全くそうは思わない。全レイヤーを押さえるのってのは基本じゃなかろうか。

とか、まあいろいろな見方があるのであった。

_

そんな突き放したような……。ライセンスは8でやっとGPLと共存可能な形にまとまったように見えるのに。

APIドキュメントを見ると_get_osfhandleの動作は正しく見えます(がちょっとこれ書いている時点ではまだあやふや)。別件で何かあるのならそれはそれとして。いずれにしろデバッガのシンボルファイルとソースファイルの関連付けがなんかまだ良く見えないけど。

_ 移行の前触れ

うう、途中でFirefoxがcoreを残して消えたため(SPARC-Solaris版だと頻繁にある)どこで読んだかわかんなくなっちゃったが(追記:babieさんのコメント参照)、Saisseさんの「DIはスクリプトへの移行の予兆」というようなコメントが、ぴぴぴぴぴと来ましたよ。

さて10年前を思い出してみよう。

一体どこの誰が(という「みんな」のこと)、中間言語へコンパイルするプログラム言語が主流になると思っただろうか? VBは5でネイティブ対応(6だったかも。忘れた)とかで開発者が大喜びで延命とか。

もちろん、ここで想定しているのはJavaなわけだが、どんな予兆が当時見られたか?

中間言語に落とす言語の歴史は古い。僕が知っているのはせいぜいPコード(PASCALのつもりで書いたけどVBもP-Codeとか言ってたような)とLispのバイトコードくらいだけど。

でも、中間言語が主流化したのはJITのせいだと考えることもできる。

Rubyはテキストファイルのままでevalすることで構文木にコンパイルされる。そうではなく、YARVだとテキストファイルを読み込み中間言語になる。中間言語の最適化技術(丸ごとJIT経由ホットスポット)の定着がJava(.NETを加えても良い)が主流となった一つの理由だ。YARV-RubyとJavaや.NETのような中間言語を利用するコンパイラ言語の差は、最初にロードするファイルがテキストのままか中間言語化は済んでいるかの差に過ぎない。(だから、さらにYARV-JITとかYARV-Hotspotとかが出てくることになるんだろうけど−−多分)

とすれば、確かに、スクリプト言語への移行というのは十分現実的なシナリオだ。

とすれば、やっぱりRailsですよ(となるのか?)。いや、JavaScriptかもとも思ったり。C#はC#だろうし、C++はやはりC++だろうが。Javaそのものはそう考えてみると比較的簡単に2番手の位置になってしまうようにも思う。

_ Sun Open Community

とりあえず、「オープンコミュニティによってサポートされているプログラミング言語 2」が公開されているようです。

#実際のHTMLに対して校正(という名の推敲)をしないと、7歩の間にひねり出したまま、豆を煎ると煮るの音韻の調整ができていないようなことになるので、あまり嬉しくない。

_ _get_osfhandleの説明

いえ、それではありません

MSDN 2005(VS.NET 2005 付属のもの)から引用します。

_get_osfhandle 関数は、fd (低水準ファイル記述子) が使用できる範囲内にあり、未使用のマークが内部的に付いている場合、オペレーティング システムのファイル ハンドルを返します。それ以外の場合、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラが呼び出されます。実行の継続が許可された場合、この関数は INVALID_HANDLE_VALUE (–1) を返し、errno を無効なファイル ハンドルを示す EBADF に設定します。

で、この「パラメータの検証」とは

セキュリティが強化された CRT 関数の大部分と既存の関数の多くは自身のパラメータを検証します。この検証には、null ポインタのチェック、整数が有効な範囲内にあるかどうかのチェック、列挙値が有効かどうかのチェックなどがあります。無効なパラメータが見つかった場合、無効なパラメータ ハンドラが実行されます。

つまり、ここに書かれたメッセージを読む限りは、スタックオーバーフローガードなどと同様に、システム的にありえない状況を発見するとワームなどによるコード/実行時イメージ破壊と解釈してプロセスを殺す、という意味に取れます。

ファイルハンドルは確かにファーストクラスもファーストクラスなリソースなのでMSの意図通りの動作だと思うわけです。

#したがってハンドラを設定すればすむだろうと思っているので、実は僕は_get_osfhandleの件はそれほど問題だとは思いません。win32.cの中でMSVC_VERで囲って設定すれば良さそうだから。(言うだけだと安いので、週末あたりを利用してパッチを投げます)

それよりもregistry.rbでクラッシュする(しかも完全にプロセスが消失してしまうため現時点では追いようがない)ほうが引っかかっています。

#追加:ファイルハンドルだけでなく、jumpbufとかSEHチェーンとか他にもやばそうなのがいっぱいあるので(とは言うもののどういう利用のされかたか全然確証なし)、早めに動かさないと全然動かなくなるのではないかというのも気になります。

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

Before...

_ arton [いや、keisukenさんが指摘されていますがそう単純ではないのです。まず、型システムを現在のまま利用するとすると、..]

_ arton [従って完全には置き換えできないだろうとは思うわけですが(FORTRAN最適化コンパイラが生き残っているようなものです..]

_ arton [JSPって手軽で便利だから別に標準でいいと思うんだけど。ただELがどこでも利用できるようにならないとイマイチかなとは..]


2006-02-24

_ はや

早速当てて試してみよう。

#_get_osfhandleでは(もちろん)死ななくなったが、どうしてregistry.rbがccと吐いて死ぬのかはやっぱり不明なまま。

_ むむ

.....F.............................................../readline/test_readline.rb:
20: [BUG] Segmentation fault
ruby 1.8.4 (2006-02-19) [i386-mswin32]
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
とりあえずreadlineを作り直して試すことにする。

_ オープンコミュニティ

Sunの藤井さんに招待していただいてDeveloper Loungeに参加。

元紀ノ国屋のあたりを歩いていたらひがさんと出会って一緒に目的地へ。

軽い気持ちで行ったらそうそうたる顔ぶれでちょっとびびった。吉岡さんMikiさんSpamAssassin久保さんといった方々と名刺交換したり。

で、Jetspeed菅谷さんからお話を伺ったり。JSR-168のポートレットというのは不勉強にしてまったく知らなかったが、デモサイトを見るとイントラとか作るのには良さそうに見える。Railsのことは知らないとのことなので、ActiveRecordとかデモしたり(X31に簡単なのが入ってたので)。

その後、いがぴょんさんからblancoのシートを見せてもらったり。確かにキングバインダー(だっけ?)の世界に向いてる仕組みだな、と感心した。それが良いか悪いか判断は難しい(僕の趣向には合わない。しかしそれを利用したい局面があるのも事実)が、普通の人の作業用と考えると徹底したリアリズムの解決案だとは思った。

その普通の人を考える高橋会長も後から参加。栗原さんやJa-Jakartaの(ジャジャカルタではなくジェイジャカルタと読むのが正しいそうだ)横田さん(修正しました)と2次会へ。ジ・アシクネプ・コタンとそれに続く構想について聞く。うむ、確かに栗原さんは発想と実行力がおもしろい。

_ registry.rb

もちろん僕は、registry.rbに問題があるとはこれっぽっちも思って無くて、ちょうどそのコードに差し掛かった時に(したがって再現性があり、タイミングではなく数量−ノード数なのかオブジェクト数なのかは現時点では不明−に依存した)問題が発生するのだと思っています。

また、nmake test-allでは発現しなくて、cd test;ruby runner.rb(その前にnmake installしていある)の場合にだけ発現するところが特徴的です。

(単にもう一度snapshotを取り直すと直ってる可能性もあるな、と気づいたので帰ったらそうしてみる、予定)

_ VC++8版大体できた

readlineとiconvをVC++8で作り直したのがきいたのか(という気もする)、無事テストは終わって
1254 tests, 12940 assertions, 7 failures, 44 errors
で、エラーはどうも日付周りとwsdlが取りあえずは目立つ。 たとえば
51) Error:
est_time_now_cycle(YAML_Unit_Tests):
rgumentError: localtime error
   c:/docume~1/arton/mydocu~1/lib/ruby/1.8/pp.rb:245:in `inspect'
とか
 49) Failure:
test_spec_builtin_time(YAML_Unit_Tests)
    [./yaml/test_yaml.rb:32:in `assert_parse_only'
     ./yaml/test_yaml.rb:1006:in `test_spec_builtin_time']:
<{"space separated"=>Mon Jun 29 05:52:20 東京 (標準時) 1992,
 "canonical"=>>Sat Dec 15 02:59:43 UTC 2001,
 "valid iso8601"=>Mon Apr 13 21:21:10 東京 (標準時) 1992,
 "date (noon UTC)"=>#<Date: 4905245/2,0,2299161>}> expected but was
<{"space separated"=>Mon Sep 14 09:10:01 東京 (標準時) 1970,
 "canonical"=>Sat Dec 15 02:59:43 UTC 2001,
 "date (noon UTC)"=>#<Date: 4905245/2,0,2299161>,
 "valid iso8601"=>Mon Sep 14 09:10:01 東京 (標準時) 1970}>.
順に見られるものは見てみようかな。
本日のツッコミ(全2件) [ツッコミを入れる]

_ takahashim [横田さん、のはずです。>Ja-Jakartaのひと]

_ arton [どうもありがとうございます。]


2006-02-25

_ deployの訳

deploymentってのはコンポーネント化によって出てきた言葉みたく僕は思うんだけど(というのは1990年代の後半からやたら目につくようになったからだけど)、ちょっと日本語化しにくいし、かといってカタカナのままでもそれほど通りが良くない難しい言葉に思う。でもとりあえず訳語とし。ては配備とか配置とかを使い分けていたわけだ。

ところが、今日、とある資料を営業の人が訳したのを見たらdeployment planを導入計画としていた(同じ資料を僕は配備計画と訳してたわけだが)。わお、今まで見た中で日本語的には1番こなれた訳だ。

というわけで、日本語として通じなくなりそうな場合以外は導入を使おうかな、と思った。もっとも、システムについては良いけど、warみたいな単位だと導入って感じでもないな、とも思うのであった。

#あと導入とか展開とかは、初回のdeploy時には日本語的にしっくり来るけど、更新時のdeployに使うのはイマイチかも。追加時には投入ってのはどうだろうか。

_ time_t

どっかでtime_tが負になる話が出てたけどわかんなくなっちゃったし(ruby-devには無い)、まじめに調べるのも面倒になったので_USE_32BIT_TIME_Tを設定してRubyをビルドしたら、OpenSSLのほうはデフォルトのVC8で作っていたもので今度はOpenSSLのところでエラーになりまくり。

選択肢は、

1. OpenSSLも_USE_32BIT_TIME_Tを設定して作成する

2. time.cを見る(というか、NEGATIVE_TIME_Tを単に設定すれば良いだけなのか?)

どっちか。とりあえずNEGATIVE_TIME_Tを設定して_USE_32BIT_TIME_Tは外してみるか。

#これは問題外であった。

_ わかったけど……

time.c
struct time_object {
    struct timeval tv;
    struct tm tm;
    int gmt;
    int tm_got;
};
に対して
time_new_internal(klass, sec, usec)
    VALUE klass;
    time_t sec, usec;
{
    VALUE time = time_s_alloc(klass);
    struct time_object *tobj;
    GetTimeval(time, tobj);
    time_overflow_p(&sec, &usec);
    tobj->tv.tv_sec = sec;
    tobj->tv.tv_usec = usec;
    return time;
}
しかしstruct timevalは
struct timeval {
        long    tv_sec;         /* seconds */
        long    tv_usec;        /* and microseconds */
};

とwinsock.hで定義されている。time_tは64ビットだけどlongは32ビット、でも精度が落ちるわけではない(まだ)。winsockの定義が符号付longだから負値になるということだ。

missing.hのstruct timevalを使えればよいのだが、その時点では既にwinsock.hは読み込んでいるし#defineと異なりstructだからundefできるわけでもない。

#define TIMEVALをtime_objectで利用する(missing.h、time.cにまたがる修正)とかにするか、それともtime.cに出てくるすべてのtv_secをtime_tでキャストするか、どちらにしてもちょっと汚い感じになりそうな気がする。

追記:この話はこのことだったのかと今頃になって納得。

_ Rubyでデザインパターン

連載は続いていないみたいだけど機械猫さんがRubyでデザパタというのを書いている。

なんかるびまや---(良くわからない)向きの企画だなぁと思った。

まずリストがシンプルだから読みやすい。次にまあいろいろあるし既に10年たってもう古典(古典となると趣味人と研究者の世界に入ってしまう)の領分だから言語を変えることでちょっと見直しをかけられて良いかも、とかまあいろいろ。

_ うわ

eval.cやfile.cもstruct timevalを使ってるのか。

あ、でもこっちは変えてはならなかったり。

_ 結局

力任せにtimeval_tを導入してみた。
#if defined(HAVE_SYS_TIME_H)
#  include <sys/time.h>
   typedef struct timeval timeval_t;
#else
#if !defined(_WIN32)
  #define time_t long
  struct timeval {
#else
  struct win32_timeval {
#endif      
    time_t tv_sec;	/* seconds */
    time_t tv_usec;	/* microseconds */
};
#if !defined(_WIN32)
    typedef struct timeval timeval_t;
#else
    typedef struct win32_timeval timeval_t ;
#endif
#endif
結果は
1254 tests, 13349 assertions, 0 failures, 34 errors

昨日が1254 tests, 12940 assertions, 7 failures, 44 errorsだからそれなりの進展ぶりだが、問題は汚いことだな。

とりあえずdevに投げるか、それとも32ビットに戻すパッチのほうに挑戦してみるか、どうしようかな。

#missing/の下をいじればもっときれいにできそうだからやめとくか。

ちなみにこの時点ではこんなの(例:process.c)

static VALUE
rb_f_sleep(argc, argv)
    int argc;
    VALUE *argv;
{
    int beg, end;
#if defined(_WIN32)
    timeval_t tvalt;
    struct timeval tval;
#endif    
    beg = time(0);
    if (argc == 0) {
	rb_thread_sleep_forever();
    }
    else if (argc == 1) {
#if defined(_WIN32)
        tvalt = rb_time_interval(argv[0]);
        tval.tv_sec = tvalt.tv_sec;
        tval.tv_usec = tvalt.tv_usec;
	rb_thread_wait_for(tval);
#else        
	rb_thread_wait_for(rb_time_interval(argv[0]));
#endif        
    }
    else {
	rb_raise(rb_eArgError, "wrong number of arguments");
    }

missingの中を変えてそちらをtimeval_tを認めるようにすれば、_WIN32の場合そちらを参照することになるからいちいち本当のstruct timevalに詰め替える必要がなくなる(はず)。

#と思ったが、やはりその場合影響があまりに広範囲になる(eval.cの修正も必要になる)。time.cの中でtime_tにtv_secとtv_usecをキャストするのが当面は良さそうな予感。 #追記:その予感は正しくはないということはわかった。(キャストだけじゃどちらにしても符号拡張が先に来るからだめだけど、それだけでも不足)
本日のツッコミ(全2件) [ツッコミを入れる]

_ y-Aki [#includeの後ろがタグ扱いになって消えてますね。]

_ arton [どうもありがとう。修正しました。]


2006-02-26

_ Ruby Hotlinks

なんか、助田さんの新しいタイトルが胸をうつのですが……

_ ここまで来た

1254 tests, 13431 assertions, 0 failures, 2 errors
一気に減ったのでさすがに何か見落としるんじゃ無いかと(追記:WSDL関係のが空白入りディレクトリ名に引っ掛かっていた。自分でcdした時には短縮名を使っていて、かつ短縮名でcdした場合にはその名前がプログラムから参照されているみたいでエラーにならないようだ)気になるが、下のマクロをtime.cに虱潰しに埋め込んでいった。
#if defined(_WIN32) && SIZEOF_TIME_T == SIZEOF_LONG_LONG
#define TO_TIMET(v) ((time_t)(v & 0xffffffff))
#else
#define TO_TIMET(v) v
#endif
 
#if SIZEOF_TIME_T == SIZEOF_LONG
typedef unsigned long unsigned_time_t;
#define TIMET2NUM(x) LONG2NUM(x)
#define NUM2TIMET(x) NUM2LONG(x)
#elif SIZEOF_TIME_T == SIZEOF_INT
typedef unsigned int unsigned_time_t;
#define TIMET2NUM(x) INT2NUM(x)
#define NUM2TIMET(x) NUM2INT(x)
#elif SIZEOF_TIME_T == SIZEOF_LONG_LONG
typedef unsigned LONG_LONG unsigned_time_t;
#define TIMET2NUM(x) LL2NUM(x)
#define NUM2TIMET(x) NUM2LL(x)
#else
# error cannot find integer type which size is same as time_t.
#endif
残っているのは
  1) Error:
test_huge_difference(TestTime):
ArgumentError: time must be positive
    ./ruby/test_time.rb:68:in `-'
    ./ruby/test_time.rb:68:in `test_huge_difference'
 
  2) Error:
test_timegm(TestTime):
ArgumentError: argument out of range
    ./ruby/test_time.rb:38:in `utc'
    ./ruby/test_time.rb:38:in `test_timegm'
#追記:つまるところは虱潰しはいいのだが虱の選別がちゃんとできていなかったということ(と書いているということは0になったということだけど)。

_ VC8に限定する必要もない

#if sizeof(((struct timeval*)0)->tv_sec) == SIZEOF_LONG && SIZEOF_TIME_T == SIZEOF_LONG_LONG
のほうが良さそうだ。と思ったけどプリプロセッサはコンパイラじゃないからこれはだめか。

_ るびこさん

(ちょっとごろあわせがいろいろ。るびこんさんはるびこんがわをわたるのか? とか。たぶんわたるんだろう)

ここが初日らしい

ううううううむ。riとReFeか。

_ パッチ

time.c(Tue Feb 14 14:03:12 2006)用

1254 tests, 13440 assertions, 0 failures, 0 errors

一応できたけど、もうちょっとどうにかならないかな、という気はする。

_ 配備

「配備」って言葉はあまりビジネス的に良いイメージがない気がするのが問題で、たとえば新聞とかに出てくる用例って「パトリオットの配備」とか「核配備」とかすごく特殊領域になってしまように思える(まあ、印象ということでもあるけど、強く目立つ用例ということで)。おそらく軍事用語の転用という面は実際にあるんじゃないかとは思うが、仮にそうだとしてアメリカは知らないけど日本では軍事用語を使う人自体がちょっと特殊な気がする。

それに対して「導入」って確かにdeploymentの直訳からは外れるけど、ソフトウェアなり(ハードウェアを含む)システムなりのdeployment作業としては同等の意味に思える。かつ、軍事用語のような色が付いていないところが良いと思った。

デプロイというカタカナ表記は相手をだまくらかして煙に巻こうという場合を除いてはビジネス的にはだめだと思うし(デルポイだとdelphiだけど、なんか字面が似ているが、ご託宣ってのは確かに相手をだまくらかして煙に巻くことではある)、とかそんな感じ。

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

_ babie [個人的に「設置」を使ってます>deployment]

_ arton [設置はブツには良いと思うけど、ソフトウェアに対してはちょっと違和感があるんだよね〜。]


2006-02-27

_ 余分なこと

なぜ、((unsigned long)v)とせずに伸ばしてから論理積とか取ってるんだ?

_ マイロボット

AWDwRがあるはずないと思いながらも本屋に行ったら案の定なかったが、マイロボットとかいうムックがあったのでつい手に取ってみると妙に安い。各号に少しずつ部品が付いてくるのか。

ってことは最後に組み立て終わると武装蜂起するっていう仕組みだな。あぶないあぶない。

_ 関数プロトタイプの効用を確認してみる

#include <stdio.h>
long long calc(ll1, ll2)
     long long ll1;
     long long ll2;
{
    return ll1 + ll2;
}
 
long long prot_calc(long long ll1, long long ll2)
{
    return ll1 + ll2;
}
 
int main(int argc, char* argv[])
{
    printf("%lld\n", calc(-80, 128));
    printf("%lld\n", prot_calc(-80, 128));
    return 0;
}
をコンパイルして実行。
C:\DOCUME~1\arton\MYDOCU~1\test>cl test.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
test.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.
 
/out:test.exe 
test.obj 
 
C:\DOCUME~1\arton\MYDOCU~1\test>test
18035912001912688
48

なるほど。

デフォルトはintなのがCだから、プロトタイプなしだとlong long(64ビット)ではなくint(32ビット)として引数を積むのが理由だろう。

というのを確認するにはアセンブラ出力を取れば良い。

VC++8の場合のアセンブラリストの出力オプションは"/Faファイル名"だ。

C:\DOCUME~1\arton\MYDOCU~1\test>cl /Fatest.asm test.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.
 
test.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation.  All rights reserved.
 
/out:test.exe 
test.obj 
 
C:\DOCUME~1\arton\MYDOCU~1\test>type test.asm
……(snip)……
; Line 16
	push	128					; 00000080H
	push	-80					; ffffffb0H
	call	_calc
	add	esp, 8
	push	edx
	push	eax
	push	OFFSET $SG2236
	call	_printf
	add	esp, 12					; 0000000cH
; Line 17
	push	0
	push	128					; 00000080H
	push	-1
	push	-80					; ffffffb0H
	call	_prot_calc
	add	esp, 16					; 00000010H
	push	edx
	push	eax
	push	OFFSET $SG2237
	call	_printf

Line17(プロトタイプあり)のほうでは、push 0(正値)とpush -1(負値)が余分に入っていることが確認できる。

プロトタイプ無しのほうも、関数内部では64ビットずつスタックから引数を取り出すから、当然値はゴミになる(実際にはリターンアドレスとBPが取り出されるはずだから、特定の呼び出し単位に定数となる――再起呼び出しとかしたり動的にallocaしたりするとBPが変わるから定数ってのはちょっと大げさ)。

結論:int以外の引数をとるK&R関数呼び出しを見たら疑ってみよう。

問題:charやshortが引数の場合はどうなるか?


2006-02-28

_ プロトタイプ無しの場合

引数の型をそのまま利用している。VC++8の場合、charやshortは符号拡張して32ビットをスタックに積む。

なんか、全然K&Rの仕様をわかっていない(もしかしたら15年以上前はわかっていてその後きれいに忘れたのかも)ことがわかった。

_ なんどでもクォート

しかし「未来を作った人々」によれば、PARCがLisaとMacintoshの設計者たちに及ぼした影響で最も重要なのは、おそらく精神的なものであり、訪問後にLisaの設計者たちが出した設計要綱は、アラン・ケイやラリー・テスラーの精神の完全な開花と言えた。何しろそこには「Lisaは使って楽しくなければならない」と命じているという。

続けて「このシステムは『仕事だから』とか『上司がやれというから』使うようなシステムにはしない。Lisaを使うことそのものが報酬となって、仕事が充実するよう、ユーザーとの相互作用における友好性と機微には特に注意を払わなければならない」とあるという。

−−スティーブ・ジョブズとパロアルト研究所物語(改編版)

クォートすべきことはこれに尽きるし、しかもすぐに忘れてしまうのだから、何度でも思い出せる機会には思い出しておかなければならないのだが、僕がこのエピソードで最も好きなのは、Appleの連中が本気でAltoがなんなのかを知りたがり、しかもそれを食ってしまったことだと思う(姿はわかっていても、それが実装可能かどうかは良くわからないという状態だったのだと想像される)。

_ 目的指向と放矢指向

CodeZineの『自作HTTPサーバーのマルチスレッド化』でちょっと触れたが、リファレンスを目的指向で利用すると罠にはまることがある。

事典とか辞典とかって、本来的には特定の項目を調べるために目的指向で紐解くものだけど、無目的に関連知識を拾い読みして知識を増やしていく。実際にはそういう使い方をまずすべきなんじゃなかろうか。

多分生まれてから最初に触れるリファレンスというのは、国語辞典かさもなければポケモン事典(僕の場合だと怪獣大事典か、妖怪大百科とかだったりしたはずだが)みたいなものだと思う。で、大抵の場合は実際にはそれほど目的指向で利用することはないのではないかと思う。つまり、「えーと、この目玉の化け物ってどんな特徴があるんだっけなぁ……」みたいな引き方はしないで、適当に開いたところで面白そうなのを拾い読みして、関連項目とか宿命のライバルとか相性が悪いとかといったリンクをたどってどんどん拾い読みしていくという感じ。

そういう読み方であらかじめ周辺に転がっている情報を見ておかないと、Runnableにたどりつけない(という例を出したわけだが)のと同様なことは結構ある。個人的には、Calendar.MAYだのCalendar.MARCHだのの存在にまったく気づかなかったとか。Calendarは当然、知っている。で、Calendar#setでフィールドを指定するというところから、Calendar.HOURとかも見ているのだけど、山ほどある定数からHOURとか調べる過程では当然MAYみたいなものを目にしているはずなのに目的とは異なるから見た先から見落としていく。当然知識としては取り込まれない。したがって存在そのものに気づかない。

これははっきり言って無駄に思える。だからあらかじめぼつぼつ拾い読みしといたほうが良いのではなかろうか。

ただ、あくまでもこういった○典は個々の情報の内部のリンクは意味があるけど列挙方法それ自体にはあまり意味がないから先頭から順番に読んでいくというのには向かないし、そういう読み方をすると飽きてしまうものだ。だから、関連情報をリンクでたどれたほうが良いし、したがってリファレンスを作る場合には重複を恐れずに関連項目への言及はできるだけしたほうが良いかも知れない。

乱調文学大辞典 (角川文庫)(筒井 康隆)

(突然、えらく懐かしい本を思い出してみる。黒い表紙の変形版ーー引用は文庫なので当然違うーーだったが、この頃買ったのは脱走と追跡のサンバを除いてすべて捨ててしまった)

悪魔の辞典とか、乱調文学事典とかはどう読むのが良いのだろうか? やっぱり拾い読みだと思うな。

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

_ ムムリク [悪魔の辞典(ビアス)はそれが正しいと思います。一般的な意味においては”辞典”より”事典”のほうが拾い読み的かも。]

_ arton [確かに。辞典でも広辞苑とか大辞林クラスになるとまた出典とかがあって特におもしろいです。]


2003|06|07|08|09|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|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|

ジェズイットを見習え