TizenでGoogleMap、ルート検索

晴れ時々Tizen調査チームの千原です。こんにちは。
Tizenパッケージビルドはなかなかうまく行かないので、Tizen2.0SDKで何か出来ないかと模索した結果、WebアプリケーションとNativeアプリケーションを作成してみることにしました。
TizenのWebアプリケーションはHTML5+JavaScriptです。NativeアプリケーションはC++になります。

HTML5であれば、Google Maps JavaScript API v3が簡単に利用できるみたいです。
また、Tizenのエミュレーターにはまだ地図アプリが入っていないので、地図アプリを作成してみました!

まず一番シンプルなProjectを作成します。
Tizen Web ProjectのBasicのBlank Applicationを選択します。
Screenshot from 2013-03-27 16:30:09

index.html、style.css、main.jsを書き換えていきます。

style.css

html { height: 100% }
body { height: 100%; margin: 0; padding: 0 }

#map_canvas { height: 100% }

index.html

<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8"/>
<meta name="description" content="A Tizen Web UI FW single-page template generated by Tizen Web IDE"/>

<title>MapViewer Test</title>

<link rel="stylesheet" type="text/css" href="./css/style.css"/>

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=GOOGLE_API_KEY&sensor=true&language=ja"></script>
<script type="text/javascript" src="./js/main.js"></script>
</head>

<body onload="initialize()">
<div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>

※GOOGLE_API_KEYは個別に取得して設定する必要があります。

main.js

var map;
var markerA;
var markerB;
var imageA;
var imageB;

var directionRenderer;
var directionService;

function route() {
	// マーカーが2つあるときにルート検索
	if (markerA && markerB) {
		var request = {
				origin: markerA.getPosition(),
				destination: markerB.getPosition(),
				travelMode: google.maps.DirectionsTravelMode.DRIVING,
				unitSystem: google.maps.DirectionsUnitSystem.METRIC,
				optimizeWaypoints: true,
				avoidHighways: false,
				avoidTolls: false
		};
		directionsService.route(request, function(response, status) {
			if (google.maps.DirectionsStatus.OK == status) {
				directionsDisplay.setMap(map);
				directionsDisplay.setDirections(response);
			}
		});
	}
}

function dragAction(event) {
	route();
}

function clickAction(event) {
	// 両方のマーカーがあるときは、マーカーとルートを初期化する
	if (markerA && markerB) {
		markerA.setMap(null);
		markerA = null;
		markerB.setMap(null);
		markerB = null;
		directionsDisplay.setMap(null);
	}

	// マーカーAがあるときはマーカーBの設定
	if (markerA && !markerB) {
		var option = {
				position: event.latLng,
				draggable: true,
				map: map,
				icon: imageB
		};
		markerB = new google.maps.Marker(option);
		//マーカードラッグイベントの登録
		google.maps.event.addListener(markerB, 'dragend', dragAction);
	}
	// マーカーAの設定
	else {
		var option = {
				position: event.latLng,
				draggable: true,
				map: map,
				icon: imageA
		};
		markerA = new google.maps.Marker(option);
		//マーカードラッグイベントの登録
		google.maps.event.addListener(markerA, 'dragend', dragAction);
	}

	// ルート検索を実施
	route();
}

function initialize() {
	// 地図の生成
	var styles = [{stylers: [{hue: "#003388"}, {saturation: -40}]},
	              {
				featureType: "road", 
				elementType: "labels",
				stylers: [{visibility: "off"}]
	              },
	              {
				featureType: "road.highway",
				elementType: "geometry",
				stylers: [{saturation: -40}]
	              }];
	var styledMap = new google.maps.StyledMapType(styles, {name: "Styled Map"});
	// 初期位置は東京駅を中心に設定
	var option = {
			center: new google.maps.LatLng(35.681111, 139.766667),
			zoom: 13,
			mapTypeId: google.maps.MapTypeId.ROADMAP,
			mapTypeControl: false,
			panControl: false,
			streetViewControl: false,
			scaleControl: true
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), option);
	map.mapTypes.set('map_style', styledMap);
	map.setMapTypeId('map_style');

	// マーカーのアイコンを読み込む
	imageA = {
			url: 'WebContent/icon1.png',
			size: new google.maps.Size(32, 32),
			origin: new google.maps.Point(0, 0),
			anchor: new google.maps.Point(16, 32)
	};
	imageB = {
			url: 'WebContent/icon2.png',
			size: new google.maps.Size(32, 32),
			origin: new google.maps.Point(0, 0),
			anchor: new google.maps.Point(16, 32)
	};

	// ルート検索サービスの設定
	var polylineOption = {
			strokeColor: "#ff4422",
			strokeWeight: 5,
			strokeOpacity: 0.6
	}
	var renderOption = {
			draggable: true,
			preserveViewport: false,
			suppressMarkers: true,
			polylineOptions: polylineOption
	};
	directionsDisplay = new google.maps.DirectionsRenderer(renderOption);
	directionsService = new google.maps.DirectionsService();

	// イベントリスナー登録
	google.maps.event.addListener(map, 'click', clickAction);
}

