ときどきの雑記帖 i戦士篇

最新ページへのリンク
目次ページへのリンク

一つ前へ 2010年1月(中旬)
一つ後へ 2010年2月(上旬)

ホームへ

2010年01月31日

■_

・愛用
Amazon.co.jp: ギャツビー シェービングジェルフォーム: ヘルス&ビューティー が好きで使っているのですが、どうも扱っている店が減っていく一方のようで だんだん買うのが難しくなっているような気がします。 が、ダメ元で検索したらアマゾンさんの扱いにあったという。 ほっと一息。 いやあなんというか、シェービングクリーム(泡が出るやつ)もなんとなくしっくりこないし、 シェービングジェルでもチューブのやつはいまいちと言うわがまま発動なんですがw

・6年
幻の「横浜行」: 鉄道とラジオのお部屋 東横線の横浜から先が廃止になって、みなとみらい線と接続するようになってから もうそんなになるんですか。年食ってるはずだよ ○| ̄|_


Hacker News | Tinkerer’s Sunset で取り上げられているblog で話題にしていることは自分も考えてたりするんですが、 うまくまとまらない。

・書評
すみません。気がつくとまとめる時間がなくなっていると言う ○| ̄|_ おかしいなあどこでなくなってるんだろう(ついったーです)。

・RSS
eban さんの話では、ぐぐるさんのRSS化でここはうまく変換されないとか。 んー、別に変なもの埋め込んでないはずだけどなあ。 もっと HTML 的に正しい構成にしないといけないっつーことなのかしらん。

・フラット化する社会
読んだ。いまさらですが。 書かれていることには納得はできるんですが、じゃあどうするのというと… どうすればいいんでしょうねえ。

■_ 丸投げ?

perlでの文字列抽出 | OKWave まあ「教えてくれ」==「スクリプト書いてくれ」== 丸投げ なのでしょうけど、お題としてはちょっと面白いかな?


perlでの文字列抽出 | OKWave

perlの文字列抽出と集計について教えてください。

ファイルAにある文字列をファイルBから探し、その単語の前後の5単語を集計したいと考えています。

fileA(ただの単語列です)
たまねぎ
かぼちゃ
にんじん

fileB(|で区切られています)
ピラミッド|を|築く|労働者|に|は|たまねぎ|を|食べ|させた|と|いう|記録|も|あり
たまねぎ|は|野菜|の|中|で|最|も|糖質|が|多く|
ほくほく|した|西洋|かぼちゃ|は|、|料理|野菜|の|中|で|も
にんじん|は|、|根|を|食べ|る|野菜|の|中|で|は|珍しく|緑黄色野菜|です

上記のようなファイルがあった場合に、「|」で区切られた前後5単語をとれるだけ取得すると以下のようになり

たまねぎ を,築く,労働者,に,は,を,食べ,させた,と,いう,は,野菜,の,中,で
かぼちゃ ほくほく,した,西洋,は,、,料理,野菜,の
にんじん は,、,根,を,食べ,る

以下のように出現を集計して、一つのマトリックスにまとめたいと考えています。

     を 築く 労働者 に は 食べ させた と いう 野菜...
たまねぎ 2  1  1    1 2  1  1    1  1  1
かぼちゃ            1              1
にんじん 1           1  1
...
...

初心者のためなかなかうまいやり方がみつけることができず
ご教示いただけると助かります。
よろしくお願いいたします。

■_ 今日の[ムマ]板ヲチ


この会社辞めようと思った腐れ上司の一言0x28

141 仕様書無しさん [sage] 2010/01/30(土) 20:58:21 ID: Be:
    もしもPLが駅伝の監督だったら・・・

    レース前
    俺「10人必要なのに5人しかメンバーがいません!」
    監「あー問題ない。全員が2区間走れば。できるだろ?」

    レース中
    俺「このままのペースじゃ優勝できません!」
    監「あー問題ない。全員が2倍の速度で走れば。できるだろ?」

    レース後
    俺「結局優勝できなかったし。メンバーも体ボロボロで二度と走れません!」
    監「あー問題ない。全員辞めさせて、新しい部員募集すれば。できるだろ?」

144 仕様書無しさん [sage] 2010/01/31(日) 03:15:53 ID: Be:
    >>141
    1人が6区間走って残りが1区間づつ走れば優勝できたし
    辞めさせるメンバーも1人で済んだはずだ 

147 仕様書無しさん [sage] 2010/01/31(日) 11:02:42 ID: Be:
    >>144
    残り6区間を1人が走ればいいじゃないか。

    ‥‥1年前にマジにやらされた。 

なむー。


スレッドを立てるまでもない質問雑談スレ40
250 仕様書無しさん [sage] 2010/01/31(日) 10:34:08 ID: Be:
    >[続報]西日本シティのトラブルは6時間後に復旧、原因はいまだわからず
    >ttp://itpro.nikkeibp.co.jp/article/NEWS/20100129/343949/

    くわばらくわばら・・・。 

251 仕様書無しさん [sage] 2010/01/31(日) 10:38:18 ID: Be:
    > ハードウエアの故障か、あるいはOSやミドルウエアといった基盤ソフトの不具合が顕在化した
    > 可能性が考えられる。ネットワーク障害、あるいはアプリケーションの不具合の可能性もある。

    全部じゃねぇかw 

252 仕様書無しさん [sage] 2010/01/31(日) 11:09:31 ID: Be:
    元警視庁捜査一課長・田宮榮一さんを思い出した。w 

253 仕様書無しさん [sage] 2010/01/31(日) 11:50:18 ID: Be:
    >>250
    そんなことがあったのか。
    俺の口座の残高が増えてたりしないかなw 

考えられる限りを列挙しただけ?


C言語なら俺に聞け(入門編)Part 59
931 デフォルトの名無しさん [sage] 2010/01/30(土) 22:34:43 ID: Be:
    下記コードを実行すると、-79が出力されます。unsignedなのに何故、マイナス値になのでしょうか?

    void main() {
    unsigned int a = 'ア';

    printf("%d", a); /*=> -79 */
    } 

932 931 [sage] 2010/01/30(土) 22:36:41 ID: Be:
    BCC5.5での結果です。 

933 デフォルトの名無しさん [sage] 2010/01/30(土) 22:38:32 ID: Be:
    >>931
    %u じゃないから 

934 デフォルトの名無しさん [sage] 2010/01/30(土) 22:52:13 ID: Be:
    >>933
    %uにしたら4294967217というえらいどでかい数値になりました。。。 

935 デフォルトの名無しさん [sage] 2010/01/30(土) 23:02:08 ID: Be:
    >>934
    正数になったから満足だろw 

936 デフォルトの名無しさん [sage] 2010/01/30(土) 23:06:25 ID: Be:
    4294967217=0xffffffb1
    アの文字コード=0xb1

    どうして上位が1で埋められるんだろう 

937 デフォルトの名無しさん [sage] 2010/01/30(土) 23:14:01 ID: Be:
    >>936
    -79 だからだろ 

938 デフォルトの名無しさん [sage] 2010/01/30(土) 23:17:36 ID: Be:
    >>931
    printf("%d",a)は
    printf( (const char*)"%d",(char*)(int)(signed char)a);
    と翻訳されている。
    "%u"指定の場合、printf文の中で
    (unsigned int)(int)(char*)という型変換が連続的に
    行われこのような結果を起こす。 

939 デフォルトの名無しさん [sage] 2010/01/30(土) 23:20:19 ID: Be:
    >>938
    これはひどいバカ 

940 デフォルトの名無しさん [sage] 2010/01/30(土) 23:25:55 ID: Be:
    ほんとだw
    キャストを徹底的に誤解してるw 

941 デフォルトの名無しさん [sage] 2010/01/30(土) 23:36:06 ID: Be:
    て言うか全部間違えてる 

942 デフォルトの名無しさん [sage] 2010/01/30(土) 23:47:19 ID: Be:
    符号ありなら最上位ビットがコピーされて符号拡張されるのはわかるけど、符号なしなら
    0x0000001bになるんじゃないの? 

943 デフォルトの名無しさん [sage] 2010/01/30(土) 23:56:36 ID: Be:
    'ア'がchar型だと思ってるやつはいないよな? 

■_ 一月は行く

つーことで二月ですか。 とっとと逃げられるんだろうなあ(苦笑)

■_ 本日の巡回から

■_ じんわりとくるおかしさが


おもしろいコピペがあったら貼るスレinマ板part17 
408 仕様書無しさん [sage] 2010/01/31(日) 02:34:42 ID: Be:
    ─――┬─――┬┬─――┬―
          | W.C || W.C |
          |∧∧  |コンコン |
          |(    )シ .|      |
          ||  |  ||      |
    ―――┴|  |―┴┴―――┴―
         ノ∪∪

    ─――┬─――┬┬─――┬―
          | W.C || W.C |
          |∧∧  |<どうぞ. |
          |(    ) ||      |
          ||  |  ||      |
    ―――┴|  |―┴┴―――┴―
         ノ∪∪ 

2010年01月30日

■_

・今月の皇帝陛下
相変わらず陛下自身の登場はほとんどない。 ってエジプト遠征でペスト云々ってのは知らなかった (エロイカではそういうエピソードはなかったような記憶が)。
YOUNGKING OURS ( ヤングキングアワーズ ) 2010年 03月号 [雑誌]

・ダブルフェイス20巻
伏線を回収中というか、〆に入ってるんだろうなあ。 何のかんのでもう20巻かあ。
ダブル・フェイス 20 (ビッグ コミックス)
ダブル・フェイス 20 (ビッグ コミックス)

土曜日に Amazon.co.jp: 基礎講座 C: 村山 公保: 本 という新刊を見かけて、ぱらぱら眺めてみたのですが void func(double &x, double &y); のようなのを「(アドレスを渡すことによる)参照渡し」とか書いててがっくし (記憶で書いているので一字一句この通りではないと思いますが、「参照渡し」 という単語を使っていたのは間違いありません)。 つーかさ、C には call by value (値呼び、値渡し)しかないってのは K & R にも明記されてるんだから後々誤解の種をまくことになるような 「参照」って言葉を持ち出して説明する必要はないと思うけどなあ。 あ、C の場合は配列も「参照渡し」はされてないんでそこんとこよろしく。

1.8 Argument - Call by value

 One ascpect of C fucntion may be unfamiliar to programmers who are used
to smoe other languages, particularly Fortran. In C, all function arguments are
passed "by value." This means that the called fucntion is given the values of its
arguments in temporary variable rather than the originals. This leads to some
differnet propertiees than are seen with "call by reference" languages like Fortran
or with var parameters in Pascal, in which the called routine haas access to
the original argument, not a local copy.

  
A 7.3.2 Function Calls

 In preparing for the call to a function, a copy is made of each argument; all
argument-passing is strictly by value. 

  

■_ 人生はチョコレートの箱だ

というのはフォレスト・ガンプのが有名だろうとは思うんですが。


英語うんちく: "as" は「イコール」と読み替えるとわかります:坂本史郎の【朝メール】より:ITmedia オルタナティブ・ブログ

□□『人生はチョコレートの箱』

    Momma always said "Life is like a box of chocolates. You never know what 
    you're gonna get." 

    ママはいつも言っている。「人生ってチョコレートの箱みたいなもの。自分に何がくるのか
    分からないのよ。」

(略)

『人生はチョコレートの箱』そう考えれば違ってきます。

わくわくして銀紙に包まれたチョコレートを一粒選ぶ、そしてそのチョコをさっくりと噛んでみ
る、すると中身がブランデー味だったり、キャラメル味だったり、ナッツ入りだったり、何が出
てくるか分かりません。でもそれをしっかりと味わうのです。

力の入った『未来は自分で切り開く』派は、「大好きなナッツ入りを絶対取るんだ!」と、気合
を入れてチョコを選んだりします。でも別に気合を入れたからといって狙いのものが取れるわけ
では無いし、そのあげく「自分の思っていた人生とは違う…。」なんて、嘆かれた日にはも、周
りも困ってしまいますよね。

わたしは、X-Files の初期エピソードに出てきたねじくれた解釈?バージョンのが 大好きだったりします。 が、それを詳しく書くと落ち込んでしまいそうなので書きません(えーっ)

気になる人は、DVDででも探してみてください。 「紫煙」という邦題のエピソードだったと思います。 オリジナルのタイトルはなんだったかなあ。

■_ 定義

まあさすがに Cを関数型と言われると悩みますが。

「コンパイラ・スクリプトエンジン」相談室14 

313 デフォルトの名無しさん [sage] 2010/01/25(月) 13:54:25 ID: Be:
    >>291
    おまいは関数型言語をわかっていてそれを関数型と言ってるのか?
    どっかのおかしな事典の「C言語は関数型言語」というトンデモを信じてないか? 

314 デフォルトの名無しさん [sage] 2010/01/25(月) 14:03:04 ID: Be:
    手続き型と勘違いしてるのでは 

315 デフォルトの名無しさん [sage] 2010/01/30(土) 07:37:00 ID: Be:
    291の発言は?だが、「関数型言語」の定義を聞かれると
    答えるのは難しい。 

316 デフォルトの名無しさん [sage] 2010/01/30(土) 07:47:49 ID: Be:
    実は「関数型言語」という語の意味が二種類あるという落ちか。
    古い定義だと「subroutine以外にfunctionを使える言語」なんでCを含むんだよね。

317 デフォルトの名無しさん [sage] 2010/01/30(土) 09:05:34 ID: Be:
    細かい違いな気がするけど

    何かを返す返さないで記述が違うのは
    便利な気がする・・・basic

    void 使え・・・c

    ソース嫁・・・動的型付 

318 デフォルトの名無しさん [sage] 2010/01/30(土) 09:09:08 ID: Be:
    > 古い定義だと「subroutine以外にfunctionを使える言語」なんでCを含むんだよね。

    [要出典]

    Cはsubroutineをfunctionと「呼んでいる」言語であって。 

319 デフォルトの名無しさん [sage] 2010/01/30(土) 09:53:07 ID: Be:
    値を返すサブルーチンを関数と呼ぶのはCに限らずFortranとかPascalとかあるが、
    それらが「関数型言語」と呼ばれていたのは聞いたことがない 

320 デフォルトの名無しさん [sage] 2010/01/30(土) 10:11:12 ID: Be:
    LISPも正格評価で逐次処理、関数は置き換えではなく呼び出しだから、
    関数型ではなく実質的に手続き型言語と言えなくもない 

321 デフォルトの名無しさん [sage] 2010/01/30(土) 10:22:57 ID: Be:
    古い論文だとFortranをfunctional languageと呼ぶことがあるんだけど懼
    まあ、聞いたことないのが当たり前だと思う。
    自分も最初に聞いたとき訳が分からなかったし。

    あと、その訳語として「関数型言語」が主流だったどうかは知らない。
    ごめん。 

322 デフォルトの名無しさん [sage] 2010/01/30(土) 10:32:12 ID: Be:
    >>321
    具体的にその論文名を。 

323 デフォルトの名無しさん [sage] 2010/01/30(土) 10:52:26 ID: Be:
    threaded interpretive language とか書名聞いて
    何ぞと思って調べてみたら forth と z80 の解説書だった

    俺もどこで見たか忘れたけど、Cを関数言語と呼んでた
    記憶が・・・まぁ文脈というか時代背景によるよね > 用語の定義 

324 デフォルトの名無しさん [sage] 2010/01/30(土) 10:58:59 ID: Be:
    技評の「新ANSI C言語辞典」を持ってる人がいたら、それの
    「関数型言語」の項を見てもらいたいのだが... 

325 デフォルトの名無しさん [sage] 2010/01/30(土) 11:08:31 ID: Be:
    >>322
    論文は手元にないんで無理。
    Webならhttp://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseNotesnode52.htmlが近いかな。

    むしろちょっと疑問なんだけど、
    "functional language"に同綴り異義語があった
    というのってそんなに興味深いのか。 

326 デフォルトの名無しさん [sage] 2010/01/30(土) 11:19:10 ID: Be:
    >>324
    通りすがりの漏れが引用しますよ
    p.294 関数型言語 の項より

    「関数型言語(functional language) 関数型のプログラミング言語。
    LISP、LOGO、APL、BCPL、B、Cなどがある」 

327 デフォルトの名無しさん [sage] 2010/01/30(土) 11:22:51 ID: Be:
    そのころの基準で関数型じゃない言語って何だ?
    FORTRAN、COBOLは違うのか?
    BASIC? 関数を言語仕様に入れただけで、分類が型が変わるのか?
    アセンブラ? 

328 デフォルトの名無しさん [sage] 2010/01/30(土) 11:58:43 ID: Be:
    どうでもいいからブログでやってろ 

329 デフォルトの名無しさん [sage] 2010/01/30(土) 12:27:44 ID: Be:
    >>326
    たぶんそれが日本でデマが流行ってる元凶。
    時代によって変わったりなどしない。B も C も関数型じゃない。

    >>325 も HPC の専門家らしいので、言語屋じゃない。
    言語屋が C を functional などと言った例はないはず。 

330 デフォルトの名無しさん [sage] 2010/01/30(土) 12:52:56 ID: Be:
    素直にこの辺りを参照した方が良いと思う。
    ttp://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0_%28%E6%95%B0%E5%AD%A6%29

    俺解釈だと「処理が関数の変数と値に依存する言語」「独立して書かれている処理は独立している」だな。 

331 デフォルトの名無しさん [sage] 2010/01/30(土) 13:02:29 ID: Be:
    「Cを関数型と呼ぶ人が一部にいたのかどうか」
    「その事実は万人が知っていてしかるべきか」という話になってしまっているが
    なんにせよCもFortranも関数型言語ではないし
    LISPにしても、延々とこんな話を続ける理由になるほど手続き型言語っぽくはない 

332 デフォルトの名無しさん [sage] 2010/01/30(土) 13:03:14 ID: Be:
    >>330
    バカ 

333 デフォルトの名無しさん [sage] 2010/01/30(土) 15:53:39 ID: Be:
    LISPとCに根本的な違いが無いのに
    「LISPは関数言語」というデマがいつからか
    流行ったのが酷いと思うけど。 

