<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>HouseTect, JavaScriptな情報をあなたに</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/" />
   <link rel="self" type="application/atom+xml" href="http://hisasann.com/housetect/atom.xml" />
   <id>tag:hisasann.com,2012:/housetect//2</id>
   <updated>2012-04-02T13:59:54Z</updated>
   <subtitle>Javascriptをメインに使っているプログラマーの技術ブログです。ちょっぴりアートでちょっぴりオモシロイものを作ってます。記事の内容はjQuery、jQueryMobile、HTML5、CSS3などなど…</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type Commercial 4.261</generator>


<entry>
   <title>TitaniumMobileのハマりポイントとお作法メモ</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/04/titaniummobile.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1286</id>
   
   <published>2012-04-02T07:30:46Z</published>
   <updated>2012-04-02T13:59:54Z</updated>
   
   <summary> ここ最近TitaniumMobileの主に検証を行なっております。 そして先日...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="583" label="Android" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="604" label="CommonJS" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="378" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="594" label="Titanium Mobile" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="596" label="Titanium Studio" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="555" label="iPad" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="126" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[ここ最近TitaniumMobileの主に検証を行なっております。

そして先日<a href="http://atnd.org/events/26907" target="_blank">Titanium meetup Tokyo #17 (五反田) : ATND</a>におじゃまして<a href="https://twitter.com/#!/masuidrive" target="_blank">@masuidrive</a>をはじめとする多くのTitaniumMobileファンの方々とお話ができました。
すごく楽しかったです！

僕がTitaniumMobileに触り始めて約一ヶ月ほどたちますが、ハマったポイントをつらつらメモしてみました。
使い方やTitaniumMobile自体のバグなど、まだ難しい部分は多々ありますが、4月に2.0がリリースされるようなので、今後が本当に期待できるフレームワークです。


<h2>スペック</h2>

簡単に今のぼくの環境をご紹介。

<dl class="data">
	<dt>MacOS X</dt>
	<dd>Lion</dd>
	<dt>Java</dt>
	<dd>1.6.0_29</dd>
	<dt>Titanium SDK</dt>
	<dd>1.8.2</dd>
	<dt>Titanium Studio</dt>
	<dd>1.0.9</dd>
</dl>

<hr>

<h2>requireをAndroidで使えるようにするため、tiapp.xmlにfastdevを無効にするタグを追加</h2>

CommonJSでコーディングする際、requireで外部のJavaScriptファイルを読み込むことが非常に多くなりますが、
このパスが<strong>fastdev</strong>を有効にしているとうまくいかない。
<a href="http://d.hatena.ne.jp/ikhatehate/20110826/1314338011" target="_blank">Titanium mobile -- Android でrequire()エラー - WEBサービス　情報局</a>

Androidの場合だけですが、

<textarea name="code" class="js">
require('/lib/a.js)
</textarea>

が「Resources<strong>/lib/lib</strong>/a.js」のようになってしまう。
これは、Titanium1.6までの<strong>Ti.include</strong>と同じ現象かなーと思っています。
libの階層が一個多い！！
<a href="http://blog.mogya.com/2011/02/titanium-include-workaround.html" target="_blank">Titaniumのインクルードパスを指定する方法私案 - もぎゃろぐ</a>

なので、以下のように非常に残念ですが、fastdevを<strong>無効にするタグ</strong>をtiapp.xmlに入れましょう！

<textarea name="code" class="html">
<ti:app xmlns:ti="http://ti.appcelerator.org">
	<!-- ▼ -->
	<property name="ti.android.fastdev" type="bool">false</property>
	<!-- ▲ -->
    <deployment-targets>
</textarea>

1.8現在、まだこのバグが直っていないので、今後に期待ですね。
とはいえ、Androidのデバッグは以下で紹介しますが、<strong>DDMS</strong>というツールを使って実機で行なっているので、
fastdevの恩恵はそもそも受けられなかったです。

<hr>

<h2>アプリのバージョンを取得する方法</h2>

tiapp.xmlの

<textarea name="code" class="html">
<version>1.0</version>
</textarea>

に書いたのアプリバージョンになります。
そして以下が取得コード

<textarea name="code" class="js">
Ti.App.getVersion()
</textarea>

アプリを段階的にリリースする際などに、このバージョンを見て処理を分けたりできますね。

[via]
<a href="http://d.hatena.ne.jp/officel/" target="_blank">Office L テクニカルノート</a>

<hr>

<h2>JSSはプロジェクトをcleanしないと修正したものが反映されない問題！とかあといろいろ</h2>

以下が簡単なJSSサンプル。

<h2>app.js</h2>

<textarea name="code" class="js">
Titanium.UI.setBackgroundColor('#000');

var win = Titanium.UI.createWindow();

win.add(Titanium.UI.createWindow({id:'tabGroup1'}));
win.open();
</textarea>

<h2>app.jss</h2>

こちらのJSSファイルに記述したCSSっぽいものが、この場合はidに紐づいて反映されるが、
プロジェクトの<strong>clean</strong>をしないと反映がされない。
つまり以下のredをblackにしてRunしなおしても<strong>反映されない</strong>のだ。

<textarea name="code" class="css">
#tabGroup1 {  
    background-color:'red'
}
</textarea>

<a href="http://higelog.brassworks.jp/?p=1307" target="_blank">TitaniumのJSSという機能 | ひげろぐ</a>の記事を読むと1.6で修正されたとあるので、もしかしたら1.8で再度このバグが出たのかな？

また、以下の記事を読むとやっぱりまだJSSを使うときじゃないのかなーと思っています。1.6の記事ではありますが。
<a href="http://t32k.me/mol/log/titanium-mobile-jss/" target="_blank">Titanium Mobile でCSS的な、それJSS!!!!!! | MOL</a>

なので、Zaimで採用されている<a href="http://www.slideshare.net/unicco/titanium-iphoneandroid/22" target="_blank">Titanium でつくろう！ iPhone/Android 両対応アプリ</a>のような方法よいかもしれません。
（この方法すばらしいと思います！）

<hr>

<h2>iPhoneの場合CommonJSのrequireで呼び出されたモジュール内でグローバル変数が見れる</h2>

以下のようなシンプルなサンプルでiPhone、Androidで試してみましたが、
<strong>iPhoneの場合</strong>にhogeがtestmodule内から見えてしまいました。

一応<strong>node.js</strong>で同じことをやってみましたが、hogeが見えなかったです。

<h2>app.js</h2>

<textarea name="code" class="css">
// これは本来ならtestmodule内からは参照できない
var hoge = 'hoge';

var testmodule = require('testmodule');
new testmodule().log()
</textarea>

<h2>testmodule.js</h2>

<textarea name="code" class="css">
var testmodule = function() {
}
testmodule.prototype.log = function() {
	Ti.API.log('module-log');
	Ti.API.log(hoge);	// iPhoneのエミュレータだと見えちゃう
}

module.exports = testmodule;
</textarea>

以下の和訳ページを見てみると、

<blockquote>
<p>Tiにおける<span class="highlight">CommonJS</span>モジュールの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%C5%CD%CD">仕様</a>の実装は<a class="keyword" href="http://d.hatena.ne.jp/keyword/node.js">node.js</a>のものに基づいています。</p>
<cite>via: <a href="http://d.hatena.ne.jp/donayama/20111230/commonjs_modules_in_titanium" target="_blank">CommonJS Modules in Titanium - JP::HSJ::Junknews::HatenaSide</a></cite>
</blockquote>

や

<blockquote>
<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3">アプリケーション</a>内のすべてのモジュールにわたって共有される<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%CA%D1%BF%F4">グローバル変数</a>は存在してはいけません。</p>
<cite>via: <a href="http://d.hatena.ne.jp/donayama/20111230/commonjs_modules_in_titanium" target="_blank">CommonJS Modules in Titanium - JP::HSJ::Junknews::HatenaSide</a></cite>
</blockquote>

と書いてあることから、このパターンだとiPhoneの場合のrequireがヘンテコなことになっているのかな？
なので、無名関数で囲ってあげる。

<textarea name="code" class="css">
(function() {	// 無名関数で囲ってあげる必要がある
	// これはtestmodule内からは参照できない
	var hoge = 'hoge';

	var testmodule = require('testmodule');
	new testmodule().log()
})();
</textarea>


<h2>Androidのエラー内容</h2>

<strong>DDMS</strong>（↓のほうで解説）で調べた内容。

<blockquote>
02-27 14:46:27.499: E/TiJSError(2137): (main) [311,706] ----- Titanium Javascript Runtime Error -----
02-27 14:46:27.499: E/TiJSError(2137): (main) [1,707] - In testmodule.js:5,36
02-27 14:46:27.499: E/TiJSError(2137): (main) [0,707] - Message: Uncaught ReferenceError: hoge is not defined
02-27 14:46:27.499: E/TiJSError(2137): (main) [0,707] - Source: 	Ti.API.log('aaaaaaaaaaaaaaaa: ' + hoge);
02-27 14:46:27.539: E/V8Exception(2137): Exception occurred at testmodule.js:5: Uncaught ReferenceError: hoge is not defined
</blockquote>

<h2>iPhoneのエラー内容</h2>

無名関数でapp.js内を囲うと以下のエラーが出た。

<blockquote>
[ERROR] Script Error = Can't find variable: hoge (unknown file).
</blockquote>

■参考リンク
<a href="https://wiki.appcelerator.org/display/guides/CommonJS+Modules+in+Titanium" target="_blank">CommonJS Modules in Titanium - Documentation & Guides - Appcelerator Wiki</a>
<a href="http://d.hatena.ne.jp/towerofl/20120105/1325718223" target="_blank">俺流コーディングスタイルにダメ出し - toweroflの日記</a>
<a href="http://d.hatena.ne.jp/donayama/20120102/bestpractices" target="_blank">Titanium Mobile Best Practices - JP::HSJ::Junknews::HatenaSide</a>

<hr>

<h2>TextMate風なスニペットで楽々開発！</h2>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20111205233655.png" src="http://hisasann.com/housetect/2012/04/02/20111205233655.png" width="470" height="624" class="mt-image-none" style="" /></span>

[via]
<a href="http://d.hatena.ne.jp/donayama/20111208/TiAdventCalendar2011" target="_blank">【Titanium Advent Calendar 2011：八日目】タイタにうもん第１話 - JP::HSJ::Junknews::HatenaSide</a>

このスニペットのおかげで、<strong>button</strong>と入れて<strong>tab</strong>を押せばビヨッと展開されるし、<strong>webview</strong>って入れてもいいし、<strong>info</strong>って入れてもいいしね。
このコード補完は非常に強力です！（どうしてcreateWindowはないんだろう。）

<hr>

<h2>.svnディレクトリが悪さするから、gitを使おう？</h2>

以下の記事によると、

<blockquote>
<p><div>私みたいに、会社の都合等で、gitが使えずにSVN使っている方いますよね。</div><div>なんと、TitaniumStudioにて、SVNチェックアウトしたAndroid用プロジェクトを、RunやDistributeしようとすると、失敗しちゃいます＞＜。</div><div>画像の生成のところで失敗しているみたいですね＞＜。</div></p>
<cite>via: <a href="https://sites.google.com/site/tiac2011twingob/" target="_blank">【Titanium Advent Calendar 2011：十日目】</a></cite>
</blockquote>

となっていて、svn exportしてからbuilder.pyを呼び出すということをされています。
ちょっと僕のほうで確認ができていないのですが、確かにすべてのディレクトリに.svnがいるのはちょっといやだなーと思うので、思い切ってgitを採用しちゃうのもありですね。

こちら<a href="http://vimeo.com/29602042" target="_blank">Session01 - Android バットノウハウつめあわせ on Vimeo</a>でも同じようにgitを使おうって話しになっていて面白かったです。

<hr>

<h2>アプリ名の変更はプロジェクトの作り直しが楽？</h2>

Androidだと、

<blockquote>
02-27 19:48:11.943: E/AndroidRuntime(6196): java.lang.RuntimeException: Unable to instantiate application com.hisasann.Hoge.HogeApplication: java.lang.ClassNotFoundException: com.hisasann.Hoge.HogeApplication in loader dalvik.system.PathClassLoader[/data/app/com.hisasann.Hoge-1.apk]
02-27 19:48:11.943: E/AndroidRuntime(6196): 	at android.app.LoadedApk.makeApplication(LoadedApk.java:466)
02-27 19:48:11.943: E/AndroidRuntime(6196): 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3287)
02-27 19:48:11.943: E/AndroidRuntime(6196): 	at android.app.ActivityThread.access$2200(ActivityThread.java:121)
</blockquote>

が出る。

<a href="http://t32k.me/mol/log/titanium-advent-calendar-2011-01/" target="_blank">【Titanium Advent Calendar 2011：一日目】既にリリースしたアプリ名の変更（AppStore編） | MOL</a>
にあるリンク先に、

<blockquote>
<p>Because of generated files and complexity with renaming some of them, we decided against allowing editing. You can create a new project and just copy in your Resources to the new project (and then just delete old).</p>
<cite>via: <a href="http://developer.appcelerator.com/question/19001/how-can-i-rename-my-iphone-app-project" target="_blank">How can i rename my iphone app project? » Community Questions &amp; Answers » Appcelerator Developer Center</a></cite>
</blockquote>

と書いてあるので、たしかにへんなエラーで（<strong>ClassNotFoundException</strong>）で悩むぐらいなら、新しくプロジェクト作ってリソースコピーしちゃえ！

<hr>

<h2>ファイル名にアンダースコアが付いているとAndroidの実機にインストールできない</h2>

Titaniumでアンダースコア付きのファイルはやめておいたほうがよいみたい。

<blockquote>
[ERROR] /TitaniumStudioWorkspace/Sample-LocalJqm/Resources/jqm/js/jquery.mobile-1.0.1/demos/docs/_assets/js/_viewsource.js is an invalid filename. Android will not package assets whose filenames start with underscores. Fix and rebuild.
</blockquote>

このようにjquery.mobile-1.0.1の下にあるdemoディレクトリ内にアンダースコア付きのファイルがあって、iPhoneだと実機にインストールできますが、Androidでは入らない。

[via]
<a href="http://psychedesire.blogspot.com/2012/01/titanium-mobile-18.html" target="_blank">pd @ blogger: Titanium Mobile 1.8 からの変更点？ビルドが進まない。</a>
（こちらの記事のV8が速いという記事、ちょっとグッときました）

<hr>

<h2>ローカルHTMLの場合historyが記録されないのでjQueryMobileの戻るボタンは反応しない</h2>

httpで読み込むなどした、<strong>外部のサイト</strong>ならOK！
ローカルHTMLの場合は、戻るボタンを押してもうんともすんともいってくれない。

[via]
<a href="http://akabeko.sakura.ne.jp/blog/2010/11/titanium-%E3%81%AE-webview-%E3%81%A7-html-%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88/" target="_blank">Titanium の WebView で HTML をホスト | アカベコマイリ</a>

<hr>

<h2>Ti.Media.showCamera（カメラ）を使ってみる</h2>

古いバージョンではAndroidの場合に、<strong>tiapp.xml</strong>に以下のようにパーミッションを追記する必要があるかもしれません。
現時点で検証している1.8.1と1.8.2では、デフォルトでAndroidのカメラパーミションがもれなく付いてきています。

<textarea name="code" class="html">
<android xmlns:android="http://schemas.android.com/apk/res/android">
    <manifest>
        <uses-permission android:name="android.permission.CAMERA" />
    </manifest>
</android>
</textarea>

iPhoneは特になんの設定もしなくても使えます。

■カメラを使ったサンプルコード
<a href="https://gist.github.com/1977240" target="_blank">TitaniumMobileでカメラを使う方法 -- Gist</a>

ちなみにここで、カメラのパーミションを追記していますが、僕個人としては、のちのちのことを考えると次でご紹介する<strong>AndroidManifest.xml</strong>に追記する方法をおすすめします。

<hr>

<h2>Xperia arcでカメラを使うと予期せぬ強制終了が発生する</h2>

Androidのバージョンは<strong>2.3.2</strong>だが、何をどうしても<strong>カメラを撮影したタイミング</strong>で落ちてしまう。
具体的なコードは以下のとおり。
至って普通のカメラ呼び出しだが、この引数に渡しているオブジェクトのプロパティをいろいろいじってみたが<strong>100%落ちる</strong>。
<strong>Xperia arc</strong>は比較的シェアが高めな端末なので、こうなるとカメラの機能は自前でモジュールとして作成するか、必要がないなら使わないなどの対策が必要が気がしています。

<textarea name="code" class="js">
Ti.Media.showCamera({
	success : function(event) {
	},
	cancel : function() {
		alert('なんでキャンセルするの！');
	},
	error : function(e) {
		alert('error');
	},
	saveToPhotoGallery : true,
	mediaTypes : [Ti.Media.MEDIA_TYPE_PHOTO]
});
</textarea>