Googleのサンプルコードを参考にして作りました。
不要なコードでエラーになっていて、ルートが表示できないところで少しハマりましたが、結構簡単に作成できました。
ルート結果から距離とか時間も取れるようなので、カスタマイズすれば実用レベルのものになりそうです!
地図のスタイルはデフォルトから変更して、青系に変えてあります。(Tizenのイメージカラーが青なので)
マーカーのアイコンも変更してあります。(猫が好きなので・・・)

Screenshot from 2013-03-27 16:13:53

ルートが蛇行しているのは、寄り道ポイントを設定しているからで、ルート検索がバグっている訳ではありません(・ω・)

Share

Tizenパッケージビルド奮闘中!(ビルド環境構築手順)

お久しぶりです。研究開発チームの千原です。
Tizen2.0 Magnoliaが先日リリースされました!
Magnoliaはモクレン(属)ですね。
Tizen1.0 Larkspurは飛燕草。
どうやら植物で攻めるようです。
次はABC順だとNなので、Nymphaeaのスイレン(属)とか?発音しにくい・・・

少し脱線してしまいましたが、現在Tizenの実動作環境を作るためにパッケージのビルドに奮闘中であります。
なかなか簡単にビルドが通らず(エラーが連発)、ゴールも見えず・・・

今回はビルド環境の構築手順についてまとめようと思います。
環境は引き続きUbuntu12.10です。

手順については、公式ヘルプページのPlatform Development Environmentを参考にしました。

 

01. 事前準備
Tizenのソースを取得するにはアカウントが必要になります。右上のREGISTERボタンから登録しましょう!
tizen_source_page

次にgerritアクセスし、作成したアカウントでログインしましょう。ログインすると次の画面になります。
tizen_gerrit_page

Gerritで行うことはアカウント情報の設定と、SSHキーの登録の2つです。

右上のSettingsからContact Informationを選択し、Full Nameを入力します。
Register New Email …を押してアカウント作成で登録したEmailアドレスを入力します。認証メールが届くので、メールに記載されたURLにアクセスすると認証完了です。
tizen_gerrit_contact

次にSSHキーの登録を行います。
まずはUbuntu上でSSHキーを作成します。<Full Name>と<Email>は上で設定したものを入力です。

ssh-keygen -t rsa -C “<Full Name> <Email>”

例: ssh-keygen -t rsa -C “Hiroyuki Chihara chihara@a-creation.jp”

~/.ssh/id_rsa.pub が生成されていれば、成功です。
~/.ssh/configを作成して以下の情報を記載します。

vi ~/.ssh/config
Host review.tizen.org
Hostname review.tizen.org
IdentityFile ~/.ssh/id_rsa
User chihara
Port 29418

Userにはアカウント名を記載します。

再びGerritに戻り、右上のSettingsからSSH Public Keysを選択します。
tizen_gerrit_sshkey

~/.ssh/id_rsa.pubの内容を丸ごとコピペしてAddを押します。

次のコマンドを実行してgitの設定を行います。<Full Name>と<Email>はGerritで設定したものを入力です。

git config --global user.name “<Full Name>”
git config --global user.email “<Email>”

ここまで設定するとsshでアクセスできるようになっています。

接続確認は以下のコマンドでできます。

ssh review.tizen.org

準備完了です!

 

02. ツールのインストール
環境構築に必要なツールをUbuntuにインストールするので、まず、Tizenのダウンロードサイトをリポジトリに追加します。

sudo apt-add-repository “deb http://download.tizen.org/tools/latest-release/Ubuntu_12.10/ /”
sudo apt-get update
sudo apt-get install gbs mic curl

gbsをインストールした後、buildを入れ直す必要があるようなので、以下の手順で再インストールします。

