Titaniumでゆっくりしていってね！

## 0. はじめに
皆様おはこんばんちわ。仕事やら[コミケ＠1日目よ19-a](https://webcatalog-free.circle.ms/Circle/11648870)やら色んな年末進行で大分やられてきている [Xtity](https://twitter.com/xtity) ですm(_ _)m

最近は正直そんなにTitaniumというかアプリ作れてないんですが、
確か社内LTで話したネタがあったなと思いアドカレに名乗りを挙げてみました。

## 1. ざっくり何これ
[Titanium module](https://wiki.appcelerator.org/display/guides2/Using+Titanium+Modules)のiOS版で、ゆっくりボイスでお馴染み[AquesTalk2](http://a-quest.com/download/index.html)を使ってみようというものになります。
たしか、Titanium moduleの解説とかちょこちょこ見つつ、二日くらいでえいやっと作ったような気がします。
なんで、そんなに難しいものにはなってないです。気軽に読んで頂ければ幸いですノシ


## 2. ソース
0. [こちら](https://github.com/xtity/TiYukkuri)からclone
0. AquesTalk2のページのダウンロードページの中から、AquesTalk2 iOSをダウンロード
0. 解凍し、readmeEva.txtを一読した後、1.でcloneしたソースに下記のようにをコピー

``` bash
cp aqtk2-ios-eva/phont/* TiYukkuri/assets/phonts/
cp aqtk2-ios-eva/lib/* TiYukkuri/
```

## 3. メインコード
``` TiYukkuri/example/app.js
// This is a test harness for your module
// You should do something interesting in this harness 
// to test out the module and to provide instructions 
// to users on how to use it by example.


// open a single window
var win = Ti.UI.createWindow({
	backgroundColor:'white'
});

var TiYukkuri = require('com.xtity.mod.TiYukkuri');
Ti.API.info("module is => " + TiYukkuri);

// Text Field
var tf = Ti.UI.createTextField({
	width: 200
	,height: 32
	,value: 'ゆっくりしていってね'
	,returnKeyType: Ti.UI.RETURNKEY_DONE
	,borderStyle: Ti.UI.INPUT_BORDERSTYLE_ROUNDED
	,clearButtonMode: Ti.UI.INPUT_BUTTONMODE_ONFOCUS
	,layout: 'vertical'
});

tf.addEventListener('return', function(e){
	tf.blur();
});

win.add(tf);

// picker
var voiceKindNames = [
	'aq_f1c.phont'
	,'aq_f3a.phont'
	,'aq_huskey.phont'
	,'aq_m4b.phont'
	,'aq_mf1.phont'
	,'aq_rb2.phont'
	,'aq_rb3.phont'
	,'aq_rm.phont'
	,'aq_robo.phont'
	,'aq_yukkuri.phont'
	,'ar_f4.phont'
	,'ar_m5.phont'
	,'ar_mf2.phont'
	,'ar_rm3.phont'
];

var picker = Ti.UI.createPicker({
	top:50
	,useSpinner: true
	,layout: 'vertical'
});
picker.selectionIndicator = true;

var column = Ti.UI.createPickerColumn();

for(var i=0, ilen=voiceKindNames.length; i<ilen; i++){
	var row = Ti.UI.createPickerRow({
		title: voiceKindNames[i]
	});
	column.addRow(row);
}

picker.add([column]);
win.add(picker);

// button
var button = Titanium.UI.createButton({
	title: 'say'
	,top: 30
	,layout: 'vertical'
});
button.addEventListener('click', function() {
	TiYukkuri.say({
		word: tf.value
		,voiceKindName: picker.getSelectedRow(0).title
	});
});

win.add(button);

win.open();
```

## 4. 解説
0. TiYukkuriモジュールの読み込み
  * var TiYukkuri = require('com.xtity.mod.TiYukkuri');
0. UI定義
  * tf
      * テキストボックス
      * 喋らせたい言葉を入力する
  * voiceKindNames
      * ピッカー
      * 喋らせたい声音を選択する
      * valueの文字列はAquesTalk2の仕様で選択できる声音の識別子です
         * 要マニュアル参照 
  * button
      * ボタン
      * 押すと喋ります
      * クリックのイベントにmoduleで定義した ```TiYukkuri.say``` メソッドを呼び出しています
      * Objective-C分かる方は、[ここ](https://github.com/xtity/TiYukkuri/blob/master/Classes/ComXtityModTiYukkuriModule.m)参照
0. Window Open
  * win.open();

## 5. これからの課題
* iOS版以外も作りたいなあ
* 日本語以外どうすれば...

## 6. まとめ
久しぶりにTitanium弄ったんですが、やっぱり楽しいですよね。
JSはやっぱりいい。

ただ、JS界隈の進化はそこそこ速いので、まだTitaniumでは実際に使ったことはないですが、TypeScriptとか既存の色んなJSライブラリも気軽にモバイルの世界で試していければより面白く作っていけるんじゃないかなと。

前にアプリ作ったときに使ってみた、MustacheとかHoganがそうでした。
Webの技術を惜しげもなくmobileに投下しやすいのがTitaniumの大きな魅力ですよね。

その時に、JSのライブラリとかに無い機能でも上記みたいにサクッとネイティブコード書いてモジュール化できるとさらに捗るし、かっこいいんじゃないかなあと思いました。

## 7. 終りに
師走もゴールまで残すところあと10日余りとなりました。

弊社13Fではここ一ヶ月くらい風邪が猛威を振るっていて私もそのビッグウェーブに若干飲まれたばかりですが、皆さん体調等には気をつけてあと少し走りきりましょう。

ちな、C87はNHKが取材しにきたり、準備会が初の公式ニコ生を放送したりとまた熱い年の瀬の戦が繰り広げられるようですね。

私は今回１日目で、某第一回◯ヤカワSFコンテストの一次通ったSF小説を出そうと思います。なんか、暇だったら是非是非お立ち寄り下さいませーm(_ _)m

Code Strong!