<a href="https://jira.appcelerator.org/browse/TIMOB-4899?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab#issue-tabs" target="_blank">[#TIMOB-4899] Camera crashes Sony Ericsson Xperia Arc Android 2.3.2, 2.3.3 with all branches - Appcelerator JIRA</a>

<h2>Androidが落ちた時のエラー</h2>

<blockquote>
02-21 09:59:02.214: E/TiApplication(17570): (main) [681,31285] Sending event: exception on thread: main msg:java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data dat=file:///sdcard/dcim/Camera/tia-1288732183.jpg typ=image/jpeg (has extras) }} to activity {com.hisasann.Baruth/org.appcelerator.titanium.TiActivity}: java.lang.NullPointerException; Titanium 1.8.1,2012/01/27 17:31,a24502a
02-21 09:59:02.214: E/TiApplication(17570): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data dat=file:///sdcard/dcim/Camera/tia-1288732183.jpg typ=image/jpeg (has extras) }} to activity {com.hisasann.Baruth/org.appcelerator.titanium.TiActivity}: java.lang.NullPointerException
02-21 09:59:02.214: E/TiApplication(17570): 	at android.app.ActivityThread.deliverResults(ActivityThread.java:2504)
</blockquote>

どうもintentまわりでヌルポが発生しているように見える。
なんとなくだが、

<blockquote>
<p>Sony Ericsson Xperia Arc has a branded Android version, and a special camera (also camera software).</p>
<cite>via: <a href="https://jira.appcelerator.org/browse/TIMOB-4899?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab#issue-tabs" target="_blank">[#TIMOB-4899] Camera crashes Sony Ericsson Xperia Arc Android 2.3.2, 2.3.3 with all branches - Appcelerator JIRA</a></cite>
</blockquote>

と書いてあるとおり、もしかしたらarcはカメラのアプリが特殊なので、intentに失敗しているのかも？

<hr>

<h2>AndroidManifest.xmlにAndroidの設定を追記してみる</h2>

Androidの設定は、AndroidManifest.xmlファイルに書き出されます。
細かい部分は、<a href="http://www.techdoctranslator.com/android/guide/manifest" target="_blank">a. AndroidManifest.xml ファイル - ソフトウェア技術ドキュメントを勝手に翻訳</a>を参照ください。

んで、このファイルがTitaniumの場合どこにあるかと言いますと、

<blockquote>
/[プロジェクト名]/build/android/AndroidManifest.xml
</blockquote>

になります。

一度でもAndroidでビルドしているとこのファイルができていますので、試しに見てみましょう！

下のほうにいくと

<textarea name="code" class="html">
<uses-permission android:name="android.permission.CAMERA"/>
</textarea>

と書かれていますね。
つまり、TitaniumMobileの場合は、デフォルトでカメラが使える状態なのです。

この場所に置かれているAndroidManifest.xmlは<strong>ビルドするたび</strong>に作りなおされてしまいますので、
プロジェクト内に配置して、うまいことマージしてもらいましょう。

TitaniumStudioから以下のディレクトリに↑のファイルをコピーする。

<blockquote>
/[プロジェクト名]/platform/android/AndroidManifest.xml
</blockquote>

これで、ビルド時にここのファイルを見に行ってくれるので、Android特有の設定はここに追記していく。
tiapp.xmlに書いていく方法もあるようなのですが、実はあんまりよく理解できませんでした。
そして、最終的にこっちに書かないとうまくいかない設定があったりなどで、このスタイルに落ち着いています。

<hr>

<h2>iPhoneとAndroidでwidthなどのサイズの指定をどうするか</h2>

これはまだ最終的な策が出ていませんが、現時点でこうかなーという感じで書いてみます。
そもそもの話しですが、たとえば<strong>width:'320px'</strong>とこれは、400pxではなく300pxでもなく320pxです。
つまりiPhoneでは横幅いっぱいですが、他のAndroidなどは画面の中央ぐらいまでの場合もあります。

これだと各端末の場合はというif文が存在してしまい、とてつもなく大変なことになります。
これをうまいこと吸収してくれる？のが<strong>dp</strong>（だと思います）

<a href="http://y-anz-m.blogspot.com/2010/02/android-multi-screen.html" target="_blank">Y.A.M の 雑記帳: Android multi screen 対応</a>
を参考にさせていただいて、AndroidManifest.xmlに追記しました。

<textarea name="code" class="html">
<supports-screens
	android:anyDensity="true"
	android:largeScreens="true"
	android:normalScreens="true"
	android:resizeable="true"
	android:smallScreens="true"/>
</textarea>

そして、プログラム内でサイズを指定する箇所は「width : '320<strong>dp</strong>'」のように<strong>dp</strong>と指定しています。
dpに関する内容は、以下が詳しかったです。

<blockquote>
<p>画面の物理的な密度に基づいた抽象的な単位。<br>この単位は 160 dpi の画面と対応していて、160 dpi の画面で 1 dp = 1 px になる。なので、dp-pixel 比は画面密度（解像度）に応じて変化するが、必ずしも正比例するわけではない。</p>
<cite>via: <a href="http://y-anz-m.blogspot.com/2010/05/androiddimension.html" target="_blank">Y.A.M の 雑記帳: Android　Dimension 単位</a></cite>
</blockquote>

dpiが<strong>160</strong>の場合は320dpは<strong>320px</strong>なんですが、このdpiが変わって240になると320dpが<strong>480px</strong>になったりします。

ちょっとだけ厄介なのが、iPhoneのエミュレータは<strong>160dpi</strong>ですが、iPhone4Sの実機で試したところ<strong>320dpi</strong>が返ってきました。
なんという<strong>Retina Display</strong>よ！

<hr>

<h2>dp指定の場合のanimateはどうしよう</h2>

Titaniumのアニメーションは非常に便利で、以下のように書くだけで動いてくれます。
jQueryみたい！

<textarea name="code" class="js">
view.animate({
	height : 0,
	opacity : 0,
	zIndex : 1,
	curve : Ti.UI.ANIMATION_CURVE_EASE_IN_OUT,
	duration : 500
}, function() {
});
</textarea>

ここで問題なのが、heightやtopなどにはInt値しか渡せないことです。
つまり、

<textarea name="code" class="js">
view.animate({
	height : '320dp'
}, function() {
});
</textarea>

はエラーになります。
これを回避するために、以下のようなコードを書きたいところですが、iPhone4Sだとdpiが320なので、320dpを渡すと640が返ってきてしまいます。

<textarea name="code" class="js">
// dpをpxに変換します
function convertDpToPixel(dp) {
	return (dp * (Titanium.Platform.displayCaps.dpi / 160));
}

// pxをdpに変換します
function convertPixelToDp(px) {
	return (px / (Titanium.Platform.displayCaps.dpi / 160));
}
</textarea>

現時点ではAndroidの場合に上記コードを実行するようにしていますが、果たしてiPadでうまいこといくのかどうか。
今後、確認します。

<hr>

<h2>アプリを縦向き固定（portrait）のみにする</h2>

iPhoneの場合は、<strong>tiapp.xml</strong>に以下のように記述すればよいのですが、

<textarea name="code" class="html">
<iphone>
    <orientations device="iphone">
        <orientation>Ti.UI.PORTRAIT</orientation>
    </orientations>
</iphone>
</textarea>

Androidは、AndroidManifest.xmlに記述します。
これは結構ネットでもいろんな記述されている方が多く、またそれらが古いバージョンでは動くが現バージョンでは動かないなどがあり結果このスタイルに落ち着きました。

<textarea name="code" class="html">
<activity android:configChanges="keyboardHidden|orientation"
	android:name="ti.modules.titanium.media.TiCameraActivity"
	android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
	android:screenOrientation="portrait"/>
<activity android:name="org.appcelerator.titanium.TiActivity"
	android:configChanges="keyboardHidden|orientation"
	android:screenOrientation="portrait"/>
<activity android:name="org.appcelerator.titanium.TiTranslucentActivity"
	android:configChanges="keyboardHidden|orientation"
	android:theme="@android:style/Theme.Translucent"
	android:screenOrientation="portrait"/>
<activity android:name="org.appcelerator.titanium.TiModalActivity"
	android:configChanges="keyboardHidden|orientation"
	android:theme="@android:style/Theme.Translucent"
	android:screenOrientation="portrait"/>
<activity android:name="ti.modules.titanium.ui.TiTabActivity"
	android:configChanges="keyboardHidden|orientation"
	android:screenOrientation="portrait"/>
<activity android:name="ti.modules.titanium.ui.android.TiPreferencesActivity"
	android:screenOrientation="portrait"/>
</textarea>

■最終的なAndroidManifest.xml
<a href="https://gist.github.com/1977468" target="_blank">AndroidManifest.xmlのサンプル、縦固定などなど。 -- Gist</a>

ちなみにJavaScriptからもできるようです。

<textarea name="code" class="html">
var window = Titanium.UI.createWindow();
window.orientationModes = [
	Titanium.UI.PORTRAIT
];
</textarea>

ただ、気をつけることはTitanium.UI.createWindowするときには指定せず、そのあとに<strong>orientationModes</strong>をセットしないとダメのようです。
むむっ！

<hr>

<h2>存在しないオブジェクトプロパティの値がiPhoneとAndroidで異なる</h2>

以下のようなコードを書いたときにiPhoneとAndroidで結果が異なる。

<textarea name="code" class="js">
var obj = {};
Ti.API.info(obj.hoge);
</textarea>

<h2>iPhoneの結果</h2>

<blockquote>
[INFO] &lt;null&gt;
</blockquote>

<h2>Androidの結果</h2>
	
<blockquote>
03-05 09:23:05.243: I/TiAPI(5644): undefined
</blockquote>

とはいえ、

<textarea name="code" class="js">
if (obj.hoge) {
}
</textarea>

という書き方すれば大丈夫ですね。

[via]
<a href="http://vimeo.com/29602042" target="_blank">Session01 - Android バットノウハウつめあわせ on Vimeo</a>

<hr>

<h2>Androidの場合HttpClientとWebViewでcookieが共有されない</h2>

以下のようのPHPコードでCookieの共有検証をしてみました。

<textarea name="code" class="html">
<?php
if( isset($_COOKIE['count']) ){
	$count = $_COOKIE['count'];
} else {
	$count = 0;
}

$count++;

setcookie('count', $count);
?><!DOCTYPE HTML>
<html lang="en-US">
<head>
	<meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
	<meta charset="UTF-8">
	<title></title>
</head>
<body>
	<?php echo($count); ?>
</body>
</html>
</textarea>

<a href="https://gist.github.com/1991471" target="_blank">クッキーにセットした値をカウントアップします。 -- Gist</a>

結果、

<ul>
	<li>iPhoneは<strong>共有される</strong>。ただし、アプリをkillするとCookieは消去される。</li>
	<li>Androidは<strong>共有されない</strong></li>
</ul>

Androidのほうの共有されない問題は、じつは結構でかい問題で、特にログイン機能を持っているアプリの場合に厳しいと思います。
これみなさんどうしてるんですかね。

なので、Cookieよりは<strong>Ti.App.Properties</strong>を使うほうが確かかもしれません。

[via]
<a href="http://vimeo.com/29602042" target="_blank">Session01 - Android バットノウハウつめあわせ on Vimeo</a>

<hr>

<h2><strong>https</strong>なサイトをWebViewで開く場合は証明書が大事！</h2>

httpsなURLにアクセスする際に<strong>オレオレ証明書</strong>だとアクセスすることができません。
その挙動がiPhoneとAndroidで違うので以下にメモ。

<h2>iPhoneで接続した場合</h2>

ちゃんと<strong>certificate</strong>のエラーが出てくれる。

<blockquote>
[ERROR] Error loading: https://hogehoge.com/, Error: Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be "hogehoge.com" which could put your confidential information at risk." UserInfo=0xa812dd0 {NSErrorFailingURLStringKey=https://hogehoge.com/, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey=https://hogehoge.com/, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be "hogehoge.com" which could put your confidential information at risk., NSUnderlyingError=0x8c315f0 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be "hogehoge.com" which could put your confidential information at risk.", NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0xa816430>}
</blockquote>

<h2>Androidの場合</h2>

何もエラーが出ず、画面にHTMLも表示されない。
つまり一見するとハマる。

<hr>

<h2>Ti.Network.createHTTPClientで証明書がないhttpsを開けるけども？</h2>

以下のようにTitanium.Network.HTTPClientの<strong>validatesSecureCertificate</strong>というプロパティをfalseにすると、証明書がないhttpsなURLでも通信することができる。

<textarea name="code" class="js">
var client = Ti.Network.createHTTPClient({});
client.validatesSecureCertificate = false;
</textarea>

ただし、

<blockquote>
<p>validatesSecureCertificateはシミュレータや実機テスト時はfalseだけど、リリース用の時は強制的にtrueなのかな？ / "Does titanium mobile supports SSL with htt..." <a href="http://t.co/YCrwK5z0" data-expanded-url="http://htn.to/LX7tdC" title="http://htn.to/LX7tdC" target="_blank" rel="nofollow" class="twitter-timeline-link">htn.to/LX7tdC</a></p>
<cite>via: <a href="https://twitter.com/#!/hisasann/status/169622852130177024" target="_blank">Twitter / @hisasann: validatesSecureCertificate ...</a></cite>
</blockquote>

なんか自分でもつぶやいていますが、
<a href="http://developer.appcelerator.com/question/131214/does-titanium-mobile-supports-ssl-with-https-urls-" target="_blank">Does titanium mobile supports SSL with https URLs ? » Community Questions & Answers » Appcelerator Developer Center</a>
によると、デプロイするとデフォルトtrueで上書きができないんじゃないかなーって思っています。（未検証）

アプリ開発ではこのhttpsなんだけど証明書がないケースでのテストができないこともあるので、
ちょっとテストがしにくいですね。

<hr>

<h2>WebViewとTitaniumの連携 - ローカルHTML（アプリ内HTML）からTitaniumのイベントをfire</h2>

<h2>app.jsの一部</h2>

<textarea name="code" class="js">
Titanium.App.addEventListener("onWebView", function(params) {
	Ti.API.log('WebViewから呼ばれた！');
	Ti.API.log(params.text);
});
</textarea>

<h2>WebViewで読み込まれたローカルHTMLの一部</h2>

<textarea name="code" class="js">
Titanium.App.fireEvent( "onWebView", { text: "テキスト" } );
</textarea>

ちなみにですが、リモートのHTMLをWebViewに読み込んだ場合は、上記コードは動かない。
あたりまえですが、勝手にexternalなサイトからアプリ内のイベントを呼ばれちゃうのは困る。

場当たり的にいろんな名前でイベントfireしまくれば、もしかしたら一個ぐらいは動くかも？

<blockquote>
<p>ただし、HTML 内から Titanium オブジェクトを呼び出すのは、ローカルに保存された HTML でないといけません。</p>
<cite>via: <a href="http://www.mountposition.co.jp/blog/?p=81" target="_blank">MountPosition Inc. » TitaniumでWebView にイベントリスナを登録する</a></cite>
</blockquote>

■参考リンク
<a href="http://akabeko.sakura.ne.jp/blog/2010/11/titanium-%E3%81%AE-webview-%E3%81%A7-html-%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88/" target="_blank">Titanium の WebView で HTML をホスト | アカベコマイリ</a>
<a href="http://stackoverflow.com/questions/2685409/trouble-using-titaniums-webview-to-fire-an-api-event" target="_blank">addeventlistener - Trouble using Titanium's webview to fire an API event - Stack Overflow</a>
<a href="http://higelog.brassworks.jp/?p=1163" target="_blank">WebViweに表示されているHTMLからTitaniumの処理を実行する | ひげろぐ</a>

<hr>

<h2>WebViewとTitaniumの連携 - Titaniumから読み込んだHTMLを操作する</h2>

<h2>WebViewにロードしたHTMLをload後に書き換える方法</h2>

これはコードで見たほうが早いですね。

<h2>app.js</h2>

<textarea name="code" class="js">
Titanium.UI.setBackgroundColor('#000');

var win = Titanium.UI.createWindow();

var WebView = require('WebView');
win.add(new WebView());
win.open();
</textarea>


<h2>WebView.js</h2>

<textarea name="code" class="js">
var WebView = function() {
	// window
	var win = Ti.UI.createWindow();

	// view
	var view = Ti.UI.createView();

	// webview
	var webview = Ti.UI.createWebView();
	webview.url = 'http://www.google.co.jp/';

	// loadイベント
	webview.addEventListener('load', function(e) {
		Ti.API.log('loaded');
		// ここでHTMLを改変！
		webview.evalJS('document.getElementById("lst-ib").value = "ひささん";');
	});

	view.add(webview);
	win.add(view);

	return win;
}
module.exports = WebView;
</textarea>
<a href="https://gist.github.com/1921157" target="_blank">TitaniumMobileでWebViewを使う方法 -- Gist</a>

上記の、

<textarea name="code" class="js">
webview.evalJS('document.getElementById("lst-ib").value = "ひささん";');
</textarea>

で行なっています。
ただし、まだ僕もよく分かっていませんが、構文にミスがあっても、うんともすんともエラーを出してくれません。
よって、<strong>デバッグがかなり大変</strong>になります。
なので、この処理はあくまでもヘッダー・フッターをdisplay:none;にしたいなど、
そういった比較的軽めな対応にしておいたほうがよさそうです。

また、このevalJSは<strong>複数行のコードを評価させると、1行目しか実行してくれません</strong>。（Androidの場合だけっ！）
つまり、以下のコードを実行すると、

<textarea name="code" class="js">
webview.evalJS('alert(1);document.getElementById("lst-ib").value = "ひささん";');
</textarea>

alertは出ますが、テキストボックスの値は変わりません。
セミコロン1個までじゃないとダメなので、もし複数行のJavaScriptを実行する場合は、

<textarea name="code" class="js">
webview.evalJS('alert(1);');
webview.evalJS('document.getElementById("lst-ib").value = "ひささん";');
</textarea>

と書くようです。
難しい！

[via]
<a href="http://blog.mogya.com/2011/12/titanium-evaljs.html" target="_blank">【Titanium Advent Calendar 2011：二日目】evalJSの恐怖 - もぎゃろぐ</a>

<hr>

<h2>adbコマンドでAndroidデバイスを知る！</h2>

接続されているAndroidデバイスの確認は、

<blockquote>
adb devices
</blockquote>

ログは、

<blockquote>
adb logcat
</blockquote>

複数接続されている場合は、デバイス番号を指定する。

<blockquote>
adb -s [デバイス番号] logcat
</blockquote>

[via]
<a href="http://d.hatena.ne.jp/oreflow/20111020/1319109373" target="_blank">複数デバイスが動いているときにログを見る - ore*flow</a>

<hr>

<h2>AndroidのWebViewではlocalStorageが使えない</h2>

いろいろ試していてハマったんですが、AndroidのWebViewで<strong>localStorage</strong>が<strong>null</strong>になってしまう。
WebViewではなく<strong>ブラウザ</strong>ではOK。

調べていくと、ネイティブだと以下のようなコードをWebViewを呼ぶ前にする必要があるみたい。

<textarea name="code" class="js">
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
File databasePath = new File(getCacheDir(), getString(R.string.webStoragePath));
webSettings.setDatabasePath(databasePath.toString());

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onExceededDatabaseQuota(..., QuotaUpdater quotaUpdater) {
        quotaUpdater.updateQuota(5 * 1024 * 1024);
    }
});
</textarea>

[via]
<a href="http://d.hatena.ne.jp/nobnak/20101010/1286671338" target="_blank">Android WebView で HTML5 の Web Storage と Web SQL Database API を使う - nobnakの日記</a>

でも、この設定をできるコードがTitaniumに見つからない。

以下のようにいろんな人たちがハマっていて、これは今後どうなるんだろう。
<a href="http://developer.appcelerator.com/question/132098/localstorage-failure-in-webview" target="_blank">Localstorage failure in webview » Community Questions & Answers » Appcelerator Developer Center</a>
<a href="http://developer.appcelerator.com/question/113441/webview---enabling-localstorage" target="_blank">Webview - Enabling localStorage » Community Questions & Answers » Appcelerator Developer Center</a>
<a href="http://developer.appcelerator.com/question/123972/how-to-enable-localstorage-iun-android" target="_blank">how to enable localStorage iun Android » Community Questions & Answers » Appcelerator Developer Center</a>
<a href="https://twitter.com/#!/hisasann/status/175148352885891072" target="_blank">Twitter / @hisasann: AndroidのWebViewでlocalStora ...</a>

外部サイトを読み込み、かつlocalStorageを使いたい場合は、<strong>Titanium.Platform.openURL</strong>で<strong>ブラウザ</strong>を開いてあげるしかないのかな。
あとは<strong>Titanium.App.Properties.setString</strong>を使ってなんとか、アプリ側に値を保持して、うまいことやる？
ちょっとややこしいですな。

<hr>

<h2>Titanium-Google-Analyticsでトラッキング</h2>