sudo dpkg -r --force-depends build
sudo apt-get update
sudo apt-get install build

 

03. パッケージ情報の取得
ソースを落とすにも、ビルドをするにもパッケージ名が分からないと何もできないので・・・
次のコマンドでManifestを落としてきます。
何かに使ったりはしていません。パッケージ名を知るために取得しているので、パッケージ名分かるよって方は不要かも。

git clone git://gitorious.org/tizen-toys/tizen-manifest.git

toysさんが公開されているManifestを参照しました。
ただ、リポジトリの構成が頻繁に変わったりするようなので、100%信用できないようです・・・
作ろうとしている環境が車載向けでは無いので、ivi系は要らないような気がします!
04. 参照リポジトリの設定
一度gbs buildを実行すると~/.gbs.confが作成されますので、内容を編集します。

gbs build
vi ~/.gbs.conf
[general]
tmpdir = /var/tmp
[build]
build_cmd = /usr/bin/build
build_root = /var/tmp/build-root-gbs
su-wrapper = sudo
distconf = /usr/share/gbs/tizen-1.0.conf
; optional, repos definitions
repo1.url = https://download.tizen.org/releases/latest/2.0/repos/main/armv7l/packages/
repo1.user =
repo1.passwdx =
; one more repo
repo2.url = https://download.tizen.org/releases/latest/2.0/repos/main/armv7l/packages/
repo2.user =
repo2.passwdx =

 

05. リポジトリの取得
Manifestの中にパッケージ名が書いてありますので、その名前を使ってソースを取得します。
今回はブラウザを取得してビルドを試してみます。
ブラウザのパッケージ名はapps/web/browserです。

git clone review.tizen.org:apps/web/browser apps/web/browser

git clone [package] [output-path]で指定します。
[output-path]を指定しないときは、カレントにディレクトリを作って放り込まれます。

 

06. パッケージビルド
ビルドはgbsを使います。

gbs build -A armv7l apps/web/browser

リポジトリとなんやかんや通信しつつビルドが始まります。

が!

どうもうまくいきません・・・
たくさんのパッケージがlibblkid.soというライブラリの参照しているバージョンが食い違っているという内容のエラーで失敗してしまいます。

info: generate repositories ...
info: build conf has been downloaded at:
    /var/tmp/chihara-gbs/tizen2.0.conf
info: start building packages from: /home/chihara/tmp/apps/web/browser (git)
info: prepare sources...
info: retrieving repo metadata...
info: parsing package data...
info: building repo metadata ...
info: package dependency resolving ...
info: next pass:
org.tizen.browser
info: *** [1/1] building org.tizen.browser-0.0.1-1 armv7l tizen2.0 (worker: 0) ***
--repository /home/chihara/GBS-ROOT/local/repos/tizen2.0/armv7l/RPMS --repository http://download.tizen.org/releases/latest/2.0/repos/main/armv7l/packages --repository http://download.tizen.org/releases/latest/2.0/repos/base/armv7l/packages
logging output to /home/chihara/GBS-ROOT/local/scratch.armv7l.0/.build.log...
[    0s] Memory limit set to 21222168KB
[    0s] Using BUILD_ROOT=/home/chihara/GBS-ROOT/local/scratch.armv7l.0
[    0s] Using BUILD_ARCH=armv7l:armv7el:armv6l:armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l:noarch
[    0s]
[    0s]
[    0s] A-2013-01-H started "build org.tizen.browser.spec" at Wed Feb 27 06:04:41 UTC 2013.
[    0s]
[    0s]
[    0s] processing specfile /home/chihara/GBS-ROOT/local/sources/tizen2.0/org.tizen.browser-0.0.1-1/org.tizen.browser.spec ...
[    0s] init_buildsystem --configdir /var/tmp/chihara-gbs --cachedir /home/chihara/GBS-ROOT/local/cache --repository /home/chihara/GBS-ROOT/local/repos/tizen2.0/armv7l/RPMS --repository http://download.tizen.org/releases/latest/2.0/repos/main/armv7l/packages --repository http://download.tizen.org/releases/latest/2.0/repos/base/armv7l/packages --clean --use-system-qemu /home/chihara/GBS-ROOT/local/sources/tizen2.0/org.tizen.browser-0.0.1-1/org.tizen.browser.spec ...
[    0s] initializing /home/chihara/GBS-ROOT/local/scratch.armv7l.0/.srcfiles.cache ...
[    0s] /usr/lib/build/createrpmdeps /home/chihara/GBS-ROOT/local/repos/tizen2.0/armv7l/RPMS
[    0s] /usr/lib/build/createrepomddeps --cachedir=/home/chihara/GBS-ROOT/local/cache http://download.tizen.org/releases/latest/2.0/repos/main/armv7l/packages
[    1s] /usr/lib/build/createrepomddeps --cachedir=/home/chihara/GBS-ROOT/local/cache http://download.tizen.org/releases/latest/2.0/repos/base/armv7l/packages
[    2s] expanding package dependencies...
[    2s] expansion error
[    2s]   nothing provides libblkid.so.1(BLKID_2.18) needed by util-linux
[    2s]   nothing provides libblkid.so.1(BLKID_2.17) needed by util-linux
[    2s]   nothing provides libblkid.so.1(BLKID_2.20) needed by util-linux
warning: build failed, Leaving the logs in /home/chihara/GBS-ROOT/local/repos/tizen2.0/armv7l/logs/fail/org.tizen.browser-0.0.1-1/log

