Subscribed unsubscribe Subscribe Subscribe

Kengo's blog

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

java

Creating tree walker for accessing parsed words

In the last article I generated a simple parser, but I cannot access parsed words. It means that I cannot know 'what is provided as S'. It's very big defect so I had to try to solve this problem. To access parsed words, dyn.js uses 'tree w…

How to generate simple parser with ANTLR3

I've found that dynjs depends on ANTLR3. I have to learn ANTLR3 to read dynjs, so I'm trying to use it with Maven3. pom.xml To use ANTLR3, we have to write 1 dependency and 1 plugin in pom.xml. Sample is here. <dependencies> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr-runtime</artifactid></dependency></dependencies>

Java SE Specifications for Java7

Today I found documents about Java SE Specifications for Java7. The Java™ Language Specification The Java™ Virtual Machine Specification I'm ashamed to say that I don't have read specs about dynamic invoke, try-with-resources and other fea…

My ideal Java coding rule checker

I think coding rule and code analysis is helpful solution for Java. They develop advantage of Java, solidness, and help to change your project easy to read. We can use checkstyle, PMD, findbugs and another solution. コーディングルールやコ…

Ruleset for SLF4J has been updated

Today I updated ruleset for SLF4J. There is no enhancement but many fixing. ruleset for SLF4Jを更新しました。バグ修正が主な変更となっています。 Comparing 3fefc4f29b...a9dd209 · eller86/ruleset-for-SLF4J · GitHub The biggest fix is avoiding…

How to use "Bootstrap, from twitter" in Maven site

Apache releases a skin for maven site which uses Bootstrap. So we can use bootstrap in our original project site easily. 各所で使われているBootstrapですが、ApacheがMavenサイト用のスキンをリリースしており簡単に使えます。これはとっつきやすい…

PMD ruleset for SLF4J

I wanted to use ruleset to validate my codes so I asked to ML of SLF4J, but there is no tool to help. So I've created a PMD ruleset for SLF4J. It may help to code with unified valid logging. コードを統一するためのルールセットがほしくてSLF4…

Deploying Maven's site to GitHub Pages

Are you using Maven's site feature? How about GitHub Pages? If you're using both of them, GitHub's site-maven-plugin helps you to host your site on Pages. MavenのsiteとGitHub Pagesを使っている方に朗報です。GitHub社がsiteをPagesにデプロイす…

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 =…

ほんとに怖いfinalize

import java.util.concurrent.TimeUnit; public class Laputa { public static void main(String[] args) { new Laputa(); while (true) { try { System.gc(); System.runFinalization(); TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException …

ASMで実行時にメソッド定義を書き換える

今さらながらJavaクラスに対する動的なweavingを試してみました。DIコンテナやフレームワークに任せることが一般的になった領域であり技術が直接役に立つことはないでしょうが、JVMやクラスファイルに対する理解を深めるきっかけにもなると考えたためです。 …

Googleカレンダーで給料日を調べる

自作TwitterBotに給料日判定ロジックを組み込むべく、GoogleカレンダーのAPIを利用するコードを書きました。APIのご利用は利用規約に従って計画的に。 1.jarを入手する gdata-java-clientから最新のjarを入手。ビルドパスに追加。 2.ユーティリティを書く 簡…

GoogleのJava基礎ライブラリguava librariesというものがあるらしい

Google Collections Libraryを使おうと思ってGoogle Codeにアクセスしたら、開発が継続されていないことに気づきました。どうやらGuavaというプロダクトにマージされたようです。 This project has evolved into Guava! http://code.google.com/p/google-col…

Twitter4Jで非推奨メソッドを使わずにOAuthログイン

今月からBasic認証が廃止されたことを受け、Twitter4Jで作ったツールをOAuth利用版に書き換えていらっしゃる方も多いのではないでしょうか。 公式サイトにもコード例が載っていますが、残念ながら非推奨メソッドTwitter.setOAuthAccessToken(AccessToken)を…

とりあえず知っておきたいMapの鉄則と周辺知識

わりと多種類で使い方に迷うJavaの連想配列(Map)について、各実装の紹介と周辺知識をまとめました。Javaに触れる際の参考になれば。 鉄則その1「とりあえずHashMap」 Mapインタフェースの実装はたくさんありますが、まずはHashMapから使うことを勧めます。…

Javaプログラムをプロファイルするためのチートシートを作成しました

jps, jstack, jmap, jstackといったJDK6に付属するツール群の使い方をA4用紙1枚にまとめたものです。 Java Profiling Cheat Sheet スレッドダンプとヒープダンプだけでも使えるようになると、Javaプログラムの理解と問題判別にずいぶん役に立つと思います。…

DeflaterOutputStreamの内部実装とBufferedOutputStreamと組み合わせる際の注意点

前回の実験で、DeflaterOutputStreamとBufferedOutputStreamの組み合わせ方によってパフォーマンスが大きく異なることがわかりました。今回はこの遅延の原因がDeflaterOutputStreamの実装に起因することを確認し、なぜBufferedOutputStreamでデコレートすべ…

出力を高速化するBufferedOutputStreamとDeflaterOutputStream

Javaで入出力のコードを書く場合、必ずと行ってもいいほどBufferedOutputStream, BufferedInputStream, BufferedWriter, BufferedReaderのいずれかを使うのではないでしょうか。これらはJavaヒープ上にデータを蓄積*1し、I/Oの回数を削減する機能を担うもの…

LinkedHashMapを応用した、意外と便利なLRUCacheの実装

※この記事の内容は古いです。実用されるならこちらの記事も参照ください。 アプリケーションのパフォーマンス向上にキャッシュが有効なケースがあります。 memcachedをはじめとした分散型キャッシュのAPIやJava標準(候補)のJCacheを利用しても良いのですが…

TLを読み込んでRTの件数を数える

twitter4jを使ってTLを読み込み、RT(もしくはQT)の件数を数えるプログラム。TLに表れるPOSTがRTまたはQTである確率分布を求めるために作成しました。 twitter4jのStatusクラスにもisRetweetメソッドが用意されていますが、判定条件がわからないことと明ら…

非staticな内部クラスが持つ暗黙的な参照

Effective Java 第2版 (The Java Series)の項目22で言及されているように、原則として内部クラスはstaticにすることが推奨されます。主な理由は、staticでない内部クラスが暗黙的にエンクロージングクラス(トップレベルクラス)のインスタンスを参照するた…