<a href="https://github.com/rogchap/Titanium-Google-Analytics" target="_blank">rogchap/Titanium-Google-Analytics</a>を使ってできるようです。（未検証）

こちらの記事が参考になります。
<a href="http://d.hatena.ne.jp/chris4403+tech/20110128/1296189155" target="_blank">Titanium MobileでGoogle Analyticsを利用する - box box box</a>

<hr>

<h2>Ti.Appにグローバルな変数を入れて共有する</h2>

引数で渡すよりもグローバル化したほうが効率的なシチュエーションがあるので、Ti.Appにいろいろぶらさげて管理したいところ。
ただ、Ti.App配下にはすでにたくさんのプロパティやらメソッドがあるので、これらを壊さず、かつ、開発者が追加したというのが分かるようにしたい。

ということで、

<textarea name="code" class="js">
Ti.App.g.hoge
</textarea>

みたいに、一つワンクッションを入れて、プロパティを管理しようと思いました。
ところが、

<textarea name="code" class="js">
Ti.App.g = {};
Ti.App.g.hoge = 'aaa';
</textarea>

としても、hogeがnullのままになるという減少に悩まされました。
なので、以下のコードで検証。

<textarea name="code" class="js">
// オブジェクトリテラルだめ
Ti.App.g = {};
Ti.API.info(typeof Ti.App.g);	// [INFO] object
Ti.App.g.hoge = 'aaa';
Ti.API.info(Ti.App.g.hoge);		// [INFO] <null>

// Objectをnewしてもだめ
Ti.App.g = new Object();
Ti.API.info(typeof Ti.App.g);	// [INFO] object
Ti.App.g.hoge = 'aaa';
Ti.API.info(Ti.App.g.hoge);		// [INFO] <null>

// functionでやっとOK！
Ti.App.g = function(){};
Ti.API.info(typeof Ti.App.g);	// [INFO] function
Ti.App.g.hoge = 'aaa';
Ti.API.info(Ti.App.g.hoge);		// [INFO] aaa
</textarea>

なんだこれ。。。
なので、<strong>function(){}</strong>を使って名前空間を作っています。

ちなみにですが、名前空間を使わず、以下のように入れれるので、面倒な方は以下の方法ですかね。

<textarea name="code" class="js">
Ti.App.hoge = 'bbb';
Ti.API.info(Ti.App.hoge);		// [INFO] bbb
</textarea>

[via]
<a href="http://higelog.brassworks.jp/?p=1263" target="_blank">Ti.Appにオブジェクトをくっつけてグローバル変数的に使う | ひげろぐ</a>

<hr>

<h2>僕のiPhone、Androidのデバッグ環境</h2>

本来ならiPhoneもAndroidもエミュレータを起動して確認して、その後に実機に入れて確認という感じになるとは思うのですが、
僕の環境ではAndroidエミュレータを起動した際（ランダム）にMacが強制的に落とさないといけない状況になります。
具体的にどうなるかは<a href="http://instagr.am/p/HDg1heKv1s/" target="_blank">Instagram</a>こちらをご覧ください。
（どうやらカーネルパニックのようです）
<a href="https://gist.github.com/1922026" target="_blank">Androidエミュレータを起動したときのMacのエラーログ -- Gist</a>

それに、↑のほうで解説したようにfastdevを使った状態だとrequire時のパスがヘンテコになります。
もう、これだけ揃うとエミュレータで作業する意味があまりないので、実機でのデバッグになります。

ちなみにですが、エミュレータの起動は<strong>死ぬほど重い</strong>ですが、実機への転送は<strong>意外と速い</strong>です。

<h2>Androidのデバッグについて</h2>

会社の方に教えていただいたのが、この<strong>DDMS</strong>という付属ツール。
以下の場所にあります。（Androidを触り始めて1週間でこのツールの存在を知りました！遅い！）

<blockquote>
android-sdk-macosx/tools/ddms
</blockquote>

僕は、しょっちゅう使うので、aliasにして<strong>.bash_profile</strong>に書いちゃいました。

<blockquote>
alias ddms="~/_/dev/android-sdk-macosx/tools/ddms"
</blockquote>

■参考リンク
<a href="http://d.hatena.ne.jp/bs-android/20090203/1233675390" target="_blank">AndroidのDDMSの使用方法のドキュメントを翻訳しました - Android(アンドロイド)情報-ブリリアントサービス</a>

Androidの実機をMacに接続し、あとはRunのボタンの<strong>Android Device</strong>を選んでちょいとまちます。
すると、

<blockquote>
[INFO] Application installed. Launch from drawer on Home Screen
</blockquote>

と出るので、Androidのアプリのところから自分のアプリを起動します。
ここで、ちょっとしたことではなりますが、僕は<strong>Ti.API.log</strong>ではなく<strong>Ti.API.error</strong>を使ってログを吐くようにしています。
logほうでもいいんですが、流れるスピードが尋常じゃないので、errorで出力しておいて、
DDMS側のログレベルを<strong>error</strong>にしています。

それか<strong>Saved Filters</strong>のところでFilterを作っちゃうかですね。

もっといい方法があるだろう。


<h2>iPhoneのデバッグについて</h2>

iPhone側はなんの問題もありません。
エミュレータでガシガシ開発しています！
しかもエミュレータ起動速い！いいね！

<hr>

<h2>Jasmineを使ってテストをする</h2>

すでにある<a href="https://github.com/guilhermechapiewski/titanium-jasmine" target="_blank">guilhermechapiewski/titanium-jasmine</a>こちらをCommonJS対応し、ディレクトリ構成を綺麗にした版

<a href="https://github.com/hisasann/titanium-jasmine" target="_blank">hisasann/titanium-jasmine</a>

を作ってみました。

普通に起動したいなら、

<blockquote>
make run-iphone
</blockquote>

テストとして起動したいなら、

<blockquote>
make test-iphone
</blockquote>

クリーンしてから起動したいなら、

<blockquote>
make clean && make run-ipad
</blockquote>

TitaniumStudioから普通に起動しても問題ありません。

<hr>

<h2>TitaniumMobileで作られたアプリ</h2>

<ol>
	<li>Zaim</li>
	<li>はてなカウンティング</li>
	<li>積ん読本</li>
	<li>Wunderlist</li>
	<li>Nyars</li>
	<li>そうしてあなたはさっていくのね</li>
	<li>POPCORN S</li>
	<li>NIFTY-Serve</li>
	<li>Sptted</li>
	<li>MogSmash（MogSnapって今動かないですよね？）</li>
</ol>

こちらにかなりまとまっています。
<a href="http://ti.masuidrive.jp/topic.php?id=3" target="_blank">Titanium Mobileの開発事例 « Titanium BBS(JP unofficial)</a>

<hr>

<h2>是非読んでいただきたい記事やスライドや動画やコード！</h2>

<a href="http://imthinker.net/titanium/" target="_blank">小さな Titanium Mobile の読み物</a>

<a href="http://d.hatena.ne.jp/tuto0621/20120227/1330357295" target="_blank">JavaScriptを使って一週間でiPhoneアプリを作ってみた。 - おんがえしの日記</a>

<div style="width:425px" id="__ss_11570127"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/unicco/titanium-iphoneandroid" title="Titanium でつくろう！ iPhone/Android 両対応アプリ" target="_blank">Titanium でつくろう！ iPhone/Android 両対応アプリ</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/11570127" width="500" height="430" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/unicco" target="_blank">Takako Kansai</a> </div> </div>

<iframe src="http://player.vimeo.com/video/29642650?title=0&amp;byline=0&amp;portrait=0" width="500" height="400" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p><a href="http://vimeo.com/29642650">Session06 - TitaniumでiOS/Android同時リリース：NIFTY-Serveの事例</a> from <a href="http://vimeo.com/tidevsme">astronaughts</a> on <a href="http://vimeo.com">Vimeo</a>.</p>

<iframe src="http://player.vimeo.com/video/31068930?title=0&amp;byline=0&amp;portrait=0" width="500" height="400" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe><p><a href="http://vimeo.com/31068930">Session07 - MogSnap 開発秘話＆すぐに使える Titanium アニメーションテク</a> from <a href="http://vimeo.com/tidevsme">astronaughts</a> on <a href="http://vimeo.com">Vimeo</a>.</p>

<a href="https://github.com/toru0325/TKAnimationSample" target="_blank">toru0325/TKAnimationSample</a>

<a href="https://github.com/toru0325/TiMetro" target="_blank">toru0325/TiMetro - GitHub</a>

<hr>

<h2>まとめ</h2>

とにかくハマる！
ハマる！
ハマる！

でも、ふと思ったんですが、そりゃiPhoneとAndroidの両方をJavaScriptで開発し、かつ同じコードでもそこそこ動く環境という時点で非常にありがたい。
あとはUIを分けるなどして、分岐していくのかなーと思いますが、iPhoneではアニメーションすごくいい！Androidだとそこそこいい！なので、これから流行ってきそうですね。

<blockquote>
<p>Titanium Mobile 2.0リリース発表を東京でも行います！ 詳細は後日公開しますが4/20の予定となっています！参加しようかな？と思う方はFavを頂けるとうれしいです！ <a href="http://t.co/n0bizKnF" data-expanded-url="http://www.meetup.com/Appcelerator/Las-Vegas-NV/655862/" title="http://www.meetup.com/Appcelerator/Las-Vegas-NV/655862/" target="_blank" rel="nofollow" class="twitter-timeline-link">meetup.com/Appcelerator/L...</a> <a href="https://twitter.com/#!/search/%23TitaniumJP" title="#TitaniumJP" class="  twitter-hashtag pretty-link" data-query-source="hashtag_click"><s>#</s><b>TitaniumJP</b></a></p>
<cite>via: <a href="https://twitter.com/#!/masuidrive/status/185117413468160000" target="_blank">Twitter / @masuidrive: Titanium Mobile 2.0リリース発表を ...</a></cite>
</blockquote>

