cypher256's blog

Pleiades とか作った

Eclipse 4.3 Kepler ケプラーがメジャーリリース!

Eclipse 4.3 Kepler 関連 Pleiades リリース

f:id:cypher256:20130616132803j:plain:w250:right
 1 年に 1 度のメジャーリリース版 Eclipse 4.3 Kepler が 6/26 にリリースされました。Maven WTP 連携強化や新機能の他、Eclipse 4.2 Juno SR2 で解消できていなかったバグやパフォーマンス問題もフィックスされています。このリリースに合わせて対応する Pleiades All in One と JStyle もリリースしました。


Pleiades All in One Eclipse 4.3 Kepler
http://mergedoc.sourceforge.jp/pleiades_distros4.3.html
JStyle プラグイン 4.3.0
http://mergedoc.sourceforge.jp/jstyle.html



Eclipse Kepler の新機能について、こちらの方が分かりやすく解説されています。
Eclipse 4.3 "Kepler"の新機能一覧
http://d.hatena.ne.jp/takahashikzn/20130625/1372153189


変更内容
  • Eclipse 4.3 対応、各ランタイム・プラグインのバージョンアップ
  • Java7 Javadoc ホバー表示を日本語にするために、Java7 Javadoc ロケーションに日本語版 Javadoc URL の自動設定を追加 (pleiades-config.xml)
  • Windows 8 で XP テーマになってしまうため、Windows 7 テーマをコピーして作成 (中身は同じ)

15 個のパフォーマンス問題が改善! Eclipse 4.2 Juno SR2 リリース

Eclipse 4.2 Juno SR2 関連リリース

f:id:cypher256:20130211230002p:plain:right
 重い・遅いで各地で盛大に炎上していた Eclipse 4.2 Juno のパフォーマンス問題が改善。パフォーマンス関連 15 個、その他 200 個以上のバグが修正された Eclipse 4.2 Juno SR2 が 2/22 にリリースされました。Eclipse では各メジャーバージョンの SR2 が最終安定版になります。対応する Pleiades All in One と JStyle もリリースしました。


Pleiades All in One Eclipse 4.2.2 Juno SR2
http://mergedoc.sourceforge.jp/pleiades_distros4.2.html
JStyle プラグイン 4.2.2.0 4.2.2.1 (2013/02/27 更新)
http://mergedoc.sourceforge.jp/jstyle.html

Juno SR2 で修正されたパフォーマンス問題のいくつか
  • XML エディター切り替えが超遅い
  • エディター開閉時のオブジェクト・リーク
  • ビュー開閉時のメモリー・リークいっぱい
  • 何にもしてないのに毎秒数百のオブジェクト割り当て
  • エディターの後選択の概念の実装忘れてた
  • パーツ活性化時に後選択イベントを 2 回送出
  • オーバーライドした IContributionManager#getVisible が 2000〜1万回呼ばれてる
  • アクション・バー破棄してない
  • CTab 描画の改善
  • URI 指定のファイル検索が遅い
  • 行移動が超遅い
  • コンテキスト・マネージャー呼びすぎ
  • ポップアップ・メニューのリスナー・リーク
Java 6 終了のお知らせ

f:id:cypher256:20130221001023j:plain:w200:right
 OracleJava 6 一般サポート&更新を終了し、JRE に関しては Java 7 への自動アップデートを開始しました。なお、Pleiades All in One の Full Edition には 2/19 リリースの最新セキュリティアップデートを含む Java 7 および Java 6 最終版*1 が付属しています。


参考: InfoQ - OracleJava 6のセキュリティアップデートの配布を2月で停止する
http://www.infoq.com/jp/news/2013/02/jdk6-retirement


Pleiades プラグイン 1.4.0 安定版リリース

 去年 6 月の 1.3.4 リリースからの下記の累積更新を最新版として更新してきましたが、今回、安定版としてリリースしました。