error: *** Error Summary ***
=== the following packages failed to build due to rpmbuild issue ===
org.tizen.browser-tizen2.0-armv7l: /home/chihara/GBS-ROOT/local/repos/tizen2.0/armv7l/logs/fail/org.tizen.browser-0.0.1-1/log

error: <gbs>rpmbuild fails

 

ホームアプリと思われるmenu-screenなどはビルドが成功するので、リポジトリ側の問題のような気がするのですが、どうなのでしょうか。
引き続き調査が必要なようです。

Share

Tizen SDK インストール手順@Ubuntu on iMac

研究開発チームの千原です。前回に続き、TizenのSDKインストール手順について書きたいと思います。

splash

自社都合で、なぜかiMacを使っているため、iMac 2012 LateにTizen SDKを入れます!ちなみにTizen SDKは、現在Macに対応していません・・・。

SDKが現在対応しているOSはWindowsXP/7とUbuntu11と公式サイトには記載されていますが、あえて最新のUbuntu12.10にインストールすることにしました。(調べてみると、12.10で動かしている人もちらほら、実績があるみたい)

公式サイトでの必要動作環境は以下

OS

Ubuntu11.04 11.10 / Windows XP 7

CPU

DualCore 2GHz

RAM

2GB

HDD

3GB

Java

Oracle Java 7

Library(Ubuntu ONLY)

procps, gettext, libdbus-1-3, libcurl3, expect, gtk2-engines-pixbuf, grep, zip, make, and qemu-user-static

01     Ubuntu12.10をVMwareに入れる。

          プロセッサとメモリの項目で、CPUを「2個のプロセッサコア」メモリを「3.5GB」に設定。かなり適当に設定。これでVMでもかなり快適に動くはず。

          仮想マシン作成後、Ubuntuにログインすると、VMwareが強制終了する!

          なぜ!?

          何度も環境を作り直して試行錯誤してもダメ。

          違う観点で調べてみると、VMwareが強制終了するバグがVMwareのページに載っていた・・・。

          もし発生したら、次の設定で回避できます。

          仮想マシンの設定の「ディスプレイ」で、3Dグラフィックスの高速化を「OFF」に設定

                   参考手順:http://d.hatena.ne.jp/wadap/20080706/1215323979

 ※ここからはUbuntu上で作業

02     UbuntuにJRE7を入れる。(インストーラーを動かすだけなのでJREにした)

          Oracle のサイトからJREをダウンロードします。

                   取得先:http://www.oracle.com/technetwork/java/javase/downloads/index.html

          ダウンロードされたディレクトリに移動して、以下のコマンドを実行してJRE内のjavaにパスを通します。

          (/usr/bin/java は二重のシンボリックリンクになっているので、注意)

sudo mkdir -p /usr/lib/jvm
sudo mv jre-* /usr/lib/jvm
sudo cd /usr/lib/jvm
sudo tar xvzf jre-*
sudo rm -f jre-*
sudo ln -s jre* oracle-java
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/oracle-java/bin/java 1000
sudo update-alternatives --config java

参照手順:http://www55.atwiki.jp/loveubuntu/pages/25.html

03     Tizen SDKをダウンロードする。

          Tizen のサイトからSDKをダウンロードします。

                   取得先:https://developer.tizen.org/downloads/sdk

          インストーラーを実行すると不足しているライブラリが表示されるので、まずは一度起動して不足ライブラリを特定しましょう。