TitaniumMobile2.0期待！

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123986/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51xs9gdl3mL._SL160_.jpg" alt="Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123986/hous-22/ref=nosim/" name="amazletlink" target="_blank">Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798123986/hous-22/ref=nosim/" title="Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)" target="_blank">amazlet</a> at 12.02.06</div></div><div class="amazlet-detail">北尾 雅人 <br />翔泳社 <br />売り上げランキング: 11403<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123986/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>TortoiseGitとmsysgitではじめるWindowsGit生活</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/03/tortoisegitmsysgitwindowsgit.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1285</id>
   
   <published>2012-03-09T06:24:40Z</published>
   <updated>2012-03-09T06:34:28Z</updated>
   
   <summary> Windowsにgitを入れたことがなかったので、比較的ラクに導入する方法をい...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="601" label="TortoiseGit" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="227" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="575" label="git" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="602" label="msysgit" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[Windowsにgitを入れたことがなかったので、比較的ラクに導入する方法をいろいろ調べてみたところ、TortoiseSVNならぬ<strong>TortoiseGIT</strong>があったので、これの導入までをメモ。

このTortoiseGITを使えば、コードとか書かないけどWindows上でgit使わないといけなくなってしまったPMさんとかデザイナーさんでも安心してgitを使うことができると思います。

TortoiseGitを使うには、<strong>msysgit</strong>というツールをインストールする必要があります。
このmsysgitがgitの実体です。
その昔、Cygwinを入れて、gitを使うという方法があったようですが、今はこのツールだけあればgitが使えます。（日本語が使えないですが）


<h2>msysgitのインストール</h2>

<a href="https://github.com/msysgit/msysgit/wiki/InstallMSysGit" target="_blank">InstallMSysGit · msysgit/msysgit Wiki</a>

以下から、<strong>msysGit-fullinstall-1.7.9-preview20120201.exe</strong>をダウンロードします。
<a href="http://code.google.com/p/msysgit/downloads/list" target="_blank">Downloads - msysgit - Git for Windows - Google Project Hosting</a>

展開先を「C:\msysgit」のままにして実行しました。
もし他のパスがよい場合は適宜変更してください。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Windows 7 x64.png" src="http://hisasann.com/housetect/2012/03/09/Windows%207%20x64.png" width="500" height="362" class="mt-image-none" style="" /></span>

すると、上の画像のようなコンソールが出てきます。
これでインストールは完了だとは思うのですが、

<a href="https://github.com/msysgit/msysgit/wiki/InstallMSysGit" target="_blank">InstallMSysGit · msysgit/msysgit Wiki</a>に書いてある以下のシェルを実行しときました。

<blockquote>
/share/msysGit/initialize.sh 
</blockquote>

このmsysgitの面白いところが、<strong>Unixコマンド</strong>が打てることです。
llとかpwdとかUnix上で使っていたコマンドが使えます。

サイドこのプロンプトを開きたいときは、

<blockquote>
C:\msysgit\msysgit\msys.bat
</blockquote>

を実行します。
なので、このファイルのショートカットを作っておくと便利かもしれません。

あと、msysgitは<strong>ssh-keygen</strong>が使えます！


<h2>gitの設定ファイル「.gitconfig」の場所</h2>

<blockquote>
C:\Users\hoge\.gitconfig
</blockquote>

ここにおいてあります。

せっかくなので、コンソールからグローバルなユーザー名とメールアドレスを設定しちゃいましょう。
msys.batを起動して、以下のコマンドを打ちます。
ユーザー名とメールアドレスは適宜読み替えてください。

<blockquote>
git config --global user.name "hoge"
git config --global user.email "hoge@hoge.com"
</blockquote>

では環境設定を表示してみましょう。

<blockquote>
git var -l
</blockquote>

<strong>user.name</strong>と<strong>user.email</strong>がちゃんと反映されています。

<blockquote>
core.symlinks=false
core.autocrlf=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/mingw/bin/curl-ca-bundle.crt
sendemail.smtpserver=/mingw/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
http.proxy=
user.name=hoge
user.email=hoge@hoge.com
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=c:/_/dev/gittestrepos/test.git/
branch.master.remote=origin
branch.master.merge=refs/heads/master
GIT_COMMITTER_IDENT=hoge hoge@hoge.com 1331271139 +0900
GIT_AUTHOR_IDENT=hoge hoge@hoge.com 1331271139 +0900
GIT_EDITOR=vi
GIT_PAGER=less
</blockquote>


<h2>TortoiseGITのインストール</h2>

<a href="http://code.google.com/p/tortoisegit/" target="_blank">tortoisegit - Porting TortoiseSVN to TortoiseGIT - Google Project Hosting</a>

以下から、<strong>TortoiseGit-1.7.7.0-64bit.msi</strong>をダウンロードします。
32bitな方は、32bitのほうをダウンロードしてください。
<a href="http://code.google.com/p/tortoisegit/downloads/list" target="_blank">Downloads - tortoisegit - Porting TortoiseSVN to TortoiseGIT - Google Project Hosting</a>

<blockquote>
<p>TortoiseGitのインストール時には使用するSSHクライアントを設定するが、GUIメインで利用するなら「TortoisePLink」を利用する設定にすると使い勝手が良いだろう</p>
<cite>via: <a href="http://sourceforge.jp/magazine/09/06/19/0340248" target="_blank">実用レベルに達したWindows向けGitクライアント「TortoiseGit」でGitを始めよう - SourceForge.JP Magazine : オープンソースの話題満載</a></cite>
</blockquote>

これを呼んだので、特に何も迷わずに次へ次へと進んでみました。
これでインストールは完了。
すごく簡単！

ちなみに、msysgitのコンソールから「git commit -m 'テスト'」のように日本語を入力することができません。
ですが、TortoiseGITからのcommitでは日本語が通るので問題ありませんね。

あとは、使って慣れる！
<a href="http://rogerdudler.github.com/git-guide/index.ja.html" target="_blank">git - 簡単ガイド</a>とか読んで慣れる！


<h2>番外編 - リモートリポジトリをローカルに配置してちょっとしたバージョン用にgitを使ってみる</h2>

僕はブログの記事（比較的長文）を書くときは、間違えてファイルを消したりしたとき用にgitを使ってバージョン管理しています。
一般的にはローカルのリポジトリで作業して、リモート（別のサーバーや端末）に対してpushすると思うのですが、そこまでしないけどバージョンしたいときに以下のようにして使っています。

<h2>ローカルでリポジトリを作成する</h2>

<blockquote>
% cd 適当なディレクトリ
% mkdir gittest
% cd gittest
% git init

% touch README
% git add README
% git commit -m 'first commit'
</blockquote>

<h2>ローカルでリモートリポジトリを作成する</h2>

<blockquote>
% mkdir /c/gittestrepos/gittest.git
% cd /c/gittestrepos/gittest.git
% git --bare init
</blockquote>

<h2>ローカルからローカルにあるリモートリポジトリにpushする</h2>

<blockquote>
% cd 適当なディレクトリ
% git remote add localrepos /c/gittestrepos/gittest.git
% git push localrepos master
</blockquote>

上記ではmsysgitを使ってやってみました。
/c/というのがCドライブになります。

このように別にリモートだからといって、別の端末になくてもいいんですよね。
このあとに、もしgithubにコミットしたいと思ったときはremoteをaddすればよいので、楽チンかなーと思います。

■参考リンク
<a href="http://yakinikunotare.boo.jp/orebase/index.php?Git%2F%B0%EC%BF%CD%A4%C7%BB%C8%A4%C3%A4%C6%A4%DF%A4%EB%A1%CAmsysgit%CA%D4%A1%CB" target="_blank">Git/一人で使ってみる（msysgit編） - 俺の基地</a>
<a href="http://yakinikunotare.boo.jp/orebase/index.php?Git%2F%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A1%CAWindowsXP%CA%D4%A1%CB#d92be42d" target="_blank">Git/インストール（WindowsXP編） - 俺の基地</a>
<a href="http://blog.cnu.jp/2010/10/26/install-msysgit/" target="_blank">msysgitインストール 〜 sshでのgitリポジトリアクセスまで | Happy my life</a>
<a href="http://webcache.googleusercontent.com/search?q=cache:OvDG3LkscUMJ:blog.champierre.com/670+&cd=1&hl=ja&ct=clnk&gl=jp" target="_blank">せっかちな人のための git 入門 - git をインストールし、共同で開発できる環境を整えるまで - 僕は発展途上技術者</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274068641/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51WQ7GsnOZL._SL160_.jpg" alt="Gitによるバージョン管理" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274068641/hous-22/ref=nosim/" name="amazletlink" target="_blank">Gitによるバージョン管理</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4274068641/hous-22/ref=nosim/" title="Gitによるバージョン管理" target="_blank">amazlet</a> at 12.03.09</div></div><div class="amazlet-detail">岩松 信洋 上川 純一 まえだこうへい 小川 伸一郎 <br />オーム社 <br />売り上げランキング: 24163<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274068641/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>githubのgh-pagesブランチを使って自作サイトを表示する方法</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/02/githubgh-pages.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1284</id>
   
   <published>2012-02-24T06:03:47Z</published>
   <updated>2012-02-24T06:22:51Z</updated>
   
   <summary> こちらの30分、JavaScriptで作るWebサービスのモックアップ - ゆ...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="575" label="git" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="599" label="github" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[こちらの<a href="http://yusukebe.com/archives/20120222/081031.html" target="_blank">30分、JavaScriptで作るWebサービスのモックアップ - ゆーすけべー日記</a>記事を拝見して、僕もざっくりとしたInstagramAPIを使ったサイトを作ってみた。


<h2>ひたすらラーメンの写真を表示するInstagramサイト - Ramenstagram</h2>

<a href="http://hisasann.github.com/Ramenstagram/" target="_blank">Ramenstagram</a>


<h2>ひたすらBlackMilの写真を表示するInstagramサイト - I Love BlackMilk!</h2>

<a href="http://hisasann.github.com/ILoveBlackMilk/" target="_blank">I Love BlackMilk!</a>

またくだらないものを・・・


<h2>githubリポジトリを作る</h2>

ではではまずはgithubの<strong>リポジトリ</strong>を作りましょう！

githubでリポジトリを作り、ローカルで以下のように実行する。
基本的なgithubの手順ですね。

<blockquote>
mkdir Ramenstagram
cd Ramenstagram/
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin git@github.com:hisasann/Ramenstagram.git
git push -u origin master
</blockquote>


<h2>gh-pagesブランチを作成する</h2>

<a href="http://pages.github.com/#project_pages" target="_blank">GitHub Pages - Home</a>に書いてあるとおりですが、以下のようにコマンドを実行してブランチを作成します。

<blockquote>
cd Ramenstagram/
git symbolic-ref HEAD refs/heads/gh-pages
rm .git/index
git clean -fdx
echo "My GitHub Page" > index.html
git add .
git commit -a -m "First pages commit"
git push origin gh-pages
</blockquote>

これで<strong>git branch</strong>してみると、

<blockquote>
* gh-pages
  master
</blockquote>

となっているので、現在作業中のブランチは「<strong>gh-pages</strong>」ということになる。


<h2>githubサイトにて</h2>

<strong>admin</strong>ボタンをクリック。

すると以下の画像のように、すでに<strong>GitHub Pages</strong>が作られていて、チェックボックスにチェックが入っている。
これは、gh-pagesというブランチを作ると自動的にチェックが入るよう。
逆にgitコマンドからではなく、<strong>adminページ</strong>にて、チェックを入れても同じようにgh-pagesブランチが作られる。
どっちが楽かはあなた次第！

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Administration for hisasann_Ramenstagram - GitHub.png" src="http://hisasann.com/housetect/2012/02/24/Administration%20for%20hisasann_Ramenstagram%20-%20GitHub.png" width="500" height="271" class="mt-image-none" style="" /></span>

そして、
http://hisasann.github.com/Ramenstagram
にアクセスしてみると、ちょっと待っててよ的な画面が。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="GitHub Pages - File Not Found - GitHub-2.png" src="http://hisasann.com/housetect/2012/02/24/GitHub%20Pages%20-%20File%20Not%20Found%20-%20GitHub-2.png" width="500" height="282" class="mt-image-none" style="" /></span>

少し時間を置くと以下のようにindex.htmlの内容が表示された！

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="GitHub Pages - File Not Found - GitHub-1.png" src="http://hisasann.com/housetect/2012/02/24/GitHub%20Pages%20-%20File%20Not%20Found%20-%20GitHub-1.png" width="139" height="46" class="mt-image-none" style="" /></span>

あとは、このブランチに自分のサイト用のHTMLやらJavaScriptやらCSSやらを配置してコミットすれば自動的に反映される！
便利！


<h2>InstagramのtagAPIを使ってJSONを返すnode.jsコード</h2>

ちなみにInstagramのJSONを取得しているのはnode.jsで作っています。

<textarea name="code" class="js">
var url  = require('url'),
    https = require('https'),
    http = require('http'),
    express = require('express');

var recent = '';

var app = express.createServer();
app.set('view options', { layout: false });
app.get('/instagram_tag', function(req, res){
	var code = req.query.code;
	if (code) {
		return;
	}

	var access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX';
    var u = url.parse('https://api.instagram.com/v1/tags/' + req.query.tag + '/media/recent');
    var param = "?access_token=" + access_token;
    var head = true;

    https.get({
            host: u.hostname,
            port: u.port,
            path: u.pathname + param,
            method: 'POST'
    }, function(data) {
            var body = '';

            data.on('data', function(chunk) {
                    if(head){
                            res.writeHead(200, {'Content-Type': 'text/plain'});
                            head = false;
                    }
                    body += chunk.toString();
            });

            data.on('end', function() {
                    recent = JSON.parse(body);
                    res.write(JSON.stringify(recent));
                    res.end();
            });
    }).on('error', function(e) {
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write(e);
            res.end();
    });
});
app.listen(8126);

var Log = require('log'),
        fs = require('fs'),
        stream = fs.createWriteStream(__dirname + '/instagram_tag.log'),
        log = new Log(Log.INFO, stream);

// catchされなかった例外の処理設定
process.on('uncaughtException', function (err) {
        log.info('$: uncaughtException => ' + err);
});
</textarea>

フロントのJavaScriptだけで完結したほうが綺麗なんですが、<strong>access_token</strong>をバレたくないので、いったんこのnodeがプロキシになってInstagramのtag情報から画像を返すようにしています。

<a href="https://gist.github.com/1898324" target="_blank">InstagramのtagAPIを使ってJSONを返すnode.js版プロキシー -- Gist</a>

■参考リンク
<a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-workflow/" target="_blank">実践GitHub Pages運用のユースケースとワークフローの詳細 | ゆっくりと...</a>
<a href="http://d.hatena.ne.jp/kanonji/20110221/1298263044" target="_blank">GithubのProject Pagesを作る手順を調べてみた。もしくはgitで空ブランチを作る方法を調べてみた。 - kanonjiの日記</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41k7xonwpdL._SL160_.jpg" alt="入門git" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/hous-22/ref=nosim/" name="amazletlink" target="_blank">入門git</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/427406767X/hous-22/ref=nosim/" title="入門git" target="_blank">amazlet</a> at 12.02.24</div></div><div class="amazlet-detail">Travis Swicegood <br />オーム社 <br />売り上げランキング: 10517<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>クロスドメイン用のHTTPレスポンスヘッダー - Perlスクリプト版</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/02/http_-_perl.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1283</id>
   
   <published>2012-02-15T05:39:21Z</published>
   <updated>2012-02-15T05:40:43Z</updated>
   
   <summary> iPhoneのSafariとAndroidのブラウザ、PCのSafariとCh...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="212" label="Ajax" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="378" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="453" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="574" label="XMLHttpRequest2" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[iPhoneのSafariとAndroidのブラウザ、PCのSafariとChromeで<strong>クロスドメインなAjax</strong>を行う場合のレスポンスヘッダーで地味にハマったので、忘れないうちにメモしとく。

たいていの場合、.htaccessファイルに「<strong>Access-Control-Allow-Origin: *</strong>」を含めておけばいけまっせー！的な感じで書かれている場合が多いが、CGIとして書く場合にはもう1個だけ重要なものがあります。

それが、

<strong>Content-Length</strong>

！！

Content-Lengthが正しくないと<strong>Androidのブラウザ</strong>、<strong>PCのChrome</strong>でAjax通信でレスポンスが返ってきてくれない。
まぁ、あんまりCGIとして書くケースはないのかもしれないのですが、.htaccessを使えないときには有効かもしれません。


<h2>Perlのコード</h2>

大体こんな感じでJSONを返すCGIを書いたときに、「Access-Control-Allow-Origin: *」と「Content-Length」　を正確に返す必要がある。
なので、以下コードでうまくいく。

<textarea name="code" class="php">
#!/usr/bin/perl

$json = '{"hoge":"hogehoge","foo":"foofoo"}';

print "Content-type: text/plain;charset=UTF-8\n";
print "Cache-Control: no-cache\n";
print "Access-Control-Allow-Origin: *\n";
print "Access-Control-Allow-Headers: *\n";
print "Access-Control-Allow-Methods: GET, HEAD, POST, TRACE, OPTIONS\n";
print "Content-Length: ", length($json), "\n";	# ここ重要
print "Connection: close\n";
print "\n";

print $json
</textarea>


<h2>Ajaxアクセス用のコード</h2>

こっちはこれだけ。
IEを考慮していないので、XDomainRequestは無視しています。

<textarea name="code" class="php">
var jqxhr = $.ajax({
	type: "post",
	url: "http://hogehoge/json.cgi",
	data: {},
	dataType: "json",
	cache: false
})
.success(function(json) {
	console.log(json);
})
.error(function(XHR, textStatus, errorThrown) {	// textStatus - "timeout", "error", "notmodified", "parsererror"
	alert("error");
});
</textarea>


また、ちょっと古い記事ですが、クロスドメインなAjaxに対応したブラウザをご覧になりたい場合は、<a href="http://hisasann.com/housetect/2010/11/xmlhttprequest_level2.html">XMLHttpRequest level2に対応しているブラウザまとめ</a>をば。

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114276/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Hgdb6WcQL._SL160_.jpg" alt="初めてのPerl 第5版" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114276/hous-22/ref=nosim/" name="amazletlink" target="_blank">初めてのPerl 第5版</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873114276/hous-22/ref=nosim/" title="初めてのPerl 第5版" target="_blank">amazlet</a> at 12.02.15</div></div><div class="amazlet-detail">Randal L. Schwartz Tom Phoenix brian d foy <br />オライリージャパン <br />売り上げランキング: 30529<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114276/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>MacOSX LionにPhoneGapをインストールしたときのメモ（2012-02-09時点） - iPhone／Android対応</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/02/macosx_lionphonegap2012-02-09.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1282</id>
   
   <published>2012-02-09T05:51:18Z</published>
   <updated>2012-02-09T06:29:15Z</updated>
   
   <summary> iPhone版 PhoneGapもTitanium Mobile同様、結構ググ...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="583" label="Android" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="489" label="CSS3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="515" label="HTML5" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="378" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="598" label="PhoneGap" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="126" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="PhoneGap.png" src="http://hisasann.com/housetect/2012/02/09/PhoneGap.png" width="470" height="248" class="mt-image-none" style="" /></span>


<h2>iPhone版</h2>

<strong>PhoneGap</strong>もTitanium Mobile同様、結構ググると情報が古い。
特にXCodeが3から4に上がったとこで、かなりUIも変わっているので、昔の情報はあんまり役に立たない。

なので、PhoneGapのサイトにある<strong>Get Started Guide</strong>を見ながらいろいろ試してみました。
<a href="http://phonegap.com/start" target="_blank">Get Started Guide « PhoneGap</a>


<h2>PhoneGapをダウンロードする</h2>

<a href="http://phonegap.com/download" target="_blank">Download « PhoneGap</a>よりDownloadボタンをクリックし、PhonGapをダウンロードします。

現時点（2012-02-07）では<strong>1.4.1</strong>のようです。
zipファイルを解凍します。


<h2>PhoneGapをインストールする（iOS版）</h2>

以下のディレクトリのdmgファイルをダブルクリックします。

<blockquote>
/phonegap-1.4.1/lib/ios/PhoneGap-1.4.1.dmg
</blockquote>

すると、<strong>PhoneGap-1.4.1.pkg</strong>ファイルが出現するので、次へ次へを押してインストールします。


<h2>XCodeでPhoneGapプロジェクトを作成する</h2>

XCodeのメニュー「File→New→New Project」を選択します。
以下のようにPhoneGapプロジェクトを選択し、プロジェクトを作成します。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Xcode-2.png" src="http://hisasann.com/housetect/2012/02/09/Xcode-2.png" width="470" height="314" class="mt-image-none" style="" /></span>

"Product Name"と"Company Identifier"を入力します。
とりあえず、僕は以下の感じでやりました。
Company Identifierはご自分の<strong>Bundle identifier</strong>を入力してくださいね。
（ゆくゆく実機で動かすため）

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Xcode.png" src="http://hisasann.com/housetect/2012/02/09/Xcode.png" width="470" height="336" class="mt-image-none" style="" /></span>


<h2>何はともあれRunさせる</h2>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Xcode-3.png" src="http://hisasann.com/housetect/2012/02/09/Xcode-3.png" width="425" height="54" class="mt-image-none" style="" /></span>

↑の画像ようにiPhoneのシミュレータでRunボタンをクリックしてみたところ、
以下のエラーが出ちゃいました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-07 16.15.23.png" src="http://hisasann.com/housetect/2012/02/09/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-07%2016.15.23.png" width="470" height="883" class="mt-image-none" style="" /></span>

確かに、

<blockquote>
<p>Next step is <strong>IMPORTANT</strong>! Drag the <strong>www</strong> folder into Xcode 4. You can't just drag the www folder into your app's folder. It needs to be dragged into Xcode 4!! In my case I would drag it and drop it on HiWorld shown below.</p>
<cite>via: <a href="http://phonegap.com/start" target="_blank">Get Started Guide « PhoneGap</a></cite>
</blockquote>

と、どうやら<strong>www</strong>というフォルダがないからプロジェクトに追加してね的な話のようです。
ここも、過去のPhoneGapでは、wwwフォルダが<strong>デフォルトで</strong>あったりしてたようで、ググるとそっちが出てきてちょっと困ってしまいました。

そしていろいろぐぐっているとドンピシャな記事が、

<blockquote>
<p><ol><li>XCodeの左ペインのプロジェクトのアイコンを右クリック</li>
<li>Add files to プロジェクト名...を選択</li>
<li>作成したプロジェクトのフォルダの中にwwwというフォルダがあるので選択</li>
<li>表示されるダイアログの下の方に「Create folder references for any added folders」というのがあるので選択してAddボタンを押す</li>
<li>XCodeの左ペインの中に青い色でwwwフォルダが表示される</li>
<li>この状態でビルドすればSimulatorでindex.htmlの内容が表示されます</li></ol></p>
<cite>via: <a href="http://stack3.net/blogdev/p/811" target="_blank">[PhoneGap] PhoneGapでwwwフォルダがない | スタックスリー開発奮闘ブログ</a></cite>
</blockquote>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Xcode-1.png" src="http://hisasann.com/housetect/2012/02/09/Xcode-1.png" width="470" height="493" class="mt-image-none" style="" /></span>

これで、wwwフォルダがXCode上に表示され、かつビルドが通るようになりました！
（なんなんだ、このワンステップは。。。）

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-07 16.23.20.png" src="http://hisasann.com/housetect/2012/02/09/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-07%2016.23.20.png" width="470" height="883" class="mt-image-none" style="" /></span>


<h2>実機で動かす場合</h2>

<h2>プロビジョニングファイルの作成</h2>

ぶっちゃけこのステップが一番面倒なんですが、やらないとダメみたいなので、やるしかないですね。
以下の記事を順番にやっていくと、いつのまにか終わっています。
<a href="http://ascii.jp/elem/000/000/606/606521/index-4.html" target="_blank">ASCII.jp：JavaScriptでiPhoneアプリ開発！NimbleKit入門｜古籏一浩のJavaScriptラボ</a>

そしてiPhoneをつないで、XCodeの「Window→Organizer→DEVICES」にて
「<strong>Use for Development</strong>」
をクリックすると、これまたいつの間にかiPhoneの認証が終わってる！イエス！


<h2>iPhoneの実機での動作確認</h2>

iPhoneが繋がっている状態なら、XCodeのシミュレータのところに自分のiPhoneの名前が出ているので、それを選択してRunするだけ。
これで、自分のiPhoneでアプリが動き出す。

<hr>


<h2>Android版</h2>

<h2>必要なものをセットアップ</h2>

Android版はXCodeは使いません。
なので、<strong>eclipse</strong>のセットアップをする必要があります。

eclipseは<strong>3.7</strong>を使って、Mac版のAll in one eclipseはないので、以下の記事をもとに自力で作ります。
<a href="http://d.hatena.ne.jp/architshin/20110224/1298519661" target="_blank">MacでPleiades All in One Eclipse - Archit!!</a>
そんなに難しくないので、手順通りに行なってください。
（All in oneを求めていない方は、eclipse単体でOKです）

eclipse以外に以下のものが必要になりますが、これは<a href="http://www.atmarkit.co.jp/fsmart/articles/phonegap01/01.html" target="_blank">PhoneGapでAndroidアプリを作るための基礎知識（1/3） - ＠IT</a>この記事がすごく参考になります。
セットアップしちゃいましょう！

<ol>
	<li>Android SDK</li>
	<li>ADT Plugin</li>
	<li>PhoneGap（すでのiPhoneのほうでダウンロードしていますね）</li>
</ol>


<h2>Android Projectを作成し、PhoneGapに必要なファイルを配置する</h2>

eclipseの「File→New→Other」と選択し、Androidの配下にある<strong>Android Project</strong>を選択します。
プロジェクトが作成されましたら、以下のようにphonegapの必要なファイルをコピーしてください。

<blockquote>
assetsフォルダの下に<strong>wwwフォルダ</strong>を作成
「phonegap-1.4.1/lib/android/phonegap-1.4.1.js」をコピー
index.htmlを作成
</blockquote>

<blockquote>
プロジェクト直下に<strong>libsフォルダ</strong>を作成
「phonegap-1.4.1/lib/android/phonegap-1.4.1.jar」をコピー
</blockquote>

<blockquote>
resフォルダの下に<strong>xmlフォルダ</strong>を作成
「phonegap-1.4.1/lib/android/xml/plugins.xml」をコピー
</blockquote>

あとは、phonegap-1.4.1.jarを右クリックしてBuild PathからAdd to Build Pathを選択します。

最終的にこんな感じです。
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Java - phonegap_assets_www_index.html - Eclipse - _Users_hisamatsu___dev_workspace.png" src="http://hisasann.com/housetect/2012/02/09/Java%20-%20phonegap_assets_www_index.html%20-%20Eclipse%20-%20_Users_hisamatsu___dev_workspace.png" width="233" height="531" class="mt-image-none" style="" /></span>

これでベースは整いました。


<h2>Android ProjectをPhoneGap仕様にする</h2>

<h2>AndroidManifest.xml</h2>

<textarea name="code" class="html">
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hisasann"
    android:versionCode="1"
    android:versionName="1.0" >

	<!-- 9というのは2.3.2のこと -->
    <uses-sdk android:minSdkVersion="9" />

	<!-- <supports-screens>要素は、どの解像度にアプリを対応させるかなどの設定を行う記述です。 -->
	<!-- ▼追加 -->
	<supports-screens android:largeScreens="true"
    	              android:normalScreens="true"
        	          android:smallScreens="true"
        	          android:xlargeScreens="true"
            	      android:resizeable="true"
                	  android:anyDensity="true"
	/>
    <!-- ▲追加 -->

	<!-- <uses-permission>要素は、アプリが端末に要求する機能を許可するかどうかを設定する記述です。本来は必要な機能にのみ許可を与えるようにします。 -->
	<!-- ▼追加 -->
	<uses-permission android:name="android.permission.CAMERA" />
	<uses-permission android:name="android.permission.VIBRATE" />
	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
	<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
	<uses-permission android:name="android.permission.READ_PHONE_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.RECORD_VIDEO"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <!-- ▲追加 -->

	<!-- ▼追加 -->
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <!-- ▲追加 -->

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".PhonegapActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden"><!-- 追加：「android:configChanges」には、アクティビティを再起動せずに処理を続けさせたい場合の情報を記述します。 -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
		<!-- ▼追加 -->
        <activity
			android:name="com.phonegap.DroidGap"
			android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden">
            <intent-filter>
            </intent-filter>
        </activity>
    	<!-- ▲追加 -->
    </application>

</manifest>
</textarea>

ここで一点注意ですが、uses-sdk android:minSdkVersionに<strong>9</strong>と入れていますが、これは<strong>2.3.2</strong>を意味しています。
Android SDK Managerでは2.3は<strong>2.3.3</strong>しかダウンロードできないため、ここで2.3.2を許容しておきます。
（というかそもそもuses-sdk android:minSdkVersion書かなければいいのかな）


<h2>src/PhonegapActivity.java</h2>

<textarea name="code" class="js">
package com.hisasann;

import android.os.Bundle;
import com.phonegap.DroidGap;

//PhoneGapフレームワークで用意されたDroidGapクラスを、親クラスに指定します。
public class PhonegapActivity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     // DroidGapのloadUrlメソッドで、アプリケーション画面を記述しているHTMLファイルを呼び出します。「file:///android_asset/www/index.html」は、「assets」フォルダ内のindex.htmlのことです。
        super.loadUrl("file:///android_asset/www/index.html");
    }
}
</textarea>


<h2>assets/www/index.html</h2>

<textarea name="code" class="js">
<!DOCTYPE HTML>
<html>
<head>
  <title>PhoneGap</title>
	<script type="text/javascript" charset="utf-8" src="js/phonegap-1.4.1.js"></script>
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>
</textarea>

phonegap-1.4.1.jsファイルはjsというフォルダの中に配置しました。


<h2>何はともあれRunさせる</h2>

プロジェクトを右クリックして「Run As→Android Application」を選択します。
ちょっと時間がかかります。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-09 14.10.07.png" src="http://hisasann.com/housetect/2012/02/09/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-09%2014.10.07.png" width="500" height="465" class="mt-image-none" style="" /></span>

ちょっといいなと思ったのが、一度シミュレータが起動したらそのまま閉じないでおいて、
index.htmlの修正をしても、もう一度「Run As→Android Application」をするだけです。
これかなり速いです。
なので、のっけのシミュレータの起動だけは結構重いですが、その後の修正点の反映は速いかもしれません。


<h2>Androidの実機での動作確認</h2>

Android端末の設定で、「アプリケーション→開発→USBデバックにチェックをつけるだけ。
これで、プロジェクトを右クリックして「Run As→Android Application」を選択すると、実機側でアプリが起動する。
簡単！

■関連記事
<a href="http://hisasann.com/housetect/2012/02/macosx_liontitanium_mobilestud.html" target="_blank">MacOSX LionにTitanium Mobile（Studioも）をインストールしたときのメモ（2012-02-06時点） - iPhone／Android対応</a>

■参考リンク
以下のリンク先から今回の記事のヒントを大量にいただきました。
ありがとうございます！
<a href="http://www.atmarkit.co.jp/fsmart/articles/phonegap01/01.html" target="_blank">PhoneGapでAndroidアプリを作るための基礎知識（1/3） - ＠IT</a>
<a href="http://dev.classmethod.jp/smartphone/phonegap-trial/" target="_blank">PhoneGapを試してみる ｜ Classmethod.dev()</a>
<a href="http://phonegap-fan.com/install3.php" target="_blank">インストール方法(Android編) | PhoneGap Fan</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798124257/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51rUHCD-ykL._SL160_.jpg" alt="PhoneGap 入門ガイド (Smart Mobile Developer)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798124257/hous-22/ref=nosim/" name="amazletlink" target="_blank">PhoneGap 入門ガイド (Smart Mobile Developer)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798124257/hous-22/ref=nosim/" title="PhoneGap 入門ガイド (Smart Mobile Developer)" target="_blank">amazlet</a> at 12.02.09</div></div><div class="amazlet-detail">アシアル株式会社 <br />翔泳社 <br />売り上げランキング: 225899<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798124257/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>MacにGoogle日本語入力を入れている場合、VMwareFusion側のeclipseのCtrl+Shift+Rが効かない場合の対処</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/02/macgooglevmwarefusioneclipsect.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1281</id>
   
   <published>2012-02-07T04:20:51Z</published>
   <updated>2012-02-07T05:38:40Z</updated>
   
   <summary> 非常に地味な話ですが、 Mac側にGoogle日本語入力をインストールしていて...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="149" label="Eclipse" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="103" label="Google" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="517" label="VMware" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="227" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[非常に地味な話ですが、
Mac側にGoogle日本語入力をインストールしていて、かつVMwareFusion側のWIndowsにもGoogle日本語入力入れていて、
Windows上でeclipseを使う場合、<strong>Ctrl+Shift+R</strong>がGoogle日本語入力の再変換というキーボードショートカットに奪われてしまう場合の対応になります。
（この需要あるのかな。。。）


<h2>VMware側のMac OS キーボードショートカットを無効にする</h2>

ちょっとこれしたくなかったのですが、eclipseで<strong>Ctrl+Shift+R</strong>が使えないのは、<strong>ラーメンを前にしてレンゲがない</strong>ぐらいに大変なことなので、やるよ。僕やるよ。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-07 13.21.08.png" src="http://hisasann.com/housetect/2012/02/07/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-07%2013.21.08.png" width="470" height="440" class="mt-image-none" style="" /></span>

VMwareFusionの環境設定→キーボードとマウスで、
「Mac OS キーボードショートカットを有効にする」のチェックを<strong>外します</strong>。

Mac側の設定はこれだけ。


<h2>ソフト毎にIMEを切り替える「あいち」をWindowsに入れる</h2>

このソフトを使うと、ソフト毎にどのIMEを使うかを自動で切り替えてくれる。
つまり、eclipseはMicrosoft IMEだけど、それ以外のソフトではGoogle日本語入力を使う。
といったことが可能になる。

■ダウンロード
<a href="http://www.program-lab.jp/software/aich.html#download" target="_blank">プログラミング研究所 - あいち</a>

どうやるかは以下の記事が非常に参考になる。
<a href="http://www.forest.impress.co.jp/docs/review/20091225_339689.html" target="_blank">窓の杜 - 【REVIEW】アプリケーションごとに利用するIMEを自動で切り替える「あいち」</a>

僕は、対象のソフトがアクティブになった場合に出る通知機能は無効かしました。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Windows 7 x64.png" src="http://hisasann.com/housetect/2012/02/07/Windows%207%20x64.png" width="470" height="327" class="mt-image-none" style="" /></span>


これよりももっといい方法あるとは思うんですが、いまいちわからなかった。
一個デメリットは、Windows側でCmd+Tabすると、エアロが起動してしまうこと。
Mac側のアプリ切り替えが動いて欲しいが、ショートカットを無効化してしまっているので、ここはしょうがないですね。


<h2>まとめ</h2>

<ol>
	<li>VMwareFusionのMac OS キーボードショートカットを無効にする</li>
	<li>あいちをWindowsにインストールする</li>
	<li>eclipseの場合にMicrosoft IMEにするようにする</li>
</ol>

こんな感じですね。

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B005OT5JQW/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51UHGny9PlL._SL160_.jpg" alt="VMware Fusion 4 プロモーション期間限定優待版" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B005OT5JQW/hous-22/ref=nosim/" name="amazletlink" target="_blank">VMware Fusion 4 プロモーション期間限定優待版</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/B005OT5JQW/hous-22/ref=nosim/" title="VMware Fusion 4 プロモーション期間限定優待版" target="_blank">amazlet</a> at 12.02.07</div></div><div class="amazlet-detail">アクト・ツー (2011-10-14)<br />売り上げランキング: 187<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B005OT5JQW/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>MacOSX LionにTitanium Mobile（Studioも）をインストールしたときのメモ（2012-02-06時点） - iPhone／Android対応</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/02/macosx_liontitanium_mobilestud.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1280</id>
   
   <published>2012-02-06T10:04:36Z</published>
   <updated>2012-02-16T02:42:19Z</updated>
   
   <summary> 必要にせまられて、Titanium MobileとPhoneGapの調査が必要...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="583" label="Android" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="378" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="594" label="Titanium Mobile" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="596" label="Titanium Studio" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="126" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[必要にせまられて、<strong>Titanium Mobile</strong>と<strong>PhoneGap</strong>の調査が必要になったので、いろいろとメモを残しておきます。

今回Titanium Mobileの解説になります。
一応Titanium Mobileを入れた環境を以下に列挙しとく。

<dl class="data">
	<dt>MacOS X</dt>
	<dd>Lion</dd>
	<dt>Java</dt>
	<dd>1.6.0_29</dd>
	<dt>Titanium SDK</dt>
	<dd>1.8.1</dd>
	<dt>Titanium Studio</dt>
	<dd>1.0.8</dd>
</dl>

ちなみに、Lionから<strong>デフォルトでJavaが入らない</strong>ので、自分でSDKをインストールする必要があります。


<h2>Titanium Mobileのダウンロード（with Titanium Studio）</h2>

まずは、<strong>Titanium Studio</strong>をダウンロードします。
こちらをダウンロードすると、自動的にTitanium Mobileもダウンロードされます。

いろいろTitaniumのことでググるとTitanium Developerのことが検索されますが、今はもうTitanium Studioに統合されているようです。

<a href="https://my.appcelerator.com/auth/signup/offer/community" target="_blank">Sign Up for an Appcelerator Developer Account</a>
にアクセスし必要な情報を入力しサインインする。

あとは、<a href="https://my.appcelerator.com/resources" target="_blank">Resources</a>画面から<strong>OS X版</strong>をダウンロードする。


<h2>Titanium Studioを起動してみる</h2>

<strong>eclipse</strong>ベースなので比較的見慣れたUIですが、デフォルトで背景が黒いが個人的には好き。
起動すると、しばらく右下のあたりでゴニョゴニョアップデートに関する動作があるので、少し待ちましょう。
すると、Titanium Studioのアップデートを促されるのでやっちゃいます。やっちゃいましょう！


<h2>何はともあれTitanium Mobile Projectを新規作成してみる</h2>

メニューの「File」→「New」→「<strong>Titanium Mobile Project</strong>」を選びます。

そして以下のように必要な項目を入力していくんですが、ここで一つ問題が。
Androidのチェックボックスは、そもそもAndroidのSDKが入っていないとチェックができません。
おそらくiPhoneも同様だと思います。（すでにXCodeを入れていたので未確認）
iPhoneSDKに関しては<a href="http://gihyo.jp/dev/serial/01/iphone/0002" target="_blank">目指せ！iPhoneアプリ開発エキスパート：第2回　iPhone SDKの入手と設定｜gihyo.jp ... 技術評論社</a>の記事をご覧ください。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="New Titanium Mobile Project.png" src="http://hisasann.com/housetect/2012/02/06/New%20Titanium%20Mobile%20Project.png" width="470" height="430" class="mt-image-none" style="" /></span>

なので、一旦プロジェクトの新規作成は置いておいて、AndroidのSDKをインストールします。


<h2>AndroidSDKをダウンロードする＋そしてSDKをインストールする</h2>

<a href="http://developer.android.com/sdk/index.html" target="_blank">Android SDK | Android Developers</a>
から<strong>android-sdk_r16-macosx.zip</strong>を選びました。

解凍後、<strong>/android-sdk-macosx/tools/andoroid</strong>をダブルクリックして<strong>Android SDK Manager</strong>を起動します。

ちなみにですが、この時点、つまりAndroidSDKはダウンロードしたけど、まだどのバージョンのSDKもインストールしていない状態で、Titanium Studioの設定で、<strong>/android-sdk-macosx/</strong>の場所を指定してもSDK自体がインストールされていないので以下のようなエラーがでます。

<blockquote>
SDK at the given path has the following error: E...ion: No "android-8" or "android-2.2" in the Android SDK
</blockquote>

（のちのちさらにこのメッセージの意味を知ることになるとは・・・）

話をAndroid SDK Managerに戻します。
今回はスマートフォンアプリの開発に使うので、2.3をインストールします。
結構時間がかかりますが、気長に待ちましょう！
あと僕は<strong>Extras</strong>というところにある「Google〜〜」というのもほとんどインストールしておきました。


<h2>再度Titanium Mobile Projectを新規作成してみる</h2>

これで、ようやく<strong>iPhone</strong>と<strong>Android</strong>にチェックを入れた状態でプロジェクトを作成することができます。


<h2>AndroidSDKのパスを通す（がしかし）</h2>

「Preferences→Aptana Studio→Titanium」でAndroidのパス「/android-sdk-macosx/」を指定します。
このディレクトリは人によっては違うと思いますので、ご自分のパスを指定してください。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Preferences.png" src="http://hisasann.com/housetect/2012/02/06/Preferences.png" width="470" height="325" class="mt-image-none" style="" /></span>

ただし、これだけでは実はうまくいかない。

<blockquote>
SDK at the given path has the following error: E...ion: No "android-8" or "android-2.2" in the Android SDK
</blockquote>

相変わらずこのエラーが取れないのだ。
まぁ、よく読むと<strong>androidの2.2</strong>が必要だと言っているようです。
とくに2.2が必要ではないんですが、このエラーを取り除くには2.2を入れるしかないので、もう一度<strong>Android SDK Manager</strong>からインストールしてください。
ちなみにこの2.2というのは、最新のTitanium Studioのバージョン（2012-02-06）の場合なので、2.1を要求される場合もあるようです。


<h2>iPhone、AndroidのシミュレータでRunしてみる</h2>

やっとここまできました！
では実際にシミュレータで動かしてみましょう。

「Project Explorer」ペインの自分で作ったプロジェクトを右クリック→Run Asから<strong>iPhone Simulator</strong>選びます。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-06 17.41.38.png" src="http://hisasann.com/housetect/2012/02/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-06%2017.41.38.png" width="470" height="883" class="mt-image-none" style="" /></span>

続きまして、同じくRun Asから<strong>Android Emulator</strong>を選びます。
（iPhoneとは比べ物にならないくらい時間がかかります。本気です。）

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-06 17.52.50.png" src="http://hisasann.com/housetect/2012/02/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-06%2017.52.50.png" width="470" height="348" class="mt-image-none" style="" /></span>

iPhoneではフッターにタブが表示されていますが、Androidのほうはヘッダーにタグが表示されています。
（こうゆうもんなのかな？いずれわかるときが来るであろう）


<h2>いろいろサンプルが詰まっているKitchenSinkで遊んでみる</h2>

↑で試したのはたんなるタブがあるだけのサンプルですが、実際にどんなUIが出来上がるのかをいろいろ試せる<strong>KitchenSink</strong>を使ってみましょう！
なんとありがたいことに、Titanium Studioから直接このサンプルをダウンロードできます。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Web - test_Resources_app.js - Titanium Studio - _Users_hisamatsu___dev_TitaniumStudioWorkspace.png" src="http://hisasann.com/housetect/2012/02/06/Web%20-%20test_Resources_app.js%20-%20Titanium%20Studio%20-%20_Users_hisamatsu___dev_TitaniumStudioWorkspace.png" width="470" height="272" class="mt-image-none" style="" /></span>

あとは、KitchenSinkプロジェクトをRunさせるだけです。

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-06 18.01.51.png" src="http://hisasann.com/housetect/2012/02/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-06%2018.01.51.png" width="470" height="883" class="mt-image-none" style="" /></span>

■KitchenSinkのgithub
<a href="https://github.com/appcelerator/KitchenSink/" target="_blank">appcelerator/KitchenSink - GitHub</a>

KitchenSinkでだいたいのエッセンスが詰まっているので、あとはこれを応用する感じになるのかなーと思っています。
（ほんといっぱいサンプルあるので、助かります）

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット 2012-02-06 18.53.37.png" src="http://hisasann.com/housetect/2012/02/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-02-06%2018.53.37.png" width="470" height="348" class="mt-image-none" style="" /></span>

そして、実はこのプロジェクトをAndroidのEmulatorで実行すると以下のエラーが出ます。

<blockquote>
[ERROR] Failed installing com.appcelerator.titanium: pkg: /data/local/tmp/app.apk
</blockquote>

このエラーに悩まされて、断念された方も多々いるようですが、

<blockquote>
<p>結論として、Run Configuration で Android 2.2 じゃなくて、Google APIs Android 2.2 を使う。</p>
<cite>via: <a href="http://blog.vg4.net/archives/1363331.html" target="_blank">静電気日記@vg4.net : Titanium Studio for Windows 1.7.2で KitchenSink 起動させるプロジェクト。 - livedoor Blog（ブログ）</a></cite>
</blockquote>

これで解決しました。

とにかくTitanium Mobileでググると古い情報が上位に来てしまうので、今後この記事も同じように古くなってしまうとは思いますが、どなたかの手助けになれば幸いです。

また、こちらの記事のように、
<a href="http://www.infiniteloop.co.jp/blog/2011/04/titanium_mobile/" target="_blank">初心者でも２週間でiPhoneアプリが作れちゃうTitanium Mobileがすごい件 | 株式会社インフィニットループ技術ブログ</a>
<strong>CoffeeScript</strong>で組んでみるのも面白いかもしれません。


<h2>iPhoneの実機での動作確認</h2>

そっこうでエラーになって入らない。

<blockquote>
[INFO] One moment, building ...
Traceback (most recent call last):
  File "/Users/XXXX/Library/Application Support/Titanium/mobilesdk/osx/1.8.1/iphone/builder.py", line 1537, in <module>
    main(sys.argv)
  File "/Users/XXXX/Library/Application Support/Titanium/mobilesdk/osx/1.8.1/iphone/builder.py", line 705, in main
    dist_name = dequote(args[7].decode("utf-8"))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x97 in position 0: invalid start byte
</blockquote>

<a href="http://d.hatena.ne.jp/siso9to/20111229/1325184249" target="_blank">TitaniumでiPhoneへの実機転送時にはまった件のまとめ - Titanium/Androidアプリ開発メモ</a>に書かれているように、

<ol>
	<li>プロビジョニングプロファイルを指定したパスに日本語が入っている</li>
	<li>プロビジョニングプロファイルを作るために必要な証明書に日本語が含まれている</li>
</ol>

僕はこの2個目のほうでハマった。
そもそもAppleアカウントの<strong>firstName</strong>、<strong>lastName</strong>が日本語なのがまずかった。
しかも、これはこちら側では<strong>変えられない項目</strong>なので、Developer Centerにメール（英語）で依頼する必要がある。（面倒！）

そしてメールしてみた結果、

<blockquote>
既に開発チームの一員でいらっしゃるので、
氏名修正の手続きは長く、手間がかかる可能性がございます。
なお、修正させて頂けることは保証できません。
</blockquote>

ということなので、諦めてAppleIDの再取得をして、Apple Developer Programに追加してもらいました。
そして再度同じことを実施して、プロビジョニングプロファイルを作成して同期してみたところ、iTunesが起動してAPPの同期でうまいことiPhoneにアプリが入りました！

メモ：
<a href="http://zaru.tofu-kun.org/2011/08/09/taitanium-studio%E3%81%A7iphone%E5%AE%9F%E6%A9%9F%E8%BB%A2%E9%80%81%E3%82%92%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/" target="_blank">Titanium StudioでiPhone実機転送をする方法 | zaru blog</a>を読むと、あまりiTunesのアップデートをおろそかにすると、エラーが出るケースがあるようです。


<h2>Androidの実機での動作確認</h2>

こっちもそっこうでエラーになって入らない。

<blockquote>
[ERROR] Failed installing com.hisasann: pkg: /data/local/tmp/app.apk.
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
</blockquote>

いろいろ試してみたんですが、結局Application IDのところに<strong>ドットを2つ</strong>使うようなIDにしたらうまくいきました。
「com.hisasann.test」
のように、
「com.hisasann」
は、なぜかダメでした。
ただ、これは翌日になるとcom.hisasannでもうまいこと実機に転送されたので、いったいなんだったのか。。。

とりあえず今後はドットを2つ使うようにします。
<a href="http://blog.nought.jp/archives/1078" target="_blank">Titanium Studioで実機に転送できない at nought</a>

こちらでもドットについて言及されていました。

<blockquote>
<p>App Id:com.example.ti.blank<br>
+ ドメイン名を逆さ＋適当<br>
+ 必ずドット"."を含むこと（でないとandroidの時動かないよ）</p>
<cite>via: <a href="http://blog.goo.ne.jp/sohgoh/e/398daf70d4d1d053716237f42bf53ee9" target="_blank">Titanium Mobileセミナーに行ってきたのでそのメモ - I'm hungry</a></cite>
</blockquote>

さらにちょっとややこしいのが、実機にアプリを転送しても勝手に起動してくれません。

<blockquote>
<p>アプリは勝手に立ち上がらないので、コンソールに「Application installed. Launch from drawer on Home Screen」と出たら、自分でアプリケーションメニューを開いて、インストールされているアプリを起動しなくては行けません。</p>
<cite>via: <a href="http://labs.karappo.net/mobiledev/index.php?itemid=289&amp;catid=71" target="_blank">Mobile Dev. (Android + Java) » Titanium Studioで作成したプロジェクトを実機にインストールする</a></cite>
</blockquote>

やっとこの感覚になれてきましたが、はじめは分からないものですね。


■参考リンク
<a href="http://d.hatena.ne.jp/n-channel/20111227/1324979714" target="_blank">Titanium StudioでiPhoneアプリを作ろう その1 - n-channelの日記</a>
<a href="http://titanium-mobile.jimdo.com/titanium-studio%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8Bandroid%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%B9%E3%81%97/" target="_blank">開発環境をつくるべし！ - Titanium StudioではじめるAndroidアプリ開発</a>
<a href="http://yoo-s.com/topic/detail/366" target="_blank">yoo-s.com</a>
<a href="http://kitamu.sakura.ne.jp/wp/?p=305" target="_blank">今後はTitanium Studioで開発を。 | 備忘録的なブログ</a>
<a href="http://d.hatena.ne.jp/sngmr/20110706/1309914330" target="_blank">Titanium Studio をアップデートしたら Android SDK を認識しなくなった件 - モトクロスとプログラムと粉砕骨折と</a>
<a href="http://www.sawadaru.com/blog/?p=151" target="_blank">Sawalog » Titanium StudioでAndroid SDKを設定する方法</a>
<a href="http://d.hatena.ne.jp/jitsu102/20110101/1293867164" target="_blank">Titaniumで作るAndroidアプリ開発(Titaniumインストール～サンプルアプリ"Kitchen Sink"起動) - jitsu102の日記</a>
<a href="http://bowz.info/?p=2876" target="_blank">Titanium Mobile 用に Android SDK をインストールする | Bowz::Notebook</a>
<a href="http://d.hatena.ne.jp/donayama/20110613/ti_howto_download" target="_blank">Titanium Mobile(with Titanium Studio)のサインアップとダウンロードの方法が変わっているようです。 - JP::HSJ::Junknews::HatenaSide</a>


<h2>番外編 - Android開発を速くするfastdevを使ってみる</h2>

Androidのビルドはとにかく重いです。
iPhoneと比べると5倍くらい時間が掛かるような気がします。

そんなAndroid開発ですが、Titanium Mobileの<strong>1.7.0</strong>から<strong>fastdev</strong>という機能がついたようです。
では、それを使って何が速くなったのかを体感してみたいと思います。
まずは、「<strong>.bash_profile</strong>」に以下のエイリアスを追加します。

<blockquote>
alias titanium="~/Library/Application\ Support/Titanium/mobilesdk/osx/1.8.1/titanium.py"
</blockquote>

そして、新規作成したプロジェクトまでターミナルで移動して、以下を打ちます。

<blockquote>
$ titanium fastdev start &
[1] 4194
$ Fastdev server already running for com.hisasann.test
</blockquote>

なんか、すでに動いているよって言われた。。。
1.8からは自動でfastdevが動いているのかしら。

なので、適当に<strong>app.js</strong>のコードをいじってみて、以下を打ってみました。

<blockquote>
$ titanium fastdev restart-app
Restarted app com.hisasann.test.
</blockquote>

するとシミュレータを再起動せずにコードの修正ができました！
このディレクトリに毎回移動してコマンドを打つのがちょっと面倒（ボタンがあればいいのに）ですが、
これを使わない手はありません。

<a href="http://blog.digital-squad.net/article/205923722.html" target="_blank">Titanium mobile Fastdevでアプリの変更をAndroidに即反映｜WEBデザイン Tips</a>


<h2>追記：2012-02-16 - Adobe Unit Types.osaxエラー</h2>

<blockquote>
/Library/ScriptingAdditions/Adobe Unit Types.osax
</blockquote>

このような一体何に使っているか分からないスクリプトファイル？でエラーがでた場合は、
<a href="http://kb2.adobe.com/cps/516/cpsid_51615.html" target="_blank">Error about unit type conversion occurs when running an AppleScript in Photoshop (Mac OS X 10.6)</a>
をもとにファイルを差し替えるとエラーが出なくなる。

このワンステップも個人的には結構ハマりました。

[via]
<a href="http://zaru.tofu-kun.org/2011/08/09/taitanium-studio%e3%81%a7iphone%e5%ae%9f%e6%a9%9f%e8%bb%a2%e9%80%81%e3%82%92%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/" target="_blank">Titanium StudioでiPhone実機転送をする方法 | zaru blog</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123986/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51xs9gdl3mL._SL160_.jpg" alt="Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123986/hous-22/ref=nosim/" name="amazletlink" target="_blank">Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4798123986/hous-22/ref=nosim/" title="Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)" target="_blank">amazlet</a> at 12.02.06</div></div><div class="amazlet-detail">北尾 雅人 <br />翔泳社 <br />売り上げランキング: 11403<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798123986/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>ブログをfacebookのOGP（Open Graph Protocol）に対応させる</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/02/facebookogpopen_graph_protocol.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1279</id>
   
   <published>2012-02-06T05:51:36Z</published>
   <updated>2012-02-06T06:37:11Z</updated>
   
   <summary> WordpressとMTについてですが、以下にメモしとく。 そもそものOGPに...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="592" label="Facebook" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="81" label="Movalble Type" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="441" label="WordPress" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<strong>Wordpress</strong>と<strong>MT</strong>についてですが、以下にメモしとく。

そもそものOGPについてですが、ご存知のとおり<strong>いいね！ボタン</strong>を押されたときに、facebook側に対していろいろとサイトの情報を教えてあげるためのmetaタグ情報ですが、どうやらこれをちゃんとやっておかないと自分の友達のフィードに流れていかないよう。
なので、これは積極的にBlogに導入するほうが無難かもしれませんね。

<blockquote>
<p>なぜなら『OGP』を設定しないで『いいね』ボタンをクリックすると、友人のニュースフィールドにその情報が表示されないからです。これではせっかく『いいね』ボタンをクリックされても他の人が見ることがないので広がりも少なくなってしまいます。</p>
<cite>via: <a href="http://www.html5-memo.com/facebook/iine111216/" target="_blank">facebook いいねボタンの仕様変更?OGPの設定についてまとめました（ localeプロパティについて） | HTML5でサイトをつくろう</a></cite>
</blockquote>

そんなに面倒なものでもないのでやっちゃいましょう！


<h2>OGPのmetaタグを追加する</h2>

以下は<strong>Wordpress</strong>仕様で書いております。

<textarea name="code" class="html">
<meta property="og:locale" content="ja_JP" />
<meta property="og:title" content="<?php the_title(); ?>" />
<meta property="og:type" content="blog" />
<meta property="og:description" content="サイトのディスクリプション"/>
<meta property="og:url" content="<?php the_permalink(); ?>" />
<meta property="og:image" content="サイトの画像" />
<meta property="og:site_name" content="サイトの名前" />
<meta property="fb:app_id" content="XXXXXXXXXX" />
</textarea>

AppIdの取得は以下の記事が参考になります。
<a href="http://www.html5-memo.com/facebook/iine111216/" target="_blank">facebook いいねボタンの仕様変更?OGPの設定についてまとめました（ localeプロパティについて） | HTML5でサイトをつくろう</a>


<h2>OGPのmetaタグを追加する（MTに依存する箇所）</h2>

<textarea name="code" class="html">
<meta property="og:title" content="<$MTEntryTitle encode_html="1"$>" />
<meta property="og:url" content="<$MTEntryPermalink$>" />
</textarea>


<h2>htmlタグに以下２つのxmlns名前空間を追加します</h2>

<textarea name="code" class="html">
<html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">
</textarea>


<h2>いいね！ボタンを配置する（HTML5バージョン）</h2>

今までiframe版を使っていたんですが、ここ最近HTML5版に切り替えたところすこぶる速くなりました。
HTML5版も結果的にiframeを作りますが、画面のロード後に実行されるのでレンダリングが邪魔されません。


<h2>body開始タグすぐに以下を</h2>

<textarea name="code" class="html">
<!-- ▼facebook -->
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1&appId=347774255240678";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<!-- ▲facebook -->
</textarea>


<h2>いいね！ボタンを設置したい場所に以下を（Wordpress版）</h2>

<textarea name="code" class="html">
<div class="fb-like" data-href="<?php the_permalink() ?>" data-send="false" data-layout="button_count" data-width="100" data-show-faces="false" data-font="arial"></div>
</textarea>


<h2>いいね！ボタンを設置したい場所に以下を（MT版）</h2>

<textarea name="code" class="html">
<div class="fb-like" data-href="<$MTEntryPermalink$>" data-send="false" data-layout="button_count" data-width="100" data-show-faces="false" data-font="arial"></div>
</textarea>

この一手間でほんの少しでもPVを〜！

■関連リンク
・<a href="http://d.hatena.ne.jp/amachang/20110117/1295233078" target="_blank">フェイスブック、ミクシィ、グリーで使われている OGP (Open Graph Protocol) とは何か - IT戦記</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4881667947/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51EL2HBTGHL._SL160_.jpg" alt="Facebook Perfect Guide Book" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4881667947/hous-22/ref=nosim/" name="amazletlink" target="_blank">Facebook Perfect Guide Book</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4881667947/hous-22/ref=nosim/" title="Facebook Perfect Guide Book" target="_blank">amazlet</a> at 12.02.06</div></div><div class="amazlet-detail">森嶋 良子 鈴木 麻里子 田口 和裕 <br />ソーテック社 <br />売り上げランキング: 448<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4881667947/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>Vimをちゃんと使い始めてみる</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/01/vim.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1278</id>
   
   <published>2012-01-29T06:23:14Z</published>
   <updated>2012-02-19T16:06:26Z</updated>
   
   <summary> 僕が大好きなTextMateのカラーテーマMonokai » Blog Arc...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="307" label="Editor" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="590" label="Vim" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット（2012-02-20 1.02.16）.png" src="http://hisasann.com/housetect/2012/02/20/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882012-02-20%201.02.16%EF%BC%89.png" width="500" height="382" class="mt-image-none" style="" /></span>

僕が大好きな<strong>TextMate</strong>のカラーテーマ<a href="http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/" target="_blank">Monokai » Blog Archive » Textmate color theme</a>の<strong>Vim版</strong>があったので、もうこうなったらちゃんとやる！
Vimをちゃんとやる！
ということで、とりあえずやった設定と<strong>.vimrc</strong>と<strong>.gvimrc</strong>をメモしておく。

Vimはちょいちょい使ってみてはいるんですが、すぐにTextMateやWebStormなんかに浮気して、すぐに使わなくなって、また使う頃にはコマンドほとんど覚えていない現象に陥っているので、今後は小さなtxtファイルの編集でもなるべくVimを使って行ってみようと思う。
とはいえ、コーディングはTextMateになるんだとは思いますが...


<h2>vimのカラースキーマを変更する</h2>

僕はいっつもエディターをいじるときに色から入ります。
色がうまいこといかないと、ヘコみます。

XXX.vimファイルをダウンロードし、以下のディレクトリに配置する。


<h2>カラースキーマの保存場所 - windowsの場合</h2>

<blockquote>
$HOME/vimfiles/colors/
</blockquote>


<h2>カラースキーマの保存場所 - macの場合</h2>

<blockquote>
$HOME/.vim/colors/
</blockquote>


<h2>colorschemeを選ぶ</h2>

<a href="http://d.hatena.ne.jp/kattton/20110425/1303746056" target="_blank">新卒さんのための人気Vimカラースキーマランキング5+1(vim.org & github調べ) - 常識という迷信</a>
を参考に、<a href="http://www.vim.org/scripts/script.php?script_id=2340" target="_blank">molokai - A port of the monokai scheme for TextMate : vim online</a>にしてみました。

これはTextMateのほうで僕はこの色を使っているので、もうこれ以外考えられないです！
（<a href="http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/" target="_blank">Monokai » Blog Archive » Textmate color theme</a>）

■参考リンク
<a href="http://nanasi.jp/articles/howto/config/colorscheme.html" target="_blank">カラースキーマの使い方 -- 名無しのvim使い</a>


<h2>.gvimrcにcolorschemeの設定を書く</h2>

<a href="http://d.hatena.ne.jp/kuri27/20110526/1306422757" target="_blank">MacVim-KaoriYaでcolorschemeの設定 - 脳みそHack</a>
これ毎回ハマるんですが、MacVim-KaoriYaの設定ファイルの読み込みの順番が

<blockquote>
<p><p><span class="highlight">MacVim</span>.app/Contents/Resources/vim/vimrc</p>
			<p>ホームフォルダ/.vimrc または _vimrc</p>
			<p><span class="highlight">MacVim</span>.app/Contents/Resources/vim/gvimrc</p>
			<p>ホームフォルダ/.gvimrc または _gvimrc</p></p>
<cite>via: <a href="http://d.hatena.ne.jp/kuri27/20110526/1306422757" target="_blank">MacVim-KaoriYaでcolorschemeの設定 - 脳みそHack</a></cite>
</blockquote>

なので、.vimrcに書いてもいまいちcolorschemeが反映されない。
なので、.gvimrcをtouchにしてここに、

<blockquote>
colorscheme molokai
</blockquote>

と記載します。
これでテーマがちゃんと反映されます。

また<a href="http://nanasi.jp/colorscheme.html" target="_blank">カラースキーマ -- 名無しのvim使い</a>にたくさんテーマがあるので、自分に合うのを探してみるのも楽しいかもしれません。


<h2>タブと全角スペースは色を変える</h2>

はじめ.vimrcのほうにいろいろと書いてためしてみたんですが、いっこうに全角スペースが可視化されなくてハマってて、
どうやら<strong>.gvimrc</strong>に書くのがいいみたい。

<a href="http://blog.blueblack.net/item_110" target="_blank">Vim初心者的導入メモ 2/3 「vimrc設定」編 - ナレッジエース</a>
から

<blockquote>
"全角スペースを視覚化
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=#666666
au BufNewFile,BufRead * match ZenkakuSpace /　/
</blockquote>

を拝借。

タブの表示に関しては、<a href="http://d.hatena.ne.jp/potappo2/20061107/1162862536" target="_blank">vimでスペースやTabなどの見えない文字を表示させる方法 - Life is Try and Error</a>を参考にさせていただいた。

<blockquote>
"特殊文字(SpecialKey)の見える化。listcharsはlcsでも設定可能。
"trailは行末スペース。
set list
set listchars=tab:&gt;-,trail:-,nbsp:%,extends:&gt;,precedes:&lt;
</blockquote>

上記2つを.gvimrcに追記すればOK！

<hr>

<h2>Pluginを入れる</h2>


<h2>Zen-Coding</h2>

やっぱりZenがないと不便！

<a href="http://d.hatena.ne.jp/sakurako_s/20110126/1295988873" target="_blank">ZenCoding for Vim 導入方法（初心者さん向け） - sakurako_sの日記</a>


<h2>vimのプロセス間でのコピペ</h2>

<a href="http://d.hatena.ne.jp/tujikiri/20090225/1235540036" target="_blank">複数のvimプロセス間でコピペするためのplugin - while(1){die; respawn;}</a>

vimからTextMateへもペーストできるので便利！


<h2>vim-autocomplpop</h2>

<a href="http://d.hatena.ne.jp/rdera/20090113/1231819016" target="_blank">autocomplpop.vimを入れてやったこと-vimプラグイン - rderaログ</a>を見ながら入れてみた。
入力補完プラグイン。

<blockquote>
<p><p>C-pとかC-nで移動して、C-yで選択が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D5%A5%A9%A5%EB%A5%C8">デフォルト</a>みたいだけど。</p>
			<p>やはり、tabで移動したい。</p></p>
<cite>via: <a href="http://d.hatena.ne.jp/rdera/20090113/1231819016" target="_blank">autocomplpop.vimを入れてやったこと-vimプラグイン - rderaログ</a></cite>
</blockquote>

のタブ切り替えは非常に便利。

<hr>


<h2>便利機能</h2>


<h2>括弧とかダブルコート入力時に←に戻る</h2>

<a href="http://www.e2esound.com/wp/2010/11/07/add_vimrc_settings/" target="_blank">「もっと早く知りたかった」と思ったvimrc設定 - e2esound.com業務日誌</a>

この設定のおかげで今後のvimライフが大きく左右されるんだろうなー。

<textarea name="code" class="js">
imap {} {}<Left>
imap [] []<Left>
imap () ()<Left>
imap "" ""<Left>
imap '' ''<Left>
imap <> <><Left>
</textarea>

を.vimrcに追記すればOK！


<h2>Esc以外でノーマルモードに戻る方法</h2>

<a href="http://d.hatena.ne.jp/yuta84q/20101216/1292508997" target="_blank">Vimにおける Esc と Ctrl-cの違い。 - 備忘録 beta</a>の記事を読むと、

<ul>
	<li>Ctrl + c</li>
	<li>Ctrl + [</li>
</ul>

とこの2つの方法があるようですが、<strong>Ctrl + c</strong>のほうは、ちょっとクセがありそうなので、<strong>Ctrl + [</strong>が今後活躍しそうです。
でも、Escはちょっと遠いけど、慣れるとEscが一番速そう。

<hr>


<h2>.vimrc</h2>

<textarea name="code" class="js">
" 全般設定
" ---------------------
set nocompatible            " 必ず最初に書く
set viminfo='20,<50,s10,h,! " YankRing用に!を追加
set shellslash              " Windowsでディレクトリパスの区切り文字に / を使えるようにする
set lazyredraw              " マクロなどを実行中は描画を中断
set number
set ruler
set cmdheight=2
set laststatus=2
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P
set title
set linespace=0
set wildmenu
set showcmd

" コマンド補完
" ---------------------
set wildmenu           " コマンド補完を強化
set wildmode=list:full " リスト表示，最長マッチ

" syntax color
" ---------------------
syntax on
"colorscheme molokai	" .gvimrcに書かないと反映されないのでコメントアウト
highlight LineNr ctermfg=darkgrey

" search
" ----------------------
set ignorecase	" 大文字小文字無視
set smartcase	" 大文字ではじめたら大文字小文字無視しない
set wrapscan	" 最後まで検索したら先頭へ戻る
"set nowrapscan  " 検索をファイルの先頭へループしない
set hlsearch	" 検索文字をハイライト
"set incsearch

" edit
" ---------------------
set autoindent
set cindent
set showmatch			" 括弧の対応をハイライト
set backspace=indent,eol,start
set clipboard=unnamed
set pastetoggle=<F12>
set guioptions+=a

" tab
" --------------------
set tabstop=4		" tabstopはTab文字を画面上で何文字分に展開するか
"set expandtab		" タブを空白文字に展開
set smarttab
set shiftwidth=4
set shiftround
set nowrap

" backup
" --------------------
set backup
set backupdir=~/vim_backup
set swapfile
set directory=~/vim_swap
"set nobackup   " バックアップ取らない
"set autoread   " 他で書き換えられたら自動で読み直す
"set noswapfile " スワップファイル作らない
"set hidden     " 編集中でも他のファイルを開けるようにする

" doc
" --------------------
helptags ~/.vim/doc

" 文字コードの自動認識
if &encoding !=# 'utf-8'
  set encoding=japan
  set fileencoding=japan
endif
if has('iconv')
  let s:enc_euc = 'euc-jp'
  let s:enc_jis = 'iso-2022-jp'
  " iconvがeucJP-msに対応しているかをチェック
  if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'eucjp-ms'
    let s:enc_jis = 'iso-2022-jp-3'
  " iconvがJISX0213に対応しているかをチェック
  elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
    let s:enc_euc = 'euc-jisx0213'
    let s:enc_jis = 'iso-2022-jp-3'
  endif
  " fileencodingsを構築
  if &encoding ==# 'utf-8'
    let s:fileencodings_default = &fileencodings
    let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
    let &fileencodings = &fileencodings .','. s:fileencodings_default
    unlet s:fileencodings_default
  else
    let &fileencodings = &fileencodings .','. s:enc_jis
    set fileencodings+=utf-8,ucs-2le,ucs-2
    if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
      set fileencodings+=cp932
      set fileencodings-=euc-jp
      set fileencodings-=euc-jisx0213
      set fileencodings-=eucjp-ms
      let &encoding = s:enc_euc
      let &fileencoding = s:enc_euc
    else
      let &fileencodings = &fileencodings .','. s:enc_euc
    endif
  endif
  " 定数を処分
  unlet s:enc_euc
  unlet s:enc_jis
endif
" 日本語を含まない場合は fileencoding に encoding を使うようにする
if has('autocmd')
  function! AU_ReCheck_FENC()
    if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
      let &fileencoding=&encoding
    endif
  endfunction
  autocmd BufReadPost * call AU_ReCheck_FENC()
endif
" 改行コードの自動認識
set fileformats=unix,dos,mac
" □とか○の文字があってもカーソル位置がずれないようにする
if exists('&ambiwidth')
  set ambiwidth=double
endif

" 括弧入力後に←に移動
imap {} {}<Left>
imap [] []<Left>
imap () ()<Left>
imap "" ""<Left>
imap '' ''<Left>
imap <> <><Left>

" plugin
" ---------------------
" yanktmp
map sy :call YanktmpYank()<CR>
map sp :call YanktmpPaste_p()<CR>
map sP :call YanktmpPaste_P()<CR>

" vim-autocomplpop
"<TAB>で補完
" {{{ Autocompletion using the TAB key
" This function determines, wether we are on the start of the line text (then tab indents) or
" if we want to try autocompletion
function! InsertTabWrapper()
        let col = col('.') - 1
        if !col || getline('.')[col - 1] !~ '\k'
                return "\<TAB>"
        else
                if pumvisible()
                        return "\<C-N>"
                else
                        return "\<C-N>\<C-P>"
                end
        endif
endfunction
" Remap the tab key to select action with InsertTabWrapper
inoremap <tab> <c-r>=InsertTabWrapper()<cr>
" }}} Autocompletion using the TAB key
</textarea>


<h2>.gvimrc</h2>

<textarea name="code" class="js">
colorscheme molokai

set textwidth=78
set columns=100
set lines=150

"特殊文字(SpecialKey)の見える化。listcharsはlcsでも設定可能。
"trailは行末スペース。
set list
set listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<

" 全角スペースを視覚化
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=#666666
au BufNewFile,BufRead * match ZenkakuSpace /　/
</textarea>

<a href="https://github.com/hisasann/vimrc" target="_blank">hisasann/vimrc - GitHub</a>

さぁて、Vimライフをおくりはじめますか！

追伸：Windowsでは<strong>Peggy</strong>というエディターをよく使っております！

■関連リンク
・<a href="http://tech.kayac.com/archive/vim-3-plugin.html" target="_blank">vimに欠かせない３つのプラグイン | tech.kayac.com - KAYAC engineers' blog</a>
・<a href="http://blog.blueblack.net/item_110" target="_blank">Vim初心者的導入メモ 2/3 「vimrc設定」編 - ナレッジエース</a>
・<a href="http://archiva.jp/web/tool/vimrc.html" target="_blank">vimrcを晒してみる - Archiva</a>
・<a href="http://relaxedcolumn.blog8.fc2.com/blog-entry-101.html" target="_blank">ぼちぼち散歩 おれの.vimrc</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774147958/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/516K5O-bN8L._SL160_.jpg" alt="Vimテクニックバイブル　～作業効率をカイゼンする150の技" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774147958/hous-22/ref=nosim/" name="amazletlink" target="_blank">Vimテクニックバイブル　～作業効率をカイゼンする150の技</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4774147958/hous-22/ref=nosim/" title="Vimテクニックバイブル　～作業効率をカイゼンする150の技" target="_blank">amazlet</a> at 12.01.29</div></div><div class="amazlet-detail">Vimサポーターズ <br />技術評論社 <br />売り上げランキング: 43182<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774147958/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>さくらVPSでnginxをインストールしたときのメモ</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/01/vpsnginx.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1277</id>
   
   <published>2012-01-26T17:09:48Z</published>
   <updated>2012-01-26T17:36:39Z</updated>
   
   <summary> 極々メモ的な感じで、エントリーにしとく。 apacheのリバースプロキシ用にm...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="587" label="Apache" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="537" label="Sakura" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="588" label="nginx" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[極々メモ的な感じで、エントリーにしとく。


<h2>apacheのリバースプロキシ用にmod_rpafのインストール</h2>

のちのち必要になるのでまずは<strong>mod_rpaf</strong>のインストールから。

<blockquote>
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xvzf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
</blockquote>

Makefileをちょっと書き換える。

<blockquote>
vi Makefile

-APXS2=$(shell which apxs)
+APXS2=/usr/sbin/apxs
</blockquote>

makeしてみる。

<blockquote>
make rpaf-2.0
sudo make install-2.0
</blockquote>

apxsがないとエラーが出たので、<strong>httpd-devel</strong>をインストール


<h2>httpd-develのインストール</h2>

<blockquote>
sudo yum install httpd-devel
</blockquote>

今度はhttpd-develを探しにいけなかったようなので、<strong>rpm</strong>を追加。

<blockquote>
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.nara.wide.ad.jp
 * updates: ftp.nara.wide.ad.jp
Setting up Install Process
No package http-devel available.
Nothing to do
となったのでリポジトリを追加する
</blockquote>

適当なディレクトリでwgetしてrpmファイルをダウンロードしとく。
そしてrpmコマンドで登録します。

<blockquote>
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
wget http://rpms.famillecollet.com/el5.x86_64/remi-release-5-8.el5.remi.noarch.rpm
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

rpm -Uvh epel-release-5-4.noarch.rpm remi-release-5-8.el5.remi.noarch.rpm rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
</blockquote>

これで再度、

<blockquote>
sudo yum install httpd-devel
</blockquote>

実行したらうまく入った！


<h2>nginxのインストール</h2>

<blockquote>
sudo yum install nginx
</blockquote>

一応入ったことを確認しとく。

<blockquote>
yum list installed | grep nginx
</blockquote>


<h2>設定ファイルnginx.confの編集</h2>

<a href="http://havelog.ayumusato.com/develop/server/e198-nginx-with-apache.html" target="_blank">nginx+apacheでちょっぴり快適なWebサーバーを目指してみる(CentOS さくらのVPS) ::ハブろぐ</a>からごっそり参考にさせていただいた！

<textarea class="js" name="code">
sudo vi /etc/nginx/nginx.conf

server {
    listen       80;
    server_name  http://www28039u.sakura.ne.jp/;

	# いろいろ書いてある

	proxy_set_header    X-Real-IP       $remote_addr;
	proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header    Host            $http_host;
	proxy_redirect      off;
	proxy_max_temp_file_size    0;

	location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
		root    /var/www/;
		index   index.html;
		ssi     on;
		break;
	}

	location / {
		proxy_pass  http://127.0.0.1:8082;
		break;
	}

	# いろいろ書いてある
}
</textarea>


<h2>バーチャルホストvirtual.confの編集</h2>

<textarea class="js" name="code">
sudo vi /etc/nginx/conf.d/virtual.conf

server {
    listen       80;
    server_name  http://www28039u.sakura.ne.jp/;

    location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
        root    /home/hisasann/www/test;
        index   index.html;
        ssi     on;
        break;
    }

    location / {
        proxy_pass  http://127.0.0.1:8082;
        break;
    }
}
</textarea>


<h2>apacheのhttpd.confの編集</h2>

<textarea class="js" name="code">
sudo vi /etc/httpd/conf/httpd.conf

# 先ほど入れたmod_rpafちゃん
LoadModule rpaf_module modules/mod_rpaf-2.0.so

Listen 8082

&lt;VirtualHost 127.0.0.1:8082&gt;
	DocumentRoot /home/hisasann/www/test2
	ServerName test.example.com

	RPAFenable On
	RPAFsethostname On
	RPAFproxy_ips 127.0.0.1 10.0.0.1
	RPAFheader X-Forwarded-For
&lt;/VirtualHost&gt;
</textarea>

<a href="http://www.drk7.jp/MT/archives/000573.html" target="_blank">リバースプロキシを導入する際はmod_rpaf :: drk7jp</a>
<a href="http://doruby.kbmj.com/yablog/20100329/mod_rpaf_IP_" target="_blank">mod_rpafを使ったIPアドレスのアクセス制限</a>


<h2>apacheとnginxの再起動</h2>

<blockquote>
sudo /etc/init.d/httpd restart
sudo /etc/init.d/nginx restart
</blockquote>

こんなこともあるみたい。

<blockquote>
<p><div>nginxを再起動させます。
<br>
注意:このとき、sudo /etc/init.d/nginx restartを使わないこと。再起動しないことがよくありました。

</div>
<pre>sudo /etc/init.d/nginx stop
sudo /etc/init.d/nginx start</pre></p>
<cite>via: <a href="http://www26.atwiki.jp/nginx/pages/13.html" target="_blank">nginx @ ウィキ - nginx　バーチャルホスト</a></cite>
</blockquote>


<h2>実際にアクセスしてみる</h2>

アクセスしてみると、

/var/www/htmlに置いたhtmlはちゃんと表示されるのに、
自分で作成した/home/hisasann/www/test2に置いたファイルを開こうとしても、

(13)Permission denied: access to /index.html 

となってしまった。

原因は、途中のディレクトリのhisasannが<strong>700</strong>だったから！
<a href="http://d.hatena.ne.jp/ir9Ex/20061109/1163066167" target="_blank">apache を利用しての public_html が公開できない - 解 - いろきゅう.jp ～Programmable maiden～ Tech side</a>
<a href="http://labs.uechoco.com/blog/2008/01/linuxapachepermission_denied.html" target="_blank">[Linux]ApacheがPermission deniedを吐いてくる : うえちょこ＠ぼろぐ</a>
（結構これにハマッテいる人がいて、SELinuxというものが悪さしている場合もあるよう）

これで
静的ファイル
「http://www28039u.sakura.ne.jp/sample.jpg」
は<strong>/home/hisasann/www/test/</strong>にアクセスされ、
動的ファイル
「http://www28039u.sakura.ne.jp/test2.html」
は<strong>/home/hisasann/www/test2/</strong>にアクセスされるようになった。

まだ分からないことだらけですが、なかなか面白い！

■参考リンク
<a href="http://weble.org/2011/08/14/centos-config" target="_blank">さくら VPS + CentOS のチューニングや高速化もっとこうすれば良かった作業まとめ | ウェブル</a>
<a href="http://weble.org/2011/08/15/sakura-vps-nginx-apache" target="_blank">さくら VPS で 静的ファイルは nginx で動的ファイルは Apache で処理するための詳細設定 | ウェブル</a>
<a href="http://havelog.ayumusato.com/develop/server/e198-nginx-with-apache.html" target="_blank">nginx+apacheでちょっぴり快適なWebサーバーを目指してみる(CentOS さくらのVPS) ::ハブろぐ</a>
<a href="http://kray.jp/blog/nginx/" target="_blank">軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール | KRAY Inc</a>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048702270/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51xpswg%2BkkL._SL160_.jpg" alt="ハイパフォーマンスHTTPサーバ Nginx入門" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048702270/hous-22/ref=nosim/" name="amazletlink" target="_blank">ハイパフォーマンスHTTPサーバ Nginx入門</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4048702270/hous-22/ref=nosim/" title="ハイパフォーマンスHTTPサーバ Nginx入門" target="_blank">amazlet</a> at 12.01.27</div></div><div class="amazlet-detail">Clement Nedelcu <br />アスキー・メディアワークス <br />売り上げランキング: 14072<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048702270/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>書評 - jQuery Mobileポケットリファレンス</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2012/01/_-_jquery_mobile.html" />
   <id>tag:hisasann.com,2012:/housetect//2.1276</id>
   
   <published>2012-01-26T15:04:18Z</published>
   <updated>2012-01-26T15:52:04Z</updated>
   
   <summary>jQuery Mobile ポケットリファレンスposted with amaz...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="本" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="373" label="Book" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="369" label="Book Review" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="426" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="581" label="jQueryMobile" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774149829/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51oH9apOTAL._SL160_.jpg" alt="jQuery Mobile ポケットリファレンス" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774149829/hous-22/ref=nosim/" name="amazletlink" target="_blank">jQuery Mobile ポケットリファレンス</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4774149829/hous-22/ref=nosim/" title="jQuery Mobile ポケットリファレンス" target="_blank">amazlet</a> at 12.01.27</div></div><div class="amazlet-detail">森 直彦 <br />技術評論社 <br />売り上げランキング: 6309<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774149829/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

技術評論社より献本いただきました。
ありがとうございます！

そして2012年一発目のエントリー！

<blockquote>
<p><h3>この本の概要</h3>
<p>スマートフォンやタブレットなどのモバイルデバイス向けWebフレームワークとして人気のjQuery Mobileの使い方を解説するリファレンスです。jQuery Mobileを利用すると，HTML5ベースのタグでページを記述するだけで，iPhone，iPadやAndroid，Windows Phoneなどの各種スマートフォン・タブレットに対応したサイトが構築できます。本書では，jQuery Mobileを使ったサイト制作の基本的な考え方と，jQuery Mobileが持つ，モバイルデバイスに最適化されたリッチな，各種部品の使い方をわかりやすく解説します。</p></p>
<cite>via: <a href="http://gihyo.jp/book/2012/978-4-7741-4982-0" target="_blank">書籍案内：jQuery Mobileポケットリファレンス｜gihyo.jp ... 技術評論社</a></cite>
</blockquote>

jQueryMobileのバージョン1がリリースされてまだ間もないですが、やっとこさ日本語の本が出始めて理解しやすくなってきたのかなと思います。
jQueryだけの知識だけでは、やはりjQueryMobileを使うこなすことは難しいので、こういったリファレンス的な書籍はありがたい。

では、目次を。

<h2>目次</h2>

<dl class="data">
	<dt>Chapter 1</dt>
	<dd>jQuery Mobile の基本</dd>
	<dt>Chapter 2</dt>
	<dd>
		サイトの基本設計
	</dd>
	<dt>Chapter 3</dt>
	<dd>
		リンク
	</dd>
	<dt>Chapter 4</dt>
	<dd>
		ダイアログボックス
	</dd>
	<dt>Chapter 5</dt>
	<dd>
		レイアウト
	</dd>
	<dt>Chapter 6</dt>
	<dd>
		ヘッダ
	</dd>
	<dt>Chapter 7</dt>
	<dd>
		フッタ
	</dd>
	<dt>Chapter 8</dt>
	<dd>
		ナビゲーションバー
	</dd>
	<dt>Chapter 9</dt>
	<dd>
		ボタン
	</dd>
	<dt>Chapter 10</dt>
	<dd>
		フォーム
	</dd>
	<dt>Chapter 11</dt>
	<dd>
		テキスト入力ボックス
	</dd>
	<dt>Chapter 12</dt>
	<dd>
		スライダー
	</dd>
	<dt>Chapter 13</dt>
	<dd>
		トグルスイッチ
	</dd>
	<dt>Chapter 14</dt>
	<dd>
		ラジオボタン
	</dd>
	<dt>Chapter 15</dt>
	<dd>
		チェックボックス
	</dd>
	<dt>Chapter 16</dt>
	<dd>
		セレクトメニュー
	</dd>
	<dt>Chapter 17</dt>
	<dd>
		カスタムメニュー
	</dd>
	<dt>Chapter 18</dt>
	<dd>
		リスト
	</dd>
	<dt>Chapter 19</dt>
	<dd>
		グローバル設定
	</dd>
	<dt>Chapter 20</dt>
	<dd>
		ページイベント
	</dd>
	<dt>Chapter 21</dt>
	<dd>
		タッチイベント
	</dd>
	<dt>Chapter 22</dt>
	<dd>
		仮想マウスイベント
	</dd>
	<dt>Chapter 23</dt>
	<dd>
		端末回転イベント
	</dd>
	<dt>Chapter 24</dt>
	<dd>
		スクロールイベント
	</dd>
	<dt>Chapter 25</dt>
	<dd>
		レイアウトイベント
	</dd>
	<dt>付録 A</dt>
	<dd>
		システム関数
	</dd>
	<dt>付録 B</dt>
	<dd>
		ボタンアイコン一覧
	</dd>
	<dt>付録 C</dt>
	<dd>
		テーマシステム
	</dd>
</dl>

ここまで網羅してくれているとjQueryMobile全体の把握にそう時間は掛からない。


<h2>ありがたい点 - その1</h2>

<blockquote>
	$.mobile.changePage
	$.mobile.loadPage
</blockquote>

といったシステム関数の引数を細かく解説してくれていること。
<strong>$.mobile.changePage</strong>の引数はアルファ時代から結構変わっているので、最新のバージョン1での解説は本当にありがたい。

これ意外にも<strong>$.mobile</strong>にはたくさんの便利関数があるが、それらについても書かれている。
というか知らないものも結構あったので、

別ページを独自に取得したいという需要は実際かなりあるので、このリファレンスがあれば開発がしやすいだろう。


<h2>ありがたい点 - その2</h2>

拡張セレクタ<strong>jqmData</strong>についても書かれていること。
これは、<strong>$.mobile.ns</strong>（ネームスペース）を加味したdata属性の取得に使うメソッドだが、これもちゃんと説明を受けないと理解できない。


<h2>ありがたい点 - その3</h2>

「自動的初期化を拒否する」という<strong>data-role="none"</strong>や<strong>$.mobile.page.prototype.options.keepNative</strong>についても細かく書かれています。
これは、コントロール要素をjQueryMobileに装飾させないための設定です。
独自デザインでサイトを設計する場合には、結構使います。


<h2>ありがたい点 - その4</h2>

仮想系のイベントについて書かれている。
<strong>vmousedown</strong>や<strong>vclick</strong>など、一見するとなんのイベントなんのか分からないですが、こういったイベントについても細かく書かれている。
また、vclickはclickイベントよりも反応が速いが、これについてのデメリットも記載されている。
（これは知らなかった！）


jQueryMobileを使ったことある方、まったく触ったことない方。
このどちらにも本書は役にたつと思います。


また著者である森直彦さんの以下のページには大変お世話になっている。
<a href="http://dev.screw-axis.com/doc/jquery_mobile/" target="_blank">jQuery Mobile 1.0 日本語リファレンス</a>

■関連記事
<a href="http://hisasann.com/housetect/2011/06/jquerymobilexss.html">jQueryMobileのXSSに関する調査メモ</a>
<a href="http://hisasann.com/housetect/2011/06/jquerymobile_1.html">jQueryMobileのかゆいところに手が届くお作法メモ</a>
<a href="http://hisasann.com/housetect/2011/02/jquerymobile.html">jQueryMobileを使ってのスマートフォンサイトの構築メモ</a>]]>
      
   </content>
</entry>

<entry>
   <title>iDance - Thank you Steve.</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2011/10/idance_-_thank_you_steve.html" />
   <id>tag:hisasann.com,2011:/housetect//2.1275</id>
   
   <published>2011-10-07T01:53:51Z</published>
   <updated>2012-01-26T17:37:43Z</updated>
   
   <summary> webkitAudioContextを使って音とcanvasへの描画をシンクロ...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="Mac" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="378" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="105" label="Mac" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="545" label="Webkit" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="gamen.png" src="http://hisasann.com/housetect/2011/10/07/gamen.png" width="500" height="342" class="mt-image-none" style="" /></span>

<strong>webkitAudioContext</strong>を使って音とcanvasへの<strong>描画をシンクロ</strong>させてみました。
あまり情報が多くなく、試行錯誤でしたがなんとかそれっぽくなったと思います。

canvasへの描画は、<a href="http://paperjs.org/" target="_blank">Paper.js</a>を使いました。
これぐらいならライブラリを使う必要なかったのですが、Paper.jsが気になっていたのでとりあえず慣れるということで。

また、今回のこのアプローチは<a href="http://twitter.com/#!/ken_c_lo" target="_blank">ken_c_lo</a>さんからアイデアをいただきました。
画像の提供から配置までのデザインを担当してもらい、ありがとうございます！

この作品を<strong>スティーブ・ジョブズ</strong>氏に捧げます。


<h2>iDance - Thank you Steve.</h2>

Chromeでご覧ください。（音が出ます）
<a href="http://lab.hisasann.com/iDance/" target="_blank">iDance - Thank you Steve.</a>

■github
<a href="https://github.com/hisasann/iDance" target="_blank">hisasann/iDance - GitHub</a>

<h2>AudioDance</h2>

こちらはiDanceの元となった作品です。
スピーカー画像を使って表現してみました。是非こちらもご覧ください。
<a href="http://lab.hisasann.com/audioDance/" target="_blank">AudioDance</a>

■github
<a href="https://github.com/hisasann/AudioDance" target="_blank">hisasann/AudioDance - GitHub</a>


<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/1451648537/hous-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41TNSBq4F5L._SL160_.jpg" alt="Steve Jobs" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/1451648537/hous-22/ref=nosim/" name="amazletlink" target="_blank">Steve Jobs</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/1451648537/hous-22/ref=nosim/" title="Steve Jobs" target="_blank">amazlet</a> at 12.01.27</div></div><div class="amazlet-detail">Walter Isaacson <br />Simon & Schuster (2011-10-24)<br />売り上げランキング: 3<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/1451648537/hous-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>]]>
      
   </content>
</entry>

<entry>
   <title>さくらVPSにApacheをインストールする方法</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2011/07/vpsapache.html" />
   <id>tag:hisasann.com,2011:/housetect//2.1274</id>
   
   <published>2011-07-28T17:34:59Z</published>
   <updated>2011-07-28T17:40:54Z</updated>
   
   <summary>パッケージからインストールする 楽チン！ [root]$ yum -y inst...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="587" label="Apache" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="537" label="Sakura" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="585" label="VPS" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<h2>パッケージからインストールする</h2>

楽チン！

<blockquote>
[root]$ yum -y install httpd
[root]$ /etc/rc.d/init.d/httpd start
Starting httpd:                                            [  OK  ]
</blockquote>


<h2>自動起動にする</h2>

<blockquote>
[root]$ chkconfig httpd on
[root]$ chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
</blockquote>

3がonになっていればよい。

<blockquote>
[root]$ chkconfig --list
</blockquote>

これで自動起動の設定を確認できる


<h2>
	Apacheのバージョンを確認する
</h2>

<blockquote>
[root]$ rpm -qa httpd
</blockquote>

あとはhttpでアクセスしてApacheの画面が表示されてばOK！

[via]
<a href="http://www.vinelinux.org/manuals/chkconfig.html" target="_blank">26.3. chkconfigコマンドによる自動起動の設定</a>
]]>
      
   </content>