Pleiades プラグイン 1.4.0
http://mergedoc.sourceforge.jp/

  • ADT、CDT、CVSChrome テーマ、Dali、EGit、Eclipse、IvyDE、JDEclipse、PDT、PyDev、Quick JunitScala IDESubversiveWTP、m2e の差分訳追加
  • Babel Juno から差分訳約 4,000 個を取り込み。取り込み後の総エントリー数: 122,000。Babel 訳で Pleiades 翻訳バリデーターが検出した翻訳エラー約 700 個修正
  • [#28872] Javadoc ホバーで添付ソースより Javadoc 指定を優先する AOP 定義修正
  • [#28889] EclEMMA 翻訳差分追加 (shuji_w6e)
  • [#64557] E3.7 でプロジェクトのインポートでエラーになる問題を修正 (orihalcon)
  • [#64645] マルチスレッド処理順の影響で -clean モードで起動してしまう場合があった問題を修正 (orihalcon)
  • [#64819] Mac OSX Swing デッドロックバグ回避 (m.tanaka)
  • [#65706] Juno CDT 4.2.1 で生成されるフォルダ名が訳されてしまう問題に対応
  • [#65900] Paypyrus で model を翻訳しないようにパッケージ org.eclipse.papyrus 除外追加
  • ディレクトリにプラス記号 (+) が含まれていると起動できない問題を修正
  • ADT のようなプラグイン外からの jar ロードに対応するために AOP 動的クラスパス追加に対応
  • Spring IDE プラグインで Roo コマンドが実行できない問題を修正
  • pleiades-config.xml の excludePackage でパッケージ単位の AOP 除外ができるように機能追加
  • 複数バージョンの同一プラグインがあると NoSuchMethodError などが発生する場合がある問題を修正
  • Eclipse 3.3 以降で HTML 系コンテンツのエンコーディング自動判別に失敗して Shift_JIS になる問題を無効化
  • ツールバーにウィンドウ > 設定のアイコン追加と F10 ショートカットキー割り当て
  • クラス- ファイルを開くときにエラーになる問題を修正 (muimy)
  • SSD 環境向け高速化
  • Eclipseプラグイン更新を検出した場合は自動的に -clean 起動するようにした
  • ADT、Eclipse、MAT、PDT、PyDev、Window Builder の差分訳追加
  • 起動時に無駄な処理が発生してたため修正
  • Eclipse 依存になっていた部分を排除
  • SWTException: Invalid thread access が発生する場合があったのを修正
  • プロジェクト作成などでエラーになる問題を修正 (関連 #64557)
  • 翻訳除外処理のデグレードを修正
  • 進捗バー表示不具合改変クラスをキャッシュできていなかった問題を修正
  • Eclipse 4.2 用の Pleiades スプラッシュ画像を追加
  • Eclipse 4.2 標準スプラッシュが画像サイズ変更によるクリーン- メッセージのサイズ可変対応
  • Eclipse 4.2 起動時の進捗バーがあまり進まない問題を AOP で改変修正
  • 起動オプションに -Xverify:none を指定すると Eclipse Workbench クラスの動的コンパイルに失敗する問題を修正
  • Pleiades 更新検出ファイルの処理失敗時のログ出力を追加
  • 不要なリソースのロードを抑止
  • -clean 時などで発生していた E4 マルチスレッド強化によるデッドロック (フリーズ) 問題を修正
  • AOP ジョイントポイント判定の最適化により全体を高速化
  • 更新マネージャーからプラグインを更新した後の次回再始動時に -clean 動作するように修正
  • -clean 時、スプラッシュの下に「クリーンアップ中」メッセージを表示
  • Pleiades のリソースリークを修正
  • 改行やタブなどの全角記号が含まれる英語原文を訳せていない問題を修正
  • 変換除外クラスキャッシュの最適化によるパフォーマンスアップ
  • E4 で進捗状況ビュー、問題ビューのタブが訳されなくなっていたため対応
  • マルチコア向けにパフォーマンス- チューニング
  • E4 系 -clean 起動時にフリーズする場合がある問題を可能な限り修正
  • E4 系で自動デフォルトエンコーディング設定ができていなかったので対応
  • E4 系でバージョンが取得できず、スプラッシュが正しく表示できない問題を修正
  • E4.2 Pleiades スプラッシュ画像追加

2013 年 Eclipse Kepler、そして 2014 年 Eclipse Luna (ルナ:月の女神) へ

f:id:cypher256:20130210231957j:plain:w210:right
 2013/6/26 に Eclipse 4.3 Kepler がメジャーリリースされますが、その翌年 2014/6/25 にメジャーリリースされる Eclipse 4.4 のコードネームが Luna に決まりました。例年どおり、頭文字がアルファベット順、天体・神話・科学をテーマにしたもので Laila、Ladon、Laplace、Lok、Lorentz などに対して投票が行われましたが、Luna 71%、次点 Laplace 13% というような感じで圧倒的だったようです。


 蛇足ですが、英語で日食を Solor Eclipse月食を Lunar Eclipse (lunar は形容詞) と言いますが、Luna はギリシャ神話では Selene とされ、Eclipse 3.6 のコードネームだった太陽神 Helios と姉妹関係にあたります。また後に Luna と呼ばれることになる純潔の女神 Artemis の婚約者 Orion (ブラウザベースの Eclipse のコードネーム) は元々 Pleiades 7 姉妹の追っかけでした。ちなみに Juno はギリシャ神話では最高位の女神であり、Luna のいとこ、Pleiades 姉妹や超美人神 Callisto (Eclipse 3.2) のおばさんにあたります。

*1:Java 6 は 2 月終了と発表されていましたがその後も更新されている模様

開発環境、言語、DB マーケット・シェア

 開発環境のシェアをちょっと見てたら色々気になってきたので、色々見てみたメモ。

IDE 3 強 Eclipse, IntelliJ IDEA, NetBeans

ZeroTurnaround 調査報告 2011 〜 2012 年推移

 世界各国の Java 開発チームを対象に調査を実施している ZeroTurnaround 社の 2011年、2012 年の結果を比較してみると、比率はそんなに変わってなさそうですが、全部上がっています。複数の IDE を使う開発者が増えたような感じでしょうか。
f:id:cypher256:20130209164327j:plain

LinuxQuestions.org IDE/Web 開発エディターオブザイヤー 2012

 Linux 質問コミュニティの投票結果。IntelliJ IDEA は Linux 版もありますが、エントリーに無いようです。なぜ?
[linuxquestions.org] IDE/Web Development Editor of the Year

1位 Eclipse
2位 Geany
3位 Netbeans
4位 Bluefish
5位 Emacs
Indeed 日米検索結果

 クロール型仕事検索エンジン Indeed の検索結果。「IDEA」で検索するとアイデア募集がいっぱいヒットするので「IntelliJ」で検索したでござる。
f:id:cypher256:20130209164328j:plain

Indeed 仕事トレンド

 最後急落してると思ったら、後に出てくる他のトレンドも最後はほとんどそんな感じ。時期的なもの?
[indeed.com] Eclipse, IntelliJ, NetBeans
f:id:cypher256:20130209165900p:plain

プログラミング言語

TIOBE インデックス 2013年2月版

 おなじみの検索エンジンの検索結果を元にプログラミング言語の人気度を評価する TIOBE の最新評価結果iPhoneiPadObjective-C が躍進しましたがかげり?。Scala は 35 位 (0.327%) で思ったより低いです。
f:id:cypher256:20130209174647p:plain

Indeed 仕事トレンド

 C はちゃんと検索できないので除外。TIOBE はどうやって評価してるんだろう。
[indeed.com] Java, Objective-C, C++, C#, Perl, PHP, Ruby, Python, Scala, COBOL
f:id:cypher256:20130209165901p:plain

その他色々 Indeed 仕事トレンド

AP サーバー、Servlet コンテナ

 海外では WebSphere の仕事が多い?
[indeed.com] GlassFish, JBoss, WebSphere, WebLogic, "Oracle Application Server", Geronimo, Tomcat, Jetty
f:id:cypher256:20130209165902p:plain

ブラウザ UI

 フ、Flash が。HTML5 は普通になって HTML5 という言葉を使う頻度が減っていきそう。
[indeed.com] Flash, SilverLight, HTML5, JQuery, Dojo, ExtJS, YUI, MooTools,
f:id:cypher256:20130209165904p:plain

モバイル OS

 Windows Phone を調べれば何かが分かるかもしれない。
[indeed.com] iOS, Android, "Windows Phone"
f:id:cypher256:20130209165905p:plain

データベース (RDB)

 Oracle は良い買い物をした。
[indeed.com] MySQL, Postgres, DB2, "Oracle Database"
f:id:cypher256:20130209165906p:plain

データベース (KVS、NoSQL、組み込み、etc)

 ちょっとカオス。
[indeed.com] MongoDB, CouchDB, MariaDB, Redis, HBase, Cassandra, SQLite, H2, Derby
f:id:cypher256:20130209165907p:plain

[Eclipse] Pleiades All in One の Windows 8 フォント設定対応


 Pleiades All in One の自動デフォルト設定で Windows 8 の場合にフォント設定が動作していなかったため対応しました。また、下記の方がブログに記載されている件に関してソースを確認したところ、プロパティー・ファイルの編集で一部の文字が変換されないようなので作者の方へバグ報告し、別のプラグインに変更して対応しました。


プロパティファイルで「×」が文字化けする - 眩しいサインを見ただろう
http://mabushiisign.hatenablog.jp/entry/2012/11/20/010243

変更内容

4.2.1.v20121123


4.2.1.v20121118

  • Windows 8 および 9 のデフォルト・フォント設定に対応
  • JDK 更新
  • JDEclipse 更新
Eclipse Pleiades All in One 4.2 Juno ダウンロード

パフォーマンス比較 Cassandra、Mongodb、SQLite、H2、MySQL、Postgres


 下記のようなシステムでパフォーマンスが良さげな SQLite を使用予定ですが、もっと速いものが無いか確認のため他のデータベースのパフォーマンスを計測してみました。SQL 利用前提ですが、NoSQL が圧倒的な性能を出す場合は検討する必要があるので KVS も確認しました。

  • データ件数は 1 億件程度、JDBC SQL 利用可能
  • INSERT、UPDATE はバッチ
  • SELECT は主キーアクセス性能を重視
  • 将来スケールアウトのための分散はありえるが、スタンドアロンで遅いのはだめ

データベースのパフォーマンス比較

計測したデータベース
データベース名 タイプ 形態 評判 計測についての備考
SQLite RDB 組み込み ※2 おもちゃ、Android標準 JDBC操作 ※1
H2 RDB 組み込み ※2 組み込み最速 JDBC操作 ※1
Derby RDB 組み込み ※2 Java標準で付属 JDBC操作 ※1
EHCache KVS 組み込み ※2 OSCacheと2大巨頭 1万件ごとにディスク書き込み設定
Redis(Jedis) KVS サーバー ※4 爆速 Jedis API 操作
Mongodb KVS サーバー ※4 高パフォーマンス Mongodb 標準 API 操作 ※3
Cassandra KVS サーバー 大手導入事例多数、廃止も多数 JDBC操作 (AutoCommit のみ可能)
MySQL(MyISAM) RDB サーバー サーバ型非トランザクションRDB最速 JDBC操作 ※1
MySQL(InnoDB) RDB サーバー サーバ型トランザクションRDB最速 JDBC操作 ※1
PostgreSQL RDB サーバー MySQLと異なりGPLじゃない JDBC操作 ※1

※1 JDBC 操作に関して INSERT は 1 万件ごとにコミット、SELECT は主キー指定で 1 件ずつ全件取得
※2 組み込みモード (ローカルファイル永続化) のみ計測、インメモリモードやサーバーモードは未計測
※3 全 INSERT 後の ensureIndex によるインデックス作成時間が計測結果に含まれる
※4 遅延書き込み (非同期書き込み) *1

計測結果

環境 CPU Core2 Duo 2GH 2GHz*2、メモリ 4GB、Windows XP 32bit*3、HDD (TOSHIBA MK8052GSX)*4、しょぼめのノートパソコン
データ 主キー:数値、値:文字列、レコード長:約 200 byte
スレッド数 1

線形的増加と指数関数的増加、臨界点

 データベースの処理数に対する処理時間は、上記結果の MySQL に見られるような線形的増加 (リニア、直線的) に増加するパターンと、Cassandra のように指数関数的 (雪ダルマ式) に増大するパターンがあります。また、線形的増加から指数関数的増加に移行する臨界点や動作不能になる臨界点がある場合が多いです。1 万件での処理時間はこうだから 1 億件の予想処理時間はその 1 万倍というような情報をたまに見かけますが、件数が増大するほど線形的増加ではないほうが多いと思います。

SQLite が予想以上に他を圧倒し高速


 SQLite が INSERT、SELECT とも予想以上に他を圧倒し高速でした。計測結果に示すとおり 1 億件程度のデータ (データファイルサイズは 1.8 GB でした) なら大丈夫そうです。H2 のサイトに H2 が最速とするパフォーマンス比較 (H2) がありますが SQLiteトランザクションがテストされていないという理由で比較されていません。ちなみに実際には SQLiteトランザクションをサポートしていて、テストに関しても SQLite 本体コード 6万7000行 に対しテストコードは 4567万8000行 (publickey) だそうです。古い情報ですが、SQLiteを使うべき10の理由と5つのデメリット (CAP-LAB テクニカル) が色々参考になります。


 SSD で試してみたところ、1 億件 INSERT 647秒、1 億回 SELECT 383秒 でした。さすがに速い。SSD 環境は CPU i5 2.4GH、メモリ 8GB、Windows 7 64bit*5SSD (TOSHIBA THNSNC128GMMJ)*6、これもノートパソコンです。

件数が増えると EHCache が想定以上に遅い


 EHCache は 1 万件取得で最速ですが、件数が増えると組み込み RDBSQLite や H2 より遅いのは良い?にしても、クライアント・サーバー型 KVS の Mongodb や Redis より総合的に少し遅いのは予想外でした。overflowToDisk の設定にもよると思いますが、知らずに H2 や Mongodb のキャッシュとして EHCache を使ってまいそうです。すべてディスクに永続化するように設定していたのですが、100万件テストでは登録したデータを取得しようとしたときに欠落している場合があるため計測しませんでした。ところでロゴを見て気づいたのですが EHCache が回文になっているのを今初めて知りました。

Mongodb がクライアント・サーバー型としては登録性能に優れている


 最速の SQLite と比較すると登録は 6 倍かかり、取得は 20 倍かかりますが、クライアント・サーバー型としては最も登録性能に優れています。ただし、分散環境ではデータがときどき消える、マルチコアでスケールしない (InfoQ)、などに注意する必要があります。もちろん、これらの問題は将来解消されるかもしれません。

NoSQL、KVS の代表とも言える Apache Casandra がとんでもなく遅い


 分散 KVS をスタンドアロンの組み込み RDB と比較するのもあれですが、テストした環境での 100万件 SELECT は SQLite の 200 倍以上遅いです。分散によるネットワーク負荷係数を 2 とした場合、サーバーを 400 台程度用意すれば SQLite と同等の性能を出せるかもしれません。一時期 TwitterFacebook が Cassandra をメインに使用することを検討していましたが断念しました。ちなみに Cassandra を元々開発したのは Facebook です。

NoSQL、KVS が終焉


 NoSQL が終焉したと言われて久しいですが、Google のインフラ基盤や Facebook の HBase (Hadoop) で HBase (Hadoop データベース)*7 がバリバリ使われていて、Mixi では永続化機能付き memcached とも言える TokyoTyrant が使用され、DeNA では MySQL に HandlerSocket を組み込み NoSQL を実現しています。必要な場面があるので今後も NoSQL や KVS が無くなることはなく、逆に RDB も衰退することはありません。Twitter は今でも MySQL + memcached ですし、GAE では MySQL も用意されています。また、NoSQL に対して SQL が遅いというアンチテーゼとして、Postgres の設計者による分散インメモリ RDB の VoltDB が登場しています。


 業務システムから見ると SQL はそのままでスケールアウトしたいという要望に単純な NoSQL や KVS は合致しません。元々 RDB がスケールアウトによりリニアにスケールしない問題や耐障害性を解決するために GoogleBigTable などにインスパイアされ登場したのが分散 KVS ですが、現在は RDB に NoSQL や KVS の要素が取り込まれています。例えば、MySQL 5.6 では memcached や HandlerSoclet などの概念が取り込まれ SQL なしで高速アクセス可能になっています。また MySQL Cluster や Oracle Exadata は分散 KVS と同じようにリニアにスケールアウト可能になっており、Postgres も 32 コア CPU 対応などスケールアップ可能になっています。

追加 2012/10/19

計測結果についての補足

 計測結果はあくまでも私が必要な環境と条件の計測結果であり、id:matsumoto_r さんがおっしゃられているとおりデータベースそのものの優劣を示しているものではありません。並行アクセスしたらとか、設定変えたらとか、たくさんご意見いただきましたが、もちろん、負荷条件を変えたりそれぞれ環境に合わせてチューニングすれば結果は変わると思います。今回の想定システムでは並行アクセスはほぼ発生せず意味がないのでマルチスレッドでの計測はせず、シングルスレッドでのデータ永続化の基本性能を確認するために実施しました。並行処理が得意(前提)とされるデータベースをシングル構成で計測に追加したのは差を確認するためです。並行性能の情報はたくさん公開されていると思いますが、ご自分の環境に合う方法で計測していただければと思います。


 なお、ソフトウェアやドライバはすべて最新安定版、設定はデフォルトです。ただし、全データのディスク同期が前提の計測であるため、EHCache はインメモリではなくディスク永続化モードです。ちなみに SQLite はもう少し触ってみたところ Beta 版にすると 20% 高速化、非同期モードにするとさらに 10% 高速化しました。

計測になぜ Oracle が含まれてないの?

私は臆病者なので良い結果を出さないと Oracle に怒られる気がするからです。OTN ライセンスに下記の条項が含まれています。

ラクルの事前承諾なく、プログラムのベンチマークテストの結果を開示すること。

OTN開発者ライセンス

蛇足ですが、DB2 は設定を完璧にして最新パッチをあてて最高性能を出さないと怒られるかもしれません。

(A) ベンチマーク・テストで使用した方法 (例えば、ハードウェアおよびソフトウェアのセットアップ、導入手順および構成ファイル) を公開し、
(B) 「プログラム」に対する IBM または IBM 製品を提供する第三者 (以下「第三者」といいます。) から提供される最新の適用可能な更新、パッチ、修正が適用された所定の稼働環境で 「プログラム」を実行してベンチマーク・テストを行い
(C) 「プログラム」の資料ならびに IBM がサポートする「プログラム」用の Web サイトで提供されているすべてのパフォーマンス・チューニングおよび最良の方法に従うこと

SLA - L-JWOG-6K4JSQ
計測ソース*8

 今回の計測対象のメインとなる JDBC のソースはこちらになります。INSERT のあとの SELECT なのでキャッシュ云々の話もありますが、それも含めて各データソースに対して同じ操作をしています。SQLite のみ Class.forName しているのはドライバがサービスプロバイダーフレームワークに対応していないためです。(bitbucket リポジトリの最新ソースでは 2012/09 対応)

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.After;
import org.junit.Test;

public class JdbcTest {

    @Test
    public void sqlite() throws Exception {
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:test.sqlite3");
        Statement st = con.createStatement();
        executeUpdate(st, "drop table if exists person");
        executeUpdate(st, "create table person (id integer primary key, name string)");
        executeQuery();
    }

    @Test
    public void h2() throws Exception {
        con = DriverManager.getConnection("jdbc:h2:testh2", "sa", "");
        Statement st = con.createStatement();
        executeUpdate(st, "drop table if exists person");
        executeUpdate(st, "create table person (id integer primary key, name varchar)");
        executeQuery();
    }

    @Test
    public void derby() throws Exception {
        con = DriverManager.getConnection("jdbc:derby:derby;create=true");
        Statement st = con.createStatement();
        executeUpdate(st, "drop table person");
        executeUpdate(st, "create table person (id int primary key, name varchar(200))");
        executeQuery();
    }

    @Test
    public void mysql_myisam() throws Exception {
        mysql("MyISAM");
    }
    @Test
    public void mysql_innodb() throws Exception {
        mysql("InnoDB");
    }
    private void mysql(String engine) throws Exception {
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
        Statement st = con.createStatement();
        executeUpdate(st, "drop table if exists person");
        executeUpdate(st, "create table person (id integer primary key, name varchar(200)) engine = " + engine);
        executeQuery(con.getMetaData().getDatabaseProductName() + "(" + engine + ")");
    }

    @Test
    public void postgres() throws Exception {
        con = DriverManager.getConnection("jdbc:postgresql:postgres", "postgres", "postgres");
        Statement st = con.createStatement();
        executeUpdate(st, "drop table if exists person");
        executeUpdate(st, "create table person (id integer primary key, name varchar)");
        executeQuery();
    }

    @Test
    public void cassandra() throws Exception {
        con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/test");
        Statement st = con.createStatement();
        executeUpdate(st, "drop table person");
        executeUpdate(st, "create table person (id int primary key, name text)");
        executeQuery();
    }

    // 共通メンバー -------------------------------------------

    private Connection con;
    private static final int COUNT = 10000 * 10;
    private static final String DATA = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";

    @After
    public void after() throws Exception {
        if (con != null) {
            con.close();
        }
    }

    private void executeUpdate(Statement st, String sql) {
        try {
            st.executeUpdate(sql);
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    private void executeQuery() throws Exception {
        executeQuery(con.getMetaData().getDatabaseProductName());
    }

    private void executeQuery(String databaseName) throws Exception {

        boolean isCassandra = databaseName.contains("Cassandra");
        boolean isAutoCommit = isCassandra;

        System.out.printf("%-14s", databaseName);
        if (!isAutoCommit) {
            con.setAutoCommit(false);
        }

        long insertStart = System.currentTimeMillis();
        PreparedStatement insertPs = con.prepareStatement("insert into person (id, name) values(?, '" + DATA + "')");
        for (int i = 0; i < COUNT; i++) {
            insertPs.setInt(1, i);
            insertPs.executeUpdate();
            if (!isAutoCommit && i % 10000 == 0) {
                con.commit();
            }
        }
        if (!isAutoCommit) {
            con.commit();
        }
        double insertSec = (double) (System.currentTimeMillis() - insertStart) / 1000;

        long selectStart = System.currentTimeMillis();
        PreparedStatement selectPs = con.prepareStatement("select * from person where id = ?");
        for (int i = 0; i < COUNT; i++) {
            selectPs.setInt(1, i);
            selectPs.executeQuery().next();
        }
        double selectSec = (double) (System.currentTimeMillis() - selectStart) / 1000;

        String countSql = "select count(1) from person";
        if (isCassandra) {
            countSql += " limit 100000000";
        }
        ResultSet rs = con.createStatement().executeQuery(countSql);
        rs.next();
        logProcessTime(rs.getInt(1), insertSec, selectSec);
    }

    private void logProcessTime(long count, double insertSec, double selectSec) {

        System.out.printf("%4d万件 ", count / 10000);
        System.out.printf("%7.2f秒 ", insertSec);
        System.out.printf("%7.2f秒", selectSec);
        System.out.println();
    }
}

*1:2012/10/20 1:00 @kimutansk さんの指摘により追記

*2:2012/10/14 11:57 @showyou さんの指摘により修正

*3:2012/10/14 12:15 @showyou さんの指摘によりビット数追記

*4:2012/10/15 23:51 @showyou さんの指摘により追記

*5:2012/10/14 12:15 @showyou さんの指摘によりビット数追記

*6:2012/10/14 12:15 @showyou さんの指摘により型番追記

*7:2012/10/14 11:57 @shiumachi さんの指摘により修正

*8:2012/10/19 22:50 id:ysobj さんの指摘により追記

黒背景 Eclipse Dark Juno でクールにキメる

重要なのは開発手法でも言語でもフレームワークでもない。クールにキメて今日から君もモテリプス。



Black Eclipse

上のイメージの黒を基調としたダーク系 Eclipse に必要なプラグインと設定方法です。


必要なプラグイン


設定方法


一般 > 外観 > 色テーマ で「Pastel」を選択。(どれでもいい)
一般 > 外観 のテーマで「Dark Juno」を選択。
Lightweight CSS エディターでビュータイトルの font-size 12 を 9 に変更。
これは Dark Juno プラグインに含まれる CSS ファイルを直接書き換えるのと同じです。


Moeclipse で Java エディター背景に適当な画像を設定


CSS スパイ。クイック・アクセスから CSS を入力し、CSS スパイを開く で開きます。
ウィジェットを選択すると、実際の部品が赤枠で囲まれ、プロパティーを変更すると見た目を確認できます。
このプラグインは必須ではありませんが、CSS を細かくカスタマイズする場合は便利です。

Stylish Eclipse

黒系じゃなく普通の感じでいいけど、Eclipse Juno のデフォルト・テーマはビューの間が広くてちょっとかっこ悪い、かといって、XP テーマに戻すのもなんだかあれ。という場合は Eclipse 4 Chrome Theme がお勧めです。設定画面からビュー間を調整できます。ちなみに Chrome という名前はブラウザの Google Chrome は無関係です。


必要なプラグイン


設定方法


一般 > 外観 > Chrome テーマ の右上の矢印からのプリセットが選択できます。ビューの幅を狭くするにはマニュアルを選択し、サッシュ幅を最小にします。細いサッシュを選択すると、Eclipse 3 系と同じような外観になります。


Eclipse Juno デフォルト・テーマ


Chrome テーマ > Chrome Modern - マニュアル、サッシュ幅最小


Chrome テーマ > Hello Kitty - マニュアル、サッシュ幅最小


Chrome テーマ > Chrome Modern - 細いサッシュ


Chrome Theme の CSS は Xtend で動的に生成されているため、Lightweight CSS エディターで編集することはできません。

フォントにこだわる

無料公開された Source Code Pro や MeiryoKe_Console を使うとさらにモテリプスだ。


Source Code Pro
[速報] ソースコードを表示するためのフォント「Source Code Pro」をアドビがオープンソースで無料公開
MeiryoKe_Console
dai1741's blog: Windows 7のEclipseのフォントをきれいなものにする