334 デフォルトの名無しさん [sage] 2010/01/30(土) 16:11:15 ID: Be:
    > 根本的な違い
    根本的というのが曖昧すぎて、何とも言えないな。つまりどういう要素が根本的なのか。 

335 デフォルトの名無しさん [sage] 2010/01/30(土) 16:24:30 ID: Be:
    LISPとCでどこが違うのか言ってみてよ。 

336 227 [sage] 2010/01/30(土) 17:59:10 ID: Be:
    Haskellも副作用(モナド)あるから関数型じゃないよね、とか燃料投下してみる。 

337 デフォルトの名無しさん [sage] 2010/01/30(土) 18:22:26 ID: Be:
    OCamlはもっと微妙。 

■_ Perl 6

だいぶすっ飛ばしてましたが。


Journal of chromatic (983)

Perl 6 Design Minutes for 27 January 2010

[ #40144 ]

The Perl 6 design team met by phone on 27 January 2010. Larry, Allison, Patrick, and 
chromatic attended.

Larry:

    * tweaked definition of when a series operator is considered infinite
    * nailed down more list assignment semantics with respect to interators
    * clarified how ($a, $b, @a) = 1..* works
    * KeyWeight deletion criterion kept consistent with other KeyHash types
    * negative keyweights are allowed to fail at pick time
    * "mostly eager" now assumes unknown closure generators are probably infinite
    * random whackage on List, Seq, Parcel, Capture, Iterator, Nil etc.
    * List is now simply the iterator role, and doesn't do Positional
    * Seq takes over Positional duties for reified (or reifiable) value lists
    * think of Seq now as a constant Array (but also lazy like Array)
    * Iterable now means you can ask for an iterator, but doesn't do List
    * Array, Seq, etc do Iterable, but not List
    * only actual iterators do List
    * Nil is defined as a suitable sentinel for both list and slice iterators
    * continued to rethink that with pmichaud++ et al
    * we'll probably end up with an EMPTY special exception object to be the iterator sentinal
    * proposed an E operator to go with it to make testing for EMPTY across multiple iterators very fast
    * other than that, mostly just bug whacking, no major refactors
    * still thinking about doing real LTM for STD
    * did lazify Cursor's fnum->fate translations for shorter LTM candidates in preparation for smarter LTM
    * we don't need special objects for the items that get matches
    * we do need to think more about the hyper cases
    * how to do list processing using balanced trees of delegated sub refs
    * don't want to build in serial assumptions where we don't need them

Patrick:
(略)
    * objects that can iterate have a .iterator() method
    * to interpolate that into a list, .list() returns a flat Parcel for that iterator
    * Parcels know how to generate Iterators

イテレート可能なオブジェクトは .iterator() メソッドを持ってるとか。 って今までそれ決まってなかったってこと?

■_ Python プログラマーの進化

以前、Haskellプログラマー版があったと思いますが The Evolution of a Haskell Programmer reddit 経由で。 Evolution of a Python programmer : programming なんでこんなに伸びてんだw


gist: 289467 - GitHub
Evolution of a Python programmer.py #

#Newbie programmer 新米プログラマー
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
print factorial(6)
 
 
#First year programmer, studied Pascal
# Pascal を学んだ一年生プログラマー
def factorial(x):
    result = 1
    i = 2
    while i <= x:
        result = result * i
        i = i + 1
    return result
print factorial(6)
 
 
#First year programmer, studied C
# C を学んだ一年生プログラマー
def fact(x): #{
    result = i = 1;
    while (i <= x): #{
        result *= i;
        i += 1;
    #}
    return result;
#}
print(fact(6))
 
 
#First year programmer, SICP
# SICPで学んだ一年生プログラマー
@tailcall
def fact(x, acc=1):
    if (x > 1): return (fact((x - 1), (acc * x)))
    else: return acc
print(fact(6))
 
 
#First year programmer, Python
def Factorial(x):
    res = 1
    for i in xrange(2, x + 1):
        res *= i
    return res
print Factorial(6)
 
 
#Lazy Python programmer
# ものぐさな Python プログラマー
def fact(x):
    return x > 1 and x * fact(x - 1) or 1
print fact(6)
 
 
#Lazier Python programmer
# より怠惰なPython プログラマー
f = lambda x: x and x * f(x - 1) or 1
print f(6)
 
 
#Python expert programmer
import operator as op
import functional as f
fact = lambda x: f.foldl(op.mul, 1, xrange(2, x + 1))
print fact(6)
 
 
#Python hacker
import sys
@tailcall
def fact(x, acc=1):
    if x: return fact(x.__sub__(1), acc.__mul__(x))
    return acc
sys.stdout.write(str(fact(6)) + '\n')
 
 
#EXPERT PROGRAMMER
import c_math
fact = c_math.fact
print fact(6)
 
 
#ENGLISH EXPERT PROGRAMMER
import c_maths
fact = c_maths.fact
print fact(6)
 
 
#Web designer
def factorial(x):
    #-------------------------------------------------
    #--- Code snippet from The Math Vault ---
    #--- Calculate factorial (C) Arthur Smith 1999 ---
    #-------------------------------------------------
    result = str(1)
    i = 1 #Thanks Adam
    while i <= x:
        #result = result * i #It's faster to use *=
        #result = str(result * result + i)
           #result = int(result *= i) #??????
        result str(int(result) * i)
        #result = int(str(result) * i)
        i = i + 1
    return result
print factorial(6)
 
 
#Unix programmer
import os
def fact(x):
    os.system('factorial ' + str(x))
fact(6)
 
 
#Windows programmer
NULL = None
def CalculateAndPrintFactorialEx(dwNumber,
                                 hOutputDevice,
                                 lpLparam,
                                 lpWparam,
                                 lpsscSecurity,
                                 *dwReserved):
    if lpsscSecurity != NULL:
        return NULL #Not implemented
    dwResult = dwCounter = 1
    while dwCounter <= dwNumber:
        dwResult *= dwCounter
        dwCounter += 1
    hOutputDevice.write(str(dwResult))
    hOutputDevice.write('\n')
    return 1
import sys
CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 
 
#Enterprise programmer
def new(cls, *args, **kwargs):
    return cls(*args, **kwargs)
 
class Number(object):
    pass
 
class IntegralNumber(int, Number):
    def toInt(self):
        return new (int, self)
 
class InternalBase(object):
    def __init__(self, base):
        self.base = base.toInt()
 
    def getBase(self):
        return new (IntegralNumber, self.base)
 
class MathematicsSystem(object):
    def __init__(self, ibase):
        Abstract
 
    @classmethod
    def getInstance(cls, ibase):
        try:
            cls.__instance
        except AttributeError:
            cls.__instance = new (cls, ibase)
        return cls.__instance
 
class StandardMathematicsSystem(MathematicsSystem):
    def __init__(self, ibase):
        if ibase.getBase() != new (IntegralNumber, 2):
            raise NotImplementedError
        self.base = ibase.getBase()
 
    def calculateFactorial(self, target):
        result = new (IntegralNumber, 1)
        i = new (IntegralNumber, 2)
        while i <= target:
            result = result * i
            i = i + new (IntegralNumber, 1)
        return result
 
print StandardMathematicsSystem.getInstance(new (InternalBase, new (IntegralNumber, 2))).calculateFactorial(new (IntegralNumber, 6))
 

■_ もうひとつ Python

3.0になってテキストの出力が桁違いに遅くなったと言う話がありましたが


Dabeaz: Reexamining Python 3 Text I/O
 
Reexamining Python 3 Text I/O

Note: Since I first posted this, I added a performance test using the Python 2.6.4 
codecs module. This addition is highlighted in red.

When Python 3.0 was first released, I tried it out on a few things and walked away 
unimpressed. By far, the big negative was the horrible I/O performance. For instance, 
scripts to perform simple data analysis tasks like processing a web server log file 
were running more than 30 times slower than Python 2. Even though there were many new 
features of Python 3 to be excited about, the I/O performance alone was enough to make 
me not want to use it---or recommend it to anyone else for that matter.

Some time has passed since then. For example, Python-3.1.1 is out and many 
improvements have been made. To force myself to better understand the new Python 3 I/O 
system, I've been working on a tutorial Mastering Python 3 I/O for the upcoming 
PyCON'2010 conference in Atlanta. Overall, I have to say that I'm pretty impressed 
with what I've found--and not just in terms of improved performance.

(略)

On my machine, I have a 325MB log file consisting of 3649000 lines--a perfect 
candidate for performing a few benchmarks. Here are the numbers that you get running 
the above script with different Python versions. UCS-2 refers to Python compiled with 
16-bit Unicode characters. UCS-4 refers to Python compiled with 32-bit Unicode 
characters (the --with-wide-unicode configuration option). Also, in the interest of 
full disclosure, these tests were performed with a warm disk cache on a 2 GHZ Intel 
Core 2 Duo Apple Macbook with 4GB of memory under OS-X 10.6.2 (Snow Leopard).

    Python Version	Time (seconds)
    2.6.4	7.91s
    3.0	125.42s
    3.1.1 (UCS-2)	14.11s
    3.1.1 (UCs-4)	17.32s

As you can see, Python 3.0 performance was an anomaly--the performance of Python 3.1.1 
is substantially better. To better understand the I/O component of this script, I ran 
a modified test with the following code

    for line in open("access-log"):
        pass

Here are the performance results for iterating over the file by lines:

    Python Version	Time (seconds)
    2.6.4	1.50s
    2.6.4 (codecs, UTF-8)	52.22s
    3.0	105.87s
    3.1.1 (UCS-2)	4.35s
    3.1.1 (UCs-4)	6.11s

If you look at these numbers, you will see that the I/O performance of Python 3.1 has 
improved substantially. It is also substantially faster than using the codecs module 
in Python 2.6. However, you'll also observe that the performance is still quite a bit 
worse than the native Python 2.6 file object. For example, in the table, iterating 
over lines is about 3x slower in Python 3.1.1 (UCS-2). How can that be good? That's 
300% slower!

(略)

■_ 本日の巡回から

■_ しばらく書き込みがないと思っていたら

ブートストラッピングでコンパイラを作ろう 
31 1 [sage] 2010/01/14(木) 14:03:28 ID: Be:
    >>30
    なるほど、コンパイル時に並び替えしてくれるんですね。知りませんでした。
    てことはjmpもいらないのか~。 

32 デフォルトの名無しさん [sage] 2010/01/30(土) 03:48:29 ID: Be:
    ず~っと規制で書き込めませんでしたorz
    現状、rowl1の実装を進めています。
    アセンブリからdlopen()をコールする為のコードを書いている所です。 

なんとw

2010年01月29日

■_

・図書館検索システム
不満がないわけじゃないですが、紙の蔵書目録と比べると便利さの具合が段違いですよね。 ほかの図書館の蔵書も苦もなく探せるし、タイトルが多少あいまいでもなんとかなる。 で、地元の図書館で手配すれば離れた図書館の蔵書も簡単に取り寄せられる。 やー、便利な時代になったもんだ(おっさんモード)。

・サリンジャー
訃報がありましたね。 「ライ麦畑でつかまえて」などで知られる小説家のJ.D.サリンジャー氏が死去 - GIGAZINE 気がつかれてないのか、華麗にスルーされているのかわかりませんが、 最新三日分の方のページには「ライ麦畑でつかまえて」(The Chatcher in the Rye) からの引用があったりします。 しかも、「I thought what I'd do was, I'd pretend I was one of those deaf-mutes 」 ではありません(笑) まあどうということでもないんですが。

■_ 正規表現続き

昨日も話題にしたやつに動きが。

Ruby 初心者スレッド Part 34
18 デフォルトの名無しさん [sage] 2010/01/28(木) 16:25:43 ID: Be:
    str = 'first,second"a,b,c"second,third'

    という文字列があったとして
    ダブルクオーテーションの中以外のカンマにマッチする正規表現ってありませんか? 

37 デフォルトの名無しさん [sage] 2010/01/28(木) 22:52:03 ID: Be:
    基本、このタイプは無闇にめんどくさい 

40 デフォルトの名無しさん [sage] 2010/01/29(金) 08:35:40 ID: Be:
    それでも鬼車なら・・・鬼車ならきっと何とかしてくれる 

44 デフォルトの名無しさん [sage] 2010/01/29(金) 11:18:45 ID: Be:
    >>18
    出遅れた気がするけど、
    str = 'first,second"a,b,c"second,third'
    str.scan(/(?:^|\G,)([^",]*(?:"[^"\\]*(?:\\.[^"\\]*)*"[^",]*)*)/).map{|a|a[0]} 

48 デフォルトの名無しさん [sage] 2010/01/29(金) 13:57:49 ID: Be:
    str.scan /(?:[^",]|"[^"]*?")+|(?=,,|^,|,$)/ 

49 デフォルトの名無しさん [sage] 2010/01/29(金) 14:27:24 ID: Be:
    メンテナンスしたくない正規表現が続々届いております 

50 デフォルトの名無しさん [sage] 2010/01/29(金) 14:31:56 ID: Be:
    正攻法は>>25、LLっぽいのは>>35だと思う 

51 デフォルトの名無しさん [sage] 2010/01/29(金) 14:36:07 ID: Be:
    >>49
    ちょっと変えたいときに悲惨だな
    これくらいは読めて欲しい気もするが 

52 デフォルトの名無しさん [sage] 2010/01/29(金) 15:51:35 ID: Be:
    \Gの使い方がよくわからなかった自分としては>>44が勉強になった 

53 デフォルトの名無しさん [sage] 2010/01/29(金) 15:53:13 ID: Be:
    最終的には読めて欲しい
    初級を脱したと思ってる人は読めて欲しいなー 

54 デフォルトの名無しさん [sage] 2010/01/29(金) 16:34:07 ID: Be:
    読めても変えたくないエンバグしそう 

55 デフォルトの名無しさん [sage] 2010/01/29(金) 16:36:13 ID: Be:
    >>44 の修正、一般にCSVでは"のエスケープは""
    str.scan(/(?:^|\G,)([^",]*(?:"[^"]*(?:""[^"]*)*"[^",]*)*)/) 

56 27 [sage] 2010/01/29(金) 16:45:09 ID: Be:
    ↑
    なるほど。勉強になったthx 

57 デフォルトの名無しさん [sage] 2010/01/29(金) 19:46:41 ID: Be:
    >>49
    正規表現をくれということだから仕方ない 

繰り返しの繰り返しはあんまり使いたくないけど仕方ないかなあ。 鬼車だと警告が出なかったっけか? >繰り返しの繰り返し

■_ Bruce Perens: How Many Open Source Licenses Do You Need?

続き。 Bruce Perens: How Many Open Source Licenses Do You Need? — Datamation.com

So, companies that want to share, but don't want their competitor to run away with 
their work without themselves sharing, are well advised to use a license like the GPL.

ですから、共有はしたいけれども競争相手が自分たちに対する共有をせずに持って行かれたく
ないと考える企業は GPL のようなライセンスを使うようにアドバイスを受けているのです。

So, from those two business purposes, we can arrive at the sorts of licenses we need:

さてこれら二つのビジネス目的から、わたしたちが必要とするライセンスの分類にたどり着きました:


1. A “gift” license: “贈り物”ライセンス:

This is as unrestrictive as possible, which allows the licensee to combine the work 
with either Open Source or proprietary software.

このライセンスは可能な限り制限をせず、オープンソースソフトウェアでも proprietary な
ソフトウェアでも組み合わせることを許すものです。


2. A “sharing with rules” license: “ルールによる共有”ライセンス:

This says “be my partner” even to companies you might not always trust, for example 
your worst competitors in the market, because if they improve the product, they have 
to share.

このライセンスは常には信頼できないかもしれない企業、たとえばあなたにとって市場における
最強の競合相手 (your worst competitors in the market) に対しても“be my partner” (パー
トナーになれ) ということを主張するものです。もしその競争相手が製品の改良を行ったら、彼ら
はそれをわたしたちとも共有しなければならないからです。

3. An “in-between” license:

This is for making software libraries under the “sharing with rules” paradigm, but 
which are usable in proprietary software.

これはソフトウェアライブラリを“規則に基づく共有”というパラダイム下に置くけれども、
proprietary なソフトウェアで使うこともできるというものです。

With these three sorts of licenses, we can fulfill most of the different business 
purposes that there might be for an Open Source development.

これら三種類のライセンスでもって、オープンソース開発のためという可能性のある異なるビジ
ネス目標のほとんどを達成 (fulfill) することが可能です

Individuals and Open Source Projects (個人とオープンソースプロジェクト)

The motivations for individuals, rather than companies, are somewhat different. 
They're important because the largest company working on the Linux kernel, in a recent 
survey, was “No Affiliation.” Individuals play key roles in many important Open 
Source projects.

個人にとってのモチベーション (motivations for individuals) は、企業のそれと比べるとか
なり異なるものです。最近の調査では Linux kernelに関して作業している最大集団 (largest 
company) は “No Affiliation”(所属なし)であったので、彼らは重要です。Individuals は多
くの重要なオープンソースプロジェクトにおいて key roles を果たしています。

Some individuals are content to give all the Open Source software they create away as 
a gift. Not me. I use “gift” licenses when I'm paid to do so, and “sharing with 
rules” licenses otherwise.

中には、彼らが作り出したオープンソースソフトウェアを丸ごと贈り物 (gift) としてしてしま
うことを喜んで行っている人たち (some individuals) もいます。わたしではありません。わた
しは I'm paid to do so のときには “贈り物”ライセンスを使い、それ以外の場合には“ルー
ルに基づく共有”ライセンスを使っています。

This is mostly because I don't want to be the unpaid employee of some company that 
uses my work and gives nothing back to the Open Source community. I want the people 
who extend my software to give their extensions to the world to share, the same way I 
gave them my original program. So, my payback for writing Open Source is that my 
software drives a further increase in the amount of available Open Source software, 
beyond my individual contribution.

