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

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

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

ホームへ

2010年02月20日

■_

・scala本
まあ餅は餅屋で Scala そのものについての記述はみずしまさんにお任せして。 Twitter / Kota Mizushima: やさしいScala入門、予想通りひどい本だった…。 Twitter / Kota Mizushima: 内容そのものの誤りは*思っていたよりは*少なかったけ ... 気になった記述をひとつ挙げておきます。 他にもあるかもしれないけど目を通している余裕がなかったのねん。

p28

暗黙の型変換

同じ種類の型の場合、サイズが大きい型の変数などにサイズが小さい型の値を代入すると、
暗黙のうちに型が変換されます。次に示すのは、暗黙の型変換が行われる例です。

scala> var b: Byte = 67
b: Byte = 67
scala> var s: Short = b  // Byte からShortに暗黙のうちに変換される
s: Short = 67
scala> var i: Int = s    // Short から Int に暗黙のうちに変換される
: Int = 67
scala> var l: Long = i   // Int から Long に暗黙のうちに変換される
l: Long = 67
同様に、Float型の値をDouble型の変数に代入するときも、暗黙の型変換が行われます。ただし、 整数から浮動小数点数に変換されるときや、32ビットIEEE754 単精度浮動小数点数から 64ビット IEEE754 倍精度浮動小数点数に変換されるときに、数値の内部表現に限界があるために誤差が発 生することがあります。

Float → Double の代入を行って「誤差が発生する」ケースってどんなのでしょうか? 仮数部のビット数は Double のほうが多いし、基数も同じだから特に問題になるような 「変換」は起きないような気がするんですが。 それと、「整数」から「浮動小数点数」への「代入に行われる変換」で発生する 「誤差」というのもよくわかりません。 仮に、32bit int から 32 bit float だとか、 64bit int から 64bit double に代入するというのであれば、 その整数が非常に大きい値(仮数部に収まらない)ものであれば float なり double では表現できずに一部の値が失われますが、 これを「誤差」って呼ぶのはなんか変な感じがします。

・ScanSnap
S1300 がどんな感じなのか使っている人の感想など知りたい、 できれば S1500 と両方使った人の話があればと思って検索してみたら、 S1300 の使用感について、たださんのところが上位に来てました ScanSnap S1300を買った - ただのにっき(2010-02-08) んー、1300でいいかなあ。

■_ あのにます

このネタも引っ張り続けるぞ(笑)


The Derivation of Y-Combinator - good coders code, great reuse

The Derivation of Y-Combinator

Y-Combinator

In this post I'll derive the Y-combinator and explain all the steps taken. The key to 
understanding the Y-combinator is knowing precisely what it does. I am sure many 
people never understand Y-combinator because of this very reason, or because the 
introduction is too lengthy to comprehend. Therefore I'll give the shortest possible 
explanation of Y-combinator before I derive it so that you know what the end result 
should be.

The Y-combinator allows an anonymous function to call itself, that is, it allows 
anonymous function recursion. Since anonymous functions don't have names, they can't 
refer to themselves easily. The Y-combinator is a clever construct helps them to refer 
to themselves. That's it. That's all the Y-combinator does. Remember that.

Since anonymous functions don't have names, というように anonymous のことを表現しているのだから、 「匿名関数」はないと思うんだよねー。 それ以前に「無名関数」って訳があったはずなのに、どうして Java とか .NET では「匿名関数」(匿名デリゲート)とかになっちゃったんだろう。

■_ そういえば来月号の Software Desgin では

Cプログラム診断室が復活するとか何とか


