So-net無料ブログ作成

『Java Puzzlers』とGo言語(2) [golang]

Java Puzzlers 罠、落とし穴、コーナーケース

Java Puzzlers 罠、落とし穴、コーナーケース

  • 作者: ジョシュア・ブロック
  • 出版社/メーカー: ピアソン・エデュケーション
  • 発売日: 2005/11/14
  • メディア: 大型本
パズル3: 長除法(Long Division)

このパズルは、2 つのlong 値を割るプログラムに関することなので、LongDivision と呼ばれます。被除数は一日が何マイクロ秒であるかを表し、除数は一日が何ミリ秒であるかを表しています。このプログラムは、何を表示しますか?
public class LongDivision {
    public static void main(String[] args) {
        final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
        final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
        System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
    }
}
このプログラムの実行結果は、5です。その理由は、Javaではint型(上記の数値リテラルはすべてint)から構成される式の演算結果の型はintなので、上記のMICROS_PER_DAYへの代入の右辺の式の計算結果はintに収まらずにオーバーフローが発生しているからです。その結果、小さな値となっており、実行結果が5なのです。

単純にGo言語で書いたコードは次のようになります(対比しやすいように、Go言語の命名規則には従っていません)。
package main

import "fmt"

func main() {
    var MICROS_PER_DAY int64 = 24 * 60 * 60 * 1000 * 1000
    var MILLIS_PER_DAY int64 = 24 * 60 * 60 * 1000
    fmt.Println(MICROS_PER_DAY / MILLIS_PER_DAY)
}
このコードの実行結果は、1000です。その理由は、右辺の式に書かれているものはすべて定数つまり「型付けなし整数」であるため、式の演算はコンパイル時に計算されます。そして、その計算結果の値も「型付けなし整数」なのです。

「型付けなし整数」の値は、型がある変数(上記の場合、int64MICROS_PER_DAY)への代入において、変数の型(int64)の取り得る値の範囲に収まれば、コンパイルされます。収まらなければ、コンパイルエラーです。

コメント(0) 

『Java Puzzlers』とGo言語(1) [golang]

先週の金曜日のGo言語研修が終わって、懇親会(会社の食堂)まで時間があったので、『Java Puzzlers』をやってみました。

Java Puzzlers 罠、落とし穴、コーナーケース

Java Puzzlers 罠、落とし穴、コーナーケース

  • 作者: ジョシュア・ブロック
  • 出版社/メーカー: ピアソン・エデュケーション
  • 発売日: 2005/11/14
  • メディア: 大型本

もう12年前の本で、現在は絶版となっています。発売された時に、日本でJavaOneが開催されていて、印刷されたばかりのこの本が販売された頃が懐かしいです。

ところで、Javaではパズルになるものが、Go言語ではそもそもコンパイルエラーになるものが多いです。その理由の一つは、異なる整数型の混合計算をGo言語が許さないことです。初めてGo言語に触れると、その点がちょっと煩わしく感じます。でも、パズルをGo言語で書くとどうなるかを知ると、言語の違いが分かってきて面白いです。
パズル2: 変革の時(Time for a Change)

次の文章問題を考えてみてください。
トムは、$1.10 するスパークプラグを購入するために自動車部品店に行きますが、財布の中にあるのは2 ドル紙幣ばかりです。2 ドル紙幣でスパークプラグの代金を支払ったとしたら、彼は、お釣りをいくら貰うでしょうか。

この文章問題を解こうとしているのが、次のプログラムです。このプログラムは、何を表示しますか?
public class Change {
    public static void main(String args[]) {
        System.out.println(2.00 - 1.10);
    }   
}
これを実行すると結果は、0.8999999999999999となります。その理由は、1.10を浮動小数点数では正確に表現できないからです。

Go言語で同じコードを書くと次のようになります。
package main

import "fmt"

func main() {
    fmt.Println(2.00 - 1.10)
}
そして、実行結果は、0.9です。なぜ、Go言語でこうなってしまうのでしょうか?

それは、2.001.10の扱いの違いです。Go言語では、それらは「型付けなし(untyped)浮動小数点数」です。そして、Printlnの引数の式は定数リテラルの演算なので、コンパイル時に定数として計算されます。この定数計算に関しては、Go言語では言語仕様ですべのGo言語の実装に対して、次のように高い精度を要求しています。

