Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

java

Goodbye, checkNotNull

Precondition checking like null-checking is very important element for program, but sometimes it becomes boring because it's a defensive technique and far apart from our purpose -- hacking. nullチェックのような前提条件確認はプログラムにお…

jitescript reading

Reading OSS gives you new experience and discovery. It is just like exploring a library you don't know well. I explored the jitescript today, so I note how to explore and my impressions about them. OSSを読むということは新たな経験と発見を見…

How JVM handles `byte` values -- a difference between JLS and JVMS

Java has a primitive type called `byte`, but the JVM doesn't have opcodes to calculate them. JVM handles them as `int`. It's the reason why we cannot code like: Javaにはbyteというプリミティブ型がありますが、JVMにはbyteを演算するためのオペ…

released Brainf*ck implementation on Java7

I've released Brainjack at GutHub. It's a Java7 implementation of the Brainf*ck programming language. Brainf*ckのJava7実装をGitHubで公開しました。以前の記事で触れた、バイトコードを吐くコンパイラが含まれています。 eller86/Brainjack - GitHub…

JVM用KEMURIインタプリタとコンパイラを実装

最近JavaScriptばかり書いていたためか無性にJVMと戯れたくなったので、KEMURIの実行環境を作成しました。 eller86/JKEMURI · GitHub 単なるインタプリタとJavaのclassファイルを生成するコンパイラがあります。インタプリタは以前実装したことがあるのです…

Guavaをどっぷり紹介(I/O編)

イヤホンを新調したら雨夢楼と光のストライドがきれいに聴こえて嬉しいeller86です。洗濯機でイヤホンを洗濯してしまったときは絶望の淵に立たされていた気がしますが、あの絶望がこの喜びにつながるとは一体誰が想像したでしょうか。 さて前回のGuava紹介記…

Jenkinsプラグイン実装初心者が参考にしたリンク集

未だにJenkins実践入門を読めていないeller86です。入手は来月半ばになるでしょうか。Jenkinsの基本的な使い方は知っているつもりですが、プラグインの実装方法などちょっと突っ込んだ内容も載っているようなので楽しみです。 さてここ2日間ほどJenkinsプラ…

Coberturaの「次」は、いつ生まれるのか

上海の飲食店でJenkinsではじめるビルド職人入門をざっくり流し読みしたeller86です。最新の技術書がこうして海外で快適に読めるとは素晴らしい時代ですね。著者ならびにGDP関係各位に感謝です。 で、この電子書籍でコードのカバレッジ測定にCoberturaを使っ…

Guavaをざっくり紹介

Guava librariesをご存知でしょうか?Googleが開発・使用しているコアライブラリです。OSSであり簡単に入手できます。 http://code.google.com/p/guava-libraries/ このライブラリは結構多機能で、海外の著名プロダクトでもよく見かけるのですが、日本のネッ…

patch-erの心構え?

args4jにpatchを送りました。まさか著名なライブラリのバグ容疑者を発見するとは思わず。「Argumentアノテーションを使い」「不正な値を渡す」という2因子の現象ですね。 https://github.com/kohsuke/args4j/pull/4 23時頃に意図しない動作に気づき、そのま…

世界中のユーザーに自分のカジュアルゲームを楽しんでもらうためのjust idea

回線の遅さについて考えていたらenchant.jsの機能追加を思いついたのでpull requestを送ろうとしたのですが、現状を鑑みるに優先度が上がらない(他に書くべきコードがある)のでアイデアだけここに残しておきます。ゲーム開発者の参考になれば。 問題提起:…

ASM利用例を更新

ASM3.3利用例 短編集を更新しました。動的にクラスを定義したことはあまり無かったのですが、そこそこ楽に書けますね。バイト列からClassインスタンスを作る方法もわりと忘れがちなので、それも書いておきました。

guava librariesに追加されたEventBusについて

今までguavaのr09を使っていたのですが、先月末にRelease10.0が出ていたようなので早速使ってみました。 新機能として目立つのはCacheとEventBus。Cacheはなんとなく使い道が分かりそうなのでEventBusについて調べたところ、シンプルで使いやすそうなイベン…

mockitoコードリーディング備忘録

オフラインになっていた間、mockitoのコードを読んでいました。自分用ですが、感想を簡単にまとめておきます。 全体的にとても読みやすい。 クラス名・変数名・メソッド名の命名が適切なのだろうが、それ以上にクラス分割の単位が適切であるように思う。 ど…

ASM4の新機能一覧 日本語訳(〜RC2)

私が好きなバイトコード操作ライブラリであるASMが、Java7対応の新バージョンを開発しています。まだ情報が少ないのですが、MLの投稿をもとに新機能をまとめてみました。今後実際に使って気づいたことがあれば追記します。 ASM 4 RC1 released ! ASM 4.0 RC2…