このようにしている理由はおおむね、わたしの成果物 (my work)を使っているけれどもオープン
ソースコミュニティに対してなんのお返し (back) もしない一部の企業に対して、わたしは無給
の従業員 (unpaid employee) にはなりたくないと考えているからです。わたしは、わたしがオ
リジナルを作ったプログラムで彼らに対して行ったのと同じやり方で自分たちの拡張を共有のた
めにわたしのソフトウェアに extend してくれるような人たちを求めています。ですから、オー
プンソースを書くことに対するわたしへの見返り (payback) というのはわたしのソフトウェア
がわたし個人の contribution を越えて (available) なオープンソースソフトウェアの量を大
きく増やすことを促進 (drive) するということです。

There's another motivation for use of a “sharing with rules” license in the software 
I'm currently building: dual licensing.

もう一つこれとは別に現在わたしがソフトウェアを作るときに“ルールに基づく共有”ライセン
スの使用する motivation があるのですが、デュアルライセンシングがそれです。

Companies that want to combine my new software with their own proprietary product, 
without having to comply with my “sharing with rules” license, pay me for a 
commercial license. That license doesn't require any sharing, and allows my work to be 
combined with their commercial product. But they can get the same work for free, as 
can everyone, if they can comply with the “sharing with rules” license.

わたしの新しいソフトウェアと自分たちの proprietary product とをわたしの “sharing with 
rules” ライセンスに comply することなしに組み合わせることを希望する企業は commercial 
license をわたしに支払います。そのライセンスは一切の共有を要求しませんし、わたしの成果
物を彼ら自身の commercial product と combine することも許可しています。しかし彼らは、
“ルールに基づく共有”ライセンスに comply しさえすれば、同じ成果物を他の誰もがそうであ
るように無料で得ることもできるのです。

Thus, I am paid to make Open Source, and can give it away at the same time. Had I used 
the “gift” license, companies would have no motivation to pay for my commercial 
license.

であるからこそ、わたしはオープンソースを作るために対価を払うし、それと同時にオープンソ
ースのものを自由に使えるようにできるのです。わたしが“贈り物”ライセンスを使っていたら、
企業はわたしの commercial license にお金を払おうという動機を持つことがなかったでしょう。

Dual licensing is a bit more complicated than the usual Open Source development, 
because the company that offers dual-licensing needs to own the entire copyright to 
the program, or the right to re-license all contributions to the program. It's 
necessary to give contributors some sort of incentive, or they generally aren't very 
willing to sign over their copyrights or the right to re-license their contributions.

デュアルライセンスにするのは通常のオープンソース開発よりも多少複雑なものになります。な
ぜなら、デュアルライセンスを提案する企業はそのプログラムに対しての著作権を丸ごと保持す
るか、あるいはそのプログラムに対するすべての貢献の再ライセンスに対する権利が必要になる
からです。これは貢献した人たち (contirbutors) に対してなんらかのインセンティブ (some 
sort of incentive) を与えるために必要なものです。そういったものがなければ、彼らは自分
たちの copyrights や contiributitons の re-license をする権利を譲ることなどしないでしょう。


So, we have our three sorts of licenses. Let's start to map those to real licenses. My 
preferred three are:

結局のところ、 わたしたちの手元には三種類のライセンスがあります。
ではそれを実際のライセンスに当てはめ(map)ていきましょう。
わたしの好みの三つは以下のものです:

1. Gift license: The Apache License 2.0

This is similar to the MIT and BSD licenses, but provides a little more protection 
from software patent lawsuits to the Open Source developer.

これは MIT ライセンスや BSD ライセンスに似ていますが、このライセンスではそれらよりも弁
護士からオープンソース開発者を守るためのソフトウェア特許に関する little more 
protection を提供しています。

2. Sharing-with-rules license: GPL 3

Descended from the GPL, the most popular Open Source license, this license is updated 
to deal with the vastly larger amount of copyright and case law that exists today.

最もポピュラーであるオープンソースライセンスの GPL から受け継がれたこのライセンスは
the vastly larger amount of copyright and case law that exists today
(今日多発している著作権などの法的な係争とかなんとか)
に対処するためにアップデートされたものです。

3. In-between license: LGPL 3

This is very similar to the text of GPL 3, so that you don't need to learn another 
license.

このライセンスの文面は GPL3 に非常に似ている(共通している部分が多い) ので
別のライセンスを学ぶ必要がありません。

All three are compatible with each other, according to FSF and other authorities.

FSF やその他の authorities によればこれら三つは全てお互いに互換 (compatible) です。

At this point, some contingent of the audience has just thrown up their hands and 
shouted EEEEEwwww! Why's he using GPL3?????

At this point,
some contingent of the audience has just thrown up their hands
and 
ええええーーーっ! なんだって彼はGPL3を使ってるんだ???

GPL3, unfortunately, gained a bad reputation in some camps because it is ambitious, 
and because Linus Torvalds was uncomfortable with it. Linus' discomfort stems from a 
personal issue, so I tend to discount him in this case.

残念なことに GPL3 はその野心的な内容と、Linus Torvalds が GPL3 に対して否定的な
立場をとったがために、some camps において bad reptation を得てしまっています。
Linus の discomfort は個人的な issue からの stems なので、
彼のケースは discount します。


One of the most ambitious things about GPL3 is that it attempts to prohibit DRM. Hmmm, 
did you notice that announcement that iTunes isn't going to use DRM any longer? 
Between the debut of GPL3 and today it seems that more people have realized that DRM 
isn't such a great idea.

GPL3 で最も ambitious なことがらの一つが DRM を拒絶しようと試みている点です。うーん、
あなたは iTunes が DRM をもう使わない方向へ進むことがアナウンスされていたのをご存じな
かったのでしょうか? GPL3 が世に出てから今日までの間にさらに多くの人が DRM はそれほど優
れたアイデアではないということを認識したようです。

The other ambitious thing that GPL3 does is that it insists that the software in an 
embedded device be modifiable in situ. This is so that Open Source operating systems 
are still possible in the future.

これとは別の GPL3 が行っている ambitious things がembeded device の中にあるソフトウェ
アを be modifiable in situ にすることを要求しているというものです。

#in situ → in the original or correct place
#本来の場所で、元の位置で

This is so that
Open Source operating systems are still possible in the future.

これにより、オープンソースのオペレーティングシステムが将来もあり続けられるのです。

Next Page: A Fourth Open Source License to Consider

あと一回だけさらに続く。

■_ 本日の巡回から

■_


おもしろいコピペがあったら貼るスレinマ板part17 
355 仕様書無しさん [] 2010/01/29(金) 15:37:56 ID: Be:
    探し物はギャンですか?
    見つけにくいネモですか?
    ガウの中もミデアの中も探したけれど見つかりません。
    マラサイ探す気ですか?
    それよりゴッグと踊りませんか?
    チベの中へ
    チベの中へ
    行ってムサイと思いませんか
    グフッフーグフッフー
    グフッフー
    シャアー
    ザクることも許されず~
    笑うこともドムられて~
    ハイゴッグばって、ハイゴッグばって 

2010年01月28日

■_

電撃大王が凶悪なくらいにまで厚みがあったけど、前からあんなもんだったっけ?

東スポにスワローズでもコーチを務めたことのある人のコラムがあって 長島一茂に関係したエピソードとか出てきたんだけど、 一茂があるときコーチから(態度不良だかなんだかで)叩かれたときに 「親父にもぶたれたことないのに」と食って掛かってきたとかいうくだりがあって 大笑い。

■_

タイトルがどっかで見覚えがある言い回しだなあと思ったら 日付が2008年じゃないですか。 Writing Multithreaded Code Is Like Juggling Chainsaws : programming まあ古いのを見つけてスレッドが立つのも良くあることか。


the_codist()

Writing Multithreaded Code Is Like Juggling Chainsaws

Posted: 02/05/2008, Perm Link Readers: 16713

Writing multithreaded code is like juggling chainsaws; amazing when it works and truly 
sucky when it doesn't.

Right now at my job I am writing the foundation for a transaction processing cluster 
in Java, so I'm immersed in lots and lots of threads and interacting applications. 
When you are processing 8000 of something per second, any problems in your approach or 
in your choice of frameworks is magnified.

In job interviews, a popular question is "what is the major problem you have to 
solve in writing multithreaded code?" Generally, if they have read a little about 
it, they often say "avoiding deadlocks". If they have done a bit of thread 
coding, maybe in Swing, they might say "protected shared data". Only the 
truly experienced in complex threaded coding will say "avoiding doing 
nothing".

(さくっと略)

Multithreaded coding in a complex application requires a lot of discipline (never 
assume anything, test everything), experimentation (there is no one way to make it 
work) and patience (sometimes lots of negative problems lead you to see the solution). 
It's not easy and it's not quick (never mind the project manager).

Then again neither is juggling chainsaws; plus the downside is pretty nasty.

で、


Writing Multithreaded Code Is Like Juggling Chainsaws : programming

No, writing it is easy. Getting it to work is like juggling chainsaws.

ふむ。うまいこと云うな>書くこと自体は簡単~

■_


Ruby 初心者スレッド Part 34 
18 デフォルトの名無しさん [sage] 2010/01/28(木) 16:25:43 ID: Be:
    str = 'first,second"a,b,c"second,third'

    という文字列があったとして
    ダブルクオーテーションの中以外のカンマにマッチする正規表現ってありませんか? 

19 デフォルトの名無しさん [sage] 2010/01/28(木) 16:57:00 ID: Be:
    Ruby関係ねえええ 

20 デフォルトの名無しさん [sage] 2010/01/28(木) 17:10:46 ID: Be:
    irb> str = 'first,second"a,b,c"second,third'
    irb> p str.gsub(/".+?"/){' '}.gsub(/,/){' '}
    "first second second third"

    こんなんじゃ駄目なんだろうなあ 

21 デフォルトの名無しさん [sage] 2010/01/28(木) 17:24:03 ID: Be:
    >>18
    最終的にしたいことは何でしょうか?

    ダブルクオーテーションの中以外のカンマの数を数えたいとか、
    ダブルクオーテーションの中以外のカンマでsplitしたいとか。 

22 デフォルトの名無しさん [sage] 2010/01/28(木) 17:30:18 ID: Be:
    >>21 後者です。
    str.split(regexp) #=>["first", "second\"a,b,c\"second", "third"]
    というのを期待しています。
    ダブルクオーテーションはネストしないと仮定しています。
    正規表現は難しいです。 

23 デフォルトの名無しさん [sage] 2010/01/28(木) 17:36:58 ID: Be:
    >>19
    正規表現スレを見つけました。
    正規表現スレに移動した方がよろしいでしょうか? 

24 デフォルトの名無しさん [sage] 2010/01/28(木) 17:47:26 ID: Be:
    >>22
    うおめんどくさ 

25 デフォルトの名無しさん [sage] 2010/01/28(木) 18:08:58 ID: Be:
    題意に沿わず、長く、そして美しくない

    str = 'first,second"a,b,c"second,third'

    require 'strscan'
    COMMA = /\A,\Z/
    QUOTE = /".*?"/
    SCAN_REG = /#{QUOTE}|./
    def parse(str)
    result = [""]
    scanner = StringScanner.new(str)
    while match = scanner.scan(SCAN_REG)
    case match
    when COMMA; result << ""
    else ; result.last << match
    end
    end
    result
    end

    p parse(str) #=> ["first", "second\"a,b,c\"second", "third"] 

26 デフォルトの名無しさん [sage] 2010/01/28(木) 18:11:07 ID: Be:
    >>23
    多分、正規表現だけでは無理なのでここでいいんじゃないかな 