この会社辞めようと思ったソースコード#1C 
6 仕様書無しさん [sage] 2010/01/24(日) 22:42:49 ID: Be:
    csvデータファイルの変換を行うプログラム。頭から書き直したくなった。
    int i;
    void main(){
    fp = fopen(...

    (略)

    getOneLine(fp,buf);
    for(i=0;i<320;i++){
    getToken(buf,i,token);
    switch(i){
    case 0:
    func0(buf);
    break;
    case 1:
    func1(buf);
    break;

    (略)

    case 319:
    func319(buf);
    break;
    }
    } 

7 仕様書無しさん [sage] 2010/01/25(月) 01:53:52 ID: Be:
    funcN()でiを弄ってたりしそうな勢いだ 

23 仕様書無しさん [sage] 2010/01/30(土) 22:12:05 ID: Be:
    >>6
    こういうプログラムに限って、途中で

    case 231:
    func232(buf);
    break;
    case 232:
    func231(buf);
    break;

    とかコメントもなくなっていて、
    意図的なのかミスなのかわからないんだよなぁ・・・ 

24 仕様書無しさん [sage] 2010/01/31(日) 14:44:34 ID: Be:
    >>23
    あるあるあるあるwww

    思い出すどころか想像するだけでゲンナリする。
    VBでコントロール配列使わず、100個ほどボタンを置いたフォームの
    OnClickの群れの方が対照させやすい点でまだいいな。
    まぁ今更VB自体使いたくないけど。 

25 仕様書無しさん [sage] 2010/01/31(日) 16:21:41 ID: Be:
    VB6はvistaで動作保証がある。
    たぶん7でも問題なく動くケースが多いから、あと数年は確実に残るんじゃないか。

    つ~か、この不況でvb.netやC#に移行する金が出せる企業は……
    (言語本体は安いけど、サードパーティ製の各種コンポーネントが……) 

26 仕様書無しさん [sage] 2010/02/20(土) 15:34:58 ID: Be:
    >>24

    唐突に思い出したんだが、配列が嫌いなプログラマが書いたコードがあった。

    リングバッファの処理らしいんだが

    void DetaSettei( int atai )
    {
    atai1 = atai2;
    atai2 = atai3;
    .........
    atai255 = atai254;
    atai0 = atai;

    genIchi = ++genIchi % 256
    }

    うちでは技術力はあると言われている人
    ちなみに、関数名とか変数名は若干いじったが、元も大抵ローマ字っぽい何かが多い

27 仕様書無しさん [sage] 2010/02/20(土) 15:48:14 ID: Be:
    配列使ってても書き直せ馬鹿って言われるであろう計算量だな 

28 仕様書無しさん [sage] 2010/02/20(土) 16:43:33 ID: Be:
    >>27

    計算量は変わらないだろ。メモリアクセスはかなり増えるが。

    昔、配列 と memcopy で 26 のコードを見た事がある。
    Verilog HDLで回路設計やってる人だったけど、
    ゲートのシフトレジスタ・FIFOのイメージでと言ってた。



29 仕様書無しさん [sage] 2010/02/20(土) 17:13:04 ID: Be:
    >>27
    動いてればまだ多少は許せるのだが、この人たちのプログラムは正直、
    アレなバグがやたら多いんだよね。

    atai221 = atai220;
    atai222 = atai220;

    みたいな

    直せと言われて、直すんだけど、大体配列なり、変なグローバル変数の使い方を改めると
    1/3ぐらいそれで直る(笑)

    そこまでしてこだわる理由を聞くと、配列使うより、こうした方が処理が早くなると言われるんだ。

    その割に、デバッグビルド(最適化オプションなしか緩め)で客先に納品されたり、
    なかなか間抜けなことが多い

30 仕様書無しさん [sage] 2010/02/20(土) 17:25:15 ID: Be:
    組み込みやってる(やってた)人ならパイプラインのストールを嫌って
    単純ループなプログラムを回避したと推測してみる 

31 仕様書無しさん [sage] 2010/02/20(土) 17:44:58 ID: Be:
    >>30
    今のコンパイラならオプションである程度
    展開してくれるから、そこまで変わらん 

26 のコード、genIchi を使ってどうやってスカラー変数の群れから 値を取り出すんだろう? Perl や PHP じゃないんから ${'atai' . $genIchi} なんてこたできないだろうし。 あとリングバッファだったら、配列使えばひとつひとつ転送しないでも、 インデックスだけ管理すればいいような気が。

■_ Scala 十の落とし穴

Scala 本の話も出ましたのでw


10 Scala Programming Pitfalls | Javalobby

Scala プログラミングの十個の落とし穴

Scala is great for highly scalable, component-based applications that support 
concurrency and distribution.  It leverages aspects of object-oriented and functional 
programming.  This JVM-based language gained most of its clout when it was announced 
that Twitter was using it.  If used correctly, Scala can greatly reduce the code 
needed for applications.

Scala は、非常に scalable であり、並列処理や分散処理をサポートするコンポーネントベース
のアプリケーションに向いたものです。Scala はオブジェクト指向プログラミングや関数プログ
ラミングの aspects をleverages します。この JVMベースの言語は、Twitter  がこの言語を使
用するというアナウンスがされたときに最も影響力を獲得しました。正しく使えば、Scala はア
プリケーションに必要となるコードを大幅に縮減 (reduce) してくれるでしょう。


For the Scala programmmer, DZone has gathered these common code-writing pitfalls.  
These tips come from Daniel Sobral, a Scala enthusiast who has managed Java software 
development projects and participated in the FreeBSD project.

Scala プログラマーにとって、DZone はこのような一般的な code-writing pitfalls (コードを
書くときの落とし穴)を集めています。そこにある tips はJava ソフトウェア開発プロジェクト
をマネージメントしたりFreeBSD プロジェクトに加わったりした Scala の enthusiast である
Daniel Snbral によるものです。


1.  Syntactic Mistake
構文的な誤り

Thinking of "yield" as something like "return".  People will try:

"yield"を "return"のように考えてしまって次のようにしてしまいがちです:

  for(i <- 0 to 10) {
    if (i % 2 == 0)
      yield i
    else
      yield -i
  }

Where the correct expression is:

正しい式はこうなります:

  for(i <- 0 to 10)
  yield {
    if (i % 2 == 0)
      i
    else
      -i
  }

 

2. Misusage and Syntactic Mistake

Using scala.xml.XML.loadXXX for everything. This parser will try to access external 
DTDs, strip comments, and similar things. There is an alternative parser in 
scala.xml.parsing.ConstructingParser.fromXXX.

何に対しても scala.xml.XML.loadXXX を使ってしまう。このパーザーは外部の DTDs にアクセ
スしようとし、コメントを剥ぎ取るなどのことを行います。代替パーザーが
scala.xml.parsing.ConstructingParser.fromXXX にあります。


Also, forgetting spaces around the equal sign when handling XML. This:

また、XMLを処理するときにイコール記号の周りにスペースを置くことを忘れてしまう。

 val xml=<root/>

really means:

これは次のように解釈されます:

  val xml.$equal$less(root).$slash$greater

This happens because operators are fairly arbitrary, and Scala uses the fact that 
alphanumeric character must be separated from non-alphanumeric characters by an 
underscore in a valid identifier to be able to accept expressions such as 
"x+y" without assuming this is a single identifier. Note that "x_+" 
is a valid identifier, though.

これは演算子が fairly arbitary なために起きることで、そして Scala はalpha numeric 
characters がある正当な識別子中においてはアンダースコアによって non-alphanumeric 
characters から分離されなければならないという規則を使って、ひとつの識別子であるという
仮定を置くことなく "x+y" のような式を受理するのを可能にしています。"x_+"
が正当な識別子 (vaild identifier)であることに注意してください。


So, the way to write that assignment is:

ですから、先ほどの代入は次のように記述します:

  val xml = <root/>


3.  Misusage Mistake

Using the trait Application for anything but the most trivial use.  The problem with:

trait Application を anything but the most trivial use (些細なことでないこと
すべて) のために使う。


  object MyScalaApp extends Application { 
    // ... body ...
  }

is that body executes inside a singleton object initialization.  First, the execution 
of singletons initialization is synchronized, so your whole program can't interact 
with other threads.  Second, JIT won't optimize it, thus making your program slower 
than necessary.

このようにしてしまうことの問題点は、その本体がシングルトンオブジェクトの初期化の内部で
実行してしまうことです。第一に、シングルトンの初期化の実行は同期されます (synchronized) 
から、あなたのプログラム全体は他のスレッドとやり取り (interact) できません。第二に、
JIT はこれを最適化しません。したがって、あなたのプログラムは必要以上に遅いものになって
しまいます。

By the way, no interaction with other threads means you can forget about testing GUI 
or Actors with Application.

ところで他のスレッドとやり取り (interaction) しないということは、あなたが GUI のテスト
や Application を使った Actors を忘れてしまっている可能性があるということを意味します。


4. Misusage Mistake

Trying to pattern match a regex against a string assuming the regex is not bounded:

正規表現 (regex) が束縛されていないことを仮定している文字列に対して、正規表現による
パターンマッチングを試みる:

  val r = """(\d+)""".r
  val s = "--> 5 <---"
  s match {
    case r(n) => println("This won't match")
    case _ => println("This will")
  }

The problem here is that, when pattern matching, Scala's Regex acts as if it were 
bounded begin and end with "^" and "$".  The way to 
get that working is:


これが問題なのは、パターンマッチングのときの Scala の Regex は開始位置と終了位置がそれ
ぞれ "^" and "$" で束縛されているかのように振舞うからです。
動作するやり方はこうです:


  val r = """(\d+)""".r
  val s = "--> 5 <---"
  r findFirstIn s match {
    case Some(n) => println("Matches 5 to "+n)
    case _ => println("Won't match")
  }

Or just making sure the pattern will match any prefix and suffix:

あるいはパターンが任意の prefix や suffix にマッチするようにします:


  val r = """.*(\d+).*""".r
  val s = "--> 5 <---"
  s match {
    case r(n) => println("This will match the first group of r, "+n+", to 5")
    case _ => println("Won't match")
  }



5. Misusage Mistake

Thinking of var and val as fields.

var と val をフィールドのように考えてしまう。

Scala enforces the Uniform Access Principle, by making it impossible to refer to a 
field directly. All accesses to any field are made through getters and setters. What 
val and var actually do is define a field, a getter for that field, and, for var, a 
setter for that field.

Scala は Uniform Access Principle (統一されたアクセスの原則?)を推奨 (enforce) して
います。フィールドを直接参照できないようにすることで、すべてのフィールドに対するアク
セスはすべて下駄と雪駄を通して行われます。val とvar は実際にはフィールドとして定義さ
れていて、そのフィールドに対する下駄と、var に対応するフィールドに対する雪駄も定義
されています。


Java programmers will often think of var and val definitions as fields, and get 
surprised when they discover that they share the same namespace as their methods, so 
they can't reuse their names. What share the same namespace is the automatically 
defined getter and setter, not the field. Many times they then try to find a way to 
get to the field, so that they can get around that limitation -- but there's no way, 
or the uniform access principle would be violated.

Javaプログラマーは varやvalの定義をフィールドのように考える傾向があって、フィールドが
メソッドのように同じ名前空間を共有しているためにその名前を再利用できないことを発見した
ときにびっくりします。同じ名前空間を共有するということは自動的に下駄と雪駄が定義される
がフィールドは定義されないということです。何度となく彼らは制限を回避してフィールドを得
るための手段を探し求めましたがしかし方法はありませんし。さもなければ uniform 
access principle を破ることになってしまいます。

Another consequence of it is that, when subclassing, a val can override a def. The 
other way around is not possible, because a val adds the guarantee of immutability, 
and def doesn't.

このことのもうひとつの結論は、サブクラス化の際にval が def をオーバーライドできてしま
うということです。val は immutablitiy を追加しますが def は追加しないのでほかの方法は
可能ではありません。


There's no guideline on what to call private getters and setters when you need to 
override it for some reason. Scala compiler and library code often use nicknames and 
abbreviation for private values, as opposed to fullyCamelNamingConventions for public 
getters and setters. Other suggestions include renaming, singletons inside an instance, 
or even subclassing. Examples of these suggestions:

何らかの理由で下駄や雪駄のオーバーライドが必要なときに、private な下駄と雪駄を呼び出す
ためのガイドラインはありません。Scala コンパイラーとライブラリコードはしばしばニックネ
ーム (nicknames) と略称 (abbreviation) をprivate な値のために使い、public な下駄や雪駄
のためにはfullyCamelNamingConventions を使います。そのほかの提案には、リネーミング 
(renaming)、あるインスタンスの内部にあるシングルトン、サブクラス化さえ挙げられました。
こういった提案の例を挙げましょう:


Renaming リネーミング

   class User(val name: String, initialPassword: String) {
     private lazy var encryptedPassword = encrypt(initialPassword, salt)
     private lazy var salt = scala.util.Random.nextInt
    
     private def encrypt(plainText: String, salt: Int): String = { ... }
     private def decrypt(encryptedText: String, salt: Int): String = { ... }
    
     def password = decrypt(encryptedPassword, salt)
     def password_=(newPassword: String) = encrypt(newPassword, salt)
   }

Singleton シングルトン

   class User(initialName: String, initialPassword: String) {
      private object fields {
        var name: String = initialName;
        var password: String = initialPassword;
      }
      def name = fields.name
      def name_=(newName: String) = fields.name = newName
      def password = fields.password
      def password_=(newPassword: String) = fields.password = newPassword
    }

alternatively, with a case class, which will automatically define methods for equality, 
hashCode, etc, which can then be reused:

等価性の検査のために自動的に定義されるメソッドを定義する再利用可能な case クラス
や HashCode など


   class User(name0: String, password0: String) {
     private case class Fields(var name: String, var password0: String)
     private object fields extends Fields(name0, password0)
    
    
     def name = fields.name
     def name_=(newName: String) = fields.name = newName
     def password = fields.password
     def password_=(newPassword: String) = fields.password = newPassword
   }

Subclassing サブクラス化

   case class Customer(name: String)
    
   class ValidatingCustomer(name0: String) extends Customer(name0) {
     require(name0.length < 5)
    
     def name_=(newName : String) =
       if (newName.length < 5) error("too short")
       else super.name_=(newName)
   }
 
   val cust = new ValidatingCustomer("xyz123")


6. Misusage Mistake

Forgetting about type erasure. When you declare a class C[A], a trait T[A] or a 
function or method m[A], A is not present at run-time. That means, for instance that 
any type parameter will be actually compiled as AnyRef, even though the compiler 
ensures, compile time, that the types are respected.

type erasure のことを忘れる。クラスC[A]、trait T[A]、あるいは関数もしくはメソッドの 
m[A]を宣言すると、A は実行時には存在していていません。これは任意の型パラメータのインス
タンスは、コンパイル時にその型が期待できるとコンパイラーが保証したとしても実際には 
AnyRef としてコンパイルされるためです。

It also means that you can't use type parameter A at compile time. For instance, this 
won't work:

これはまた、型パラメーター A をコンパイル時に使えないということでもあります。
たとえば次のコードは動きません。


  def checkList[A](l: List[A]) = l match {
    case _ : List[Int] => println("List of Ints")
    case _ : List[String] => println("List of Strings")
    case _ => println("Something else")
  }

At run-time, the List being passed doesn't have a type parameter. Also, List[Int] and 
List[String] will both become List[_], so only the first case will ever be called.

実行時には、このList は型パラメーターなしで渡されます。また、List[Int] や List[String] 
は両方とも List[_] になりますので、最初の case だけが呼び出されることになるのです。


You can get around this, to some extent, by using the experimental feature Manifest, 
like this:

以下の例のように実験的な機能 (experimental feature) である Manifest を使うことで
これに対処することができます;


  def checkList[A](l: List[A])(implicit m: scala.reflect.Manifest[A]) = m.toString match {
    case "int" => println("List of Ints")
    case "java.lang.String" => println("List of Strings")
    case _ => println("Something else")
  }



7. Design Mistake 設計のミス

Careless use of implicits. Implicits can be very powerful, but care must be taken not 
to use implicit parameters of common types or implicit conversions between common 
types.

不注意な implicits の使用。implicits は非常に強力なものになりえますが、絶対にcommon 
types の implicit parameters を使用しないように、また、common types 間の implicit 
conversions が発生しないように注意しなければなりません。


For example, making an implicit such as:

例として以下のような implicit を行います:

  implicit def string2Int(s: String): Int = s.toInt

is a very bad idea because someone might use a string in place of an Int by mistake.  
In cases where there's use for that, it's simply better to use a class:

これはとても悪いアイデアです。なぜなら、間違って Int のところで string を使ってしまう
かもしれないからです。そういった使い方がありうる場合には、単に class を使うほうがよい
のです。


  case class Age(n: Int)
  implicit def string2Age(s: String) = Age(s.toInt)
  implicit def int2Age(n: Int) = new Age(n)
  implicit def age2Int(a: Age) = a.n

This will let you freely combine Age with String or Int, but never String with Int.

こうするとあなたは自由に Age と String や Int を組み合わせることができますが、
String に Int を組み合わせることはできなくなります。

Likewise, when using implicit parameters, never do something like:

同様に、implicit parameters を使うときには
次のようなことを行ってはいけません:

  case class Person(name: String)(implicit age: Int)

Not only this will make it easier to have conflicts of implicit parameters, but it 
might result in an implicit age being passed unnoticed to something expecting an 
implicit Int of something else. Again, the solution is to use specific classes.

これは implicit parameters の衝突を起こしやすくするばかりでなく


繰り返しますが、これに対する解決策は特定のクラス群を使うことです。


Another problematic implicit usage is being operator-happy with them. You might think 
"~" is the perfect operator for string matching, but others may use it for 
things like matrix equivalence, parser concatenation, etc. So, if you are going to 
provide them, make sure it's easy to isolate the scope of their usage.

もうひとつの問題のある implicit の使い方はoperator-happy with them にするということで
す。あなたは "~" が文字列マッチングに対する演算子以外の何者でもないと考える
かもしれませんが、他の人はそれを行列の等価性 (equivalence) のためやパーザーの連結
(concatnation) などに使っているかもしれません。ですから、あなたがそういった機能を提供
しようと考えているのなら、その使い方をしているスコープを isolate しやすいようにしてお
きましょう。


8. Design Mistake 設計上の誤り

Badly designing equality methods. Specifically:

等価性のチェックを行うメソッドの badly な設計。特に:

    * Trying to change "==" instead of "equals" (which gives you "!=" for free).

"equals" を "==" に代えるようにしましょう (こうすると "!=" がタダでついてきます)。

    * Defining it as

  def equals(other: MyClass): Boolean

        instead of
        のように定義するのではなく、次のようにします

  override def equals(other: Any): Boolean

    * Forgetting to override hashCode as well, to ensure that if a == b then 
      a.hashCode == b.hashCode (the reverse proposition need not be valid).

      a == b のときに a.hashCode == b.hashCode であることを保証するための
      hashCode のオーバーライドを忘れる (逆方向の proposition は必須で
      はありません)

    * Not making it commutative: if a == b then b == a. Particularly think of 
      subclassing -- does the superclass knows how to compare against a subclass
      it doesn't even know exists?  Look up canEquals if needed.

       a == b のときに b == a  になるように commutative にしない。
       スーパークラスはサブクラスに対してどのように比較されるのか、そのサブクラスが
       存在するかどうかをスラ知らないのに知っているでしょうか?
       必要であれば canEquals を look up する。
       

    * Not making it transitive: if a == b and b == c then a == c.

      a == b であり b == c であるときに a == c であるような transitive にしない。

9. Usage Mistake 使い方の間違い

On Unix/Linux/*BSD, naming your host (as returned by hostname) something and not 
declaring it on your hosts file. Particularly, the following command won't work:

Unix/Linux/*BSD では、自分のホストを(hostname で返されるように)命名しますが
hosts files にそれを記述しません。
特に、次のようなコマンドは動作しません:

  ping `hostname`

In such cases, neither fsc nor scala will work, though scalac will. That's because fsc 
stays running in background an listening to connections through a TCP socket, to speed 
up compilation, and scala uses that to speed up script execution.

このような場合、scalc では動作しますがfsc でも scala も動作しません。これは、fsc がバ
ックグラウンドで動作しつづけていて、高速化のために TCPソケットのコネクションを listening
しているからです。また、scala はこれをスクリプト実行の高速化のために使用しています。


10. Style Mistake スタイルの間違い

Using while. It has its usages, but, most of the time, a solution with 
for-comprehension is better.

while を使う。while には while の使い道というのがありますが。ほとんどの場合は 
for-comprehension を使った solution のほうが better です。

Speaking of for-comprehensions, using them to generate indices is a bad idea too. 
Instead of:

for-comprehensions については、それを添字を生成するために使うことはこれまた
良くないアイデアです。

  def matchingChars(string: String, characters: String) = {
    var m = ""
    for(i <- 0 until string.length)
      if ((characters contains string(i)) && !(m contains string(i)))
        m += string(i)
    m
  }

のようにするのではなく、次のようにします:
Use:

  def matchingChars(string: String, characters: String) = {
    var m = ""
    for(c <- string)
      if ((characters contains c) && !(m contains c))
        m += c
    m
  }

If one needs to return an index, the pattern below can be used instead of iterating 
over indices. It might be better applied over a projection (Scala 2.7) or view (Scala 
2.8), if performance is of concern.

もし添字を返す必要があるのなら、以下に示したパターンを添字に対して iterarting over す
る代わりに使えます。性能を重視する場合にこれは projection (Scala 2.7) を適用したりviwe 
(Scala 2.8) を適用するよりも better な可能性があります。

  def indicesOf(s: String, c: Char) = for {
    (sc, index) <- s.zipWithIndex
    if c == sc
  } yield index

 

■_ 本日の巡回から

2010年02月19日

■_

・やさしい
ついったー経由で知ったんですが、Scala 本もお書きになるとはっ Twitter / ジュンク堂書店池袋本店/PC書: 2/19新刊:ISBN978-4-87783-238 ... Twitter / 書泉ブックタワーコンピュータ書売り場: 2/19新刊『やさしいScala入門』 カットシステ ... んで、出版社のページを見ると掲載のサンプルプログラムがダウンロードできるようになってたりするんですが やさしいScala入門、 内容が不安視される代物のようです Twitter / Kota Mizushima: とりあえず、本文に掲載されたソースコードがダウンロー ... 週末に見かけたら買っちゃう鴨。 でも重箱の隅をつつけるほどわし Scala 知らんのだよねえ(^^;

・Software Design 2月号
先月号になってしまいましたが、連載記事の 「SOFTWARE DESIGNER #10 コードの裏の開発者たち」 でイタリアの方 (Gianugo Rabellino) へのインタビューだったのですが、 英語が母語でないことのハンデを感じている。人によっては それが理由でオープンソース活動に参加するのをためらっている人もいる といった旨の発言があったりで、 ヨーロッパの人でもそうなんかとちょっとびっくりしました。

・まだまだ引っ張るFORTRAN
暗黙の型宣言の話なんですが、i から「6個」というのは理由を思いつかないでもないんですよね。 最初に FORTRAN が実装された IBM 704 という機械なんですが


IBM 704 - Wikipedia, the free encyclopedia

Registers

The IBM 704 had a 38 bit accumulator, a 36 bit multiplier quotient register, and three 
15 bit decrement registers. The decrement registers were a kind of index register 
whose contents were subtracted from the base address instead of being added to it. All 
three decrement registers could participate in an instruction: the 3 bit tag field in 
the instruction was a bit map specifying which of the registers would participate in 
the operation.

and three 15 bit decrement registers. The decrement registers were a kind of index register とありますけど、 あやふやな記憶なんですが初期の FORTRAN って配列は三次元までの制限だったと思うんですよね。 つまり、このインデックスレジスターの数。 んで、ソースとデスティネーションそれぞれ3個ずつで計6個と。

■_ Do you still program in Perl?

reddit から。 ネタ振りと最初の回答だけ。


Do you still program in Perl? : programming

Guys, Perl is one of my favorite languages. But recently, when it comes to web 
development, all I've heard is PHP. I don't know, but I feel this resistance to learn 
PHP. Should I give in?

What cool projects are you currently working on with Perl?
Welcome to 2010, Mr. Time Traveler. You may be interested to know Netscape is no 
longer the dominant web browser, and that Java applets never took off.

But, seriously, you've been using Perl and just now heard about PHP? What?

If you're not using PHP already, I strongly recommend not learning it. Perl, ugly and 
misfeatured though it might be, is maintained by experienced and knowledgeable 
developers. It still has some market share, and you can find libraries to achieve most 
goals. Look into the Catalyst library for writing dynamic web pages.

If you'd like to learn a new language for web development, the current best choices 
are Ruby (with Rails) and Python (with Django). My preference is Python, though I've 
heard Ruby's syntax is more familiar to Perl refugees. Both languages have active and 
growing communities. Try both! A few days of working with mature libraries will give 
you a general feel for the language, and there's no harm in knowing both.

And, no matter what language you pick for the back end, you'll want to learn jQuery. 
Technically, jQuery is a library for the JavaScript language, but at this point I 
think it's fair to say that JavaScript has become a jQuery implementation detail.

PHP は…(苦笑)

■_ What is the fate of Java

もうひとつ reddit から。こっちは盛大に伸びてます。


What is the fate of Java : programming

I spent most of college learning to program through Java. Personally, it has remained 
my programming language of choice. Recently I have heard the language is quickly 
falling behind, especially to scripting languages. How does the Reddit community feel 
about this?

    * 504個のコメント
Stock generic and yet correct answer: Java will continue to be the language of choice 
for enterprise software development for a long time but it won't hurt you to learn a 
modern scripting language. Languages like Python and Ruby will become more prevalent 
in areas like casual web development where something like Java might be overkill. 
Learning a new way of doing things will only make you a better developer.

Controversial answer: Reddit is not a true representative of the software market. It 
is more of a representative of the human condition. And it has a very strong culture. 
Threads are voted according to popularity instead of value. Local customs and 
groupthink are reinforced while foreign ideas are shunned. And people are more willing 
to comment if their message corresponds to the fashion of the moment. And right now 
Java is almost as uncool as PHP, so reddit makes it look like it is a lot less popular 
and relevant than it actually is.

reddit では Java も不人気度(?)が高いですよと。

■_

しばらくスルーしてましたが


Journal of chromatic (983)

Perl 6 Design Minutes for 03 February 2010
[ #40191 ]

The Perl 6 design team met by phone on 03 February 2010. Larry, Patrick, and chromatic 
attended.

Larry:

    * more cleanup of iteration semantics
    * no longer signal end with Nil, but with special EMPTY failure
    * this can support either unthrown or thrown exception styles
    * added in batching iterator interface
    * proposed new E operator for efficient list end detection; gathering feedback
    * detangling of sigils from contexts; for example, @ no longer implies flattening
    * coercions all defined to take parcels so they don't flatten accidentally
    * more cleanup of various types (captures,lists) that should be considered parcels
    * forcibly amputated the @@ sigil; have fixed up most of the bloody stumps
    * instead of *@@ parameters, we now have a ** slice marker on parameters
    * removed references to [;] reduction since it wouldn't work (because of return parcel embedding)
    * new **() interpolator instead
    * clarified that function calls in a list are called eagerly, but their results are potentially lazy
    * (also mentioned ways to make the call lazy too)
    * renamed iterator methods for more clarity, removing contradictory usages of "item"
    * iterators now iterated with get, getobj, batch, and batchobj
    * specced that a missing maximum allows the iterator to decide batch size.
    * get and getobj must be atomic under multi-threading so message queues work (but maybe that's backwards, and push should be atomic)
    * slice now defined to turn subparcels into Seq objects
    * spec that most of the work of flat and slice are done by binding to *@ or **@
    * new flat operator detangles flattening semantics from normal unmarked list semantics
    * for all specced functions, *@@ parameters changed to **@
    * multiple dimensions now defined in terms of nested parcels, not feeds, to avoid implying multithreading on every subscript
    * either range or series iterator now autotruncates in a subscript
    * no autotruncation on left end of a subscript anymore
    * did some cleanup of feeds; more is needed to have clearer target semantics
    * feeds no longer take a whatever target with implicit semantics; just use an explicit target
    * not much hacking, but edited tests to change @@ to something else appropriate
    * tracked name changes in CORE
    * wrote a long screed on why Perl 6 has one-pass parsing and why typenames must be pre-declared

なるほど4月に予定されている Parrot でもフルスペック実装できないわけだよなあ more cleanup of iteration semantics とか proposed new E operator for efficient list end detection;とか。

■_ Javaの冗長性は


Verbosity is not Java's fault « Schneide Blog
Verbosity is not Java's fault
Quiz: Whats one of the most heard flaws of Java compared to other languages?

Bad Performance? That's a long overhauled myth. Slow startup? OK, this can be 
improved… It's verbosity, right? Right but wrong. Yes, it is one of the most 
mentioned flaws but is it really inherit to the language Java? Do you really think 
Closures, annotations or any other new introduced language feature will significantly 
reduce the clutter? Don't get me wrong here: closures are a mighty construct and I 
like them a lot. But the source of the problem lies elsewhere: the APIs. What?! You 
will tell me Java has some great libraries. These are the ones that let Java stand out! 
I don't talk about the functionality of the libraries here I mean the design of the 
API. Let me elaborate on this.

(以下略)

これの逆を言っているのを最近見たなあ。どこだっけ。

■_ Prolog

たまにスレの流れが速くなるし。


Prologでまったり Part4 
721 デフォルトの名無しさん [sage] 2010/01/26(火) 01:10:47 ID: Be:
    Prologを材料に論文を書くの意味ですか。
    でも、あなただって携帯が故障したら、Prologのお世話に
    なってるかも知れませんよ。 

722 デフォルトの名無しさん [sage] 2010/01/26(火) 04:58:09 ID: Be:
    GHCなんかは、並列(平行)に「仕切る」ための言語という
    印象が強いのだけれど、そういう位置での制御要請は
    今後多くなっていくものだろうか。 

723 デフォルトの名無しさん [sage] 2010/01/28(木) 10:38:47 ID: Be:
    >>722
    個々の自動車の平行プログラミングは関数型で勝手にやらせるので済むかもしれないが、
    俯瞰的な平行動作、たとえば自動車と通信しながら制御する信号の記述などでは
    GHC的なものが最有力ではないか。

724 デフォルトの名無しさん [sage] 2010/02/11(木) 04:23:23 ID: Be:
    クラウドコンピューティングが来ている以上、GHCの並列計算が見直される
    チャンスも普通に多いだろ。誰も提案しないだけで。 

725 デフォルトの名無しさん [sage] 2010/02/11(木) 16:58:18 ID: Be:
    クラウドコンピューティングは並列計算じゃなくて分散技術や信頼性工学の話だからな… 

726 デフォルトの名無しさん [sage] 2010/02/17(水) 18:38:27 ID: Be:
    >>721
    携帯じゃなくて、ADSL回線じゃなかったっけ?

727 デフォルトの名無しさん [sage] 2010/02/18(木) 18:18:33 ID: Be:
    携帯の故障診断はさすがに大変じゃないかな。半端な数でないし。
    ADSLでも10台以上同時に動かしてるんでしょ。それにしても、
    こんな大規模な実務に使われてるのにAZ-PrologはWikipediaにも紹介
    されてないね。

728 デフォルトの名無しさん [sage] 2010/02/19(金) 10:26:25 ID: Be:
    正直MapReduceがどうしてこれほどもてはやされてるのか分からない。
    あんなん普通にやってたことっしょ?
    大規模に現実に適用したからってこと?

729 デフォルトの名無しさん [sage] 2010/02/19(金) 16:58:50 ID: Be:
    >>727
    5年以上前だと思うけれど、ソフトバンクが10人単位でPrologプログラマの
    募集をした。ところが応募はなかったらしい。
    ソフトバンク+Prologという組み合わせでは将来の地位が不安ということ
    だったのかも知れないけど、日本の大学生も根性がないね。

730 デフォルトの名無しさん [sage] 2010/02/19(金) 18:20:35 ID: Be:
    威勢がいいだけならチンピラ 

731 デフォルトの名無しさん [sage] 2010/02/19(金) 18:35:15 ID: Be:
    威勢ねぇw

732 デフォルトの名無しさん [sage] 2010/02/19(金) 18:45:12 ID: Be:
    Prologで実務的なプログラムを書くことができる人は四十台後半より上。
    あと10年待てば大量にリタイアが始まるから供給は充分になる。 

733 デフォルトの名無しさん [sage] 2010/02/19(金) 20:08:41 ID: Be:
    >>729
    ソースは? 

十人単位でPrologプログラマーの引き合いがあったと。

■_ 本日の巡回から

2010年02月18日

■_

・ジャイアントキリング
モーニング掲載ですが、最近まで読んでなかったんですよねえ。なぜか。 ネカフェで最初のほう読んでくるかなあ。

・eat-in
えげれすの地では(日本語で使ってるような意味で)使われてるっぽいという情報が。

■_ C++ で

こんなんなかったっけ? Boost?


時間城年代記:とりあえず、reprが改善されるまで、小数を綺麗にプリント

Python3でprintが関数になったので、p=printとしてつかっていたのだが、どーも関数のように括弧に入れるのは面倒。
ということで、こんな一行を。

>>> 6.8/17
0.39999999999999997
>>> p = type('',(),{'__or__':(lambda s,o:print(o))})()
>>> p|6.8/17
0.4
>>>

縦棒ならフツーの計算と間違いないし、囲まなくていいのでいいかな、と('|'の優先順位って低いし)

■_ すでに回答がついてますが

L'eclat des jours(2010-02-19)
_ grepで---

テキストファイルの区切りに----とか入れていて、それがえらく大きなサイズになったとする。
というか、なった。

で、どれだけのフラグメントがあるのか、----の数を調べようと、

grep ---- foobar.txt

とやると「そんなオプションは知らん」とgrepが文句を垂れる。

(略)

さて、どこからどこまでがbashの仕業でどこからどこまでがgrepの考慮なんだろうか。

たぶん、''の中身をそのまま送るのはbash。したがって、\-\-\-\-はbashがエスケープを処理す
るので、grepには----が与えられて、そんなオプションは……となる。しかし'\-\-\-\-'では
bashはそのままgrepに送り、grepは-で始まっていないので検索文字列としてエスケープ処理し
て、無事動いた、のだと思う。

本日のツッコミ(全1件) [ツッコミを入れる]
_ knu (2010-02-19 00:52)

grep -e ---- foo.txt または grep -- ---- foo.txt が正解。
-e は次に来る引数を検索パターンとせよというオプション、 -- はそれ以降フラグは来ないと
宣言するオプションです。

補足しておくと、-- は POSIX (だったと思う)で決められたところの、 各コマンド共通のオプションの終端を表すマーカーで、 -e は grep が受け付けるオプションです。 rm で - で始まる名前のファイルを削除する。 なんてときにも -- を使ったりします。が ./-hoge みたいな技も。

`-e PATTERN'
`--regexp=PATTERN'
     Use PATTERN as the pattern; useful to protect patterns beginning
     with a `-'.  (`-e' is specified by POSIX.)

む。 -e もPOSIXはPOSIXなのか。

■_ ん

Dropbox がなんか変? 別のPCで確かに更新したはずのファイルの更新時刻が古いままだ。

ということで今日はとっとと切り上げちゃおう。

■_ 本日の巡回から


永和システムマネジメント入社のお知らせ - HsbtDiary(2010-02-18)

# OSSに関して後援や協賛等を通じて貢献している企業
# ソフトウェア開発に真摯に向き合っている企業
# エンジニアが力を発揮できる環境を用意できる企業
# 尊敬できるエンジニア(ロールモデル)が在籍している企業

ふうむ。

2010年02月17日

■_

・「適応除外」
とあるTV番組を観ていたら、どう考えても「適用除外」なはずのところで 字幕に「適応除外」と表示が(ナレーションも多分そう)登場。 どういう意味なんざんしょw

・今週の購入したものとか
ぼく、オタリーマン。 [DVD] TVアニメ「とある科学の超電磁砲」新OPテーマ::LEVEL5-judgelight- バカ・ゴー・ホーム
LEVEL5-judgelight のPVがw

■_ ~プログラマーのシャワーを止めさせるには

似たようなネタを以前にも見た覚えがあるけど、はてあれはいつごろの話だったろうか。


[plt-scheme] OT: How do you trap a programmer in the shower?

One of my students told the first joke in class, and it made me think
that the genre presents lots of possibilities. Here are my first
attempts--critiques and additions welcome. Forgive the sexism in
pronoun choice--I'm not sure if I should alternate between male and
female pronouns or what, but him/her just isn't funny and making
everything plural adds group showering connotations that I really
don't want. :-)

Todd

How do you trap a Scheme programmer in the shower?
Hand him a bottle of shampoo.

How do you trap a Visual Basic programmer in the shower?
Hide the widget that opens the curtain.

How do you trap a BASIC programmer in the shower?
Use silicone to attach his Commodore-64 to the tile.

How do you trap an Assembly programmer in the shower?
Well, first he has to build the shower...

How do you trap a Java programmer in the shower?
Convince him there's an exitShower() method somewhere and laugh while
he pores through the documentation.

How do you trap a Python programmer in the shower?
Tell him Guido wants him to stay there.

How do you trap a C programmer in the shower?
Don't try. He'll overflow the tub and take control of your house.

Python プログラマーに対するやり方がw

関連している reddit すれ。
How do you trap a programmer in the shower? : programming
http://www.reddit.com/r/programming/comments/b2ma8/how_do_you_trap_a_programmer_in_the_shower/

■_ なぜループの制御変数の名前はi, j, k だったりするのか?

コメント数がちょっと伸びてたので再度


for文のループ変数のiは、iterationのi (?)for文のループ変数のiは、iterationのi (?)

# re: for文のループ変数のiは、iterationのi (?) 2010/02/15 11:42 はつね

ループ変数にiを使う風習は、FORTRANでiがデフォルト整数型だからですね。
integerだからi,j,k,l,m,nをそうしたってFORTRANの授業でならったような。

# for文のループ変数のi 2010/02/15 15:18 R.Tanaka.Ichiro's Blog

for文のループ変数のi
# re: for文のループ変数のiは、iterationのi (?) 2010/02/15 22:03 ognac

>n → m → l の順番で使うものがありますな。
このパターンはであったことがありません。なんでしょうね。
>n はなんだろ。number? numeric?
numberとnumericの使い分けのあやふや。 Oracle/MsSQLの定義の差だけなのかなぁ。

>string s; double d; なら納得するなら、つまりそういうことなのでは。
違和感がない!!...慣れの問題なんでしょうね。
最初に学んだ言語の影響も大きそう。

integer/Index/Iterator説.....何れは対等の語源となるのかも知れませんね。 

for文のループ変数のifor文のループ変数のi

# re: for文のループ変数のi 2010/02/15 16:02 はつね

BASICでそうなってるのもFORTRAN由来。
# re: for文のループ変数のi 2010/02/15 16:07 επιστημη

FORTRANではI~Nで始まる変数は暗黙的にINTEGERだったことから慣習的に。
で、「IはintegerのI」説が有力です。
# re: for文のループ変数のi 2010/02/15 16:13 trapemiya

やっぱiはスマートでなんかバランスがいいし。そういうセンスが万人受けしたんじゃないですかね。
でもなぜだろう? iじゃなきゃ気持ち悪い・・・。なぜだろうこの感覚? ある意味iはすごい。
# re: for文のループ変数のi 2010/02/15 16:14 trapemiya

forとiのようにお似合いだよ。って披露宴のスピーチで使えるかもしれない。
# re: for文のループ変数のi 2010/02/15 18:07 ground

最初はindexのiだと思ってました。
# re: for文のループ変数のi 2010/02/15 19:51 アクア

Indexのiだと思っていたのですが違うの?
# re: for文のループ変数のi 2010/02/15 22:02 gushwell

最初に習ったのがFORTRANなので、もう当たり前のように
I J K を使ってます。
# re: for文のループ変数のi 2010/02/15 22:06 ognac

一文字変数の文化もFortran発ですよね。
# re: for文のループ変数のi 2010/02/16 13:49 みきぬ

> 一文字変数の文化

昔は絶対的にメモリが少なかったので…

・大きな(複雑な)プログラムが書けないので、1文字でも十分判別できる
・長い変数名を使うとそれだけソースファイルも長くなるので、メモリが足りなくなる
・言語によっては、変数名の先頭2文字しか認識してくれない(x01 と x02 が同じと見なされる)

というわけで、長い変数名をつけるという発想がなかったんじゃないかな。
# re: for文のループ変数のi 2010/02/16 14:39 R・田中一郎

なるほど、FORTRAN が最初なんですね。
授業で組んだ経験しかありませんが、言われてみれば・・・ 

長い変数名を使うと~って、マイコン時代のBASICじゃあないんだから。 むしろ、パンチカードを使ってたりした(80桁制限。継続行はあったけど)からじゃないのかなあ。 んで、FORTRAN の暗黙の型宣言で整数が I から N (で始まる名前)になった理由は 確たるものが見つからないんですよね。 INTGER の~という話がでてますが、これは日本語版のWikipedia にも見られるんですが 英語版にはありません。ということから考えて限りなくガセに近いものじゃあないかと わたしは疑っています。


FORTRAN - Wikipedia暗黙の型宣言による伝統的・慣習上の変数命名規則の誕生 [編集]

FORTRANのプログラムにおいては、とくに型宣言をしない場合、アルファベットI,J,K,L,M,Nのい
ずれかで始まる変数名で表される変数は整数型(integer)になり、その他のアルファベット(A
~H, O~Z)で始まるものは実数型(real)になる。これが「暗黙の型宣言」といわれるFORTRAN
の文法上の規則である。Iから始まる6文字に決まったのはIntegerの頭文字Iを連想しやすいから
と推測される。

FORTRANのプログラムでは、特にループ構造を表すDO構文におけるカウンター変数としてアルフ
ァベットI~Nの1文字の変数名が伝統的によく使用されており、プログラミングにおける慣習上
の変数命名規則の一つとなっている。FORTRANを参考にしたといわれるBASICにおいてもプログラ
ミングにおける慣習上の変数命名規則が同様に存在し、ループ構造であるFOR~NEXT等には、ア
ルファベットI~Nの1文字の変数名が伝統的に使用されている。さらに、Cその他のプログラミン
グ言語のプログラミングにおいても伝統的にこれらの変数名が整数型の変数の変数名として使用
されている。このようなプログラミングにおける変数命名規則の伝統・慣習は、FORTRANの暗黙
の型宣言に由来している。なお、「変数の型はすべて明示的に宣言すべきであり暗黙の型宣言は
不要である」とする見解もある。いずれにしても、半世紀以上の歴史のあるFORTRANは、一般的
なプログラミングにおける変数命名規則の慣習に与えた影響も大きいといえよう。

んでさらに検索するとこういうものが。


なぜⅰなのか? - 教えて!goo

皆さん1度は、ループカウンタ(for文、while文)でⅰを使ったことがあると思うのですが。
なぜ、ⅰなのでしょう?ⅰには何の意味があるのでしょうか?
どなたか教えて下さい。よろしくお願いします。

質問投稿日時:05/07/02 00:05
質問番号:1485989


FORTRAN では、宣言なしの I から始まる変数は整数であると規定されてました。
ループカウンタは普通整数のため、I が良く使われたのです。つまり、INTEGER の I です。

C は、int だから i なのかな?
種類:アドバイス
どんな人:専門家
C言語使いの皆が使うループカウンタは
FORTRANのループカウンタが起源である。

んで、FORTRANのループカウンタは
数学使いの慣習である添字iが起源である。

んで、その数学畑のiの意味を、
ちょっと調べてみたところ添字(Index)の頭文字iである。

...本当かなぁ?

自分は最初iterationと思ってたけど、どこかの本には
「違う」と書いてあったのを覚えてる。
種類:回答
どんな人:経験者
No2の方が答えていらっしゃいますが、Fortranの仕様です。

質問の意図から外れますが、慣習的にループカウンタをi,j,kで使うことは良くあります。つい
ついなれて使用していたとき、ある二次元配列のインデックスをi,jでループさせているときに、
ついついi,jを逆に書いてしまい、バグを作りこんだ経験があります。目で見たときにも発見し
辛いですから。

それ以来、i,jを使うことはやめることにしてます。

どんな人:専門家
自信:自信あり
incrementでないのは分かったのですが、残りの2つ(integer,iteration)のうちのどちらかに
ついては、微妙ですね。

国内のサイト[infoseek.co.jp]でいろいろと調べた所、以下のようなサイトを見付けました。こ
のpdfファイル内の6ページ目には、「慣習的に使われる変数名」という表があり、その中では
「iteratorの頭文字。」という風に説明されています。
​http://hp.vector.co.jp/authors/VA013320/about/book/c_training/brows...​

ただ、海外のサイト[altavista,yahoo.com]でも調べてみた所、FORTRANにて使用されるよりも前
に、数学的表記として、合計と掛け算のためのインデックスリストとして、しばしばiやjが使用
されていた、との記述が下の方にあります。
​http://encyclopedia.thefreedictionary.com/Loop+counter​
​http://en.wikipedia.org/wiki/Loop_counter​

「語源などについて、どうしても詳しく知りたい。」というのでしたら、一端、数学のカテゴリ
内でも質問してみることをお勧めします。

どんな人:一般人
自信:参考意見
意味については、すでに、ほぼ出そろっていますが

一番大きな理由はFORTRANのサンプルプログラムが、DO 100 =1,Nのようにループカウンタとして
Iを使っていたからです。
Iが暗黙に整数型の最初であったこともその原因でしょうね。
おそらく、どこの自習書もそうでしょう。

I、J、K、L、M、Nが整数なのについては、INTEGERからNUMERICと言う説は聞いたことがあります。
Oまで整数にして、Rから浮動小数点(REAL)でもよかったかかな。

で、CでもK&Rのforの例文がiです。それを見た者は皆iをつかうわけですね。なお、整数値
については、nxxxとnで始めていますが、これは多分、numericでしょう。

どんな人:専門家
自信:参考意見
incrementじゃなくてinteger(整数)のiですね。

「原点をoとする」や「点pを・・・」なども、それぞれorigin(原点)、point(点)の頭文字です。

そういえばFORTRANでは、変数の型を指定しない場合、i,j,k,l,m,nで始まる変数は自動的に整数
型、それ以外は自動的に浮動小数点型になったりもしますね。

どんな人:一般人
自信:自信あり
歴史的な理由によります。
数十年前はコンピュータ言語はアセンブラ、COBOL,FORTRAN程度しかありませんでした。

そのなかで、FORTRANで変数を定義するときに、暗黙の型宣言という規則がありました。それは、
変数がI,J,K,L,M,Nで始まるもの(例I,I1,III,J,JJ,K2など)は、全て整数型として扱い、それ
以外の変数(A,AA,BB)などはfloat型として扱うというものです。そのために、整数型変数を使用
するときI,J,Kなどが一般的に用いられるようになりました。

従って、この慣習がC言語,PL/Iなどでも使用されるようになりました。なお、変数が小文字を
使用できるのは、C言語,PL/I以降になってからであり、当時のFORTRANでは、大文字のみしかし
ようできませんでした。(そもそも小文字という概念すらありませんでした。最近のFORTRANに
ついては小文字が使えるかどうかは私は判りません)

C言語においては、一般的に変数は小文字を使用し、#defineで使用する定数は大文字を使用する
関数があります。従って、整数の変数については、FORTRAN時代に使用されたI,J,Kがi,j,kとし
て使用されるようになりました。

どんな人:一般人
自信:自信あり
ループカウンタの場合はiterationのiだったと思います。
ただ、それ以外にFORTRANではiからnが暗黙の整数型だったような記憶があるので、そこからの
類推でもあるのではないでしょうか?この場合はおそらくintegerのiだと思います。

どんな人:専門家
自信:自信あり
increment の iです。
あとはアルファベットでjkとつづきますけど。

どんな人:専門家
自信:自信あり

回答で挙げられたリンクをたどると、


Loop counter - Wikipedia, the free encyclopediaLoop counter
From Wikipedia, the free encyclopedia

In software engineering, a loop counter is the term often used to refer to the 
variable that controls the iterations of a loop (a computer programming language 
construct). It is so named because most uses of this construct result in the variable 
taking on a range of integer values in some orderly sequence (e.g., starting at 0 and 
end at 10 in increments of 1)

Loop counters change with each iteration of a loop, providing a unique value for each 
individual iteration. The loop counter is used to decide when the loop should 
terminate and for program flow to continue to the next instruction after the loop.

A common identifier naming convention is for the loop counter to use the variable 
names i, j and k (and so on if needed), where i would be the most outer loop, j the 
next inner loop, etc. The reverse order is also used by some programmers. This style 
is generally agreed to have originated from the early programming of FORTRAN[citation needed],
where these variable names beginning with these letters were implicitly 
declared as having an integer type, and so were obvious choices for loop counters that 
were only temporarily required. The practice also dates back further to mathematical 
notation where indices for sums and multiplications are often i, j, etc.

おっとここには[要出展]な形で This style is generally agreed to have originated from the early programming of FORTRAN とありますね。ただ、そのあとに The practice also dates back further to mathematical notation where indices for sums and multiplications are often i, j, etc. というのがあるわけですから、プログラミング(言語)の慣習としては確かにFORTRANが 始まりといえるでしょうが、その慣習自体はどこから来たの? という点においては はっきりしてません。

■_ ふと

検索してみましたならば


イートイン - Wikipedia
イートイン(英:eat-in)は、飲食店で買った食料品をその店内で食べる方式である。日本では
テイクアウトと対比して使われる言葉として2000年代以降一般化した。ファーストフード店やコ
ンビニエンスストア、デパ地下(百貨店の食料品売場)などで主に使われる。普通、店の中での
み食べる方式の飲食店では使われず、テイクアウトかイートインを選ぶ店の場合にのみ表示がし
てある。

デパ地下には有名店が多くテナント出店しており、そういった店でイートインが可能な場合、本
店などに行くよりも手軽に高級感を味わえるとして利用されることも多い。

(英:eat-in)とあったので、まさかきちんとした英語だったのかと思ってさらに調べてみると



eat in の意味とは - 英和辞典 Weblio辞書eat in
éat ín
《 【自】+ 【副】》
家で食事する.

Eat | Define Eat at Dictionary.com

18. 	eat in, to eat or dine at home.

飲食店で買った食料品をその店内で食べる方式である なんでこうなった ○| ̄|_

■_ 伸びるかな

reddit。


Reddit Programmers: Why does every programmer blindly think that the language/toolkit/IDE that they use is hands down the best,
  even when some are technically outmoded, nearly extinct, or so new as to be fragile and unsupported? : programming

It seems to me that they key thing here is that developers that have invested years of 
their lives learning technology X will feel insulted, abandoned, and betrayed once 
technology Y starts to gain traction. Technology Y could either be SUPERIOR (in which 
case the developer is insecure due to their ties with technology X), or INFERIOR (in 
which case the developer is frustrated that people can't see this fact). The problem 
is compounded by the Corporations who get behind a technology and make empty promises 
that confuse the issue.... Any thoughts?

数日生暖かく見守ってみよう。

■_


C++相談室 part78 
157 デフォルトの名無しさん [sage] 2010/02/17(水) 21:20:49 ID: Be:
    プログラム組んでて
    returnって打ったつもりだったら

    tryit,

    って打ってた
    なんか感動した 

158 デフォルトの名無しさん [sage] 2010/02/17(水) 21:21:46 ID: Be:
    rをtにずらして打ってみると・・・!? 

159 デフォルトの名無しさん [sage] 2010/02/17(水) 21:22:04 ID: Be:
    ゴルゴはtrycatchfinallyを0.5秒でタイプするらしい 

160 デフォルトの名無しさん [sage] 2010/02/17(水) 21:23:35 ID: Be:
    >>157
    夢を感じた 

おおっ > return → tryit

■_ 本日の巡回から

■_


RMS GNU/Linux-Libre! - Free Software Foundation

RMS GNU/Linux-Libre is a project to create a complete free software distribution of 
GNU/Linux that's small enough to run on a USB key, or pendrive.

The distribution, which promises to be the perfect pocket companion of freedom lovers, 
supports the ability to save your changes to the pendrive, as well as install, update 
and disable software packages in the form of modules.

The name of the distribution, RMS's Mostly Slax, is both a tribute to the founder of 
the GNU operating system, but also a key to the project's own history — based on SLAX 
(which in turn is based on veteran distribution, Slackware), RMS features the 
2.6.27.42 version of Linux-Libre — a project to take the kernel Linux and remove any 
proprietary firmware or binary blobs — as well as GNU Icecat and KDE 3.5. More modules 
are being developed and will soon be available to download from the project's website.

Free distributions of GNU/Linux can be found on the GNU website.

rms のおじちゃんこんどは何を

2010年02月16日

■_

なんかねー。冬眠したいというかなんというか。

■_

C++ FQA のつづき。


C++ FQA Lite: Defective C++

Defective C++

Part of C++ FQA Lite

* No way to locate definitions (locate definitions の手段がない)

OK, so before we can parse AA BB(CC);, we need to find out whether CC is defined as an 
object or a type. So let's locate the definition of CC and move on, right?

さて、AA BB(CC) を解析できるようにするには、CC がオブジェクトして定義されているのか、
それとも型として定義されているのかを判断しなければなりません。ですから CC の定義を捜し
出して move on しましょう。いいですね?


This would work in most modern languages, in which CC is either defined in the same 
module (so we've already compiled it), or it is imported from another module (so 
either we've already compiled it, too, or this must be the first time we bump into 
that module - so let's compile it now, once, but of course not the next time we'll 
need it). So to compile a program, we need to compile each module, once, no matter how 
many times each module is used.

これは大部分の modern な言語であれば、CC が同一モジュールで定義されている (この場合わ
たしたちはそれを既にコンパイルしています) か、他のモジュールから import されたかのいず
れであってもうまくいくでしょう(ということはわたしたちは既にそれをコンパイルしているか、
でなければそのモジュールへ bump するのが初めてのはずです。ですからここで一度コンパイル
することにしましょう。もちろん次にわたしたちがそれを必要とするときにはコンパイルは不要
です)。プログラムをコンパイルするためにはわたしたちはモジュールのそれぞれを一度はコン
パイルする必要がありますが、このとき各モジュールが何回使われているかということは重要で
はありません。

In C++, things are different - there are no modules. There are files, each of which 
can contain many different definitions or just small parts of definitions, and there's 
no way to tell in which files CC is defined, or which files must be parsed in order to 
"understand" its definition. So who is responsible to arrange all those 
files into a sensible string of C++ code? You, of course! In each compiled file, you 
#include a bunch of header files (which themselves include other files); the #include 
directive basically issues a copy-and-paste operation to the C preprocessor, inherited 
by C++ without changes. The compiler then parses the result of all those 
copy-and-paste operations. So to compile a program, we need to compile each file the 
number of times it is used in other files.

C++ では事情が違っていて、モジュールというものが存在していません。あるのはそれぞれが多
くの異なる定義を含んでいたり単に定義の小さなパーツだけを含んでいるファイルであり、さら
にどれが CC を定義しているファイルなのかということや CC の定義を理解する ("understand")
ために解析しなければならないファイルがどれなのかを伝える手段がありません。では一体、そ
れらすべてのファイルを C++ コードの sensible string へとアレンジすることに対して 
responsible なのは誰なのでしょうか?それはもちろんあなたです! コンパイルされたファイル
のそれぞれで、あなたはたくさんのヘッダーファイルとそれがさらに include しているほかの
ファイルを #include しています。#include 指令 (directive) は、基本的には手を加えられる
ことなく C++ に受け継がれたC のプリプロセッサーに対してコピーアンドペースト操作を行わ
せるものです。コンパイラーはそのあとですべてのコピーアンドペースト操作の結果を解析しま
す。ですからあるプログラムをコンパイルするためには各々のファイルをそのファイルが他のフ
ァイルから使われている回数だけコンパイルする必要があるのです。


This causes two problems. First, it multiplies the long time it takes to compile C++ 
code by the number of times it's used in a program. Second, the only way to figure out 
what should be recompiled after a change to the code is to check which of the #include 
files have been changed since the last build. The set of files to rebuild generated by 
this inspection is usually a superset of the files that really must be recompiled 
according to the C++ rules of dependencies between definitions. That's because most 
files #include definitions they don't really need, since people can't spend all their 
time removing redundant inclusions.

これは二つの問題を引き起こします。第一は、C++のコードをコンパイルするには本来のコンパ
イル時間にプログラム中で使われている回数を乗じた時間が必要となるというものです。第二は、
コードを変更した後で再コンパイルすべきものを特定するための唯一の方法が、最後のビルド後
に変更された #include ファイル群をチェックしていくというものだということです。この 
inspection によって生成された再ビルドのためのファイルの集合は通常、定義の間にある依存
性に関するC++ のルールに従って本当に再コンパイルされなければならないファイル群のスーパ
ーセットになります。これは大部分のファイルが実際には必要ない定義をも #include で取り込
んでいるからなのですが、そうなっているのはユーザーが冗長な include を取り除くために時
間を掛けていられないからなのです。


Some compilers support "precompiled headers" - saving the result of the 
parsing of "popular" header files to some binary file and quickly loading it 
instead of recompiling from scratch. However, this only works well with definitions 
that almost never change, typically third-party libraries.

一部のコンパイラーでは“コンパイル済みヘッダー”("precompiled headers")とい
う、“よく使われる”ヘッダーファイルの解析結果を何らかのバイナリーファイルに保存してお
いて、再コンパイル時にはまったくの 0 から行うのではなくそのバイナリーファイルをquickly 
にロードする機能をサポートしています。しかしこれがうまくいくのは、ファイルにある定義が
典型的にはサードパーティによるライブラリのようにほとんど変更されることがないものである
ときだけです。


And now that you've waited all that time until your code base recompiles, it's time to 
run and test the program, which is when the next problem kicks in.

そして現在、あなたは自分のコードベースの再コンパイルが完了するまで丸々待つことになりま
した。それは次の問題が kicks in されるときにプログラムの実行とテストとに要する時間です。

** No run time encapsulation (実行時の encapsulation の欠如)

Programming languages have rules defining "valid" programs - for example, a 
valid program shouldn't divide by zero or access the 7th element of an array of length 
5. A valid program isn't necessarily correct (for example, it can delete a file when 
all you asked was to move it). However, an invalid program is necessarily incorrect 
(there is no 7th element in the 5-element array). The question is, what happens when 
an invalid program demonstrates its invalidity by performing a meaningless operation?

プログラミング言語は“正当な”プログラム (valid program) を定義する規則を持っています。
一例を挙げると、正当なプログラムはゼロによる割り算も長さが 5 の配列の七番目の要素にア
クセスするようなこともすべきではありません。正当なプログラムは正しい (correct) もので
ある必要はありません(たとえばあなたが移動するか問い合わせたファイルをすべて削除しても
良い)。しかし正当でないプログラム (invalid program) は、不正(長さが5の配列に七番目の要
素はありません) である必要があります。疑問となるのは、正当でないプログラムが意味のない
操作を実行することにより自身の invalidity を demonstrates したときに何が起きるのかとい
うことです


If the answer is something like "an exception is raised", your program runs 
in a managed environment. If the answer is "anything can happen", your 
program runs somewhere else. In particular, C and C++ are not designed to run in 
managed environments (think about pointer casts), and while in theory they could run 
there, in practice all of them run elsewhere.

もしその回答が“例外が発生する”(an exception is raised) のようなものであればあなたの
プログラムはマネージド環境で実行されています。もし“何かが起こる”(anything can happen) 
という回答ならあなたのプログラムはそれ以外の何かしらの環境で動作しています。特に、C や 
C++ はマネージド環境で実行されるように設計されていない(ポインターのキャストを考えてみ
ましょう) ので、
and while in theory they could run there,
理論的にはそこで実行可能なものであっても
in practice all of them run elsewhere.
実践的には

So what happens in a C++ program with the 5-element array? Most frequently, you access 
something at the address that would contain the 7th element, but since there isn't any, 
it contains something else, which just happens to be located there. Sometimes you can 
tell from the source code what that is, and sometimes you can't. Anyway, you're really 
lucky if the program crashes; because if it keeps running, you'll have hard time 
understanding why it ends up crashing or misbehaving later. If it doesn't scare you 
(you debugged a couple of buffer overflows and feel confident), wait until you get to 
many megabytes of machine code and many months of execution time. That's when the real 
fun starts.

では C++ のプログラムでは 5 要素の配列問題は何が起きるのでしょうか?最もありがちなのは、
七番目の要素があるとすればそこになるであろうアドレスに存在している何かをアクセスしてし
まうということです。しかし実際にはそこには(意味のあるものは)なにもなくて、たまたまそこ
に存在していただけというなにかがあるだけなのです。それが一体何であるのかをソースコード
から判断できることもあるでしょうができないときもあるでしょう。いずれにしても、プログラ
ムがクラッシュしたのなら実はあなたは幸運です。なぜならプログラムが動き続けたのなら、時
間が経った後で最終的にクラッシュしてしまう理由や誤動作を起こす理由を突き止めるための困
難な時間を過ごすことになるのですから。もしそれがあなたがそれを怖がっていない(あなたが
いくつかのバッファーオーバーフローや feel confident をデバッグしたことがない)、のであ
るのなら、数メガバイトにおよぶ機械語に直面したり実行時間が数ヶ月に及ぶようになるまで待
ってください。それが本当の楽しみの始まるときなのです。


Now, the ability of a piece of code to modify a random object when in fact it tries to 
access an unrelated array indicates that C++ has no run time encapsulation. Since it 
doesn't have compile time encapsulation, either, one can wonder why it calls itself 
object-oriented. Two possible answers are warped perspective and marketing (these 
aren't mutually exclusive).

今、関係のない配列にアクセスを試みたときにrandom  object を変更するコードを作れてしま
うことはC++ が実行時 encapsulation を持っていないことを示唆 (indecate) しています。
コンパイル時の情報隠蔽を持っていないのになぜオブジェクト指向と呼ぶのかと疑問を感じる
人もいるでしょう。二つの答えが考えつきます。その二つとは warped perspective と マーケ
ティング(これらは mutually exclusive ではありません) です。


But if we leave the claims about being object-oriented aside, the fact that a language 
runs in unmanaged environments can't really be called a "bug". That's 
because managed environments check things at run time to prevent illegal operations, 
which translates to a certain (though frequently overestimated) performance penalty. 
So when performance isn't that important, a managed environment is the way to go. But 
when it's critical, you just have to deal with the difficulties in debugging. However, 
C++ (compared to C, for example) makes that much harder that it already has to be, 
because there are...

しかし仮にこの主張 (claims) をオブジェクト指向がどういうものかということから離れてみる
と、アンマネージド環境で実行される言語では実際には“バグ”とは呼べないものなのです。な
ぜならマネージド環境では不正な操作を防ぐための実行時検査をしていて、それはパフォーマン
スの面でのペナルティをもたらすのです。ですからパフォーマンスが重要な要素ではなくなった
ときにマネージドな環境は way to go となります。しかしパフォーマンスがクリティカルなも
のであるときには、あなたはデバッグに関する困難に対処しなければならないのです。とはいえ 
C++ は (たとえば C と比較しても) すでにデバッグを既にあるべき状態よりもより難しいもの
にしています。なぜならそれは…


* No binary implementation rules (バイナリ実装規則の欠如)

When an invalid program finally crashes (or enters an infinite loop, or goes to sleep 
forever), what you're left with is basically the binary snapshot of its state (a 
common name for it is a "core dump"). You have to make sense of it in order 
to find the bug. Sometimes a debugger will show you the call stack at the point of 
crash; frequently that information is overwritten by garbage. Other things which can 
help the debugger figure things out may be overwritten, too.

ある正しくないプログラムが最終的にクラッシュした(もしくは無限ループに落ち込んだり永遠
のスリープに陥った)とき、あなたの手元にあるのは、基本的にはクラッシュした状態のバイナ
リスナップショットです(一般的にはそれに "core dump" という名称がついています)。
あなたはバグを見つけ出すためにそこから make sense しなければなりません。デバッガーがク
ラッシュした場所での呼び出しスタックを見せてくれることもあるでしょうが大抵はその情報は
ゴミで上書きされているでしょう。そのほかのデバッガーが解析するのを手助けするようなこと
がらも上書きされてしまっているでしょう。


Now, figuring out the meaning of partially corrupted memory snapshots is definitely 
not the most pleasant way to spend one's time. But with unmanaged environments you 
have to do it and it can be done, if you know how your source code maps to binary 
objects and code. Too bad that with C++, there's a ton of these rules and each 
compiler uses different ones. Think about exception handling or various kinds of 
inheritance or virtual functions or the layout of standard library containers. In C, 
there's no standard binary language implementation rules, either, but it's an order of 
magnitude simpler and in practice compilers use the same rules. Another reason making 
C++ code hard to debug is the above-mentioned complicated grammar, since debuggers 
frequently can't deal with many language features (place breakpoints in templates, 
parse pointer casting commands in data display windows, etc.).

ここで、
meaning of partially corrupted memory snapshots
を把握することは
誰かの時間を消費するための最も好ましい方法ではありません。
しかしアンマネージド環境ではあなたはそれをしなければならないし、
あなたが自分のソースコードがどのようにバイナリのオブジェクトやコードに
なるのかを知っていれば実行可能なことです。
こういったルールが山ほどあって、各々のコンパイラーが別々のものを使っています
例外ハンドリングや種々の継承、
仮想関数や標準ライブラリのコンテナーのレイアウト
といったものについて考えてみましょう。
C においては、標準的となるバイナリ言語の実装規則がありませんし、
either,
but it's an order of magnitude simpler
and in practice compilers use the same rules.
現実のコンパイラーが使用している同一のルールにおいて


C++ のコードをデバッグしづらいものにしているもうひとつの原因は前述した複雑な構文です。
なぜなら、デバッガーはしばしば多くの言語機能を扱うことができなくなるからです(テンプレ
ートの中にブレークポイントを張ったり、データディスプレイウィンドウにあるポインターコマ
ンドキャスティングの解析などなど)。


The lack of a standard ABI (application binary interface) has another consequence - it 
makes shipping C++ interfaces to other teams / customers impractical since the user 
code won't work unless it's compiled with the same tools and build options. We've 
already seen another source of this problem - the instability of binary interfaces due 
to the lack of compile time encapsulation.

標準 ABI (application binary interface) の欠如にはもう一つ、同じツールと同一のビルドオ
プションでコンパイルしない限りユーザーのコードは動作しないのでC++ のインターフェースを 
other teams / customers impractical に shipping させるという consequence (結果、影響) 
がありますわたしたちはすでにこの問題のもうひとつの原因であるコンパイル時の情報隠蔽が欠
落していることが原因となっているバイナリインターフェースの instablitiy を見ています。


The two problems - with debugging C++ code and with using C++ interfaces - don't show 
up until your project grows complicated in terms of code and / or human interactions, 
that is, until it's too late. But wait, couldn't you deal with both problems 
programmatically? You could generate C or other wrappers for C++ interfaces and write 
programs automatically shoveling through core dumps and deciphering the non-corrupted 
parts, using something called reflection. Well, actually, you couldn't, not in a 
reasonable amount of time - there's...

あなたのプロジェクトがin terms of code and / or human interactions の意味で複雑になる
まで、つまり手遅れになるまではC++コードのデバッグやC++のインターフェースを使うこととい
う二つに関する問題は姿をあらわしませんでもちょっと待ってください。あなたは両方の問題を
プログラム的に扱うことができないのでしょうか?リフレクションと呼ばれる類のものを使って
C++ のインターフェースに対する C やその他のラッパーを生成し、さらにコアダンプと 
non-corrupted parts の deciperring を通じて自動的に shoveling するプログラムを記述する
ことは可能です。

Well, actually, you couldn't, not in a reasonable amount of time - there's...

ええ、実際には現実的な時間内ではあなたはそうすることができません。それは…


* No reflection (リフレクションの欠如)

■_ 本日の巡回から

2010年02月15日

■_

・近代麻雀
ムダヅモ~ がもうw デラックス版DVDに収録CDがつくという主題歌の歌詞も何もいえない。

■_

推薦図書/必読書のためのスレッド 54 
281 デフォルトの名無しさん [sage] 2010/02/14(日) 20:31:23 ID: Be:
    http://www.amazon.co.jp/dp/4797337958/
    ふつうのコンパイラをつくろう

    http://www.amazon.co.jp/dp/4798114685/
    最新コンパイラ構成技法

    どっちがよさげ? 

282 デフォルトの名無しさん [sage] 2010/02/14(日) 20:35:40 ID: Be:
    >>281
    全部買えば?たいした額じゃないし

    明快入門コンパイラ・インタプリタ開発 C処理系を作りながら学ぶ
    (林晴比古実用マスターシリーズ) (単行本)

    ちなみに、これが今のところ最強だけどな 

283 デフォルトの名無しさん [sage] 2010/02/14(日) 21:21:05 ID: Be:
    え? 

284 親切な人 [sage] 2010/02/14(日) 21:39:44 ID: Be:
    >>281
    お前らほんと意地が悪いというか、初学者が何もしらないと思ってからかうなよ。
    まずこの本から進めるのが王道。

    やさしいコンパイラの作り方入門―オリジナルなコンパイラを作成する
    http://www.amazon.co.jp/dp/4877832203/ 

285 デフォルトの名無しさん [sage] 2010/02/14(日) 21:45:09 ID: Be:
    >>281
    前者 

286 デフォルトの名無しさん [] 2010/02/15(月) 01:42:22 ID: Be:
    C++0xの解説本って有りますか? 

287 デフォルトの名無しさん [sage] 2010/02/15(月) 02:19:10 ID: Be:
    >>281
    ふつうのコンパイラの方は、実用的だけど理論はない

    最新コンパイラの方は、大学の教科書として使える本
    だけど、MLというマニアックな言語を使ってる 

288 デフォルトの名無しさん [sage] 2010/02/15(月) 02:26:11 ID: Be:
    >>286
    C++0x自体、まだ未完成だからまだないだろ
    2015年ごろにでるんじゃない? 

289 デフォルトの名無しさん [sage] 2010/02/15(月) 07:24:25 ID: Be:
    >>286
    C++0xの仕様が確定するのは
    2018年の秋頃だから、その後と考えると
    2020年頃じゃないか? 

290 デフォルトの名無しさん [sage] 2010/02/15(月) 10:38:33 ID: Be:
    C言語をやC++を勉強するために簡単なカードゲームなどをつ作ってみようと思っています
    Javaの経験が学校で習った程度あるため、入門書の次のステップのものを買いたいと考えています
    おすすめを教えてください 

291 デフォルトの名無しさん [sage] 2010/02/15(月) 12:26:08 ID: Be:
    http://www.amazon.co.jp/db/4899772173/
    14歳からはじめるC言語わくわくゲームプログラミング教室

    GUIが不要なら、アルゴリズム本 

292 デフォルトの名無しさん [sage] 2010/02/15(月) 12:27:55 ID: Be:
    http://www.amazon.co.jp/dp/4899772173/

    すまんこっち 

293 デフォルトの名無しさん [sage] 2010/02/15(月) 14:53:27 ID: Be:
    javaやったことあったら入門書の次のステップのものになるのが意味不明
    文法とかきまりが分ればいいんだから入門書が最適だろ
    たぶんすぐ読破しちゃってもったいないから入門サイトが良いと思うけど 

294 デフォルトの名無しさん [sage] 2010/02/15(月) 17:20:45 ID: Be:
    >>286
    C++テンプレートテクニックに0xのことが1章ほど書いてあった。
    2009年発行なのに、すでに時代遅れになっているのが悲しいところだが。 

295 デフォルトの名無しさん [] 2010/02/15(月) 19:20:11 ID: Be:
    C++の入門書でおすすめありませんか?
    全くの初心者です。 

296 デフォルトの名無しさん [sage] 2010/02/15(月) 20:48:57 ID: Be:
    ロベールがいいけど、今尼で在庫切れだな
    尼以外にならあると思うが、マイコミは何悠長な事やってんだろ
    売る気ないのか 

297 デフォルトの名無しさん [] 2010/02/15(月) 20:57:22 ID: Be:
    >>296
    ロベールですか
    ホムペもあるみたいですが情報古いんですかね? 

298 デフォルトの名無しさん [sage] 2010/02/15(月) 20:59:12 ID: Be:
    >>297
    基本ロベールはホムペの内容が全然古い
    本のために書き直したぐらいだから 

C言語なら俺に聞け(入門編)Part 60 
476 デフォルトの名無しさん [] 2010/02/15(月) 01:05:22 ID: Be:
    おまいら仲良くしろ!
    さもないと、日下部さん召還するぞww 

477 デフォルトの名無しさん [sage] 2010/02/15(月) 01:19:22 ID: Be:
    >>476
    やめてくれ!悪魔より恐ろしい 

478 デフォルトの名無しさん [sage] 2010/02/15(月) 01:26:51 ID: Be:
    こわがりすぎー 

召喚できるのかなあw

■_ FORTRAN

ちと気になったので。


Fortran - Wikipedia, the free encyclopedia

History

In late 1953, John W. Backus submitted a proposal to his superiors at IBM to develop a 
more practical alternative to assembly language for programming their IBM 704 
mainframe computer. Backus' historic FORTRAN team consisted of programmers Richard 
Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy Nutt, Robert Nelson, 
Irving Ziller, Lois Haibt and David Sayre.[5]

(略)

The initial release of FORTRAN for the IBM 704 contained 32 statements, including:

    * DIMENSION and EQUIVALENCE statements
    * Assignment statements
    * Three-way arithmetic IF statement.[7]
    * IF statements for checking exceptions (ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOW,
      and DIVIDE CHECK); and IF statements for manipulating sense switches and sense lights
    * GOTO, computed GOTO, ASSIGN, and assigned GOTO
    * DO loops
    * Formatted I/O: FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINT, and PUNCH
    * Unformatted I/O: READ TAPE, READ DRUM, WRITE TAPE, and WRITE DRUM
    * Other I/O: END FILE, REWIND, and BACKSPACE
    * PAUSE, STOP, and CONTINUE
    * FREQUENCY statement (for providing optimization hints to the compiler)[8].

(略)

FORTRAN II

IBM's FORTRAN II appeared in 1958. The main enhancement was to support procedural 
programming by allowing user-written subroutines and functions. Six new statements 
were introduced:

    * SUBROUTINE, FUNCTION, and END
    * CALL and RETURN
    * COMMON

Over the next few years, FORTRAN II would also add support for the DOUBLE PRECISION 
and COMPLEX data types.

(略)


FORTRAN 66

Perhaps the most significant development in the early history of FORTRAN was the 
decision by the American Standards Association (now ANSI) to form a committee to 
develop an "American Standard Fortran." The resulting two standards, 
approved in March 1966, defined two languages, FORTRAN (based on FORTRAN IV, which had 
served as a de facto standard), and Basic FORTRAN (based on FORTRAN II, but stripped 
of its machine-dependent features). The FORTRAN defined by the first standard became 
known as FORTRAN 66 (although many continued to refer to it as FORTRAN IV, the 
language upon which the standard was largely based). FORTRAN 66 effectively became the 
first "industry-standard" version of FORTRAN. FORTRAN 66 included:

    * Main program, SUBROUTINE, FUNCTION, and BLOCK DATA program units
    * INTEGER, REAL, DOUBLE PRECISION, COMPLEX, and LOGICAL data types
    * COMMON, DIMENSION, and EQUIVALENCE statements
    * DATA statement for specifying initial values
    * Intrinsic and EXTERNAL (e.g., library) functions
    * Assignment statement
    * GOTO, assigned GOTO, and computed GOTO statements
    * Logical IF and arithmetic (three-way) IF statements
    * DO loops
    * READ, WRITE, BACKSPACE, REWIND, and ENDFILE statements for sequential I/O
    * FORMAT statement
    * CALL, RETURN, PAUSE, and STOP statements
    * Hollerith constants in DATA and FORMAT statements, and as actual arguments
      to procedures
    * Identifiers of up to six characters in length
    * Comment lines

INTEGER やら REAL が言語仕様に追加されたのが 66 の時点なのね。 つーことは、FORTRAN I だの II だのの時代には、暗黙の型宣言によってしか 変数の方が決まらなかったということなんか。 うーむ、その暗黙の型宣言で整数の範囲が I から N になった理由がはっきりわかる 資料はないもんかなあ。作者に直接は訊けないしな。

最初のターゲットマシンである IBM 709のアーキテクチャを見ても アキュムレーター1つとインデックスレジスター3つとかで、 I から N の 6個になる理由らしきものは見当たらない。

HOPL に何か書いてあったかなあ。掘り出さないと確認できないけど。

■_ 本日の巡回から

2010年02月14日

■_

・すきゃな
ScanSnap の S1500 にするか S1300 にするかで悩みんぐ。 Amazon.co.jp: FUJITSU ScanSnap S1300 FI-S1300: 家電・カメラ Amazon.co.jp: FUJITSU ScanSnap S1500 FI-S1500: 家電・カメラ そりゃあ性能がいい方がとは思うんだけど、S1300はUSB駆動で外に持ち出しやすいとかあるしなあと。 実際に使ってみてどんな感じか比べてみてから買いたいけど試せるようなとこないよなあ。ぐし。

・ ソ・ラ・ノ・ヲ・ト のOP
光の旋律
ですが、アニメの OP ではあまり聴かないような感じの曲ですが 聴いてていいなあと思います。延々リピート中(笑)

■_ 本日の[ムマ]板から


Pythonのお勉強 Part36 
210 デフォルトの名無しさん [sage] 2010/02/13(土) 20:26:24  ID: Be:
    Pythonって、他の言語のいいところを参考にしながらもそれをそのまま取り込まず、
    常識にとらわれずに、一番合理的な方法を考えるからな。 

211 デフォルトの名無しさん [sage] 2010/02/13(土) 20:30:44 ID: Be:
    それは無い

223 デフォルトの名無しさん [sage] 2010/02/14(日) 11:50:41 ID: Be:
    いろいろと細かい資料とか読んで>>210の言ってることにちょっと納得。
    個人的には、クラスの定義方法を見て、今までの細かいとことか結構どうでもよくなった。
    これは……慣れるのに相当時間かかりそうな気がする。
    他のOO言語から入った人は、特に違和感とかなかった? 自分毒されすぎかな? 

224 デフォルトの名無しさん [sage] 2010/02/14(日) 12:00:45 ID: Be:
    >>223
    むしろ、違いを見つけてはなぜそうなっているのかを知るたびに
    「なるほど!」の連続で楽しかった。 

226 デフォルトの名無しさん [sage] 2010/02/14(日) 16:43:13 ID: Be:
    >>223
    元々はアセンブラとか C をやってたけど
    ( FILE* みたいな構造体をクラス/インスタンス的に使う設計や実装も当時やってた )
    C++ やり始めるときに先輩から薦められて「Eiffel オブジェクト指向入門」を読んで
    Eiffel を通してオブジェクト指向の基本的な考え方をメイヤーさんから習った
    (これはかなり良い経験だったと今でも思っています)

    その後 C++ を使ってるうちに何かが変だと感じつつ
    (その頃は C++ が糞だと断定出来る自信がなかった)
    Objective-C (Mac じゃなくて StepStone の方) をやって本当の快適さを覚え
    その流れで Smalltalk に手を出したものの環境依存が大き過ぎて
    出家信者になるのが怖くてどっぷり漬かれずにいたところ
    当時流行り出した Perl (のオブジェクト指向部分の実装) は糞だと思って無視
    PHP (のオブジェクト指向部分) はマシかなと感じたが若干テストしただけで手を出さず
    Zope-Python の存在を知ったが何それ美味しいの? Zope に環境依存するなんてやだ
    と食わず嫌いで Python から遠ざかりつつ勢いで Ruby 教に入信してしまい
    Ruby を有難く使っていた数年後に 2ch で Python 厨と Ruby 厨の論戦を目にして
    バランスの良い Python に辿り着いたときには Ruby 要らなくなってた 

227 デフォルトの名無しさん [sage] 2010/02/14(日) 18:03:47 ID: Be:
    三行で要約↓ 

228 デフォルトの名無しさん [sage] 2010/02/14(日) 18:15:42 ID: Be:
    ワナビーがルビ厨になってPython信者に宗旨替えした 

三行というか三文節というか。


スレを勃てるまでもないC/C++の質問はここで 13 
457 デフォルトの名無しさん [] 2010/02/12(金) 12:17:02 ID: Be:
    自分でプログラムをつくって実行した時に

    free(): invalid next size (fast): 0x083c69b8 ***

    が出るんだけどこれはメモリ領域を開放する部分を疑うべきなのだろうか?
    同じプログラムをMac OS XのGCC 4.2でコンパイルして実行するとエラーが出ずに実行できるんだけど
    FedoraのGCC 4.4でコンパイルして実行すると上のようなものがでてCore dumpしてしまうようなのですが 

458 デフォルトの名無しさん [sage] 2010/02/12(金) 12:20:37 ID: Be:
    デバッガのバックトレース使えよ… 

459 デフォルトの名無しさん [sage] 2010/02/12(金) 12:22:08 ID: Be:
    さっきから見ているがお前らどうして症状が再現する最小のソースを貼らないんだ?
    会社の仕事のコードならわかるが、趣味のコードで見せたがらないってのがわからん

    トランプを裏返しにして何のカードか当てろと言ってるのと同じだぞ 

460 デフォルトの名無しさん [sage] 2010/02/12(金) 12:24:38 ID: Be:
    最小のソースを作ることが問題の解決になってる場合が多いから、
    作れない場合の方がおおい。 

461 デフォルトの名無しさん [sage] 2010/02/12(金) 12:29:58 ID: Be:
    なるほどね

    じゃあ元のコードがバグだらけって事じゃん
    質問が全く的を射ていないわけだ 

462 デフォルトの名無しさん [sage] 2010/02/12(金) 12:40:14 ID: Be:
    複雑に絡み合っているコードを単純にする作業はデバッグと一緒。 

473 デフォルトの名無しさん [sage] 2010/02/13(土) 01:18:00 ID: Be:
    >>457
    malloc/callocで確保してないメモリを解放してるか、既に解放したメモリを再び解放してるか、
    どっかで配列のオーバーフロー/アンダーフローが起こってて、メモリの管理領域を壊してるかじゃないかなぁ。

    確保したメモリかを確認し直して、多重解放してないか確認して(解放したらNULL入れておくといいよ)
    ヒープ領域(大雑把に言うとmalloc/callocで確保したメモリのこと)の配列を中心に、変なことしてないか確認。

    特に間違いがみつからなかったら、この手のバグは面倒なのが多いから、デバッガの利用を検討した方がいいかも。 

482 デフォルトの名無しさん [] 2010/02/13(土) 17:36:53 ID: Be:
    >>473
    ttp://handasse.blogspot.com/2009/02/cc.html
    これを見てソース直して実行しなおしたらlinuxで動くようになりました
    どうやら不連続な領域確保をやっていたのが(↑のページの上の方法)原因らしくて
    メモリの確保を連続領域でできるように(↑のページの下の方法)変更したら実行できるようになりました

    でもなぜMac OS Xのほうではプログラムを実行できたのだろう
    メモリの扱い方がどう違うんでしょうかね 

483 デフォルトの名無しさん [sage] 2010/02/13(土) 18:14:43 ID: Be:
    >>482
    直す前のコードにバグがあって、OSXの方ではたまたま動いてただけ。

484 デフォルトの名無しさん [sage] 2010/02/13(土) 19:14:23 ID: Be:
    >>482
    連続だろうが不連続だろうが、配列の範囲を越えたところに書き込まなければ起こり得ないバグ。 

486 デフォルトの名無しさん [sage] 2010/02/14(日) 14:45:58 ID: Be:
    >>483
    というよりも、修正したと思っている方も実はまぐれで動いている。
    9割がた間違いない。 

487 デフォルトの名無しさん [] 2010/02/14(日) 16:25:49 ID: Be:
    >>483-484>>486
    いやいやちょっと待ってくれ
    ああいうのは気まぐれでは動かないだろ
    人を貶めるのはよしてくれ 

488 デフォルトの名無しさん [sage] 2010/02/14(日) 16:42:30 ID: Be:
    エラーを内包しててもコンパイラによっては表面化しないで動くことなんかよくあるぞw 

489 デフォルトの名無しさん [sage] 2010/02/14(日) 16:43:21 ID: Be:
    気まぐれというかオーバーランしてる領域の中身によりけり 

490 デフォルトの名無しさん [sage] 2010/02/14(日) 17:02:32 ID: Be:
    >>487
    所詮お前はその程度のスキル。ww 

491 デフォルトの名無しさん [sage] 2010/02/14(日) 17:06:29 ID: Be:
    printfを挟んだらなぜか動きましたというのはよくあること 

492 デフォルトの名無しさん [sage] 2010/02/14(日) 17:10:22 ID: Be:
    落ちる所とは全然違う所に問題があるとか
    オーバーランによるスタック破壊は本当に怖い 

493 デフォルトの名無しさん [sage] 2010/02/14(日) 17:43:55 ID: Be:
    ネタ元がメモリ解放を疑ってるのに
    スタック話とかおよびじゃねぇよ 

494 デフォルトの名無しさん [sage] 2010/02/14(日) 18:05:04 ID: Be:
    ネタ元に信憑性が無い事はすでに判明している。
    この場合は全てを疑うのが原則。 

495 デフォルトの名無しさん [sage] 2010/02/14(日) 18:10:53 ID: Be:
    >>494 (キリッ

    それでどうしようてんだい? 

496 デフォルトの名無しさん [sage] 2010/02/14(日) 18:17:07 ID: Be:
    >>493
    だから、解放時に落ちるのは管理情報壊してるからなんだって。
    で、管理情報を壊してるってことはアンダーランとかオーバーランで他のも壊してる可能性が非常に高いし、
    落ちなくなったときも、偶然管理情報が無事なだけって可能性が大いにありうる。 

497 デフォルトの名無しさん [sage] 2010/02/14(日) 19:09:12 ID: Be:
    >>487
    メモリバグを起こす奴が何言っても説得力ないな 


【初心者歓迎】C/C++室 Ver.71【環境依存OK】 
490 デフォルトの名無しさん [] 2010/02/14(日) 19:10:50 ID: Be:
    CやC++を今から勉強したいんですけど、
    全くの初心者ですがオススメの本ってありますか?
    将来仕事にすることも考えてます。 

491 デフォルトの名無しさん [sage] 2010/02/14(日) 19:14:57 ID: Be:
    >>490
    独習シリーズ

    本屋に行って、黄色い分厚い本を買って頭からケツまで20回嫁。 

494 デフォルトの名無しさん [] 2010/02/14(日) 19:20:53 ID: Be:
    >>491
    ありがとうございます
    明日にでも買ってこようと思います 

黄色い分厚い本というと、どちらかといえばスプリンガーの本を思い浮かべてしまうな。 あそこはC やら C++の本は出してなかったよね(笑)


C言語なら俺に聞け(入門編)Part 60 
449 デフォルトの名無しさん [] 2010/02/14(日) 21:34:15 ID: Be:
    #include <stdio.h>
    #include <string.h>
    int main(void) //最初に実行される関数
    {
    char name[17] = "ジッキンゲン";
    char rank[] = "男爵";
    strcat(name,rank); //変数nameの文字列に変数rankの
                //文字列を合体
    puts(name); //変数nameの文字列と改行を出力
    return 0;
    }

    これって何が違うんですか?? 

450 デフォルトの名無しさん [sage] 2010/02/14(日) 21:35:27 ID: Be:
    >>449
    何と比べて? 

451 デフォルトの名無しさん [] 2010/02/14(日) 21:43:29 ID: Be:
    >>450
    は?というと? 

452 デフォルトの名無しさん [sage] 2010/02/14(日) 21:51:24 ID: Be:
    辞書より:
     「異なる」は比べてみて同じでないことを表すにとどまるが、「違う」は「約束が違う」「答えが違う」
     「気が違う」など、あるべきこと・状態から外れることをも言う。

    どっちの意味だろ。動かない、って意味なのかな。

453 デフォルトの名無しさん [sage] 2010/02/14(日) 22:12:09 ID: Be:
    国語の入門編から出直してください 

454 デフォルトの名無しさん [sage] 2010/02/14(日) 22:14:31 ID: Be:
    >>453
    え、どうして?

    「これって何が違うんですか?」
    →何かが違うから(エラーがでて)動かない

    という意味にもとれると思うのですが。 

455 デフォルトの名無しさん [sage] 2010/02/14(日) 22:18:37 ID: Be:
    >>454
    あなたの思考回路が違っているのか
    全角空白を問題としているのか
    分かりません 

456 デフォルトの名無しさん [sage] 2010/02/14(日) 22:19:14 ID: Be:
    自分で、「~意味に”も”とれる」と言ってりゃ世話ねーよ。
    やっぱり国語の入門からやり直してこい。

    聞く時は、「これって何が間違ってるんですか?」にしとけば良かったな。 

457 デフォルトの名無しさん [sage] 2010/02/14(日) 22:21:46 ID: Be:
    いや俺は >>450 が「何と比べて」と聞いているから
    そういえば「違う」にもいろいろな意味があるよなー、と思って
    辞書を引いてみただけだが。

    うぜーなマジで。 

458 デフォルトの名無しさん [sage] 2010/02/14(日) 22:23:33 ID: Be:
    [例文]
    自分の想定している動作はコレコレなんですけど、
    実行してみると何々と表示されてしまいます。
    or
    ~というコンパイルエラーが出力されてしまいます。

    これは何が間違っているんでしょうか? 

まあ「何が違っているんですか」を「どこが間違っているんですか」と 受け取れなくもないけど、ちと悩むなw

■_ わたしの場合

お師匠様から自腹で「ソフトウェア作法」と「プログラム書法」 を買ってよく読めと云われましたです。


「スタイル」教育:柴田 芳樹 (Yoshiki Shibata):So-netブログ

今週の金曜日(2月19日)から書籍『プログラミング作法』の第1章「スタイル」を教える社内教
育コースを始めます。基本的に、テキストである本書を自費で購入して参加してもらうコースで
す。

「ソフトウェアエンジニアの心得」コースを受講済みというのが条件です。心得コースでは、自
分の時間とお金を自分に投資しなさいと話をしています。それを受講しても、会社で1章だけを
コピーしたり、自費で買った本でなくて借りたりして出席するような人が居れば、受講させない
で帰ってもらうこともあるかもしれません。

1章だけの教育だからと言って、2,940円の本を買わないで済ませて、他の章も全く読む気がない
という人は、帰ってもらうことになるかと思います。 

プログラミング作法はいい本なので、ぜひ手元に持ってもらいたいですよね。 そういう意味でも自分で買ってもらいたいというのは賛成。

■_ 潔癖過ぎるかもしれませんが

わざわざ書くこともないとは思うんですが、ついったでもちょっと触れましたので。

Amazon.co.jp: 関数プログラミング言語F# R付: 赤間 世紀: 本 を買って読んでたんですが、途中でくじけました。 コンビネータ論理(と書かれてました)のあたりとか面白いところもあったんですが、 いかんせん気になるところが多すぎるというかなんというか。 まず訳語がちょっと独特というか目新しいというか。

first-class citizen は ファーストクラスシチズン とカタカナ表記になってます。 これはまあ悩むところとは思いますが、 「強いタイプ付き」や 「抽象タイプ(abstract type)」、多態的タイプ(polymorphic type) のように、type の訳が「タイプ」で統一されてました。 「型」を避ける理由がなんかあったんでしょうか? ほかに目に付いたのは 「ポリモフィズム」とか。 これは検索したらそれなりに使われているみたいですが 「ポリモーフィズム」でも「ポリモルフィズム」でもないのがちょっと意外でした。 式 (formula) とか 分岐文(conditional expression) も 何でだろうかと思います。間違いとは云えないと思うのですが なぜこれをというはします。

本文で、それまで Curry のCの字も出てきてないのに(わたしが読み落としていなければ) 以下のような文章が出てきたのも違和感がありました。

 同様の操作で、すべてのn変数関数を、1変数関数として記述できる。
そして、1変数関数の値は、「適用」によって求めることができる。
この操作を、「カリー化」(currying)という。

 なお、カリー(Curry)は、「組み合わせ論理」を研究した論理学者である。
歴史的には、シェーンフィンケル(Schonfinkel(1924))が、同様の操作を、
1924年に既に提案している。
  

currying が Curry という人名からきているというの知っている人でなければ なぜここでカリーという人がでてくるのか、わけがわからんのではないでしょうか?

んで、今回挫けた最大の原因。 巻末に参考文献が挙げられているのですが

C++ によるオブジェクト指向入門
人工知能の基礎理論
Cアルゴリズム入門
ソフトウェア工学教科書
Javaによるオブジェクト指向入門
Prologで学ぶAIプログラミング
関数プログラミング教科書
FORTRANで学ぶプログラミング基礎(共著)

Can progamming be loberatized from the von neuamn style?
The Lmabda Calculas: Its Syntax and Semantics, 2nd Edition
Lambda calculi with types
The CUCH as a formal and description language
On certain formal properties of grammars
The Calculi of Lambda-Conversion
Combinatory Logic vol. I
Combinatory Logic vol. II
Introduction to Combinators and λ-Calculus
Why functional programming matters
Introduction to Mathematics
Recursive function of symbolic expression abd their computation by machine Part I
The F# 1.9.7 Draft Language Specification
Implementation and applications of Scott's logic for computable functions Proc.
Denotational Semantics
A new implemetation technique for applicative language
On computable numbers, with an azpplication to Entsscheidungproblem

和書は、FORTRAN~を除いてはすべて自分の著書です。 FORTRAN~も共著者として名前があります。 正直本のタイトルを眺めていて、なぜこの本が参考文献に挙げられているのだろうかと 疑問に感じます。中身を見ればそんな疑問も晴れるのかもしれませんが。

この本の著者はたくさんの本をお書きになられているのですが、 手元にあったもう一冊 Amazon.co.jp: 関数プログラミング教科書 (I・O BOOKS): 赤間 世紀, 第二I O編集部: 本 も、参考文献ついては同様に、 和書については自著のみでした。

細々とは書きませんが、なぜ自分の書いたものを「参考文献」に挙げられるのか わたしにはよく理解できません。内容的にどうなのか(間違いがあるかとか)は 判断できませんが、このようなことをされる方の本は進んで読む気にはなれません。 これからは新刊でその名前を見かけたらその本はデフォルトスルーにします。

■_ The origin

定期的に出る話題。


for文のループ変数のiは、iterationのi (?)

for文のループ変数のiは、iterationのi (?)

うーん。javaの人から聞いたのですが、そうなんだろうか。
私らFortran世代の人は、ループ変数などの整数変数は i,j,kがデフォルトです。
(最初の文字がi,j,kは整数変数という具合に型が決まってました)
未だに、ループ変数は,i,j,kの一文字変数を使ってます。
 ですので string i; double j;  などの文をみると違和感を感じます。

Fortranを知らない人が「iterationのi」と聞けば、納得しそうな説ですが、(?)感がします。
でも、語源説って、そういうモノかも知れませんね。
元ネタを知らないときは、知っていることで、理由付けするので、異説が登場するのかも知れません。

投稿日時 : 2010年2月14日 2:36
Feedback
# re: for文のループ変数のiは、iterationのi (?) 2010/02/14 9:40 かたぎり

COBOLer時代、Indexのi、アルファベットのその次だからj、k、と先輩から刷り込まれた人が通ってみまするw
# re: for文のループ変数のiは、iterationのi (?) 2010/02/14 21:34 ognac

刷り込みは、トラウマ的に解消できないんですよね。 

広く使われるようになった理由が FORTRANの仕様だとして、それがどこから来たのかって 疑問を持つ人は少ないんでしょうかねえ。

あと関係ないけど「トラウマ」って気安く使われすぎだと思うんだけどどうなんでしょう? >その方面に明るい方(いるのか?)

■_ 本日の巡回から

2010年02月13日

■_

・消失
観てきました。 id:uskz さんのためのような映画でしたw いやー、バルト9 楽でいーわ。 前日にネット経由で予約しておいてあとは映画館へゆっくり (一時間前までに発券しておかないとキャンセルだけど)行けばよいと。 映画館で行列作って待ってるのはかなわないからなあ。

・カニソムリエ
テレ東だかでやってた番組で出てきた。 ~ソムリエはもう勘弁してください ○| ̄|_

・F# 本
この筆者とは合わないと思います ○| ̄|_ 少なくとも参考文献に自著をずらずら並べるような方の本は進んで読む気にはなりません。 関数プログラミング本を積んでたままだったはずだけど、見当たらないなあ。 ちょっとチェックしようと思ったのに(参考文献のところとかw)。 あと、Prolog本どうしようかと思ったけど止めておきます。

■_ Windows これだけはいれておけ

という話らしいです。 初めて見るような名前が結構あるなあ


Must-Have Windows Software (or Windows Programs that I use) - good coders code, great reuse

I am not just a Linux professional, I also happen to use Windows quite often. In fact, 
Windows is my primary desktop from which I connect to all the other boxes and do my 
work on. During the years of Windows usage, I have accumulated a list of must-have 
Windows programs that I wouldn't be able to work without. Some of them are commercial, 
some are freeware, but that doesn't matter. What matters is how productive you are 
with your setup. If you're really productive on Linux with your own set of tools, it'
s perfectly fine and you have done a great job of finding the best tools of trade.

1. Total Commander.

I can't imagine working on a computer without Total Commander. Absolutely must-have 
software. Total Commander is what separates boys from men. Total Commander is probably 
the #1 reason why I don't use other operating system on my desktop. Tabs, a great GUI 
interface and customize-everything-configuration make it superior to all the other 
file managers. If I switch the desktop OS, I'll have to write my own clone of Total 
Commander or I wouldn't be able to work with the computer. Total commander is 
shareware.

これなしで作業するのは考えられない。ってどんなんだろうか。

2. TrueCrypt.

(略)


3. SecureCRT and Putty.

(略)


4. WinSCP.

(略)


5. Cygwin.
(略)


6. VMWare Workstation.

(略)


7. Synergy.

(略)


8. Beyond compare.

(略)


9. Tclock2.

(略)

10. Auto Hotkeys.

(略)


11. Locate32.

(略)


12. allSnap.

(略)


13. Fineprint.

(略)


14. Launchy.

(略)


15. ClipX.

(略)


16. DU Meter.

(略)


17. Taskbar Shuffle.

(略)


18. UltraMon.

(略)


19. Sumatra PDF.

(略)


20. KeePass.

(略)


21. RoboForm.

(略)


22. WinRAR.

(略)


23. Inkscape.

(略)


24. FFDShow.

(略)


25. Media Player Classic.

(略)


26. Real Alternative.

(略)


27. Quicktime Alternative.

(略)


28. AviSynth.

(略)


29. FFMpeg.

(略)


30. VirtualDub.

(略)


31. Dependency Walker.

(略)


32. Most of the Sysinternals tools.

(略)


33. File & Folder Unlocker.

(略)


34. Hijackthis.

(略)


35. ImgBurn.

(略)


36. IsoBuster.

(略)


37. Virtual CloneDrive.

(略)


38. SQLyog.

(略)


39. pgAdmin.

(略)


40. XML Notepad.

(略)


41. Hex Workshop.

(略)


42. Vim.

For everything else.
What tools do you use?

This was a list of tools that I can't live without. What tools did I miss?

■_ 正確に見積もるには



未来を予測する最良の方法は、それを作ってしまうことだ - sodiumイオンにっき(2010-02-12)

未来を予測する最良の方法は、それを作ってしまうことだ

  プログラミングにかかる時間、正確に見積もるには?:スラッシュドットジャパン

というわけで、見積もりを最大限に正確にするためには、プログラムを作ってみるのが一番よい
のです。アラン・ケイもそういっています。

なるほど(え?

■_


Ruby 初心者スレッド Part 34
448 デフォルトの名無しさん [sage] 2010/02/13(土) 09:36:14 ID: Be:
    「or を伴う式をメソッドの引数に渡す場合は二重に括弧が必要となります。 」
    ってどういう意味?

449 デフォルトの名無しさん [sage] 2010/02/13(土) 09:43:24 ID: Be:
    そういうことはしないでくださいね、の意 

450 デフォルトの名無しさん [sage] 2010/02/13(土) 09:43:36 ID: Be:
    puts(nil or "a") だめー

    puts((nil or "a")) おk 

451 デフォルトの名無しさん [sage] 2010/02/13(土) 09:51:56 ID: Be:
    >puts (nil or "a")
    a

    普通にいけたけど? 

452 デフォルトの名無しさん [sage] 2010/02/13(土) 09:55:07 ID: Be:
    それ括弧なし 

453 デフォルトの名無しさん [sage] 2010/02/13(土) 09:57:32 ID: Be:
    >>448
    それ余計な文言だよな
    査読者や編集者がやっぱり必要だと思う

    「メソッドの引数にする場合にはorを伴う演算部分を括弧でくくって式にする必要があります」が正解

    p(false or "yes!")

    だと「p (false が偽だったら "yes!"」と解釈されて文法エラーになる
    false or "yes!" がひとつの処理の塊だとわからせるために式として括弧で括り、
     (false or "yes!")
    なおかつ、これ全体を引数として指定してるんだということをわからせるために引数としての括弧を省略せずに使う
     p()
    にさっきのカッコつき式を適用して
     p((false or "yes!"))
    となる

    なお、>>451のように引数括弧相当の存在が明確な場合はエラーにならない
    この括弧は引数の括弧ではなく式を作る括弧だ 

454 デフォルトの名無しさん [sage] 2010/02/13(土) 10:13:03 ID: Be:
    ありがとうございます。
    もしかしてメソッド名と引数を括る括弧の間を空白で空けてはいけない?
    (第一引数の式を括る括弧と解釈される?) 

455 デフォルトの名無しさん [sage] 2010/02/13(土) 10:26:20 ID: Be:
    メソッドの引数のカッコはメソッド名と分かれてはいけない

    が、分かれた場合は「引数のカッコを省略して引数の全体(または一部)をカッコで括った」と解釈される
    おおむね同じ動作をするので、実際上はみんな深く考えてない

    puts("ruby") #=> "ruby" をメソッドに渡す
    puts ("ruby") #=> ("ruby") の結果をメソッドに渡す

456 デフォルトの名無しさん [sage] 2010/02/13(土) 10:36:24 ID: Be:
    ありがとうございました。
    ロジカルシンキングではなくイマジネーションでってことですね

457 デフォルトの名無しさん [sage] 2010/02/13(土) 10:51:47 ID: Be:
    いや物凄い論理的だと思うが

    引数括弧を省略するのがコンセンサスになってるのはpとかputsとかごく一部だぞ
    それ以外の普通のメソッドはとりあえず括弧つけとく派が多数派だ
    irbとかだと読み返すこともないから適当に省略しまくってるが 

458 デフォルトの名無しさん [sage] 2010/02/13(土) 10:55:08 ID: Be:
    >>456
    意味不明なときは感覚なものととらえてしまうけど、
    しばらくRuby使ってなれてきたらロジカルなものだと理解できるようになるよ、がんがれ 


まあこれは引っかかる人は一度は引っかかるところだよなあ。

■_ 微力

【まるで】使えない新人 0x1C /a>
561 仕様書無しさん [sage] 2010/01/26(火) 22:00:18 ID: Be:
    電話の応対

    電話もとらない奴はクソだと思うし
    俺自身がクソだったから、厳しく教えてる 

562 仕様書無しさん [] 2010/01/26(火) 22:19:00 ID: Be:
    客でもないのに昼飯時に電話してくる奴はマジシネヨ 

564 仕様書無しさん [sage] 2010/02/10(水) 23:07:57 ID: Be:
    >>561
    こないだまでの俺と全く同じ道を歩んでいるかのようだな。
    この間電話番が忙しそうだったので出たら、あとでその子に
    「仕事取らないでください」と遠回しに怒られたでござるの巻。
    世の中って難しい。社会人歴6年。

    >>562
    「急ぎじゃないんですけどー」って言われたら客でも氏ねよとは思うが。
    本当に急ぎとか、「この時間しかないんだってくらい忙しい」とかなら、
    立場関係なくしょうがないか、むしろ微力を尽くさせていただきますって感じだが。 

565 仕様書無しさん [sage] 2010/02/13(土) 19:22:11 ID: Be:
    新人じゃないけど
    期限日にコンパイルしてないソース持って来て
    「私はコンパイルに時間がかかると思ってません」と豪語

    …その後1週間かけて隣でコンパイルしてました
    もちろんしっかり尻拭いさせられました
    「ありゃ?」とか「おりゃ?」とか
    お前他に言う事無いの? 

566 仕様書無しさん [sage] 2010/02/13(土) 19:23:21 ID: Be:
    とりゃ? 

567 仕様書無しさん [sage] 2010/02/13(土) 19:26:43 ID: Be:
    そりゃ? 

568 仕様書無しさん [sage] 2010/02/13(土) 19:30:16 ID: Be:
    うりゃ? 

569 仕様書無しさん [sage] 2010/02/13(土) 19:39:34 ID: Be:
    >>566-568
    やめてくれ~
    夢に出て来そうだw 


「微力を尽くします」って格好つけて云ったら、 「微力じゃだめだ、全力でやれ」と返されたことがあります。 かんべんしてくださいよ… ○| ̄|_

■_ 本日の巡回から

2010年02月12日

■_

・地デジ化
わたしの家は昨年末にようやく地上波デジタル放送を受信できるようにしたのですが、 アンテナは立てずにケーブルテレビと契約しました。 そのあと自分の家の近くを見てみると、意外にUHFアンテナが立っている家というのは 少なくて、VHFと、衛星放送用のアンテナだけというのが大半でした。 しかしよく見てみると、ケーブルテレビの受信装置(なんという名前なのか知りませんが)が 壁についている家が結構あるんですね。してみると、やはりわたしの住んでいるあたりも 受信可能な世帯というのはそこそこの割合になっているのかもしれません。 ところで、これまた自宅のケーブルテレビの工事のときに気がついたのですが、 電柱間を電線やら電話線がたくさん通っているのですけど 複数のケーブルテレビ会社がそれぞれに線を持っていて、 わかりやすいように会社名の書かれたプレートがついてるんですね。 自宅近くで見たところでは四社ほど確認できましたw (USEN と NTT と JCOM と)

・図書館予約システム
自宅近くにある図書館。以前にも書いたとおり付近の公立図書館とあわせて 蔵書を検索、予約ができるようになっています。 インターネット経由ででもできるんですが、 当然のように図書館に専用端末が置かれてます。 で、予約をするときはおおむね 借りたい本を検索→タイトルを選択→予約ボタンがあるので選択 →ID入力 → パスワード入力 てな手順になるんですが、 先日、わたしがある本を予約しようとしたときにわたしの前に操作していた方 (そこそこ年配の女性)がえらく悪戦苦闘しておりまして、 どうもパスワードの入力を何度も間違えてしまっている様子 (パスワードは数字と英大小文字の組み合わせ)。 んで、ふと思ったんですが、通常借りるときは貸し出し券をバーコードリーダーで スキャンして貸し出し記録をつけるわけで、だったら予約のときも 検索端末にリーダー持たせておいてそれに通せばいいんじゃね? と。他人が成りすまして使うのどうのという話も、実際借りるときだって 本人確認はしないわけですから同じだと思うんですよね。 インターネット経由の場合はまあパスワードも仕方ないと思いますが、 図書館内に設置されている端末でもパスワードを入力させる必要はないんじゃないかなあと。 ああ、でも貸し出しカードを忘れたとかいうパターンがあるのか。

■_ Evolution of

reddit からネタひろい Haskell→Python→Ruby ときて、さあ次は? Evolution of a Ruby Programmer : ruby (Ruby プログラマーの進化)


gist: 295352 - GitHub

Evolution of a Ruby Programmer.rb #

# Newbie Programmer 新米
def factorial(x)
  if x == 0
    return 1
  else
    return x * factorial(x - 1)
  end
end
puts factorial(6)
puts factorial(0)
 
# Discovered #upto #uptoを見つける
def factorial(x)
  factorial = 1
  1.upto(x) do |i|
    factorial *= i
  end
  factorial
end
puts factorial(6)
puts factorial(0)
 
# Discovered Enumerators #Enumeratorを見つける
def factorial(x)
  x.downto(1).inject(1) { |m, i| m * i }
end
puts factorial(6)
puts factorial(0)
 
# Discovered Range+Inject Range とinject を見つける
def factorial(x)
  (1..x).inject(1) { |m, i| m * i }
end
puts factorial(6)
puts factorial(0)
 
# Embraced 1.8.7/1.9 1.8.7 や 1.9 向けに
def factorial(x)
  (1..x).inject(:*) || 1
end
puts factorial(6)
puts factorial(0)
 
# Discovered Ternary Operators 三項演算子を以下略
def fac(x); x == 0 ? 1 : x * fac(x - 1);end
puts fac(6)
puts fac(0)
 
# Discovered Operator Precedence 演算子の優先順位に(ry
def factorial(x)
  i = 1 and (i *= x and x -= 1 while x > 0) or i
end
puts factorial(6)
puts factorial(0)
 
# Discovered Rails Rails に
class Numeric
  def fact
    (1..self).inject(:*) || 1
  end
end
puts 6.fact
puts 0.fact
 
# Discovered Camping
def F(x)((1..x).inject(:*)||1)end;p(F(6));p(F(0))
 
# Discovered Magic 魔法を使って
module Math
  extend self
 
  def method_missing(method, *args)
    if method.to_s =~ /^fact(orial)?/
      class_eval <<-EOS
def #{method}(x)
(1..x).inject(:*) || 1
end
EOS
      send(method, *args)
    else
      super
    end
    
  end
end
puts Math.fact(6)
puts Math.fact(0)
 
# Discovered Hash Magic ハッシュの魔法を使う
FACTORIALS = Hash.new { |h, k| h[k] = (1..k).inject(:*) || 1 }
puts FACTORIALS[6]
puts FACTORIALS[0]
 
# Attends Seattle.rb
require 'rubygems'
require 'inline'
class Factorial
  class << self
    inline do |builder|
      builder.c %q{
long factorial(int value) {
long result = 1, i = 1;
for (i = 1; i <= value; i++) {
result *= i;
}
return result;
}
}
    end
  end
end
puts Factorial.factorial(6)
puts Factorial.factorial(0)
 
# Premature Optimizer + eval
class << self; class_eval "def factorial(x); case x; #{(0..100).map{|i|"when #{i} then #{(1..i).inject(:*) || 1};"}}; else (1..x).inject(:*) || 1 end end" end
puts factorial(6)
puts factorial(0)

最後の二つがよくわからん。あ、いや二つ目だけか。

■_ ある意味ほのぼの

くだすれFORTRAN(超初心者用)その4 
908 ごめんなさい、お願いです。 [] 2010/02/10(水) 00:51:22 ID: Be:
    このプログラムを
    明日までに作ってください!!お願いします。

    Fortranで,

    階乗 n! を計算する関数を作成し,

    順列
    n個の異なるものからr個取り出して並べる。
    このときの順列の総数をnPrとあらわす。
    nPr=n(n-1)(n-2)・・・(n-r+1)
    を計算する関数を作成し,

    組み合わせ
    異なるn個からr個取り出して組を作る。
    このときの組合せの総数をnCrとあらわす。
    nCr = nPr/r!
    を計算するプログラムを作成してください。
    おねがいします。 

909 デフォルトの名無しさん [sage] 2010/02/10(水) 01:55:59 ID: Be:
    >>908
    最近勉強しているのでFortran95 で書いてみた。
    たぶん君が求めているのはF77ヴァージョンだろうw

    MODULE m_2chan
    IMPLICIT NONE
    CONTAINS

    ELEMENTAL INTEGER FUNCTION factorial(n)
    INTEGER, INTENT(IN) :: n
    INTEGER :: i
    factorial = PRODUCT( (/ (i, i = 1, n) /) )
    RETURN
    END FUNCTION factorial

    ELEMENTAL INTEGER FUNCTION permutation(n, r)
    INTEGER, INTENT(IN) :: n, r
    INTEGER :: i
    permutation = PRODUCT( (/ (i, i = n, n - r + 1, -1) /) )
    RETURN
    END FUNCTION permutation

    ELEMENTAL INTEGER FUNCTION combination(n, r)
    INTEGER, INTENT(IN) :: n, r
    combination = permutation(n, r) / factorial(r)
    RETURN
    END FUNCTION combination

    END MODULE m_2chan
    !

910 デフォルトの名無しさん [sage] 2010/02/10(水) 01:57:29 ID: Be:
    PROGRAM twochannel
    USE m_2chan
    IMPLICIT NONE
    INTEGER :: n, k
    PRINT *, 'INPUT n and k'
    READ *, n, k
    PRINT *, 'nCk = ', combination(n, k)
    STOP
    END PROGRAM twochannel

    77育ちの俺様は、暗黙の型に従っていないのですげー気持ち悪いぜwww

911 デフォルトの名無しさん [sage] 2010/02/10(水) 02:27:41 ID: Be:
    >>908
    数学的にチューニングすべきだが、提示された式のとおりに作った。PROGRAMは改行多杉になるので省略
    integer function factorial(n)
    implicit none
    integer i, n
    i = n
    factorial = 1
    do while(i .gt. 0)
    factorial = factorial * i
    i = i - 1;
    end do
    end
    integer function permutation(n, r)
    implicit none
    integer n, r, i
    i = 1
    permutation = 1;
    do while(i .le. r)
    permutation = permutation * (n - i + 1)
    i = i + 1
    end do
    end
    integer function combination(n, r)
    integer n, r, factorial, permutation
    combination = permutation(n, r) / factorial(r)
    end

912 デフォルトの名無しさん [sage] 2010/02/10(水) 08:48:40 ID: Be:
    908の人気に嫉妬 

915 908です。 [] 2010/02/10(水) 11:57:13 ID: Be:
    みなさん、ありがとうございました!!(泣 

915 の(泣 は嬉し涙なんだろうか?w

■_ 本日の巡回から

■_

んーむ今ひとつ調子があがりゃん。

2010年02月11日

■_

・東スポ休刊日
ついったで中の人にレスもらってびびったw

・へうげもの
黒田節のエピソードは知ってたけど、黒田長政のあの兜って元は福島正則のだったのかっ 母里友信 - Wikipedia 秋季特別展 戦国ふぁっしょん-武将の美学-|企画展案内|徳川美術館 んで、名槍「日本号」でふと日本の三名槍とかいうのがあったはずなんだけど、 あとの二つはなんだったけか。

天下三名槍 - Wikipedia
天下三名槍(てんかさんめいそう)は、天下三槍(てんかさんそう)ともいい、

    * 御手杵(おてぎね)
    * 日本号(にほんごう)
    * 蜻蛉切(とんぼきり)

の三本の槍を指す。

おお。これか。

・特典
あの「ムダヅモ無き改革」がDVDになって2月26日発売!とらのあなオリジナル特典決定!! むー。予約したのキャンセルしてとらで予約しなおそうかしらんw

・なんかこういろいろ余裕がなくて、stackoverflowあたりほとんど追いかけられなくなったなー

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

ふう。

Bruce Perens: How Many Open Source Licenses Do You Need?
http://itmanagement.earthweb.com/osrc/article.php/3803101/Bruce-Perens-How-Many-Open-Source-Licenses-Do-You-Need.htm

の 3。
やっと終わりだ。

You see, we need computers to run them on. Today, we can get cheap motherboards for 
desktops, upon which we can install Linux and other Free Software. In the future, 
people won't use desktops as much as they use embedded devices like cell phones and 
web slates. So, we want to make sure that we can run new Free Software on embedded 
devices that already come with Free Software out of the box.

ご存知の通り、わたしたちはソフトウェアを実行するためにはコンピューターを必要とします。
今日、わたしたちは Linux やそのほかの自由ソフトウェアをインストールできるようなデスクト
ップのための安価なマザーボードを入手することが可能です。将来においては、携帯電話や web 
slates のような組み込みデバイスを使うほどには人々はデスクトップを使わなくなるかもしれ
ません。ですから、わたしたちはすでに自由ソフトウェアがそこに入っているような組み込みデ
バイス上でも、新しい自由ソフトウェアを実行できることを確かなものにしておきたいのです

So, those two big ambitions of GPL3 are worthy of praise. But the biggest advantage of 
GPL3 is its legal solidity. During the creation of GPL3, literally dozens of attorneys, 
from the world's largest companies, reviewed every word of the license. No license 
anywhere has had 1/10 of the legal review that went into GPL3.

そこで、GPL3 の二つの big ambitions  は worthy of praise なのです。けれども GPL3 の最
大のアドバンテージとはその法的な solidity です。GPL3 を策定している間、複数の世界最大
級の企業の法廷弁護士たち多数からライセンスの一語一語に対するレビューを受けました。GPL3 
がうけたものの 1/10 ほども法的なレビューをうけたライセンスはどこにもありません。

So, you can be reasonably sure that it will perform in court the way it's intended to 
work. Managing dozens of attorneys is difficult, but Richard Stallman was equal to the 
task, keeping the result in line with the ethos of Free Software.

ですからあなたは、GPL3 が意図した働きを court the way で perfrom するだろうと
reasonably に確信できるのです。数十個の attorneys を管理することは困難ですが、
Richard Stallman は自由ソフトウェア (Free Software) の etos (理念、精神) と調和し
た結果を保ち続けるというタスクに耐えました。


A lot of companies like the MPL license, from the Mozilla project, better. But MPL 
actually only fits in the place of the “in-between license”; its terms aren't strong 
enough to provide the sharing-with-rules environment that is necessary to protect some 
products.

あまりにも多くの企業が Mozilla project によるライセンスである MPL ライセンスを好んでい
ます。けれども MPL は “in-between license” に当てはまるところにしかフィットしないの
です。その文言は、一部の製品を守るのに必要な sharing-with-rules environment (ルールに
よって共有するための環境) を提供するのには不十分な強さしか持っていないものなのです。

My main problem with MPL is not the license itself, but the very many licenses that 
have been derived from it, each with its own little differences, making the 
combinatorial problem of Open Source licenses significantly worse. FSF was smart to 
copyright their license text and maintain that there would be FSF-approved derivatives 
only.

わたしが MPL に関して問題だと思うのは、ライセンスそのものではなく、それぞれがほんの少
しだけ違いを抱えているライセンスがあまりにも多くそこから派生していて、オープンソースラ
イセンスの価値を明らかに落としてしまう combinatorial problem (組み合わせ問題) を作り出
してしまっていることなのです。FSF は自分たちのライセンスの文面の著作権を保持しておいて、
自分たちが approve した derivatives (派生物)だけがあるように maintain するほどには賢か
ったのです。

It's easily possible to put together another list of three licenses that satisfies the 
requirements above. But this is the one that I think that most companies, and Open 
Source projects, should use.

前述した要求項目を満足するような三つのライセンスのもうひとつのリストを一緒にまとめるこ
とは容易です。しかしここで挙げたのは大部分の企業やオープンソースプロジェクトが使うべき
ものとわたしが考えているものです。

I'll catch a lot of flack from people who are partisan to the BSD license, who are 
sticking with GPL2, who like one of the other 70, etc. But those licenses do similar 
things to the ones above, while being less up to date regarding how they cope with 
today's environment of patent and copyright infringement and all of the case law that 
has built up around it. When GPL 2 was written, there wasn't an Internet as we know it 
today, there weren't MP3 players, and the most complicated input device in most 
people's homes was a touch-tone phone.

わたしは、BSD ライセンスのパルチザンや GPL2 にこだわる人たち、あるいは他の 70種類のラ
イセンスのどれか一つを好む人たちからたくさんの flack (激しい非難) を受けるでしょう。し
かしそういったライセンスは、そのライセンスが時代遅れになったときに今日の特許環境にどの
ように対抗するのかあるいはまた著作権侵害やそれと共に構築された判例法 (case low)全てに
対してどのように対抗するのかということに関して前述したものと同じことを行うのです。GPL 
2 が作成された頃には今日知られているような形のインターネットはありませんでしたし、MP3 
プレイヤーもなく、ほとんどの人が自分の家で持っている最も複雑な入力デバイスといえばプッ
シュホン (touch-tone phone) だったのです。

#infringement 侵害、違反
#case law 判例法
#cope with ~に対抗する

If we all build our own sets of three licenses, we'll still have that combinatorial 
problem when we go to mix our Open Source with that of other people. We'll still have 
70 different licenses, many of them in wide use. You can help to solve the problem.

仮にわたしたちがわたしたち自身の三つのライセンスをすべて定めたとしても、わたしたちのオ
ープンソースと別のひとたちのオープンソースとを混ぜようとしたときの組み合わせ問題
(combinatorial problem) はまだ残っているでしょう。わたしたちにはさらに、広く使われて
いるような 70種類のライセンスがあります。あなたはこの問題を解決するための手助けができ
るかもしれません。

Will you join me? (一緒にやりませんか?)

I said you needed 4 licenses at most, and have only discussed 3. The 4th you might 
consider is Affero GPL3.

先だってわたしはあなたにライセンスは四種類あればほとんどの場合は間に合うと書きました。
そしてここまでで論じたのは三種類だけです。四番目のものとしてあなたが考えたのは Affero 
GPL3 かもしれません


This license is specifically engineered to keep Google from running away with your 
product without sharing their improvements to it. Well, actually, it deals with the 
software as a service problem. The GPL class of licenses does not require that anyone 
share source code until they actually distribute the software. But Google doesn't 
distribute software, it performs it on its own site.

このライセンス (Affero GPL3) は、Google があなたの product を彼らの改良も共有し続ける
ように仕向けるために特別に engineered されていますそう、サービスとしてのソフトウェア問
題 (software as a service problem) に対処するためです。GPL class of linceses は実際に
ソフトウェアのを配布を行うまではソースコードの共有を要求しません。そして Google はソフ
トウェアを配布しておらず、(彼らが手を加えた)ソフトウェアを自分たちのサイトで実行してい
るだけです。

So, a license had to be written to cope with the SaaS phenomenon. If you want to keep 
the license count down to 3, you can use Affero GPL3 in place of GPL3. The text of 
Affero GPL3 is very similar to that of the plain GPL3, so again, you don't really have 
to learn an entire new license.

ですから、ライセンスは SaaS phenomenon を cope するように書かれていなければなりません
でした。あなたがライセンスの数を3のままに抑えておきたいのであれば、GPL3 の代わりに 
Affero GPL3 が使えます。繰り返しますが、Affero GPL3 の文面は plain GPL3 のそれと非常に
良く似ているものなので新しいライセンス全体を学ぶ必要はありません。

So, my set includes two base licenses: Apache 2.0 and GPL3, and two derivatives of 
GPL3: LGPL3 and Affero GPL3. To use them, you'll have to learn two licenses, and two 
sets of variations on one of those licenses. All of them are compatible with each 
other. Suddenly, Open Source isn't as complicated as those 5,256 combinations of two 
of the approved 73 licenses!

結果として、わたしの set には Apache 2.0 と GPL3 という二つの元となるライセンス(base 
linceses) があり、さらに GPL3 の派生したものである LGPL3 と Affero GPL3 の二つがありま
す。これらのライセンスを使うには、二つのライセンスと、そのうちの一つからの二通りのバリ
エーション (two set of variations) を学ぶ必要があります。これらは全てお互いが互換になっ
ています。
Suddenly,
オープンソースは 73種類のライセンスから二つをとった 5256個の組み合わせ
になるほど複雑なものではないのです!


Also see: Bruce Perens: Combining GPL and Proprietary Software

http://itmanagement.earthweb.com/osrc/article.php/3801396/Bruce-Perens-Combining-GPL-and-Proprietary-Software.htm

■_ ちんぷんかんぷん

デコレーターパターンは理解しているつもりなんだけど、 それと圏がつながるのが良くわからない。 修行が足りませんかそうですか ○| ̄|_


Twitter / TELL: デコレータパターン?…対象と変換の対のマッピングにし ...

デコレータパターン?…対象と変換の対のマッピングにしか見えない,っていうかそれ圏と関手だな

■_ちゅっちゅっちゅー

イキナリ復活してお知らせメールが来たw

◇◇◇◇◇◇◇◇◇◇◇◇◇◇神様通信 2010.2.11 ◇◇◇◇◇◇◇◇◇◇◇◇ 皆様、お久しぶりです。 かみちゅ!、皆様の温かいご声援により、いよいよBlu-ray BOX が2010年6月2日に発売決定です! DVDショップや、ECサイトで予約受付ちゅっちゅ~ですので、 皆様是非ご予約下さいね。 ◇◇◇◇◇ かみちゅ!Blu-ray BOX 2010年6月2日発売!!◇◇◇◇◇◇◇◇◇ ゆりえ様再度光臨! かみちゅ!がBlu-rayで発売決定でっちゅっちゅ~! 三方背BOX、デジパック仕様に特製ブックレットまでついてくるという豪華仕様で、 音声特典として、なんと、DVDシリーズでも好評だった、オーディオコメンタリー をこのBlu-ray BOX用に新規で録り下ろして収録! 映像特典として、舛成監督の始めての劇場作品、2010年公開予定の 「宇宙ショーへようこそ」特別版予告編もついてきます。 急いで、ご予約くださいね! タイトル :かみちゅ!Blu-ray BOX 発売日  :2010年6月2日 価格   :26,250円(税込) 品番   :ANZX-5061 特典・仕様:・Blu-ray3枚組 ・三方背BOX、デジパック仕様、特製ブックレット ・映像特典(「宇宙ショーへようこそ」特別版予告編) ・音声特典(新規録り下ろしオーディオコメンタリー) ほか (略) ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ 公式ホームページ http://www.aniplex.co.jp/kamichu/ 配信中止・アドレス変更手続きはこちら http://www.aniplex.co.jp/kamichu/archive/mail/mail.html 発行:Aniplex Inc. ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇

■_ else

そういう話だったのね。 最初に @niha28 さんのを見たときはインデントがなかったせいもあって 気にせずスルーしてしまっていた。



Twitter / niha: for (;;) { if (cond) { f = ...

for (;;) { if (cond) { f = true; break; } }; if (f) ... else ...
ってありがちなのでなんとかしてください


はじめてのにき(2010-02-11)
_ for else

http://twitter.com/niha28/status/8890624685

http://twitter.com/shinh/status/8896555291

Python だと、

for x in array:
  if fuga(x):
    break
else:
  return # 見つからなかったから return

的なのができるって話なんだけど、 文法さえまともならどんな言語でも欲しいと思うんだよな
ぁ。

ちょっと考えてみるに continue/next 使うといいんじゃないかなぁと思うんだけど、 文法的に
こう曖昧的な微妙さがある気がするんだな。

(略)

■_ 本日の巡回から


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

ホームへ


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

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