からだのブログ

五体満足に生まれてきたことに感謝してブログの名前を「からだ」にしました。

からだのブログ header image 1

Let’s Linq [0]

1月 31st, 2008 · .net, language

とにかく布教したい気分なので。プログラミング言語という対象に対して、純粋に面白いと感じてるのは久しぶりなので。

例のごとく、C#3.0。その楽しさを喧伝したいだけであって、入門と言えるような整然としたものじゃあないので。念のため。(それでもここ数日の内容よりは「それ向き」)

var vals = new[] { 1, 2, 3 };

C#3.0から暗黙の型宣言を示すvarキーワードが入った。ところで、上記のコードには実は2回「暗黙」が使われている。var と配列の初期化部分。まず最初に、与えてる初期値は int型変数群だから、こいつはint型配列に違いないよね、っていう「暗黙」が働いてる。そして、代入の右辺が決まれば、それを受ける側の型も自ずと決まってくる。つまり、var は int[] になるってわけ。

まあこれは、「ああちょっと便利かもね」っていう機能拡張。今度は、拡張メソッド(「拡張子」とも。俺は「-子」の呼称は嫌い) を使う。書き方などの詳細は調べてもらうとして、要するにこれは既存のクラスにメソッドを後付で追加する機能だ。コレクション類(IEnumerable<T> を実装してるのを便宜上こう呼ぶことにする) のために豊富に拡張メソッドが用意されているので、そいつを使ってみる。

var avg = vals.Average();

をやると、avg には vals の平均、つまり2.0(double で返ってくる)が入るわけ。で、次の例を考えてみる。

var strs = new[] { “a”, “bc”, “def” };
var avg = strs.Average();

どうなるだろうか? 答え、コンパイルエラーになる。そもそも「平均」ってのは数値化されないものには適用できない演算である。だから、当然のごとく文字列の集合に対して「平均」は計算できないし、そうした拡張メソッドのオーバロードも用意されていない。

それでは、「文字列の集合に対する演算『平均』とは、集合の各要素の長さの相加平均である」っていう定義があったらどうだろう。その定義に合うように「文字列」から「長さ」を取り出すメソッドを用意してやれば、ここで定義する平均は計算可能になる。実は、 Average() にはちゃんとそうした需要を満たすオーバロードが用意されてる。言ってしまうと、 Average(Func<string, int> selector) を使えばよい。

ここで、 Func<string, int> が初めて出てきた。これは、stringを引数に取り、intを返すメソッドを示す。そこで、次のようなメソッドを用意してやると、

int getlen(string str)
{
    return str.Length;
}

Average() の引数にこの getlen を渡すことができる。つまり、

var strs = new[] { “a”, “bc”, “def” };
var avg = strs.Average((Func<string, int>) getlen);

とすることで、先の定義に沿う「平均値」が得られるわけだ。ここで、getlen() の関数(何か値を渡して、別の値を取り出す装置)としての機能に着目する。すると、実質的には str.Length の部分しか重要でないことがわかる。実は、C#3.0 では、上記のコードを次のように書くことができる。

var strs = new[] { “a”, “bc”, “def” };
var avg = strs.Average(str => str.Length);

これはラムダ式と呼ばれ、関数型言語からの借用である。ほんとはここからがまた面白いんだけど、まあ後は適当に調べてやってくれw あるプログラミング言語に別の言語のパラダイムが導入されるのって、すごくスリリングだよね。わくわくしちゃう。個人的に、C#1.0 のときよりわくわくしてるわ。

→ 1 CommentTags:

JT–;

1月 31st, 2008 · misc

裏事情を知っているわけじゃあないし、表事情もよくわからず適当な事を書き飛ばしてみる。中国産の毒餃子事件だけど、あれはJT株を買い叩きたい連中の陰謀なんじゃないかと。

例の「段ボール肉まん」はガセだというオチがついたものの、中国では「他人がどうなろうが知ったこっちゃない」とでも言いたげな商売を初めては、問題が明るみに出るとトンズらするという手口が横行しているらしい。(これって一般的には市場主義経済の暗部だから実に皮肉だ) わずかな利益のために毒入り商品を売りつける神経の持ち主の前に、「毒入り商品をばら撒いたら報酬を出しますよ」などと甘言をささやく人間が現れたら、彼はこの誘いを断れるだろうか? まあ、無理だろうね。

ってなことを妄想してみたけど。何らかのインシデントを境に株価が上がったとか下がったとか言ってるのを見ると、絶対裏で何かあったなー、とか妄想してしまうtkskでした。

→ 1 CommentTags:

溺死

1月 31st, 2008 · tek

ちょっと前にも同じようなエントリ書いてたけど。システムを自分で実装しておいて、わけがわからなくなってきた。

スパゲッティっていうわけじゃあないし、いつも書いてるコードよりは整然としてるとは思うんだけど、柔軟性を意識するあまり、複雑性が増してしまった。爆発までは行ってないけど、少なくともIDE(VisualStudio)無しではコードを管理できなくなった。

自分が作ってるシステムで自分自身が溺死しそうな勢いである。これはマジで再考の余地があるな。

→ 2 CommentsTags:

絶望日記0

1月 29th, 2008 · life