Represent floating-point constants, including the parts of a complex constant, with a mantissa of at least 256 bits and a signed binary exponent of at least 16 bits.
しかし、いくら高い精度でもっても、正確には表現できないはずです。そこで、言語仕様では次の条件が付加されています。
Round to the nearest representable constant if unable to represent a floating-point or complex constant due to limits on precision.
つまり、定数計算の結果は、表現可能な最も近い値の定数となるのです。

もちろん、定数ではないfloat64の変数に代入してから計算すると、0.9にはなりません。
package main

import "fmt"

func main() {
    var x, y float64 = 2.00, 1.10
    fmt.Println(x - y)
}
このコードの実行結果は、0.8999999999999999です。

型付けなし定数については、『プログラミング言語Go』の「3.6.2 型付けなし定数」(p.87)でも説明されていますが、上記の丸めについては書かれていません。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)


コメント(0) 

第5期Go言語研修を開講しました [golang]

11月24日(金)に、私にとっては通算第5期となるGo言語研修を某企業様向けに開講しました。受講生は、入社3年目までの若いソフトウェアエンジニアの11名で開講しました。

テキストは、従来通りに『プログラミング言語Go』です。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)

月に1日で、6か月で終了する研修コースです。事前にあらかじめ決まっているテキストの予習範囲に対して以下の予習を行ってもらいます。
  • テキストの内容に関して、疑問に思ったことや分からないことを、受講生で共有しているGoogle Drive上のGoogle Sheetに記入してもらいます。
  • 練習問題のプログラミングを行ってもらい、解答を各人のGithub上のリポジトリに入れる
予習は業務ではなく、プライベートの時間を使って行ってもらいますので、希望者だけが受講する研修です。

月に1日の業務扱いの研修は、9時30分から17時までです。研修では、質問表の質問に回答したり、質問に関連した基礎知識を説明したりします。そして、練習問題のプログラミングの解答の確認も行っていきます。研修終了後は、懇親会を行い、研修の内容も含めて、色々な話をします。

コメント(0) 

第5期Go研修を11月から開講します [golang]

2017年8月31日付けで株式会社リコーを退職し、9月からはソラミツ株式会社に勤務してソフトウェア開発に従事しています。しかし、勤務日は月曜日から木曜日までの週4日勤務の雇用契約を結んでいます。金曜日は契約上は休日です。

リコーグループで行っていたGo研修は9月22日(金)に第3期と第4期が終了しました。同様に、Java研修も9月8日(金)に第25期が終了しています。9月は社員ではないので、個人として有償で金曜日に実施したものです。

リコーの退職は、自己都合扱いといっても「セカンドキャリア制度」(ある種の早期退職制度)の適用を受けており、リコーグループの会社から私個人への業務委託は今後は認められないということになっています。今後3年間は、リコーグループに対して技術教育を行うことはありません。

11月下旬から私にとっては通算で第5期となるGo言語研修を某企業で実施します。その企業では第1期となります。

コメント(0) 

第3・4期Go研修が終了しました [golang]

2017年4月に開講した第3期および第4期のGo言語研修が9月22日に終了しました(Go言語研修実績)。第3期は9名、第4期は4名が修了しました。これで、27名が修了したことになります。

第3・4期Go研修.jpg
修了生と私(3名欠席)。

先週終了した第25期Java研修も含めて、株式会社リコーの社員として実施していたすべての言語研修が終了となりました。

今までJava研修やGo研修は、社内研修という位置付けで実施してきました。そのため、在籍していた時期ごとに、富士ゼロックスグループ(富士フィルムグループ)やリコーグループの社員が対象でした。今後は、教育を希望される企業に対して実施していく予定です。

コメント(0) 

Go言語研修実績 [golang]

今までの実績、現在開催中、今後開催予定をまとめておくためのページです。

【プログラミング言語Go基本技術習得コース ― リコー(株)勤務 ―】
開始月 終了月 修了人数 備考
1 2016年2月 2016年10月 9名 社内向け。前半は翻訳原稿を使用
2 2016年7月 2017年2月 5名 社内向け
3 2017年4月 2017年9月 9名 社内向け
4 2017年4月 2017年9月 4名 リコーITソリューションズ社向け