chmod +x tizen-sdk-2.0-ubuntu32.bin
./tizen-sdk-2.0-ubuntu32.bin

          If you want to install TIZEN-SDK, you must install “gettext” “libcurl3″ “expect” “gtk2-engines-pixbuf” “libgnome2-0″ “qemu-user-static” package(s).

04     不足しているライブラリをインストールする。

          不足ライブラリが分かったら、グイッと一気に追加します。

sudo apt-get install gettext libcurl3 expect gtk2-engines-pixbuf libgnome2-0 qemu-user-static

05     Tizen SDKのインストーラーを起動する。

./tizen-sdk-2.0-ubuntu32.bin

          とりあえず、カスタムインストールを選択して、全てを入れる。

          あとは、Next連打でガンガン進めて構いません。

06     Simulatorを動かすために必要なGoogleChromeをインストールする。

          Chrome ブラウザをダウンロードします。

sudo dpkg -i google-chrome*

          エラーが起きた場合は、強制インストールを実施!!

sudo apt-get install -f

07     Tizen SDK を起動してSimulatorの設定をする。

          前の手順でChromeが /opt/google/chrome にインストールされていれば、この手順はスキップしてokです。デフォルト設定がそのパスになっているため。

          [Preferences] – [Tizen SDK] – [Web] – [Simulator]

          Google Chrome location にインストールしたChromeブラウザの実行ファイルを設定します。

08     Tizen SDK で Tizen Web Project を新規作成時にエラーが出る場合、以下の設定し、SDKを再起動する。

          MOZILLA_FIVE_HOME not set

sudo apt-get install libwebkitgtk-1.0-0
vi ~/tizen-sdk/ide/eclipse.ini

          最終行に次の設定を追記

          -Dorg.eclipse.swt.browser.DefaultType=webkit

これで、Tizen SDKでHTML5のアプリケーションを作成できるようになります!
Sampleも色々あるようなので、次の機会に紹介したいと思います。

Share

Tizenはじめました。

お初にお目にかかります。アスカクリエイション株式会社の研究開発チームの千原です。

現在、巷で噂になりつつあるTizenの調査を行っています。

初回なので、今回はTizenについて(すごく)簡単に紹介しようと思います。

 

TizenはMeeGoというNokiaとIntelが開発していたプラットフォームを前身としたLinuxベースのモバイルOSです。

ターゲットはスマートフォンをはじめ、車載機器、ネットブック、TVなどとなっています。

現在は、SamsungとIntelが主導して、Linux Foundationが開発を行っているようです。

 

次に、Tizenのシステム構成ですが、TizenのアプリケーションはHTML5になるため、以下のようになっています。

TizenSystemFramework

TizenWikiを参考にしています。)

UIはHTML5で、APIコールはJavaScriptでといった形です。

どうやらWeb開発者を取り込もうという意図があるようです。

 

図の青い部分が、Tizenのコアモジュール群になります。

各モジュールでは以下のサービスが提供されます。

Application Framework

  • アプリの起動
  • 他アプリを起動(パッケージ名、URI、MIME)
  • イベント送信

Base

  • Linuxライブラリ
  • データベース
  • ローカライズ
  • XMLのパース

Connectivity

  • ネットワーク接続(3G)
  • Wi-Fi
  • Bluetooth
  • HTTP
  • NFC

Graphics & UI

  • X11ベースのウィンドウシステム
    • EFL(Enlightenment)
  • OpenGL ES

Location

  • GPS
  • WPS

Messaging

  • SMS: Short Message Service
  • MMS: Multimedia Messaging Service
  • Email
  • IM: Instant Messaging

Multimedia

  • 動画
  • オーディオ
  • 画像・写真

PIM

  • カレンダー
  • 連絡先
  • タスク
  • 検索履歴
  • デバイス情報

Security

  • アクセス制限
  • 認証
  • 安全なアプリケーションの配布

System

  • デバイス制御(センサー、画面、バイブレーション)
  • 電源管理
  • 外部接続イベント管理
  • アップグレード

Telephony

  • 電話(UMTS、CDMA)
  • パケット通信
  • SMS
  • SIM管理(電話帳)

Web

  • Webアプリケーション用ランタイム
  • 低機能機種向けのWeb API

 

次回はSDK環境の構築手順について詳しく書こうと思います。

Share