2015年9月21日月曜日

Cloud Foundry をオールインワンで動かしてみる

構築にはcf-vagrant を利用しようと思います。VM上に構築するのが簡単そうだからです。


構築マシンはMacです。バージョンは10.10.3 Yosemite です。
現在、このマシンにはruby 2.0.0p481 がインストールされています。

cf-vagrantはRuby 1.9.3 が必要なようなので、バージョンの変更が必要です。
ただし、以下を利用することで、複数バージョンのrubyを管理できるそうです。



上記の内容を参考に ruby 1.9.3 をインストールしました。これで、vagrantを利用した構築が開始できます。

作業を進めていたところ、以下のエラーが。
$ rake host:bootstrap
==> Init Git submodules
fatal: reference is not a tree: 6ab29695b29793252d564a2f1eae86d7b041ede7
Unable to checkout '6ab29695b29793252d564a2f1eae86d7b041ede7' in submodule path 'dea_ng/buildpacks/vendor/nodejs'
Failed to recurse into submodule path 'dea_ng'
どうやら他の人も遭遇しているようですが、解決策はまだ提示されていません。(探し方が足りないのかもしれないですが)

rake host:bootstrap
https://github.com/Altoros/cf-vagrant-installer/issues/112

 先は長そうです。

---------------
2015年9月23日 追記

git についてあんまわかってなかったです。(今もわかってないですが)
エラーはよく読むと、CommitIDが該当するものがないというもの。よくわからないですが、submodule側か、親のどちらかが古い情報を参照しているか誤った情報を参照しているか。。。

ということで、キャッシュを削除してみました。

$ git rm --cached dea_ng
そしたら、rake host:bootstrapはエラーなく実行できました。
しかし、次の問題が。

