ときどきの雑記帖 めぐりあい電脳空間編

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

一つ前へ 2010年9月(下旬)
一つ後へ 2010年10月(中旬)

ホームへ

2010年10月10日

■_

1010 ということで銭湯の日だったらしく。

・買ったり読んだり
FRONT MISSION DOG LIFE & DOG STYLE(6) (ヤングガンガンコミックス) ミドルクラスを問いなおす~格差社会の盲点 (生活人新書) Making it Big in Software: Get the Job. Work the Org. Become Great.
FRONT MISSION は前の巻の内容をすっかり忘れてしまっていた。 三つ目の洋書は、ジュンク堂で見つけたもの。 今年の三月くらいの発売らしいのだけど気がつかなかった。 独課翻訳本出さないかなあってピアソンだから出すとしても決まってるか。

情報系+αことのは辞典
こういうの好きでして。

■_ errono でも同じようなことがあったような


C言語なら俺に聞け(入門編)Part 70 
966 デフォルトの名無しさん [sage] 2010/10/10(日) 07:34:08 ID: Be:
    あるソフトをコンパイルしたらエラーが出て、
    該当箇所にこんなコードがあるんですが

    FILE *fin = {stdin}, *fout = {stdout};

    こういう書き方ってありなんでしょうか? 

967 デフォルトの名無しさん [sage] 2010/10/10(日) 07:41:06 ID: Be:
    ねーよ。 

968 デフォルトの名無しさん [sage] 2010/10/10(日) 07:59:35 ID: Be:
    FILE *fin[] = {stdin}, *fout[] = {stdout}; 

969 デフォルトの名無しさん [sage] 2010/10/10(日) 08:12:22 ID: Be:
    とりあえず、ソースのfin/foutをすべて手動でstdin/stdoutに置き換えて解決しました

    >>968 同じエラーが出ます
    error: 初期化子の要素が定数ではありません

    stdin,stdout等はwhich are expressions of type pointer to FILEって書いてるから
    FILE*fin = stdin,*fout=stdout;
    これで動いて欲しいけど、これもエラー
    Cは難しい 

970 デフォルトの名無しさん [sage] 2010/10/10(日) 08:27:14 ID: Be:
    > FILE*fin = stdin,*fout=stdout;
    codepadは通ったよ
    http://codepad.org/Xsl26OP0 


971 デフォルトの名無しさん [sage] 2010/10/10(日) 12:05:38  ID: Be:
    エラーの内容からすると訂正はこうじゃないのか?
    FILE*fin, *fout;
    fin = stdin;
    fout=stdout;

    codepadがC99対応なんじゃないかね
    試してないけど 

972 デフォルトの名無しさん [sage] 2010/10/10(日) 12:06:52 ID: Be:
    こうじゃないのか? -> こういう感じじゃないのか 

973 デフォルトの名無しさん [sage] 2010/10/10(日) 12:45:04 ID: Be:
    FILE * fin = stdin;
    FILE * fout = stdout; 

974 デフォルトの名無しさん [sage] 2010/10/10(日) 12:54:41 ID: Be:
    >>966の書き方でVCもbccも通ったんだが 

975 デフォルトの名無しさん [sage] 2010/10/10(日) 12:57:06 ID: Be:
    VC++は
    #define stdin (&__iob_func()[0])
    だからauto変数以外の初期化でエラーになる。 

976 デフォルトの名無しさん [sage] 2010/10/10(日) 13:25:29 ID: Be:
    966の中括弧の役割が分からんのだが 

979 デフォルトの名無しさん [sage] 2010/10/10(日) 13:44:50 ID: Be:
    >>974
    出先なんで試していないが俺もコンパイル通ると思うぞ。
    出来ないって言っている奴は間違えてC++としてコンパイルしているのではないだろうか? 

981 デフォルトの名無しさん [sage] 2010/10/10(日) 13:47:17 ID: Be:
    普通、警告はエラーにするからコンパイルは通らない。 

983 デフォルトの名無しさん [sage] 2010/10/10(日) 15:50:10 ID: Be:
    >>978
    >>979
    乙 

984 デフォルトの名無しさん [sage] 2010/10/10(日) 20:24:35 ID: Be:
    >>976
    要素が増えたときのためのフェイルセーフでしょ。
    個人的にはくだらんコーディングルールだなーと思うけど。 

975 以外はエラーメッセージ読んでないんだろうか…。 VC でも通る通らないがあるのはよくわからんけど(バージョンで違ったか?)。

■_

この種の問題は自分も悩んだことが。


パーサーとか構文解析とかその他もろもろ 
87 デフォルトの名無しさん [] 2010/10/07(木) 13:29:44 ID: Be:
    オートマトンの遷移関数表の入力記号が255種類以上(1万くらい)ある場合
    どんなデータ構造にしたらいいですか? 

88 デフォルトの名無しさん [sage] 2010/10/07(木) 16:39:19 ID: Be:
    1万エントリぐらいの振り分けってことだったら、関数ポインタの配列を使うかなぁ 

89 デフォルトの名無しさん [sage] 2010/10/09(土) 15:29:40 ID: Be:
    マジレスすると255はアスキーコードで一万くらいといったのはユニコードですよ(笑)
    ユニコードの実質使う文字数が1万個くらいかなーとおもっただけで
    正確には100個くらいかもしれません。 

90 デフォルトの名無しさん [sage] 2010/10/09(土) 15:31:20 ID: Be:
    何を言ってるんだ 

91 デフォルトの名無しさん [sage] 2010/10/09(土) 15:32:49 ID: Be:
    過疎ってるのにレス速いことに絶句 

92 デフォルトの名無しさん [sage] 2010/10/10(日) 01:39:31 ID: Be:
    Unicode は U+10FFFF までだから100万文字くらいあるぞ

    100万bitの配列をもつのはいかにも非効率だから、
    Unicodeコードポイントのレンジを表現できるデータ構造をつくって
    intersectionやunionの演算をできるようにしておくのかねえ 


■_ id

もうひとつ 2ch から。


インターネットラジオステーション<音泉> 19鯖目 [chaika]
401 声の出演:名無しさん [sage] 2010/10/09(土) 23:12:30 ID:MY5P9oGV0 Be:
    XMLもう使ってないのか……

    iPhone版のページ同じidを複数指定してるとか言うカオスな状態で気持ち悪い 

402 声の出演:名無しさん [sage] 2010/10/09(土) 23:35:29 ID:pAgcc67U0 Be:
    >>401
    担当者がclassやidの意味が分かってないんじゃないの 

407 声の出演:名無しさん [sage] 2010/10/10(日) 11:14:47 ID:UkagzVh90 Be:
    idは一回しか使っちゃダメと誤解している人は多いよなぁ
    そんな仕様はねー 

408 声の出演:名無しさん [sage] 2010/10/10(日) 15:03:07 ID:m/g2+7dC0 Be:
    そう言う仕様だろ。
    少なくともJavascriptは一意であることが前提で設計されてて
    例えばgetElementByIdなんかはElementと言う名前から見ても分かるように一意であることが前提だ。
    一方、getElementsByTagNameだと一意でないからElement"s"と複数形になってるしね。 

409 声の出演:名無しさん [sage] 2010/10/10(日) 15:07:29 ID:m/g2+7dC0 Be:
    ほら、W3Cのソースだ。
    http://www.asahi-net.or.jp/~SD5A-UCD/rec-html401j/struct/global.html#h-7.5.2
    >7.5.2 要素識別子: id属性とclass属性
    >属性定義
    >
    >id = name [CS]
    >この属性は、要素に名前を割り当てる。この名前は文書中で一意でなければならない。 

410 声の出演:名無しさん [sage] 2010/10/10(日) 15:33:22 ID:XtQjPflo0 Be:
    よく分かんないけど、>>407が顔真っ赤ってことでいいでつか? 

412 声の出演:名無しさん [sage] 2010/10/10(日) 16:28:27 ID:/gf6r3sL0 Be:
    もし俺が>>407だったら、恥ずかしくて自殺するかもしれん。 

同じ id が複数出てもいいって説が巷には流れてたりするんだろうか…