</entry>

<entry>
   <title>さくらVPSを使うときの初期設定メモ</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2011/07/vps.html" />
   <id>tag:hisasann.com,2011:/housetect//2.1273</id>
   
   <published>2011-07-28T17:29:54Z</published>
   <updated>2011-07-28T17:32:46Z</updated>
   
   <summary> むちゃくちゃザックリとして内容ですが、自分のために一応メモしとく。 何はともあ...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="105" label="Mac" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="537" label="Sakura" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="585" label="VPS" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[むちゃくちゃザックリとして内容ですが、自分のために一応メモしとく。


<h2>何はともあれ接続する</h2>

パスワードはさくらインターネットから送られてくるメールに記載されている<strong>初期パスワード</strong>を入力する。

<blockquote>
[makbook]$ ssh root@IPアドレス
</blockquote>


<h2>真っ先にrootのパスワード変更する</h2>

<blockquote>
[root]$ passwd
Changing password for user root.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
</blockquote>


<h2>続いて今後メインに使っていくことになるユーザーを作成する</h2>

<blockquote>
[root]$ useradd username[Enter]
[root]$ passwd username[Enter]
Changing password for user username.
New UNIX password:[新しいパスワードを入力]
Retype new UNIX password:[新しいパスワードを再入力]
passwd: all authentication tokens updated successfully.

[root]$ usermod -G wheel username
</blockquote>


<h2>MacBookでSSH接続用のRSA鍵を作成する</h2>

<blockquote>
[makbook]$ ssh-keygen [Enter]
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): [Enter]
Enter passphrase (empty for no passphrase): [好きなパスワードを入力]
Enter same passphrase again: [好きなパスワードを再入力]
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
</blockquote>


