nFact

n!

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.xmldependenciesに以下の記述を追加します。
(Mavenを使わない場合はGitHubのreleasesからJarをダウンロードできます。)

...
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.18.2-GA</version>
</dependency>
...

追加したら、次のような感じのコードを書きます。

CreateHappyNewYear.java

この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で使えるようになります。

gihttp://www.gitignore.io/cliを参考にインストールすると使えるようになります。

オプションをコンマ区切りでとかスペース区切りでとかいうような
細かい違いはありますが、言語やフレームワークの名前を
入力するとそれらに合わせた.gitignoreファイルを
一発で生成することが出来る便利なコマンド
です。

比較

gi listgibo -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 intellijgi appcodeで生成される.gitignoreは同じです。

また、giboのみ利用可能でgiで使えないものはありませんでした。

生成される.gitignore

ほんの少しですが違いがありました

gigiboが吐き出した.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を見てみると、項目が少し追加されてたりディレクトリに/が付いてたりしているみたいです。
他はに長いので割愛します(おい

ネットワーク接続

あと、gigiboにはもう一つ大きな違いがあり、

giboは.gitignore生成にネットワークを必要としませんが、
giネットワーク接続が必須のようです。

which giをすると

gi () {
    curl http://www.gitignore.io/api/$@
}

が返ってきます。giは渡されたオプションをそっくりそのままサーバーのAPIに投げて、
その結果を表示しているようでした。

知らなかった...

つまり、

ネットワークに繋がっていない状態でgiを使用すると,,,

f:id:noko_k:20140416020208p:plain

エラーで使用できません

一方giboの方はと言うと、~/.gitignore-boilerplates
.gitignoreの元ファイルのようなものがあり、そこから生成しているようです。

なのでgibogibo --upgradeなどでたまに更新してやる必要がありますが、
ネットワークアクセスが無いところでも使えます
更に、ネットワークアクセスを必要としない分軽快に動いてる感じがします。

まとめ

眠い
giboの方が良さそう