プログラミング.NET Framework
    第三版座談会
自己紹介
書籍での担当
翻訳のやり方に
  ついて
翻訳のやり方について(1/2)
• ツール
 – みんな大好きWordとExcel
   • 章ごとにサブ文書化
   • 訳語一覧とかはExcelで管理
   • レビュ時にはExcel Web App
     – 時間がないので新しくGoogle Docs覚えるには時間がなかっ
       た
     – FireFoxで動くからSUSEの人でも問題ないよね
 – 原稿はSubversionでバージョン管理
   • 複数人でやるなら分散型でもいいかも
翻訳のやり方について(2/2)
• プロセス
 – イテレーティブなモデルを目指した
   • ウォーターフォール執筆はつらい
     – ベテラン翻訳家ならともかく、品質向上の暇がなくなる
   • 理想
     – 初稿→編集さんチェック→レビュアさんチェック
   • 現実
     – 初稿→レビュラッシュ→編集さんチェック
 – スタイルガイドというものがあります
   • コーディング規約的なやつ
翻訳で
苦労したところ
翻訳で苦労したところ
• ページ数。
 – 結局分担してお願いすることに
   • 担当者ごとのくせが結構あった(仕切り力が足りないと
     もいう)
• 訳語
 – 口語、MSDN訳、Java界隈訳、アカデミック界隈訳
 – 定訳のないもの:construct、false sharing、
   interlocked
 – おかしいもの:ジェネリックのvariance→分散?
第二版との違い
第二版との違い
• (用語が出そろっていることもあり)なるべく
  MSDN系と用語がずれないように
• 著作権の絡みもあり、作業自体はフルスク
  ラッチ
• CLR 2からの部分についても、変更点などは
  修正
本の内容について
1~23章
(多少追記あり)
24章~
(第三版の追加分)
本の内容
• 各部の構成
 – 第1部:ランタイムの基本的事項 [level 400-500]
 – 第2部:処理系としての基本動作 [level 400]
 – 第3部:BCLや型システムの詳細解説 [level 300]
 – 第4部:処理系としての詳細解説 [level 400-500]
   • 新たにシリアル化の章が追加
 – 第5部:非同期・並列 [level 300-400]
   • 新規
第1部の読み方
• CLRの基礎
 – 第1章 CLRの実行モデル
 – 第2章 アプリケーションと型のビルド、パッケージ
   ング、配置、管理
 – 第3章 共有アセンブリと厳密名を持つアセンブリ
• 配置のときのリファレンスとして
第2部の読み方
• 型の設計
– 第4章 型の基礎       –   第8章 メソッド
– 第5章 プリミティブ型、   –   第9章 パラメーター
  参照型、値型         –   第10章 プロパティ
– 第6章 型とメンバーの    –   第11章 イベント
  基礎             –   第12章 ジェネリクス
– 第7章 定数とフィールド   –   第13章 インターフェイス

• 基礎力強化、ライブラリやフレームワーク作
  成のお供に
第3部の読み方
• 主要な型
 – 第14章 Char、String、テキスト操作
 – 第15章 列挙型とビットフラグ
 – 第16章 配列
 – 第17章 デリゲート
 – 第18章 カスタム属性
 – 第19章 null許容の値型
• BCLの重要ポイントを押さえたいあなたに
第4部の読み方
• CLRの中核機能
 – 第20章 例外とステート管理
 – 第21章 自動的なメモリ管理
   (ガベージコレクション)
 – 第22章 CLRのホスティングと
   アプリケーションドメイン
 – 第23章 アセンブリのロードとリフレクション
 – 第24章 ランタイムシリアル化
• 一歩踏み込みたいあなたやアーキテクトの教
  養として
第5部の読み方
• スレッド処理
 – 第25章 スレッドの基礎
 – 第26章 計算量依存の非同期処理
 – 第27章 I/O依存の非同期処理
 – 第28章 プリミティブなスレッド同期コンストラクト
 – 第29章 ハイブリッドなスレッド同期コンストラクト
• 来たるべきC# 5やRxに備え非同期処理への
  備えをしたいあなたに
読み方の例のご提案
• 初級者
 – 14章、20章あたりをじっくり読んでみる。
• 中級者
 – 第3部→第2部で復習、第5部と第4部はさらっと
• 上級者
 – 第5部→第4部でさらなる高みを
• 猛者
 – 頭からシーケンシャルに
• 中の人
 – レビュとダメだし
特に気に入っている
   章は?
裏話何かある?
この話は基本非公開で
裏話とかその1
• 凶器である件
 – 『プログラミングASP.NET』よりは軽いですよ
 – Twitterでの「軽く凶器」発言に対し、編集部長が
   「軽くはないだろ」と言ったとか
 – 分冊化について
  • どこで分けるかを考えると難しい
 – 電子書籍化について
裏話とかその2
• マーケティング
 – 紙の書籍の場合、棚で「目立つ」かが重要→厚く
   なりがち
 – TechEdで見本を配ろうかという話もあったり
裏話とかその3
• レビュシート       • Wordファイル
 – 真っ赤になりました    – 真っ赤になりました
裏話とかその4
• 序文と訳者紹介は突貫工事
 – 序文はノリで訳しています
• なぜか序文を訳しているといろいろな人の顔
  が頭をよぎりました

• 訳していて楽しい章とつらい章がある
 – GCとか非同期とか楽しいですね
CLR2と4の
この本の立ち位置
CLR via C#
CLR via VB.NETじゃだめ?
後悔しているところ
 すでにわかっている誤訳など
Q&A
会場から何も出なかった時のお題

using System;
class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine(string.Empty);
    typeof(string).GetField("Empty").SetValue(null, "New Empty Value");
    Console.WriteLine(string.Empty);
  }
}
String.Empty祭り
何の話?
• String.Emptyって定数じゃないから
  FieldInfo.SetValueで書き換えらるよねという話

• ネタ元は Daily WTF らしい
 – JavaだとInteger.valueOf用のキャッシュ値書き換え
   ると楽しいよとか(publicじゃないけど)


• そもそもの問題はなにか
Initonlyフィールド
• C#でいうreadonlyフィールド
• IL/CLIの仕様としてはコンストラクター内での
  み値を設定可能
 – コンストラクター外で値を変えようとすると例外
   (VerificationExceptionあたり)
• 実はリフレクションで値を変えられる
リフレクションで値を変えられるわけ
• 逆シリアル化の実装のため
 – 実際、
   SecurityPermission(SerializationFormatter=true)の
   コードアクセスセキュリティが必要
でも
• StaticなInitonlyフィールドを書き換える必要は
  ないよね?
ところで
• String.Empty以外にやばいのある?
たくさんある
• DBNull.Value,
• Decimal/DateTime/DateTimeOffset.MaxValue
  /MinValue
• IntPtr/UIntPtr.Zero
• Type.Missing, Type.Delimiter, etc..
• Path.DirectorySeparatorChar, etc.
• System.Reflection.Emit.OpCodes
予想される動き
• LINQや正規表現あたりで
  InvalidProgramExceptionになる(Emitが壊れ
  るから)
• AccessViolationException多発(IntPtr.Zeroが
  変な値になるから)
• ファイルI/O周り全滅(Pathの値がおかしいか
  ら)
OpCodesを変えてみよう
• ldc_*をいじるとか(定数が変わるよ)
• bceとbgtの値を逆にするとか(if文が逆になる
  よ)
• rethrowを全部throwにするとか(スタックト
  レース途切れるよ)
• callvirtとcall入れ替えるとか(さよならポリモー
  フィズム)
ワークアラウンド
• 丸投げディスカッション

プログラミングNet framework3のお題