2008年1月29日。またメロンパンのカスをボロボロ落としてしまった。自分がカス以下の人間であることを認識する。

→ No CommentsTags:

超エッジが立ってるよ、個人的に

1月 28th, 2008 · .net

先にFunc<T,U>の拡張メソッドの定義と実装。この下の利用例から見たほうがわかりやすいかも。

public static class FuncUtils
{
    public static Func<TSource, TResult> Compose<TSource, TResult>(
            this Func<TSource, int> funcSelector,
            params Func<TSource, TResult>[] functionCandidates)
    {
        Expression<Func<TSource, TResult>> ret = t0
                => functionCandidates[funcSelector(t0)](t0);        return ret.Compile();
    }
}

とかやっておいて、

Func<int, string> fNum = n => n.ToString();
Func<int, string> fFizz = n => “Fizz”;
Func<int, string> fBuzz = n => “Buzz”;
Func<int, string> fFizzBuzz = n => “FizzBuzz”;

Func<int, int> selector = n
    => (n % 15 == 0) ? 3
    : (n % 5 == 0) ? 2
    : (n % 3 == 0) ? 1
    : 0;

var fizzbuzz = selector.Compose(fNum, fFizz, fBuzz, fFizzBuzz);

Enumerable.Range(1, 100).ToList().ForEach(n
        => Console.WriteLine(fizzbuzz(n)));

うはw キタコレwww

あ、Fizz Buzz 問題をややこしく解こうと思っただけです。

Fizz Buzz – Wikipedia
http://ja.wikipedia.org/wiki/Fizz_Buzz

一応解説しておくと、Combine() は、

「ある引数を取り、それを元にその引数を渡すべき他のメソッドを決定して結果を得るようなメソッドを生成する」メソッド

わかった?w 俺が読んでる立場だったら、たぶん理解不能なので FizzBuzz で説明すると、

「ある引数(int)を取り、それを元にその引数(int)を渡すべき他のメソッド(int を「そのまま」とか”Fizz”とか”Buzz”とかに変換する)を決定して結果を得るようなメソッド(fizzbuzz)を生成する」メソッド

まあ、そんなかんじ。マトリョーシカ!

→ No CommentsTags:

合成関数でーけた

1月 28th, 2008 · .net

意外に簡単にできたので。

public static class FuncUtils
{
    public static Func<T0, T2> Compose<T0,T1,T2>(
            this Func<T0, T1> f0, Func<T1, T2> f1)
    {
        Expression<Func<T0, T2>> ret = t0 => f1(f0(t0));

        return ret.Compile();
    }
}

これで、また幸せライフの始まりだぜ!

→ No CommentsTags:

言葉狩りについて

1月 27th, 2008 · language

やーっぱりねー、「気違い」は「気違い」という語を用いる方法でしか形容し得ないわけですよ。ええ。

→ No CommentsTags:

なんつーか末期

1月 27th, 2008 · tek

最近自分で設計して、最近自分で実装してんのに、なぜ動いてるのかわけがわからんくなってきたりしてたり。
いや、「動くはずが無い」っていう確証があるわけじゃないのだが、無駄に複雑な作りで動いてるのが不思議というか。
さあ、どうすんでしょうねえ。

→ No CommentsTags:

400g

1月 26th, 2008 · life

寝起きにビーフステーキ 400g はきつかった。何で何も考えなかったんだろうか。。。

→ No CommentsTags:

エンジョイできない

1月 26th, 2008 · language

言葉も国境も越える!日韓リアルタイム翻訳掲示板 enjoy Korea http://www.enjoykorea.jp/

ってさ、書き込みの中の翻訳できないと思われる部分が、カタカナのわけのわからん文字列として出てくるんだよね。前から思ってたんだけど、これってあんま意味ないんじゃねーの?

英語、たとえば”enjoy”が「エンジョイ」になる利点はすごくよくわかる。「エンジョイ」の意味は広く認知されているから、英語を習う前の小学生でも知っているだろう。だから、カタカナで書いてあればいくつかの言葉は意味がわかる。従って、英語圏由来の外国語をカタカナ表記する価値は十分にある。

じゃあ、ハングルじゃあわからんけど、カタカナならわかる言葉って何があるかってことを考えたら、数えるくらいしかない。いくらかの人名と地名、「キムチ」、「チマチョゴリ」、えーっとそれから。。。固有名詞以外に10個出てきたらたいしたものだろう。つーか、そんなに朝鮮語を知っているのであれば、ハングルを読むことができると考えたほうが自然である。

日本語を母語とする人間のおそらく9割(この掲示板の閲覧者に限れば「少なくとも5割」かな?)は、文中に出てくるカタカナを、逐次頭の中の辞書と照らし合わせて、「あ、これは知らんから朝鮮語だな、無視しよう」などと処理しなければならないわけだ。ほかの辞書を引こうにも、いくらか情報が失われてしまっているので、無視するしかない。(カタカナ→朝鮮語 辞書があれば別だが、情報の損失を考えると「そのまま」が好ましいだろう。)

というわけで、ほとんどの日本語ネイティブのためにも、ハングルが読める人間のためにも、わけのわからんカタカナ表記はやめるべきである。

→ No CommentsTags: