プログラミングnet framework3のお題
DESCRIPTION
Disscation at CLR via C#.TRANSCRIPT
プログラミング.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章 型の基礎 – 第5章 プリミティブ型、 参照型、値型
– 第6章 型とメンバーの 基礎
– 第7章 定数とフィールド
– 第8章 メソッド – 第9章 パラメーター – 第10章 プロパティ – 第11章 イベント – 第12章 ジェネリクス – 第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入れ替えるとか(さよならポリモーフィズム)
ワークアラウンド
• 丸投げディスカッション