<h2>作成したRSA鍵をサーバーにSCPでコピーする</h2>

<blockquote>
[macbook]$ cd .ssh
[macbook .ssh]$ scp id_rsa.pub [username]@[IPアドレス]:~/

[username]$ mkdir .ssh
[username]$ chmod 700 .ssh
[username]$ cat id_rsa.pub >> authorized_keys
[username]$ mv authorized_keys .ssh/
[username]$ cd .ssh
[username .ssh]$ chmod 600 authorized_keys
</blockquote>


<h2>MacBookからSSH接続の確認をする</h2>

ターミナルから、以下を入力する。

<blockquote>
ssh username@IPアドレス
</blockquote>

初回はRSA鍵を作成した時のパスワード入力を促されるけど、2回目からは聞かれない。


<h2>sudo設定の変更</h2>

作業用ユーザで sudo ができるよう設定を変更します。

<blockquote>
[root]$ visudo
%wheel  ALL=(ALL) ALL //コメントアウトを外す
</blockquote>


<h2>サーバーのSSH設定の変更</h2>

<blockquote>
[root]$ vi /etc/ssh/sshd_config

PermitRootLogin no # rootログイン禁止（一応明示的に） 
PasswordAuthentication no # パスワードでログイン禁止（公開鍵暗号オンリー）

