2013年7月26日金曜日

[Tizen]UbuntuにTizenをインストールする際に「java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.swt.widgets.Display」というエラーが出た場合

このエントリーをはてなブックマークに追加 はてなブックマーク - [Tizen]UbuntuにTizenをインストールする際に「java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.swt.widgets.Display」というエラーが出た場合
Ubuntu12.10にTizen2.2をインストールしようとしたら、binファイル実行時に
java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.swt.widgets.Display
というエラーが出てインストールに失敗した。
この場合、エラーの通りSWTのクラスが見つけられていないのでswt.jarをJavaのlib/extに配置すればOK。

SWTのサイトからLinux用のZIPファイルをダウンロードするとswt.jarがあるのでこちらを配置。Java7の場合は以下に配置した。
/usr/lib/jvm/java-7oracle/jre/lib/ext
上記で解決する。

2013年7月14日日曜日

[Tizen]TizenでHosted Web applicationsを作ってみる

このエントリーをはてなブックマークに追加 はてなブックマーク - [Tizen]TizenでHosted Web applicationsを作ってみる

Tizenでは大きく分けて以下の2つのWebアプリの提供方法があります。

  • Packaged Web applications
  • Hosted Web applications

ざっくりいうとPackaged Web applicationsはアプリ内(.wgt)にHTML,CSS,JavaScriptを配置して動作するのに対し、Hosted Web applicationsでは外部のサーバーにHTML,CSS,JavaScriptなどを配置させ、アプリから上記のサーバーにアクセスする事で動作します。

Hosted Web applicationsは上記で記載したようにアプリを起動した後にどのURLを表示させるかをconfig.xmlに以下のように記載します。

<tizen:content src="http://your_hosted_app_url"/>

your_hosted_app_urlは適宜変更して下さい。 これだけでOKです。

で、動作確認なのですが、Tizen Web SimulatorだとTizenSDK2.1では動作しません!

なので、Tizenのエミュレーターで動作確認しましょう! こちらだと上記のやり方でアプリ起動後、指定したURLを表示する挙動が確認できます。

2013年7月13日土曜日

Tizen Web Application Checkerを試してみた

このエントリーをはてなブックマークに追加 はてなブックマーク - Tizen Web Application Checkerを試してみた

Tizen Web Application Checkerなるものがあると知った。

TizenのWebアプリケーションとして作成したものがルールに従っているかチェックしてくれるツール、と。

とりあえず試してみる。

公式

Tizen Web Application Checker User Guide

対応OS

  • Linux(Ubuntu)
  • Windows
  • MacOSX

今回はMacOSXで確認。

準備

Nodeのv0.8より大きいバージョンのものをインストールしておけと。 WindowsだとNode入れるときにPythonが必要みたいでそこは注意しろと。

でパスを通しておけと。

$node -v
v0.10.11

こんな感じでパスが通っていればOK。

ダウンロード(インストール)

公式にリンクがあります。(リンク切れしていれば公式から落としてください)

Tizen Web Application Checker

ZIPがダウンロードできるので、解凍。

解凍したフォルダ名をtizen-web-app-checkerとします。

以下でバージョンが取得できるか確認。(tizen-web-app-checkerのパスは適宜変更)

$node ~/tizen-web-app-checker/bin/tizen-web-app-checker.js -V
1.0

使ってみる

TizenIDEからサンプルで作成出来るWebアプリでどんな感じなるか、確認。 Webアプリケーションは作成しビルドすれば、.wgtというファイルが出来るのでそれを利用します。 利用方法は以下のようにします。単純にさっきのコマンドの引数にwgtのパスを渡せばOK。

$node ~/tizen-web-app-checker/bin/tizen-web-app-checker.js ~/tizen_workspace/TizenWebApp/TizenWebApp.wgt 

start checking according to Tizen 2.1 compliance specification
Package checker started...
 Checker finished.
Security checker started...
Generating html report...
All tests completed.
Results report: /Users/toshihirock/tizen-web-app-checker/TizenWebApp.html

最後の行でレポート出力結果のHTMLをどこに出力したか表示されるので開きます。(tizen-web-app-checker配下に出力されるっぽい)

