ソフトウェア・サービスの最近のブログ記事

ご挨拶

 この記事はAdobe AIR Advent Calendarの2日目なります。 担当はKazushi Tominagaでお送り致します。

 今回は私が愛用しているFlashDevelopと、非常に注目しているHaxeで、Adobe AIRアプリケーションを作る方法を書きたいと思います。 Haxeの解説はJavaScript実行環境の記事が主で、ActionScript実行環境の記事が少ないように感じたのがその理由です。

FlashDevelopって何?

 オープンソースで開発が進められている素晴らしいIDEです。 Windowsで動作します。
http://www.flashdevelop.org/

 非常に完成度が高く、私がAdobe AIRアプリケーションを作る際は主に利用しています。 詳しく知りたい方は@bkzen氏のブログを読むと良いでしょう。 最新情報が丁寧にまとめられております。

Haxeって何?

 ActionScript3に近い文法を持つトランスコンパイル言語です。
http://haxe.org/index.n?lang=jp

 ActionScript3の良いところはできるだけそのままに、強力なパターンマッチや型推論などをサポートしています。

 詳しく知りたい方は、

JSXよりHaxeがイケてる5つの理由(実践編) もしくは Real World Haxe - みずぴー日記
http://d.hatena.ne.jp/mzp/20120613/jsx

Haxe の特徴 - Haxe
http://haxe.org/doc/features

 を、読むと良いでしょう。 特に@mzp氏の記事は実際の開発に基いた有用な記事です。

FlashDevelopでHaxe AIR AS3 Projectを作ろう

 何も難しい事はありません。 FlashDevelopを導入して起動したら、新規プロジェクトを作成して下記を選ぶだけです。

2013-12-01_144933.jpg

 プロジェクトを作成したら既に実行できる状態になっています。 試しにメニューから[プロジェクト]->[プロジェクトをテスト]を選んでみましょう。

2013-12-01_145947.jpg

 実行できました! もしここでエラーが表示される場合、メニューの[プロジェクト]->[プロジェクトの設定]からプレイヤーのバージョンを下げてみてください。

 実行できる事を確認できたら、後はActionScript3でAdobe AIRアプリケーションを作る時と同じように、Haxeで書いていくだけです。 PackageApp.batを実行する事で.airに変換できます 詳しくはFlashDevelopでAIRを作る際の下ごしらえレシピなどを読むと良いでしょう。

おまけ : UIはどうするの?

 上記の@mzp氏の記事にある通り、Adobe Flexは利用できません。 記事中のAsWingが安定だと思いますが、私はHaxe UIに注目しています。

Haxe UIって何?

 Haxe用のUIコンポーネントライブラリです。
https://github.com/ianharrigan/haxeui

 Swingの移植であるAsWingと違い、Adobe Flexを元にしているらしくほぼ同じコンポーネントを持つ他、XMLで画面定義できたりするあたりもAdobe Flexと同じで、馴染んだ人には非常に使い易い造りになっています。

 正しい手続きを踏んでいる筈なのに何故かGoogle+が外部サービスに現れず、四苦八苦。


  • ドライブとドキュメント、Google カレンダー、Google トーク([コア Google Apps スイート] の下にあります)。これらのサービスのいずれかが一覧に表示されていない場合は、組織の Google Apps アカウントにそのサービスを追加する必要があります。詳細
     
  • [Picasa ウェブ アルバム]([その他のサービス] の下にあります)。[その他のサービス] セクションが表示されない場合、組織の Google Apps アカウントを新しいインフラストラクチャに移行する必要があります。詳細
     

Google+ の使用を開始する - Google Apps ヘルプ

 駄目元で関係なさそうなサービスの設定も変更してみたら、唐突に使えるようになった。

 上記のページには書かれていないが、コアサービスの「ドライブとドキュメント」も有効する必要があった。

 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さんになります。
 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間でのソーシャルアプリの移植が楽になり、事実上ソーシャルアプリのマルチプラットフォーム化が可能に。 これからに是非期待したい。

Joda-Timeで期間を扱う

| コメント()
 java-jaの末席を汚す冨永和志と申します。 この度は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を間違えていたので修正。
 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について

| コメント()
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 添付された画像を拡大表示する
Creative Commons License
このブログのライセンスは クリエイティブ・コモンズライセンス.

このアーカイブについて

このページには、過去に書かれたブログ記事のうちソフトウェア・サービスカテゴリに属しているものが含まれています。

前のカテゴリはゲームです。

次のカテゴリは雑記です。

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