トップ «前の日記(2006-12-01) 最新 次の日記(2006-12-03)» 編集

日々の破片

著作一覧

2006-12-02

_ ASRに更なる修正

URL系(今や良くわからないけど、とにかく/\w+:\w*/なやつ)モニカはなんでも認めるようにした(これまではnew:モニカとobjref:モニカだけ特別扱い)。WinNT:モニカとかいつの間に導入されたんだろう。

_ Win32OLEメモ

オプション引数のチェックをしていないので、VT_EMPTYとVE_ERROR+DISP_E_MEMBERNOTFOUNDの設定が曖昧なように思える。副作用があるメソッド呼び出しとかでまずいんじゃないだろうか?

(名前つき引数をASRに移植中)

追記:

  • IDL+C++でサーバ作りまくり
  • VB(4?,5,6)でインテリセンスかC++クライアントでデュアル

てな使い方ばかりなので名前付き引数を実際に使ったことがまったくなかった(位置を使うしな)。で、今回初めて知ったことがいっぱい。

  1. すべてのメソッドパラメータは名前を持つ
  2. DISPIDに入っているのは単なる連番
  3. VBScriptのVBAと異なる点というのには何も記述がなく、しかもオブジェクトは名前付き引数をサポートしていませんというエラーの説明は検索でいっぱい出てくる。が、VBScriptはサポートしていないのでコンパイルエラーになる。これ、なんかおかしいので本当のところを知りたい。
  4. 名前付き引数(named arguments)、名前による呼び出し(call by name)のどちらで検索してもまともな(仕様としての)情報には突き当たらない。
  5. INSIDE OLE second editionを読むと、ほんの少しだがcall by positionとの混在の場合の呼び方については記述してある。しかし名前付き引数自体の情報は少ない。
  6. 名前付き引数のDISPIDを取り出すには、GetIDsOfNamesを呼ぶのは良いとして、配列の先頭がメソッド名で残りがパラメータ名を記述するって、いったいどこにドキュメントされているんだ? と思ったらIDispatch::GetIDsOfNames の説明にほのかに匂わせているのか。これしかし意味が通じないんじゃないか。というか気付いてなかったなぁ。でも、確かに納得のいく仕様だ。以前、複数のメソッドのDISPIDを取得できるのかと思って(配列だから)ずらずら渡したらエラーになったのだが(たまたまそのサーバが1 by 1しかサポートしてないのかと思った)、あの時、ちゃんんと読まなかったのか(またはその時点のMSDNの記述内容がやわかったかどっちか。多分前者だろうけど)。
  7. なお、Win32OLE(ruby-1.8.5)用のパッチ。人によっては幸せかも。

    --- win32ole.c  Mon Jun 19 22:15:58 2006
    +++ win32ole.c.new      Sat Dec 02 15:13:09 2006
    @@ -1914,4 +1914,5 @@ hash2named_arg(pair, pOp)
         unsigned int index, i;
         VALUE key, value;
    +    char* name;
         index = pOp->dp.cNamedArgs;
     
    @@ -1920,5 +1921,9 @@ hash2named_arg(pair, pOp)
         ---------------------------------------*/
         key = rb_ary_entry(pair, 0);
    -    if(TYPE(key) != T_STRING) {
    +    if(SYMBOL_P(key)) {
    +        name = rb_id2name(SYM2ID(key));
    +    } else if (TYPE(key) == T_STRING) {
    +        name = StringValuePtr(key);
    +    } else {
             /* clear name of dispatch parameters */
             for(i = 1; i < index + 1; i++) {
    @@ -1934,5 +1939,5 @@ hash2named_arg(pair, pOp)
     
         /* pNamedArgs[0] is , so "index + 1" */
    -    pOp->pNamedArgs[index + 1] = ole_mb2wc(StringValuePtr(key), -1);
    +    pOp->pNamedArgs[index + 1] = ole_mb2wc(name);
     
         value = rb_ary_entry(pair, 1);
    

_ かっこいい

プログラミング言語の速度

おれもこういうことが言ってみたい。正しい考えだと思うし。が、けものみちがなければ進むこともできないわけで、目の前の熊笹を鎌でなぎはらいながらあっち行ったりこっち行ったりハイキング。それはそれで楽しいところが逆に問題なんだろうけど。

(抽象化の話なわけだから、ここでは速度をコードとそれを記述するための作業量に置き換えれば基幹系システム――に限定する必要すらない――もコンパイラも同じことが言えるだろうという意味において)

_ 老いを意識する

誰がアップルを買ってるか

って、ことは2年くらい前にマカーにもなったのは老いの兆候だったってことなのか!


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|

ジェズイットを見習え