$open /Users/toshihirock/tizen-web-app-checker/TizenWebApp.html 

今回の奴はとくにNGのポイントはなく成功。

jQueryMobileのサンプルアプリ作ってこのツールで確認するとこんな感じでエラーとか検出してくれました。

2013年7月10日水曜日

「Tizenネイティブアプリ開発ことはじめ」というタイトルにて勉強会で発表してきました

このエントリーをはてなブックマークに追加 はてなブックマーク - 「Tizenネイティブアプリ開発ことはじめ」というタイトルにて勉強会で発表してきました

タイトルの通り、Tizenネイティブアプリ開発ことはじめという事でWebプラットフォーム勉強会にて発表させて頂きました!


あまり人前で話すのは得意でなく、当日も色々操作ミスしたりしてしまったのですが、助けてくださる方がいらっしゃって何とか終える事が出来ました。

半分勢いもあって応募したのですが、良い経験になりましたっ!

2013年7月2日火曜日

[Tizen]TizenIDEでDoxygenコメントの補完

このエントリーをはてなブックマークに追加 はてなブックマーク - [Tizen]TizenIDEでDoxygenコメントの補完
デフォルト設定のTizenIDEだとDoxygenコメントの補完がされない。(メソッドで/**とタイプした際に@param,@returnなどの補完が行われない)

上記についてはPluginなしで以下の設定変更で対応可能。

  • Preferences→c++→Editor→Documentation tool commentsで選択出来るセレクトボックスでDoxygenを選択。


以上で完了っす。

2013年6月24日月曜日

[Tizen]Tizenネイティブアプリ開発でのUnitテストの実施

このエントリーをはてなブックマークに追加 はてなブックマーク - [Tizen]Tizenネイティブアプリ開発でのUnitテストの実施

Tizenネイティブアプリ開発時のUnitテストについて試してみたのでメモ。

Tizenのネイティブアプリ開発ではC++での開発となりますが、テストはどうするのかというと標準でGoogle C++ Testing Frameworkが同梱されており、公式ドキュメントでもこれを使うような記述があるのでこれを利用するのが一般的ではないかと思われます。

Unit Test Tool

上記リンクからTizen Native App Programing→IDE and Tools→Unit Test Toolと辿るとTizen公式ドキュメントが確認できます。

今回の例ではサンプルアプリにクラスを追加し、そのクラスに対してテストを行ってみます。 手順は以下の通りです。

  1. テスト対象プロジェクト作成(サンプルアプリ)
  2. テストプロジェクトの作成
  3. テストプロジェクトの編集
  4. テストプロジェクトの実行

なお、公式ドキュメントにテストの項目の欄で以下の記述があるため、注意が必要ではあります。

  • The unit test tool is designed to support only functional testing.
  • The unit test tool is not an OSP-based application. Therefore, certain methods related to the OSP application framework, such as the methods of the Tizen::Base::String class, can behave incorrectly.

超適当な意訳

  • functionテストのみがサポートですよー。
  • このUnit Test toolはTizen用のテストツールって訳じゃないよ。なので、Tizen::Base::Stringクラスとかいくつかのメソッドなどは誤った動作するかと思われます。

ま、まじでか。 とか思って試しにTizenのStringを利用したテストコード書いてみましたが、一応大丈夫でした。 保証はできないってことか、な。

確認環境など

  • MacOSX 10.8.4
  • TizenSDK2.1(IDEやSDKなどはインストール済み)

1.テスト対象プロジェクト作成(サンプルアプリ)

まずはテスト対象のHellWorldプロジェクトをTizenIDEを利用して作成します。

  • File→New→Others
  • Tizen→Tizen Native Project
  • Templateタブを選択→Tizen Native→Form-based Application→With SceneManagerを選択。Project Nameは任意の名前でOKですが、本例ではHelloWorldとします。

これでとりあえずプロジェクトができます。

次にUtilクラスを追加します。

とりあえずこんな感じでメソッドを2つ作ってみました。(C++初心者なので書き方がまずいかもしれませんが、とりあえず許して下さい。。。)

Util.h

#ifndef UTIL_H_
#define UTIL_H_
#include <FBase.h>

class Util {
public:
    int Sum(int x, int y) ;
    void AppendWorld(Tizen::Base::String& base);
};


#endif /* UTIL_H_ */

Util.cpp

#include "Util.h"

int Util::Sum(int x, int y) {
    return x + y;
}

void Util::AppendWorld(Tizen::Base::String& base) {
    base.Append("World!");
}

Sum関数では引数に渡した2つの引数の加算を行った結果を返却します。

AppendWorld関数では引数に渡したTizen::Base::Stringクラスの参照引数を利用してAppendメソッドを呼び出して、引数に渡された文字列の末尾に“World!”という文字列を追加します。

今回は上記2つのメソッドに対してそれぞれテストコードを書いてみます。

2.テストプロジェクトの作成

Tizenでテストを行う場合、テスト対象のプロジェクトとは別に新規にテスト用プロジェクトを作成する必要があるようです。 以下の方法で作成を行います。

  • File→New→Others
  • Tizen→Tizen Native Unit Test Project
  • Select the Tizen Project for testの箇所でHelloWorldを選択。

これでHelloWorldプロジェクのテストプロジェクトの完成です。 デフォルトで以下のようなテンプレートテストコードが作成されます。

HelloWorldTest.cpp

include "tizenx.h"
#include "Util.h"
#include "HelloWorldPanelFactory.h"
#include "HelloWorldMainForm.h"
#include "HelloWorldFrame.h"
#include "HelloWorldFormFactory.h"
#include "HelloWorld.h"
#include "AppResourceId.h"

#include <gtest/gtest.h>

class TestSuite : public testing::Test
{
    protected:
    // virtual void SetUp() will be called before each test is run.
    // You should define it if you need to initialize the variables.
    // Otherwise, you don't have to provide it.
    virtual void SetUp()
    {

    }
    // virtual void TearDown() will be called after each test is run.
    // You should define it if there is cleanup work to do.
    // Otherwise, you don't have to provide it.
    virtual void TearDown()
    {

    }
};

// When you have a test fixture, you define a test using TEST_F.
// Otherwise, you define a test using TEST.
TEST_F(TestSuite, test01)
{
    ASSERT_TRUE(true);
}

TEST_F(TestSuite, test02)
{
    ASSERT_TRUE(false);
}

先ほど作成したUtilクラスのヘッダファイルもincludeされているのでテストコードが追加できそうです。

3.テストプロジェクトの編集

HelloWorldTest.cppにSum関数、AppendWorld関数のテストコードに以下のように追加(編集)します。 なお、test02はデフォルトだと実行するとNGとなってしまうので、こちらも変更します。

TEST_F(TestSuite, test02)
{
    ASSERT_TRUE(true);
}
TEST_F(TestSuite, test03)
{
    Util *p = new Util();
    ASSERT_EQ(3, p->Sum(1, 2));
    delete p;
}

TEST_F(TestSuite, test04)
{
    Util *p = new Util();
    Tizen::Base::String hello = Tizen::Base::String("Hello");
    Tizen::Base::String helloworld = Tizen::Base::String("HelloWorld!");
    p->AppendWorld(hello);

    ASSERT_EQ(helloworld, hello);
    delete p;
}

test03ではSum関数の引数に1と2を渡し、結果で3がかえってくる事を確認しています。

test04ではHelloという文字列のTizen::Base::Stringクラスを作成し、AppendWorld関数を利用する事で“HelloWorld!”という文字列になる事を確認しています。

なお、利用しているGoogle C++ Testing Frameworkについては以下の翻訳サイトを参考にさせて頂きました。(まだ全然読めてないですが)

Google C++ Testing Frameworkをはじめよう

4.テストプロジェクトの実行

いよいよテストを実行します。 テストの実行及び結果の確認はTizenIDEで実施できます。

テスト対象のプロジェクトのビルドをしてからテストコードの存在するプロジェクトをビルドします。

  • HelloWorld→右クリック→Build Project
  • HelloWorldTest→右クリック→Build Project

なお、先にHelloWorldTestの方をビルドすると以下のような先にテストする方のプロジェクトしろよ的なメッセージが出ます。その場合、メッセージの通り先にテスト対象のビルドを実施し、その後再度テストプロジェクトのビルドをすればOKです。

次にエミュレーターを起動します。 個人的にはエミュレーターなしでやりたかったのですが、IDEから実行するときは必要だったのでやっておきます。

さてこれで準備がすべて終わったのでいよいよテストを実行します。

  • HelloWorldTest→右クリック→Run As→Tizen Native Unit Test Application

これで実行されるのでしばし待ちます。

結果はIDE上のTest Resultで確認できます。

また、上記左にあるTest Exploerを利用すると特定のテストコードのみの実行ということも可能です。

Tips

設定を行う事で以下が可能なようですが未確認。

  • HelloWorldTest→右クリック→Run As→Run Configurations

以下設定可能項目。
  • Run Disabled Tests
  • Shuffle Tests
  • Don’t Print Elapsed Time
  • Generate and XML Report

Jenkinsとかとも連携さたいので今後はCLIからの実施方法なども確認したい。

2013年6月17日月曜日

[Tizen]Tizenネイティブアプリのビルドでccacheを利用してみる

このエントリーをはてなブックマークに追加 はてなブックマーク - [Tizen]Tizenネイティブアプリのビルドでccacheを利用してみる

前エントリーでC++の平行ビルドのやり方について書きましたが、もう一つのコンパイラキャッシュを利用してビルド時間を短縮する方法を記載します。具体的にはccahceというツールを利用します。 なお、利用するのがキャッシュなので1回目のビルドは早くならないみたいです。ご了承下さい。

また作業実施にあたり、以下を参考にさせていただきました。

ビルドの待ち時間を減らす - ツール編

ccacheのインストール

ccacheをインストールします。 Macの場合にはhomebrewでインストールできます。Windowsの場合、ビルドするための環境(cygwinなど)が必要なようです。。。なお、こちらが公式サイトとなります。

$brew install ccache

Ubuntuなら以下でも大丈夫なようです。(確認はしてません)

$sudo apt-get install ccache

後で利用するのでパスも確認します。

$which ccache
/usr/local/bin/ccache

ccacheの利用

TizenのC++コンパイラはclang++というのを使っているみたいで、そのコマンドを利用する際にccacheも利用してね、という設定を行います。

  • 対象のプロジェクトで右クリック→Properties

  • C/C++ BuildでGenerate Makefilesにチェックが入っている事を確認

  • Settings→C++ Compiler

Commandの箇所を変更したいのですが、変更しても反映されないので(バグか?)ちょっと微妙な気もしますが、Command line patternの箇所を変更します。

  • 変更前→${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
  • 変更後→/usr/local/bin/ccache clang++ ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

また、上記だけでなくC++ Linkerも同じように変更します。

  • 変更前→${COMMAND} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} ${FLAGS}
  • 変更後→/usr/local/bin/ccache clang++ ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} ${FLAGS}

ちょっと、いやかなりださい気もしますが、commandの箇所が変更できないので仕方ない。。。

ビルドしてみる

対象のプロジェクトを右クリックしてビルドしてみます。 で、Consoleで上記設定が反映されているかを確認します。

/usr/local/bin/ccache clang++ -I"pch" -D_DEBUG ...(以下略)

上記の通り、コンパイルの箇所でccacheを利用したコマンドへの変更ができているようです。

また、以下のコマンドを実行するとどれぐらいキャッシュが有効だったかなどを確認できます。

$ ccache -s
cache directory                     /Users/toshihirock/.ccache
cache hit (direct)                    54
cache hit (preprocessed)               0
cache miss                            19
called for link                        9
files in cache                        34
cache size                          14.7 Mbytes
max cache size                       1.0 Gbytes

こんな感じで結果がでます。私はHelloWorldプログラムでの確認なのであんまり効果がないっぽいですが、大きなプロジェクトであれば、効果があるかと思っております。 実際に早くなっているかについては計測していないので分かりませんが、時間とやる気があればどこかで。