Javaの7大禁じ手

.bbpBox104197592832937984 {background:url(http://a0.twimg.com/images/themes/theme1/bg.png) #C0DEED;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-hei…

「From Lambdas to Bytecode」を読んでinvokedynamicの使い方を学んだ

@skrb氏のツイートで知った2011 JVM Language Summitのプレゼン資料のひとつ、From Lambdas to Bytecodeを読みました。ラムダ式をどうバイトコードに変換するか、そこでInvokedynamic(indy)がどう効いてくるかという話です。 .bbpBox95715831945773056 {ba…

Mavenプラグインで外部ライブラリをrepackageする方法

自作ライブラリを配布するときに、ライブラリが依存する外部ライブラリを同梱したい場合があります。しかしフツーに同梱・配布してしまうと、ライブラリを利用するプログラムの依存関係と衝突してしまってトラブルになりかねません。バージョンの違うロギン…

最近のアウトプット

ここ数週間で作ったものについてまとめておきます。 Javaのコンストラクタに関する知識と私見 GWの時間をつぎ込んで書いたのがこれです。Javaのコンストラクタはきれいにコーディングする上でもJVMの動作を理解する上でも重要なファクターであると感じており…

appengine-mapreduceをプログラムから実行する

以前使ったappengine-mapreduceをプログラム内から実行する方法をまとめています。revision 150を対象としていますので、お使いのrevisionが新しすぎて使えない場合は公式資料を参照願います。 設定を作成する まずは処理を実行するための設定を行います。こ…

Java仮想マシンの教育用シミュレータを実装しました

JVM内部の挙動、特にframeやoperand stackやconstant poolについて人に伝えるためのツールが欲しいと考えていました。高速で省メモリなコードを書いたりマルチスレッドプログラミングしたりするには(Javaヒープの使い方と並んで)役立つ知識ですし、Scalaな…

JVM用アセンブラJasminを触る

自分はJVMの仕様について比較的知っている方らしいということに最近気づき、バイトコードについて人に説明するためのツールとしてJVM用アセンブラJasminの利用を検討。 バイトコードの理解があれば困らずに利用できるツールだと思うが、説明に使うには若干不…

appengine-mapreduceにpatchを2つ送った話

前々回のエントリで触れたappengine-mapreduceについて2つほどpatchを送っていましたが、どちらも採用の方向でご検討いただけたようです。 Issue 86 - appengine-mapreduce - Writer#write(JSONObject.toString) is slower than JSONObject#write(Writer) - …

AppEngine-MapReduceをGAE/Jで使ってみた

*1 ということで@twistoireの管理用にAppEngine-MapReduceのrevision150を使ってみた。 用意されている公式ドキュメント読めばわりと問題なく使えるが、まだまだ洗練されてはいないので細かいところで苦労する感じ。以下に使うまでの流れをまとめる。 jarを…

bulk loaderによるダウンロード速度はデータ数依存?(追記あり)

メモ。新しいKindをバックアップ対象に加えたところ、従来バックアップしていたKindに比べて格段に時間がかかった。新しくバックアップしたKindは総データ量は小さいのだが、件数が格段に多い。Google App Engineのbulk loaderは、データ量よりもデータ数に…

ASM3.3利用例 短編集

ASMを使ったコーディングをしていると、日本語情報の少なさに気づきます。断片的ですが自分が検索した事柄について列挙しておきます。 また公式のサンプルコードがow2のダウンロードページにzipで置いてありますので、こちらを参照すると良いでしょう。 Tips…

Javaプログラマが読むべき7個のAPI実装

10周くらい遅れている感がありますが気にせず紹介します。なお実装はJDKによって異なる可能性があるので、お手元のJDKに付属しているコードをご覧になることをおすすめします。 java.util.concurrent.atomic.AtomicInteger ロックフリーでスレッドセーフな実…

GAE/Jデプロイ環境のDatastoreからデータをローカルにバックアップする

今ベータテストしているtwitter bot(というかウェブサービス?)にひと通り機能がついたので、いよいよ“ベータ”を取り外そうかという段階に来ています。 ただ正式公開となると怖いのが、セキュリティとデータロス。セキュリティはHTTPSの導入とSecretToken…

newするとJVM内で何が起こるのかという話(後編)

前編ではnewしたときのバイトコードについて追いましたので、後編ではバイトコード実行による現象=メモリの使い方やデータ構造について追っていきたいと思います。 なお私はSunやIBMのJVMしか扱ったことがないので、他の実装には当てはまらない内容が含まれ…

newするとJVM内で何が起こるのかという話(前編)

私的まとめ。2段階に分かれており、今回はその初回。 JVM内の挙動を知るにはJVMに渡されるバイトコードを知ることからと考え、これについてまとめる。 バイトコードの確認 例えば public class Test { public static void main(String[] args) { Test test =…