【Go言語研修コース ― 個人活動 ―】
開始月 終了月 修了人数 備考
5 2017年11月 開講中 RT社向け

【研修内容】

研修では、『プログラミング言語Go』を事前に読んで、質問をまとめてもらうと同時に練習問題を解いてもらいます。この予習は基本的に私的時間に行ってもらいます。月に1日だけの業務中の研修では、質問への回答やディスカッション、および練習問題の解答の確認を行います。
※ 予習がすべて私的時間なので、研修の受講は「希望者」だけです。

リコー勤務時の研修コースのタイトルは、「プログラミング言語Go基本技術習得コース」となっていました。これは初心者向けという意味ではなく、Go言語でプログラミングするのであれば最低限学んでおくべきことを学ぶという意味でした。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)


第2期Go言語研修が終了しました [golang]

2016年7月に開講した第2期Go言語研修が終了しました。

第2期Go研修.png
修了生と私

第2期は5名が修了しました(1名が最終回を欠席)。第1期も入れると合計で14名が修了したことになります。

研修では、『プログラミング言語Go』を事前に読んで、質問をまとめてもらうと同時に練習問題を解いてもらいます。この予習は基本的に私的時間に行ってもらいます。月に1日だけの業務中の研修では、質問への回答やディスカッション、および練習問題の解答の確認を行います。
※ 予習がすべて私的時間なので、研修の受講は「希望者」だけです。

4月からは第3期を開講予定です。第3期からは過去の実績を踏まえて、6回(半年)で終わる研修コースに変更します。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)


第1期Go言語研修が終了しました [golang]

今年の2月から開講した第1期Go研修が終了しました。

IMG_0468.jpg
修了生と私

研修は一月に1日で、全部で8回で終了です。7回を通して、テキストの学習と練習問題を全部解いてもらい、今日の8回目は成果発表会でした。テキストは、『プログラミング言語Go』です。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)


内容補足:『プログラミング言語Go』 [golang]

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)

すでに本になってしまったので訳注を追加することはできませんが、補足として書いておきたいと思います。

7.8節「errorインタフェース」(p.226)に次の記述があります。
error を作成する最も簡単な方法は、指定されたエラーメッセージに関する新たなerror を返す errors.New を呼び出すことです。errors パッケージ全体は、次の4 行しかありません。
    package errors

    func New(text string) error { return &errorString{text} }

    type errorString struct { text string }

    func (e *errorString) Error() string { return e.text }
errorStringの基底型は、その表現を不注意な(あるいは意図的な)更新から保護するために、文字列ではなく構造体です。(以下省略)
文字列は不変(immutable)なのですが、リフレクションを使用すると書き直すことができます。リフレクションを使用して文字列を書き直したコード例はこちらです。

一方、構造体の非公開なフィールドはリフレクションを使用して書き換えることはできません。そのことは、p.396に記述されています。
Display をos.Stdout へ適用した場合、Unix ライクなプラットフォーム上のos.File 構造体のfd int フィールドといった、通常の言語規則に従えばアクセスできない構造体の非公開なフィールドの値をリフレクションが読み出せることが分かります。しかし、リフレクションでそのような値を変更することはできません。

(コード例は省略)

アドレス化可能なreflect.Value は、走査によって構造体の非公開のフィールドが得られたかどうかを記録しており、そうであれば変更を許しません。


『プログラミング言語Go』刊行記念トークセッション [golang]

スクリーンショット 2016-06-20 4.36.33.png


7月6日(水)に開催されるGoogleのソフトウェアエンジニアである鵜飼文敏氏とのトークセッションです。鵜飼文敏氏からは、書籍の帯のメッセージをいただきました。鵜飼氏は、次の本の監訳をされていますし、『Binary Hacks ―ハッカー秘伝のテクニック100選』を共著で執筆されています。

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

  • 作者: Mat Ryer
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2016/01/22
  • メディア: 大型本

無料ではなく入場料はドリンク付きで1000円ですが、奮ってご参加ください。ジュンク堂のイベントページは、こちらです(事前予約が必要です)。

当日は、著者アラン・ドノバンとブライアン・カーニハンのサインが書かれた日本語版が展示される予定です。