「Effective Java」(第2版)を読んだ
Effective Java (2nd Edition): A Programming Language Guide (Java Series)
- 作者: Joshua Bloch
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2008/05/08
- メディア: Kindle版
- この商品を含むブログを見る
本自体はとても良かった。Javaを書くにあたって絶対に読むべき本だと思う。
既に多少Javaを書いた事がある場合にはEffective Javaから読み始めるので十分だと感じた。
Java自体についてはいろいろと言いたいことはあるが、自分と同い年の言語であることを考えれば仕方ないと思う面もある。それでも5以降は…
【翻訳】みんなGCについて誤解している(Old New Thing)
翻訳対決です。質問ではない。
【翻訳】ガーベージコレクションについてよくある誤解 - みっどメモ
Everybody thinks about garbage collection the wrong way - The Old New Thing - Site Home - MSDN Blogs
CLRウィーク2010にようこそ。今年度のCLRウィークは例年よりも哲学的です。
もしGCとは何か、誰かに聞いたとしたら、きっと「GCは実行環境が不要になったメモリを回収する仕組みのことであり、メモリを根から辿り、到達可能なオブジェクトを識別することで実現される…」といった答えが返ってくるだろう。
しかしこれは手段と目的を混同している。これはあたかも消防士を「赤いトラックを運転してお水を撒くお仕事」だと言うようなものだ。消防士が何をするかの説明にはなっているかもしれないが、これでは仕事の要点を見失っている(火を消す、消防活動)。
GCとは「無限のメモリを持つコンピュータのシミュレーションをすること」である。それ以外の説明は手段にすぎない。そして一般にその手段として「消えてもプログラムに影響しないメモリを回収する方法」が用いられる。
GCの真の定義から、以下の結論が直ちに導ける:
「プログラムが実行時に使えるRAMの量が、必要とするメモリより大きければ、何もしないGCも正しいGCである。」
この仮定のもとでは、メモリマネージャはいつでもプログラムが必要とするメモリを確保でき、失敗しない。プログラムが必要とするメモリより多くのRAMを搭載したコンピュータは、実質的に無限のRAMを持っているのと同じことであり、シミュレーションは必要ない。
この定理は自明かもしれないが実用的だ。なぜなら、何もしないGCの振る舞いは簡単に解析することができ、普段慣れ親しんでいるGCとは極めて異なった振る舞いをするからだ。たとえば、何もしないGCから以下のような結論を導き出せる:
「正しく書かれたプログラムは、ファイナライザが実行されることを仮定しない」
証明は単純だ。プログラムが必要とするメモリより多くのRAMを搭載したコンピュータで、プログラムを走らせる。このとき、何もしないGCは正しいGCだ。よって、何もしないGCは何も回収しないので、ファイナライザは一度も走らない。
GCは無限のメモリをシミュレーションする。しかし、無限のメモリをもってしてもできないことがある。他のプログラム(そしてそのプログラム自身)に見える影響を与える事柄である。例えば、ファイルを排他モードで開いたら、閉じられるまで、そのファイルは他のプログラムからはアクセスできなくなる(場合によってはそのプログラムの他の部分からも)。SQLサーバーにコネクションを張ったら、閉じるまでそのサーバーのリソースを浪費することになる。もしコネクションの数が巨大なら、コネクション数の上限に達して、それ以上接続できなくなるかもしれない。もしリソースを明示的に解放せず、プログラムが「無限メモリのマシン」上で走っていたら、リソースは溜め込まれるばかりで二度と解放されないことになる。
つまり何が言いたいかというと: ファイナライザに頼ったプログラムを書くな。ファイナライザはセーフティーネットであって、リソース回収のための手段ではない。もしリソースを使い終わったら、そのオブジェクトのCloseやDisconnectのようなクリーンアップメソッドを呼び出して解放する必要がある(IDisposableはこの規約を明示的に示すインターフェイスだ)。
さらに、正しく書かれたプログラムは、実行時にファイナライザが走ることを仮定できないだけでなく、終了時にファイナライザが走ることも仮定できない。.NET Frameworkはファイナライザを全て実行しようと試みる。しかし、不良ファイナライザがある場合、.NET Frameworkはファイナライザの実行を諦め、無視することがある。そしてこれは貴方に一切落ち度がなくても起こりうる。例えば、ファイナライザでネットワークリソースのハンドルを解放しようとして、回線の問題で2秒以上かかったら、.NET Frameworkはプロセスを止めてしまう。よって以上より、.NET Frameworkのある場合について
「正しく書かれたプログラムは、ファイナライザが実行されることを仮定しない」
は特に当てはまることがわかる。
以上の知識から、あなたなら顧客の以下の問題を解けるだろう(用語の混乱は原文通り)。
「私の手元にXmlDocumentを使うクラスがあります。このクラスがスコープを抜けた後、私はファイルを削除したいのですが、『System.IO.Exception: The process cannot access the file 'C:\path\to\file.xml' because it is being used by another process』と怒られてしまいます。プログラムが終了すると、ロックは消えてしまうみたいです。ファイルのロックを回避したいのですがどうすればよいでしょうか?」
このメールの追伸は役に立つだろうか?
「同僚はXmlDocumentを使い終わったらnullをセットすればいいと言ってきましたが、スコープを抜けた時も同じように動くべきじゃないんですか?」
おまけ: ファイナライザは奇妙だ。なぜなら、「GCの裏側」で動くからだ。WeakReference GCHandleやSystem.GC自身など、「GCレベル」で動くクラスもたくさんある。これらのクラスを正しく使うにはこれらがGCとどう関わっているかを理解している必要がある。これらについてはそのうち解説する。
「Java: A Beginner's Guide」(第6版) を読んだ
Java: A Beginner's Guide, Sixth Edition: A Beginner's Guide
- 作者: Herbert Schildt
- 出版社/メーカー: McGraw-Hill Osborne Media
- 発売日: 2014/05/06
- メディア: Kindle版
- この商品を含むブログを見る
Oracleの本だし嘘は書いていないだろうと思い選んだ。
日本語で紹介している人がほとんどおらず、米Amazonのレビューがやけに高く、目立った低評価レビューも的外れだと感じたので、しっかりとおすすめできないという事を書いておきたい。
米Amazonのレビューは高すぎると思う。広く網羅しているテキストなどという評価があるが、網羅性は低く、ArrayListなどのコレクションクラスは一切登場しない。C++の教科書でstd::vectorに触れないで終わる本などおそらく無いだろう。不必要に分厚く得られる情報が極めて少ない本だった。新たに得られた情報がラベル付きbreakとpackageまわりと::の存在ぐらいしかない。
あとGoでbad partsとして採用されなかった類の言語機能がThesaurusで引いたような形容詞でfascinatingとかinnovativeとかいって紹介されてるの読む度につらくなる
— ぺりゃうど (@peryaudo) April 14, 2015
さらに米Amazonのレビューで的外れだと思ったのは低評価のレビュー群である。初心者向けの本であるのに序盤から高度なプログラムを用いているとの評価が多く、プログラミング経験者向けのテキストとしては適切なのかと思い読むことを選んだ面があるが、実態としては非常に冗長な内容であった。だが逆にこれをプログラミング未経験者にはじめて読ませる本とした場合にはたしかに困難であるように思え、帯には短く襷には長い構成だと感じる。
カバーしている内容についても違和感を覚える。15-17章(Applet, Swing, JavaFX)は読んでいない。今時Java AppletやSwingアプリケーションやJavaFXアプリケーションが書きたくてJavaを勉強しはじめる人など一体何人居るのだろう。そもそも入門書の発展編の章なのだから軽く触れることしかできないだろうが、だとしても発展編のチョイスとして不適切であり、少なくともこれら1つ以上の代わりにServletかAndroidアプリケーションに触れるべきだと思う。
「最新コンパイラ構成技法」を読んだ
- 作者: Andrew W. Appel,神林靖,滝本宗宏
- 出版社/メーカー: 翔泳社
- 発売日: 2009/10/30
- メディア: 大型本
- 購入: 6人 クリック: 165回
- この商品を含むブログ (26件) を見る
Peryanとか書いてたのに読んだことなかったので読んだ。
簡潔ながら、それなりに広い範囲の内容を網羅しており良いと思う。本書の解説のみで詳細な実装を行うことが困難な場合でも、他の参考文献が充実しているので困らなさそうだ。
ただ、和訳本は誤植がとても多く(それも内容を理解せず目を通しても発見できそうな誤植が)、読む意欲を削がれる感があった。誰か出版前に目を通してくれる院生とかいなかったのだろうか…
「Physically Based Rendering (PBRT)」を読んだ
Physically Based Rendering, Second Edition: From Theory To Implementation
- 作者: Matt Pharr,Greg Humphreys
- 出版社/メーカー: Morgan Kaufmann
- 発売日: 2010/07/12
- メディア: ハードカバー
- 購入: 4人 クリック: 8回
- この商品を含むブログ (3件) を見る
1年間ぐらい読む読む詐欺をしていたような気がするんですけど読みました.
「わかりやすいパターン認識」を読んだ
- 作者: 石井健一郎,前田英作,上田修功,村瀬洋
- 出版社/メーカー: オーム社
- 発売日: 1998/08
- メディア: 単行本
- 購入: 19人 クリック: 110回
- この商品を含むブログ (40件) を見る
結構読み飛ばしてるので「大体」かもしれない.
foo.
Windows Internals(インサイドWindows)読んだ
- 作者: Mark E. Russinovich,David A. Solomon,Alex Ionescu
- 出版社/メーカー: 日経BP社
- 発売日: 2014/06/11
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
- 作者: Mark E. Russinovich,David A. Solomon,Alex Ionescu
- 出版社/メーカー: 日経BP社
- 発売日: 2014/06/10
- メディア: Kindle版
- この商品を含むブログを見る
今みたらKindle版が存在しててがくっときた.
ずっと持ち歩いてたので重かったです(小並感).
MINIX本を読んだ後に読むとたのしいです.