Kengo's blog

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

プログラミング

JVM用アセンブラJasminを触る

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

プチコン用ミュージックプレイヤー

'MUSIC PLAYER CLS:CLEAR:SPCLR M=0:P=-1:MMAX=29 BGMSTOP GOSUB @DRAW @MAIN GOSUB @CHK VSYNC 8 GOTO @MAIN @CHK B=BUTTON() IF B AND 1 THEN M=M+1 IF B AND 2 THEN M=M-1 IF B AND 4 THEN M=RND(MMAX+1) IF M<0 THEN M=MMAX IF MMAX

プチコンでかんたんプログラミング

今朝9時にダウンロード解禁となったプチコンを買いました。私は25歳ですし(元)マイコン族ではないのですが、BASICからプログラムを始めたようなものなので懐かしさを感じます。とりあえずFizzBuzzと跳ねるボールを組んでみたのでコードを晒しておきます。 …

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でHTTPSの利用を強制するときの注意点とTips

Google App EngineではHTTPSを使うことができます。また、web.xmlにsecurity-constraintを記述することによって、HTTPSの利用を強制することもできます。 設定方法については公式サイトに載っているのですが、HTTPSの強制をCronやTask Queueと併用する場合に…

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

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

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

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

test for embedding gist

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やクラスファイルに対する理解を深めるきっかけにもなると考えたためです。 …

2010年10月のJavascript作品まとめ

今月jsdo.itに投稿した作品です。 orgel フロッキング2 遺伝的アルゴリズム フロッキングと遺伝的アルゴリズムはこちらの本を参考にしたものです。AIはゲーム作成における難関のひとつだと思いますが、その手本を得ることができました。ゲーム作成に関心のあ…

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

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

Javascriptによるゲーム制作体験まとめ

ここ数日の有給休暇を使いJavascriptタワーディフェンスゲームを制作したので、その感想など。Javascriptはページに動作を付与する程度の使い方しかしてこなかったので、とても新鮮な体験となりました。 「Javascriptでゲーム」は現実的 作るだけなら他の言…

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

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

Javascriptによるゲーム開発中

最近jsdo.itでHTML5を使ったゲームを開発しています。具体的には、canvas要素による描画を主軸に据えたタワーディフェンスゲームです。 TowerDefence 5th - jsdo.it - Share JavaScript, HTML5 and CSS HTML5によってWindowsでもMacでも初代iPod touchでも動…

とりあえず知っておきたい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を利用しても良いのですが…

「並行コンピューティング技法」より並列クイックソートを実装してみた

ここ数カ月、並行処理およびその実装方法について地道に調べていました。具体的な内容としては、java.util.concurrentパッケージの使い方やデザインパターンの理解、サンプルプログラムの作成と性能テストです。 こうした自主学習の総まとめ*1として、オライ…

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

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

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

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

Listを直接変更してもIteratorがConcurrentModificationExceptionをスローしない件

容量拡張コストの低いArrayListの実装中に見つけた、AbstractListが持つ既知の不具合についてまとめておきます。 不具合概要 ArrayListなどの同期化されないListの実装に対してIterator利用中に要素を変更すると、ConcurrentModificationExceptionをスローす…

Twitterユーザの特徴を掴めるかもしれないブックマークレット

私はTwitterで新しく見かけたユーザをフォローするかどうかを考えるとき、過去の発言をある程度読んで傾向を見るようにしています。ただTLの流速が早かったりReplyが飛び交っていたりして傾向が掴みにくい(たくさん読まなければならない)ことも多かったた…