Java Advent Calendar 2011 の9日目を担当する事になりました冨永です。
8月末をもってタイレルシステムズを退社しまして、現在お仕事募集中です。

 今回の記事は去年に引き続きJoda-TImeの紹介です。

 Javaの標準APIでは日付だけ、時間だけを扱う事はできませんが、Joda-TImeでは日付だけ、時間だけを扱う事ができます。
また、日付情報と時間情報から日時情報を作成する事も可能です。

import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;


public class JodaSample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 日付のみ
		LocalDate date = new LocalDate();
		System.out.println("date: " + date.toString());
		// 時間のみ
		LocalTime time = new LocalTime();
		System.out.println("time: " + time.toString());
		// 日付情報と時間情報から日時情報を作成
		DateTime datetime = date.toDateTime(time);
		System.out.println("datetime: " + datetime.toString());
	}

}

 出力は下記のようになります。

date: 2011-12-09
time: 14:39:18.913
datetime: 2011-12-09T14:39:18.913+09:00

 日付のみの情報はLocalDate、時間のみの情報はLocalTimeを使います。
LocalDateとLocalTimeはその性質上、TimeZoneと関連付いていないので注意してください。

 Java7では見送られてしまったJoda-Timeを参考にした新しいDate/Time APIがJava8には搭載されるそうなので、楽しみですね。

 お次のJava Advent Calendar 2011は10日目、担当はykubotaさんになります。
 本日付けで株式会社タイレルシステムズに正式に入社しました。
個人事業の方は8月いっぱいで廃業になります。

 心配してくださった方や、迷惑をおかけした方にこの場を借りて謝辞と御礼を述べさせていただきます。
 google-ime-skkが素晴らしく便利なので、Windowsサービス化する事にした。
意外とつまずいたので、忘れないように下記にその手続きを書いておく。
なお、ActiveRubyが導入されており、google-ime-skkが正常に動作する前提で話を進める。

  1. win32-serviceのインストール

    こちらの記事を参考にインストール。 ここが一番つまずいた。
    「nmakeがコマンドとして認識されていないだの」「winsock2.hが見つからない」と言われてなかなか上手くいかなかったが、Microsoft Visual C++ 2010 ExpressをインストールしてVisual Studio コマンド プロンプト (2010)から実行であっさり成功した。
  2. サービスに登録するRubyスクリプトの作成

    google-ime-skkファイルを参考に下記の内容のスクリプトを作成
    #!D:/bin/ruby-1.8/bin/ruby.exe -Ku
    #
    # This file was generated by RubyGems.
    #
    # The application 'google-ime-skk' is installed as part of a gem, and
    # this file is here to facilitate running it.
    #
    
    require 'rubygems'
    require 'win32/daemon'
    include Win32
    
    class Daemon
      def service_main
    	version = ">= 0"
    
    	gem 'google-ime-skk', version
    	load Gem.bin_path('google-ime-skk', 'google-ime-skk', version)
      end
    
      def service_stop
        exit!
      end
    end
    
    Daemon.mainloop
  3. スクリプトをサービスに登録

    2.で作成したクリプトを上記の記事を参考にサービスに登録。
 巷で話題の"sleep sort"をAS3で実装してみた。

クリップボード01.jpgクリップボード02.jpg

 なけなしの収入をはたいてXperia arcを購入したので、さっそくAdobe AIR for Androidで作ってみました。
作った物は「音声を指定位置から再生する機能」が付与されているだけのごく単純なアラームアプリ。

 分かった事は、

  • 単純なアプリケーションであれば、少なくともXperia arc上での実行速度は問題ない
  • PC向けのAdobe AIRアプリケーションのコードぼそのままで問題なく動く
  • UIライブラリ「MadComponents」を試してみたが、意外と使い易い

 正直、かなりの好感触。

 実行速度については充分な検証が必要だけれども、ActionScriptは物理演算ライブラリが充実しているので、Adobe AIRで作る事で少なくともPCとAndroid端末間でのソーシャルアプリの移植が容易になりそう。

 これでAdobe AIR for iOSが期待通りの物であるならさらにAndroid端末とiPhone間でのソーシャルアプリの移植が楽になり、事実上ソーシャルアプリのマルチプラットフォーム化が可能に。 これからに是非期待したい。
 java-jaの末席を汚すSeacolorこと冨永和志と申します。 この度は25日分の担当をする事になりました。 よろしくお願い致します。

 堅苦しい挨拶はここまでにしまして、本題に入ります。

 今回の記事で取り扱うJoda-Timeライブラリの概要については、


 を、ご参照ください。

 今回私が書くのは、上記のマイコミジャーナルの記事には書かれていない期間情報の取扱についてです。

 Joda-Timeライブラリで期間情報を扱いたい場合、PeriodとIntervalDurationの2つのクラスがあります。 IntervalDurationは「期間の経過情報」で、Periodは単純に「期間の日時の比較情報」にあたります。