[root]$ /etc/init.d/sshd restart
</blockquote>


<h2>sudoのログを取る</h2>

<blockquote>
[root]$ touch /var/log/sudo  
[root]$ chmod 600 /var/log/sudo

[root]$ visudo
### 末尾に以下を追記
Defaults syslog=local1

[root]$ vi /etc/syslog.conf
local1.*                                                /var/log/sudo		# 追加
local7.*                                                /var/log/boot.log

#*.info;mail.none;authpriv.none;cron.none               /var/log/messages	# コメントアウト
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages	# 追加

[root]$ /etc/init.d/syslog restart

[root]$ tail /var/log/sudo
Apr 17 04:55:55 www28039u sudo: username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/bin/su -
</blockquote>


<h2>SSHポート番号を変更する</h2>

<blockquote>
[username]$ sudo vi /etc/ssh/sshd_config
#Port 22
Port 10022

[username]$ sudo /etc/init.d/sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

[makbook]$ ssh username@IPアドレス -p 10022
</blockquote>


<h2>文字コードを日本語にする</h2>

<blockquote>
[root]$ vi /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
</blockquote>

に変更して、ログアウトしてログインする

[via]
<a href="http://www.ideaxidea.com/archives/2010/10/centos_ja_jp.html" target="_blank">さくらのVPS（CentOS）で文字コードを日本語にする方法（もしくはlessで文字化けさせない方法） | IDEA*IDEA</a>


