Subscribed unsubscribe Subscribe Subscribe

Kengo's blog

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

マージソート性能調査

昨日書いたマージソートはlengthを使うから遅くなるのではないかという漠然とした不安を持っていました。そこでlengthの使用頻度を抑えた関数を実装した上で、パフォーマンスをより細かく調べていくことにします。 lengthを使わないMergeSort リストの長さも…

最近はHaskellをよく書いています

TopCoder部でHaskellのコードを書き溜めているのですが、たまにはこちらのブログにも載せておきます。 MergeSort 毎回lengthが走るのは性能上悪影響を及ぼしそうな感じ。Java同様Haskellの処理系においても性能面を語れるようになれるといい。 参考にしてい…

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

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

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

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

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が飛び交っていたりして傾向が掴みにくい(たくさん読まなければならない)ことも多かったた…

同期化のパフォーマンス計測

シルバーウィークのまとまった時間を利用して、同期化のパフォーマンスについて調査。どのように遅いのか・なぜ遅いのかを追いましたが、詳細な内部実装はJVM仮想マシン仕様書にも記載されておらず「なぜ」まではわかりませんでした。 中途半端な内容になり…

Seasarカンファレンス私的メモ

昨日Seasar Conference 2009 Autumnへお邪魔しました。私はSaesarに明るくないので聞いてばかりでしたが、実際のケースに照らし合わせた具体的な質問をしていらっしゃる方も多く積極的な交流の場となっている印象も受けました。 とりあえず感じたことや考え…

DOSバッチとRで拡張子ごとにファイルサイズを集計する

Rのキャッチアップ第2弾。指定したディレクトリ以下に保存されているすべてのファイルに対してファイルサイズを調べ、拡張子ごとに合計を取得してグラフ化します。私の環境では以下のような結果となりました。以前ダウンロードしたXenServerのISOとEclipseプ…

Twitter4JとRで最近Tweetしたユーザーを調べる

Rのキャッチアップのために「直近の100Tweetsを投稿したユーザーを調べる」プログラムを作成しました。最初は「自身の投稿を曜日を横軸・時間を縦軸にプロットする」プログラムを組もうと思ったのですが、Twitter APIを利用するためのJavaライブラリ(Twitte…

Java6のFileInputStream#close()はいつIOExceptionを投げる?

Javaにおける例外の扱い方*1に関して考える上で必要になったため調べたものの、さほど有用な情報は得られませんでした。JDK6のソースコードも読みましたが結局はnativeメソッドに行き着くのであまり効果なし、残念です。現時点では以下の状況下で発生すると…

TopCoderの記録をつけ始めました

できれば1日1回を目標に、TopCoder(SRM)の過去問に挑戦したいと考えています。 今回は控えるのを忘れてしまいましたが、次回以降はスコアも併記するようにします。 TopCoder戦記 - TopCoder部

プロになって1年間で変わった3つの意識

プロの研究開発者になって丸1年で何が変わったのだろうと振り返ってみました。 1年前に比べると技術理解や知識量も変化・向上しているのですが、やはり最も変わったのは開発に対する意識であると思います。中でも大きかった3つの意識をピックアップしてここ…

Pythonキャッチアップ記録

GW中はひたすらPython(CPython)のキャッチアップをしていました。 有名企業で利用されているだけのことはあり、高い生産性と自由度を兼ね備えた軽量言語であることを実感できました。実行速度が充分高速ならば業務でも利用してみたいと思わせる言語です。 私…

FileDocumentProvider継承時の注意

前回発生した「メニューバーからファイルを開くとエラーになる」の原因を調べていました。結論としては、FileDocumentProviderを継承しただけではワークスペース外のファイルを扱えないようです。 DocumentProvider#createDocumentの実装がポイント 今回の実…

HSP編集用Eclipseプラグイン試作

Eclipseプラグイン学習の一環として、HSPスクリプトを色分けするプラグインを作成しました。コメントと文字列を色分けするだけですが、スキャナやトークンなどエディタ用プラグインを作成ための基礎知識を身につけられたと思います。ほぼサンプルコードと変…

DBMSの仕組みを知る

私がSQLiteを使うようになってからそろそろ2年が経つでしょうか。MySQLやOracleなど他のDBMSも経験し、DBMSの概要やSQLの書き方、JDBCの使い方などについては座学・実践共にそこそこ蓄積ができてきたと感じています。 しかしDBMS自体の理解は乏しく、ブラッ…

S2Daoを試す

とりあえずDBに登録されているすべてのフォントを取得して表示するプログラムを作成。jdbcドライバを直接使わないこととSQLを書かないことで、かなり効率よくプログラムを記述できることを実感しました。POJOだけを使用しているため、ウェブページを実装せず…

CodeReposのコミッタにしていただきました

今後雑多なスクリプトや公開予定サービスのコードなどをCodeReposを利用して公開してことを考えています。 手違いなどが無いように努めますので、どうぞよろしくお願いいたします。

キャメルケース表記を正規表現でアンダースコア区切り表記に変換

Javaでキャメルケース表記をスネークケース(アンダースコア区切り)表記に変換するには、そしてその逆に変換するにはどうすればいいか?という話。 RoRのcamelizeやunderscoreに近いのでinflector.rbを移植するのが間違いなく速く正確だろうと思いつつも、…

テキスト変換Webサービス概要

先週作成したテキスト変換ツールについて、その概要を簡単にまとめておきます。 このツールの目的は「かなフォントの入力を支援する」ことにあります。似ている既存ツールとしてはMac向けに「カナブン」というツールがあるようです。さすがはデザイナーに愛…

書きたかったプログラムが書けた

1・2年前から作りたいと思っていたサーバサイドのプログラム*1があったのですが、この週末に試してみたところDBを含めてほんの2時間弱で実装することができました。うれしく思うと同時に、仕事によるプログラミング学習の速度の高さに驚いています。もちろん…