import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Interval;
import org.joda.time.Period;


public class JodaSample {

/**
* @param args
*/
public static void main(String[] args) {
DateTime startDT = new DateTime();
DateTime endDT = startDT.plusDays(1).plusMillis(1);
Interval interval = new Interval(startDT, endDT);
Duration duration = interval.toDuration();
System.out.println("duration: " + duration.getMillis());
Period period = interval.toPeriod();
System.out.println("period: " + period.getMillis());
}

}

 上記のコードでは、日時情報を作成し、その日時から1日と1ミリ秒だけ進めた日時情報をもうひとつ作成して、二つの日時情報から期間情報を作成してミリ秒を出力しています。 結果は下記の通りになります。

duration: 86400001
period: 1
 Intervalが経過ミリ秒数を出力したのに対し、Periodは「日時情報におけるミリ秒の単位」の増減値を出力しました。

 Joda-Timeは日時情報を取り扱う際、大変便利で有用なライブラリなのでこれからもっと日本語の情報が増えると良いなと思います。

 さて、次のJava Advent Calendar -ja 2010は26日目、担当はshuji_w6eさんです。

 2011.10.24 追記
 IntervalとDurationを間違えていたので修正。
 初めまして、冨永和志と申します。
この度、大変危険な条例案が可決の危機にある旨、
一国民として憂いを覚え、メールを差し上げました。

 件の青少年健全育成条例改正案は前案の時点で大変危険な代物であり、
国民の思想の自由、表現の自由といった基本的人権に踏み躙るものであったにも
かかわらず、より適用範囲を広くし、かつ相変わらず曖昧な基準で、広く創作を
取締る事が許される修正案が再び提出され、あまつさえ可決されようとしています。

 そもそも、強姦や児童姦淫をテーマとした創作により性犯罪が増加し、子ども
の人権が
脅かされるという主張自体、「無根拠で乱暴な主張である」と、幾度となく指摘
されているにも
関わらず、行政が身勝手に口を出してはならない筈の「倫理」を盾に、反論を許さず
強引に指摘を殺そうとしている様は、正に「創作者の人権侵害」の構図です。

 表現はすべからく自由であるとは、私も思ってはおりません。
しかし、憲法第18条、憲法第31条に定める通り、刑事罰は合理的且つ
必要最小限の範囲に留める責務が、全ての国民にはあります。
 一部の人間の一部の勝手な倫理観により、全ての創作者の自由が侵害される
