NullPointerExceptionがスローされないstaticフィールドアクセス
こんなコードがあった時に、
コメントにある通りNullPointerExceptionがスローされずにhogeが表示されます。
普段メソッド呼び出ししてフィールドにアクセスする書き方しないので割りと衝撃的でした。
この動作はJava言語仕様に同じ例があります。
http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#d5e24400
Even though the result of favorite() is null, a NullPointerException is not thrown. That "Mount " is printed demonstrates that the Primary expression is indeed fully evaluated at run time, despite the fact that only its type, not its value, is used to determine which field to access (because the field mountain is static).
だそうです(適当
JavassistでHappy New Year!
あけましておめでとうございます。
今年は自作言語を頑張ろうかと思います。
Javassistを使えば簡単にバイトコードが生成出来るよ! みたいな記事です。
今回はMavenを使います。
まずMavenのpom.xmlのdependencies
に以下の記述を追加します。
(Mavenを使わない場合はGitHubのreleasesからJarをダウンロードできます。)
... <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.2-GA</version> </dependency> ...
追加したら、次のような感じのコードを書きます。
このJavaコードを実行するとHappyNewYear.class
ファイルが生成されます。
あとはjava HappyNewYear
するだけです。
無事新年を迎えることが出来ました!
今年もよろしくお願いします!
gitignoreを生成するgiboとgiを比較
はじめに
やみつきーさんのブログ
.gitignore作るなら、giboを使おう - 病みつきエンジニアブログ
を見て、初めてgibo
の存在を知りました。
gitignore.io - Create useful .gitignore files for your project
普段自分はgitignore.ioのgi
を使っているのですが、
この2つがかなり似ているように感じたので比較してみました。
どちらもターミナルから操作可能です。
gibo
はやみつきーさんのブログにある通り、
brewがあればbrew install gibo
で使えるようになります。
gi
はhttp://www.gitignore.io/cliを参考にインストールすると使えるようになります。
オプションをコンマ区切りでとかスペース区切りでとかいうような
細かい違いはありますが、言語やフレームワークの名前を
入力するとそれらに合わせた.gitignoreファイルを
一発で生成することが出来る便利なコマンドです。
比較
gi list
とgibo -l
でそれぞれのコマンドで利用出来るものが
出てきますが、出力される項目を整理してdiffを取ると、
- appcode
- basercms
- bower
- codekit
- django
- dotsettings
- elasticbeanstalk
- elixir
- freepascal
- intellij
- jabref
- joe
- justcode
- komodoedit
- laravel
- latex
- openfoam
- ph7cms
- phpstorm
- puppet-librarian
- pycharm
- rubymine
- senchatouch
- silverstripe
- tarmainstallmate
- tower
- wakanda
- webstorm
- xamarinstudio
これらがgi
にのみ定義されています。結構多いですね。
でも、JetBrainsのIDE(AppCodeやIntelliJ,PHPStormなど)は、
gibo
ではgibo JetBrains
にまとまっているようです。
なので、純粋にgi
でしか利用出来ないものは少ないかと思います。
ちなみに、gi intellij
とgi appcode
で生成される.gitignoreは同じです。
また、gibo
のみ利用可能でgi
で使えないものはありませんでした。
生成される.gitignore
ほんの少しですが違いがありました。
gi
とgibo
が吐き出した.gitignoreの全diffをGistに上げておきます。
https://gist.github.com/nokok/10755225
diffは
diff -y --ignore-blank-lines --ignore-matching-lines="^\#"\
--suppress-common-lines gi_all gibo_all
で取りました。ゴミが残っています。ごめんなさい。
diffを見てみると、項目が少し追加されてたりディレクトリに/が付いてたりしているみたいです。
他はに長いので割愛します(おい
ネットワーク接続
あと、gi
とgibo
にはもう一つ大きな違いがあり、
gibo
は.gitignore生成にネットワークを必要としませんが、
gi
はネットワーク接続が必須のようです。
which gi
をすると
gi () {
curl http://www.gitignore.io/api/$@
}
が返ってきます。gi
は渡されたオプションをそっくりそのままサーバーのAPIに投げて、
その結果を表示しているようでした。
知らなかった...
つまり、
ネットワークに繋がっていない状態でgi
を使用すると,,,
エラーで使用できません
一方gibo
の方はと言うと、~/.gitignore-boilerplates
に
.gitignoreの元ファイルのようなものがあり、そこから生成しているようです。
なのでgibo
はgibo --upgrade
などでたまに更新してやる必要がありますが、
ネットワークアクセスが無いところでも使えます
更に、ネットワークアクセスを必要としない分軽快に動いてる感じがします。
まとめ
眠い
giboの方が良さそう