■_ 本日の巡回から

  • ライフハック?(笑): たわごと
  • 【コラム】思い切って「新卒カード」を捨ててみてはどうか : SIerブログ
  • ジブリ最新作、「借りぐらしのアリエッティ」の音楽は久石譲さんではないのですか? ... - Yahoo!知恵袋
  • 世界へ飛び出せ!~私たちの徒然留学記2010~ 大学受験について
  • JavaScriptの勉強のためにlexical closure実験プログラムを修正してみた - 矢野勉のはてな日記
  • 1+1=2を証明しろ  1+1=2が正しいか?なんて質問をするのは 愚問 って 答えを テストに書いたら大学はどうするのだろうか? « レビログ
  • ここギコ!: アイヌ語は将来公用語にする事を前提とした施策を打つべき
  • corgi 0.0.1リリース - SumiTomohikoの日記
    corgiは、正規表現ライブラリです。Pythonの正規表現をベースにしています。
    あとで(ソースコードを)読む
  • corgi 0.0.1 — corgi v0.0.1 documentation
  • I come to praise .join, not to bury it... - comp.lang.python | Google Groups
    I won't rehash why join() isn't appropriate as a method of sequences, but let me explain why I like it as a string method.
  • ベターCとしてのC++ | 株式会社きじねこ
  • MapReduce と Hadoop の将来について « Agile Cat — Azure & Hadoop — Talking Book
  • 【横浜】冷え切っていた地元との関係:東スポWEB-東京スポーツ新聞社
  • 公務員給与水準グラフが見せた、なれの果て日本 - Blog vs. Media 時評 - BLOGOS(ブロゴス) - livedoor ニュース
  • バビロンプロジェクトの元ネタが何なのか、もう一度考えてみる。 - スズロゴト~日々思うことをつらつらにひとりごとβ。
  • けんけんがくがく【喧喧諤諤】の意味 - 国語辞書 - goo辞書
  • 「Spidering Hacks」におけるスパイダーのマナー - てきとうなメモ
  • Yoga Library | 鳥獣GI-GA
    こういう場所が技術書でもできればなあ。 捨てるには惜しいけど場所はないし誰かにあげるのもいろいろ面倒だということで。
  • 有界の会 #1 — Scratch Leaf — MAYAH.JP
    Gradual Typing というのは、dynamic typing と static typing を混ぜたようなもので、基本 dynamic typing なのだけど、型アノテーションをつけるとそこから推論できる部分に関しては static typing になる、という。
    こっちも面白そうなことやってたのねー。
  • ■_ 型推論→例外処理→動的スコープ→トランポリン

    とかいう流れの話が、土曜日のTAPL読書会(a は小文字のほうがいいんだろか)後の 懇親会であったりしたのでトランポリンでちょっと書こうと思ったらすでに shinhさんが書いていたことだったり。 トランポリン - 兼雑記 関連して トランポリン - TABのつもりですか?(makeは無慈悲なbuildの女王)

    んでまあ

    int
    foo()
    {
        int x, y, z;
        x = rand();y=rand();z=rand();
        int bar()
            {
                int a,b,c;
                a = rand();b=rand();c=rand();
                int quux()
                    {
                        return x+b;
                    }
                return quux() + y;
            }
        return bar() + z;
    }
    
    
    	.file	"nest.c"
    	.text
    	.def	_quux.2;	.scl	3;	.type	32;	.endef
    _quux.2:
    	pushl	%ebp              ; ebp を保存してから
    	movl	%esp, %ebp        ; esp と同じ値にして
    	subl	$4, %esp          ; esp を減らす (ローカル変数などの領域)
    	movl	%ecx, -4(%ebp)    ; ecx を保存 (リンクの作成)
    	movl	-4(%ebp), %ecx    ; リンクを一段上へ
    	movl	-4(%ecx), %edx    ; さらにもう一段
    	movl	-12(%ecx), %eax   ; 二つ上のリンクにある変数 
    	addl	-4(%edx), %eax    ; ひとつ上のリンクにある変数
    	leave
    	ret
    	.def	_bar.1;	.scl	3;	.type	32;	.endef
    _bar.1:
    	pushl	%ebp
    	movl	%esp, %ebp
    	pushl	%ebx
    	subl	$20, %esp
    	movl	%ecx, -8(%ebp)     ; リンクを作成
    	movl	-8(%ebp), %ecx     ;
    	movl	%ecx, %ebx         ;
    	call	_rand
    	movl	%eax, -12(%ebp)
    	call	_rand
    	movl	%eax, -16(%ebp)
    	call	_rand
    	movl	%eax, -20(%ebp)
    	leal	-4(%ebp), %ecx    ; リンクを渡して呼び出し
    	call	_quux.2
    	addl	-8(%ebx), %eax    ; ebx って壊されないの?
    	addl	$20, %esp
    	popl	%ebx
    	popl	%ebp
    	ret
    .globl _foo
    	.def	_foo;	.scl	2;	.type	32;	.endef
    _foo:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$24, %esp
    	call	_rand
    	movl	%eax, -4(%ebp)
    	call	_rand
    	movl	%eax, -8(%ebp)
    	call	_rand
    	movl	%eax, -12(%ebp)
    	movl	%ebp, %ecx          ; この関数の ebp をリンクとして ecx に
    	call	_bar.0
    	addl	-12(%ebp), %eax
    	leave
    	ret
    
    

    で、この innner 関数へのポインターを使ってごにょごにょするときには 変数が期待通り見えるようにするために、↑なことや、 shinh さんのところで書かれている(トランポリン)ようなことが必要になるわけです。

    いまどきは、スタックに限らず動的にコードを生成してそこに飛び込むようなのって いろいろ面倒なのよね。仕事で一回引っかかったし (という話もちょっと懇親会でした)。

    ■_ Scala → Java (の class)

    これも話題に。というかわたしが振ったんですが。

    I Am Chris - A Look at How Scala Compiles to Java
    
    Hello. My name is Chris, I am a software developer, this is where I blog about it.
    
    November 11, 2009
    
    A Look at How Scala Compiles to Java
    
    Consider this contrived example, based on an example from Beginning Scala. The point 
    of the snippet was to demonstrate the congruency between using the higher-order 
    functions map, flatMap, foreach, and filter (see Iterable), and performing the same 
    operations inside a for comprehension.
    
    このコード片のポイントは
    
    
    object App {
    	
    	def isEven(i: Int) = i % 2 == 0
    	
    	def isOdd(i: Int) = i % 2 == 1
    	
    	def main(args: Array[String]): Unit = {
    		val n = (1 to 10).toList
    		n.filter(isEven).flatMap(i => n.filter(isOdd).map(j => i * j))
    	}
    	
    }
    
    Save this code to a file named App.scala, or anything you want (scala doesn't have the
    same file/class name restrictions as java). Assuming you chose App.scala, compile it:
    
    このコードを App.scala という名前か、あるいは何かあなたのお好みの名前で保存します
    (scala には Java にあるようなファイル名とクラス名を同じにしなければならないという制限
    はありません)。ここであなたが App.scala という名前を選択したと仮定し、コンパイルします:
    
    clewis$ scalac App.scala
    
    Now check out the generated class files (ls App*class). You should see the following:
    
    そして生成されたクラスファイル群を (ls App*class で) 確かめます。
    以下のような結果になるでしょう:
    
    App$anonfun$main$1.class
    App$anonfun$main$2$anonfun$apply$1.class
    App$anonfun$main$2$anonfun$apply$2.class
    App$anonfun$main$2.class
    App$.class
    App.class
    
    Why were 6 classes compiled from this one singleton definition? Let's start with
    App.class and App$.class.
    
    なぜひとつの singleton definition から6つのクラスがコンパイルされているのでしょう?
    では App.class と App$.class から始めます。
    
    The Singleton Object
    シングルトンオブジェクト
    
    Scala does away with Java's statics. Instead we get singleton objects, which are
    declared with a syntax similar to that used for class declarations, but using the
    object keyword instead. When a singleton object shares the same name as a class, it
    becomes that classes “companion” object. Companion objects have special privileges,
    including access to private instance fields on instances of the companion type. In
    this example, App is simply a singleton object, since we haven't also defined a class
    named App.
    
    Scala は Java の statics とクラス定義に使われるものと同様の構文によって宣言されたシン
    グルトンオブジェクトを手に入れる代わりに、object keyword を使用します。あるシングルト
    ンオブジェクトがあるクラスと名前を共有していた場合、そのクラスは“companion”オブジェ
    クトとなります。companion オブジェクトはcompanion 型のインスタンスにあるフィールドの
    private インスタンスに対するアクセスを含む特別な権限 (privileges) を有します。この例で
    は App という名前を持ったクラスを同時に定義していないのでApp は単純なシングルトンオブ
    ジェクトです。
    
    
    The Scala compiler implements companion objects by generating an anonymous class
    inside the companion class (the class of the same name as the object). The same is
    done for singleton objects, but the compiler also generates the containing class. Like
    the Java compiler, Scala names anonymous the class as [class name]$. Because we
    created an object named App, we get 2 classes: App and App$.
    
    Scala コンパイラーは (オブジェクトと同一の名前を持ったクラスである)  companion クラス
    の内部に無名クラス (anonymous class) を生成することにより companion オブジェクトを実
    装します。シングルトンオブジェクトに対しても同じことが行われますが、コンパイラーは 
    containing クラスも同様に生成します。Java コンパイラーに似て、Scala は無名クラスに  
    [class name]$ のような名前をつけます。わたしたちは App という名前のオブジェクトを生成
    したので、App と App$ という二つのクラスを手に入れます。
    
    
    Higher Order Functions and Their Function Arguments
    高階関数とその関数引数
    
    In Scala, functions are objects; instances of one of the FunctionN traits. Of course
    this knowledge isn't obvious by the Scala syntax, and that's part of the beauty: it
    just feels right. The compiler compiles any functions down to anonymous classes inside
    the containing class. If you understand Java's scoping rules for inner classes, then
    you should now have some understanding of how Scala implements closures.
    
    Scala では関数はオブジェクトであり、FunctionN traits のインスタンスのひとつです。
    もちろんこの knowledge は Scala の構文からは明らかではありませんし、
    and that's part of the beauty:
    it just feels right.
    Scala コンパイラーはすべての関数を containing クラスの内部にある無名クラス群
    (anonymous classes) にコンパイルします。もしあなたが Javaの内部クラスに関するスコープ
    ルールを理解しているのなら、Scala がどのようにクロージャーを実装しているかについても多
    少は理解していることでしょう。
    
    
    Methods in Scala are also different from functions. Methods are functions defined as
    part of a class definition with the the def keyword. Functions are instances of one of
    the FunctionN traits, and the Scala syntax provides several different ways to express
    them tersely. Methods are the only primitives (non-objects) in Scala, but the compiler
    makes it easy to promote methods to function instances. Back to our example, notice
    that we define the methods isEven and isOdd in our singleton object. They are method
    primitives, not functions. Because the compiler recognizes that methods often want to
    be treated as functions, it makes provisions; one such provision is that we can pass a
    method to a higher-order function.
    
    Scala におけるメソッドは関数とは異なるものです。メソッドは def キーワードを使ってクラ
    ス定義の一部として定義された関数です。関数は FunctionN traits のインスタンスのひとつで
    あり、Scala の構文はメソッドと関数のそれぞれを簡潔 (tersely) に表現する別々の方法を提
    供しています。メソッドは Scalaにおける (オブジェクトではない)ただひとつのプリミティブ 
    (primitives)ですが、コンパイラーはメソッドを関数インスタンスへと promote するのを簡単
    にしています。
    it makes provisions;
    one such provision is that we can pass a method to a higher-order function.
    
    
    
    
    Method Promotions
    メソッドのプロモーション
    
    In order for the compiler to promote a method to a function instance, it must create
    an anonymous class for that instance. In our example, we first pass the method isEven
    as an argument to the higher-order function filter, and so the compiler generated the
    class App$anonfun$main$1, which is our promoted method. Note that we also pass the
    isOdd to a subsequent call to filter, a promotion for which the compiler generated the
    class App$anonfun$main$2$anonfun$apply$1.
    
    コンパイラーにメソッドを関数のインスタンスに promote させるためには、そのインスタンス
    のための無名クラスを生成しなければなりません。わたしたちの例では、最初に isEven メソッ
    ドを高階関数フィルターに引数として渡し、そしてコンパイラーはメソッドを promote した結
    果であるApp$anonfun$main$1 クラスを生成しました。isOdd も後続のフィルターの呼び出しで
    渡していて、promotion によってコンパイラーが App$anonfun$main$2$anonfun$apply$1 という
    クラスを生成していることに注意してください。
    
    
    Function Literals
    関数リテラル
    
    We've covered all but 2 of the generated classes. As it turns out, there are still 2
    functions we haven't discussed in the series of transformations. Take another look:
    
    n.filter(isEven).flatMap(i => n.filter(isOdd).map(j => i * j))
    
    Did you see them? If you're new to Scala, you may not spot them at first because they
    are using function-literal syntax. The functions flatMap and map also take functions
    as arguments, and so we define them literally, embedding the one passed to map inside
    the one passed to flatMap. For these two function literals, the compiler generated the
    anonymous classes App$anonfun$main$2 and App$anonfun$main$2$anonfun$apply$2.
    
    こういったものを見たことがありますか? あなたが Scala に慣れていないのなら、関数リテラ
    ル構文 (function-literal syntax) を使っているので最初は指摘することができないかもしれ
    ません。flatMap と map もまた引数として関数を受け取るので、わたしたちはそれをリテラル
    で定義してflatMap に渡すひとつの内部で使っているmap へもうひとつを埋め込みます。
    App$anonfun$main$2 と App$anonfun$main$2$anonfun$apply$2 というこれら二つの関数リテラ
    ルに対して、コンパイラーは App$anonfun$main$2 と App$anonfun$main$2$anonfun$apply$2
    という無名クラスを生成します。
    
    
    To seal in what's happening here, fire up the Scala REPL and run this code:
    
    List(1,2,3).map(j => j + 1)
    
    Now run this code:
    
    List(1,2,3).map(new Function1[Int, Int] {
    	override def apply(j: Int) = j + 1
    })
    
    The two do the exact same thing, because they are exactly the same.
    
    これら二つは全く同一のことを行います。
    それは、二つが全く同一のものだからです。
    
    The literal syntax may look strange, and even non-obvious at first. I thought so too, 
    but it didn't take long for me to greatly appreciate and recognize it as easily as you 
    might recognize a class definition.
    
    リテラル構文は奇妙なものに見えたり、最初は non-obvious であるとさえ思うかもしれません。
    わたしもそうでしたが、
    to greatly appreciate and recognize it as easily as you might recognize a class definition.
    長い時間はかかりませんでした。
    
    
    
    A Word on the Class Names
    クラス名にある word
    
    You may have noticed a pattern in the anonymous function class names. For starters, 
    they're prefixed with App$anonfun$main$ and then continue in with 1.class and 2.class. 
    There's also another level nested inside the first level. If you inspect each of these 
    using javap -c [class], you'll notice the ordering and nesting follows the order in 
    which we use function objects (by passing them as arguments to other functions).
    
    あなたは無名関数のクラス名にあるパターンに気がついたかもしれません。
    For starters, 
    they're prefixed with App$anonfun$main$ and then continue in with 1.class and 2.class. 
    first level の内側にはネストした別のレベルがあります。javap -c [class] を使ってこれら
    のそれぞれを inspcet したならば、ordering と nesting はわたしたちが関数オブジェクトを
    使った順番(by passing them as arguments to other functions)に従っているのに気がつくで
    しょう。
    
    
        * isEven is the first function we pass, so it is the first function for which an
          anonymous class is generated, yielding App$anonfun$main$1.
    
          isEven はわたしたちが pass した最初の関数で、無名クラスに対して
          App$anonfun$main$1 として生成された最初の関数になります。
    
        * The second is the literal function passed to flatMap, so App$anonfun$main$2 is 
          generated for it.
    
          二番目はflatMap に渡されたリテラル関数で、 App$anonfun$main$2 がそのために
          生成されたものです。
    
        * The third is isOdd, yielding the class App$anonfun$main$2$anonfun$apply$1. This 
          function is used inside the function passed to flatMap. It's the first function in 
          this scope, and it's nested, so its name reflects its nesting and order in the 
          sequence.
    
          三番目が isOdd で、App$anonfun$main$2$anonfun$apply$1 クラスを yielding します。
          この関数は flatMap に渡される関数の内側で使われます。これはこのスコープでの最初の
          関数でありかつネストしているので、その名前はネスティングとシーケンスとを反映して
          います。
    
        * Finally we arrive at the literal function passed to map>, resulting in 
          App$anonfun$main$2$anonfun$apply$2. It's the second function referenced inside the 
          function passed to flatMap, and so its name also reflects its nesting and order.
    
          最後は map> に渡されるリテラル関数で、その結果は
          App$anonfun$main$2$anonfun$apply$2 となります。これは flatMap に渡された関数の
          内部で参照される二番目の関数であり、その名前もやはり nesting と order を反映した
          ものとなります。
    
    This ordering and nesting is deliberate. In Java, an inner class has access to its 
    parent's scope, which includes class instance variables and local variables (if the 
    inner class was created in a method). This is what makes closures in Scala possible. 
    Look again at the literal function passed to map:
    
    この ordering と nesting は deliberate です。Java では、内部クラスはその親のスコープに
    アクセス可能です。それにはクラスのインスタンス変数やローカル変数も含まれます(その内部
    クラスがメソッドで作られたものであった場合)。これが Scala においてクロージャを可能とす
    るものです。map に渡されたリテラル関数を再度見てみましょう:
    
    n.filter(isEven).flatMap(i => n.filter(isOdd).map(j => i * j))
    
    The function multiplies a “free” variable i by its single argument j. Where did i 
    come from? Again, this function is defined inside another literal function passed to 
    flatMap. That function receives a single argument, which it labels i. Because the 
    function passed to map is nested inside the one passed to flatMap, it has access to 
    that scope. blog comments powered by Disqus	
    
    この関数は“自由”変数 i と単一の引数 j との乗算を行います。さて、この i はどこから来
    たのでしょうか?繰り返しますが、この関数は flatMap に綿去られた別のリテラル関数の内部で
    定義されたもので、i というラベルの付いた引数を一つ受け取る関数です。map に渡された関数
    は  nested inside the one passed to flatMap なので、そのスコープに対してアクセスができ
    ます。
    
    12:43am  |   URL: http://iamchrislewis.tumblr.com/post/239967776/a-look-at-how-scala-compiles-to-java
    
    

    2010年10月09日

    ■_

    Types and Programming Languages
    の読書会に行ってまいりました。 まとめとかはあとで。

    Amazon.co.jp: Category Theory (Oxford Logic Guides): Steve Awodey: 洋書
    懇親会で教えてもらった本。「数学者向けではない」本らしく。

    ■_ dereference

    わたしが初めて dereferce なる用語を見たのは Perl のドキュメントででかなあ。 C や C++の本なんかでは全然見覚えがなかった(その当時)。

    
    C++相談室 part84 
    927 デフォルトの名無しさん [sage] 2010/10/09(土) 02:23:03 ID: Be:
        ポインタ型(あるいはそれを模したイテレータやスマートポインタなどの型)の変数から
        *演算子で値を得る行為をなんと呼べばいいでしょうか。
        「デリファレンス」だと思っていたんですが、実際口にしてみたら通じなかったもので……
        どういう言い方が一般的なんでしょうか。
    
        int x = 100;
        int *px = &x;
        int y = *px; // ← ココ 
    
    928 デフォルトの名無しさん [sage] 2010/10/09(土) 02:26:20 ID: Be:
        dereferenceが唯一のただしい言葉だ。
        「デリファレンス」は所詮、鮨をSushiと記述するのと同じぐらいの正しさでしか無い。
    
    929 デフォルトの名無しさん [sage] 2010/10/09(土) 02:30:49 ID: Be:
        >>927
        一般的には「ポインタの値をとる」とかいっちゃうかな?
    
        ポインタの値とかいうと、アドレス値をさしちゃいそうな気もするけれど、
        Cでプログラム書く場合、アドレスがいくつであるかってのは基本的に気にしないから、
        それで通じちゃう。
    
        ま、デリファレンスで通じないのも辛いところだがw
    
    930 デフォルトの名無しさん [sage] 2010/10/09(土) 02:32:14 ID: Be:
        便乗するけど、int *px = &&x; この行為は何という?
        "reference" でいいのかな。 
    
    931 デフォルトの名無しさん [sage] 2010/10/09(土) 02:38:41 ID: Be:
        間接参照? 
    
    932 デフォルトの名無しさん [sage] 2010/10/09(土) 02:46:37 ID: Be:
        >>930
        どの行為だよ?
    
        int * pxは int *型の変数pxの宣言と定義。
        = &xはその初期化子。
        &xはxに&演算子を適用した式。
    
        オブジェクトへのアドレスを得るという事ならば、
        規格では、「アドレスを取る」(実際には、大抵受身で使われている)という言い方もされているがな。
    
    933 デフォルトの名無しさん [] 2010/10/09(土) 09:23:37 ID: Be:
        質問です。以下のコードを g++ でコンパイルすると
        sort.cpp:21: error: no matching function for call to ‘sort(int [4], int*, main(int, char**)::Functor)’
        とエラーになります。その場で関数オブジェクトを定義したい時はどうすればいいでしょうか?
    
        #include <algorithm>
        int main(int argc, char* argv[])
        {
        int items[] = { 4, 3, 1, 2 };
        int num_items = sizeof(items) / sizeof(items[0]);
    
        struct Functor {
        bool operator ()(int lhs, int rhs) {
        return lhs > rhs;
        }
        };
    
        std::sort(items, items + num_items, Functor());
    
        return 0;
        }
    
    937 デフォルトの名無しさん [sage] 2010/10/09(土) 10:07:31 ID: Be:
        ttp://codepad.org/nwZhGigW
    
        static関数なら通るけどこれじゃ状態が持てないよね 
    
    944 デフォルトの名無しさん [sage] 2010/10/09(土) 11:01:25 ID: Be:
        >>937は>>933への回答?
        それでよさげだけど
    
        dereferenceは「参照剥し」とか言われてた時代がなかったっけか? 
    
    945 デフォルトの名無しさん [sage] 2010/10/09(土) 12:43:23 ID: Be:
        いや、今でも参照剥がしって言うよ。 
    
    946 デフォルトの名無しさん [sage] 2010/10/09(土) 13:02:38 ID: Be:
        ふつう、参照先取得だろ。 
    
    947 デフォルトの名無しさん [sage] 2010/10/09(土) 13:04:53 ID: Be:
        dereferenceの日本語訳については
        C++ Labyrinth
        ttp://www.fides.dti.ne.jp/~oka-t/cpplab-dereference.html
        ここでも取り上げられていたな。
    
    948 デフォルトの名無しさん [sage] 2010/10/09(土) 13:08:18 ID: Be:
        >>947
        参照剥がしってしっくり来るし必殺技ぽくってかっこよくね? 
    
    949 デフォルトの名無しさん [sage] 2010/10/09(土) 13:36:20 ID: Be:
        「参照剥がし」だとコピーが行われているって感じが出ない。
        あとなんか、「剥がす」っていう言葉を聞くと羅生門の情景が目に浮かぶ。 
    
    950 デフォルトの名無しさん [sage] 2010/10/09(土) 13:39:01 ID: Be:
        参照剥がしたら実態が行方不明になっちゃうイメージ
        実体化とかがいいと思う 
    
    951 デフォルトの名無しさん [sage] 2010/10/09(土) 13:42:22 ID: Be:
        実体化じゃ、インスタンス化と区別つかんと思うが。 
    
    
    

    必殺技…w

    ■_

    ちょっと前の話題ですが。

    まあこのエントリの本題はどうでも良くて

    
    Shedding Bikes: Programming Culture And Philosophy
    プログラミングの文化と哲学
    
    By Zed A. Shaw
    
    Mongrel2 Says, "Goodbye Python"
    
    I have just finished a difficult piece of work that removed all need for Python from 
    the default install of Mongrel2. There is now a totally C m2sh command that gets 
    installed by default and requires nothing but sqlite3 and ZeroMQ. We did this so that 
    people can install Mongrel2 and not have to care about any dependencies or whether 
    they're installing a rival language.
    (略)
    
    Since Mongrel2 is about being language agnostic, and C is the Latin of programming, 
    then I had to go with C. Hilariously enough, I took the time to make sure the new 
    config file format for m2sh was nearly perfectly backwards compatible with the old 
    file. This is pretty funny because I predict nobody will blink an eye at the config 
    file, even though it's basically Python.
    
    I find it very sad that people can't get past these stupid language wars to even use a 
    piece of software. I find it even more depressing that the same Linux distros that 
    benefited from Python are now basically screwing it over by locking their entire 
    system to antiquated versions. I can see 2.5 but 2.4? Hell we even found someone with 
    a 2.2 Python.
    
    Stupid.
    
    Getting Mongrel2 v1.1
    
    The transition to m2sh-c was slow because we had to make it as smooth as possible. It 
    still probably has bugs, but if you want to test it out and shoot us bug reports 
    download it and then install it.
    
    This release has a few other bug fixes, but hopefully by the end of the week the m2sh 
    will be solid and I can move on to actual things that make Mongrel2 better, rather 
    than routing around this stupid language war.
    

    ■_

    C is the Latin of programming か。なるほどねえ。

    世の中にはそのラテン語に古臭いの何のと文句つけたり それとは逆に新しくしよう(見せよう)という方々もいると。

    ■_ 本日の巡回から

    ■_ unmaintable

    半年放置してるのか。

    Program Design (プログラムの設計)
    
       The cardinal rule of writing unmaintainable code is to specify each fact in as
       many places as possible and in as many ways as possible.
    
       メンテ不能なコードを記述する cardinal rule はできるだけ多くの場所でその場所ごとで
       指示するようにせよ。
    
       - Roedy Green
      

    まあこつこつとは進めてたんですけどね。

    2010年10月08日

    ■_

    いやー、まだ上旬だけど今月ぴーんち。

    ■_ そんなお約束あったっけ?

    
    ある書籍で、見つけました、perlのソースについて | OKWave
    
    ある書籍で、見つけました、perlのソースについて疑問がありまして、お尋ねします。
    
    
    ※下記は、perl/cgiソースの一部です。
    ある書籍で見つけたものです。
    
    >require 'cgi-lib.pl';
    
    >&ReadParse(¥%test);
    私は、(%test)だと思っているのですが。
    ()の中の、先頭に「¥」を付けることに、どのような意味
    があるのでしょうか
    
    >$test = $test{'test'};
    仮に、$testの値が「"<&>"」だったとしまして、以下
    をごらん頂きたいのですが、
    
    >open(ファイルハンドル,$fname)
    >while(<ファイルハンドル>){
    >$test =~ s/¥"/¥&quot¥;/g;
    私の認識では、「s/"/"/g;」ではと思うのですが、
    「¥」はどのような意味なのでしょうか
    以下、3行も同じ疑問です。
    >$test =~ s/&/\&testmp\;/g;
    >$test =~ s/¥</¥&lt¥;/g;
    >$test =~ s/¥>/¥&gt¥;/g;
    >print $_;
    >}
    
    書籍で上記のソースを見たのですが、
    HTMLのフォームのテキストボックスに、「"<&>"」と入力し
    submitボタンで、上記コードを含む、cgiを開きます。
    
    そして、「"<&>"」を受取っても正しく、置換し、
    cgiから、HTML($fname)を開くプログラムです。
    
    置換後のHTMLファイルには、「"<&>"」と表示されます。
    
    
    以上、よろしくお願いいたします。
    
    
    質問者が選んだベストアンサー
    
    他の人と同じ内容なんですが、正式名称で説明します。
    
    \をPerlでは[バックスラッシュ](もしくは[逆スラッシュ])と呼びます。
    円記号で表示されるのは、日本のWindowsのみで
    特にプログラムでは不正確な表記です。
    
    
    Perlの \[逆スラッシュ] には幾つかの違う意味があります。
      [1]: メタ文字を定義する。
      [2]: インタプリタへの命令文を通常の文字列として解釈させる。
      [3]: リファレンスを抽出する。
    これらはPerl文法の1番基本の部分の一つです。
    
    
    [1]は誰もが(?)何気なく使っているであろう "\n" とかです。
    改行文字でもなんでもないのに、メタ文字として解釈され、
    内部で改行文字に置き返られます。
    こーゆー勝手に違う文字や、違う概念として扱われる文字をメタ文字と言います。
    
    
    [2]は、s/\"/\&quot\;/g; まさにこれです。
    この例では、;[セミコロン] で文が終了されずに通常の文字列として解釈されます。
    正規表現中は、通常の場合だと関数展開が行われないので、
    & の前方に \ はいらないのですが、プログラムは人間が読む物なので、
    関数展開しないと言う事を明示的に示すため、普通は \ を記入します。
    
    
    [3]は、詳しく言っても分からない予感がするので、適当に説明します。
    リファレンスはポインタ(アドレス)のようなものだと思ってください。
    全てのデータは、アドレスを持ってます。
    アドレスを「持ってる」と言より、アドレス上の「位置」にデータが存在します。
    その位置情報(リファレンス)を取り出します。
    
     /%test;
    これは、%test が持っている実体の位置です。
    どうゆうことかと言うと、変数は値を保有しているのではなく、
    変数は実際のデータ位置を知っていて、自由にアクセスできると言うことです。
    その位置(リファレンス)を変数に問い質して入手する時に \ を使います。
    なお、そのデータ(リファレンス)にアクセスする時は [デリファレンス]と呼びます。
    意味分からないと思いますが、今の段階では絶対分からないと思うのでスルーして下さい。
    
    
    
    一応、これらは基本なんでどこにでも書いてあると思いますので、
    知りたければ検索するとすぐ出てきます。
    あと、今回みたいな疑問が沸いた時、とりあえずコンパイルしてみるといいです。
    -cw で起動させると、実行なしのコンパイル、エラー内容が出力されます。
    
    ※なお、Perlは適当な書籍を買うと嘘だらけですので気をつけて下さい。
    オライリーの本の場合は初心者には難しいかもしれませんが、とりあえず適当な表現と嘘はないです。
    サイトだったらそこそこまともな所は多いです。
    http://www14.atpages.jp/jelfe/
    あと、実は付属のマニュアルが市販の本よりずっと性能いいです。
    
    投稿日時 - 2010-10-08 03:41:35
    
    お礼
    
    ご返信、ありがとうございます。
    気になっていたんですが、理解できました。
    
    
    ANo.2
    
    
    まず
    &ReadParse(¥%test);
    の \ は「リファレンス」を生成しています. サブルーチン ReadParse の中でハッシュ %test 
    の内容を変更しているんじゃないでしょうかね.
    
    あと,
    
    $test =~ s/¥"/¥&quot¥;/g;
    
    の 3個の \ のうち, 本当に必要なのは ; の前の 1つだけです. これは #1 が言われるように
    「文を終わらせる ; と区別するため」です. 他の 2つはなくても動作します.
    
    お礼
    
    ご返信、ありがとうございます。
    気になっていたんですが、理解できました。
    
    
    ANo.1
    
    「\」は次の文字が特殊文字のときに次の文字を普通の文字として認識してほしい時に使います。
    例えば「\\」は「\」文字を表します。「¥"」は「"」ですし「¥&」は「&」です。
    通常「%test」は連想配列を表しますし「;」は文章の終りを表すのでその前に\を置いて
    perlインタプリタが文字として認識してくれるようにしてます。その他も同様の理由で
    「\」を使っています。
    
    お礼
    
    ご返信、ありがとうございます。
    気になっていたんですが、理解できました。
    
    

    文字列を囲むクォート類に挟まれた ; がそうであるように、 s/// の間に ; を置いてもそこをステートメントの終わりとは取らないはずだけどなあ。 \n は(正規表現で使う)「メタ文字」じゃないし。

    ■_ はまり道

    Excel の VBA で。

    Sub Sample1()
       Dim Dic, i As Long, buf As String
       Set Dic = CreateObject("Scripting.Dictionary")
       For i = 2 To 8                      ''セルA2からセルA8までを処理する
           buf = Cells(i, 1).Value         ''セルの値を変数bufに格納する
           If Not Dic.Exists(buf) Then     ''まだ登録されていなかったら…
               Dic.Add buf, buf            ''セルの値を連想配列に登録する
           End If
       Next i
       MsgBox Dic.Count
       Set Dic = Nothing
    End Sub
    ↑ 一時変数に格納せずに dict.exists すると
    
    

    こーゆーパターンで、Dic.Exists(buf) のところを Dic.Exists(Cells(i, 1).Value) と書いたら

    ■_ もうひとつ Excel

    エクセル2007が使いづらくソフトを使って2003の配置にできるソフト - 質問・相談ならMSN相談箱 excel 2007 使いずらい - Google 検索 excel 2007 使いにくい - Google 検索 excel 2007 使いづらい - Google 検索

    いいと思うけどなあ 2003→2007。 リボンインターフェースも悪くないと思うし。

    ■_ バグ?

    やじうま watch で

    
    【やじうまWatch】 まもなくサイト開設10周年の「ちゆ12歳」の本が8年ぶりに出るらしい ほか -INTERNET Watch
    
    Xperiaの電卓機能で「6.8」が「6.799999999999」になるバグ発見
    
     Xperiaのファンサイト「XPERIA FAN」によると、Xperiaの電卓にバグがあるのが発見されたら
    しい。その内容とは、本来「6.8」となるはずの引き算を行うと、「6.799999999999」と表示さ
    れるというもの。コミュニティの投稿者によると、メーカーであるソニー・エリクソンのカスタ
    マーも同様の現象を確認しているものの、アップデートは未定とのことだ。あまりないタイプの
    バグであることは確かなようなのだが、コミュニティの書き込みおよびレスを通して、なぜか販
    売元のドコモに矛先が向いていたり、計算機の仕様に関する話題に流れていっているのが、面白
    いといえば面白い。
    
    

    なんか妙に既視感を覚える現象だねえと思いつつ記事の末尾にあったリンク先も見てみると

    
    電卓で、計算結果が間違ってる(バグ発見!) | XPERIA FAN
    投稿者:spike 投稿日時:2010/10/06(水) 21:26
    
    みなさん、こんばんは。
    早速ですが、本題に。
    
    今日仕事で、初めてxperiaの電卓機能を使いました。
    で、びっくり。
    
    電卓で答えを間違うの、初めて見ました。
    
    間違うと言っても、バグなので、なんとなく合ってるというか、なんというか。
    
    xperiaの標準ソフトの電卓を使って、以下の計算をしてみてください。
    
    7472.4 - 7465.6 =
    
    単純な、小数点を含む引き算です。
    
    980円の電卓結果は → 6.8
    です。机上でやっても、この答えですよね。
    
    しかし、xperiaは、
    6.799999999999
    
    間違って割り算したかと思い、3回ほどやり直してしまいました。
    
    これじゃ、電卓の信用問題になってしまう。
    
    今日、ソニー エリクソンのカスタマーに連絡いたしました。
    
    やはり、ソニーも現象を確認したとの事。
    で、これまで事例がないとの事で・・・。
    
    早くアップデートを希望したのですが、
    ”NTT docomoさんを無視して、自社だけではアップデートできないので・・・。近日
    中にアップデートする予定はありますが、まだ日程が決まっておりません。”
    
    なんとも、いや~な、しがらみ。
    
    日本の携帯事情を垣間見てしまいました。
    
    SIMロック解除。これを皮切りに、アフターユーザが使いやすい携帯市場になってくれることを希望します!!
    
    はやく、アップデートしろ!!!!!!!!!!!!!
    
    
    
    xperia電卓は使用しません。	
    投稿者:spike 投稿日時:2010/10/07(木) 00:03
    
    計算結果が信用できない計算機は、使用できませんね。
    はやくアップデートされ、安心して使える状態にしてほしいです。
    
    
    
    BCD浮動小数点演算は使わないんですかね?	
    投稿者:neko 投稿日時:2010/10/07(木) 07:19
    
    BCD浮動小数点演算は使わないんでしょうかねぇ。
    容量や性能面の制約があって使えないのだろうか、などと考えてしまいます。(勝手な憶測です)
    いずれにしても、現状の電卓は業務などでの微妙な計算では使わず、簡単な計算の用途にしか
    使えないだろうと思います。開発側もおそらく想定外でしょうねぇ。
    
    
    Javaの浮動小数点型の精度に依存する問題の様ですね	
    投稿者:neko 投稿日時:2010/10/07(木) 12:37
    
    Xperia以外の機種でも同様の誤差が生じる様ですので、問題はXperia固有ではなくAndroid、
    Javaの2進数での浮動小数点型の精度に依存する問題のようですね。
    
    ※Xperia設計時に独自の補正・対策を行っていない、とも言えますが、主原因はXperiaというよ
    りもJavaの浮動小数点型の精度でしょうかね。
    
    おもしろい	
    投稿者:kanchi 投稿日時:2010/10/06(水) 23:04
    
    2進の浮動小数点演算誤差がもろ出てる。
    演算時のビット数が少ないか誤差補正をしてないかですね。
    
    今まで関数が使えるRealCalcを使ってたので気が付かなかったよ。
    これもアプリだから信用問題になると不安はある。
    
    
    
    「正しい」計算結果とは?	
    投稿者:yoyo 投稿日時:2010/10/08(金) 00:43
    
    現在の大多数のCPUの浮動小数点計算は、そもそも、「正しい」計算結果を与えません。
    コンピュータの少数点数計算とはそういうものです。
    「微妙」な計算が、小数点数が関わる計算を指すなら、近似値しか得られないのは、
    「仕様」ですから、「対処」は非常に難しいでしょう。たとえば、
    Pythonでは
    Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
    [GCC 4.4.3] on linux2
    >>> 7472.4-7466.6
    5.7999999999992724
    
    Rubyでは
    irb(main):001:0> 7472.4-7466.6
    => 5.79999999999927
    
    計算速度はおそいけれど、10進数の計算結果に近い結果を得られるBCD計算を
    使った「電卓」なら、筆算に近い結果になるでしょう。
    
    
    
    —XPERIA FAN について—   —プライバシーポリシー—
    Copyright (C) 2010 XPERIA FAN All rights reserved.
    
    
    
    電卓で、計算結果が間違ってる(バグ発見!) | XPERIA FAN
    ほかのアンドロイド	
    投稿者:gogokou 投稿日時:2010/10/08(金) 14:48
    
    http://androidforums.com/motorola-droid/50310-calculator-error.html
    
    こちらにありますように2010年3月3日これと同じ数字のエラーに関する記載があります。
    
    ということで海外でもすでに話題になっていることがわかります。
    
    ここではRealCalcをつかうことを進めるコメントが多いですね。
    
    また海外で売られているXPERIA X10mini proではできている。
    これは1.6ですが1.1.A.0.8カーネルは2.6.29です。
    
    
    ってか	
    投稿者:typer 投稿日時:2010/10/08(金) 10:51
    
    6.8=6.7999~
    別に間違ってないですよ
    
    
    コンピュータって	
    投稿者:yoyo 投稿日時:2010/10/08(金) 11:57
    
    >>6.8=6.7999~
    ここで"~"が、無限個の9の並びなら、その通り。間違ってはいないですね。
    
    コンピュータで数値を扱った経験があれば、10進数小数のうち、正確に
    コンピュータが二進数で表現できるのはどれだけか、思い知ります。
    
    「電卓」は、できるだけ、筆算と同じ結果を出すようにしていますが、
    それでも、
    
    1/3 = 0.333333333333333333333333333333333333(以下無限に続く)
    とは表示できないですね。3の上に点をつけるといった工夫もできません。
    1/7 = ならどうしましょうか?
    
    
    ええっ	
    投稿者:Smith Doe 投稿日時:2010/10/08(金) 11:41
    
    あなたが言ってるのは、
    1.40 - 0.60 = 0.7999999
    で別に間違ってない、ということなのですが、異常さを自覚できてますか?
    
    あと、6.8は6.7999〜とイコールではありません。
    
    
    本題とは外れてきてますが…	
    投稿者:Cai 投稿日時:2010/10/08(金) 12:24
    
    循環小数である6.7999...(以下9が無限に続く)と6.8は数学的に「等しい」です。「等しいと考
    えてよい」ではなく。
    
    1.40-0.60の例でも、0.7999999(ある桁で止まってる)は0.8と等しくありませんが、0.799...(以
    下9が無限に続く)は0.8と等しいです。
    
    代数的な証明はたしか中学校の数学の教科書で見た記憶がありますし、無限等比級数として考え
    れば簡単に導けます。
    詳しくはWikipediaの0.999...を
    
    http://ja.wikipedia.org/wiki/0.999...
    
    
    電卓	
    投稿者:yoyo 投稿日時:2010/10/07(木) 23:47
    
    そうなら、いわゆる「電卓」としては欠陥があります。
    自分でも、Linux, MacOSX (ともにX86)のアクセサリの「電卓」では筆算の結果に一致しました。BCDでの計算をしているのでしょう。
    
    しかし、Linux, MacOSXのどちらでも、python, ruby で計算させるとちゃんと、
    倍精度の9が並ぶ近似的な結果になります。つまり、java, python, rubyでは浮動小数点計算を
    しましから、「正しい」結果がえられることは、まずなかなかありえません。
    
    だからこそ、計算をする人たちは、どれぐらい間違っているかを見積もるのに大変な苦労をしているのでせう。
    
    Androidの「電卓」ウィジェットは、計算をJVMに丸投げしているように思えます。
    つまり、あなたの計算をC, C++, Java, Python, Ruby などでコードを書いて
    実行したら、9が並ぶ近似値が得られるでしょう。今の大半のCPUはそういうものです。
    そのような「電卓」の「仕様」なら、BCD電卓ではないと、そう断るべきでしょうね。
    
    ちなみに、CPUにどのようなバグが隠れているかはなかなか分からないものです。
    X86には歴史的に有名なばぐがあり、fdivばぐはExcelのユーザが発見し、インテルが
    認めるまでに経緯がありました。私のパソコンのCPUでは、もちろんこれらは解消されています。
    
    fdiv_bug : no
    hlt_bug : no
    f00f_bug : no
    coma_bug : no
    
    BCD計算をするデスクトップパソコンとしては、カシオのものがありましたが、
    あまり売れなかったようデス。
    いわゆる関数電卓でも、三角関数の間違いを見つけたことがあります。
    
    
    バグというより,「仕様」だと思います	
    投稿者:phelix 投稿日時:2010/10/06(水) 23:41
    
    面白い結果で,興味深く拝見しました(^^)
    
    確かに人間から見ると違和感を覚える結果ではありますが,
    計算機(電卓含む)では,計算桁の最後の一桁に±1ぐらいの誤差が
    入るのは常に仕様であり,この例の結果はその範囲内なので,
    その意味では不思議ではない(必ずしもバグとは言えない)と思います.
    
    この「最後の一桁に入る誤差」が,具体的にどう入るかは,
    (いくつか国際的な規約はありますが)実際問題として計算機(電卓)に
    よりまちまちで,今回の計算は,たまたまxperiaの電卓にとって
    「運が悪かった」ものと言えると思います.
    他の計算機(電卓)でも,同じように「運が悪い計算の例」は,
    探せば必ずあるでしょう.
    
    少し問題が違ってしまうかもしれませんが,この「最後の一桁」の問題は,
    たとえば,
     1÷3×3 (=1)
    を計算してみれば分かります.これはほとんどすべての計算機で失敗する
    「運が悪い例」で,計算結果は,ほぼ例外なく 0.9999999... になるはずです.
    
    これらの問題は,計算機が,内部では数値を特別な形式(2進数)で
    理解しており,人間が眼で見ている「7472.4という数値」
    そのものとしては理解していない(それに非常に近いが,必ずしも
    一致した数値ではないものとして理解している)ことに起因します.
    
    
    ただし,xperiaの電卓の実装が,いささか迂闊かもしれない,という点には,
    私も同意します.(^^;
    
    まず,大方の電卓とは違った計算規則を採用していることは間違いなく,
    その点が(ユーザーにいらぬ不安を与えて)迂闊だと思います.
    
    さらに,今回の一件で色々テストしていて,以下のような例に気づきました.
    
    「1÷10000000 =」
     → 1E-7
    「+1 =」
     → エラー
    
    ※「」でくくった部分が,電卓に与えた命令です.
    
    正解はもちろん,1.0000001 です.
    
    1E-7 というのは,科学技術計算の表記法で,
    「10の-7乗」(1×10^{-7};^はべき乗を表す)の意味です.
    つまり,0.0000001 のことです.
    
    この表記が普通のユーザー(科学者・技術者ではない方々)にとって
    フレンドリーではない,という点はひとまずさておき,(それも問題ですが)
    それに1を足すという,当然許されるべき演算がエラーになるというのは,
    受け容れがたい実装です.
    
    現状では,関数電卓モードがある割に,それとしてはまったく使い物に
    ならないと思いますので,むしろこちらの方が深刻な気がします.
    
    
    自己フォローです. 見直していて気づきましたが,上の「1÷	
    投稿者:phelix 投稿日時:2010/10/07(木) 00:00
    
    自己フォローです.
    見直していて気づきましたが,上の「1÷...」の例は,
    2進表現のみならず「計算桁の有限性」によります.
    もとの例題の論点とごっちゃになりました.
    
    
    
    —XPERIA FAN について—   —プライバシーポリシー—
    Copyright (C) 2010 XPERIA FAN All rights reserved.
    
    

    なんか微妙に勘違いが入っているような気も。

    んで、ふつーの電卓だと表示桁は 8桁とか12桁だし、 double を使っていても有効桁が 16桁ばかしあるから この引き算のようなお茶目な結果を出さないようにできるんじゃないかなあ。

    でも 1E-7 + 1 でエラーになったってのは気になるな。

    数値計算の基礎―解法と誤差 The Art of Computer Programming (2) 日本語版 Seminumerical algorithms Ascii Addison Wesley programming series

    ■_ 本日の巡回から

    2010年10月07日

    ■_

    やる気がまったくございません。

    ■_ 比較

    性能的にはまあそんなもんなのかも知れないけど、この二つを比べますかw

    
    John Graham-Cumming: The Analytical Engine vs. The ZX81
    
    Thursday, October 07, 2010
    
    The Analytical Engine vs. The ZX81
    解析機関対 ZX81
    
    Many people got started with computing in my age group with the Sinclair ZX81 (which 
    in the US was sold as the Timex Sinclair 1000).
    
    わたしと同年代の人間の多くがコンピューティングを Sinclair ZX81 で始めました
    (このマシンはアメリカでは Timex Sinclair 1000として販売されていました)。
    
    Reading through Allan Bromley's excellent papers on Babbage's Analytical Engine (as 
    described in 1847) I thought it might be fun to compare the two machines.
    
    Babbage の解析機関 (1847年に説明されているように)についての Allan Bromley の
    すばらしい論文を読んでわたしはこの二つの機械を比較してみたら面白いのではないか
    と考えたのです。
    
    The ZX81 has 1KB of memory in which programs and data had to be stored. The Analytical 
    Engine would have had 50 variables capable of each storing a 30 digit decimal number. 
    That's equivalent to each variable having 100 bits and hence the memory for the 
    Analytical Engine would have been 3000 bits (375 bytes). At various times Babbage 
    proposed much larger memory sizes with up to 50 decimal digits per variables and 1000 
    variables: that would have been a memory of 166 bits per variable or over 20 KB of 
    memory.
    
    ZX81 はプログラムとデータを収めるための1KBのメモリーを持っていました。
    解析機関はそれぞれが30桁の十進数を格納できる変数を50個有していました。
    個々の変数は100ビットを保持できることと等価なので、解析機関のための
    メモリーは3000ビット(375バイト)となります。
    
    
    Critically, the Analytical Engine's programs would be stored on punched cards and 
    executed directly from them so that entire memory space was for data (not the program). 
    In contrast the ZX81 had to load the program from magnetic tape into its 1KB of RAM.
    
    解析機関用のプログラムはパンチカードに格納されて
    そこから直接実行されるので
    (プログラムではなく)データのためメモリー空間全体となります。
    対照的にZX81 では
    プログラムをロードしなければなりませんでした
    磁気テープから1KBのRAMへと
    
    
    
    But the ZX81 was much, much faster than Babbage's machine. It had a clock speed of 
    3.25 MHz. The Analytical Engine was based around a standard cycle time of 1/7s which 
    is the same as 7Hz. To get an idea of the speed of the machines, here's a comparison 
    of a 100 bit add on the two machines.
    
    しかしZX81は Babbageの機械よりもずっとずっと高速です。
    ZX81 のクロックスピードは 3.25MHz です。
    解析機関は
    それは7Hzに等しいものです。
    
    
    On the Analytical Engine it would take about three seconds to fetch the two numbers 
    from memory (the store) and perform the addition. Although this is long Babbage added 
    the ability to do a pipeline of multiple additions with overlapped reads from memory 
    and addition happened in parallel. The ZX81 does not have that ability.
    
    解析機関では
    
    On the ZX81 in Z80 assembler a 100 bit addition (which I've done as 13 8-bit additions 
    here) could be implemented as follows. I've assumed that IX and IY are pointing to the 
    operands in memory and that the result will be stored in the memory addressed by IY.
    
    
      LD  A,(IX+0)
      ADD A,(IY+0)
      LD  (IY+0),A
      LD  A,(IX+1)
      ADC A,(IY+1)
      LD  (IY+1),A
      LD  A,(IX+2)
      ADC A,(IY+2)
      LD  (IY+2),A
    
      [...]
    
      LD  A,(IX+12)
      ADC A,(IY+12)
      LD  (IY+12),A
    
    
    Each instruction there takes 19 clock cycles and there are a total of 39 instructions 
    giving 741 clock cycles. With the Z80 running at 3.25MHz that set of instructions 
    takes 0.228 ms. So for that addition the ZX81 would have been 13,000x faster.
    
    各命令は 19クロックサイクルを要し
    合計で 39個の命令があるので
    741クロックサイクルとなります。
    3.25MHz で動作する Z80 では
    これらの命令群を実行するのには 0.228ms かかります。
    
    
    Obviously, this is slightly bogus because there are other more complex and slow 
    instructions in the Analytical Engine (such as division) but it gives an idea of the 
    scale.
    
    明らかに、これは slightly bogus です。
    なぜならこの他にももっと複雑で遅い命令が解析機関にはありますが(たとえば除算)、
    それは idea of the scale を与えます。
    
    So, the ZX81 had much less RAM than the Analytical Engine (and who doesn't remember 
    all the trouble of fitting everything into RAM on those machines) and was forced to 
    use it to hold programs, but the Analytical Engine was slow in comparison.
    
    PS If you'd like to see the Analytical Engine built, read this.
    
    
    

    あれ。 Scala の Odersky 先生もシンクレアのこれを使っていた時期があるとかどこかで読んだ記憶が。

    ■_ 今日のAA

    記事自体はどーでもいいのですが、AAが気に入ったので。

    
    【放送事故】報ステで古舘さんがベンゼン環図を間違え、ノーベル化学賞受賞の鈴木章さんが半切れ :アルファルファモザイク
    215 殺し屋(東京都) :2010/10/06(水) 22:40:42.36 ID:Rsi+zdN+P
    【ベンゼン】
    
           ∧,,∧                   ∧,,∧
           (・ω・`)                  (´・ω・)
           (  U)                  (U  )
             `u-u\                 /u-u'
                \lヽ,,,lヽ_______________ノl,,ノl/
                o(;   )o───o(    ´)o
                / ヽ、  ヽ     >   / \   , へ、 _  ∧,,∧
      ∧,,∧     /   (_,ー、_j    'oー、_)   `o、(・ω・`/ (´・ω・)
     (・ω・`)   ,'- 、                   __/>o' ノ──U  )
     (  U──∠∠# )ヽっ              └//ー、_)    `u-u'
      `u-u'   `ーo-oヽ_) ∧,,∧         lヽ,,lヽ // 
              ヽ\ (`・ω・')       (  >ω)
                ヽ`(-o-o-)───┬'-o-o'
            ∧,,∧/0ー、_)~     `ー-、_)\∧,,∧
            (・ω・`)                (´・ω・)
            (  U)                (U  )
             `u-u'                 `u-u'
    
    
    228  庭師(宮城県) :2010/10/06(水) 22:41:15.53 ID:C/zzZVFu0
    >>215
    こんなのあんのかよ
    
    243 6歳小学一年生(catv?) :2010/10/06(水) 22:41:45.97 ID:upBXfGns0
    >>215
    素晴らしい
    
    244 もう4時か(東京都) :2010/10/06(水) 22:41:46.44 ID:zkWEUtOG0
    >>215
    なんでもあんのな
    
    248 編集者(神奈川県) :2010/10/06(水) 22:41:57.09 ID:a2T/ko7h0
    >>215
    すごーい
    
    249 行政書士(dion軍) :2010/10/06(水) 22:42:01.09 ID:Qndt9rFo0
    >>215
    何か無性にほほえましいなww
    
    254 タコライス(大阪府) :2010/10/06(水) 22:42:05.77 ID:gFMTg1F20
    >>215
    これいいなw
    
    261 コンサルタント(東京都) :2010/10/06(水) 22:42:21.19 ID:oP7OirkK0
    >>215
    かわいい
    
    262 VSS(東京都) :2010/10/06(水) 22:42:22.31 ID:ZCwaN6cb0
    >>215
    中の奴はもっと動きが欲しい
    
    263 殺し屋(チベット自治区) :2010/10/06(水) 22:42:25.38 ID:FUVxDZmfP
    >>215
    一匹が輪の中走り回ってないとおかしい
    
    269 消防官(東京都) :2010/10/06(水) 22:42:43.01 ID:DpZs9JtuP
    >>215
    こんなのあるんだ、すげーなw
    
    283 MPS AA-12(愛知県) :2010/10/06(水) 22:43:09.21 ID:rv9ZhfIH0
    >>215
    なんだよこれ
    かわいいだろ
    
    286 鳶職(長野県) :2010/10/06(水) 22:43:10.35 ID:xP8iqSNy0
    >>215
    なんでもあるなほんとw
    
    312 映画評論家(神奈川県) :2010/10/06(水) 22:43:58.60 ID:Rbpq1Nd/0
    >>215
    こんなのあったのかwwww
    
    321 金持ち(和歌山県) :2010/10/06(水) 22:44:22.82 ID:/3VVY0Ev0
    >>215
    かわいすぎだろw
    
    333 グラフィックデザイナー(広島県) :2010/10/06(水) 22:44:50.58 ID:9gcXcTeO0
    >>215
    初めて見た
    
    335 ツアーコンダクター(三重県) :2010/10/06(水) 22:44:56.00 ID:dfwnjKAE0
    >>215
    かわいい
    
    376 殺し屋(茨城県) :2010/10/06(水) 22:46:27.82 ID:/Ep9v8EuP
    >>215
    なにこれかわいい
    
    463 SR-25(群馬県) :2010/10/06(水) 22:51:16.16 ID:S5YAQFcl0
    >>215
    これ見れば素人でも何で間違ってるかわかりやすいな
    
    237 アニメーター(catv?) :2010/10/06(水) 22:41:33.07 ID:0hB9SIA30
    六角の頂点って電子を表してるの?
    
    266 ノンフィクション作家(チベット自治区) :2010/10/06(水) 22:42:37.29 ID:X59OtYZW0
    >>237
    炭素
    
    311 ネイルアーティスト(広西チワン族自治区) :2010/10/06(水) 22:43:57.52 ID:+dhLxuycO
    >>237
    頂点はC
    で、そのCからHが一個ずつのびてる
    電子は、なんだかほわーっと六角形のあたりにいる
    
    
    【2ch】ニュー速クオリティ:【放送事故】報ステで古舘さんがベンゼン環図を間違え、ノーベル化学賞受賞の鈴木章さんが半切れ
    565 税理士(大阪府)2010/10/06(水) 22:56:39.54 ID:MBaxbBM70
    【ナフタレン】
      
     
     
             '
                 lヽ,,,lヽ_______________ノl,,ノl
                o(;   )o───o(    ´)o
                / ヽ、  ヽ     >   / \   , へ、 _  ∧,,∧
              /   (_,ー、_j    'oー、_)   `o、(・ω・`/ (´・ω・)
             ,'- 、                   __/>o' ノ──U  )    , へ、 _
           ∠∠# )ヽっ              └//ー、_)    `u-u'  \\(・ω・`/
           `ーo-oヽ_)  ∧,,∧        lヽ,,lヽ //               (  o' ノ
              ヽ\ (`・ω・')       (  >ω)                uー、_)
                ヽ`(-o-o-)───┬'-o-o'                    /
                 0ー、_)~     `ー-、_)\    ∧,,∧       ∧,,∧/
                                  \ (`・ω・')      ( `・ω)
                                    ('-o-o-)ニニニニ┬'-o-o
             `                       `u-u'      `ー-、_)
    
    621 行政書士(dion軍)2010/10/06(水) 23:00:07.56 ID:Qndt9rFo0
    >>565
    くそぅ、何で俺の教科書の図もこんなだったら良かったのに
    
    624 税理士(大阪府)2010/10/06(水) 23:00:22.71 ID:MBaxbBM70
    【アントラセン】
    
    
    
    
    
                 lヽ,,,lヽ_______________ノl,,ノl
                o(;   )o───o(    ´)o
                / ヽ、  ヽ     >   / \   , へ、 _  ∧,,∧
              /   (_,ー、_j    'oー、_)   `o、(・ω・`/ (´・ω・)
             ,'- 、                   __/>o' ノ──U  ) \  , へ、 _
           ∠∠# )ヽっ              └//ー、_)    `u-u'  \\(・ω・`/     ∧,∧
           `ーo-oヽ_)  ∧,,∧        lヽ,,lヽ //               (  o' ノ     (・ω・)
              ヽ\ (`・ω・')       (  >ω)                uー、_)────U   )\
                ヽ`(-o-o-)───┬'-o-o'                    /       `u-u'\\
                 0ー、_)~     `ー-、_)\    ∧,,∧       ∧,,∧/           ∠∠# )ヽ
                                  \ (`・ω・')      ( `・ω)             o-oヽ_)
                                    ('-o-o-)ニニニニ┬'-o-o    ∧,∧      ∧,,∧ /
             `                       `u-u'      `ー-、_) \  (・ω・)     (`・ω・) /
                                                   \(-o-o-)ニニニニ(o-oヽ/
                                                      0ー、_)~   0ー、_)
    
    
    
    
    641 薬剤師(石川県)2010/10/06(水) 23:01:37.60 ID:lKFQbimZ0
    >>624
    なごむな
    
    716 幼稚園の先生(栃木県)2010/10/06(水) 23:05:59.09 ID:rsI8bI6H0
    >>624
    ここいら変になると乱闘もものすごいんじゃないの
    
    731 宗教家(東日本)2010/10/06(水) 23:06:52.28 ID:8Z5pvoYj0
    >>624
    そんな図だったら勉強する気になったのに・・・w
    

    ■_

    
    Wouter's Wiki : Sloppy
    
    modified: 2010/10/2
    
    This tool will scan all source code in a folder and generate a report on how “sloppy” 
    the code is… sloppiness being a measurement of a repetitive code style: under 
    abstraction (copy / pasting) and over abstraction (pointless complexity).
    
    このツールはあるフォルダーに存在してるすべてのソースコードをスキャンして
    そのコードがどれほど“sloopy”であるかについてのレポートを生成します。
    sloopiness とは、repetitive なコーディングスタイル、抽象化の不足
    (コピペ) と過剰な抽象化 (的外れな複雑さ) の指標です。
    
    
    It does its analysis on a token level, i.e. strips away all white-space &
    comments, and parses all syntactical elements into its smallest indivisible units, 
    such as “if” ”(” “count” ”==” “100” ”)”, etc.
    
    解析はトークンレベルで行われます。つまり、すべての空白やコメントは剥ぎ取られ、
    すべての構文要素を “if” ”(” “count” ”==” “100” ”)”などのような
    独立している最小の単位へと解析します。
    
    It then finds matches across all code, a match being either a verbatim copy of the 
    same set of tokens, or with minor token differences of 0 to 2 tokens at a time. E.g. 
    two blocks of code where in one ”-x” has been changed into “y” are still 
    considered a match.
    
    It computes a sloppiness factor for each match, which is a magic formula that takes 
    into account:
    
        * The length of the match. This is by far the biggest contributor, as the score
          goes up exponentially with it.
        * The amount tokens skipped while producing the match. More skips means more
          differences, so harder to refactor than verbatim matches.
        * The distribution of those skips
        * The distance between the two matches:
              o matches in separate files are considered worse than matches in the same file.
              o matches very close together are considered less harmfull.
              o matches on adjacent lines are considered the least harmfull, i.e. they
                make the redundancy very visually obvious.
        * whether tokens contained in the match are part of a function body or top level
          declaration, the former contributes more strongly to sloppiness. It assumes a
          function body is the first { } pair not preceded by any of the keywords class
          struct interface namespace enum.
    
    Sloppy then outputs the 10 highest scoring matches, indicating on which lines in which 
    files they occur, and a sample of the offending code. This is the lowest hanging fruit 
    you can focus on to improve code. Simply keep re-running the tool after changes until 
    you can't find anything to improve anymore.
    
    At the end, a “sloppiness per token” ratio is output, which you can use as a single 
    number representing current code quality. The number does not mean much in and of 
    itself, though I did tweak it such that 1 means well factored code, and higher is 
    worse, but your mileage may vary. It is mostly useful to see how one code base 
    improves over time, or to compare code bases of different authors implementing the 
    exact same feature set, such as with students.
    
    Think of it as a game: the 10 matches are the available quests, once you have 
    completed them, hand them in (re-run), and be rewarded with a better score. New quests 
    may become available then. Beat your high score, and those of others! :)
    
    Supported Languages
    
    The tool sofar has been geared towards C syntax style languages, i.e. it supports 
    C/C++ (extensions c/h/cpp/hpp/cxx/cc/inl), other C like languages 
    (cs/java/php/js/as/m/fx) should work great (only C# tested sofar). I also added 
    support for reading py/rb/pl/lua extensions, but I should add support for other 
    comment styles before these become useful. You can force the program to scan for a 
    custom extention with the -c option, e.g. -cbf
    
    It tokenizes in a generic fashion, assuming it is reading code which the compiler for 
    that language already approves of:
    
        * Single // and multi line /* */ comments (not nested)
        * Strings with ” or ', and with \” or \' escape characters & unicode prefix.
        * Numbers, supporting C style ints, floats, hex, octal, suffixes, scientific
          notation etc.
        * Identifiers made out of alpha numeric characters and _
        * Punctuation symbols from the set ()[]{},;
        * Operators from the remaining symbols. It assumes that if a set of these symbols
          ends in = or >, or is made up of all he same characters, it is a compound
          operator, otherwise they are individual operators. This covers the operators
          in pretty much all C like languages and beyond.
    
    (略)
    

    ■_ 構文

    
    
    Just another Ruby porter, 2010-10-a
    [awk] mawkとgawkとの違い
    
    これは知らなかった。gawkはそんなとこにprintが書けるのか。
    
    % mawk 'BEGIN{ for (i = 0; i < 5; print i++); }' 
    mawk: line 1: syntax error at or near print
    zsh: exit 2     mawk 'BEGIN{ for (i = 0; i < 5; print i++); }'
    % gawk 'BEGIN{ for (i = 0; i < 5; print i++); }'
    0
    1
    2
    3
    4
    
    
    

    気になったので調べてみました。

    まず mawk

    
    /********************************************
    parse.y
    copyright 1991-94, Michael D. Brennan
    
    This is a source file for mawk, an implementation of
    the AWK programming language.
    
    Mawk is distributed without warranty under the terms of
    the GNU General Public License, version 2, 1991.
    ********************************************/
    
    (略)
    
    /* for_statement */
    statement   :   for1 for2 for3 statement
                    { 
    		  int cont_offset = code_offset ;
                      unsigned len = code_pop(code_ptr) ;
    		  INST *p2 = CDP($2) ;
    		  INST *p4 = CDP($4) ;
    
                      code_ptr += len ;
    
    		  if ( p2 != p4 )  /* real test in for2 */
    		  {
                        p4[-1].op = code_ptr - p4 + 1 ;
    		    len = code_pop(code_ptr) ;
    		    code_ptr += len ;
                        code_jmp(_JNZ, CDP($4)) ;
    		  }
    		  else /*  for(;;) */
    		  code_jmp(_JMP, p4) ;
    
    		  BC_clear(code_ptr, CDP(cont_offset)) ;
    
                    }
                  ;
    
    for1    :  FOR LPAREN  SEMI_COLON   { $$ = code_offset ; }
            |  FOR LPAREN  expr SEMI_COLON
               { $$ = $3 ; code1(_POP) ; }
            ;
    
    for2    :  SEMI_COLON   { $$ = code_offset ; }
            |  expr  SEMI_COLON
               { 
                 if ( code_ptr - 2 == CDP($1) &&
                      code_ptr[-2].op == _PUSHD &&
                      * (double*) code_ptr[-1].ptr != 0.0
                    )
                        code_ptr -= 2 ;
                 else   
    	     {
    	       INST *p1 = CDP($1) ;
    	       code_push(p1, code_ptr-p1, scope, active_funct) ;
    	       code_ptr = p1 ;
    	       code2(_JMP, (INST*)0) ;
    	     }
               }
            ;
    
    for3    :  RPAREN 
               { eat_nl() ; BC_new() ;
    	     code_push((INST*)0,0, scope, active_funct) ;
    	   }
            |  expr RPAREN
               { INST *p1 = CDP($1) ;
    	   
    	     eat_nl() ; BC_new() ; 
                 code1(_POP) ;
                 code_push(p1, code_ptr - p1, scope, active_funct) ;
                 code_ptr -= code_ptr - p1 ;
               }
            ;
    

    UNIX v7 の。

    simple_stat:
    	  PRINT print_list redir expr
    		{ PUTS("print>stat"); $$ = stat3($1, $2, $3, $4); }
    	| PRINT print_list	
    		{ PUTS("print list"); $$ = stat3($1, $2, nullstat, nullstat); }
    	| PRINTF print_list redir expr
    		{ PUTS("printf>stat"); $$ = stat3($1, $2, $3, $4); }
    	| PRINTF print_list	
    		{ PUTS("printf list"); $$ = stat3($1, $2, nullstat, nullstat); }
    	| expr	{ PUTS("expr"); $$ = exptostat($1); }
    	|		{ PUTS("null simple statement"); $$ = nullstat; }
    	| error		{ yyclearin; yyerror("illegal statement"); }
    	;
    
    (略)
    
    for:
    	  FOR '(' simple_stat ';' conditional ';' simple_stat ')' optNL statement
    		{ PUTS("for(e;e;e)"); $$ = stat4(FOR, $3, $5, $7, $10); }
    	| FOR '(' simple_stat ';'  ';' simple_stat ')' optNL statement
    		{ PUTS("for(e;e;e)"); $$ = stat4(FOR, $3, nullstat, $6, $9); }
    	| FOR '(' VAR IN VAR ')' optNL statement
    		{ PUTS("for(v in v)"); $$ = stat3(IN, $3, $5, $8); }
    	;
    

    んで gawk。

    	/*
    	 * A simple_stmt exists to satisfy a constraint in the POSIX
    	 * grammar allowing them to occur as the 1st and 3rd parts
    	 * in a `for (...;...;...)' loop.  This is a historical oddity
    	 * inherited from Unix awk, not at all documented in the AKW
    	 * awk book.  We support it, as this was reported as a bug.
    	 * We don't bother to document it though. So there.
    	 */
    simple_stmt
    	: print { in_print = TRUE; in_parens = 0; } print_expression_list output_redir
    	  {
    		/*
    		 * Optimization: plain `print' has no expression list, so $3 is null.
    		 * If $3 is an expression list with one element (rnode == null)
    		 * and lnode is a field spec for field 0, we have `print $0'.
    		 * For both, use Node_K_print_rec, which is faster for these two cases.
    		 */
    		if ($1 == Node_K_print &&
    		    ($3 == NULL
    		     || ($3->type == Node_expression_list
    			&& $3->rnode == NULL
    			&& $3->lnode->type == Node_field_spec
    			&& $3->lnode->lnode->type == Node_val
    			&& $3->lnode->lnode->numbr == 0.0))
    		) {
    			static short warned = FALSE;
    
    			$$ = node(NULL, Node_K_print_rec, $4);
    
    			if (do_lint && $3 == NULL && begin_or_end_rule && ! warned) {
    				warned = TRUE;
    				lintwarn(
    	_("plain `print' in BEGIN or END rule should probably be `print \"\"'"));
    			}
    		} else {
    			$$ = node($3, $1, $4);
    			if ($$->type == Node_K_printf)
    				count_args($$);
    		}
    	  }
    (略)
    opt_simple_stmt
    	: /* empty */
    		{ $$ = NULL; }
    	| simple_stmt
    		{ $$ = $1; }
    	;
    
    (略)
    	| LEX_FOR '(' opt_simple_stmt semi opt_nls exp semi opt_nls opt_simple_stmt r_paren opt_nls statement
    	  {
    		$$ = node($12, Node_K_for, (NODE *) make_for_loop($3, $6, $9));
    	  }
    	| LEX_FOR '(' opt_simple_stmt semi opt_nls semi opt_nls opt_simple_stmt r_paren opt_nls statement
    	  {
    		$$ = node($11, Node_K_for,
    			(NODE *) make_for_loop($3, (NODE *) NULL, $8));
    	  }
    

    POSIX grammar allowing them to occur as the 1st and 3rd parts in a `for (...;...;...)' loop. This is a historical oddity inherited from Unix awk, not at all documented in the AK&W awk book. ということらしいから expr になっている mawk が特別?

    ■_ 本日の巡回から

    2010年10月06日

    ■_

    ・買った
    センゴク外伝 桶狭間戦記(4) (KCデラックス)
    つい最近ヤンマガ掲載のところまで収録されてるなあ。 次の巻で終わるとして、どの辺までの話になるのか、あるいはどこまで細かく書くのか。

    ■_

    
    Interview with Kalani Thielen: Trends in Programming Languages | NorthHorizon
    Interview with Kalani Thielen: Trends in Programming Languages
    
    Published by Daniel on 27 September 2010, 9:30 am under Coding, Lab49.
    
    Last week I interviewed colleague Kalani Thielen, Lab49's resident expert on 
    programming language theory. We discussed some of the new languages we’ve seen this 
    decade, the recent functional additions to imperative languages, and the role DSLs 
    will play in the future. Read on for the full interview.
    
    DM F#, Clojure, and Scala are all fairly new and popular languages this decade, the 
    former two with striking resemblance to OCaml and Lisp, respectively, and the 
    lattermost being more original in syntax. In what way do these languages represent 
    forward thinking in language design, or how do they fail to build upon lessons learned 
    in more venerable languages like Haskell?
    
    KT It’s a common story in the world of software that time brings increasingly precise 
    and accurate programs.  Anybody who grew up playing games on an Atari 2600 has 
    witnessed this firsthand.  The image of a character has changed from one block, to 
    five blocks, to fifty blocks, to (eventually) thousands of polygons.  By this modern 
    analog of the Greeks' method of exhaustion, Mario's facial structure has become 
    increasingly clear.  This inevitable progression, squeezed out between the increasing 
    sophistication of programmers and the decreasing punishment of Moore's Law, has 
    primarily operated at three levels: the images produced by game programs, the logic of 
    the game programs themselves, and finally the programming languages with which 
    programs are produced.  It’s this last group that deserves special attention today.
    
    以下略
    
    
    This work by http://northhorizon.net is licensed under a Creative Commons Attribution 3.0 United States License.
    Permissions beyond the scope of this license is available at http://northhorizon.net/license.
    
    

    ■_ 次の言語は?

    邦題達人プログラマーのあれですね。

    What's your next programming language? And why? - Stack Overflow
    
    In the book, The Pragmatic Programmer the authors suggest that you learn a new 
    language every year. With so many new languages these days, what will be your next 
    programming language and why?
    
    最近は新しい言語がずいぶんとあるけど、あなたが次に手を出そうとしているのは
    どの言語ですか? そしてそれはなぜですか?
    
    Personally I can't keep up with one new language a year, but I've been around a good 
    handful of different languages and that has been of great help to me in both my career 
    and the way I look at programming in general.
    
    

    ■_

    ■_

    
    Introducing Koi - A language that teaches the basics of language implementation
    
    Introducing Koi - A language that teaches the basics of language implementation
                      プログラミング言語の実装の基礎を教える言語
    
    Several months ago I started on a quest to learn more about how programming languages 
    work internally. Today I am releasing my first programming language: Koi.
    
    何ヶ月か前に、わたしはプログラミング言語が内部的にどのように動作しているのか
    についてより学ぶための quest を始めました。
    今日、わたしは自分の最初のプログラミング言語である Koi をリリースします。
    
    Koi is designed, above all else, to be a language whose implementation demonstrates 
    the basics of how to build a language in a straight-forward way.
    
    Koi は、言語を straight-forward way でどのように構築するかについての基本を
    implementation demonstrates する言語であるように設計されました。
    
    Most programming language implementations are written in low-level languages like C in 
    order to maximize performance, and this generally makes them very opaque and difficult 
    to follow.
    
    大部分のプログラミング言語の実装は、C のような低水準の言語で記述されています。
    それは性能を最大限に向上させるものですが、follow するのを opaque かつ困難なものに
    してしまっています。
    
    In order to avoid this problem Koi is written from the ground up in Ruby to make sure 
    that the implementation language never gets in the way of the intent of the code. Koi 
    will likely never be suitable for use as a production language, but that was never one 
    of its goals.
    
    そういった問題を排除するために Koi では根本から Ruby で記述して実装言語が
    never gets in the way of the intent of the code しないようにしています。
    Koi は決して production language (業務に使えるような言語) として使われるほどには
    suitable にはならないでしょうし、そういった方向は目標とするところではありません。
    
    
    Koi is an imperative, dynamic, weakly-typed language with first-class functions. Koi's
    syntax and features were influenced by Lua, JavaScript and Ruby. Additionally Koi 
    makes a special point of working very hard to be unambigous in its syntax so that it 
    is easy to write parsers for.
    
    Koi は命令型で、動的な、first-class の関数を備えた weakly-typed な言語です。
    Koi の構文と機能は Lua、JavaScirpt、Ruby の影響を受けたものです。
    加えて、Koi は構文が曖昧になってしまうのが非常に難しくなるようにされているので、
    パーザーを書くのが容易になっています。
    
    Code example:
    コードの例:
    
    An old-school ‘Blast Off!’ example in Koi:
    
     1 countdown = function( count )
     2   print( to_string( count ))
     3   print( ", " )
     4   if( count == 0 )
     5     return()
     6   end
     7   count = count - 1
     8   call( countdown, count )
     9 end
    10 
    11 call( countdown, 10 )
    12 
    13 print( "Blast Off!" )
    14 
    15 #=> 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, Blast Off!
    
    More code example are available at the Koi GitHub repository
    より多くのコード例が Koi Github リポジトリで入手できます
    
    Installation:
    インストール
    
    For ease of use Koi is packaged as a RubyGem and will automatically install its 
    dependencies. OSX and most flavors of Linux come with Ruby and RubyGems pre-installed 
    so you should just be able to type:
    
    簡単に使えるように Koi は RubyGemとしてパッケージされていて、
    必要とするものは自動的にインストールします。
    OSX や Ruby と RubyGms がプリインストールされている
    大部分の flaveors of Linux  ではただ単に次のようにタイプするだけで
    使えるようになるはずです:
    
    gem install koi-lang
    
    If you need to install Ruby please check the Ruby website for instructions
    もし Ruby をインストールする必要があるのなら、Ruby のwebサイトで手順を確認してください
    
    Usage:
    
    To run a Koi program simply type:
    
    koi /path/to/program
    
    Internals:
    
    The default toolchain for Koi is made up of several components, for more information 
    on each of them you can read the simple documentation at their respective GitHub pages:
    
    Koi のためのデフォルトのツールチェインはいくつかのコンポーネントからできていて
    それぞれについての情報は以下の、対応する GitHubのページにあるドキュメントで
    得られます:
    
        * Koi command-line interface: http://github.com/aarongough/koi
          Koi コマンドラインインターフェース
        * Parser: http://github.com/aarongough/koi-reference-parser
          パーザー
        * Compiler: http://github.com/aarongough/koi-reference-compiler
          コンパイラー
        * Virtual Machine: http://github.com/aarongough/koi-vm-ruby
          仮想機械
    
    Digging deeper:
    深く掘り下げる
    
    The overall system is designed to be simple at all costs and because of this reading 
    through and comprehending the entire system should take no more than a day or two for 
    a moderately experienced programmer.
    
    overall system は at all costs で シンプルなように設計されています
    そしてそれは moderately な experienced programmer が
    this reading through やシステム全体を comprehending するのに
    三日以上必要としないようにすべきだからです。
    
    
    The easiest way to read through the source code is to browse it online at GitHub
    
    ソースコードを read through する最も簡単な方法は GitHub をオンラインでブラウズすることです
    
    More info:
    
    For more info please check the documentation links listed above or feel free to 
    contact me at: aaron at aarongough.com
    
    

    ■_ Delphi にあって C# にないもの

    ちょっと古い記事ですが。

    
    Delphi Prism vs. CSharp - Delphi Prism
    Delphi Prism vs. CSharp
    From Delphi Prism
    Jump to:navigation, search
    
    This is the Delphi Prism Language area
    Areas can only be created/modified by sysops
    
    The obvious differences between Delphi Prism and C# are additional features in the 
    Delphi Feature Pack and the Object Pascal based syntax, which are very attractive for 
    developers skilled in Delphi for Win32, for example. However, the compiler adds a wide 
    range of extemely useful enhancements as well:
    
    The following is a list of language features that are available in Delphi Prism and 
    not available in C#:
    
    Compiler Feature
    コンパイラーの機能
    
    Description
    
    Named indexed properties
    名前による添え字付けを行うプロパティー
    
    C# can only access the default indexed properties. In Delphi Prism, you can define and 
    use other indexed properties using their name.
    
    Sets
    
    A set is a collection of ordinal values of the same type. Sets are a convenient way of 
    storing and accessing values that belong together.
    
    Parallel Support
    
        * Futures
        * Parallel Loops 
    
    Supply the async directive on a method and it will automatically run in a separate 
    thread. If the method returns values, these will become futures.
    
    Colon Operator 	
    コロン演算子
    
    This is essential to our nullable support, but it is also a surprisingly useful 
    feature for general coding. Basically, instead of using "." to access 
    members and get a NullReferenceException if they are nil, use ":" and the 
    call will be skipped for nil (and the result will be nil itself). For example:
    
    nullable をサポートするための肝。
    
    // only call dispose if the interface is implemented.
    IDisposable(SomeObject):Dispose;
    // access the 3rd parent of a control, where any level might be nil.
    x := Button:Parent:Parent:Parent;
    
    Inline Property Accessors
    インラインでのプロパティアクセサー
    #ってカタカナまみれ
    
    Define simple properties within the class declaration, without any extra setters/getters.
    クラス定義の中で単純なプロパティーを余計なセッターやゲッターを使わずに定義します。
    
    property Foo: String; // local field is implied;
    property Right: Int32 read Left+Width; // reader expression is provided in line.
    
    Class Contracts 
    クラスの構築
    
       1. you can define "public invariants" for the class, which will be 
          enforced every time any non-private method exits to validate the classes internal 
          structure (you can also define "private invariants" that will be
          enforced when private ones exit, as well). Invariants are a list of boolean
          expressions that must all be "true" for the class to be in a valid
          state.
    
       2. you can add "require" sections before the method body, and "ensure"
          ones after, to define pre and post conditions. Again, these are boolean
          statements that will be checked to be true. 
    
    Class References
    クラスの参照
    
    Define "class of X" types and virtual class methods (similar to Delphi for Win32).
    "implies" operator 
    
    This is mostly helpful for invariants or pre/post-conditions. Basically, the second 
    part only "needs" to be true if the first is; if the first is false, the 
    entire expression is true. this sounds odd, but consider
    
    これは invariants や pre/post-conditions のために mostly helpful です。
    基本的に、二番目のパートは一番目のパートが真であるときにのみ「必要」です。
    一番目のパートが偽であれば式全体は真となります。これは奇妙に思えるかもしれませんが
    次のような例を考えてみましょう
    
    require
       assigned(Customer) implies Customer.CreditRatio > 5;
    
    this translates too
    これも次のように変換されます
    
    require
       (NOT assigned(Customer)) OR (Customer.CreditRatio > 5);
    
    the above is much more readable.
    
    "case type of"
    
    Write a switch/case statement that executes different cases depending on the TYPE of a 
    certain object, i.e.
    
    case type MyControl of:
      Edit: // do something
      Button: // do something else
    end;
    
    Property Notifications 
    プロパティの通知
    
    These save a lot of boilerplate code. Attach the "notify" keyword to a 
    property as directive (like "virtual"), and the compiler generates all the 
    infrastructure and interfaces needed for property notifications to work (in C#, you'll 
    need to implement getters/setters, add interfaces to the class, etc).
    
    Enhanced Nullable Types
    拡張された Nullable 型
    
    Unlike C#, the Delphi Prism compiler provides full support for nullable types. You can 
    call their members and use them in expressions; there's extensive support for nullable 
    expressions - if any part that contributes to an arithmetic expression is 
    "nullable", the whole expression becomes nullable. if any part IS null, the 
    whole expression becomes null. For example:
    
    C#とは違って、Delphi Prism コンパイラーは nullable 型のフルサポートを提供しています。
    
    
    x: nullable Int32;
    y: Int;
    var a := x+y; // result is a nullable Int32;
    var b := 5*x; // if x is null, so is b.
    
    
    improved 'for each' loop 
    改良された 'for each' ループ
    
    for each matching x: Button in Controls do    // only run loop for buttons
                                                  // ボタンにのみ対するループを実行する
    // use i to count; also type of x is inferred automatically
    // from type of "Controls", if its a generic enum
    for each x in Controls index i do    
    
    
    'locked' directive
    'locked' 指令
    
    The locked directive allows methods, events and properties to be declared implicitly 
    thread safe.
    
    locked指令は、メソッド、イベント、プロパティがスレッドセーフであることを暗黙裏に宣言する
    ことを許します。
    
    Extended Constructor Calls
    拡張されたコンストラクターの呼び出し
    
    Set properties as part of the constructor call. This is especially useful if you're 
    not assigning to a local ref. For example:
    
    コンストラクター呼び出しの一部としてプロパティー群をセットします。
    これは特に有用です。
    
    
    Controls.Add(new Button(Width := 100; Height := 50));
    
    without this, you; would need a temp var for the button.
    これがないと、ボタンのための一時変数が必要となるでしょう。
    
    This is now possible with C# 3.0.
    これは C# 3.0でも可能となりました。
    
    
    Boolean Double Comparison  
    
    if 0 <= x < Count then //...
    
    
    Iteration delegation
    繰り返しのデリゲート
    
    The yield keyword supports delegation of the iterator to a second sequence.
    
    Empty Methods
    空のメソッド
    
    Supply the 'empty' directive on a method's interface declaration and you dont need to 
    define the empty method body.
    
    Exception Filters
    例外フィルター
    
    Catch selective exceptions not only based on type, but also based on any arbitrary 
    condition (supported by VB.NET, but not C#).
    
    raising/firing events
    raising/firing イベント
    
    You can specify the visibility for raising/firing events. In C#, only the class that 
    defines an event can fire it (from outside you can only add/remove handlers). In 
    Delphi Prism, you can write the following and descendants can fire the event:
    
    public
      event Foo:EventHandler protected raise;
    
    
    Prism-48h.png
    
    Area: Delphi Prism Language
    Compiler version: Oxygene 3.0
    
    

    ■_ 本日の巡回から

    ■_

    不調だ…

    2010年10月05日

    ■_

    Dropbox が不調のため、10/5 分の更新は明日まとめてやります。

    ■_

    
    ポインタを理解できないプログラマはもういらない 
    104 仕様書無しさん [] 2010/10/03(日) 19:59:37 ID: Be:
        ポインター(Pointer) は、「ポインティング(指し示す)」を行って獲物の位置を人間に知らせる鳥猟犬の総称。
        「ポインティング」とは、獲物の前方に立ち止まって、姿勢を低くして鼻先を突き出し、片足をあげるポーズのことである。
        さらにポインターは、人間の命令を受けて草むらに飛びこみ、獲物を飛び立たせることで、主人の射撃を助ける。
        性格は仕事を離れると、温厚、家族に甘えさえする。
        種類は英系ポインター、米系ポインターに大きく分けられている。 
    
    105 仕様書無しさん [sage] 2010/10/03(日) 20:01:27 ID: Be:
        ウルトラセブンに出てきた自動車だかの名前 
    
    106 仕様書無しさん [sage] 2010/10/03(日) 20:03:28 ID: Be:
        ポインターではない
        ポインタ。 
    
    107 仕様書無しさん [sage] 2010/10/04(月) 20:54:21 ID: Be:
        昔は巨乳の代名詞だった。 
    
    108 仕様書無しさん [sage] 2010/10/04(月) 22:45:31 ID: Be:
        JIS用語で長音記号書かないって決めてるだけで、ポインターって表記で通じるし、合ってるだろ。 
    
    109 仕様書無しさん [sage] 2010/10/04(月) 23:00:49 ID: Be:
        ttp://blogimg.goo.ne.jp/user_image/5d/e2/0746a47dd09cd0879891f6470915287d.jpg
    
        ポインタ。
        かっけー。 
    
    110 仕様書無しさん [sage] 2010/10/05(火) 08:37:30 ID: Be:
        関数引数なにそれって人が入ってきたから、
        ポインタがわからないぐらいどうってことないって思えてきた……。
        むやみやたらとクビを切るのはイクナイ!!って思ってた時期が僕にもありました……。 
    
    111 仕様書無しさん [sage] 2010/10/05(火) 08:59:43 ID: Be:
        引数がわからないって…… そいつプログラム組んだことあるのか……? 
    
    113 仕様書無しさん [sage] 2010/10/05(火) 14:30:56 ID: Be:
        関数ポインタは未だに使えないわ
        なんか怖くてな 
    
    114 仕様書無しさん [sage] 2010/10/05(火) 17:27:46 ID: Be:
        関数ポインタは怖くない。いつでも君の味方。 
    
    115 仕様書無しさん [sage] 2010/10/05(火) 18:38:51 ID: Be:
        使わないで済むように組めるなら、それに越したことはないよ。 
    
    

    最後の音引きはつけるんでなかったっけ。今は。

    ■_ Pegex

    同じ名前の同系統のライブラリを作っているみずしまさんの乱入を期待するところ

    Talks | トーク - YAPC::Asia Tokyo 2010
    Presenter       Ingy dot Net
    Time    2010-10-15 15:00:00
    Length  40min
    
    Abstract
    
    The best part of Perl 6 is "Perl 6 Rules", a "PEG" parsing 
    language and a replacement for Perl 5 regular expressions. It is a simple and readable 
    way to define new languages, including Perl 6 itself.
    
    "Ingy dot Net" has taken the best ideas from Perl 6 Rules and created an 
    "Acmeist" parsing language called "Pegex". Pegex can be used to 
    define new languages that work the same in Perl, Python, Ruby, JavaScript and any 
    other languages that support Pegex.
    
    In this talk, Ingy will show you how to use Pegex in Perl, as simply as using a regex. 
    He'll also demonstrate how he is using Pegex as the basis of his Acmeist projects like 
    "YAML", "TestML", "JSYNC" and "C'Dent".
    
    

    ■_ GHC

    メジャーバージョンが上がるんですね。

    Blog: Let generalisation in GHC 7.0 ? GHC
    Let generalisation in GHC 7.0 ¶
    
    GHC 7.0 has a completely new type inference engine. The old one had grown to resemble 
    the closing stages of a game of Jenga, in which making any change was a delicate 
    operation that risked bringing the whole edifice crashing down. In particular, there 
    were a dozen open bugs concerning type families that I had no idea how to fix.
    
    略
    
    Local polymorphism
    
    Consider this (contrived) program:
    
    {-# LANGUAGE ScopedTypeVariables #-}
    
    f :: forall a. a -> ((a, Char), (a, Bool))
    f x = (g 'v', g True)
        where
          g :: forall b. b -> (a,b)
          g y = (x,y)
    
    This polymorphism is expressed in g's type signature:
    
        * g is a polymorphic function, because it is applied both to the character 'v'
          and to the boolean True.
    
        * However, g is monomorphic in a, because g's body mentions x 
    
    The type signature g :: forall b. b -> (a,b) reflects these two points:
    
        * The "forall b" says that g is polymorphic in b. 
    
        * The a in the signature must is the a in the type of x. This type variable a is
          brought into scope, in the body of f, by the forall a in the type signature for f. 
    
    The LANGUAGE ScopedTypeVariables pragma (a) allows you to use an explicit "forall" in 
    the type signature for a function f, and (b) brings the forall'd type variables (a in 
    this case) into scope in the body of the function f.
    
    What has changed in GHC 7.0?
    
    GHC 6.12 will compile the above program without any type signatures at all. It infers 
    the polymorphic type for g. But, if you are using type families or GADTs, GHC 7.0 will 
    not. More precisely:
    
        * The flags -XGADTs or -XTypeFamilies, or the corresponding LANGUAGE pragmas, 
          imply the (new) flag -XMonoLocalBinds. 
    
        * With -XMonoLocalBinds, non-top-level (or local) let/where bindings are not 
          generalised. 
    
        * Remember that -fglasgow-exts implies -XGADTs and hence -XTypeFamilies. 
    
    So given the type-signature-free code
    
    {-# LANGUAGE MonoLocalBinds #-}
    f x = (g 'v', g True)
        where
          g y = (x,y)
    
    GHC 7.0 will reject the program with
    
    Foo.hs:6:17:
        Couldn't match expected type `Char' with actual type `Bool'
        In the first argument of `g', namely `True'
        In the expression: g True
        In the expression: (g 'v', g True)
    
    Why? Because the type of g is not generalised, so it can only be applied to either 
    Char or Bool but not both.
    
    略
    
      
    Why make this change?
    
    At first this change seems like retrograde step, so why did we make it? It's a long 
    story, but the short summary is this: I don't know how to build a reliable, 
    predictable type inference engine for a type system that has both (a) generalisation 
    of local let/where and (b) local type equality assumptions, such as those introduced 
    by GADTs. The story is told in our paper " Let should not be generalised" and, at 
    greater length, in the journal version " Modular type inference with local 
    assumptions".
    
    

    なんかよくわからんけど、おいおい解説記事もでるだろう(っておい

    ■_

    この名前見覚えがあるなあ。数字つきだし。

    
    ns12.mp ns13.tmp ns14tmpとは何でしょうか。 - 質問・相談ならMSN相談箱
    
    ns12.mp ns13.tmp ns14tmpとは何でしょうか。
    
    最近パソコンを立ち上げると、上記タイトルのファイルに問題が生じたため終了します。とメッ
    セージが出て、このエラーを送信するかどうか聞いてくるようになりました。
    
    これを直すにはどうすればいいのでしょうか。
    
    このサイト以外でもパソコンの動作は重く、システムを復元しようとしても、しばらく復元に取
    り掛かって結局復元出来ませんでした。となってしまいます。
    
    XPでノートパソコンです。簡単に直せるようなら直したいので、よろしくお願いいたします。
    

    ウイルスが入り込んでるような希ガス。

    ■_ Java って

    そんなことができたのか。

    
    C++相談室 part84
    654 デフォルトの名無しさん [sage] 2010/10/05(火) 16:18:10 ID: Be:
        class A {
        private:
            int size;
    
        public:
            int size() { return size; }
        };
    
        Javaだと通るんだけど…
        "再定義; 以前の定義は 'データ メンバー' でした。"というエラーが出るんだけどC++の仕様?
    
        回避するには、ユニークな名前にしないと、ダメ? 
    
    655 デフォルトの名無しさん [sage] 2010/10/05(火) 16:34:19 ID: Be:
        ダメ 
    
    656 デフォルトの名無しさん [sage] 2010/10/05(火) 16:37:22 ID: Be:
        >>654
        > Javaだと通るんだけど…
        C++は異世界です。
        名前の勉強をしてください。
    
    657 デフォルトの名無しさん [sage] 2010/10/05(火) 16:41:00 ID: Be:
        Javaには(メンバ)関数ポインタがないから、メソッド名が単独で現れることがないので。 
    
    658 デフォルトの名無しさん [sage] 2010/10/05(火) 16:49:07 ID: Be:
        ありがとうございます。
    
        class A {
        private:
            int size;
        public:
            void setSize(int size) { this->size = size; }
            int getSize() { return size; }
        };
    
        みたいにしなければならないんですね。
    
        とりあえず、元のソース書いた人間を恨みます。 
    
    659 デフォルトの名無しさん [sage] 2010/10/05(火) 16:55:56 ID: Be:
        かえってJava臭くなったのはなんでなんだぜ。
    
    660 デフォルトの名無しさん [sage] 2010/10/05(火) 17:01:57 ID: Be:
        get set
        という解決策を作るとはびっくりだ。
    
    661 デフォルトの名無しさん [sage] 2010/10/05(火) 17:04:09 ID: Be:
        アクセさが必要=設計に問題がある
        とか言い出す輩が登場 
    
    662 デフォルトの名無しさん [sage] 2010/10/05(火) 17:05:24 ID: Be:
        本物のプログラマはクラスメンバを隠蔽しない。 
    
    663 デフォルトの名無しさん [sage] 2010/10/05(火) 17:05:44 ID: Be:
        ならばJavaや.NETのライブラリ群は全滅だな。
        そういえばアクセッサうんぬん厨はいたね。 
    
    664 デフォルトの名無しさん [sage] 2010/10/05(火) 17:09:38 ID: Be:
        >>658
        とりあえず、
        int getSize() const {return size;}
        の方がいい 
    
    665 デフォルトの名無しさん [sage] 2010/10/05(火) 17:14:40 ID: Be:
        >>664
        constつけると、呼んだときに副作用がないことを保障するんだっけか? 
    
    666 デフォルトの名無しさん [sage] 2010/10/05(火) 17:16:26 ID: Be:
        うん、setアクセサは引数にconstをつけて、
        ついでにメンバ変数名とは違う名前にしといた方が安全。
    
        void setSize(const int value) { size = value; }
    
        さあ皆さん、宗教論争の始まりです。 
    
    667 デフォルトの名無しさん [sage] 2010/10/05(火) 17:22:54 ID: Be:
        本格的にJava => C++に移植するの初めてなんですよ。
        遮蔽や継承するので、アクセサメソッド経由にしたいんです。
    
        C++のリファレンスのような書き方知らないんで…
        Java臭くなってしまって、ごめんなさい。 
    
    668 デフォルトの名無しさん [sage] 2010/10/05(火) 17:23:09 ID: Be:
        sizeをsetできるっていう発想が不気味
        少なくとも素直にsizeに代入しただけで終わるはずはないと思う 
    
    669 デフォルトの名無しさん [sage] 2010/10/05(火) 17:26:00 ID: Be:
        const修飾子ですね。気を付けます。
    
        >>666さん
        一応、intel C/C++ コンパイラ / MSVC / GCCで確認したのですが、
        そのへんの変数のスコープは、大丈夫みたいでしたよ。 
    
    670 デフォルトの名無しさん [sage] 2010/10/05(火) 17:35:08 ID: Be:
        >>669
        まあそうなんだけど、アクセサを拡張するときに間違いのもとになる。
        おそらく、何かのサイズを変更する関数が単なるメンバ変数の書き換えで
        済みはしないだろ。機能を追加することになるはずだ。
        そのときのための保険をコストなしでかけられるんだから、かけといて
        損はないだろ? 
    

    ■_

    2010年10月04日

    ■_

    センゴク外伝桶狭間戦記が一週お休みでしょんぼりんぐ。

    ■_ 意外な流れで

    始まりはよくありがちな質問から。

    
    [ruby-list:47501] Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47501] Hash の制約について( Ruby1.8)
    From: 上田佳寛 
    Date: Fri, 1 Oct 2010 09:49:51 +0900
    
    皆様はじめまして
    
    Ruby を2週間前から学習開始しだしたウエダといいます。
    
    Hashですが、どの程度大きいものが作れるのかと思い
    簡単なプログラムを作ってみたのですが不明点が2点あります。
    
    (1) 最大サイズは決まっているのか?
        またはマシン(OS, ヒープサイズの設定等)による違いがある?
    (2) 最大サイズを超えたHashにデータを追加し続けるとどのような挙動になるのか?
        (上書きか、追加失敗か、そのときのキー値は?)
    
    というわけで、以下にソースを付けます。(動かすとかなり時間が掛かります。)
    ---cut cut
    #  新しいハッシュを作る
    friends = Hash.new
    i = 0
    while i < 5000000
    	i_s = i.to_s
    	friends[i_s.intern] = i.to_s
    	i = i + 1
    end
    puts "size = #{friends.size}"
    puts "friends[:0] = #{friends['0'.intern]}"
    puts "friends[:2097152] = #{friends['2097152'.intern]}"
    puts "i = #{i}"
    i = 0
    while i < friends.size
    	i_s = i.to_s
    	friends.delete( i_s.intern )
    	i = i + 1
    end
    puts "friends[:0] = #{friends['0'.intern]}"
    puts "削除されたi = #{i}"
    puts "削除後size = #{friends.size}"
    while i < 5000000
    	i_s = i.to_s
    	friends.delete( i_s.intern )
    	i = i + 1
    end
    puts "2度目の削除されたi = #{i}"
    puts "2度目の削除後size = #{friends.size}"
    -------まで
    
    
    

    面倒くさいので貼り付けられていたスクリプトには一切目を通さずに答えてみたり。

    
    [ruby-list:47508] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47508] Re: Hash の制約について( Ruby1.8)
    From: KIMURA Koichi 
    Date: Sat, 2 Oct 2010 11:09:17 +0900
    
    木村です。
    
    2010/10/1 上田佳寛 <ueda / yicom.jp>:
    > Hashですが、どの程度大きいものが作れるのかと思い
    > 簡単なプログラムを作ってみたのですが不明点が2点あります。
    
    (略)
    
    明確に「要素X個まで」という形では決まっていないと思います。
    純粋に、動作している環境でどのくらいメモリーを自由に使えるのかという点に依存するのではないでしょうか。
    
    2)の方は、rubyソースコードを読んだ限りでは追加ができなくなったところでメモリ確保エラーで
    例外が発生するんじゃないかと。
    
    

    それに対して返ってきた返事が

    
    [ruby-list:47509] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47509] Re: Hash の制約について( Ruby1.8)
    From: 上田佳寛 
    Date: Sat, 2 Oct 2010 19:15:36 +0900
    In-reply-to: 47508
    
    木村さん 上田です。ご回答ありがとうございました。
    
    メモリー確保エラーだとは十分考えられますが、
    その場合、exceptionで止ってくれればいいのですが、
    当方の環境ではエラーになりません。
    私の環境では500万サイズのハッシュを作ろうとすると2,097,152(20万ヘキサ)しか
    作られません。問題は以下になろうと思います。
    
    1. exception を吐いてエラーならソースの見直しができるのですが
     エラーを吐かず上記サイズしか作られないので、潜在的バグになりかねない
    2. メモリー確保エラーになる前に制御したいのだが、
      その手法がリファレンスからはわからない。
    3. 動作環境での違いならその確認方法
    
    私の方でも追跡調査は行う予定ですが、大きなデータを扱う際の
    問題と思っています。
    よろしくお願い致します。
    
    
    

    で、上田さんは純粋に技術的興味でハッシュの要素数の最大値を知りたいのではないらしい ということにわたしはようやく気がついたのですが、 どうも話が見えてきませんでした。 どうしたものかと思案していると

    
    [ruby-list:47510] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47510] Re: Hash の制約について( Ruby1.8)
    From: "KISHIMOTO, Makoto" 
    Date: Sat, 2 Oct 2010 20:56:26 +0900
    References: 47508 47509
    In-reply-to: 47509
    
    > 私の環境では500万サイズのハッシュを作ろうとすると2,097,152(20万ヘキサ)しか
    > 作られません。問題は以下になろうと思います。
    
    10.48576 = 1ヘキサ、という単位は初耳なのですがそれはまず置いておくとしまして、
    
    手元の環境では添付のスクリプトを実行するとこうなりましたが、
    
    $ ruby -v
    ruby 1.8.7 (2009-12-24 patchlevel 248) [amd64-freebsd8]
    
    $ ruby foo.rb
    size = 5000000
    friends[:0] = 0
    friends[:2097152] = 2097152
    i = 5000000
    friends[:0] =
    削除されたi = 2500000
    削除後size = 2500000
    2度目の削除されたi = 5000000
    2度目の削除後size = 0
    
    上田さんの環境ではこうならないということでしょうか?
    
    あと、素の環境でオブジェクトを確保できるだけ確保するのは、スラッシングで
    マシンごと駄目になりそうだったので止めて、ulimit でやってみましたが、
    
    $ ulimit -v 65536
    $ ruby foo.rb
    [FATAL] failed to allocate memory
    
    こんな感じでメモリが足りないのであればそう言って止まるはずです。
    
    
    

    と、きしもとさんから助け舟が。 そして話はちょっと横道へ。

    
    [ruby-list:47511] Fwd: Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47511] Fwd: Re: Hash の制約について( Ruby1.8)
    From: 上田佳寛 
    Date: Sat, 2 Oct 2010 21:23:36 +0900
    
    > > 私の環境では500万サイズのハッシュを作ろうとすると2,097,152(20万ヘキサ)しか
    > > 作られません。問題は以下になろうと思います。
    > 
    > 10.48576 = 1ヘキサ、という単位は初耳なのですがそれはまず置いておくとしまして、
    0x200000 = 2097152 という事です。
    
    > $ ruby foo.rb
    > size = 5000000
    > friends[:0] = 0
    > friends[:2097152] = 2097152
    > i = 5000000
    > friends[:0] =
    > 削除されたi = 2500000
    > 削除後size = 2500000
    > 2度目の削除されたi = 5000000
    > 2度目の削除後size = 0
    
    ソースの一部を再掲すれば
    (略)
    0からハッシュのサイズまで削除するはずですがKISHIMOTOさんの
    結果では半分しか消しこめていませんね。(削除されたi = 2500000 から)
    
    > 上田さんの環境ではこうならないということでしょうか?
    そうです。
    私の環境では2097152となります。
    
    

    わたしはますますわけわかな状態に。

    
    [ruby-list:47512] Re: Fwd: Re: Hashの制約について( Ruby1.8)
    Subject: [ruby-list:47512] Re: Fwd: Re: Hashの制約について( Ruby1.8)
    From: Shinya Kawaji 
    Date: Sat, 2 Oct 2010 21:56:12 +0900
    References: 47511
    In-reply-to: 47511
    
    かわじ、です。
    
    
    > ソースの一部を再掲すれば
    (略)
    > 0からハッシュのサイズまで削除するはずですがKISHIMOTOさんの
    > 結果では半分しか消しこめていませんね。(削除されたi = 2500000 から)
    
    「ハッシュのサイズまで削除するはず」のハッシュのサイズを、ループごとに
    計算してしまっているのが、意図と反していると思います。
    
    
    > >>while i < friends.size
    
    の部分だけに注目すると、最初のループの時点では、i は 0 で、friends.size
    は 5000000 ですよね。
    
    次のループに入ると、i は 1 ですが、既に friends は一つ削除されていますの
    で、friends.size は 4999999 となります。
    
    (略)
    
    意図通り全ての friends を削除するためには、friends.size をループごとに
    計算するのではなくて、最初に計算して、それを保持しておくべきです。
    
    i = 0
    f_size = friends.size
    while i < f_size
      i_s = i.to_s
      friends.delete( i_s.intern )
      i = i + 1
    end
    
    
    > > 上田さんの環境ではこうならないということでしょうか?
    > そうです。
    > 私の環境では2097152となります。
    
    これは原因は分かりかねるのですが、結果を全て書くと、以下のようになると
    いう理解でよいのでしょうか。
    
    size = 2097152
    friends[:0] = 0
    friends[:2097152] = 2097152
    i = 2097152
    friends[:0] =
    削除されたi = 1048576
    削除後size = 1048576
    2度目の削除されたi = 5000000
    2度目の削除後size = 0
    
    
    
    
    
    [ruby-list:47513] Re: Fwd: Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47513] Re: Fwd: Re: Hash の制約について( Ruby1.8)
    From: "KISHIMOTO, Makoto" <ksmakoto dd.iij4u.or.jp>
    Date: Sat, 2 Oct 2010 22:02:38 +0900
    References: 47511
    In-reply-to: 47511
    
    (略)
    > 0からハッシュのサイズまで削除するはずですがKISHIMOTOさんの
    > 結果では半分しか消しこめていませんね。(削除されたi = 2500000 から)
    
    i を 0 から増やしていって friends の中身を削除しながら、
    i が friends のその時点での size より小さいあいだ繰り返しているので、
    i が 2500000 になった時、friends.size は 2500000 なので、while から
    抜け出しているわけです。
    
    スクリプトに書かれた通りの動作ですよね?
    
    > > 上田さんの環境ではこうならないということでしょうか?
    > そうです。
    > 私の環境では2097152となります。
    
    何がでしょうか?
    問題のスクリプトを実行すると、"2097152" とだけ出力されるということでしょうか?
    だとしたらものすごく大変なことなのですが。
    
    
    

    そして貴重な情報がもたらされます。

    
    [ruby-list:47515] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47515] Re: Hash の制約について( Ruby1.8)
    From: "T.Watanabe" 
    Date: Sun, 3 Oct 2010 00:14:55 +0900
    References: 47501
    In-reply-to: 47501
    
      wtnabeです。
    
      削除の件は置いといて、ちょっと興味が湧いたので試してみました。
      コードはこんな感じに書き換えてあります。
    
    friends = Hash.new
    i = 0
    while i < 5000000
    i_s = i.to_s
    friends[i_s.intern] = i.to_s
    i = i + 1
    end
    puts "size = #{friends.size}"
    puts "friends[:0] = #{friends[0.to_s.intern]}"
    puts "friends[:1] = #{friends[1.to_s.intern]}"
    puts "friends[:2097152] = #{friends[2097152.to_s.intern]}"
    puts "friends[:4999999] = #{friends[4999999.to_s.intern]}"
    puts "friends[:5000000] = #{friends[5000000.to_s.intern]}"
    puts "friends[:5000001] = #{friends[5000001.to_s.intern]}"
    puts "i = #{i}"
    
      これをいくつかの処理系で動かしてみました。環境は OSX 10.5 です。
    
    info: rbx-1.0.1-20100603: rubinius 1.0.1 (1.8.7 release 2010-06-03 JI)
    [i686-apple-darwin9.8.0]
    
    size = 5000000
    friends[:0] = 0
    friends[:1] = 1
    friends[:2097152] = 2097152
    friends[:4999999] = 4999999
    friends[:5000000] =
    friends[:5000001] =
    i = 5000000
    
    info: ruby-1.8.7-p299: ruby 1.8.7 (2010-06-23 patchlevel 299)
    [i686-darwin9.8.0]
    
    size = 2097152
    friends[:0] = 4194304
    friends[:1] = 4194305
    friends[:2097152] = 4194304
    friends[:4999999] = 4999999
    friends[:5000000] = 2902848
    friends[:5000001] = 2902849
    i = 5000000
    
    info: ruby-1.9.2-head: ruby 1.9.2p14 (2010-10-02 revision 29393)
    [i386-darwin9.8.0]
    
    num_of_hash.rb:7:in `intern': symbol table overflow (symbol 2095603)
    (RuntimeError)
            from num_of_hash.rb:7:in `<main>'
    
      こうして見ると Rubinius の結果が元質問の意図に沿ったものなんじゃないか
    という感じがします。
    
      で、1.9.2 が吐いてるように Symbol 周りで何か起きてるような印象です。
    1.8.7 では書き込まれているはずのない値が返ってくるし、存在しないはずの
    key が存在してるようです。
    
    
    
    
    [ruby-list:47516] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47516] Re: Hash の制約について( Ruby1.8)
    From: "KISHIMOTO, Makoto" 
    Date: Sun, 3 Oct 2010 10:59:14 +0900
    References: 47501 47515
    In-reply-to: 47515
    
    >   で、1.9.2 が吐いてるように Symbol 周りで何か起きてるような印象です。
    > 1.8.7 では書き込まれているはずのない値が返ってくるし、存在しないはずの
    > key が存在してるようです。
    
    $ ruby -ve '
    i = 0
    s = i.to_s.intern
    p "%d %d" % [i, s.hash]
    loop {
      i += 1
      if i.to_s.intern.eql? s then
        break
      end
    }
    p "%d %d" % [i, i.to_s.intern.hash]
    '
    ruby 1.8.5 (2006-08-25) [i386-linux]
    "0 104238"
    "2097152 104238"
    
    (前のメールの私の環境とは別の環境です)んーなるほど。
    hash が同じだからといって eql? が true を返しちゃいけないのに true を
    返してるみたいですね。
    
    
    
    
    [ruby-list:47518] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47518] Re: Hash の制約について( Ruby1.8)
    From: "KISHIMOTO, Makoto" <ksmakoto dd.iij4u.or.jp>
    Date: Sun, 3 Oct 2010 17:09:18 +0900
    References: 47501 47515 47516
    In-reply-to: 47516
    
    > (前のメールの私の環境とは別の環境です)んーなるほど。
    > hash が同じだからといって eql? が true を返しちゃいけないのに true を
    > 返してるみたいですね。
    
    バグとして登録してあっさりリジェクトされたりしたりしましたが、
    ( http://redmine.ruby-lang.org/issues/show/3899 )
    
    結論から言うと、約 2097152 個以上シンボルを作れないのは、32 ビット機の ruby では
    いかんともしがたい制限事項です。
    ruby 1.8 で、制限を越えても何もエラーにならずに、変な動作をするようになるのは
    バグですので、登録しました。
    http://redmine.ruby-lang.org/issues/show/3900
    
    
    
    
    Ruby 1.9 - Bug #3899: 32 ビットマシンにおいて、symbol table overflow (RuntimeError) が 2Mi 個のシンボルで起きる - Ruby Issue Tracking System
    (さくっと略)
    ruby 1.9.3dev (2010-08-31 trunk 29154) [i686-linux]
    
    説明
    
    32 ビットマシンにおいて、
    gc.c の rb_obj_id のコメントには、
    
         *  symbol  ssssssssssssssssssssssss00001110
    
         *  symbol   000SSSSSSSSSSSSSSSSSSSSSSSSSSS0        S...S % A = 4 (S...S = s...s * A + 4)
    
    とあり、symbol のための id = hash のための空間は 24bit すなわち 16Mi 個ぶんあるはずな
    のに、2Mi 個超のシンボルを作ろうとすると、symbol table overflow (RuntimeError) が起き
    る。
    
    履歴
    #1
    2010年10月03日 16:27 PM - Nobuyoshi Nakada
    
        * ステータス OpenからRejectedに変更
    
    IDの最下位3ビットは、ローカル変数やメソッド名、定数名、インスタンス変数名、クラス変数
    名、グローバル変数名などの、シンボルの分類のために使われています。
    
    したがって、異なる名前のシンボルとしてはID全体の1/8しか作ることはできません。
    
    
    

    おー、シンボルの最下位3ビットをそのように使っていたとは知らなかった。

    で。

    
    Ruby 1.8 - Backport #3900: symbol table のあふれがエラーにならない - Ruby Issue Tracking System
    (略)
    説明
    
    http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/47501 が発端です。
    
    ruby 1.9 では r18519, r18521 でシンボルテーブルのあふれがエラーになるようになっている
    が、1.8 では id の重複したシンボルがそのまま作られてしまって Hash などの動作がおかしく
    なる。
    
    関係しているリビジョン
    
    リビジョン 29396
    nobuが約2時間前に追加しました
    
        * parse.y (rb_intern): should check symbol table overflow.
    
    #3900 [ruby-dev:42330]
    
    履歴
    #1
    2010年10月03日 18:37 PM - Nobuyoshi Nakada
    
        * ステータス OpenからClosedに変更
        * 進捗 % 0から100に変更
    
    This issue was solved with changeset r29396.
    Makoto, thank you for reporting this issue.
    Your contribution to Ruby is greatly appreciated.
    May Ruby be with you.
    
    

    ということで、(発端の質問からすると) 意外なところのバグ修正という結果に。

    
    [ruby-list:47519] Re: Hash の制約について( Ruby1.8)
    Subject: [ruby-list:47519] Re: Hash の制約について( Ruby1.8)
    From: "T.Watanabe" 
    Date: Sun, 3 Oct 2010 19:41:57 +0900
    References: 47501 47515 47516 47518
    In-reply-to: 47518
    
      wtnabeです。
      バグ登録ありがとうございます。
    
    (10/10/03 17:09), KISHIMOTO, Makoto wrote:
    
    > 結論から言うと、約 2097152 個以上シンボルを作れないのは、32 ビット機の ruby では
    > いかんともしがたい制限事項です。
    > ruby 1.8 で、制限を越えても何もエラーにならずに、変な動作をするようになるのは
    > バグですので、登録しました。
    > http://redmine.ruby-lang.org/issues/show/3900
    
     ということは元質問に戻って結論としては
    
     * Hash の制限じゃなくて 32bit 環境下の Symbol の制限
     * 大量の key を持つ Hash を使いたければ Symbol じゃなくて文字列でやって
    
     ですかね。
     あの Symbol の使い方をする必然性はまったくないですからね。
    
    # あるいは Rubinius 使ってちょ、かな。もしかすると JRuby とかでも大丈夫
    # かもしれないですね。分かんないけど。
    
    

    質問を投稿した上田さんがしばらくMLに現れていないのでこれで解決。 ということになるのか良くわかりませんが、 たぶん例示のスクリプトのような使い方でおかしな動作をしていて、 ハッシュの大きさの限界に関係あるのだろうと判断してそれについての質問だけを MLに投稿したというのが話がこじれた原因でしょうか。 同じスクリプトを出すにしても、(シンボル数の上限を超えたことによる) 不具合を説明してもらえればもう少し速やかに解決していたかもしれません。

    ということでバグ報告(今回のこれはそうとも言い切れませんが)をするときには 報告者は自分で勝手な判断をしてはいけないということですね。 気をつけよう。

    ■_ うは

    今日は一件だけでいつもの一日分の量に。

    ■_ 本日の巡回から

    2010年10月03日

    ■_

    湯船につかりながら電子書籍についてつらつらと考えたのですが (省略されました)

    ・今日のオススメ
    発明のコモンズ〜サービスイノベーションとオープンイノベーションを促進するための知的財産制度〜 (創成社新書44)
    新書なのですが、置いている書店は少ないかもしれません。 ソフトウェア特許なんかは槍玉に挙げられることも少なくありませんが、 じゃあどうしようかという視点を得るのによろしいのではないでしょうか。 筆者のページ → 「発明のコモンズ」のオビについて: eビジネス・IT戦略の波間に

    ■_ Roles

    Trait やら Role やらもーよくわかりません。

    Why roles in Perl are awesome - Perlbuzz
    http://perlbuzz.com/2010/07/why-roles-in-perl-are-awesome.html
    
    Why roles in Perl are awesome
    
    By Andy Lester on July 27, 2010 9:21 AM | 1 Comment
    
    by Chris Prather
    
    A question came up recently on a mailing list. I was talking about how Roles are a
    awesome win for Perl5 considering how few languages implement the concept *1. Someone
    asked what the win was with Roles. I happen to have been thinking about this recently
    and dashed off a reply.
    
    最近のことですがあるメーリングリストで一つの質問がされました。わたしは Roles が如何に
    Perl5 considering how few languages implement the concept *1にとって awesome win であ
    るかについて述べました。誰かが、win was with Roles とは一体何なのかと尋ねました。わた
    しは happen to have been thinking about this recently and dashed off a reply.
    
    
    When you use Inheritance, especially multiple inheritance, for behavioral re-use you
    run into several problems quickly.
    
    振る舞いの再利用 (behavioral re-use) のためにあなたが継承、とくに多重継承を使おうとすると、
    即座にいくつかの問題を抱え込むことになります。
    
    
    First Inheritance is an explicit modeling of a relationship that carries semantic
    meaning. Let's say you're developing a game for Biology students to explain to them
    taxonomy. In this game a Dog class is a subclass of Animal. That is, the Dog class
    inherits specific behaviors and attributes from the Animal class. This probably isn't
    even a direct relationship your Dog class may inherit from a Mammal class which
    inherits from a Vertebrate class which inherits from Animalia which itself inherits
    from Life. These kinds of hierarchies are common in Taxonomy as well as in Object
    Oriented programming. However when you need to express something that may cross cut
    concerns in, you run into issues.
    
    
    First Inheritance は semantic meaning を carries している関係 (relationship) の
    explicit なモデリングです。ここで、あなたは生物学の学生 (Biology students) 向けに 
    taxonomy (生物分類学) を説明するためのゲームを開発しようとしているとしましょう。このゲ
    ームでは、Dog クラスは Animal クラスのサブクラスです。つまり、この Dog クラスは Animal 
    クラスから特定の振る舞いと属性とを受け継いでいる (inherits) のです。これはおそらく、あ
    なたのDogクラスがLife から継承した Verebrate クラスから継承した Animaliaクラスから継承
    したMammal クラスから継承できるといった直接の関係ですらありません。この種の階層 
    (hierarchies) はオブジェクト指向プログラミングと同様に Taxonomy では一般的なものです。
    しかし may cross cut concerns in ななにか (something) を表現 (express) するのが必要と
    なったとき、あなたは issues に陥ることになります。
    
    
    Say for example your marketing department has had trouble selling this product to
    schools and is attempting to market to parents directly. They have done studies and
    kids really like Pets2. So your boss comes to you because the company wants you to add
    the concept of Pet to your Taxonomy model.
    
    
    例として your marketing department がこの製品を学校に売るのにトラブルが起き、親たちに
    直接売り込もうていしているとしましょう。
    They have done studies and kids really like Pets*2.
    あなたの上司はあなたを頼りにするでしょう。
    なぜなら、Pet の concept をあなたの Taxonomy モデルに追加するのに会社があなたを必要とするからです。
    
    
    Pets don't fit into a Taxonomy, it's obvious that not all Animalias are Pets3 and some
    Pets may not be animals at all4. In many languages can use Multiple Inheritance to
    describe this new "I'm an Animalia and a Pet" relationship but often you run into
    issues there as well. Is a Pet a Life? That would mean our object model would look
    like:
    
    Pets は Taxonomy とはフィットしません。すべての Animals が Pets でないこと、
    Animals でない Pets が存在しうることは明白です。
    多くの言語ではこの新たな "I'm an Animalia and a Pet" relationship
    (「わたしはAnimaliaでありかつPetである」という関係)
    を表現するのに多重継承を使えますが、often you run into issues there as well.
    Pet は生命 (Life) でしょうか?
    それはわたしたちのオブジェクトモデルが次のような見かけになるということです:
    
    Life
      Animalia
          Vertebrae
              Canine    Pet
                  Dog
    
    Pet stands out like a sore thumb. Obviously we've got issues with this new modeling.
    We talk to our boss and figure out that the rules for Pet are simple. Pet's are always
    domesticated versions of the Animalia, but not every class in Animalia is a pet. So
    for example Dogs are always Pets, Wolves are not. We can solve this with multiple
    inheritance now, but it's really not a clean way to express the relationship and it
    requires us to document the special relationship the Pet class would have with the
    rest off the Inheritance tree. Once you get beyond a few "special cases" like this it
    becomes hard to see the model for the exceptions.
    
    Pet は sore thumb のように stands out しています。
    この新しいモデリングに関してわたしたちが問題を抱えているのは明らかです。
    わたしたちは自分の上司と対話して
    rules for Pet are simple を見つけ出し (figure out) ました。
    Pet は常に Animalia の domesticated versions ですが、
    Animalia に属する全てのクラスが pet であるわけではありません。
    例えば Dogs は常に Pets ではありますが、Wolves は違います。
    いまわたしたちはこれを多重継承によって解決できますが、
    それは関係を表現する本当に clean な方法ではありませんし、
    この Pet クラスは would have with the rest off the Inheritance tree
    という special relationship のドキュメントをわたしたちに要求します。
    ひとたびこのようなごく少数の「特殊なケース」(special cases) を get beyond してしまうと、
    例外のためのモデルを見つけるのが困難になります。
    
    This is why some languages like to disallow multiple inheritance entirely. In Java for
    example, Pet could become an Interface.
    
    これが、一部の言語で多重継承を完全に禁止している理由です。
    たとえば Java を例にとると、Pet は Interface にはなれます。
    
    public interface Pet {
      Date getYearDomesticated;
    }
    
    This however means that every class that we want to be a pet needs to have the exact
    same piece of boiler plate code added to it.
    
    ただしこれは、pet を必要とするすべてのクラスで
    boiler plate code の まったく同じ piece を持つことが必須になります。
    
    
    class Dog implements Pet {
      ...
      private Date yearDomesticated;
      public Date getYearDomesticated () { this.yearDomesticated }
      ...
    }
    
    If we instead have the concept of Roles then we can apply the concept of a Pet once at
    any level of the hierarchy we need. A example using a modern Perl5
    
    もし代わりに Roles の concept を持っていれば、
    必要とする任意のレベルの階層でその Pet の concept を適用できます。
    modern Perl5 を使った例です
    
    package Pet {
      use Moose::Role
      has year_domesticated => (
          is => 'ro',
          isa => 'DateTime',
          required => 1
      );
    }
    
    package Dog {
      use Moose;
      extends qw(Canine);
      with qw(Pet);
    }
    
    
    The Pet Role here implements everything we need for a default implementation, and
    doesn't require more boiler plate to our Dog class, that the bare minimum needed. It
    also avoids the ugly inheritance issues we saw with multiple inheritance by moving the
    behavior composition onto different tool. In my opinion, Roles aren't a win for every
    use of inheritance, nor for every time you want to re-use behavior, but they are an
    excellent tool to have in the box and one that the Moose crowd knows to reach for
    quite often.
    
    ここでの Pet の Role はわたしたちがデフォルト実装で必要とするものすべてを実装しているので、
    bare minimum しか必要としていない Dog クラスに対してさらなる boiler plate は必要ありません。
    これはまた、多重継承を使うとみられるような振る舞いの合成 (behavior composition)
    を別のツールに移すことによって ugly な inheritance issuses を排除します。
    わたしの意見では Roles は win for every use of inheritance でもないし、
    あなたが毎回振る舞いの再利用を望むわけでもありませんが、
    道具箱に入れておくべき excellent tool であり、
    Moose crowd knows to reach for quite often なものです。
    
     1. Off the top of my head I only know about Perl5, Perl6, Scala, Javascript, and
        Smalltalk. There may be other implementations out there. ?
    
     2. The Marketing guy's daughter plays on WebKinz nightly. ?
    
     3. Pet Shark's would be dangerous to say the least, and where would you keep a pet
        Blue Whale? ?
    
     4. Who doesn't love their Pet Rock? ?
    
     5. We're using the the inline package syntax that will be released in 5.14 ?
    
    Chris Prather is an Owner at Tamarou LLC, a member of the Moose cabal, and responsible
    for Task::Kensho.
     

    ■_

    
    Five Essential Performance Optimization Steps
    Five Essential Performance Optimization Steps
    
    by Clayton on September 27, 2010
    
    Performance optimization of any software project is a mix of art, science, stubbornness
    and inexplicable improvement. Most developers will spend incredible amounts of time
    tweaking their application to squeeze out performance gains, regardless of the value
    they provide. As the old saying goes, given enough optimization rope, developers will
    quickly hang themselves.
    
    すべてのソフトウェアのパフォーマンス改善は mix of art であり、科学であり、
    stubbornness (不屈、信念?) であり、inexplicable (予測できない?) 改良です。
    大半の開発者は、自分たちのアプリケーションの performance gains を squeeze out するために
    自分たちが与えた価値とは無関係に信じられないほどの時間を掛けます。
    古くから言われているように、十分に最適化されたロープを与えれば
    開発者は即座に自分自身を吊り上げるのです。
    #わからん
    
    
    Using the following five steps, you can ensure that the time you spend optimizing your 
    application provides maximum value.
    
    以下の五つのステップを使えば、あなたは自分のアプリケーションが提供する最大の価値を
    最適化するために掛ける時間を ensure できます。
    
    1. Benchmarking
    ベンチマークを取る
    
    Optimizing your application is worthless without a benchmark. You absolutely must have 
    a measurement of performance before you begin so that your changes can be quantified 
    when you are done. I have seen many developers start out with a complaint from a 
    client about a “slow” page and then spend a few hours making changes only to 
    conclude with “it seems a lot faster now”. If you're optimizing a rails application, 
    something like New Relic's RPM is a great choice. Another tool I've had success with 
    is brynary's rack-bug.
    
    ベンチマークなしのアプリケーションの最適化は価値がありません。
    あなたはまずもって、
    before you begin so that your changes can be quantified when you are done.
    パフォーマンスの指標 (measurement of performance) を持たなければなりません。
    わたしは多くの開発者が、クライアントから“遅い”という不満をぶつけられた場合に、
    “it seems a lot faster now”(だいぶ高速になったようです) と回答するだけのための
    変更をほんの数時間掛けてやるだけなのを見てきました。
    もしあなたが rails アプリケーションを最適化しようとしているなら、
    New Relic PRM のようなものは great choice です。
    Another tool I've had success with is brynary's rack-bug.
    
    2. Set a Timebox
    タイムボックスをセットする
    
    Once you've recorded benchmarks for the problem areas of your application you need to 
    determine what specifically is wrong and how to fix the problem. Since it's possible 
    to spend hours upon hours of time under the directive of “performance improvement” 
    you need to set a hard limit on the time you spend optimizing. Two timeboxes should be 
    used, one to locate the specifics of the problem and another to fix them.
    
    3. Similarity of Environments
    環境の同一性
    
    The vast majority of performance issues will be discovered by real users performing 
    real tasks in a production environment. In a rails application, the behavior of the 
    development environment is far different from that of the production environment, so 
    why would you optimize in anything but the production environment? Of course you can'
    t optimize on the live production application, but you can setup a similar environment 
    that behaves like the live production environment. Just recently I spent an hour 
    optimizing a slow page and actually gained an 80% improvement, the only problem was, 
    in production the page was slow for a completely different reason. Talk about a tough 
    conversation, having to go back to the client and explain that my previous detailed 
    explanation and assurance that the problem was solved was instead all wrong.
    
    4. Accurate Dataset
    正確なデータセット
    
    How many times have you implemented a feature, ran it through some tests, demo'd to 
    the client, deployed it to staging only to find that when it makes it to production it 
    is impossibly slow to the point of being useless? If your production environment has a 
    huge database with a hundred thousand rows and a few hundred concurrent users, testing 
    on your development machine with 10 rows in the database is a waste of time. Make sure 
    that the dataset on which you are testing your improvements accurately reflects your 
    production dataset.
    
    5. Low-hanging Fruit and Small Victories
    
    Since you will have a fixed amount of time in which to optimize, you need to take 
    small wins and get the low-hanging fruit when possible. Maybe the best solution to 
    your problem is to drastically change the application's design garnering a big boost 
    to performance. However, if that route takes you beyond your timebox maybe a few 
    database indexes and an optimized query are all you can afford. Always remember that a 
    small performance improvement is better than no improvement and that the small stuff 
    always adds up. BONUS Stakeholders Care About Value
    
    When a report of a slow feature comes in, make sure that you evaluate the time and 
    effort it will take to implement the improvement. Communicate this with the client, 
    product owner and/or stakeholders so that they can evaluate the value they'll receive 
    from the time you spend. If the feature in question is used infrequently it might not 
    be worth the time or cost. Conversely, performance optimization should not always be 
    viewed as something done for free. If an application has grown in size beyond what was 
    originally envisioned, it is perfectly reasonable to charge your client for 
    performance enhancements.
    
    Don't be like most developers, keep these steps in mind and make your next performance
    optimization session a success.
    
    

    ■_

    
    推薦図書/必読書のためのスレッド 58 
    36 デフォルトの名無しさん [sage] 2010/10/03(日) 04:47:38 ID: Be:
        ライト、ついてますか 見たいな類の良書ありますか?
        結構面白かったので 
    
    37 デフォルトの名無しさん [sage] 2010/10/03(日) 04:48:28 ID: Be:
        そういうのばっかり読んでも何の足しにもならんぞ 
    
    38 デフォルトの名無しさん [sage] 2010/10/03(日) 04:51:48 ID: Be:
        >>37
        こういう本ってあんまり役に立たないんですか?今大学生なんで将来的に役立つかなと思ったんですが。 
    
    39 デフォルトの名無しさん [sage] 2010/10/03(日) 04:54:45 ID: Be:
        気のせい 
    
    40 デフォルトの名無しさん [sage] 2010/10/03(日) 07:03:02 ID: Be:
        ワインバーグは何冊も出てるから読めば? 
    
    42 デフォルトの名無しさん [sage] 2010/10/03(日) 14:11:07 ID: Be:
        >>40
        コンサルタントの秘密でも読んで見ます。
        ありがとう 
    
    43 デフォルトの名無しさん [sage] 2010/10/03(日) 17:35:27 ID: Be:
        前スレの終わりの方で
        ライト、ついてますか って いかにして問題をとくか みたいな本だろ、とありましたが、
        全然違いますね。
    
        よく見かける数学者と技術者が登場するジョークみたいな意味でも違いますし、
        そもそも、タイトルからして
        「いかにして問題をとくか」「問題発見の人間学」なので重点を置いてるポイントも違いますね。
    
        私の場合なんですが、学生時代は問題を解決するということは「いかにして~」に
        書かれているようなことだと考えていたので、
        社会人になって初めて「ライト~」を読んだときにすごい衝撃を受けましたね。 
    
    45 デフォルトの名無しさん [sage] 2010/10/03(日) 17:58:24 ID: Be:
        うまく言葉にできないが、問題の解決手段じゃなくて
        問題の本質を捉えられれば適切な解決手段が見つかるよって本だった気がする 
    
    51 デフォルトの名無しさん [sage] 2010/10/03(日) 19:31:47 ID: Be:
        そういえばチャールズ・シモニーが実録!天才プログラマという本で
    
        > わが社では、入社当日にプログラマーに本を二、三冊渡し
        > ます。一冊は『それをどう解くか』というタイトルで、数学
        > 者のジョルジュ・ポーヤが書いたものです。(シモニイは、机
        > のそばの本棚からその本を取り出して、あるページを開く)。
        > このページと、このページが重要なんです。あとの部分は、
        > このニページの補足説明といったところですね。
    
        と言ってるんだけど「この二ページ」ってどこだろね 
    
    56 デフォルトの名無しさん [sage] 2010/10/03(日) 20:24:11 ID: Be:
        >>51
        日本語版だと最初の2ページじゃないの?
        表紙めくったページ。
        最後にも載ってるけど。 
    
    60 デフォルトの名無しさん [sage] 2010/10/03(日) 21:34:50 ID: Be:
        >>56
        それか!たしかに重要なことばかり書いてある
        灯台下暗しとかいうレベルじゃなくて今まで気づかずにいてちっとも悔しくない 
    
    

    「それをどう解くか」ってこのタイトルなんかなあ。それらしいのが見当たらない。

    ■_ 続・バッファxxxx

    
    UnicodeとUTF-8の違いは? その2 
    586 デフォルトの名無しさん [sage] 2010/10/02(土) 22:29:49 ID: Be:
        ○ バッファオーバーラン
        × バッファオーバーフロー 
    
    587 デフォルトの名無しさん [sage] 2010/10/02(土) 22:39:22 ID: Be:
        "バッファオーバーラン"   約 16,500 件 (0.17 秒)
        "バッファオーバーフロー" 約 107,000 件 (0.03 秒)
    
        ^^; 
    
    588 デフォルトの名無しさん [sage] 2010/10/02(土) 22:49:43 ID: Be:
        で?
        バッファオーバーフローは実際に発生したデータ量が予定していたバッファのサイズを上回ること。
        バッファオーバーランはバッファオーバーフローした際にデータサイズをチェックしなくて予定外の
        メモリを変更されること。意味が違う。 
    
    590 デフォルトの名無しさん [sage] 2010/10/02(土) 23:14:29 ID: Be:
        >>588
        少しはぐぐった?
        どちらも同じって書いてあるよ。 
    
    591 デフォルトの名無しさん [sage] 2010/10/03(日) 02:51:21 ID: Be:
        >586-588
        http://en.wikipedia.org/wiki/Buffer_overflow
        http://en.wikipedia.org/wiki/Buffer_overrun
        http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3
    
        ○バッファオーバーフロー = バッファオーバーラン 
    
    592 デフォルトの名無しさん [sage] 2010/10/03(日) 03:10:23 ID: Be:
        >>591
        ソースがwikipediaかよw
    
        wikipediaを信じるなんて馬鹿のすること。
        wikipediaに書いてあることはみんな間違い。
        つまり、その逆が正解。
    
        wikipediaに書いてある時点で
        世界で最も信用できないものと思え。
    
        結論 バッファオーバーランが正しい。 
    
    593 デフォルトの名無しさん [sage] 2010/10/03(日) 06:31:52 ID: Be:
        つまり、WikipediaにあるUnicodeの説明も全て間違いと言うことですね、判ります。 
    
    594 デフォルトの名無しさん [sage] 2010/10/03(日) 06:46:36 ID: Be:
        >>592
        じゃあお前のソースはなに? 
    
    595 デフォルトの名無しさん [sage] 2010/10/03(日) 06:51:48 ID: Be:
        予定サイズを上回ったら自動的に何かが書き込まれて変更されるからな。
        結果としては一緒。 
    
    596 デフォルトの名無しさん [sage] 2010/10/03(日) 07:02:10 ID: Be:
        >>592 逆裏対偶の区別もつかないバカ登場wwwwwww 
    
    597 デフォルトの名無しさん [sage] 2010/10/03(日) 07:27:47 ID: Be:
        char path[MAX_PATH+1]と+1を付けていなければどっちも起きるわな 
    
    598 デフォルトの名無しさん [sage] 2010/10/03(日) 08:27:06 ID: Be:
        得意げに○×やってみたら自分が間違ってた時って、どんな気持ちなんだろう 
    
    599 デフォルトの名無しさん [sage] 2010/10/03(日) 09:16:04 ID: Be:
        なんか本筋でないところでもめているようだけど、CERTやCWEでは"buffer overflow"が使われている。
        あと stackoverflow.com とか名付けられているように、overflowのほうが普通に使われているようだね。 
    
    600 デフォルトの名無しさん [sage] 2010/10/03(日) 09:45:28 ID: Be:
        >>597
        +1 ってセコすぎる。たった1バイトしか余裕がないのかよ。
        せめて1文字分は余裕持たせたほうが・・・おっと、「1文字とは1バイトである」って概念
        に毒されたひとには何を言ってもムダか。 
    
    601 デフォルトの名無しさん [sage] 2010/10/03(日) 09:50:12 ID: Be:
        醜いレス乞食 
    
    602 デフォルトの名無しさん [sage] 2010/10/03(日) 10:06:48 ID: Be:
        >>588
        「バッファから溢れる」現象を指してオーバーフローと言うわけで
        「バッファを越えて書き込んだ」現象を指すオーバーランとどこも違わん。
        オーバーフローしてりゃオーバーランしてるし、オーバーランしてりゃオーバーフローしてんだよ。
    
        顔真っ赤にして恥の上塗り乙。 
    
    

    確かに英語版のWikipediaでは、buffer overrun は buffer overflow にリダイレクトされるし

    
    Buffer overflow - Wikipedia, the free encyclopedia
    
      (Redirected from Buffer overrun)
    
    In computer security and programming, a buffer overflow, or buffer overrun, is an 
    anomaly where a program, while writing data to a buffer, overruns the buffer's 
    boundary and overwrites adjacent memory.
    

    とあるなあ。

    ■_ 本日の巡回から

    2010年10月02日

    ■_

    ・買った
    グラハム・ベル空白の12日間の謎―今明かされる電話誕生の秘話
    訳者あとがきを読んで、わくわくが止まりません。

    ■_ 今日の丸投げ

    
    (plus1 5) => error 発生 | OKWave
    
    (plus1 5) => error 発生
    (plus1 '()) => ()
    (plus1 '(5)) => (6)
    (plus1 '(1 2 3 7)) => (2 3 4 8)
    
    これを満足するのが欲しいです!
    
    (define plus1
    (lambda (x)
    
    このあとどうしたらいいんでしょうか?
    
    
    ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
    (min 5) => error発生
    (min '()) => error
    (min '(20 15)) => 15
    (min '(30 5 90 25)) => 5
    
    >(define min
    (lambda (x)
    
    
    
    >このあとどうしたらいいんでしょうか?
    
    その前に plus1 の仕様を日本語で説明するのが先です。
    
    補足
    
    LISPの種類
    schemeで使う変数です
    
    
    
    そうじゃなくて、plus1 は「関数として」どのように動作することが期待されているのですか?
    
    補足
    
    (plus1 5) => error 発生
    (plus1 '()) => ()
    (plus1 '(5)) => (6)
    (plus1 '(1 2 3 7)) => (2 3 4 8)
    
    listの中の数を +1 増やす動作をします
    (plus1 '())
    これの答えが()になる理由は
    ((null? x) ())
    xがnullの時xは()
    (plus1 5)がerroeになる理由は5はlistではないからですね
    だからplus1はリストの数を+1増やすことです
    どうすれば。。。
    
    
    
    map を使うと楽に出来ると思いますが、課題っぽいので、オーソドックスに再帰呼出しを使う方法のヒントを。
    
    
    (define plus1
    (lambda (x)
    (if
    (null? x)
    要素が無い場合の値
    (cons
    (先頭の要素に1を足した値)
    (再帰呼び出しを使って残りを処理)))))
    
    
    リストの先頭と残りを取り出すのは、 car と cdr でできますね。
    http://www.shido.info/lisp/scheme3.html
    先頭の一つを処理して残りを再帰呼出したものと連結するのは典型的な scheme のリスト変換のイディオムですね。
    
    (略)
    補足
    
    (+ (+ 1 (car x))(plus1 (cdr x))))
    
    したらいいなと思ったんですが
    よくできません
    
    再帰は count, sumまでやったことありますが
    これは再帰でできます?
    
    lispどうこうの問題じゃないよ.
    アルゴリズムの基礎的な部分と
    人にものを聞くときにいかに情報を伝えるかの問題だね
    
    Haskellで書いておくから自分でlispに直しなよ
    何をやってるのかはlispで書くよりも見やすいはず.
    
    plus1の方は再帰を使うのが本質
    
    plus1:: [Int] -> [Int]
    plus [] = []
    plus (x:xs) = (x+1):(plus1 xs)
    
    min については,やはり再帰なんだけどもfoldlを使ってみよう
    
    min1:: [Int] -> Int
    min1 (x:xs) = foldl (\ x y -> if x<y then x else y) x xs
    
    foldlはschemeにも同じようなものがあるはずだけど
    要はリストの先頭要素 A をスタートにして
    リストの残りの先頭 B とを比べて,小さいほうを次のスタートにするということ.
    左重ね合わせをつかったけど,右でも同じ.
    右の方が効率がいいんだっけか
    

    なんとも形容のしようがないやり取りだなあ。

    ■_

    変数の interpolation と組み合わさって。ということなんでしょうけど、 Perl で最初に実現された(と思うんだけど違ってたらごめんなさい) この小さな正規表現を保持する変数を組み合わせて大きな正規表現を組み立てられる能力 ってのは便利ですよね。

    あれ、最初の Clojure の例にある :as やらはなんだろか。

    
    Readable and compositional regexes in Perl « transfixed but not dead!
    
    Readable and compositional regexes in Perl
    September 29, 2010
    
    by draegtun
    
    Regexes don't (always!) have to be unreadable mess. For example see this HN post a 
    little Clojure DSL for readable, compositional regexes. Here is the simple Clojure 
    example that was given:
    
    (def datestamp-re
      (let [d {\0 \9}]
        (regex [d d d d :as :year] \- [d d :as :month] \- [d d :as :day])))
    
    And the equivalent Perl regex “DSL” can be equally lucid:
    
    sub datestamp_re {
        qr/ (?<year> \d \d \d \d) - (?<month> \d \d) - (?<day> \d \d ) /x;
    }
    
    The two things that provide a little extra help to grok whats going on here are:
    
       1. The x modifier on the end of qr// which allows whitespace and newlines to be
          sprinkled into your regex pattern without any effect on the pattern matching. See
          perlre Modifers
          x 修飾子により空白や改行が正規表現のマッチングに影響しない形で取り込まれる
    
       2. And “Named Capture Buffers” which were added at perl 5.10.
    
          (?<year> \d{4}) # stores pattern matched in "year" buffer
    
          Above not only gives a name to that capture buffer but provides an excellent visual
          placeholder to help describe what you are trying to do with the regex. 
    
    When processing named capture regexes the matches to patterns are recorded in the %+ 
    hash variable:
    
    named capture はパターンに対するマッチングを処理するときにハッシュ変数 %+ に
    記録されます。
    
    for my $date (qw/2007-10-23 20X7-10-23/) {
        printf "year:%d, month:%d, day:%d\n", @+{qw/year month day/}
            if $date =~ datestamp_re;
    }
    
    # => year:2007, month:10, day:23
    
    This is much more flexible for dealing with regex captures compared to positional $1, 
    $2, $3, etc. So not just more readable but more compositional:
    
    これは $1、$2、…のような位置によって指定する caputure に比べると格段に flexible です。
    このため、より読みやすいばかりでなく、より compositional (組み合わせしやすい) です。
    
    # nice readable regex
    sub datestamp_re  {
         my $year  = qr/ (?<year>  \d{4}) /x;
         my $month = qr/ (?<month> \d{2}) /x;
         my $day   = qr/ (?<day>   \d{2}) /x;
    
         qr/ $year - $month - $day /x;
    }
    
    or:
    
    # DRY regex
    sub datestamp_re {
        my %re = map {
            my ($name, $digits) = @$_;
            $name => qr/ (?<$name>  \d{$digits}) /x;
        } [ year  => 4 ], [ month => 2 ], [ day   => 2 ];
    
        qr/ $re{year} - $re{month} - $re{day} /x;
    }
    
    and even:
    
    # regex generator
    sub re { qr/ (?<$_[0]> $_[1] )/x }
    
    sub regex {
        my $pattern = join q{}, @_;
        qr/ $pattern /x;
    }
    
    sub datestamp_re {
        regex re( year => '\d{4}' ), '-', re( month => '\d{2}' ), '-', re( day => '\d{2}' );
    }
    
    Now that is a regex DSL :)
    これはもう正規表現DSLですね :)
    
    Note that the %+ hash variable only captures the first occurrence in the relevant 
    named buffer:
    
    ハッシュ変数 %+ が対応する named buffer で最初に登場したもの (first occurrence) だけを
    capture することに注意してください:
    
    sub numbers_re {
        my $four  = qr/ (?<four> \d{4}) /x;
        my $two   = qr/ (?<two>  \d{2}) /x;
        qr/ $four - $two - $two /x;
    }
    
    if ('2007-10-23' =~ numbers_re) {
        say 'four => ', {four};
        say 'two  => ', {two};
    }
    
    # four => 2007
    # two  => 10
    
    To get to the second $two (ie. 23) then use the %- hash variable which stores all the 
    captures in an array reference for relevant named buffer:
    
    二番目の $two (この例では 23) を得るには、ハッシュ変数 %- を使います。
    この変数は対応する named buffer をすべて array reference に格納しています。
    
    if ('2007-10-23' =~ numbers_re) {
        say 'two(s) => ', join ',' => @{ $-{two} };
    }
    
    # two(s) => 10,23
    
    /I3az/
    
    PS. Please note that the WordPress syntax highlighter used is unfortunately 
    upper-casing all code comments :(
    
    

    ■_ バッファxxxx

    
    UnicodeとUTF-8の違いは? その2
    548 デフォルトの名無しさん [sage] 2010/09/29(水) 19:09:30 ID: Be:
        | NTFS ファイルシステム上のファイルを Windows のファイル圧縮ツール(zip, lha など)で
        | 圧縮ファイルにまとめると、Windows カーネルは、ファイル名を Unicode -> SJIS 変換して
        | ファイル圧縮ツールに渡し、ファイル圧縮ツールは、SJIS のファイル名で圧縮ファイル内に保存します
    
        何だよこの糞仕様。UTF-8にしないと後生まで後悔するぞ。 
    
    549 デフォルトの名無しさん [sage] 2010/09/29(水) 19:58:59 ID: Be:
        もう手遅れ。
        WindowsはファイルシステムはUnicodeなのに使っちゃいかん文字があるという
        不思議仕様になってる。Unicodeファイル名含むアーカイブ渡すと罵倒されるよw 
    
    550 デフォルトの名無しさん [sage] 2010/09/29(水) 21:16:46 ID: Be:
        それ太古のUnicode非対応アプリの話だろ。
    
    551 デフォルトの名無しさん [sage] 2010/09/30(木) 00:33:24 ID: Be:
        アプリのエントリポイントが昔ながらのmainであればMBCSに変換、
        wmain であれば Unicode のまんま渡される。
        また、wmain なファイル圧縮ツールも存在する。(Explzhとか)
        なので>547,548は正確ではない。
    
        そもそも exe に渡すファイル名が、常に SJIS に変換されるのであったら、
        explorer で開けないフォルダを作れてしまうと思うけど。 
    
    552 デフォルトの名無しさん [sage] 2010/09/30(木) 01:37:42 ID: Be:
        太古のUnicode非対応アプリ(当時圧倒的主流派)への互換性を優先し
        今まで通りのやり方(太古の主流派)で作られた場合、今まで通りの文字コードが渡されるようにしただけだな
    
        >>548
        必要バイト数があまりにも予測できなくなるので、多言語かつ低レベルな領域ではUTF-8は微妙
        もう10年経ったら分からんが
    
        >>549
        お前の脳みそウンコに入れ替わってるみたいよ?病院いってら 
    
    555 デフォルトの名無しさん [sage] 2010/09/30(木) 10:02:49 ID: Be:
        >>552
        > 必要バイト数があまりにも予測できなくなるので、多言語かつ低レベルな領域ではUTF-8は微妙
        > もう10年経ったら分からんが
    
        文字数を固定長としているのが悪い。
        MAX_PATHもプラットフォームでばらばら。 
    
    556 デフォルトの名無しさん [sage] 2010/09/30(木) 12:02:40 ID: Be:
        とはいえバッファサイズは決めなきゃならないしな 
    
    557 デフォルトの名無しさん [] 2010/09/30(木) 16:34:52 ID: Be:
        >>549
        > もう手遅れ。
        > WindowsはファイルシステムはUnicodeなのに使っちゃいかん文字があるという
        > 不思議仕様になってる。Unicodeファイル名含むアーカイブ渡すと罵倒されるよw
    
        使っちゃいかん文字ってコロンとかじゃなくて? 
    
    558 デフォルトの名無しさん [sage] 2010/09/30(木) 20:01:28 ID: Be:
        >>556
        ファイル名に限らず文字列は動的に確保するものだろ。
        制限の厳しいWindowsでさえファイル名が最大3万文字なのに固定でバッファとる奴はアフォ。 
    
    559 デフォルトの名無しさん [sage] 2010/10/01(金) 21:11:17 ID: Be:
        >>558
        それ本気でいってんの? 
    
    560 デフォルトの名無しさん [] 2010/10/01(金) 21:32:44 ID: Be:
        >>559
        言語は? 
    
    561 デフォルトの名無しさん [sage] 2010/10/01(金) 23:59:52 ID: Be:
        >>558は話題領域を把握できてないタコスケ 
    
    562 デフォルトの名無しさん [sage] 2010/10/02(土) 08:19:34 ID: Be:
        char path[MAX_PATH]
        wchart_t wpath[MAX_PATH]
        バッファ食いすぎ 
    
    563 デフォルトの名無しさん [sage] 2010/10/02(土) 09:18:14 ID: Be:
        >>562は話題領域を把握できてないタコスケ 
    
    564 デフォルトの名無しさん [sage] 2010/10/02(土) 09:26:57 ID: Be:
        そりゃあBOMだけで3バイトも食うから低レベルな領域でUTF-8は使えないなぁ 
    
    565 デフォルトの名無しさん [sage] 2010/10/02(土) 10:05:04 ID: Be:
        >>562
        getcharで1文字ずつ取っていって、足りなくなったらreallocするの? 
    
    566 デフォルトの名無しさん [sage] 2010/10/02(土) 10:09:38 ID: Be:
        >>565
        Windowsのワイド文字からマルチバイトに変換するなんたらって関数は、
        必要バイト数を返してくれるオプションがあるから、それでもらってそれで確保する。 
    
    567 デフォルトの名無しさん [sage] 2010/10/02(土) 10:15:57 ID: Be:
        Cには文字列型がないので処理がめんどくさい。エラー処理でのfreeをずっと気にしなければならなくなる。 
    
    568 デフォルトの名無しさん [sage] 2010/10/02(土) 10:43:11 ID: Be:
        Unicodeはダサイよな 
    
    569 デフォルトの名無しさん [sage] 2010/10/02(土) 10:45:14 ID: Be:
        ダサいけど現状一番マシな選択肢だからしょうがない 
    
    570 デフォルトの名無しさん [sage] 2010/10/02(土) 18:26:25 ID: Be:
        | char path[MAX_PATH]
        Windowsでこんなプログラム書く奴は死んで欲しい。
        全角文字ばかりの240文字のファイル名渡されたらどうするつもりだ。 
    
    571 デフォルトの名無しさん [sage] 2010/10/02(土) 18:32:18 ID: Be:
        >>570
        Windowsでっていうけど、
        じゃあLinuxだとどうすんのさ。 
    
    572 デフォルトの名無しさん [sage] 2010/10/02(土) 18:39:13 ID: Be:
        LinuxだとPATH_MAX。パスの長さは4096文字あれば十分だろ。 
    
    573 デフォルトの名無しさん [sage] 2010/10/02(土) 18:45:00 ID: Be:
        100文字あれば十分だと思う 
    
    574 デフォルトの名無しさん [sage] 2010/10/02(土) 18:49:24 ID: Be:
        > char path[MAX_PATH]
        海外のシングルバイト前提のアプリでは平気である。
        日本のでもShift_JIS前提でchar path[MAX_PATH*2]てのもある。
        これじゃ、UTF-8なんて無理。
        まだ TCHAR path[MAX_PATH] の方がまし。 
    
    575 デフォルトの名無しさん [sage] 2010/10/02(土) 19:24:38 ID: Be:
        MAX_PATH*2なんて、Win32 APIが扱えない時点で無駄。
        wじゃないWinMainアプリはマルチバイト文字ファイル名を扱えない欠陥アプリ。
        長い全角ファイル名があると フォルダのファイル一覧取得APIがエラーになるんだぜ。 
    
    576 デフォルトの名無しさん [sage] 2010/10/02(土) 19:28:06 ID: Be:
        Windowsの場合、サロゲートペアの文字はどうなるの?
        ノートパッドだと、1文字で2文字にカウントされるよね? 
    
    577 デフォルトの名無しさん [sage] 2010/10/02(土) 20:11:48 ID: Be:
        >>574
        いや、UTF-8かどうかなんて関係なく
        パスは無限の長さを持つんだよ。
        シンボリックリンクを使えばね。
    
        だからMAX_PATHだろうが、PATH_MAXだろうが
        どちらにしろ関係ない。
        パスの長さを固定にしている時点でどちらも同じ。 
    
    578 デフォルトの名無しさん [sage] 2010/10/02(土) 20:57:48 ID: Be:
        >>566
        で、そのワイド文字は、メモリ上にないのか? 
    
    579 デフォルトの名無しさん [sage] 2010/10/02(土) 21:02:00 ID: Be:
        >>578
        wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] ) 
    
    580 デフォルトの名無しさん [sage] 2010/10/02(土) 21:46:24 ID: Be:
        >>577
        で?
        可変に拘るのはいいが、無限の長さをどうやって扱うの? 
    
    581 デフォルトの名無しさん [sage] 2010/10/02(土) 21:48:03 ID: Be:
        PATH_MAX、4096バイトって
        たかがパス一つ保持するだけで
        スタック4KBも消費するのか・・・ 
    
    582 デフォルトの名無しさん [sage] 2010/10/02(土) 21:49:46 ID: Be:
        >>580
        どうやって扱うかじゃなくて
        バッファオーバーフローして
        セキュリティホールになるのが問題なんだよ。 
    
    583 デフォルトの名無しさん [sage] 2010/10/02(土) 21:52:03 ID: Be:
        バッファオーバーフローにさえならなければ
        char path[MAX_PATH]での
        何の問題もないよ。
    
        単にこのソフトはMAX_PATH文字のパスしか
        扱えない仕様ってだけ。 
    
    584 デフォルトの名無しさん [sage] 2010/10/02(土) 21:57:52 ID: Be:
        >>582
        そりゃバッファが固定長なのが問題じゃなく、バッファの長さを管理してないのが問題なんじゃねぇか 
    
    585 デフォルトの名無しさん [sage] 2010/10/02(土) 21:59:00 ID: Be:
        >>583
        文字じゃなくてバイト
        Shift_JISなら最後のバイトが欠ける可能性がある 
    
    586 デフォルトの名無しさん [sage] 2010/10/02(土) 22:29:49 ID: Be:
        ○ バッファオーバーラン
        × バッファオーバーフロー 
    
    587 デフォルトの名無しさん [sage] 2010/10/02(土) 22:39:22 ID: Be:
        "バッファオーバーラン"   約 16,500 件 (0.17 秒)
        "バッファオーバーフロー" 約 107,000 件 (0.03 秒)
    
    

    なんとなくだけど、 バッファオーバーラン→データそのものはバッファをはみ出すことなく収まっているんだけど 終端を通り越したポインター操作するとかいう感じ(文字列終端の \0 がないところに strlen するとか)で、 バッファオーバーフロー→バッファに収まらない大きさ(長さ)のデータを 放り込んじゃいました。てなところかなあ。

    ■_

    ■_

    訳が進まない~

    ■_

    2010年10月01日

    ■_

    ベイスターズが売却云々という話が出ているのでなんか書こうと思ったのですがめんどくせー

    ■_ もなど

    
    関数型プログラミング言語Haskell Part12 
    939 デフォルトの名無しさん [] 2010/10/01(金) 08:12:25 ID: Be:
        さいきん、モナドについて調べてるんだけど、このページの
        http://blogs.dion.ne.jp/keis/archives/5984552.html
        「群論の四則演算と同じで、圏論のモナドも公理系の利便性を享受すればいいんだよ!」
        という見方って合ってるのかな? 
    
    940 デフォルトの名無しさん [sage] 2010/10/01(金) 10:01:28 ID: Be:
        Haskell のモナドはイテレータ
        繰り返しとは限らないけどイテレータ
        ほとんどの言語が、独特の工夫を凝らしたイテレータをもっている 
    
    941 デフォルトの名無しさん [sage] 2010/10/01(金) 10:13:05 ID: Be:
        >>939
        合ってると思う
        Haskellの学習という観点だったら、モナドについて圏論的な理解を深めるよりも
        プログラミング上のテクニックとしてモナド変換子の使い方でも学んだ方が良い 
    
    942 デフォルトの名無しさん [sage] 2010/10/01(金) 10:48:09 ID: Be:
        >>939
        俺もこれ読んで少しモナドが理解できた。
        Haskellのモナドって正確にはKleisliなんたらってやつなんでしょ? 
    
    943 デフォルトの名無しさん [sage] 2010/10/01(金) 13:24:35 ID: Be:
        ぐぐったら、プログラム・プロムナードの2006年3月号に書いてた
        Haskellのモナド⊂圏論のモナド、になるんだな
        該当のPDF,teeの定義ではあってるのに
        巻末のまとめのfmapの型が間違ってる気がする 
    
    944 デフォルトの名無しさん [sage] 2010/10/01(金) 16:26:36 ID: Be:
        >>941
        なるほど。Haskellにおけるモナドの全体像が見えてきた気がする。
    
        参考までにもう一つ聞きたいんだけど、圏論の道具がプログラミングに使えるっていうのは、
        いちおう理論的な裏付けがあるんだよね? もし三行で説明できる内容なら教えて欲しい。 
    
    945 デフォルトの名無しさん [sage] 2010/10/01(金) 17:12:10 ID: Be:
        >>944
        色々な概念の整合性が理論的に保証できる事が圏論を使うことの利点の一つ。 
    
    946 デフォルトの名無しさん [sage] 2010/10/01(金) 19:01:01 ID: Be:
        >>944
        3行じゃないけどこれ読んどけ
        http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html 
    
    947 デフォルトの名無しさん [sage] 2010/10/01(金) 19:20:43 ID: Be:
        >>946
        1行で要約すると: IOは置いてconcatMapの話を聞け 
    
    

    圏論といえばいい加減これ→ Basic Category Theory for Computer Scientists (Foundations of Computing)
    読み切らないとなあ。 薄い本なのに1/3位で止まってます ○| ̄|_

    こんなんじゃいつまで経っても黄色い本には以下略

    ■_ ○○でLisp

    Rubyとかawkとかもあったし、なにか適当な言語で自分もやってみようかしらん。

    
    (How to Write a (Lisp) Interpreter (in Python))
    (How to Write a (Lisp) Interpreter (in Python))
    
    This page has two purposes: to describe how to implement computer language 
    interpreters in general, and in particular to show how to implement a subset of the 
    Scheme dialect of Lisp using Python. I call my interpreter Lispy (lis.py). Years ago, 
    I showed how to write a Scheme interpreter in Java as well as one in Common Lisp. This 
    time around the goal is to demonstrate, as concisely and accessibly as possible, what 
    Alan Kay called "Maxwell's Equations of Software."
    
    Syntax and Semantics of the Lispy Scheme Subset
    
    Most computer languages have a variety of syntactic conventions (keywords, infix 
    operators, brackets, operator precedence, dot notation, semicolons, etc.), but as a 
    member of the Lisp family of languages, all of Scheme's syntax is based on lists in 
    parenthesized prefix notation. This may seem unfamiliar, but it has the virtues of 
    simplicity and consistency. (Some have joked that "Lisp" stands for 
    "Lots of Irritating Silly Parentheses"; I think it stand for "Lisp Is 
    Syntactically Pure".) Consider:
    
        Java	      		Scheme
        if (x.val() > 0) {	(if (> (val x) 0)
          z = f(a * x.val() + b);       (set! z (f (+ (* a (val x)) b))))
        } 	  
    
    
    Note that the exclamation mark is not a special character in Scheme; it is just part 
    of the name "set!". Only parentheses are special. A list such as (set! x y) 
    with a special keyword in the first position is called a special form in Scheme; the 
    beauty of the language is that we only need six special forms, plus three other 
    syntactic constructions—variables, constants, and procedure calls:
    
    (略)
    
    To learn more about Scheme consult some of the fine books (by Friedman and Fellesein, 
    Dybvig, Queinnec, Harvey and Wright or Sussman and Abelson), videos (by Abelson and 
    Sussman), tutorials (by Dorai, PLT, or Neller), or the reference manual.
    
    What A Language Interpreter Does
    
    A language interpreter has two parts:
    
       1. Parsing: The parsing component takes an input program in the form of a sequence 
          of characters, verifies it according to the syntactic rules of the language, and 
          translates the program into an internal representation. In a simple interpreter
          the internal representation is a tree structure that closely mirrors the nested
          structure of statements or expressions in the program. In a language translator
          called a compiler the internal representation is a sequence of instructions that
          can be directly executed by the computer. As Steve Yegge said, "If you don't
          know how compilers work, then you don't know how computers work." Yegge describes 8 
          scenarios that can be solved with compilers (or equally with interpreters, or 
          alternatively with Yegge's typical heavy dosage of cynicism.) The Lispy parser is 
          implemented with the function parse.
    
       2. Execution: The internal representation is then processed according to the semantic
          rules of the language, thereby carrying out the computation. Execution is
          implemented with the function eval (note this shadows Python's builtin function). 
    
    Here is a picture of the interpretation process and an interactive session showing how 
    parse and eval operate on a short program:
    
    
    (略)
    
    
    Peter Norvig
    
    
    

    あとでできるだけ訳つけます ○| ̄|_

    訳発見 ((Pythonで) 書く (Lisp) インタプリタ)

    ■_

    ■_

    寝る前にくじけることが多いなあ。最近。


    一つ前へ 2010年9月(下旬)
    一つ後へ 2010年10月(中旬)

    ホームへ


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

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