27 デフォルトの名無しさん [] 2010/01/28(木) 18:30:36 ID: Be:
    一応出来た。でもバグがあるかもしれないから(;_;)
    僕にもっと考える時間と頭をください。

    条件を満たすカンマにマッチする正規表現を考えるから難しいのかなー、と思って
    違う考え方をしてみた。

    str = 'first,second"a,b,c"second,third'
    str.scan /(?:[^",]+"[^"]+"[^",]+)+|[^,]+/
    => ["first", "second\"a,b,c\"second", "third"]

    あとは、これを頭のいい人が改良するだけでつ(;_;) 

28 27 [] 2010/01/28(木) 18:47:21 ID: Be:
    うわ、やっぱりバグありまくりですね。

    個人的には、正規表現は難しいし、魔法じゃないし
    言語のチカラを借りて何とかする方が楽かなー、って思う。

    んと、C使いだったら一文字ずつ調べてみるけど... 

29 デフォルトの名無しさん [] 2010/01/28(木) 18:49:45 ID: Be:

30 デフォルトの名無しさん [sage] 2010/01/28(木) 19:24:17 ID: Be:
    一旦NUL文字にして、後で戻すとかどう?

    str = 'first,second"a,b,c"second,third'
    arr = str.gsub(/".*?"/){|m| m.gsub(/,/, "\0")}.split(/,/).map{|a| a.gsub(/\0/, ',')}
    p arr #=> ["first", "second\"a,b,c\"second", "third"] 

31 18 [sage] 2010/01/28(木) 19:52:09 ID: Be:
    短時間にこれだけレスを頂けるとは思ってもみませんでした。

    >>27
    カンマ以外の文字列からアプローチする方法は思いつきませんでした。
    発送の転換ですね。
    一文字づつ調べるというのは>>25氏の方法に近いですね。

    >>30
    この方法は漏れが少なそうに思います。

    >>27氏と>>30氏の方法をベースに検討してみようと思います。
    ありがとうございました。

32 デフォルトの名無しさん [sage] 2010/01/28(木) 20:03:12 ID: Be:
    /(?:[^",]*"[^"]*"[^",]*)+|[^,]+/

    こんな感じニカ? 

33 デフォルトの名無しさん [] 2010/01/28(木) 21:18:59 ID: Be:
    鬼車の田中哲スペシャルってこーゆーとき活用できるもん?

34 デフォルトの名無しさん [sage] 2010/01/28(木) 21:41:50 ID: Be:
    面倒臭いから区切りを " " にするよう説得して Shellwords.shellwords を使う。だめか。
    CSV だと思って CSV.parse_line する。だめだって。通らないし。 

35 デフォルトの名無しさん [] 2010/01/28(木) 21:50:19 ID: Be:
    問答無用で , で豚切りしてから、
    " を含む物から次の " を含むものまでを , で連結したものに置換える。

36 デフォルトの名無しさん [sage] 2010/01/28(木) 22:19:46 ID: Be:
    >>35
    それだと分割したリストを"求めて尋ねる歩く旅に出ないといけなくなるわけだが・・・ 

37 デフォルトの名無しさん [sage] 2010/01/28(木) 22:52:03 ID: Be:
    基本、このタイプは無闇にめんどくさい 


んー? 'first,second,"a,b,c",second,third' じゃあないのか。めんどくせー

■_ 訳

Pascalが私の好きな言語でない理由 - taro-nishino の日記


Pascalが私の好きな言語でない理由 - taro-nishino の日記

Pascalと言えば、Linus Torvalds氏のPascal嫌いも有名ですが、もっと昔にPascalを酷評した人
がいます。御存知、K&Rの共著者でもあるBrian W. Kernighan博士ですが、博士は1981年
に"Why Pascal is Not My Favorite Programming Language"という論文を書きました。
この有名な文献がどうも和訳がまだ無い(これには驚きました)ようでしたので、私訳を以下に
載せておきます。

とあるんですが、 翻訳されたのを書籍か雑誌かで読んだ記憶があったので ただ単にネットに上がってないだけじゃないか? とつぶやいたところ、 Amazon.co.jp: Ada,C,Pascal―言語の比較と評価: アラン フォイヤー, ナレイン ゲハーニ, 宇井 康隆: 本 に載っているという情報をいただきました。 図書館にあるっぽい(取り寄せ?になりますけど)ので、早速借りる算段をすることにします。

■_

Twitter / wtnabe: 素朴な疑問だけど、メンテ不能なコードを書いたら自分で ... もっともな疑問ですが、出だし(Intorduction)にこうあるんですけどね。

In the interests of creating employment opportunities in the Java programming field, I
am passing on these tips from the masters on how to write code that is so difficult to
maintain, that the people who come after you will take years to make even the simplest
changes. Further, if you follow all these rules religiously, you will even guarantee
yourself a lifetime of employment, since no one but you has a hope in hell of
maintaining the code. Then again, if you followed all these rules religiously, even
you wouldn't be able to maintain the code!

Javaプログラミングの分野での雇用機会の創出のために、わたしはメンテナンスを困難にするコ
ードの書き方についての単純極まる変更でさえもそれを行うのに何年も掛かってしまうような
tips を masters から授かりました。さらにこのルール全てにあなたが religiously に従えば
あなたは lifetime of employment を手に入れることになるでしょう。なぜなら、あなた以外の
誰であってもそのコードのメンテナンスをすることが絶望的だからです。そして繰り返しますが、
このルール全てにあなたが religiously に従えばあなた自身でさえもそのコードのメンテナン
スができなくなってしまうでしょう!

You don't want to overdo this. Your code should not look hopelessly unmaintainable,
just be that way. Otherwise it stands the risk of being rewritten or refactored.

あなたはこれをやりすぎることは望まないでしょう。あなたのコードは絶望的なほどメンテナ
ンス不可能 (hopelessly unmaintainable) なもののように見えるべきではありません。just be 
that way. さもなければ、書き直されたりリファクタリングされる危険が残るでしょう。
  

つまり、人を呪わば穴二つというわけですな(違)

■_ 本日の巡回から

2010年01月27日

■_

[お察しください]

・少年エース
付録のCDだけ☆っー

■_

Yahoo!知恵袋にも同じ質問がありますが もし仮に5つの言語(Python, Java, C/C++, Perl, LISP、アセンブラ)を学ぶとした... - Yahoo!知恵袋


もし仮に5つの言語(Python, Java, C/C++, Perl | OKWave

もし仮に5つの言語(Python, Java, C/C++, Perl, LISP、アセンブラ)を学ぶとした場合の学習順序

こんばんは。
もしこの5つを何年かかけて学ぶとした場合、この学習順序をどうおもいますか?

ちなみにこの5つの言語は、linuxなどのOSやオープンソースソフトウェアの開発に携わってい
る方たち(ハッカーの方たち)が、OSや言語開発をするなら学ぶべき言語として主張していまし
た。(クラッカーではなくハッカーです)

この方たちがいうには pythonをはじめに学習し、次にjava
それからC/C++, Perl, LISP、アセンブラの順番が良いと言っていました。

(略)

さらに、visualbasicやC#などはやめた方が良い。と主張しています。↓

ウィンドウズの下でハッキングを学ぶのを、拘束衣を着て踊りを学ぶのに例えたのは、あれは冗
談じゃないんですよ。

Visual Basic や C# にはそれぞれ個別に問題があります。その大きなものは、移植性がないこ
とです。マイクロソフトの独占言語だというだけで、もうすでに失格ですし、ほかの Basic と
同じく言語としての設計もまずく、悪いプログラミングの習慣が身についてしまいます。

VBといってもバージョンによって違うとは思いますが、 プロプラで移植性がないということを脇に置いといて 言語そのもの、設計の問題というとどういったものがあるんでしょうか? あ、C#もか。

■_ 起源とか


C言語なら俺に聞け(入門編)Part 59 
689 デフォルトの名無しさん [] 2010/01/25(月) 23:04:45 ID: Be:
    うん、最初の最初で「Hello Work」をprintするときに
    #include の説明してたら躓くだろうな。

    いや「『こんにちは、世界』ってどういう意味だろう」ということにすら
    疑問を持つ初心者もいるかもしれない(悪いことではないが...) 

690 デフォルトの名無しさん [sage] 2010/01/25(月) 23:07:28 ID: Be:
    ハローワーク 

691 デフォルトの名無しさん [sage] 2010/01/26(火) 00:19:15 ID: Be:
    >>689
    世界初の原潜が処女航海で打電したメッセージだとか。 

史上初の原子力潜水艦 (USS Nautilus) がその処女航海で打電したというのは “Underway on nuclear power”(本艦、原子力にて潜航中) じゃなかろうか。


Lisp Scheme Part29 
216 デフォルトの名無しさん [sage] 2010/01/26(火) 15:04:54 ID: Be:
    興味のある言語にLispと書いておいたら面接で爆笑された
    http://anond.hatelabo.jp/20100125020240

    面接で興味ある言語にLispて言ったらそりゃ爆笑されます
    http://blog.pasonatech.co.jp/ootani/299/12577.html

    なんで爆笑なんだ? 

217 デフォルトの名無しさん [sage] 2010/01/26(火) 15:10:42 ID: Be:
    ここは釣堀紹介所じゃないですよ 


229 デフォルトの名無しさん [sage] 2010/01/26(火) 19:31:11 ID: Be:
    >>216
    そりゃ、ソフトウェアエンジニアになろうか(それも転職)と言う奴が「Lispに興味が有ります」なんて言ってちゃダメダメだろう。

    Lispは習得していて当然、なおかつ習得している事を周りに秘密にして置くのも当然の言語だw 

230 デフォルトの名無しさん [sage] 2010/01/26(火) 19:33:00 ID: Be:
    www 

231 デフォルトの名無しさん [sage] 2010/01/26(火) 19:59:31 ID: Be:
    javaやoracleが使えます、とアピールして入社できる会社はブラック 

232 222 [sage] 2010/01/26(火) 19:59:34 ID: Be:
    >>223
    俺一回しか投稿してないんだけど・・・ 

233 デフォルトの名無しさん [sage] 2010/01/26(火) 20:00:43 ID: Be:
    >>231
    前に勉強会の懇親会でスカウトしてきた奴がいたんだけど、
    Javaはおわかりになりますか?と聞かれたんでスカウト断った。 

Lispは習得していて当然、なおかつ習得している事を周りに秘密にして置くのも当然の言語 こえー。

こっちはちょっと前のですが。


最も美しいプログラミング言語は? Part5 

7 デフォルトの名無しさん [sage] Date:2010/01/06(水) 13:17:43  ID: Be:
    前スレの続きCの美って話だけど、それらをサッカーにあてはめると

    Haskell ->オランダ 機能美
    Lisp ->ブラジル    自由自在の美
    C ->ドイツ         質実剛健美

8 デフォルトの名無しさん [sage] Date:2010/01/06(水) 13:47:56  ID: Be:
    GHC
    モジュール表現が今ひとつだが、並列(平行)処理をこれくらい
    単純化できればたいしたもの。

9 デフォルトの名無しさん [sage] Date:2010/01/06(水) 15:06:06  ID: Be:
    pythonと言ってみるテスト 

10 デフォルトの名無しさん [sage] Date:2010/01/06(水) 16:46:19  ID: Be:
    Haskellがドイツな気がする。 

11 デフォルトの名無しさん [] Date:2010/01/06(水) 21:24:25  ID: Be:
    perlでないことは確か。 

C++ とか Java あたりはどうなるんだろう?

■_How To Write Unmaintainable Code

命名編の続き。

How To Write Unmaintainable Code

      Bedazzling Names (幻惑する名前)
      Choose variable names with irrelevant emotional connotation. e.g.:
            marypoppins = (superman + starship) / god;
      This confuses the reader because they have difficulty disassociating the emotional
      connotations of the words from the logic they're trying to think about.

      marypoppins = (superman + starship) / god;
      のような irrelevant emotional connotation を持った変数名を選択しましょう。
      これは読み手を混乱させます。なぜなら、読み手はその単語の感情的な connotations
      (内包、含蓄) を自分たちが考えようとしているロジックから切り離すことが困難だからです。

      Rename and Reuse (改名と再利用)
      This trick works especially well in Ada, a language immune to many of the standard
      obfuscation techniques. The people who originally named all the objects and packages
      you use were morons. Rather than try to convince them to change, just use renames and
      subtypes to rename everything to names of your own devising. Make sure to leave a few
      references to the old names in, as a trap for the unwary.

      このトリックはとくに Ada のような、標準的な難読化技法 (standard obfuscation techniques)
      の多くに対して抵抗力を持っている言語で効果的に働きます。もともとの名前がついているオブジ
      ェクトすべてとあなたがこのトリックを使ったパッケージを利用する人はみな揃って間抜け
      (morons) です。全てを変更し尽くすそうとするのではなく、your own devising な名前に改名する
       のにただ単純にリネームとサブタイプを使いましょう。幾つかの古い名前に対する参照は用心に対
      する罠として残しておきましょう。


      When To Use i (iを使うとき)
      Never use i for the innermost loop variable. Use anything but. Use i liberally 
      for any other purpose especially for non-int variables. Similarly use n as a loop 
      index.

      i を決して一番深いところにあるループのために使ってはいけません。これ以外のものを
      使いましょう。i は自由に、特に int でない変数のためのループ制御以外の目的に使いま
      す。n をループのインデックスに使うことも同様です。

      Conventions Schmentions (規約の Schmentions)
      Ignore the Sun Java Coding Conventions, after all, Sun does. Fortunately, the compiler
      won't tattle when you violate them. The goal is to come up with names that differ
      subtlely only in case. If you are forced to use the capitalisation conventions, you can
      still subvert wherever the choice is ambigous, e.g. use both inputFilename and
      inputfileName. Invent your own hopelessly complex naming conventions, then berate 
      everyone else for not following them.

      Sun の Java Coding Conventions、つまりは Sun のやっていることをすべて無視します。
      幸いにも、あなたが規約を破ってしまったときにもコンパイラーが tattle (告げ口、密告)
      することはありません。その目的は大小文字の違いだけがある名前を使うためです。
      capitalisation の規約を強制されていたとしても、曖昧な選択ができるところでは常に
      subvent (腐敗、堕落) させることができます。たとえば inputFilename と inputfileName
      の両方を使うといったものです。あなた自身の絶望的なまでに複雑な命名規約を発明して
      それに従わない人たち全員を問い詰めましょう。

      Lower Case l Looks a Lot Like the Digit 1
      Use lower case l to indicate long constants. e.g. 10l is more likely to be mistaken
      for 101 that 10L is. Ban any fonts that clearly disambiguate uvw wW gq9 2z 5s 
      il17|!j oO08 `'" ;,. m nn rn {[()]}. Be creative.

      long の定数を表すために小文字の l を使いましょう。たとえば、10l と書いた場合、それは
      10L と書いた場合よりもずっと 101 と間違えやすくなります。
      uvw wW gq9 2z 5s  il17|!j oO08 `'" ;,. m nn rn {[()]} といったものをくっきりはっ
      きり表示できるようなフォントはすべて ban してしまいましょう。クリエイティブであれ。

      Reuse of Global Names as Private (グローバルな名前を局所的なものとして再利用する)
      Declare a global array in module A, and a private one of the same name in the
      header file for module B, so that it appears that it's the global array you are
      using in module B, but it isn't. Make no reference in the comments to this
      duplication.

      モジュール A のなかでグローバル配列を宣言します。そして、同じ名前を持ったプライベートな
      配列をモジュール B のためのヘッダーファイルで宣言します。それによりモジュール B で使って
      いるものもグローバル配列のように見えても実は違うということになります。この重複についての
      コメントは残しません。

      Recycling Revisited (リサイクル再び)
      Use scoping as confusingly as possible by recycling variable names in contradictory
      ways. For example, suppose you have global variables A and B, and functions foo and
      bar. If you know that variable A will be regularly passed to foo and B to bar, make
      sure to define the functions as function foo(B) and function bar(A) so that inside
      the functions A will always be referred to as B and vice versa. With more functions
      and globals, you can create vast confusing webs of mutually contradictory uses of
      the same names.
 
      矛盾した方法 (contradictory way) で変数の名前を再利用することによって、可能な限り混乱を
      招くようにスコープを活用しましょう。たとえばグローバル変数としてA と B、関数として foo
      と bar があったとします。もし変数 A が通常は foo へ渡されていて、また B が barへ渡される
      ということがわかっているのなら、関数 A の内部では常にB として参照されたり、その逆方向で
      あるような関数 foo(B) と関数 bar(A) 忘れずに定義します。より多くの関数やグローバル変数を
      使うことで、あなたは同一名称の持った互いに相容れない用途を持った vast confusing webs を
      作成できます。


      Recycle Your Variables (変数を再利用する)
      Wherever scope rules permit, reuse existing unrelated variable names. Similarly, 
      use the same temporary variable for two unrelated purposes (purporting to save stack 
      slots). For a fiendish variant, morph the variable, for example, assign a value to a 
      variable at the top of a very long method, and then somewhere in the middle, change 
      the meaning of the variable in a subtle way, such as converting it from a 0-based 
      coordinate to a 1-based coordinate. Be certain not to document this change in meaning.

      スコープ規則が許す所であれば、どこであっても関係のない既存の変数名を再利用しましょう。
      同様に、(スタック領域の節約を目論んで) 同一の一時変数を二つの無関係な目的のために使用し
      ましょう。fiendish な変種として、たとえば非常に長いメソッドの先頭付近で変数に値を代入し
      ておいてから、メソッドの中間辺りで 0-based coordinate から 1-based coordinate に変更す
      るようなわかりづらいやり方で変数の意味を変更してしまうというものがあります。この変更の
      意味するところもドキュメントには記載しないようにしましょう。


      Cd wrttn wtht vwls s mch trsr
      When using abbreviations inside variable or method names, break the boredom with 
      several variants for the same word, and even spell it out longhand once in while.
      This helps defeat those lazy bums who use text search to understand only some aspect
      of your program. Consider variant spellings as a variant on the ploy, e.g. mixing 
      International colour, with American color and dude-speak kulerz. If you spell out 
      names in full, there is only one possible way to spell each name. These are too easy 
      for the maintenance programmer to remember. Because there are so many different ways 
      to abbreviate a word, with abbreviations, you can have several different variables 
      that all have the same apparent purpose. As an added bonus, the maintenance programmer 
      might not even notice they are separate variables.

      変数やメソッドの名前で短縮形 (abbreviations) を使う場合に、同一の単語に対して複数のバリ
      エーション (several variants) を使ったり、一度は省略せずに (longhand) 通常通りに書いた
      りして break the boredom (退屈しのぎ?) しましょう。こうすることで、あなたのプログラムの
      一部の概略だけ理解するためにテキストサーチを使う lazy bums (うすのろ?) を defeat (困らせる、
      挫折させる) 手助けになります。variant on the ploy (ploy→策略) としてのスペルのバリエーシ
      ョン (variant spellings) を考慮しましょう。たとえば International な書き方の colour に対
      してアメリカ式の color や dude-speak の kulerz を混ぜるといった具合です。名前を省略せずに
      書いてしまうと、それぞれの名前に対してたった一つの possible way しかありません。そうしてし
      まうとメンテナンスプログラマーも思い出すのがとても簡単になってしまいます。ある単語を省略形
      にする (abbreviate) は多くの違ったやり方があるので、省略を行うことですべてが同じ目的をもっ
      ているように見える複数の実体が異なる変数を持つことが可能です。この手法のボーナスとして、メ
      ンテナンスプログラマーが別の名前の変数を見落としてしまう可能性があります。

      Misleading names 誤解を招く名前
      Make sure that every method does a little bit more (or less) than its name suggests.
      As a simple example, a method named isValid(x) should as a side effect convert x to
      binary and store the result in a database.

      すべてのメソッドで、その名前が suggest するよりもほんのちょっとだけ余計なことをしたり、
      逆に何かをしなかったりするようにしましょう。単純な例としては、その副作用として x をバ
      イナリに変換してデータベースに変換結果を格納する isVaild(x)という名前がつけられたメソ
      ッドです。

      m_
      a naming convention from the world of C++ is the use of "m_" in front 
      of members. This is supposed to help you tell them apart from methods, so long as
      you forget that "method" also starts with the letter "m".

      C++の世界から持ち込まれた命名規則に "m_" をメンバー名の前に置くというものがあります。
      これはメンバー変数とメソッドとを区別するのを容易にするという目論見があるのですが、
      それがメソッドだということをあなたが忘れてしまったかのように (メソッドであるにも関
      わらず) "m" で始まる名前にしてしまいましょう

      o_apple obj_apple
      Use an "o" or "obj" prefix for each instance of the class to show
      that you're thinking of the big, polymorphic picture.

      クラスのインスタンス毎に "o" や "obj" といった prefix を使いましょう。
      polymorphic picture のためにあなたが大きいと思うものを明確にします。

■_ 本日の巡回から

■_ いろいろ

reddit でなんか伸びてたやつ。


Going back to C : programming

When I was 12 someone gave me a Metrowerks IDE to learn programming on my mac. I 
learned a lot with it, and got programming in C. I never really wrote a large program 
in it, only things like ROM hacks that extracted levels and models from snes/psx games 
I liked. Later, I got a windows PC and messed around with MFC in C++. That was the end 
for me, programming UI's was too much work in C++ and I couldn't handle the 
encyclopedic knowledge needed to program the Microsoft framework.

Later, I learned Java, which was also the language most commonly in my college. Making 
UI's was a blast with it, I could factorize anything and really loved making as 
generic code as possible with it, even for small projects. Everything I made was made 
in Java.

(略)

And now, I am seriously wondering where I have been all this time. Sure, I still think 
C is incredibly clunky. But now I got the dust off of my old course on writing 
compilers (Modern compiler implementation in C), and I want to write a compiler in C 
for a small programming language. I want to get down to earth again, and write things 
that are efficient and just run very quickly. I want to write lots and lots of code 
and know exactly what every line does.

Has anyone else had this feeling, this evolution? Am I going mad? Do you think C will 
last, and there are intersting jobs left for pure C developers?

さっき見たら400を越えてた。 二、三日観察するとしよう。

2010年01月26日

■_

・これとか
【速報】 Google Readerであらゆるページを購読可能に ~ 自動RSSフィード生成機能が追加:in the looop:ITmedia オルタナティブ・ブログ
ここにアクセスしてくださる皆様の中にはこういうものを待っていた方もいらっしゃるのではないかとw

・ダムエー
ア・バオア・クーでのギレンの演説がちょっと違う。 特にこだわってないので多少の相違はスルーで。

■_ ぶろっくさいこー

F-Scriptって面白そうだなあ。まあ、Mac使ってないわたしには意味ないけども。


Beyond Blocks ≪ Fun Script

Beyond Blocks

November 17, 2009 by Philippe Mougin

Blocks (aka lambda expressions or closures) are versatile and powerful. I like them. I 
have even implemented a programming language in which they play a central role.

ブロック(ラムダ式やクロージャとも)は多用途でありかつ強力なものです。わたしはこれが好き
で、ブロックが中心的な役目を果たしているプログラミング言語の実装すらしたことがあります。

However, for a number of common programming situations, I think that some alternative 
approaches based on higher order messaging provide better solutions than classic 
block-based approaches. Marcel Weiher provides a good example in Blocked-C. He shows 
some Objective-C code that uses a block to iterate over a collection of strings and to 
create a new collection with some suffix added to the original strings:

しかしながら一般的なプログラミングのシチュエーションでは、higher order messaging に基
づいたなんらかの alternative なアプローチの方が古典的なブロックベースのアプローチより
もより良い solutions を提供しているとわたしは考えています。Marcel Weiher は Blocked-C 
で良い例を出しています。彼は、文字列のコレクションを iterate over してさらに元の文字列
になんらかの suffix を加えた文字列で新しいコレクションを作成するのにブロックを使うよう
なちょっとした Objective-C コードを示しました。


 NSMutableArray *filteredItems = [NSMutableArray array];
 [items enumerateObjects WithOptions:0 withBlock:
    ^(id item, NSUInteger index, BOOL *stop) {
       [filteredItems addObject:[item stringByAppendingString:@"suffix"]];
    }
 ];

Then, he goes on to show how the same can be achieved using a higher order messaging 
(HOM) technique:

彼は続けて higher order messaging (HOM) 技法を使って同じように achieved できる方法を示
しました:

 [[items collect] stringByAppendingString:@"suffix"];

The conciseness and expressiveness of the HOM version is impressive and should at the 
very least warrant further examination. Regarding this, we are lucky since this 
approach, and its application to Objective-C, is described in an OOPSLA paper titled 
"Higher Order Messaging" (download).

HOM 版の conciseness と expressiveness は impressive であり、
and should at the very least warrant further examination. 
これに関して、わたしたちには幸運なことにこのアプローチとその Objective-C での応用が
"Higher Order Messaging" (download)というタイトルの OOPSLA の論文で説明され
ています

With some support in the programming language, higher order messaging techniques can 
go even further. F-Script is a Smalltalk dialect for Cocoa which extends Smalltalk 
with array programming and messaging patterns. Messaging pattern is a generalization 
of message sending that applies to entire collections of objects. In a number of 
common situations, this provides an interesting alternative to the classic block-based 
approach. Indeed, here is our example coded in F-Script:

プログラミング言語で多少のサポートをすることによって、 higher order messaging 技法は
can go even further. F-Script は、Smalltalkを array プログラミングやメッセージパターン
(messaging patterns) によって拡張した Cocoa 向けの Smalltalk の dialect (方言)です。メ
ッセージパターンとはオブジェクトのコレクション全体に対して(メッセージを)適用する類のメ
ッセージセンディングの一般化 (generaization) です。一般的なシチュエーションの多くで、
この手法は伝統的なブロックベースのアプローチに対する興味深い alternative を提供します。
Indeed, here is our example coded in F-Script:

 items stringByAppendingString:'suffix'.

A key aspect of this programming model (and of Weiher's HOM) is that it liberates us 
from the classic "one object at a time" style, and lets us manipulate whole 
collections of objects at once, using higher level constructs. We are freed from the 
low level details of accessing and dealing with individual elements. In my experience, 
introducing array programming in object-oriented programming, as F-Script does, has 
positive effects similar to those of the introduction of vectors in math, which is 
quite nice… This model is described in another OOPSLA paper titled "OOPAL: 
Integrating Array Programming in Object-Oriented Programming" (download)

このプログラミングモデル(とWeiher の HOM)の key aspect とは伝統的な "one object 
at a time" (一度に一つのオブジェクト)スタイルからわたしたちを解放して、よりレベル
の高い構造 (higer level constructs)を使って一度にコレクションを丸ごと操作させるように
するものです。わたしたちはコレクションに対するアクセスの低レベルな詳細や個々の要素に対
する扱いから自由になりました。わたしの経験では、F-Script が行ったようにオブジェクト指
向プログラミングに array プログラミングを導入することで数学において行列 (vectors) を導
入したのと同じような positive effects がありました。 which is quite nice… 
このモデルは
"OOPAL: Integrating Array Programming in Object-Oriented Programming"
というタイトルの別の OOPSLA の論文に詳細があります。
 (download)


To get a better sense of this programming model, let's see how it stacks up against 
classic block based approaches for collections manipulation as seen in Ruby and 
Smalltalk. For the same price, I also add Python's list comprehensions and C# Linq to 
the mix. In some common situations, those are interesting alternatives to blocks that 
are still representative of the "one object at a time" approach.

このプログラミングモデルのよりよい sense を得るには、Ruby や Smalltalk で見られるよう
なコレクション操作における伝統的なブロックベースのアプローチに対してどのように stacks 
up するかを見ましょう。
For the same price, 
Python の list comprehensions と C# の Linq も一緒にしました。よくあるシチュエーション
の一部についてこれらはブロックに対する interesting な aliternatives になります。
that are still representative of the 
"one object at a time" (一度にオブジェクト一個) アプローチ


In the example below, we have a list of songs (a collection of Song objects) and we 
want to get their names. Here is how we'd do it using various approaches:

これからに挙げる例では、歌のリスト (Song オブジェクトのコレクション)があって、そこから
歌の題名を取り出そうとしています。ここでは以下のように様々なアプローチを使っています。

    * Smalltalk and Ruby with blocks
    * Python with list comprehension
    * C# with Linq
    * F-Script with array programming

Smalltalk 	songs collect:[:aSong| aSong name]
Ruby 		songs.collect {|aSong| aSong.name}
Python 		[aSong.name() for aSong in songs]
C# 		from aSong in songs select aSong.name()
F-Script 	songs name

We can note that the array programming version (F-Script) is free from syntactic noise 
and low-level iteration logic, as is the brain of the programmer. Actually, in that 
particular situation, it seems hard to do better.

F-Script の array プログラミングバージョンではプログラマーが脳内で描くかのごとく、構文
的なノイズ (syntactic noise) や低水準なイテレショーンロジックから解放されていることに
気がつくかもしれません。
Actually, in that particular situation, it seems hard to do better.

We can carry on the comparison further by introducing some need for filtering. In the 
following example, we want to get the names of songs with a bit rate greater than or 
equal to 256 kb/s.

ちょっとしたフィルタリングが必要となるような例を使ってさらに比較を続けます。
次の例ではビットレートが 256 kb/s 以上の歌の題名だけを取得しようとしています。


Smalltalk 	(songs select:[:aSong| aSong bitRate >= 256]) collect:[:aSong| aSong name]

Ruby 		songs.select {|aSong| aSong.bitRate >= 256}.collect {|aSong| aSong.name}

Python 		[aSong.name() for aSong in songs if aSong.bitRate() >= 256]

C# 		from aSong in songs select aSong.name() where aSong.bitRate() >= 256

F-Script 	songs name where: songs bitRate >= 256

We see that the F-Script programming model allows for conciseness and expressiveness. 
Note that, in F-Script, where: is not a keyword or a special construct. It is just a 
regular message selector. The where: method, defined in a category of NSArray, takes 
an array of booleans as argument and returns the elements of the receiver whose 
positional matching element in this boolean array is true. Such boolean array is 
exactly what is produced by the expression songs bitRate >= 256, as messages are 
automatically broadcasted to each individual elements of the receivers (i.e., the 
bitRate message is sent to each element of the songs array, producing an array of 
numbers whose elements are then sent the >= 256 message, producing the array of 
booleans). This is the powerful compression operation of array programming adapted to 
object-oriented programming.

わたしたちはF-Script のプログラミングモデルが conciseness (統一性) と expressiveness 
(表現力)をもたらすことを発見しました。F-Script では where: はキーワードでもなく 
special construct でもなく、単なる通常のメッセージセレクター (regular message selector) 
であることに注意してください。where: は NSArray のカテゴリで定義されているメソッドで、
引数として booleans (ブール値)の配列を受け取りboolean の配列で真になっている要素に対応
する位置にある要素から構成されるレシーバーの要素群を返します。この boolean 配列は レシ
ーバーの個々の独立した要素に対してメッセージであるかのように自動的に broladcast された
songs bitRate >= 256 という式から生成されたものです。(i.e., bitRate メッセージが 
songs array の各要素に送られてあとで >= 256 メッセージが送られる数値の配列を生成し、
さらに booleans の配列を生成します)。これはオブジェクト指向プログラミングに対して適用
されたarray プログラミングの強力な compression operation です。

Finally, here is an example of sorting a collection of objects. In this example, we 
want to create a sorted collection of our songs, sorting on the songs' names. In the 
case of Python, since its list comprehensions don't have specific support for sorting, 
we use a solution based on lambda expressions.

最後の例はオブジェクトのコレクションのソートです。この例では、 歌の名前でソートした歌
のソート済みコレクションを生成します。Python では list comprehensions に対するソートの
サポートがないのでlambda 式に基づく solution を使います。


Smalltalk 	songs asSortedCollection:[:song1 :song2| song1 name < song2 name]

Ruby 		songs.sort_by {|aSong| aSong.name}

Python 		sorted(songs, key=lambda aSong: aSong name)

C# 		from aSong in songs orderby aSong.name() select aSong

F-Script 	songs at: songs name sort

As in the previous examples, the F-Script version shows that we can do sophisticated 
collection manipulation without relying on blocks but only using message passing. The 
result of the sort message sent to the array of song names is an array of integers 
containing the indices that will arrange the receiver of sort in ascending order. We 
then pass this array of indices to the at: method. The at: method allows for indexing 
an array by either a single integer or a whole array of indices. This is this latter 
capability, a fundamental element of array programming, that we use here to produce 
our sorted list of songs.

前述した例のように、F-Script版はブロックに頼らずに message passing だけを使って
sophisticated されたコレクションの操作を行えることを示しています。歌の題名の配列に対し
て sort メッセージを送った結果はsort によって昇順 (ascending order) に並び替えられたで
あろう添え字から構成される整数の配列です。その後で添え字の配列を at: メソッドに渡しま
す。at: メソッドは配列の添え字付けが単一の整数であっても添え字の配列丸ごとであっても受
け付けます。
This is this latter capability, 
わたしたちが歌のソート済みリストを生成するためにここで使用した
array プログラミングの根幹を成す要素です。

Conclusion 結論

Blocks are great, especially in programming languages which don't have (and don't want) 
specific syntax for classic control structures (if/then/else, while, etc.). However, 
we should take them with a grain of salt and see that, for some common problems, there 
are alternative approaches that are worth considering.

ブロックは (if/then/else, while などの) 伝統的な制御構造を持っていないプログラミング言
語において特に great です。しかしながら、わたしたちはこれを grain of salt で扱い、見る
べきでしょう。一部の一般的な問題については考慮する価値のある別のやり方が存在しているの
です。

Further reading (あわせて読みたい)

F-Script documentation set

Blocked-C II

Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its 
Algebra of Programs

Special bonus

You can easily, and interactively, experiment with the code provided in the examples: 
launch F-Script.app, connect to iTunes and immediately start querying and manipulating 
your iTunes song collection from F-Script.

例で挙げられているコードで簡単かつ対話的に体験できます:F-Script.app を起動して iTunes 
に接続したら、F-Scirpt からあなたの iTunes song collention に対する問い合わせや操作が
即座に行えます。

You connect to iTunes using the standard Cocoa Scripting Bridge technology. For 
example, you can enter the following code in the F-Script console:

standard Cocoa Scripting Bridge technology を使うために iTunes にコネクトします。
たとえば F-Script コンソールに次のようなコードが入力できます:

iTunes := SBApplication applicationWithBundleIdentifier:'com.apple.iTunes'

The iTunes variable now points to a dynamically generated Cocoa object that stands for 
the iTunes application.

iTunes という変数はこれを実行したことでiTunes アプリケーションを表すために動的に生成さ
れた Cocoa オブジェクトを指し示します。

You can get at your songs with:

 songs := ((iTunes sources at:0) playlists at:1) tracks

You can then directly paste, in the console, the code of the examples provided in this 
article. If your song library is huge you might notice some latency, as Cocoa messages 
are automatically converted to Apple Events that flow back and forth between F-Script 
and iTunes.

そうすると、この article にあった例のコードをコンソールに直接ペーストできるようになり
ます。

Cocoa のメッセージは自動的に Apple Event に変換されるのでF-SCirptとiTunes との間でやり
取りが発生し、あなたの持っているライブラリが大きなものであればちょっとした latency を
感じるかもしれません。

■_ C++ for Haskell programmers?

うーむいまいちうまいことできん喃。

AskHaskell: C++ for Haskell programmers? : haskell

I'm trying to (re)learn C++ (the job market for Haskell programmers being pretty 
limited). However, 3 years of Haskell completely changed my habits and general view of 
programming. So my question is, is there a C++ book/text/tutorial/whatever aimed 
and/or well-suited for Haskell (or just functional) programmers? Lists of pitfalls, 
and ways to adapt functional designs to C++ are also welcome.

わたしは C++ の(再)学習をしようと思っています (Haskellプログラマーの job market はとて
も限られているので)。しかし、Haskell を 3年使っていたことでプログラミングに対するわた
しの習慣だとか視点 (general view) というものがまるっきり変わってしまいました。そこで質
問なのですが、Haskell プログラマー (もしくは単に関数型言語プログラマー) 向けの C++ の
book/text/tutorial/whatever はないでしょうか? 落とし穴 (pitfalls) のリストだとか C++
を使った関数型設計 (functional desings) の適用の方法なども歓迎します。


I've found the biggest change in my C/C++ habits as a result of learning Haskell is 
that I've become preternaturally aware of all the possible ways code could go wrong. 
RAII is a great C++ technique for managing any resource robustly, even in the face of 
exceptions. I find myself writing tons of RAII classes.

わたしがHaskellを学んだことによるわたし自身の C/C++ に関する習慣の最大の変化は、誤動作
をする可能性のあるコードのすべてを異常なほど気にするようになったということです。RAII 
は、たとえ例外に直面した場合であってもすべてのリソースを頑健に (robustly) 管理するため
の偉大な C++ のテクニックです。RAII クラスを山ほど書いてわたしはそれに気がつきました。

I don't think it's particularly elegant to write functional-style programs at the 
lowest level in C++. Let your functional insight drive the overall design of your 
program, but for the actual implementation of a function I find C or C+ is much more 
elegant when you use a little mutable state and a loop or two. (Alternatively, you'll 
wander for fourty years in the function template jungle. This might change when C++0x 
lambdas become more common.)

C++ の lowest level において関数スタイルのプログラムを書くことはとりたててエレガントな
ものだとはわたしは思いません。あなたの関数プログラミングスタイルの見識はあなたのプログ
ラムの設計全体を drive しているでしょう。but わたしが見出した C や C++ での関数スタイ
ルによる実際の実装は少数の可変ステート (mutable state) と一つか二つのループを使ってい
る場合にはずっとエレガントになります。
(Alternatively, you'll wander for fourty years in the function template jungle.
This might change when C++0x lambdas become more common.)


STL and Boost allow you to write C++ in a functional style, albeit with a lot more 
syntax. Doing a bit of searching led me to this which may be a good starting point:

STLとBoostは、あなたがC++を使って関数型のスタイルでプログラムを書くことを
可能にします。

http://www.keithschwarz.com/cs106l/spring2009/handouts/280_STL_Functional_Library.pdf


Effective C++ is pretty good if you have a basic understanding of the language already. 
It's essentially a big list of language pitfalls and how to avoid them.

もしあなたが C++の基本的なところをすでに理解しているのであればEffecive C++ がとてもよ
いです。これは C++という言語の落とし穴の essentially a big list であり、また、それを
避けるためのハウツー集でもあります。

I go back and forth between the two a lot. If you try to write Haskell-style code in 
C++ you will encounter pain (much like you will in the reverse, though that is 
probably more obvious to you). So don't think about it terms of adapting functional 
designs to C++ (you wouldn't approach adapting a C++ program to Haskell by using a 
bunch of IORefs, right?), but rather that the languages are very different and that to 
work effectively in C++ you must use C++-like designs (typically state-carrying 
objects).


Actually, by the word "adapting", I meant including changes because of the 
obvious difference of the underlying languages. I don't mind state-carrying objects. 
However, I don't think we have to discard everything we learned with Haskell; quite 
the opposite. To have a concrete example, let's suppose I have to write a parser in 
C++. I think I would rather encounter some pain writing something Parsec-style than 
use lex/yacc...

Actually, by the word "adapting",
I meant including changes
because of the obvious difference of the
underlying languages の明白な違い
わたしは state-carrying オブジェクトを気にはしませんが、わたしたちが Haskell を学ぶこ
とで、それまでの何もかもを捨て去らなければならなくなるとは考えていません。むしろその反
対です。より具体的には、たとえばわたしが C++ でパーザーを書かなければならない状況だと
仮定すると、lex と yacc を使った場合よりもなにかしらの Parsec スタイルで書くことのほう
が苦痛に遭遇することが多いと思います。


If you want to do combinator libraries in C++ the best way to do it is via expression 
templates like boost spirit (which is a combinator parser framework). Nowadays 
boost.proto is framework for defining EDSLs in C++. The fact that you wasn't aware of 
overloading the function call operator says to me you might have a painful climb.

もしあなたが C++ で combinator libraries を行いたいのなら、それをするための最良の方法
とは boost spirt のような expression templatesを経由することです(boost sprit は 
combinator parser のフレームワークです)。最近では boost.proto がC ++ における EDSL の
定義のためのフレームワークです。
関数呼び出し演算子のオーバーロードを aware しなかったという事実は
says to me you might have a painful climb.

■_ 本日の巡回から

2010年01月25日

■_

すげーw 2000個オーバーのコメントとか初めて見た How many of you have ever seen an actual floppy disk? : programming

・黒ニャー本買った
とりあえず、あとがきとかまえがきとかを読んだ。 「オーバフロー」に微妙に引っかかるものを感じるけどまあいいや。 「無名関数」だし。

■_ で

Clojure 絡みで


【Lisp】プログラミング言語 Clojure【JVM】 

97 デフォルトの名無しさん [sage] 2010/01/24(日) 08:40:40 ID: Be:
    どうせおれなんて献本なんて貰ったことねーよorz 

98 デフォルトの名無しさん [sage] 2010/01/24(日) 10:06:45 ID: Be:
    >>97
    何かを手に入れたい、何かを目標にがんばろう、と思ってがんばっても、
    それに手が届くところまで来れたときには、すでに必要なくなっている、
    って良くあるよね。
    俺の人生はすべてそうだった。 

99 デフォルトの名無しさん [sage] 2010/01/24(日) 10:11:35 ID: Be:
    >>98
    俺もプログラマカッコイイと思ってプログラマになったが、今はやめたくて仕方が無い。 

100 デフォルトの名無しさん [sage] 2010/01/24(日) 10:29:44 ID: Be:
    献本もらってるのはレビューとかに参加した人達じゃね?
    バイト代みたいなもんでそ。 

101 デフォルトの名無しさん [sage] 2010/01/24(日) 11:28:25 ID: Be:
    出版された本の誤植を報告しておくと次に別のレビューに誘われるかもよ
    あとは、書評の人として有名になってたりすると献本が送り付けられてくるかも 

102 デフォルトの名無しさん [sage] 2010/01/24(日) 12:31:18 ID: Be:
    ok、レビューに呼んでもらえるようにブログに書評を書くことからはじめるよ
    全然関係なくてもgaucheとかclojureとか書いてshiroさんに
    拾ってもらえるようにがんばる 

103 デフォルトの名無しさん [sage] 2010/01/24(日) 12:37:37 ID: Be:
    >>102
    あと批判とかもすんなよ。
    基本YESマン 

104 デフォルトの名無しさん [age] 2010/01/24(日) 14:04:04 ID: Be:
    >>102
    今なら、clojureの日本語情報があまりないから、海外の情報をいちはやく
    紹介してみたらいいかも? ただし、clojureのその他の本が出るのが早い
    次期になるとは思えない。
    オンラインでもオフラインでも良いが、勉強会を開くなどして目立っていけ。
    れと、yesマンになる必要はない。 

105 デフォルトの名無しさん [sage] 2010/01/24(日) 15:03:37 ID: Be:
    >>102
    レビュアーとしては、誤字脱字レベルじゃなくて、内容まで突っ込んだ話ができると重宝がられると思う
    用語が変だとか、想定される読者にはこういう言い方の方が通じやすいんじゃないか、とか
    書評の方だとやっぱり目立つ人が強い
    あの××が認めた、みたいな感じだとやっぱり評判になるし
    そういう意味では単純な yes マンよりは、良い悪いをきちんと言える人の方が信用されると思う 

この後もこの方向で妙に伸びたりしてるけど割愛。

■_ 巡回二日分

■_

なんだかとても眠いんだ。 パトラッシュ…

2010年01月24日

■_

・怪しげな集いに参加してきました

刺激を受けました。とても。

ささださんはいつ休みを取っているのか心配になった。 まあ大学の関係者はいろいろ忙しくなる時期なんだそうですが。

■_

How To Write Unmaintainable Code

How To Write Unmaintainable Code
メンテ不可能なコードの書き方

Ensure a job for life ;-)

Roedy Green

Canadian Mind Products

Introduction (はじめに)

   Never ascribe to malice, that which can be explained by incompetence.
   (無能で説明がつくことを陰謀のせいにしてはならない)

   - Napoleon

訳注:この言葉は「ハンロンの剃刀」(Hanlon's razor - Wikipedia, the free encyclopedia)
といわれるもので、ナポレオンではなく
Robert J. Hanlon
の言葉というのが本当のようです。
ref: 神は細部に宿り給う

In the interests of creating employment opportunities in the Java programming field, I
am passing on these tips from the masters on how to write code that is so difficult to
maintain, that the people who come after you will take years to make even the simplest
changes. Further, if you follow all these rules religiously, you will even guarantee
yourself a lifetime of employment, since no one but you has a hope in hell of
maintaining the code. Then again, if you followed all these rules religiously, even
you wouldn't be able to maintain the code!

Javaプログラミングの分野での雇用機会の創出のために、わたしはメンテナンスを困難にするコ
ードの書き方についての単純極まる変更でさえもそれを行うのに何年も掛かってしまうような
tips を masters から授かりました。さらにこのルール全てにあなたが religiously に従えば
あなたは lifetime of employment を手に入れることになるでしょう。なぜなら、あなた以外の
誰であってもそのコードのメンテナンスをすることが絶望的だからです。そして繰り返しますが、
このルール全てにあなたが religiously に従えばあなた自身でさえもそのコードのメンテナン
スができなくなってしまうでしょう!

You don't want to overdo this. Your code should not look hopelessly unmaintainable,
just be that way. Otherwise it stands the risk of being rewritten or refactored.

あなたはこれをやりすぎることは望まないでしょう。あなたのコードは絶望的なほどメンテナ
ンス不可能 (hopelessly unmaintainable) なもののように見えるべきではありません。just be 
that way. さもなければ、書き直されたりリファクタリングされる危険が残るでしょう。

General Principles (汎用的な原則)

   Quidquid latine dictum sit, altum sonatur.
   - Whatever is said in Latin sounds profound.
     (ラテン語で言われたことは説得力ありげに聞こえる)

To foil the maintenance programmer, you have to understand how he thinks. He has your
giant program. He has no time to read it all, much less understand it. He wants to
rapidly find the place to make his change, make it and get out and have no unexpected
side effects from the change.

保守プログラマーを撃退するためには、彼がどのように思考するのかをあなたが理解する必要が
あります。彼はあなたの巨大プログラムを抱えています。彼にはそれを全部読む時間もないし、
理解する時間はもっとありません。彼は自分が行う変更の該当箇所をすばやく見つけて変更を
行って、それによって意図しない副作用が現れないことを望んでいています。

He views your code through a toilet paper tube. He can only see a tiny piece of your
program at a time. You want to make sure he can never get at the big picture from
doing that. You want to make it as hard as possible for him to find the code he is
looking for. But even more important, you want to make it as awkward as possible for
him to safely ignore anything.

彼はあなたのコードを toilet paper tube を通して見ています。彼はあなたのプログラムを、
一度にそのほんの一部 (tiny piece)しか見ることができません。あなたは彼が決して get at 
the big picture from doing that なことを望んでいます。あなたは彼が探そうとしているコー
ドを見つけ出すことが可能な限り困難になるようにすることを望んでいます。しかしさらに重要
なのは、彼が安全にすべてを無視するように仕向けるために可能な限り彼を awkward にしてし
まいたいとあなたが望んでいるということです。

Programmers are lulled into complacency by conventions. By every once in a while, by
subtly violating convention, you force him to read every line of your code with a
magnifying glass.

プログラマーたちは規約によって complacency に lulled されています。あなた時折意図的に
規約を破ることによってあなたのコードの一行ごとを拡大鏡を使って読むことを彼に強制します。

You might get the idea that every language feature makes code unmaintainable -- not so,
only if properly misused.

あなたは、適切に誤用したときにだけコードをメンテナンス不能にしてしまう言語機能のすべて
についてのアイデアを得られるかもしれません。

Naming (命名規則)

    "When I use a word," Humpty Dumpty said, in a rather scornful tone, 
    "it means just what I choose it to mean - neither more nor less."
    - Lewis Carroll -- Through the Looking Glass, Chapter 6

Much of the skill in writing unmaintainable code is the art of naming variables and 
methods. They don't matter at all to the compiler. That gives you huge latitude to use 
them to befuddle the maintenance programmer.

メンテ不能なコードを書くスキルの大半は 「the art of naming variables and methods」
(変数やメソッドの命名規則の技法) です。それに従ってつけられた名前はコンパイラーにはま
ったく意味がありません。それはあなたに対して、保守を行うプログラマーを混乱に陥れる
ためのとても大きな latitude (自由度) をもたらします。


      New Uses For Names For Baby
      Buy a copy of a baby naming book and you'll never be at a loss for variable names.
      Fred is a wonderful name, and easy to type. If you're looking for easy-to-type
      variable  names, try adsf or aoeu if you type with a DSK keyboard.

      赤ちゃんに名前をつけるための本を購入すれば変数の名前に困るようなこととはなくな
      ります。Fred というのはタイプしやすいのでとてもいい名前です。もしあなたがタイ
      プしやすい変数名を探していて、DSK キーボードでタイプしているのなら asdf や
      aoeu を試してみましょう。

      Single Letter Variable Names (一文字の変数名)
      If you call your variables a, b, c, then it will be impossible to search for
      instances of them using a simple text editor. Further, nobody will be able
      to guess what they are for. If anyone even hints at breaking the tradition
      honoured since FORTRAN of using i, j, and k for indexing variables, namely
      replacing them with ii, jj and kk, warn them about what the Spanish
      Inquisition did to heretics.

      もしあなたが変数の名前を a, b, c のようなものにしてしまったならテキストエデ
      ィターを単純に使ってそれらの変数が使われている場所を検索することは不可能に
      なるでしょう。さらに、それがどういった目的のためのものなのか推測できる人は
      いなくなるでしょう。もし誰かがFORTRAN 以来の、添え字変数に i, j, k を使うと
      いう tradition honoured を破る気配を見せるようななら、制御変数の名前を
      ii, jj, kk のようなものに変更してしまって Spanish Inquisition did to heretics
      を警告しましょう。


      Creative Miss-spelling
      If you must use descriptive variable and function names, misspell them. By misspelling
      in some function and variable names, and spelling it correctly in others (such as
      SetPintleOpening SetPintalClosing) we effectively negate the use of grep or IDE search
      techniques. It works amazingly well. Add an international flavor by spelling tory or
      tori in different theatres/theaters.

      もし変数や関数の名前を説明的 (descriptive)  なものにしなければならないのであれば
      (たとえば SetPintleOpening とか SetPintalClosing のような) 間違ったスペルにしてし
      まいましょう。一部の関数や変数でミススペルをし、そのほかのものは正しいスペリングを
      することによって、わたしたちは grep や IDE による検索の技法を効果的に negate できます。
      これは信じられないくらいうまくいきます。
      spelling tory や tori in different theatres/theaters によって、国際色を追加しましょう。

      Be Abstract (抽象的であれ)
      In naming functions and variables, make heavy use of abstract words like it,
      everything, data, handle, stuff, do, routine, perform and the digits  e.g.
      routineX48, PerformDataFunction, DoIt, HandleStuff and do_args_method.

      関数や変数の命名においては、data, handle, stuff, do, routine, perform といった
      抽象的な単語と数字を積極的に使います。つまり、routineX48、PerformDataFunction,
      DoIt, HandleStuff and do_args_method という名前にするのです。

      A.C.R.O.N.Y.M.S. (略語)
      Use acronyms to keep the code terse. Real men never define acronyms; they understand
      them genetically.

      コードを terse にし続けるために略語を使います。本物の男たちは略語を定義しません。
      彼らはそれらを genetically に理解するのです。

      Thesaurus Surrogatisation シソーラス
      To break the boredom, use a thesaurus to look up as much alternate vocabulary as 
      possible to refer to the same action, e.g. display, show, present. Vaguely hint
      there is some subtle difference, where none exists. However, if there are two
      similar functions that have a crucial difference, always use the same word in
      describing both functions (e.g. print to mean "write to a file",
      "put ink on paper" and "display on the screen"). Under no
      circumstances, succumb to demands to write a glossary with the special purpose
      project vocabulary unambiguously defined. Doing so would be an unprofessional breach
      of the structured design principle of information hiding.

      退屈さを打破するために、たとえば display, show, present のような、同じ動作を表すことが
      できる語彙を可能な限り見つけられるようにシソーラスを使いましょう。同義語が存在していな
      い場合でも、ほんのちょっとだけ違っているものがあるという漠然としたヒントになります。
      ただし、決定的な違いを持つ二つの似通った関数があった場合には、両方の関数を表すのに常に
      同じ単語を使うようにしましょう (e.g. print to mean "write to a file",
      "put ink on paper" and "display on the screen").
      どんな環境であっても、特別な目的をもったプロジェクトのためのあいまいなく定義されている
      語彙を収めた用語集を書くという要求に succumb (降伏、屈服?) します。
      Doing so would be an unprofessional breach of
      the structured design principle of information hiding.

      Use Plural Forms From Other Languages
      A VMS script kept track of the "statii" returned from various "Vaxen".
      Esperanto , Klingon and Hobbitese qualify as languages for these purposes. For
      pseudo-Esperanto pluraloj, add oj. You will be doing your part toward world peace.

      VMS スクリプトは様々な"Vaxen"から return された "statii"の記録を
      とっています。エスペラント語、クリンゴン語、ホビット語 といったものはこの目的に適した
      言語です。
      For pseudo-Esperanto pluraloj, add oj.
      You will be doing your part toward world peace.


      CapiTaliSaTion
      Randomly capitalize the first letter of a syllable in the middle of a word. For 
      example ComputeRasterHistoGram().

      ComputeRasterHistoGram() のように、単語の途中にあるシラブルの最初の文字をランダム
      に大文字にします。


      Reuse Names (名前の再利用)
      Wherever the rules of the language permit, give classes, constructors, methods, 
      member variables, parameters and local variables the same names. For extra points, 
      reuse local variable names inside {} blocks. The goal is to force the maintenance 
      programmer to carefully examine the scope of every instance. In particular, in Java, 
      make ordinary methods masquerade as constructors.

      言語の規則が許可しているときはいつでも、クラス、コンストラクター、メソッド、メンバ
      ー変数、パラメーター、ローカル変数に対して同じ名前をつけます。For extra points, 
      {] ブロックの中でローカル変数の名前を再利用します。その目的はメンテナンスプログラマ
      ーがすべてのインスタンスごとにスコープを注意深く検査することを強制させるためです。
      特にJavaにおいては普通のメソッドをコンストラクターに偽装します。

      Accented Letters アクセントつき文字
      Use accented characters on variable names. E.g.
            typedef struct { int i; } int;
      where the second int's i is actually i-acute. With only a simple text editor, it's
      nearly impossible to distinguish the slant of the accent mark.

      変数名にアクセントつきの文字を使いましょう。これはつまり
            typedef struct { int i; } int;
      というものがあったときに、二番目の int の i をアキュートつきのi(i-acute) にすると
      いったものです。シンプルなテキストエディターだけを使っていてはアクセント記号の傾き
      を区別することはほぼ不可能です。

      Exploit Compiler Name Length Limits (名前の長さに関するコンパイラーの限界を超える)
      If the compiler will only distinguish the first, say, 8 characters of names, then vary
      the endings e.g. var_unit_update() in one case and var_unit_setup() in another. The
      compiler will treat both as var_unit.

      コンパイラーがもし名前の最初の、たとえば 8文字だけしか区別していないのであれば、その
      後ろにいろいろつけてあるときには var_unit_update()を使い、別のときには var_unit_update()
      を使うようにします。コンパイラーはこれら二つを同じ var_unit として扱うでしょう。

      Underscore, a Friend Indeed
      Use _ and __ as identifiers.

      _ や __ を識別子として使いましょう。

      Mix Languages 言語を混ぜる
      Randomly intersperse two languages (human or computer). If your boss insists you 
      use his language, tell him you can organise your thoughts better in your own language, 
      or, if that does not work, allege linguistic discrimination and threaten to sue your 
      employers for a vast sum.

      二つの言語 (人間の言葉とコンピューターの言語)をランダムに混ぜ合わせます。もしあなたの
      上司が彼の言語を使うことを強制してきたら、自分の言語のほうが自分の考えを組み立てやすい
      と主張しましょう。
      or,
      if that does not work,
      allege linguistic discrimination
      and threaten to sue your employers for a vast sum.

      Extended ASCII 拡張ASCII
      Extended ASCII characters are perfectly valid as variable names, including ß, Ð, and
      ñ characters. They are almost impossible to type without copying/pasting in a simple
      text editor.

      ß, Ð,  ñ を含む拡張 ASCII のキャラクターは変数名として完全に正当なものです。これら
      のキャラクターは単純なテキストエディターではコピペすることなしに入力することはほぼ不
      可能です。


      Names From Other Languages 他の言語からの名前
      Use foreign language dictionaries as a source for variable names. For example, use
      the German punkt for point. Maintenance coders, without your firm grasp of German, 
      will enjoy the multicultural experience of deciphering the meaning.
 
      変数名のソースとして外国語の辞書を使いましょう。たとえば point を表すのにドイツ語の
      punkt を使います。without your firm grasp of German な Maintenance coderたちはその
      意味を解読するために複数文化を楽しむことになるでしょう。

      Names From Mathematics 数学分野からの名前
      Choose variable names that masquerade as mathematical operators, e.g.:

      数学の演算子であると偽るような変数名を選びます。

            openParen = (slash + asterix) / equals; 

命名編はまだ続きます。

■_ 疲れた

今日はこの辺で。

2010年01月23日

■_

・ふと思いついた
エヴァンゲリオンの「目標をセンターに~」な感じで ゼロの周りでテーラー展開 ゼロの周りでテーラー展開 ゼロの周りでテーラー展開… 面白くないな ○| ̄|_

・日経ソフトウエア
「動いて楽しいアルゴリズム!」という連載記事ですが、 今回は「素因数分解とRSA暗号」というサブタイトルでその手の話題を 扱ってるんですが、出だしの辺りで


この公開鍵暗号方式で有名なものに「RSA暗号」があります。RSA暗号では、内緒で選んだ二つの
素数から公開鍵と秘密鍵を作り、二つの素数の積を公開します。したがって、もしも二つの素数
の積を素因数分解できれば、暗号を解読されてしまいます。ただし、大きな素数の場合は、最新
のコンピューターを使っても、素因数分解は実用的な時間では終わりません。素因数分解を効率
的に行うアルゴリズムが、まだ見付かっていないからです。今回は、素因数分解とRSA暗号のア
ルゴリズムを説明します。

なんかひっかかるものを感じるんですが、見方がうがちすぎかなあ。 「一般的なRSA暗号は近い将来破られる」――768ビット素因数分解に成功:ニュース 「実用的な」という表現じゃ図りかねるところもあるし。 ただ、上記の引用とは別のところで「100桁以上の素数を使い~」といった感じの記述があるんですが

RSA暗号 - Wikipedia
素因数分解可能な範囲

2004年現在、インターネットで公募した数多くのPCを用いると512ビット程度の数なら素因数分
解できる。 したがって、現在では、RSA暗号に使用する法 n を1024-4096ビット(10進数で
300-1000桁程度)にすることが推奨されている。

しかしShamirは、RSA問題を解くための専用装置(TWIRL)を作成すれば、1024ビットの n に関す
るRSA問題ですら解くことができると主張している。

RSA社は「RSA Factoring Challenge」を1991年から2007年まで実施し、最新の計算機環境でどの
程度のビット数の整数が素因数分解可能かを調べた。

    * 1991.04.01 RSA-100 (330ビット)
    * 1992.04.14 RSA-110 (364ビット)
    * 1993.06.09 RSA-120 (397ビット)
    * 1994.04 RSA-129 (426ビット)
    * 1996.04.10 RSA-130 (430ビット)
    * 1999.02.02 RSA-140 (463ビット)
    * 2004 RSA-150 (496ビット)
    * 1999.08.22 RSA-155 (512ビット)
    * 2003.04.01 RSA-160 (530ビット)
    * 2009.12.29 RSA-170 (563ビット)
    * 2003.12.03 RSA-576 (576ビット,10進174桁)
    * yet RSA-180 (596ビット)
    * yet RSA-190 (629ビット)
    * 2005.11.02 RSA-640 (640ビット)
    * 2005.05.09 RSA-200 (663ビット,10進200桁)
    * yet RSA-210 (696ビット,10進210桁)
    * yet RSA-704 (704ビット)
    * 2009.12.12 RSA-768 (768ビット)

以下は未踏

    * RSA-896
    * RSA-1024
    * RSA-1536
    * RSA-2048

まあ、「実用時間で素因数分解可能」と「素因数分解可能」とか、 「最新のコンピューターを使って」と 「最新の計算機環境で」とは同じ前提ではないわけですが(たぶん)。 でも気になるっちゃあ気になる。

■_

一昨日の C言語なら俺に聞け(入門編)Part 59 の500からの標準偏差云々の話。 質問主のプログラムもダウンロードしてたのを回収しました。んで、 計算部分だけを抜き出すと

    for (i=0; i<num; i++) {
		total_eng             += student[i].eng;
		total2_eng           += pow(student[i].eng, 2.0);
		total_math           += student[i].math;
		total2_math         += pow(student[i].math, 2.0);
		total_jap              += student[i].jap;
		total2_jap            += pow(student[i].jap, 2.0);
		total_total           += student[i].total;
		total2_total         += pow(student[i].total, 2.0);
	}

	ave_eng   = total_eng / num;
	ave_math = total_math / num;
	ave_jap    = total_jap / num;
	ave_total = total_total / num;
	dev_eng   = sqrt(total2_eng / num - pow(ave_eng, 2.0));
	dev_math = sqrt(total2_math / num - pow(ave_math, 2.0));
	dev_jap    = sqrt(total2_jap / num - pow(ave_jap, 2.0));
	dev_total = sqrt(total2_total / num - pow(ave_total, 2.0));

こんな感じ。 で、動くようにしたという 510のプログラムが

	/* データを出力 */
	printf("\nId-No   Eng  Math   Jap   Total\n"
			"-----  ----  ----  ----   -----\n");
	for (i=0; i<num; i++) {
		student[i].total = student[i].eng+student[i].math+student[i].jap;
		printf("%5s   %3d   %3d   %3d     %3d\n", student[i].id, student[i].eng, student[i].math, student[i].jap, student[i].total);

		/*ついでに合計も求める*/
		total_eng             += student[i].eng;
		total_math           += student[i].math;
		total_jap              += student[i].jap;
		total_total           += student[i].total;
	}
	ave_eng   = total_eng / num;
	ave_math = total_math / num;
	ave_jap    = total_jap / num;
	ave_total = total_total / num;
	
	total_eng = total_math = total_jap = total_total = 0;
        for (i=0; i<num; i++) {
		total_eng           += pow(student[i].eng-ave_eng, 2.0);
		total_math         += pow(student[i].math-ave_math, 2.0);
		total_jap            += pow(student[i].jap-ave_jap, 2.0);
		total_total         += pow(student[i].total-ave_total, 2.0);
	}
	num--;/*エクセル対応*/
	dev_eng   = sqrt(total_eng / num);
	dev_math = sqrt(total_math / num);
	dev_jap    = sqrt(total_jap / num);
	dev_total = sqrt(total_total / num);
}

こんなん。 見返してみて気がついたのですが num--;/*エクセル対応*/ なんじゃこりゃ。とちょっと考えてみて気がついたんですが、 標準偏差や分散を求める場合に、サンプルの数 n を使うか n-1 を使うかという 二種類のやり方があるんですね(標本分散と不偏分散とか)。 くわしくは 第1章 少数データの平均と標準偏差の求め方 あたりを。

■_ 色川武大 阿佐田哲也

id:higepon のところで黒ニャー本のことを書いているのを見て


プログラミング Clojure - ひげぽん OSとか作っちゃうかMona-
(株)オーム社の森田さまより プログラミングClojure を献本いただきました。ありがとうござ
います。

Clojure を初めて知ったのは本書の訳者でもある Shiro さんの日記だったと記憶している。JVM 
上で動く Lisp であること、言語デザインが優れている事などが挙げられていたように思う。そ
の後 Clojure の名前は Hacker News などでたびたび見かけるようになり、気になっていたのだ
が本書が出版されるまで自分で触ってみる事はなかった。「新しいテクノロジへの追随は週に
1-2時間でよろしい」という Rod Johnson の教えを守っている時期でもあったし。

Rod Jonson の教えというのが気になったのでもうちょっと詳しいことを 教えてほしいとお願いしたところ、 J2EE Development without EJB という本の、の第2章にあるというのを 教えてもらいました。 Amazon.co.jp: Expert One-on-One J2EE Development without EJB: Rod Johnson, Juergen Hoeller: 洋書 これですか。

で、これと色川武大(阿佐田哲也) がどう関係するのかというとですね。

書いている時間がなくなったのでまたの機会に♪

■_ 本日の巡回から

■_


C言語なら俺に聞け(入門編)Part 59 
587 デフォルトの名無しさん [] 2010/01/23(土) 11:27:24 ID: Be:
    数値計算の自作プログラムの実行スピードが遅くて困ってるんだけど簡単に早くする方法って無い?
    ちなみに並列化はすでに完了。
    変数の名前短くするとかは無駄かな?
    何でもいいのでアイデアくれ。 

589 デフォルトの名無しさん [sage] 2010/01/23(土) 11:30:50 ID: Be:
    ソースさらさないと曖昧論しか出てこないぞ
    プロファイルとってアセンブラリスト見てチューニング、SIMD、GPGPU、クラスタリング、マシンのリプレース 

591 デフォルトの名無しさん [sage] 2010/01/23(土) 11:38:52 ID: Be:
    曖昧論で良いから教えて欲しいのよ。 

593 デフォルトの名無しさん [sage] 2010/01/23(土) 11:52:45 ID: Be:
    >>591
    優秀な人に作り直してもらう、とか 

594 デフォルトの名無しさん [sage] 2010/01/23(土) 12:25:50 ID: Be:
    >>587
    > 変数の名前短くするとか
    Cで、こんなこと言ってるあたりからすると、君には無理。 

595 デフォルトの名無しさん [sage] 2010/01/23(土) 12:29:08 ID: Be:
    なにそのBASICw 

596 デフォルトの名無しさん [sage] 2010/01/23(土) 12:38:33 ID: Be:
    >>587
    巨大な行列の掛け算なら先に転置行列を作ってから計算すれば倍速くらいにはなる 

一文字変数使いまくったら作成したバイナリの実行速度が向上する Cコンパイラとかあったらやだなあw

2010年01月22日

■_

・ただいま授業作業中
付箋貼りまくりの図

・買った
サはサイエンスのサ
鹿野さんの文章は好きだ。
動かしながら理解するCPUの仕組み CD-ROM付 (ブルーバックス 1665)
Z80シミュレータつき。

■_ イライラ


【正規表現】コメントアウトされていない文字列のマッチ | OKWave

あるファイル群にgrepをかけて結果を取得したいのですがあと半歩という所でつまづいています。
正規表現の考え方のご示唆をいただけませんでしょうか。
宜しくお願い致します。

■やりたいこと
コメントアウトされていない文字列のマッチ

■対象文字列
1行目:ほげ
2行目://ほげ
3行目:// これは否定 ほげ
4行目:ほげ //ここにコメントがはいるとひっかからない(><)

■コメントアウト文字
//

1行目と4行目の「ほげ」をマッチさせたいのです。

正規表現の先読み否定を使って
^(?!//.*)ほげ$
行頭から、「//」が後に続かなくて「ほげ」がある行末

とやってるのですが、
4行目がひっかかりません。
(?!//.*)の部分で、「//」から「ほげ」までを否定している為だと思うのですが、
どのように考え、どのように記載すればスマートでしょうか。

お忙しい所恐縮ですが
アドバイスいただければ幸いです。
宜しくお願い致します。

>ほげ$
 これだと、"ほげ"の後に文字があるとダメだね。
4行目:ほげ //ここにコメントがはいるとひっかからない(><)
だけじゃなく
 ほげ
 ほげ //
 ほげじゃない
すべて引っかからないはず。

/(?!\/\/).*ほげ.*$/

投稿日時 - 2010-01-22 11:56:34

どうしてデリミターを / のままにするかなあ。エスケープうざいじゃん

■_ C怖い

セキュリティホール memo [SA38220] GNU gzip "unlzw()" Integer Underflow Vulnerability からリンクを辿り。


gzip.git - Unnamed repository; edit this file 'description' to name the repository.
diff --git a/NEWS b/NEWS
index 3e50762..747253f 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,11 @@ GNU gzip NEWS -*- outline -*-
** Bug fixes
+ gzip -d could segfault and/or clobber the stack, possibly leading to
+ arbitrary code execution. This affects x86_64 but not 32-bit systems.
+ This fixes CVE-2010-0001.
+ For more details, see http://bugzilla.redhat.com/554418
+
gzip -d would fail with a CRC error for some valid inputs.
So far, the only valid input known to exhibit this failure was
compressed "from FAT filesystem (MS-DOS, OS/2, NT)". In addition,
diff --git a/unlzw.c b/unlzw.c
index fb9ff76..8f8cbee 100644
--- a/unlzw.c
+++ b/unlzw.c
@@ -240,7 +240,8 @@ int unlzw(in, out)
int o;
resetbuf:
- e = insize-(o = (posbits>>3));
+ o = posbits >> 3;
+ e = o <= insize ? insize - o : 0;
for (i = 0 ; i < e ; ++i) {
inbuf[i] = inbuf[i+o];

ってこのパターンはC 以外でもありうるのか。

■_ ゼロの(ry

ぬるぽが(ほぼすべての環境で)ゼロなのはなんで、ということから始まって


Twitter / イソッパ: @o_norimi なるほどー、最近はヌルポインタを ...

なるほどー、最近はヌルポインタを持つ言語は殆どないので、なくすべきじゃないかなーという
議論で 自分は昔は0が特別に判定できたので0がヌルポだったんじゃないかなあと思ったのでし
た。 あまり意味のない話です

とかなんとか悩んでる方がいらっしゃいまして。 ちょっと前についったの一部で盛り上がった C では真と偽が1 (正確には非0)と0だけど BASCI だと -1 と0だという話じゃないけど、 0 とそれ以外の値ってのは判断しやすいのがひとつってのがあるんじゃないかな。 と全部のビットが寝ているのかどれかひとつだけでも立っているのがあるのかとか。 んで、


Omicron EDSAC/命令セット

EDSAC は 1word = 18bit だったが,回路のセットアップ時間が原因で,実際には 17bit しか使
われなかったらしい.

    * 基本は,<オペコード><アドレス修飾指定><アドレス><命令修飾指定><終端指定>
    * オリジナルの EDSAC のアドレス部は 11bit だったが,B レジスタによるアドレス修飾用に 1bit 削られた.
    * 命令指定は,B レジスタやその他の拡張によって,一貫性が崩れてしまっている.
    * 終端指定は,紙テープから読み込まれる際に命令の区切りとして利用される. 

Instruction Format (17bit)

   0         5 6                14  16   
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Opcode(5)| |   アドレス(10)    | |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         アドレス修飾(1)            命令修飾(1)

命令(ニーモニック)

    * A n F: C(Acc) に C(n) を加算する
    * S n F: C(Acc) から C(n) を減算する
    * T n F: C(Acc) を n 番地に格納し,Acc をクリアする
    * U n F: C(Acc) を n 番地に格納し,Acc はそのまま
    * H n F: C(n) を乗算レジスタ R に格納する
    * V n F: C(n) と乗算レジスタ R の積を Acc に加算する
    * Z n F: 停止する.n の値は何でもよい 

    * F n F: n 番地へ無条件ジャンプ
    * G n F: もし C(Acc) < 0 ならば,n 番地へ
    * G n π: もし C(Acc) < 0 ならば,n 番地へ.条件成立時に Acc をクリアする
    * E n F: もし C(Acc) >= 0 ならば,n 番地へ
    * E n π: もし C(Acc) >= 0 ならば,n 番地へ.条件成立時に Acc をクリアする 

以下略

というわけですよ。こいつにはまだフラグレジスターはないみたいだけど。

■_ できるかな

ふらっとC#,C♯,C#(初心者用) Part53 
776 デフォルトの名無しさん [] 2010/01/19(火) 17:06:22 ID: Be:
    asp.netで公開されているURLを叩くと
    サーバー側のローカルネットワークの
    LinuxのApacheで公開されているPHPが実行されて
    結果をクライアントに返すみたいなことってできますか?
    iisがプロキシになるみたいな。 

777 デフォルトの名無しさん [sage] 2010/01/19(火) 17:09:33 ID: Be:
    >>776
    実際出来るかどうかわからんが、ASP.NETでページを作成し、
    内部ではWebClientなどでPHPのURLを叩いて結果を取得し、
    それをResponseに書き出すとか? 

778 デフォルトの名無しさん [sage] 2010/01/19(火) 21:13:32 ID: Be:
    >>776
    基本無理。 

779 デフォルトの名無しさん [sage] 2010/01/19(火) 21:35:57 ID: Be:
    普通にできるだろ 

780 デフォルトの名無しさん [sage] 2010/01/19(火) 21:37:01 ID: Be:
    でっきるっかなでっきるっかなはてはてほほー 

781 デフォルトの名無しさん [sage] 2010/01/19(火) 21:41:17 ID: Be:
    はてはてふふーだと思ってた。 

782 デフォルトの名無しさん [sage] 2010/01/19(火) 21:57:01 ID: Be:
    さてさて、だろw
    スキャットの部分はフフーもホホーも両方ある 

783 デフォルトの名無しさん [sage] 2010/01/19(火) 21:59:55 ID: Be:
    アホばっかだな
    お前らみたいなのがルパンザサーンだと思い込んでるクチだな 

784 デフォルトの名無しさん [sage] 2010/01/19(火) 22:11:04 ID: Be:
    ルパンドフード だろ 

785 デフォルトの名無しさん [sage] 2010/01/20(水) 03:32:43 ID: Be:
    ゆとりのネタにマジレスするのもあれだけど
    ルパンルパーンだから 

そーいや、DVD-BOX出たんだっけ? >できるかな


最も美しいプログラミング言語は? Part5 
337 デフォルトの名無しさん [sage] 2010/01/22(金) 13:14:42 ID: Be:
    全てのプログラム言語はどれも美しいものばかりじゃないか
    記述されたコードが醜いのは、コードを書いた奴の醜さが、コード現れているだけだろ
    美しいプログラム言語を探すより、エレガントなコードを書ける人になろうぜ

338 デフォルトの名無しさん [sage] 2010/01/22(金) 13:20:13 ID: Be:
    どんなに頑張っても綺麗に書けない言語がある
    そのうちのひとつが Perl と PHP だ 

「コンパイラ・スクリプトエンジン」相談室14 
254 デフォルトの名無しさん [sage] 2010/01/22(金) 00:18:23 ID: Be:
    明快入門コンパイラ・インタプリタ開発 C処理系を作りながら学ぶ

    神本だった。ここでうだうだ糞文法の質問している奴
    読めや 

255 デフォルトの名無しさん [sage] 2010/01/22(金) 00:19:20 ID: Be:
    本を紹介するんならICBMくらい書けや 

256 デフォルトの名無しさん [sage] 2010/01/22(金) 00:21:06 ID: Be:
    >>255
    あー?お前誰に命令してるんじゃ?

257 デフォルトの名無しさん [sage] 2010/01/22(金) 00:22:43 ID: Be:
    >>255
    あー? テポドン2号落とすぞコラ 

258 デフォルトの名無しさん [sage] 2010/01/22(金) 00:24:52 ID: Be:
    テポドン2号だと?
    おまえ、それかっぱえびせんじゃねえか 

259 デフォルトの名無しさん [sage] 2010/01/22(金) 02:22:16 ID: Be:
    ワロヒコ乙 

260 227 [sage] 2010/01/22(金) 03:00:20 ID: Be:
    >>249
    C#などのように扱い始める時にオブジェクトの生成を行う方法と、
    JavaScriptのようにメソッドの定義時に行う方法があると思っていますが、
    後者の方が心理モデルを構築しやすく、理解しやすいと思っています。
    オブジェクトにはフィールドとメソッドがペタペタくっついてる、と
    説明すると、初学者にも理解してもらいやすいのではないでしょうか?

    >>250-253
    たしかに分かり難い所があるかもしれません。
    この点に関しては、>>253 であげられた所ドユメントでも、
    > the simple (but occasionally surprising) rule is this:
    と書かれています。
    Perlは各関数が取る引数の数によってどうパースされるかが変わります。
    Rubyでは、"p (1) - 2"というコードで 1.6 と 1.8 で結果が違います。
    また、Ruby 1.8 では、引数の数でも変わります。

    これらをふまえると、単純に関数名の後ろのスペースの有無で評価結果を
    変えるのが良いのではないかと思っています。

    私は過去にCなどの言語で関数名の後ろにスペースを入れるべきという主張を
    見た事がありませんし、while, for 等の構文と関数呼び出しを
    スペースの有無で見わけるという、コーディング規約も一般的だと思います。
    そのため、自由度は減りますが、見た目的には良いのではないでしょうか?

    >>254
    どのような点が良いのでしょうか?
    Cのような低いレイヤの処理系を実装するとなるとinline化の判断や
    可変長配列サポートの仕方とかが気になりますが、
    その辺はまっとうな方法を紹介してますか?
    土日に本屋に行って探してみます。
    >>255
    じゃあ、ABMで。 

264 デフォルトの名無しさん [sage] 2010/01/22(金) 10:13:13 ID: Be:
    >>260
    > Cのような低いレイヤの処理系を実装するとなるとinline化の判断や
    > 可変長配列サポートの仕方とかが気になりますが、
    > その辺はまっとうな方法を紹介してますか?

    お前、自分のレベルにあった本をまず読めよ。
    なんで上から目線なんだw 

265 デフォルトの名無しさん [sage] 2010/01/22(金) 11:26:13 ID: Be:
    ワロヒコの本を紹介するような椰子には、上から目線で当然だろwwwww 

推薦図書/必読書のためのスレッド 54 
52 デフォルトの名無しさん [sage] 2010/01/22(金) 23:27:05 ID: Be:
    明快入門コンパイラ・インタプリタ開発 C処理系を作りながら学ぶ

    って、どうなんだろうか…目次をみるかぎりだと
    地味そうでよさげな気がするんだけど・・・ 

54 デフォルトの名無しさん [] 2010/01/23(土) 00:07:49 ID: Be:
    >>52
    人柱になってくれ 

55 デフォルトの名無しさん [] 2010/01/23(土) 00:09:46 ID: Be:
    >>52
    C言語で作っていくのか
    興味あるな 

56 デフォルトの名無しさん [sage] 2010/01/23(土) 00:10:49 ID: Be:
    作者が気になるところだが・・・ 

検索してみたけど、まだ書評とかなさげだねえ。

■_ 本日の巡回から

2010年01月21日

■_

・しょひょー
Masterminds of programming — geek scrap ちょっと前に一部でちょっとだけ話題になった本。 実はわたしも買ってはいるけどまだ全部は読んでない(笑)
Masterminds of Programming (Theory in Practice (O'Reilly))
翻訳予定はあるんだろうか?

■_ 今日の丸投げ

これは summim さんが飛んでいきそうな丸投げ(笑)

プログラム言語、SmalltalkとObjective Cを使用して「 | OKWave

プログラム言語、SmalltalkとObjective Cを使用して「

プログラム言語、SmalltalkとObjective Cを使用して「1から100まで加算し、標準出力に表示」する

というプログラムはどのように書く事が出来ますか?

参考書を読んでもよくわからないので質問させていただきました。

どうか、ご教授願います。

で、関連する質問でこんなんが(ずいぶん前のですが)

http://okwave.jp/qa/q10011.html
smalltalk | OKWave

当方、パソコンすら初心者なのですが卒業研究でsmalltalkという言語でプログラムすることになりました。

お勧めの本、サイト、その他情報をお持ちの方教えてください。よろしくお願いします。
何をしていいのか見当がつかず困っています。

投稿日時 - 2000-10-04 14:52:37

どんな卒業研究だったんだろう?

そして


緊急です!!助けてください(T_T) - Yahoo!知恵袋

現在学校の授業でC言語を習っているのですが、課題で出た鶴亀算のプログラムが全く理解できません。

留年の危機なんです

どうしても提出しなければ,,,,,

お願いします。答えを教えてくださいm(- -)m

補足
    頭の数を入力したら鶴と亀のそれぞれの匹数がでるようなプログラムです。お願いします。

単位を落とすだけじゃなくて留年ですか。 それにしても「頭の数」だけでは鶴と亀の数は求められないんじゃないかなあw

■_ VS10

melancholic afternoon
1月19日_
   64ビットバイナリ作るのにも Pro 版買えとか鬼ですか

コメント見るとEclipseなどからでもupgrade価格でいい, Express EditionでもWindows SDK入れ
れば64bitコンパイルできるってあるし「鬼」というほどでも. 

という指摘を受けたので、改めて reedit のスレッドを見てみると確かに。

Microsoft kills Standard Edition with Visual Studio 2010 - entry price now $799 : programming

Some things to keep in mind:

    * This is the price of the full version, not the price of the upgrade version.
    * You can pay the upgrade price if you are using Visual Studio Express.
    * You can pay the upgrade price if you use a different IDE (i.e. Eclipse, NetBeans, etc.).
    * Other proprietary C++ development kits are around the same price (e.g. C++ Builder 2010 starts at $899).
    * To compile 64-bit code with the Express Edition, you need to install the Windows SDK. See here for detailed instructions.

Still, IDE prices are out of control, so here's a list of FREE alternatives:

    * Netbeans
    * Eclipse CDT
    * Bloodshed Dev-C++
    * Code::Blocks
    * CodeLite
    * MonoDevelop (for C# and VB)
    * SharpDevelop (for C# and VB)

I haven't tried any of these with C++, so YMMV.

EE からのアップグレードも(アップグレード版で)可能というのはいいんでしょうけど それでも7万円とかになるんですよねえ。多分。

■_ 標準偏差


C言語なら俺に聞け(入門編)Part 59 
500 デフォルトの名無しさん [sage] 2010/01/21(木) 23:12:29 ID: Be:
    いつもお世話になってます
    レポート課題のプログラムを組んだところ、標準偏差が正確に出力されずorz
    excelで確認してみると 23.74 19.23 22.68 41.89 になるようなのですが…
    よろしくお願いします
    http://www.dotup.org/uploda/www.dotup.org581347.zip.html 

503 デフォルトの名無しさん [sage] 2010/01/21(木) 23:38:00 ID: Be:
    >>500
    doubleの前にstaticを入れる 

504 デフォルトの名無しさん [sage] 2010/01/21(木) 23:58:56 ID: Be:
    >>500
    標準偏差の計算式合ってるの?

    sqrt(((各人の点数-平均)^2)の合計, 2.0)

    じゃなくて? 

505 デフォルトの名無しさん [] 2010/01/22(金) 00:15:23 ID: Be:
    >>501
    気持ちはわかってやれるが
    悲しいほど適性のないコードだな

    初心者ゆえの技量の低さとは異質な
    不真面目さが箸にも棒にもかからない 

506 デフォルトの名無しさん [sage] 2010/01/22(金) 00:15:23 ID: Be:
    >>503
    変化無しでした…

    >>504
    おかしいですか?
    猫でもわかるプログラミングを参考に組んだのですが…
    直してみますー 

510 デフォルトの名無しさん [sage] 2010/01/22(金) 00:28:05 ID: Be:
    >>500
    http://www.dotup.org/uploda/www.dotup.org581685.c.html 

511 デフォルトの名無しさん [sage] 2010/01/22(金) 00:32:57 ID: Be:
    >>500
    1 total_xxxが初期化されていない。
    2 標準偏差の求め方が間違っている。

500 のプログラムはすでに削除されちゃってるんですが先ほどちょっと見たところでは、 標準偏差を求めるのに sqrt(((各人の点数 - 平均)^2)の合計, 2.0) ではなく、 sqrt( 各人の点数の二乗の和の平均 - 平均^2 ) という式を使っていました。 これは式の変形で前者からこのようにできるはずなので 「求め方が間違っている」というのは多分違うような。 後者の式を使うと、オーバーフローしやすくなったりしますが 計算対象に対するループ(or イテレート)が一回で済むので楽だったりするんですよね。 前者だと平均を求めるためにあらかじめ一回ループしないといけない。

■_ オープンソースライセンスが多すぎる

Bruce Perens: How Many Open Source Licenses Do You Need?
February 16, 2009
By Bruce Perens

About the Author: Bruce Perens is the creator of the Open Source Definition, the 
manifesto of Open Source and the criterion for Open Source software licensing. Perens 
represented Open Source at the United Nations World Summit on the Information Society, 
at the request of the United Nations Development Program.

The Open Source initiative has, to date, approved 73 licenses. How many do you really 
need? If you're a company or individual producing Open Source software, no more than 4. 
And you can get along with just 2 of them.

Open Source initiatie は現時点で 73種類のライセンスを approve しています。あなたが本当
に必要とするライセンスは幾つあるでしょうか? あなたが会社でか個人でかでオープンソースソ
フトウェアを作成しているのであれば、4つを越えることは無いでしょう。
And you can get along with just 2 of them.

But the fact that there are 73 licenses is a problem. Many of those licenses are 
incompatible with each other. To understand the legal implications of mixing software 
under two of those licenses together in the same program, you'd have to learn 5256 
different combinations!

しかし 73種類もライセンスがあるということは問題です。これらのライセンスの多くが、互いに
対して非互換 (incompatible) なものになっていて、一つのプログラムの中に一緒にこれらのラ
イセンスの二つに基づくソフトウェアを混ぜ込むことの法的な implications を理解するために
は、なんと 5256 種類の組み合わせを学ぶ必要があるのです!

And the worst thing about this is, it's my fault! Well, partially. When I wrote the 
rules for Open Source licensing in 1997, as a policy document of the Debian project, 
not many people took what we then called “Free Software” seriously, and it was 
unthinkable that 73 different licenses that complied with my Open Source Definition 
would ever be written.

この件に関して最悪なのは、それが部分的にせよわたしの間違い (my fault) であるということ
です!わたしが1997年にオープンソースライセンスのためのルールを定めたとき、Debian プロジ
ェクトのポリシードキュメントとしてわたしたちがそれらを“自由なソフトウェア”(Free 
Software) と呼称したことを seriosly に受け止めた人の数は多くはなくて、その結果が 
complied with my Open Source Definition would ever be written で unthinkable
な 73種類ものライセンスとなったのです。

Fortunately, you don't have to deal with many of those 73 licenses. When you need to 
distribute or modify software that is under one of them, you'll need to understand 
that one. And folks who are just users get off easy: you don't really need to read an 
Open Source license just to use the software, because the rules I wrote require that 
the license give you the right to use Open Source software for any purpose.

幸いなことにこれら 73種類のライセンスの多くをあなたが扱う必要はありません。あなたがそ
れらのライセンスのどれかに基づくソフトウェアを配布したり修正する必要があるときにはあな
たにはそのライセンスを理解している必要があります。
And folks who are just users get off easy:
単にそのソフトウェアを使うだけのためにはオープンソースライセンスを読む必要は実際にはあ
りません。なぜならそれは、ライセンスがあなたにオープンソースソフトウェアをどんな目的に
も使える権利を与えることを要求するためにわたしが書いた規則だからです

Understanding licenses isn't really an Open Source issue. Most software is copyrighted 
and under some sort of license, and the licenses on proprietary software are much more 
pernicious than those on Open Source.

ライセンスを理解するということは実際には Open Source の issue ではありません。大部分の
ソフトウェアは copyrighted されていて、なんらかのライセンスの下にあります。そして 
proprietary なソフトウェアのライセンスはオープンソースのそれよりもずっとひどく有害な
ものなのです。

But most companies, even large ones, aren't yet completely able to cope with the 
implications of software licensing. At your next departmental meeting, ask how many 
people have clicked “Yes” on a license of a web site or software application while 
at work. Then, ask how many of those folks are authorized to enter into a contract on 
behalf of the company.

けれども大半の企業は、それが大企業であってさえも、ソフトウェアに関するライセンシングの 
implications (暗示、仄めかし)つきのコードがまだまだ完全には可能になっていないのです。
次のあなたの部門ミーティング (departmental meeting) で、どのくらいの人がweb サイトのラ
イセンスや動作しているソフトウェアアプリケーションのライセンスで“Yes”をクリックして
いるか尋ねてみて下さい。さらにそのうちのどのくらいの人が会社のために契約を結ぶための 
authorized がなされているかを尋ねてみて下さい。


See the problem?

To understand how many Open Source licenses you really need, it's important to set 
some goals. First, the licenses must all be compatible with each other. There's no 
point in licensing your own company's Open Source so that it's not compatible with 
other Open Source from your company. And second, the licenses should fulfill the 
various different business purposes for Open Source.

どれだけの数のオープンソースライセンスが実際にあなたに必要なのかを理解するためには、幾
つかの目標を設定することが重要です。第一に、そのライセンスは他のライセンスに対して互換 
(compatible) なものでなければなりません。あなたの会社のオープンソースのライセンス付与 
(licensing)をするところがなければ、それはあなたの会社のその他のオープンソースに対して
互換ではありません。第二に、そのライセンスはオープンソースに対する各種のビジネス目的を
満たしていなければなりません。


Open Source has business purposes? If you're a business. The two main ones are:

オープンソースにはビジネス上の目的があるのか?
あります。あなたがビジネスをしているのであれば。


・ To get everyone possible to use your software to do things the same way:

For example, if you're creating a standard that you'd like everyone to use regardless 
of whether their own software is Open Source or proprietary. Some years ago, a 
manufacturer of circuit design software created a standard file format for circuit 
designs, and distributed Open Source software that circuit chip foundries could use to 
read that format under the BSD license, which has no significant restrictions.

たとえばあなたが、オープンソースなのか proprietary なのかに関係なく誰もがそのソフトウ
ェアを使えるようにする標準を策定したとします。何年か前に、ある回路設計ソフトウェアを作
っていた会社 (manufacturer) が回路設計のための標準ファイルフォーマットを作成し、さらに 
chip foundries が BSD ライセンスの下で特に制限なくそのフォーマットを読み込むために使う
ことのできるオープンソースのソフトウェアを配布しました。

Because the company's competitors could also use the same format with their software, 
the foundries had an incentive to implement the format and simplify their operations. 
Thus, the circuit design software manufacturer was assured that their software's 
output would be usable with essentially all chip foundries.

その企業の競争相手 (competitors) もまたそのソフトウェアによるのと同じフォーマットを使
うことができましたから、foundries には同じフォーマットを実装して自分たちのオペレーショ
ンを単純にするインセンティブがありました。したがって、その回路設計ソフトウェアの 
manufacturer は自分たちのソフトウェアによる出力が本質的にすべての chip foundries  にと
って有用であることを保証 (assured) したのです。

・ To create a partnership for software development, where everybody shares in the work:
   すべての人が成果を共有できるようなソフトウェア開発に対するパートナーシップをつくりだす

About 14 years ago, I created the Busybox embedded systems toolkit for Linux. I put in 
a month's worth of evenings on the project, which was to build a command-line 
environment that would fit on a single floppy disk, for the Debian GNU/Linux 
distribution's installer. I released the product under the GPL license.

およそ14年程前、わたしは Linux 向けの Busybox という名前のついた組み込みシステム用ツ
ールキットを作成しました。わたしはそのためのプロジェクトに month's worth of evenings 
つぎ込みました。そのツールキットは Debian GNU/Linux のディストリビューションのインスト
ーラーのための一枚のフロッピーディスクにも収まるようなコマンドライン環境を構築するもの
で、わたしはその製品をGPLライセンスの下でリリースしました。

Subsequently, embedded systems companies adopted Busybox because doing so gave them 
some time-to-market advantage in putting their product offerings together: they 
wouldn't have to re-do my work. Because I'd used the GPL, their extensions to my 
software had to be under a GPL-compatible license too, and had to be made available in 
source-code form.

続けて組み込みシステムの企業は Busybox を採用しました。それは Busybox を彼らの製品に組
み入れることで幾つかの time-to-market advantage を与えることになったからです。彼らはわ
たしの成果を再度行う必要はありませんでした。なぜならわたしが GPLを使っていたために、彼
らのわたしのソフトウェアに対して行った拡張はやはり GPL 互換のライセンス下になければな
りませんでしたし、また、ソースコードの形態で入手可能になっていなければなりませんでした。

The various embedded Linux companies shared that work with each other and the entire 
Open Source community. At least 5 person-years of work have been added to that program, 
and all of that work is available for anyone to use. Had I used a license without the 
share-and-share-alike provisions of the GPL, those embedded companies would have kept 
their additions to themselves as proprietary software. And that wouldn't have done 
them much good, because Busybox wasn't business-differentiating for those companies.

様々な組み込み Linux の企業が、他の企業との間やオープンソースコミュニティ全体で成果を
共有しています。少なくとも 5人年の作業がそのプログラムに加えられ、その成果のすべてを誰
もが使えるようになっています。もしわたしが GPL の share-and-share-alike provisions が
ないライセンスを使ってしまっていたなら、組み込み企業は彼らが追加した部分を彼ら自身の 
proprietary なソフトウェアとし続けてしまうでしょう。それは甚だよろしくない事態です。な
ぜなら、Busybox はそういった企業の business-differentiating (ビジネス上の差別化?) のた
めのものではないからです。

Next Page: Three Types of Open Source Licenses to Choose From
  

つづく。

■_ 本日の巡回から

  • リリカルなのはラッピングバスが池袋~新宿~渋谷~秋葉原を巡回中! - ニュース - アニメイトTV
  • 『プログラミング Clojure』 - 月の塵
  • Twitter / Chaton Gauche: naoya_t: 次のShibuya.lispはCl ...
  • Twitter / tomoyuki nagai: STLでlessとかの書き方を覚えれらない
  • Twitter / ゆんゆん探偵: STLに限らずC++ template librar ...
  • Twitter / 渋川よしき: The Art of Communityの翻訳権ゲッ ...
  • 海底ケーブルの地図:アルファルファモザイク
  • 化物語BD&DVD「つばさキャット」上巻のジャケット絵公開 :おた☆スケ -おたくのスケジュール帳-
  • Lispjobs.jp » Blog Archive » CommonLisp、SchemeまたはErlangでプログラミングできる方など、少し尖った方を望んでいます。
  • コスト削減は社員のやる気をそぐ、経営層はケアを思案中-goo意識調査 - Enterprise Watch
  • Hexenkessel - つまりPC-9801やFM-Rが、ガラケーのNECや富士通が開発するモデルに相当するのではなかろうか。...
  • All-In-One Code Framework
  • C++ Templates: The Complete Guideがようやくようやくほんっとーにようやく訳されるようだ - 梶本裕介の日記
  • awkプログラムをシェルスクリプトから走らせるときに値を渡す - Linux Square会議室
  • TOPS-20で太古のEmacsに出会う - Plan9日記
  • 新春早々の「Gumblar一問一答」 - @IT
  • VistaパソコンにUSBメモリーを差し込んだら「~修復しますか?」と出た。よくわからないので、「キャンセル」を選んでいいですか?:マイクロソフトに聞きました
    必ず「スキャンおよび修復」をクリック。 → 選択してもスキャンできない場合はどうするんだろう
  • Dabeaz: Presentation on the new Python GIL
  • vmfarms: We're Finally Excited about Python 3
  • Twitter / camlspotter: OCaml 「これでわかったろう おまえのように純粋 ...
  • デマンドバスには数理的アプローチを | WIRED VISION
  • はじめMath! Javaでコンピュータ数学:第75回 計算量の数学 計算量と実際のコード その1 |gihyo.jp … 技術評論社
    中間値を求める式が気になるけど問題になることはまずないか。

  • 一つ前へ 2010年1月(中旬)
    一つ後へ 2010年2月(上旬)

    ホームへ


    Copyright (C) 2010 KIMURA Koichi (木村浩一)
    この文書の無断転載はご遠慮ください(リンクはご自由にどうぞ)。

    メールの宛先はこちらkbk AT kt DOT rim DOT or DOT jp