青少年健全育成条例改正案修正稿に、私は反対します。
(以下住所・氏名)
 whonyは「Wassr用のP3が欲しい!」という動機で開発を始めたけれど、実装がAdobe Flex+Adobe AIRなのには理由がある。

 その理由は、

  • Adobe Flexによる本格的なWebアプリケーションの実践
  • Adobe AIRの実力の計測
  • Adobe FlexでFlashと反対の方向性の簡素なGUIの実装実験
 以上の3点。

 そして分かった事は、

  • Adobe FlexもAdobe AIRもまだまだ発展途上(コンパイラの最適化がいまひとつだったりバグがあったり)
  • ActionScript3のイベントモデルはメモリリークを起こしやすい(removeEventListener()の呼び忘れ)
  • Adobe Flexのコントロールコンポーネントは拡張し辛い(内部が密結合すぎる)
  • Adobe AIRはマルチプラットフォームは信用してはいけない(MacOSだけ、Linuxだけの不具合があったりする)
  • Adobe FlexはあくまでFlashの延長であり、簡素なGUIを実装しようとすると逆に手間がかかる
  • Flex BuilderによるAdobe AIRアプリケーションの作成は非常に簡単
 以上の6点。

 つまり、P3のようなJavaで作られたソフトウェアの真似は致命的に向いていないという事。

 そして、Adobe Flex+Adobe AIRで作るのであれば気に留めておくべき事は、

  • 速度に拘るのであれば他を当たるべき。 どうしてもAdobe Flexでやりたいなら最適化は自前でやる必要がある (http://actionscript.g.hatena.ne.jp/ConquestArrow/20070621/1182359767)
  • addEventListener()は使わないで済むようレームワークを実装すべき。 もしくはそうめんを使う(http://www.libspark.org/htdocs/as3/thread-files/document/)
  • コントロールを拡張したい場合、低機能であれば自前で別コンポーネントを作るべき。 あくまで継承したいのであれば、MXMLではなくActionScriptで作りcommitProperties()とupdateDisplayList()とmeasure()を適切にoverrideする
  • プラットフォームに依存する不具合は、自前で実装するかライブラリを使う
  • 簡素なコントロールを使いたいなら自前で実装。 もしくはせっかくのFlashなのだから表現力を活かすべき
 以上の5点。 要するに、

「あくまで発展途上という事を意識すべき」

 と、いうこと。

 Adobe Flexはオープンソース化され開発が加速しているが、バグの元締めである肝心のFlash Player APIライブラリがクローズドソースなので不具合の解消は鈍足。 いいかげん公開してほしい。
 ただ、不具合の多くは実装で回避できたり別に拘らなくても良いような些細なものだったりするので、臨機応変に対処できるならば何とかなる。

 Flash特有の表現力を用いてWebアプリケーションを作りたいのであれば、決して悪い選択では無いと思われる。


 以上、次回はコントロールの拡張におけるTips。
これだと入り口から出口までがいけないのでエラーを出したい。
でも俺は「入り口から出口までが繋がっていない」と言う判定がどうしても思いつかない。
地球記 プログラマちょっと来て
こちらのサイトが参考になるかもしれません。

迷路自動生成アルゴリズム
http://www5d.biglobe.ne.jp/~stssk/maze/make.html

要するに「空白の隣に空白」がスタートからゴールまで続いていれば良いわけなので、

1.スタートとゴールの空白の位置を把握
2.スタートの空白から「空白の隣に空白があるか?」を繰り返し判定
3.「ゴールの空白に繋ったか?」を判定

で、如何でしょう。

whonyについて

| | コメント(0) | トラックバック(0)
Whony はまだ test 版です。
ここに書かれていることは将来変更される危険性があります。

ヒトコトを選択し、Enterキー(もしくはダブルクリック)で返信モードになります。
返信モードは、返信モード中に表示されるアイコンをクリックすることで解除されます。

画像ファイルの選択は入力域にドラッグしたファイルをドロップすることでも可能です。
タブバー左端のアイコンをクリックするとタブをカスタマイズすることができます。
タブバー右端のアイコンをクリックするとタブの一覧を表示します。

WhonyはP3に準じたキーボードショートカットが用意されています。
  • Ctrl+Q プログラムの終了
  • Ctrl+. 表示Tab切替 右へ
  • Ctrl+, 表示Tab切替 左へ
  • Ctrl+I 入力域にフォーカス移動
  • Ctrl+L リストにフォーカス移動
  • Ctrl+O リスト先頭にカーソル移動
  • Ctrl+T みんなのヒトコトを取得する
  • Ctrl+R 返信を取得する
  • Ctrl+G 選択/返信IDの発言を検索
  • Ctrl+F添付する画像を選択
  • 0 リストのトップに移動
  • 1から5 発言者を番号の抽出タブに追加
  • A 返信先ユーザのWassrHomeを開く
  • B ヒトコト中のURLをブラウザで開く
  • C ヒトコトのページをブラウザで開く
  • F ヒトコトにイイネ!をつける
  • G 発言者の発言を検索して一覧表示する
  • H 発言者のWassrHomeを開く
  • N 返信先ユーザの発言を検索して一覧表示する
  • P 添付された画像を拡大表示する

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたい

あわせて読みたいブログパーツ