==> cf-install: ================================================================================
==> cf-install: Recipe Compile Error
==> cf-install: ================================================================================
==> cf-install: 
==> cf-install: 
==> cf-install: Chef::Exceptions::RecipeNotFound
==> cf-install: --------------------------------
==> cf-install: could not find recipe server for cookbook mysql
==> cf-install: 
==> cf-install: 
==> cf-install: [2015-09-23T08:25:24+00:00] ERROR: Running exception handlers
==> cf-install: [2015-09-23T08:25:24+00:00] ERROR: Exception handlers complete
==> cf-install: Chef Client failed. 0 resources updated
==> cf-install: [2015-09-23T08:25:24+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> cf-install: [2015-09-23T08:25:24+00:00] FATAL: Chef::Exceptions::RecipeNotFound: could not find recipe server for cookbook mysql
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

MySQLのレシピがないって。ないって言われてもな・・・。 

2015年2月24日火曜日

Android StudioでRobolectric を使ったプロジェクトのサンプルを作ったけど

あんまり利用する必要がないことに気づいた。

導入方法は日本語でもたくさんあるし、みなさん丁寧に書いてるので補足も必要ないほどです。

一応URLだけでも。
https://bitbucket.org/nekoscapeproject/robolectric_template

2014年11月1日土曜日

OpenStack Novaで起動したインスタンスが 勝手にshutoffになる

以下の環境でOpenStack Icehouseをインストールし、インスタンスを起動したところ、しばらく経つとすべてのインスタンスの状態がshutoffとなる現象に遭遇しました。
結論としては現在は未解決です。

ホストOS
 CentOS6.5

ゲストOS
 CentOS6.5(VirtualBOXで動作):OpenStackインストール

環境をクリーンにしようとするたびに、ホストOSのインストール及び、OpenStackのインストール&設定を行うことが手間であったため、はやり(?)のVagrant+VirtualBoxを使った環境を作成しました。

順調に動作しているように思われたのですが、OpenStack上で動作させるVMをcirros OS以外にしたところ、本事象に遭遇。解決できずにいます。

ホストOSに直接OpenStackをインストールをしているときは、問題は発生していません。
違いは、OpenStack Novaのvirt_typeをkvmからqemuに変更しているくらいです。

そうすると、原因は、Novaが利用しているqemuにあるのでしょうか。。。
どうやって調べるか・・・

ちなみに、本事象は海外の方も遭遇しているらしく、Webの質問サイトで散見されました。しかしながら解決せずに質問スレッドが終了しており、残念な結果となっています。


2014年8月30日土曜日

mavenによるtomcat7へのWarファイルのデプロイの流れ

tomcat7にWarファイルをデプロイしたときの作業の流れ。
当然ですが、mavenと、tomcatは予め準備しておきます。

今回は、eclipseのm2eというプラグインを利用して実行しました。

まず、tomcatサーバ側の準備。
Warファイルのデプロイのためには、デプロイの権限が必要となります。
tomcatの"tomact-users.xml"というファイルに以下を追加します。
<tomact-users>
  <role rolename="manager-gui" />
  <role rolename="manager-script" />
  <user  username="tomcat" password="password" roles="manager-gui,managerscript" />
</tomact-users>
※ tomcat-usersが存在している場合は記載する必要はありません。

    username, passwordは環境に合わせて変更してください。

上記の設定を行った上で、Tomcatを起動、もしくは再起動する。


次は、デプロイ側の設定。デプロイするサーバや、パスの設定をします。

pom.xml
<biuld>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
      <configuration>
        <url>http://localhost:8080/manager/text</url>
        <server<remotetomcat</server>
        <path>/hello</path>
      </configuration>
    </plugin>
  </plugins>
</biuld>

settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <servers>
    <server>
      <id>remotetomcat</id>
      <username>hiroyuki</username>
      <password>hiroyuki</password>
    </server>
  </servers>
</settings>




あとは、m2eのプラグインから tomcat7:deploy を実行するとデプロイができます。
※2回目以降は、tomact7:redeployでないと失敗します。
 deployは上書き禁止モードのようです。

意外と簡単だった。でも、このデプロイはセキュリティ的にはどうなんだろうか。外部からモジュール置き換えができるのは便利だけどテスト環境だけに留めたい・・・。

参考にしたサイト
http://blog.horimisli.me/entry/2012/07/13/231000

2014年7月19日土曜日

jsonschema2pojo 妥当性チェック

jsonschema2pojoを使ってjackson用のクラスファイルを作成してみましたが、json schemaの妥当性のチェックがソースとして反映されてないようです。

デフォルトの指定ではバリデーションは有効にならないようです。
https://github.com/joelittlejohn/jsonschema2pojo/wiki/Reference

ということで、以下から、jarファイルをダウンロードして前回作成したプロジェクトの"libs"に追加します。
http://mvnrepository.com/artifact/javax.validation/validation-api/1.0.0.GA

さらに、build.xmlを以下のように置き換え

<xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="generate">

<taskdef name="jsonschema2pojo" classname="org.jsonschema2pojo.ant.Jsonschema2PojoTask">
<classpath>
<fileset dir="libs">
<include name="*.jar" />
</fileset>
</classpath>
</taskdef>

<target name="generate">
<jsonschema2pojo source="src/address.json"
targetDirectory="gen" targetPackage="com.example"
includeJsr303Annotations="true" />
</target>

</project>



これで実行すると妥当性チェックをしてくれそうなJavaクラスが生成されます。
※実際にチェックされるのかは後でやります。

jsonスキーマからJavaクラス生成でparseエラーが出る場合は、antの引数に、"-verbose"を指定すると問題の箇所が特定できます。1つ1つ順番に潰していってください。

Json Schemaを追加ってJavaクラスを生成する

必要があったので、Json Schemaがどんなものなのか確認する意味を含めてJson SchemaからJavaクラスを生成してみました。

いつもEclipseを利用して作業を行っているため、今回の生成もEclipseを利用します。
以下のサイトを参考にしました


1. Eclipseにプロジェクトを作成し、build.xmlファイルを準備します。
build.xmlファイルには、以下のコードを貼り付けておきます。

<xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="generate">

<taskdef name="jsonschema2pojo" classname="org.jsonschema2pojo.ant.Jsonschema2PojoTask">
<classpath>
<fileset dir="libs">
<include name="*.jar" />
</fileset>
</classpath>
</taskdef>

<target name="generate">
<jsonschema2pojo source="src/address.json"
targetDirectory="gen" targetPackage="com.example" />
</target>

</project>


<xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="generate">


2. 必要なJarファイルをダウンロードし、プロジェクト内の"libs"フォルダへ配置します。
必要なJarファイル一覧は、jsonschema2pojo -Githubの"The Ant Task"にありますが、一部ライブラリの追加、変更が必要でした。
追加
・Appache commons lang 3
変更
・codemodel2.4 → codemodel2.6

3. buildの実行
Buildfile: /Users/XX/Documents/workspace/jsonschema2java/build.xml
generate:
BUILD SUCCESSFUL
Total time: 615 milliseconds

完成


2014年5月2日金曜日

約数の数

先日、Topcorder Single Round Match 466 DIV 2の500ポイントの問題を考えていましたが、解き方が全くわかりませんでした。

問題は、以下のとおりです。
    
Bob likes to play the lottery, but it's so hard to win without cheating. Each lottery ticket has an identifier which contains exactly n decimal digits. If an identifier contains only '0's, it is considered a winning ticket. Otherwise, the identifier is interpreted as a positive integer X written in decimal notation (possibly with leading zeros). If X has an odd number of positive integer divisors, it is a winning ticket, otherwise, it is not. A positive integer is a divisor of X if it divides X evenly. 



Unfortunately, Bob only has enough money to buy one ticket, and he cannot see the identifier before buying a ticket. Therefore, he decides to cheat by buying a ticket and modifying its identifier to make it a winning ticket. In a single change operation, he can choose one digit, erase it, and print some other digit in the same position. No other types of modifications are allowed. He can perform any number of these change operations, but he wants to perform as few as possible to minimize the risk of getting caught. 



You are given a String ID, the initial identifier on Bob's ticket. Return the minimal number of change operations necessary to transform the identifier into a winning one. If the initial identifier is already a winner, return 0.
要するに求めるのは、与えられたIDがすべて0にするのか、それとも約数が奇数個ある値に変換するかどちらか変更する数値の数の少ない手番数を答えなさいというもの。

情けないことに、約数が奇数個ある。というものがどんな数値なのか思いつきませんでした。(1つ1つ書いてみればわかったかもしれない)

地道に書いてみると以下のようになる。

1 = 1
2 = 1, 2
3 = 1, 3
4 = 1, 2, 4
5 = 1, 5
6 = 1, 2, 3, 6
7 = 1, 7
8 = 1, 2, 4, 8
9 = 1, 3, 9
10 = 1, 2, 5, 10
11 = 1, 11
12 = 1, 2, 3, 4, 6, 12
13 = 1, 13
14 = 1, 2, 7, 14
15 = 1, 3, 5, 15
16 = 1, 2, 4, 8, 16
17 = 1, 17
18 = 1, 2, 3, 6, 9, 18

ちなみに約数の数を数えるには、素因数分解をすると良いらしい。
18 = 2^1 * 3^2   ( 2 * 3 = 6個 累乗の数+1同士をかけると約数のパターン数がでる)

1〜18までの値で、約数が奇数となるのは、以下のとおり
1,4,9,16

規則性を見つけるとしたら、
1^2, 2^2, 3^2, 4^2, ..... となるから、ある値の2乗の値は、約数が奇数であることになる。

数学的な証明は目的としないので省略しますが・・・

これがわかると、あとは約数が奇数の数値に変えるのが手番が少ないのか、すべて0にするのが手番が少ないのかを考えればよいだけになる。

頭の硬くなった年代にはちょっとむずかしい問題でした・・・orz




2014年3月15日土曜日

GL04PとOCNのSIMカードを利用した通信費用削減の効果

2013年の12月からGL04Pを利用してしばらく経ちました。
携帯料金の平均的な金額はかなり下がり、以前は10,000円こえることもありましたが、現在はなんと2,000円。

パケ放題が馬鹿らしいくらい。

ただ、ちょっと通信がおそかったり、手間がかかるのが面倒な時がある。それが許容できれば経済的。


iostatの勘違い(redhat系)

正しく表示内容を理解していなかったといえばそれだけだけど・・・。
iostatの%utilのディスクビジー率。この値が大きければディスクが忙しいというイメージ。
だいたいあっていそうなので真剣に向き合わないで放置してましたが・・・。

ディスクビジーってなんだよ。って思うと不信感が出てきます。

%util は結局のところ、ディスクIOがどのくらい処理されていたかを示しているだけでこいつに振り回される必要はないと気づいた。
性能を表しているわけでもないし、この値が大きくても慌ててはいけないと。

ディスクIOがどのくらい処理されていたか、ということは、iostatなどの値で考えると次のようになる。

  svctm * ( r/s + w/s ) / 単位時間  (単位時間とは、iostatなどの情報の採取間隔と考えておいてください)
  参考:http://d.hatena.ne.jp/yohei-a/20110711/1310396665

この式を眺めていると気づくのは、%utilの値が大きくなる場合がいくつかあります。

  1. svctm(IOリクエストの平均処理時間(msec))が長い。
  2. r/s(1秒間あたりのread発行回数) か w/s(1秒間あたりのwrite発行回数)が多い
上記のいづれかが原因で%utilが大きな値を示しているかが重要です。
1msecで処理できているw/sが1000回実行された場合と、1secで処理できているw/sが1回実行された場合。どちらも%utilは同じ値です。
落ち着きましょう。(自分)

iostatには、他にもありますが、それはまた次の機会で

2013年12月15日日曜日

Androidのグラフ描画ライブラリを探してみる。

Androidアプリに限らず、ツールを作成しているとグラフが描きたい場面に遭遇することはあるかと思います。
しかしながら、グラフ描画をゼロから作成するなんて簡単ではないです。(少なくとも自分には)

そこで、だれかが開発しているであろうライブラリを探すのですが・・・
探す上で幾つか問題が出てきます。

1. 使いやすいのか?
2. ライセンスは大丈夫か?

など。いろいろなライブラリを紹介しているサイトがあるので一覧を作成しませんが、個人的に使おうと決めたライブラリを紹介。

achartengine なにが良かったのか。
当然ですが、描きたいグラフが描ける。ライセンスが厳しくない(厳しいとか厳しくないとかの次元ではないですが、Apache License 2.0)
あと、設定が細かくできるため使いやすかったです。

公開しているアプリもこれを使いました。

棒グラフと折れ線グラフが同じグラフに表示できたり、複数の折れ線グラフを重ねることができたり。
便利です。

Apache License は以下の2点だけ気をつけました。

1. Google Play の記載情報として、以下の文を載せる。
このソフトウェアは、 Apache 2.0ライセンスで配布されている製作物が含まれています。
2. ソースファイルに以下を追記する。(XXXXXXの箇所は隠しました。)
/*
* Copyright (C) 2013 XXXXXXXXX
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

他にもやることあるかもしれないですが、このくらいで。

2013年12月14日土曜日

Androidのアプリ開発におけるStringの注意点

なんとなく普段Javaを書く感覚で開発してたところ、Eclipseに出ていたWarningが気になった。

以下、出力された渓谷
Provides more information about this issue.
Calling String#toLowerCase() or #toUpperCase()
 without specifying an explicit locale is a common
 source of bugs. The reason for that is that those
 methods will use the current locale on the user's
 device, and even though the code appears to work
 correctly when you are developing the app, it will fail
 in some locales. For example, in the Turkish locale,
 the uppercase replacement for i is not I.
If you want the methods to just perform ASCII
 replacement, for example to convert an enum name,
 call String#toUpperCase(Locale.US) instead. If you
 really want to use the current locale, call
 String#toUpperCase(Locale.getDefault()) instead.


詳細メッセージを表示してみた。

URL書いてあったので移動(ここ)。

たぶん、文字列を扱う際に英語以外の言語に注意しろと言っていると思う。
トルコ文字の"i"と”I"は違うんだ!って書いてあった。
他の事例はわからんけど、toUpperCaseとか文字列変換を気軽にやると痛い目に会うよということらしい。
USはたくさん使ってる人いるし、使いやすい。みたいなことが書いてあってすごく適当な仕様だとおもった。

普段使う文には大丈夫なんだろうけど、Locale.USをいつも指定すれば、平気かなぁなんて考えてる。

Warningが減ったので気分はすこしすっきり。

2013年11月23日土曜日

SO_KEEPALIVEの設定はデフォルトで有効になっててほしい

プロセス間で通信を行うアプリケーションを作成した場合、ちょっと考えを怠ると、無通信な状態で応答を待ち続けてしまうことがある。

趣味で作っていたらすぐ直せばいいんだろうけど、そうも行かない場合もある。
そんなとき、ファイアウォールとかプロキシサーバとかが無通信状態のコネクションをさくっと切断してくれるので、一定時間経過すると必ず失敗する状態になってしまう。

一般的に、無通信状態は良くないので、サーバ側が応答無かった場合、リソースの開放の意味を含めてコネクションを切断する機能がOSに備わってたりする。

keepaliveはその無応答状態を検知して接続先に応答確認を行ってくれる。
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/tcp.7.html

何度も読んだり、検索したりしてkeepaliveってなんだろうと考えてたんだけど
少なくとも無通信状態を検出してコネクションを切断する奴らからコネクションを守る機能ではないと思った。

でも、そういう使い方もできるなぁと。
ちなみに、ソケット作成時にSO_KEEPALIVEをオプションとして有効にしないとこの機能は使われないので、誤ってサーバが無応答になったらクライアントも無応答に。。悲惨だ。。

2013年11月17日日曜日

SSID毎の通信量を確認したいため、Androidアプリを作りました。

GL04PにOCNのSIMを指して一ヶ月くらいが経過しました。
通信量は足りていると思うのですが、本当に十分かどうかを確認したいことと、
利用の抑制のため、通信量を確認したいと思ってました。

OCNのエントリーDでは、どこを探しても現在の通信量を表示するページはありませんでした。

そこで、こんなアプリを作成してみました。
あくまで通信量の目安ですが、通信量を把握することができます。

突貫で作成したため、昨日は殆ど無いですが、一月分の合計が見れればいいかなと。

Wi-Fi通信量 監視ツール

モバイルデータ通信をOFFにしてパケット代を節約しようとしている人には通信量の確認としてはいいのではと思います。


追加:2013年12月22日
FileDir.comに追加されたと連絡がありました。海外のサイトなので日本にはあまり関係ないですが、掲載していただいたのでリンクを張ります。
Download Wi-Fi traffic counter tool / Android

2013年11月12日火曜日

OCN モバイル ONEの通信量を知りたい。

GL04PとOCNのSIMカードを利用してから3週間くらい経過しました。
使用感覚としては、容量の上限である1日30MBを超えたあたりから速度が落ちるためか、だいぶ待たされる感じがします。

ただし、通信状況が悪いためか、30MBを超えたためかは判断が難しく、どちらの影響でWebページの読み込みが遅いのかはわかっていません。

Wi-FiのSSID毎の使用量を確認することができれば、自分に必要な通信量が見えてくるかもしれないですが。。。
1ヶ月で1GBあればいいのか、1日30MBあればいいのか。データがないので判断できません。

個人的な感想ですが、携帯のキャリアへ支払うパケット定額の料金を支払うくらいなら、ちょっとくらい通信が不便でも十分使えると思ってます。

気になるのは、どのプランが自分にとって最適なのか。です。
しばらくは、1日30MBプランで十分かと思ってます。

ちなみに、十分なデータは取ってませんが、速度制限は30mbを超えたら即座に200kbpsではないようです。
超えたばかりの時は、600kbps程でしたが、40mbを超えた頃に200kbpsとなってました。

2013年10月18日金曜日

GL04PにOCN モバイル ONEのSIMカードを挿入してみた

普段の通勤圏であれば、WiMaxで問題なかったけれどちょっと出かけたり、デパートやショッピングモール内に入ると電波が届かなくなるのに不満がつのったため、OCNのモバイルONEに乗り換えてみた。

利用した端末は以下
・GL04P (イーモバイル)

GL04Pの設定は以下のページを参考にしました。
※APNの設定部分だけ、モバイルONE申し込み完了時に表示されるAPNに読み替えれば問題なく接続出来ました。

http://tech.support.ntt.com/ocn/mobile/em_entry_lte/gl04p/setup_windows.html

まだ設定したばかりですが、WiMaxに比べると速度は落ちる印象があります。
#正確な速度測定はしていません。あくまで体感です。

端末は少し大きめで、スマートフォンと同じくらいの重さに感じます。
ただ、通信をしなければスリープしてくれるというので、カバンにしまったままにできるのではと期待しています。
WiMaxの時は端末が対応していなかったので、スリープモードからの解除は必ずボタンを押す必要がありました。
そのため、いつもポケットに入れてました。

GL04Pはポケットに入れっぱなしにするには大きすぎる気がします。

2013年9月23日月曜日

ペヤング辛口 食べてみた

夜食に困って近隣のドラックストアをふらふらしていたところ、ペヤングの辛口を発見
今まで、普通のペヤングしか食べたことがなかったので興味本位で購入。

http://www.peyoung.co.jp/item/product/8

実際に食べてみました。

感想としては、正直ここまで辛いとは思ってませんでした。
あまりの辛さに口を水でゆすぎましたが対処できず、インターネットで検索して牛乳を飲むと良いというので試したところ驚くほど辛さが引いていきました。

完全には辛さが引きませんでしたが、耐えられる程度にはなりました(汗)


2013年9月17日火曜日

iMac 2012 と ロジテックDVD( LDR-PMG8U3LSV)を接続してみた

iMacにDVDドライブが欲しかったので、安めのドライブとしてLogitec社のDVDドライブを購入しました。
接続してみたところ、正常に動作せずまともにDVD再生などできませんでした。


環境
OS : OS X 10.8.5
筐体:  iMac 27 inch ( 2012 )

接続対象
DVDドライブ: Logitec社 LDR-PMG8U3LSV


試したこと
まず、バスパワーで動作するとの事だったので、DVDドライブとiMacをUSBのみで接続しました。
Mac接続後は軽快に動作しているように見えましたが、「故障箇所をスキップします」のようなメッセージが頻繁に画面に表示され、しまいにはDVD Player(Mac標準のソフト)が強制終了しました。

なんどかDVDを変更し、試してみましたがうまくいかないため、Windowsへ接続(詳細は省略)
Windowsではなんの問題もなくバスパワー単体で動作するため、DVDドライブの初期不良の疑いを排除しました。
また、バスパワーだけで動作することから、iMacからの供給電力が不足しているのではないかと推測。

純正ではないですが、BUFFALO製の外部電源供給ACアダプタ AC-DC5-BKを接続した状態で再度挑戦。

しかしながら、状況は改善せず。

旧式のMacbookに上記アダプタを接続した状態では、動作しているように見えたので、iMacを疑い、Appleのサポートへ連絡。

いっとお決まりの手順であろう、以下の内容を実施させられるも、効果なし。
・SMCのリセット
・起動時にシフトキーを押した状態での設定リセット
・OS再インストール

結局Mac純正の USB SuperDriveを購入することに。
現在動作確認中ですが、あれだけ「故障」とか表示されてたDVDがなんの問題もなく動作している。

なんか悔しい。

2013年8月19日月曜日

ScheduledExecutorServiceが停止した。

なんの前触れもなく、ScheduledExecutorServiceが停止してしまった。
実行のため、invokeしていたThreadクラスに問題があったのかどうか調べたけど、そうでも無さそう。

そんなとき、ScheduledExecutorServiceが動かなくなるという現象について書かれた記事を見つけた。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7139684

どうやらスレッドを起動するために利用している OSレベルの処理でシグナル受信に失敗し、起動するはずのスレッドが起動しないままになってしまっているようだ。
しかも、一度失敗すると二度と起動しないという。。。。。


みたところ、回避策は提示されていないので、この現象にはまったら、プロセスの再起動だろうか。
shutdown()と、submit()で、復旧できるといいんだけど。

2013年8月17日土曜日

new Date().getTime() と System.currentTimeMillis() どちらが早いのか を調べてみた

先ほどの投稿から、ちょっと気になったので調べてみた。
大したことではないですけど、時間を取得したり計測するのに、よく使うんじゃないかと思いますが、
どちらが高速なのか。が気になって調べてみました。

結果から言うと、System.currentTimeMillis()の方が倍高速です。
どちらも1000000回実行した時の合計時間です。

new Date().getTime()         188ms
System.currentTimeMillis()     91ms

インスタンス生成に時間がかかるのでしょうかね。
1000000回なので、どっちを使おうがあまり関係ない位だと思いますが、どちらかというと軽いのでSystem.currentTimeMills()を使ったほうが余計なことしないのでいいかなと。思いました。

計測環境を記載していないのは、実効速度を調べたかったのではなく、どちらが早いかを確認したかっただけなので載せてないです。マシンによって差があるというのであれば考えますが.....
OSはWindows Vistaです。

ソースは汚いですが、以下です。
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
public class PerformanceSample {
/**
* @param args
*/
public static void main(String[] args) {
ExecuterIf process = null;
// NewDate
process = new NewDate();
PerformanceMesure.execute(process);
// currentTimeMillis
process = new SystemCurrent();
PerformanceMesure.execute(process);
}
}
class NewDate implements ExecuterIf{
@Override
public void exec(){
long time = new Date().getTime();
}
}
class SystemCurrent implements ExecuterIf{
@Override
public void exec(){
long time = System.currentTimeMillis();
}
}
interface ExecuterIf{
public void exec();
}
class PerformanceMesure{
public static void execute(ExecuterIf process){
long start = 0L;
long end = 0L;
long elapse = 0L;
start = System.currentTimeMillis();
for(int m = 0 ; m  < 1000000; m ++)
process.exec();
end = System.currentTimeMillis();
elapse = end - start;
System.out.println(elapse + "ms");
}
}

Exceptionを利用したループのハンドリング性能

Effective Java の Item57 にあるwhileループのやってはいけない例について調べてみました。
たぶん、こんな使い方する人はいないんだと思いますが、悪いことしかないってことを確かめたかったので。

調べたのは性能です。ソースを見るとわかりますが、エラーなのかループの終了なのか判断できないため、使う人はいないと思います。

以下の2つの性能を比較しました。
例1)
// Horrible abuse of exceptions. Don't ever do this!
try{
  int i = 0;
  while(true)
    range[i++].climb();
}catch{ArrayIndexOutOfBoundsException e{
}
例2)
int i = 0;
while(range. length > i)
  range[i++].climb();
配列のサイズは100、試行回数は1万回。累積時間(ms)を計測した結果です。

例1  230ms
例2  2ms

こんなに差があるとは思ってなかったですが、100倍違います。

EffectiveJavaでは、現在のJVMを利用した場合は遅い。とか書いてありましたが、昔は早かったのでしょうか。
そうだとすると、悪い書き方をしたソースがあるかもしれないですよね....
この例だけでは言えませんが、正当な作り方をしておくと、のちのち性能が上がるかも知れない。
ということでしょうか。
その場しのぎのコーディングはやめようと思います。