<h2>パッケージのアップデートをしとく</h2>

<a href="http://d.hatena.ne.jp/gamella/20090405/1238920311" target="_blank">Cent OSをインストールした後、「yum update」を行う前に必ず「yum install yum-fastestmirror」すること - Future Insight</a>に書かれているように、

<blockquote>
yum install yum-fastestmirror
</blockquote>

をやったらすでにインストールされてるって言われた。

<blockquote>
[root]$ yum -y update
</blockquote>

■参考リンク
<a href="http://akabeko.sakura.ne.jp/blog/2010/09/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B/#vps01_root_user" target="_blank">さくらのVPS を使いはじめる | アカベコマイリ</a>
<a href="http://azurite.espel.jp/index.php/2011/04/03/sakuravps-mac-ssh/" target="_blank">さくらVPSにMacでSSH接続する初期設定 @ Eyes of Bastet</a>
<a href="http://d.hatena.ne.jp/rubellum/20100901/1283321253" target="_blank">「さくらのVPS」借りてみた（作業ユーザー作成，SSH設定） - Rubellum fly light</a>
<a href="http://blog.myfinder.jp/2010/09/vpsssh.html" target="_blank">myfinder's blog: さくらのVPSを借りたら真っ先にやるべきssh設定</a>
<a href="http://nullpopopo.blogcube.info/2008/01/syslogsudo.html" target="_blank">【syslog】sudoのログを分ける - nullpopopo</a>
<a href="http://akibe.com/2010/09/centos-setup-2-user/" target="_blank">AKIBE - さくらのVPS CentOSでサーバ構築 2 - User</a>]]>
      
   </content>
</entry>

<entry>
   <title>jQueryMobileのXSSに関する調査メモ</title>
   <link rel="alternate" type="text/html" href="http://hisasann.com/housetect/2011/06/jquerymobilexss.html" />
   <id>tag:hisasann.com,2011:/housetect//2.1272</id>
   
   <published>2011-06-27T06:33:44Z</published>
   <updated>2011-07-03T02:47:25Z</updated>
   
   <summary>今回の原因 #1789: jQuery Mobile XSS Problem b...</summary>
   <author>
      <name>Hisasann</name>
      
   </author>
   
      <category term="技術" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="376" label="HTML" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="378" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="481" label="XSS" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="426" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="581" label="jQueryMobile" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://hisasann.com/housetect/">
      <![CDATA[<h2>今回の原因</h2>

<a href="https://github.com/jquery/jquery-mobile/pull/1789" target="_blank">#1789: jQuery Mobile XSS Problem by jnlin for jquery/jquery-mobile - Pull Request - GitHub</a>に書かれているXSSが今回の内容。

これは以下のようなhash値をjQueryMobile側のhashchangeイベントがキャッチし、

<textarea class="html" name="code">
#&lt;img src=/ss onerror={alert('xss');}&gt;
</textarea>

<strong>$()関数</strong>にhash値を渡すところで発生するよう。

jQueryMobileの2488行目あたりの以下のコードがそれ。このコードは2360行あたりにも存在する。

<textarea class="js" name="code">
to = $( ":jqmData(url='" + url + "')" );
</textarea>

そして今回のjQueryのXSSに関する詳しい内容はmalaさんの記事を参考。
<a href="http://subtech.g.hatena.ne.jp/mala/20110624/1308881526" target="_blank">jQueryにおけるXSSを引き起こしやすい問題について - 金利0無利息キャッシング - キャッシングできます - subtech</a>
<a href="http://ma.la/jquery_xss/" target="_blank">new XSS pattern with jQuery</a>


<h2>jQueryMobileのXSSデモUrl</h2>

以下のURLを表示するとalertが表示されるのが分かる。

<strong>■1.0a4.1</strong>
<a href="http://jquerymobile.com/demos/1.0a4.1/#<img src=/ss onerror={alert('yy');}>" target="_blank">jQuery Mobile: Demos and Documentation</a>

またbeta1のほうでは、

<textarea class="js" name="code">
to = $( ":jqmData(url='" + url + "')" );
</textarea>

がなくなっており、hash値にimgタグを渡しても発生しない。

<strong>■1.0b1</strong>
<a href="http://jquerymobile.com/demos/1.0b1/#<img src=/ss onerror={alert('xss');}>" target="_blank">jQuery Mobile: Demos and Documentation</a>


<h2>jQueryのバグチケットを見てみる</h2>

<a href="http://bugs.jquery.com/ticket/9521" target="_blank">#9521 (XSS with $(location.hash) and $(#<tag>) is needed?) - jQuery Core - Bug Tracker</a>
ここに書いてある解決策である、

<textarea class="js" name="code">
-		quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+		quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
</textarea>

はうまくいかなかった。
これはコメント欄を読むと分かるが、「$("anychar&lt;img&gt;")」こうゆうパターンのときにダメのよう。
（何か他にも修正箇所が必要なのだろうか...）


<h2>malaさんのパッチを当てる！</h2>

ほんとありがたいことですが、こちらのパッチを使ってみたところうまくいきました！
<a href="https://gist.github.com/1038024" target="_blank">quick patch script for jQuery http://bugs.jquery.com/ticket/9521 -- Gist</a>

<script src="https://gist.github.com/1038024.js?file=jquery_patch.pl"></script>

こちらのPerlコードは、今回の問題になっているjQuery変数の<strong>quickExpr</strong>の内容を書き換えるものになります。
このパッチには過去古い時代のjQueryのquickExprも含まれているが、とりあえず以下に該当のバージョンのパッチを列挙してみました。

beta1のほうにバージョンアップできる場合は良いのですが、アルファ版とbeta版ではかなり動きや設定も違ってくるので、すぐに対応は難しいと思います。
<a href="http://blog.webcreativepark.net/2011/06/23-165144.html" target="_blank">jQuery MobileにXSSの脆弱性が見つかったのでアルファ版からベータ版に変更する際の注意点[to-R]</a>

とりあえずまだ他のXSSがあるかどうかや今回の件に関する不具合がすべて取り除かれたかの動作確認は出来ておりませんが、
まずはjQuery側を修正し、動作検証をして様子を見てみようと思います。


<h2>jquery1.2.6時代のquickExpr用</h2>

<textarea class="js" name="code">
-		quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
+		quickExpr = /^(?:\s*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
</textarea>


<h2>jquery1.4.2時代のquickExpr用</h2>

<textarea class="js" name="code">
-		quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
+		quickExpr = /^(?:\s*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
</textarea>


<h2>jquery1.5時代のquickExpr用</h2>

<textarea class="js" name="code">
-		quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
+		quickExpr = /^(?:\s*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
</textarea>

いやはや、なかなか難しいもんですなー！

■参考リンク
・<a href="http://twitter.com/#!/bulkneets/status/83376734908596225" target="_blank">Twitter / @bulkneets: 冗談みたいな話ですけど旧バージョンのjQuery m ...</a>
・<a href="http://twitter.com/#!/bulkneets/status/83174006110437377" target="_blank">Twitter / @bulkneets: jQuery mobileのbeta 1がリリースさ ...</a>
・<a href="http://twitter.com/#!/bulkneets/status/83187603041562625" target="_blank">Twitter / @bulkneets: 旧バージョンのjQuery Mobileはじめ多くの ...</a>]]>
      
   </content>
</entry>

</feed>

