スポンサーサイト

  • 2012.09.28 Friday
  • -
  • -
  • -
  • -
  • by スポンサードリンク
この広告は45日以上更新がないブログに表示されております。
新しい記事を書くことで広告を消すことができます。

Capitrano 、Github 、etc.. 最近、お世話になった(勉強になった)リンク集

最近、Web開発ブームにまたなってきて。ようやく「継続的開発&リリース環境」構築の重要性を理解できてきたので。。というか、理解させられた。というか。ようやく、Capistrano とか、Github とか、うまく使って「安心して、公開中のサービスの中に、次の機能開発を行う」準備ができつつあります。参考になったリンクを列挙します。ありがとうございました。


▼ Capistrano 関連
・自分が実践したチュートリアル
http://takemikami.com/technote/archives/646

・一般的チュートリアル
http://d.hatena.ne.jp/dkfj/20120228/1330434467
http://kitbc.s41.xrea.com/main/?try_capistrano

・Githubとの連携
http://www.oiax.jp/rails3book/prepare_capistrano2.html
http://blog.new-bamboo.co.uk/2008/3/12/github-with-capistrano

・さくらサーバとの連携
http://d.hatena.ne.jp/ntaku/20111115/1321358900

・Passengerとの連携
http://www.aaginskiy.com/technology/2011/02/deploying-rails-3-apps-with-capistrano/

・tmp public に保存している、画像やpkgファイルの保存場所設定、およびシンボリックリンク設定
http://www.slideshare.net/T2J/capistrano-tips-tips

・Delayed_job の対応
http://blog.digital-squad.net/article/244451741.html
https://github.com/collectiveidea/delayed_job/wiki/Rails-3-and-Capistrano
 ・Delayed_job: http://blog.nzm-o.com/item/222


▼ Git のことはじめ
・一般的情報
http://d.hatena.ne.jp/ryousanngata/20120119/1326906033
http://soohei.net/vpsgit-1/

・ローカルレポジトリからのデプロイ
http://blog.yabasoft.biz/archives/3592


▼ そのほか
・Rails から、Gmail 経由でメールを送る
http://bookmeter.que.jp/hakkyo/?date=20110830

・SQLのコラム(未読)
http://d.hatena.ne.jp/koseki2/20100915/HellSQL

・TODO(RedmineとGithubとの連携:うまくいかない・・・)
https://github.com/koppen/redmine_github_hook



以上。


つぎはたぶん、テスト環境とか。。勉強するハメになるんだろうな。orz..

この記事を読んだ人にオススメ


OS X で、 gem install sqlite3 がコケる件。

JUGEMテーマ:コンピュータ

これまでずっと、sqlite3 のgem がうまく入らなくて。もう縁がないんだと諦めてたんだけど、どうしても sqlite3 を Ruby で操作しないと駄目な案件にぶつかり。なんとか解決。まず、エラーはこんな感じ;
$ sudo gem install sqlite3
Password:
Building native extensions. This could take a while...
ERROR: Error installing sqlite3:
ERROR: Failed to build gem native extension.

/Users/cxp04754/.rvm/rubies/ruby-1.9.3-p125/bin/ruby extconf.rb
checking for sqlite3.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

いろいろ試したんだけど、どうも XcodeのCommand Line Tools がインストールされてないからっていう原因っぽい。これインストールしてから、gem install が成功したから。

XcodeのCommand Line Tools



『Google Cloud Messaging』実験までの道のり/あとで勉強するメモ

JUGEMテーマ:インターネット

いったん、Android の勉強中断!Passbookの勉強戻る!
・・・なので、今度また勉強する時のために、勉強再開ポイントを自分用にメモ。

▼ FirstApp を作るチュートリアル;
・環境構築/プロジェクト作成/アプリ実行までの流れは、ひと通り理解した。
 ・【超・初級編】Android の開発環境を、 OS X Mountain Lion ( 10.8 ) で構築する。
 ・【Android で 最初のアプリケーションを作る #1 】『 Building Your First App 〜 プロジェクトを作る 〜 』
 ・【Android で 最初のアプリケーションを作る #2 】『 Building Your First App 〜 アプリを実行する 〜 』

 ⇒次は、レイアウトの弄り方や、アプリケーション内ロジックの書き方、データの保持の仕方とか、勉強する(予定)


▼ Google Cloud Messaging (GCM) の勉強リソース
・基本
 ・Google APIs Console:GCMだけでなく、他のGoogle API の設定場所。API の Access Key とかもここで作ったり、確認したりする。
 ・Google Cloud Messaging for Android:クライアントサイドと、サーバサイドにわけて、サンプルコードつけて解説してくれてる。わかりやすい。けど、ちょっとやってみたけどよくわからん。Androidの、というかJavaの基本ルールがよくわかってないからかも。たぶん、FirstAppをつくるチュートリアル最後までやったら、なんとなくわかるはず。
 ・AndroidでGCMを使ってみる:日本語で、上記公式ガイドに沿って説明してくれてる。
 ・Google Cloud Messaging for Android (GCM)を使ってみた:こちらも日本語
 ・Android開発 C2DMを触ってみよう:GCM 以前のPUSH方式「C2DM」の説明

・各言語サーバサイドライブラリ



▽ 良さ気な本


⇒ UIについ理解を深める。個人的にAndroidは、4以降でないと使いづらくて仕方ないと思っているので、4以降にフォーカスしてるのも◎


⇒ どうかなあ。本屋で立ち読みしてから買うかどうか決めさせていただきたい本


「目次」みると、欲しくなります。Java脳への導入書としても◎っぽい。買おうコレ。

【Android で 最初のアプリケーションを作る #2 】『 Building Your First App 〜 アプリを実行する 〜 』

JUGEMテーマ:コンピュータ

Mountain Lion で、Androidを勉強しようシリーズの第3弾。これまで2回のエントリーで、Mac上での開発環境構築。および、アプリケーション作成の導入(プロジェクトの作成)まで終了してます;

1. 【超・初級編】Android の開発環境を、 OS X Mountain Lion ( 10.8 ) で構築する。
2. 【Android で 最初のアプリケーションを作る #1 】『 Building Your First App 〜 プロジェクトを作る 〜 』





さて。今回のエントリーは、アプリを実行手順についてです。前回のエントリーで作成したプロジェクトにデフォルトで含まれる「 Hello World 」を実行してみます。
元ネタは「 Running Your App」です。

Eclipse 起動後全体画面

ちなみに、Androidのアプリ実行環境は2つ;
・Android の実機端末で実行
・Ecripse (エミュレータ)で実行
それぞれの環境で、アプリをインストールするには、Eclipseで行う/ターミナルからコマンドラインで行うという2種類の方法があります。





具体的な実行手順の説明の前に、Androidのプロジェクトディレクトリに入っている、いくつかのディレクトリ/ファイルをちょっとだけ解説。
プロジェクト内・ファイル構成説明

(1). AndroidManifest.xml
・アプリについての基本的な設定、コンポーネントの定義が書かれている。

(2). src/
主なソースファイルが入っている。app icon でアプリが起動する際に呼ばれる、Activity class がデフォルトで含まれている。

(3). res/
アプリのリソースの入った、サブディレクトリがいくつか含まれる
 a). rawable-hdpi/
 高解像度(hdpi)の画像ファイルが入る。
 "rawable-◯◯" には、それぞれの解像度の画像ファイルが入る
 ※参考)『 Android:画面密度によるリソースのスケーリング
 b). layout/
 アプリのUIを定義するファイルが入る。
 c). values/
 文言や色指定など、いろんな要素が指定されたXMLファイルが入る。





Androidアプリの基本的な起動手順は、以下のとおりです;
0). ビルドして、実行する
1). Activity クラスが呼ばれる
2). Activity クラスが、レイアウトファイルを読み込む
3). レイアウトファイルが、"Hello World" と表示する

まず、実機でアプリを実行しましょう。手順は、以下;

1). USBケーブルで、実機端末とMacを繋ぐ。(Windowsの場合は、なんかインストールが必要
2). 実機端末で、設定 > 開発者向けオプション と進み「USBデバッグ」をONにする
 (※ GALAXY NEXUS SC 04D の場合の遷移。他の端末では違う遷移かも)
3). アプリを実行する
 a). Eclipse で実行する場合;
  ・プロジェクトファイルを開き、ツールバーの「Run(▶)」をクリックする
   ⇒Eclipseがアプリを実機にインストールし、実行される
 b). コマンドラインの場合;

  1). プロジェクトディレクトリの直下に移動し、以下コマンドを実行
  $ pwd
  /Users/cxp04754/Documents/workspace/MyFirstApp
  $ ant debug
  Buildfile: build.xml does not exist!
  Build failed

  ⇒ 失敗・・・
  ※target を指定しないとだめっぽい。『【HowtoForge】Android: Buildfile: build.xml does not exist!』を参考に解決。以下、解決手順;

$ android list targets
Available Android targets:
----------
id: 1 or "android-16"
Name: Android 4.1
Type: Platform
API level: 16
Revision: 2
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
ABIs : armeabi-v7a
----------
id: 2 or "Google Inc.:Google APIs:16"
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Revision: 2
Description: Android + Google APIs
Based on Android 4.1 (API level 16)
Libraries:
* com.google.android.media.effects (effects.jar)
Collection of video effects
* com.android.future.usb.accessory (usb.jar)
API for USB Accessories
* com.google.android.maps (maps.jar)
API for Google Maps
Skins: WVGA854, WQVGA400, WSVGA, WXGA800-7in, WXGA720, HVGA, WQVGA432, WVGA800 (default), QVGA, WXGA800
ABIs : armeabi-v7a

$ pwd
/Users/cxp04754/Documents/workspace/MyFirstApp
$ android update project --target 1 --path .
Updated project.properties
Updated local.properties
No project name specified, using Activity name 'MainActivity'.
If you wish to change it, edit the first line of build.xml.
Added file ./build.xml
Updated file ./proguard-project.txt
It seems that there are sub-projects. If you want to update them
please use the --subprojects parameter.




再度挑戦!




$ ant debug
Buildfile: /Users/cxp04754/Documents/workspace/MyFirstApp/build.xml

-set-mode-check:

-set-debug-files:

-check-env:
[checkenv] Android SDK Tools Revision 20.0.1
[checkenv] Installed at /Applications/android-sdk-macosx

-setup:
[echo] Project Name: MainActivity
[gettype] Project Type: Application

-set-debug-mode:

-debug-obfuscation-check:

-build-setup:
[echo] Resolving Build Target for MainActivity...
[gettarget] Project Target: Android 4.1
[gettarget] API level: 16
[echo] ----------
[echo] Creating output directories if needed...
[echo] ----------
[echo] Resolving Dependencies for MainActivity...
[dependency] Library dependencies:
[dependency] No Libraries
[dependency]
[dependency] ------------------
[dependency] API<=15: Adding annotations.jar to the classpath.
[echo] ----------
[echo] Building Libraries with 'debug'...
[subant] No sub-builds to iterate on

-pre-build:

-code-gen:
[mergemanifest] Merging AndroidManifest files into one.
[mergemanifest] Manifest merger disabled. Using project manifest only.
[echo] Handling aidl files...
[aidl] No AIDL files to compile.
[echo] ----------
[echo] Handling RenderScript files...
[renderscript] No RenderScript files to compile.
[echo] ----------
[echo] Handling Resources...
[aapt] Generating resource IDs...
[echo] ----------
[echo] Handling BuildConfig class...
[buildconfig] Generating BuildConfig class.

-pre-compile:

-compile:
[javac] Compiling 2 source files to /Users/cxp04754/Documents/workspace/MyFirstApp/bin/classes

-post-compile:

-obfuscate:

-dex:
[dex] Converting compiled files and external libraries into /Users/cxp04754/Documents/workspace/MyFirstApp/bin/classes.dex...

-crunch:
[crunch] Crunching PNG Files in source dir: /Users/cxp04754/Documents/workspace/MyFirstApp/res
[crunch] To destination dir: /Users/cxp04754/Documents/workspace/MyFirstApp/bin/res
[crunch] Crunched 0 PNG files to update cache

-package-resources:
[aapt] Creating full resource package...

-package:
[apkbuilder] Current build type is different than previous build: forced apkbuilder run.
[apkbuilder] Creating MainActivity-debug-unaligned.apk and signing it with a debug key...

-post-package:

-do-debug:
[zipalign] Running zip align on final apk...
[echo] Debug Package: /Users/cxp04754/Documents/workspace/MyFirstApp/bin/MainActivity-debug.apk
[propertyfile] Creating new property file: /Users/cxp04754/Documents/workspace/MyFirstApp/bin/build.prop
[propertyfile] Updating property file: /Users/cxp04754/Documents/workspace/MyFirstApp/bin/build.prop
[propertyfile] Updating property file: /Users/cxp04754/Documents/workspace/MyFirstApp/bin/build.prop
[propertyfile] Updating property file: /Users/cxp04754/Documents/workspace/MyFirstApp/bin/build.prop

-post-build:

debug:

BUILD SUCCESSFUL
Total time: 9 seconds
※参考)Ant について:『Ant 1章 Antの基礎



4). さらに以下コマンドを実行
※ PATH に platform-tools のパスを登録している必要あり。詳しは過去エントリ参照。
$ adb install bin/MyFirstApp-debug.apk
can't find 'bin/MyFirstApp-debug.apk' to install
$ adb install bin/MainActivity-debug.apk
2850 KB/s (154135 bytes in 0.052s)
pkg: /data/local/tmp/MainActivity-debug.apk
Success


(↓)ちなみに、既に同じアプリがインストールされてるとエラー出る;

$ adb install bin/MainActivity-debug.apk
2871 KB/s (154135 bytes in 0.052s)
pkg: /data/local/tmp/MainActivity-debug.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]





5). 実機端末で、MyFirstActivity をクリックして実行してみる。問題なく起動!パチパチ







次に、エミュレータ上で、アプリを実行してみましょう。

エミュレータ起動の前に、再現したい端末(Android Virtual Device (AVD))のスペックを指定しないとなりません。指定方法は、以下の通り;
1). Android Virtual Device Manager を起動
 a). eclipse の場合、ツールバーからアイコンドロイド君をクリック
 b). コマンドラインの場合;
$ android avd
※ PATH に platform-tools のパスを登録している必要あり。詳しは過去エントリ参照。

AVDM・ブランクウインドウ

2). Android Virtual Devie Manager (AVDM) が起動したら、画面右の「New...」をクリック。現れるダイアログの「AVD Name」「Target Name」「SD card size」「skin(デフォルトはHVGA)」等、各種値を設定して「Create AVD」。

新規VD設定中画面※参考設定)『Android端末各種 AVD設定表
※SD card とか、適当に1GiBとかにしちゃったけど。とりあえず問題なさそう・・・



それでは、ようやくここで、Eclipse/コマンドラインから、エミュレータを起動します。

1). AVDMのリスト画面で、作成したデバイスを選択して「Start」。
※ かなり時間がかかりまつ。「固まってるのか?」と不安になるけど、我慢。しばらくすると、ロック画面が表示されるので、ロック解除。

エミュレータ起動中・プログレスバー

4). アプリを実行してみる。※ eclipse/コマンドラインの2つ方法あり。
a). eclipse の場合:ツールバーの「Run(▶)」ボタンをクリック
 ・・・これも、起動するまでかなり時間かかって不安になるけど。我慢。
b). コマンドラインの場合(以下);
$ ant debug
Buildfile: /Users/cxp04754/Documents/workspace/MyFirstApp/build.xml

(省略)

BUILD SUCCESSFUL
Total time: 1 second

$ adb install bin/MainActivity-debug.apk
error: more than one device and emulator
- waiting for device -
error: more than one device and emulator
- waiting for device -
error: more than one device and emulator
- waiting for device -
error: more than one device and emulator
- waiting for device -
error: more than one device and emulator
- waiting for device -
error: more than one device and emulator
- waiting for device -

(省略)

エラーでてる。『apkをコマンドラインからアンインストールするには』を参考に解決;

#エミュレータを指定
$ adb -e uninstall <アンインストールしたいパッケージ名>

#実機を指定
$ adb -d uninstall <アンインストールしたいパッケージ名>
※このオプションは、アンインストールに限らない。


複数のエミュレータを立ち上げている場合や複数の実機を接続している場合は、
$ adb devices
で<serial number>を確認して、

$ adb -s <serial number> uninstall <アンインストールしたいパッケージ名>

とかすればよい。




やってみる。

$ adb -e install bin/MainActivity-debug.apk
1747 KB/s (154135 bytes in 0.086s)
pkg: /data/local/tmp/MainActivity-debug.apk
Success


are_you_freezing

成功したです。

catting_log

ログも見られるです。



今回は、ここまで。次回はUIのカスタマイズ方法です。

【Android で 最初のアプリケーションを作る #1 】『 Building Your First App 〜 プロジェクトを作る 〜 』

JUGEMテーマ:インターネット

Mac OS X Mountain Lion ( 10.8 ) で、Googleの、Android Developers サイトにある超初級者向けチュートリアル『Building Your First App』をやってみたメモ。ちょっと長いので、今回のエントリーでは、プロジェクトを作るまでー


▼ 事前準備。
#01. Android SDK のダウンロード
#02. Eclipse のインストール。及び、Eclipse 用 ADT ( Android Development Tools ) のインストール
#03. SDK Manager を使って、最新の SDK tools と platforms のダウンロード
※「事前準備」がまだ済んでない方は『【超・初級編】Android の開発環境を、 OS X Mountain Lion ( 10.8 ) で構築する。』を参照して下さい。


▼『 Android Project 』を作成する。( Eclipse を利用 )

#00. まず、Eclipse を起動

#01. ツールバーの左から8つ目くらいにある Android Project 作成ウィザードアイコンをクリック

Eclipse・起動直後



#02. 各フォームを入力(設定)する

Eclipse・設定画面

・(1) Application Name:ユーザに表示する名称(アプリ名)

・(2) Project Name:当プロジェクトのディレクトリ名。Eclipseも参照する

・(3) Package Name:全ユーザのAndroidシステムでユニークな名称。通常は、ドメインを逆にしたものに加え、最後にアプリ名を付ける。(「com.exampler.<アプリ名>」もとりあえず使えるけど、Google Play に申請はできない)

・(4) Build SDK:ターゲットとするOSバージョンの中で、最新のものを指定する。通常は、発表されている中で最新のものを指定する(とGoogleは書いている)。ここで4.1とか指定したとしても、古いバージョンで動作しないわけではない。逆にここで指定しておかないと、最新のデバイスのユーザに、そのデバイスに最適化されたユーザ体験を提供できない。

・(5) Minimum Required SDK:ターゲットとするOSバージョンの中で、最も低いバージョンを指定する。特定のバージョン以上でしか使えない機能があったとしても、その機能を使う際にOSバージョン判定をするという手もあるので、考えられる中で最低のバージョンを指定すること推奨する(とGoogleは書いている)。

ここで、参考までに、Android OSの、バージョン別普及率をチェック。自分の経験値的に、OSやブラウザの過去バージョンで、泣く泣く外してもよい閾値は、5%だ。95%を網羅することは死守し、残り5%は、近い未来にアクティブ利用者が皆無になると想定し、対象外とする。※ここでは、2.1以下を対象外とします。

Android・バージョン別のシェア

念のため、各バージョンのDiff的な差異を、Wikipedia で確認してみる。

Android・各バージョンのDiff

⇒ 2.2 以上から、クラウドとデバイスの連携APIが使える。GCM( Google Cloud Messaging )が使えるのも、2.2 以上。現時点でここを閾値とするのはリーズナブルだ。ちなみに、GCMは、iOS でいうところの、Push Notification すね。



(1)〜(5)を入力したら「Next >」。



#03. launcher アイコンをつくる

とりあえずの、アイコンをつくる(↓)

Eclipse・アイコン作成


ひとまず、画面解像度に応じた「なんちゃって」アイコンをつくれるけど。実際にリリースするアプリで使うアイコンを作るには、『アイコンデザインガイド( Iconography design guide )』を読んで、ちゃんとしたの作る必要あり。


作成できたら「Next >」



#04. Activity Template(アプリのテンプレート)を選ぶ

Eclipse・Activity選択


ここでは「BlankActivity」を選択し「Next >」


Eclipse・BlankActivity詳細


とりあえず、なにも変更せずに「Next >」



なんか、変な画面が表示される、

Eclipse・依存ファイルのInstall-01


・・・。「Install/Upgrade」をクリックして、


Eclipse・依存ファイルのInstall-02


「Accept All」して「Install」して「Finish」。





Eclipse・プロジェクト起動画面


Esclipse 上で、プロジェクトが起動する。パチパチパチ



なんかどことなく、Xcodeを想わせて懐かしい気持ちに・・・





▼『 Android Project 』を作成する。(「ターミナル」を利用 )


#00. ターミナルを起動し、以下コマンドを実行

---------------------
$ android list targets
---------------------
※先のエントリーの通り、PATHが設定されていることが前提



↓実行結果


----------------------------
Available Android targets:
----------
id: 1 or "android-16"
Name: Android 4.1
Type: Platform
API level: 16
Revision: 2
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
ABIs : armeabi-v7a
----------
id: 2 or "Google Inc.:Google APIs:16"
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Revision: 2
Description: Android + Google APIs
Based on Android 4.1 (API level 16)
Libraries:
* com.google.android.media.effects (effects.jar)
Collection of video effects
* com.android.future.usb.accessory (usb.jar)
API for USB Accessories
* com.google.android.maps (maps.jar)
API for Google Maps
Skins: WVGA854, WQVGA400, WSVGA, WXGA800-7in, WXGA720, HVGA, WQVGA432, WVGA800 (default), QVGA, WXGA800
ABIs : armeabi-v7a
----------------------------


⇒ 表示される中で、最新の id(ここでは『 android-16 』)をターゲットにする。先の Eclipse の説明の中にもあったけど、一番最新ものを選択しておくこと(を、Google は推奨)。ここで最新を指定したからって、古いバージョンで動作しないわけではない。ここで最新を指定しておけば、最新デバイスで動作させる際、アプリはそのデバイスに最適化される。




#01. ターミナルを起動し、以下コマンドを実行
---------------------
$ android create project --target android-16 --name MyFirstApp2 ¥
--path /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2 --activity MainActivity ¥
--package us.toaster4.myfirstapp2
---------------------
※先のエントリーの通り、PATHが設定されていることが前提
※「Android-16」の部分に、#00で表示される最新のidを記入する
※「/Users/<YOUR HOME>/Documents/workspace/MyFirstApp2」には、作業用ディレクトリを指定。
※「us.toaster4.myfirstapp2」には、Package Nameを指定。全ユーザのAndroidシステムでユニークな名称にする必要あり。通常は、ドメインを逆にしたものに加え、最後にアプリ名を付けたりする。



↓実行結果


----------------------------
Created project directory: /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/src/us/toaster4/myfirstapp2
Added file /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/src/us/toaster4/myfirstapp2/MainActivity.java
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/bin
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/libs
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/values
Added file /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/values/strings.xml
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/layout
Added file /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/layout/main.xml
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/drawable-xhdpi
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/drawable-hdpi
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/drawable-mdpi
Created directory /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/res/drawable-ldpi
Added file /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/AndroidManifest.xml
Added file /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/build.xml
Added file /Users/<YOUR HOME>/Documents/workspace/MyFirstApp2/proguard-project.txt
----------------------------


2行目で、Package Name の「 . 」が「 / 」に変換されてて、変な感じするけど、そういうものらしい
⇒ 参考『androidコマンドを使ったプロジェクトの作成


とりあえずこれで開発に入ることが可能。次回エントリーで、次のステップ書きます。

【超・初級編】Android の開発環境を、 OS X Mountain Lion ( 10.8 ) で構築する。

JUGEMテーマ:インターネット


やらねば、やろう。と思って、早数年。そろそろ、待ったなし感がハンパないので、Android開発を学ぼうと思う。のだけれど、どこから初めてよいやら。。


と。こういう時は、たいてい、オフィシャルな情報に従うが吉。という経験則に従い。Google Developers サイトの中でスタートガイドを探す。


で、見つかったのがこちら(↓)。


Android Developer Tools


マスコットキャラが「Welcome」だっちゃ・・・。





▼ #01『Android SDK』のダウンロード&インストール

Installing the SDK』ページに従って、DL&インストール。

Get the Android SDK

⇒ ダウンロードは、こちら

※ 解凍すると「android-sdk-mac_x86」フォルダができるので「アプリケーション」フォルダに入れる





▼ #02『Android SDK』の実行

Adding Platforms and Pakages』によれば、Android SDK は3つのパッケージ(「tools」「platforms」「その他コンポーネント」)を別々に管理する構造らしい。Android SKD Managerを使って、それぞれをダウンロードしたり、アップデートしたりするそうだ。


☆1: ターミナルから、android sdk を実行する
----------------
$ cd /Applications/android-sdk-macosx/tools
$ ./android
----------------


☆2: ウインドウが開いて、サーバと通信が始まり、画面右下に「Install n packages」(※nは数字)と表示される。

Android SDK Manager

これは推奨インストール項目とのこと。なので、インストールしておく。



Choose Packages to Install

ライセンスに納得できたら「Accept All」のラジオボタンをチェックし「Install」
※つまり、納得してください。ってこと。


☆3: 今後のために、PATH追加(ターミナルにて下記実行)

$emacs /Users/cxp04754/.bash_profile
----------------
# Android SDK用:以下の行を .bash_profile に追記
export PATH=//Applications/android-sdk-macosx/tools:$PATH
export PATH=//Applications/android-sdk-macosx/platform-tools:$PATH
----------------
$ source ~/.bash_profile





▼ #03『Eclipse』のインストール

自分、Javaとか無縁な人なので、まずはEclipseのインストールから。Googleの推奨は「Eclipse Classic」とのことなので、それをDLしてインストールする。

☆1: 現バージョン(2012/08/13現在)をダウンロード:
http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops4/R-4.2-201206081400/eclipse-SDK-4.2-macosx-cocoa-x86_64.tar.gz

☆2: DL終わったら、解凍してアプリケーションフォルダに入れる

・初回実行時は、「Ctl」を押下したまま、アイコンをクリック
(Mountain Lion からは、未認証のDLソフトをそのままではインストールできないため、確認画面を表示させて、OKでインストールする)

☆3: working space をどこにするか確認される。
⇒ 自分の場合、デフォルトの「/Users/<YOUR HOME>/Documents/workspace」でOK。





▼ #04『ADT(Android Developing Tools)』のインストール

Installing the Eclipse Plugin』を参照しながら、ADTをDL&インストールする。

☆1: Eclipse が起動した状態で、メニュー「Help > Install New Software...」を選択

☆2: 表示されたウインドウの右上「Add...」をクリックすると「Add Repository」というダイアログが表示される;

Add Repository

⇒ Name: に「ADT Plugin」、Location: に「 https://dl-ssl.google.com/android/eclipse/ 」と入力し「OK」をクリック

☆3: 表示されたダイアログの「Developer Tools」のチェックボックスをチェックして「OK」

Check the items that you wish to install

☆4: ダウンロードされるツールの一覧が表示されるので「Next」をクリック。次のウインドウで各種ライセンスが表示されるので、納得したら「I accept the terms of the license agreements」のラジオボタンをチェックして、「Finish」。途中、Mountain Lion がセキュリティ関連のアラートを吐くけれど、納得して「OK」を押して進んで下さい。

☆5: インストールが終わったら、Eclipse を再起動。





▼ #05『ADT(Android Developing Tools)』の設定


☆1: Config ダイアログが起動する。「Use existing SDKs」のラジオボタンをチェックし、Locationを入力して「Next」。

Configure the ADT Plugin

⇒ 起動しない場合は、メニュー「Eclipse > Preferences」を選択。「Android」の項でSDK Location: を同様に入力し「Apply」し「OK」。

☆2: Contribute Usage Statistics?と聞かれる。利用履歴をGoogleに送って、開発の参考にしてもらいたい場合は「Yes」を選択して「Finish」。

☆3: うまくいかない場合は、Trouble shooting (英語)を参照とのこと






▼ 次は、何する?

Next Steps』に、次のアクションが書いてあります;

☆1: コーディングをはじめる
⇒ 『最初のアプリケーションを作ろう(Building Your First App)』をやってみる

☆2: アプリのデザインを学ぶ
⇒ 『Android Design』を見て研究する

☆3: APIフレームワークを熟読する
⇒ まず『API Guides』の基本的なトピックから読み始めてみる

⇒『Reference』で、細かな定義を調べる

☆4: 開発ツールに慣れ親しむ
ワークフローに沿って、適切な開発ツールの使い方を学ぶ。
※Eclips(とADT)以外に「IntelliJ IDEA 」等の統合ツールを使う選択肢もある。



-------

それでは、次のステップとして『最初のアプリケーションを作ろう(Building Your First App)』をやってみます。
【Android で 最初のアプリケーションを作る #1 】『 Building Your First App 〜 プロジェクトを作る 〜 』

Passbook(パスブック)on iOS6 (NDAに触れない範囲で...)

JUGEMテーマ:インターネット


Passbook(パスブック)について。NDAがある故に、あまりうまく世に情報が渡ってない気がしてて。2012年の夏(いま)。このブログ読んでくれてる人には、わかって欲しいなあ、と。



さてと。では、NDAに抵触しない内容に限定して、説明していきます。

何を、素材に話しようか。といえば。

一般公開されている情報の中で、一番詳細にその内容を伝えているもの。WWDC2012のキーノートビデオ(英語=だからなおさら、日本では情報が広まらない・・・)です。

http://www.apple.com/apple-events/june-2012/

⇒ だいたい、 93分10秒ぐらいからPass book についての説明が始まります。





Pass book は『すべてのパス(チケット、クーポン、搭乗券、会員証、etc...)を1ヶ所に整理するための、最もシンプルな方法だ』と言ってます。

搭乗券、ストアカード、映画チケット

すでに、航空会社とか、スターバックス、シネコンのチケットとかは、QR等のバーコードで認証する仕組みを、アプリで提供してるけど、でも、いちいちそのアプリをたちあげて、該当するバーコードを表示させるのは、めんどくさいよね。と。

get in one place

だったら、まとめちゃえばいいじゃん。と。

映画チケット

チケットの券面、こんなきれいやねんで。テンプレートも、ぎょうさんあるねんで。

ちなみに、映画館にきたら、、

映画チケットをスライド

ロック画面にも、ポップアップ表示されるから。スライドするとチケット表示されるし。そのまま映画館さーっと入れて、スマートだろう、と。



野球のチケットは、こんな感じ。

野球チケット


スターバックスカードは、こんな感じ。

スターバックスカード


アップルのカードは、こんな感じ。

アップルカード


アムトラックは、こんな感じ。

アムトラック


飛行機のチケットは、こんな感じ。

飛行機搭乗券


セットにもできるよ。横にフリックすると、こんな感じで・・・

飛行機搭乗券・トランジション


もう一方のチケットを表示できるよ。

飛行機搭乗券2


ホテルのカードもあるよ。

ホテルカード


ちなみに、券表面の右下にある「i」ボタンクリックすると、フリップして裏側が見られるよ。

券の裏


ゴミ箱ボタンを押すと・・・

券を捨てる・0


シュレッダーがでてきて、削除できるよ。

券を捨てる・1


スタバに近づくと、ロック画面にポップアップでお知らせしてくれるよ。

スタバに接近


で、スライドさせると・・・

スタバでスライド


スターバックスカードが出てくるから、それを見せればコーヒー買えちゃうね。

スタバで見せる


あと、券の内容が変わった場合は。ロックスクリーンにも、その情報を表示できるよ。

ロック画面


もちろん、それをスライドさせれば。。。

ロック画面・スライド


券面の内容(表記)も、変更されてるよ。

航空機搭乗券・変更後

・・・てな感じなのです。




で、このビデオからわかることをまとめると・・・


1:Passbook で扱えるのは、QR等のバーコードを含む「Pass」である
2:少なくとも現時点では、NFCには未対応である
3:券面に変更が出た場合、それをPUSHで通知できて、かつ、券面情報も書き換えられる
4:位置情報と連動して、ポップアップでアラートを出せる
5:USでは、有力企業が既に利用を考えている(UNITED<航空会社>、StarBucks<スタバ>、FANDANGO<映画チケット>、MLB<メジャーリーグ>、Amtrak<鉄道会社>、etc...)



⇒「1」「2」については、2年以上前にAppleは、NFCを使った入場管理システムについて特許申請を行なっていたにもかかわらず、今回、バーコードチケットを採用したという点に注目です。Googleが、NFCで失敗しているのを横目で見ながら、「枯れた技術」のバーコードで勝負するあたり、マーケティングセンスを感じます。


⇒「3」について。これまで、チケットを買ってしまった後に、そのイベントの内容が変更になった場合。その情報をキャッチするのは難しい、というのが紙チケットの「常識」でした。でも Passbookなら、自動的に変更情報が通知されてきて、かつ、変更内容がチケット券面に反映される。という世界に突入です。

これ、す・ご・い・こ・と・で・す。

技術的にすごいというより、サービスとしての完成度が非常に高いと感じます。センスがいいです。Androidでも確実に同じサービスやる人、でてきます。


⇒「4」について。これまで、紙のチケットは「入場券」でしかなかったけれど。Passbookの登場により、チケットは「主催者(サービス提供者)が、参加者をアテンドするためのツール」である。という意味に変わっていくんじゃないかと思えます。


⇒「5」について。「これ、iPhoneだけの話でしょ!?」って冷めたこと言う人がいると思うけど。それは、Appleのプレゼンスを見くびってるんじゃないかと思います。「App Storeは(・・・中略・・・)アカウント数が4億を超えました。これらはクレジットカードが登録されていてワンクリック購入が可能なアカウントです」という背景を理解すべきです。上記「マイナビニュース」によれば「米Amazon.comのアクティブアカウント数は1億5200万+」「PayPalは1億1000万」だそうで、Appleの巨大っぷりがよくわかります。

「でもそれって、USの話でしょ。ここは日本だお☆」って言われちゃうかもなあ。。。 なんというか、それはもう、どう思うかは、個人の自由ですから。。 僕も初代iPhoneが発売された当時、「かっこいいなあ」と思いつつ「でも、iモードの完成度はハンパないぜよ!負けないぜぃ!!」と思ってたから。 何も言えません。 Who knows? God knows.




このブログを見て、もしPassbookについて興味をそそられたなら、Apple Developer Center にてログインして、さらなる情報をGETするとよいかと。※Apple Developer Center にログインするには、有料(年間参加費 ¥8,400)登録する必要があります。まだ登録がお済みでない方は、この機会に登録するべし。



なんか、NDA気にせずに興味ある人たちでおしゃべり会したいなあ。。。Apple Developer Program 登録者の方限定で、8月頭くらいに集まりませんか?どうでしょうか? もし興味ある方いらっしゃいましたら、ぜひぜひFacebook でメッセージください

<追記:2012/07/26>
AppleのNFC関連特許が承認された。というニュースがありました。
http://www.appleinsider.com/articles/12/07/10/apple_wins_passbook_like_nfc_driven_itravel_patent.html
http://www.freepatentsonline.com/8215546.html
・・・気持ち盛り上がってきますね。


結局、Rails 3.2 で 大量のデータを検索する場合、Sunspot な Solr が一番 いい感じ。という面白くないオチ。

前回のエントリーで、Elasticsearch を、 tire で実装してみて。日本語の扱いがイケてない。という事実に直面し。。もちろん、Geekなあなたなら、なんとかしちゃうのかもしれませんが、エセ Geek な私は、そそくさと別の道を探ってみたわけです。

で、やっぱり落ち着いたのは Rails 3.2 + Sunspot + Solr 。Solr は、デフォルトの設定で普通に日本語扱えます。前回 Elasticsearch で出会ったように「中日」と検索して「中村」が引っかかることはありません。普通に、何不自由なく、MySQLで like 検索するように、日本語を扱えます。

Railsとの連携について。Sunspot の他にも選択肢があるみたいだけど。Google先生で質問しやすいのは、 Sunspot。とは言っても、英語でないと初心者向けの質問&回答は見つからないけど。。





以下、Rails 3.2 にて、インストールから実装(development 環境)まで参考にした情報。っていうか、Github 内の、オフィシャルドキュメント。 → Quickstart with Rails 3

1) Gemfile に、以下記載
gem 'sunspot_rails'
gem 'sunspot_solr' # development環境で使う、Solr のパッケージ。インストール推奨!
※ もし、Java が入ってない環境なら、先にインストールが必要だと思います。詳しくは、前回の Elasticsearch のエントリーを参照してください。

2) バンドルインストール
bundle install


3) デフォルトのコンフィグファイルを生成する
rails generate sunspot_rails:install


4)「1」にてインストールした Solr を起動する
bundle exec rake sunspot:solr:start # バックグラウンドでなくフォアグラウンドで起動するには「 sunspot:solr:run 」


5) model オブジェクトを、index に追加するための「searchable」ブロックを指定(以下、設定例)。
class Post < ActiveRecord::Base
 searchable do
  text :title, :body
  text :comments do
   comments.map { |comment| comment.body }
  end

  boolean :featured
  integer :blog_id
  integer :author_id
  integer :category_ids, :multiple => true
  double :average_rating
  time :published_at
  time :expired_at

  string :sort_title do
   title.downcase.gsub(/^(an?|the)/, '')
  end
 end
end

※「text」で指定したフィールドは、全文検索対象になります。controller ファイル内で「with」や「facet」で絞込み的にテキストを扱いたい場合は「string」で設定する必要があります。
※ Sunspot で扱えるクラスは、APIドキュメントのType項にて説明されています。ページ中央の「Defined Under Namespace」のところに書いてあります。

6) コントローラの指定(例)。
Post.search do
 fulltext 'best pizza'

 with :blog_id, 1
 with(:published_at).less_than Time.now
 order_by :published_at, :desc
 paginate :page => 2, :per_page => 15
 facet :category_ids, :author_id
end


7) 全文検索の、細かな設定(例)。
# 'pizza' を含む、すべての`text`フィールド (:title, :body, or :comments) のposts が対象
Post.search { fulltext 'pizza' }

# 'pizza' を含むpostsで、特に title 内で見つかったらスコアを上げる(優先させる)
Post.search do
 fulltext 'pizza' do
  boost_fields :title => 2.0
 end
end

# ':featured'(上記「5」のモデルファイル内の「searchable」で設定している boolean 値)が true の posts の場合、スコアを上げる(優先させる)
Post.search do
 fulltext 'pizza' do
  boost(2.0) { with(:featured, true) }
 end
end

# :title に'pizza' が含まれる posts だけを対象にする
Post.search do
 fulltext 'pizza' do
  fields(:title)
 end
end

# :title に pizza が含まれる posts をスコアを上げる(優先させる)。:body に含まれる場合は、スコアを上げない。
Post.search do
 fulltext 'pizza' do
  fields(:body, :title => 2.0)
 end
end



7-1) 全文検索での、フレーズ(Phrases)について。Solr は、近くに並んだ(close together な)単語を「フレーズ」として検索可能にする。Sunspotが使う、デフォルトのquery parser (dismax)では、フレーズ検索は、「" (ダブルクウォート)」で囲むことで有効となる。(→参考
# "great pizza" というフレーズを含んだ posts を検索する
Post.search do
 fulltext '"great pizza"'
end


7-2) 全文検索で、「 query_phrase_slop 」を使えば、フレーズ内の単語と単語の間に割り込める(入ってよい)単語を指定できる。
# フレーズ内の単語の間に、1単語のみ割り込み可能。つまり"great big pizza" も、検索対象となる。
Post.search do
 fulltext '"great pizza"' do
  query_phrase_slop 1
 end
end



7-3) 全文検索で、接近した単語のスコアを上げる。その単語は、必ずしもフレーズの中にある必要はないが、フレーズの中にあった方が、よりスコアは高くなる。
# 「great」と「pizza」を含んだドキュメントにマッチする。もし :title フィールド内のフレーズに、その単語が含まれれば、そのドキュメントのスコアは、より高くなる。
Post.search do
 fulltext 'great pizza' do
  phrase_fields :title => 2.0
 end
end

# 「great」と「pizza」を含んだドキュメントにマッチする。:title フィールドの中のフレーズ(あいだに1単語挟んでもOK)にその単語が含まれれば、そのドキュメントのスコアは、より高くなる。
Post.search do
 fulltext 'great pizza' do
  phrase_fields :title => 2.0
  phrase_slop 1
 end
end



8) スコープ (Scalar フィールド)について。全文検索の対象となる「text」以外(例:integer / boolean / time / etc...)の型は、検索クエリの範囲を指定したり、制限したりするのに使われる。ちなみに、全文検索よりも先に実行される。
# blog_id が 1 となる posts
Post.search do
 with(:blog_id, 1)
end

# 平均値が、3.0 〜 5.0 の posts
Post.search do
with(:average_rating, 3.0..5.0)
end

# category_id が、「1」「 3」「 5」のどれかにマッチする posts
Post.search do
with(:category_ids, [1, 3, 5])
end

# 1週間前にパブリッシュされた、posts
Post.search do
with(:published_at).greater_than(1.week.ago)
end


8-1) 「〜を含まない」というタイプのスコープ
# category_id が、 1 でも 3 でもないカテゴリー
Post.search do
 without(:category_ids, [1, 3])
end

# 「8)」のサンプルは、すべて「without」を使って「〜以外」とすることが可能。


8-2) 「Disjunctions」と「Conjunctions」(→参考
# 有効期限(expired)のない posts。もしく(OR)は、有効期限前の posts
Post.search do
 any_of do
  with(:expired_at).greater_than(Time.now)
  with(:expired_at, nil)
 end
end

# blog_id が「1 」で(AND)、author_idが「2」の posts
Post.search do
 all_of do
  with(:blog_id, 1)
  with(:author_id, 2)
 end
end


Disjunctions と conjunctions は、組み合わせも可能
Post.search do
 any_of do
  with(:blog_id, 1)
  all_of do
   with(:blog_id, 2)
   with(:category_ids, 3)
  end
 end
end


8-3) 全文検索の結果を含んだオブジェクトに対し、スコープによって範囲指定/制限をすることが可能
# blog_idが「1」で(AND)、 'pizza' を :title に含む posts
Post.search do
 with(:blog_id, 1)
 fulltext("pizza")
end



9) ページネーション( Pagination )について。Solr の検索結果は、すべてページ分割されている。検索結果の配列は、will_paginate や kaminari のようなページネーションライブラリと、シームレスに連動することができるメソッドを mixed in している。Sunspot はデフォルトで、Solr の検索結果の、最初の30件をリクエストする。
search = Post.search do
 fulltext "pizza"
end

# 全60件の検索結果があるとして。30件/1ページだとすると、全2ページとなる
results = search.results  # => Array with 30 Post elements

search.total  # => 60

results.total_pages  # => 2
results.first_page?  # => true
results.last_page?  # => false
results.previous_page  # => nil
results.next_page  # => 2
results.out_of_bounds?  # => false
results.offset  # => 0



次の結果のページを取得するため、検索(search)再度行い、paginate メソッドを使う。
search = Post.search do
 fulltext "pizza"
 paginate :page => 2
end

# 全60件あるとして。今回は 2ページ目が対象だ
results = search.results # => Array with 30 Post elements

search.total  # => 60

results.total_pages  # => 2
results.first_page?  # => false
results.last_page?  # => true
results.previous_page  # => 1
results.next_page  # => nil
results.out_of_bounds?  # => false
results.offset  # => 30


「 paginate: 」に「 :per_page 」オプションをつけると、結果ページ内の表示件数をカスタマイズできる
search = Post.search do
 fulltext "pizza"
 paginate :page => 1, :per_page => 50
end



10) ファセット(Faceting)とは、検索条件や絞り込み条件にマッチしたドキュメントの数を限定するための、Solr の機能だ。ドリルダウン型の検索インターフェイスを作る際などに使える。各 facet は、0 以上の row を返す。各 row は、検索結果 を絞り込む条件となる。
「 field facets 」の場合、各 row は、対象フィールド の特定の値 を 表す。「 query facets 」の場合、各 row は、不特定のスコープ を表す。実のところ、 facet とは、スコープの論理的グループにすぎない。

10-1) Field Facets
# 'pizza' にマッチした posts を、:author_id ごとにカウントして返す
search = Post.search do
 fulltext "pizza"
 facet :author_id
end

search.facet(:author_id).rows.each do |facet|
 puts "Author #{facet.value} has #{facet.count} pizza posts!"
end


10-2) Query Facets
# 平均値を、ファセットにより範囲指定した posts (のグループ)
Post.search do
 facet(:average_rating) do
  row(1.0..2.0) do
   with(:average_rating, 1.0..2.0)
  end
  row(2.0..3.0) do
   with(:average_rating, 2.0..3.0)
  end
  row(3.0..4.0) do
   with(:average_rating, 3.0..4.0)
  end
  row(4.0..5.0) do
   with(:average_rating, 4.0..5.0)
  end
 end
end

# 例)
# 平均値が、1.0 〜 2.0 のposts : 2件
# 平均値が、2.0 〜 3.0 のposts : 1件
search.facet(:average_rating).rows.each do |facet|
 puts "Number of posts with rating withing #{facet.value}: #{facet.count}"
end



11) 表示順( Ordering )について。標準では、Sunspot は "score" に基づいた表示順となる。ちなみに "score" とは、Solr 判断による、相対的な基準だ。ソートは「order_by」メソッドを使って実現する。
# 平均値(降順 - descending - )でソート
Post.search do
 fulltext("pizza")
 order_by(:average_rating, :desc)
end

# :score の相関によってソートする。相関が同点の場合、平均値(:average_rating)が高いものを上にする。
Post.search do
 fulltext("pizza")

 order_by(:score, :desc)
 order_by(:average_rating, :desc)
end

# Randomized ordering
Post.search do
 fulltext("pizza")
 order_by(:random)
end



12) Geospatial
TODO


13) 結果のハイライト( Highlighting )について。ドキュメント内の、検索クエリにマッチした部分を強調表示することができる。ハイライトしたいフィールドは「 :store 」する必要がある。
class Post < ActiveRecord::Base
 searchable do
  # ...
  text :body, :stored => true
 end
end


例えば、 :body フィールドにマッチした場合に、ハイライトするには。
search = Post.search do
 fulltext "pizza" do
  highlight :body
 end
end

# ハイライトのされ方は、こんな感じ;
# Post #1
# 私は、本当に *pizza* が大好きだ。
# *Pizza* は、私の好物だ
# Post #2
# ペペロニ *pizza* って、おいしいなあ。
search.hits.each do |hit|
 puts "Post ##{hit.primary_key}"

 hit.highlights(:body).each do |highlight|
  puts " " + highlight.format { |word| "*#{word}*" }
 end
end



14) Functions
TODO

15) More Like This
TODO


16) インデックスの、細かい点。
あとでやる。

16-1) スコアを上げるのは、インデックスの時に!( Index-Time Boosts )
どんなクエリの時にも、スコアを上げたいフィールドは、インデックスの時に :boost 設定をしよう
class Post < ActiveRecord::Base
 searchable do
  text :title, :boost => 5.0
  text :body
 end
end



17) Stored Fields について。 :stored したフィールドは;
・ Solr の内部でも 元のまま(tokenized されてない/ analyzed されてない)の値を保つ
・ 元となる Database(通常はSQL)を参照することなく、データを取得することができる。ハイライトするのにも使われる。
class Post < ActiveRecord::Base
 searchable do
  text :body, :stored => true
 end
end

# Database を参照することなく、:stored されたコンテンツを取得する
Post.search.hits.each do |hit|
 puts hit.stored(:body)
end



18) 「 #hits 」と「 #results 」
Sunspot はオブジェクトの型や Primary Key を Solr に保存する。検索結果を取得する際、Primary Key は、実際のオブジェクト(通常は、SQL の Database)をロードするために使われる。
#「 #results 」 を使って、オブジェクト・リレーショナル・マッパー(以下、ORM。 ORMの例としては、ActiveRecord + SQL のDatabase がある)から、該当レコードを取得する
Post.search.results.each do |result|
 puts result.body
end


元となるDatabase にクエリを投げずに、検索結果の情報にアクセスするには「 #hits 」を使う
# 「 #hits 」を使って、ORM からオブジェクトをロードすることなく、すべての情報を Solr から取得する
Post.search.hits.each do |hit|
 puts hit.stored(:body)
end


ORM からロードする「 #results 」と、ファセットやハイライトなど「 #hits 」の両方が必要な場合、「 each_with_result 」というコンビニメソッドが用意されている
Post.search.each_hit_with_result do |hit, result|
 # ...
end



19) 再インデックス( Reindexing Objects )について。Rails を使っていれば、 save のコールバックの一部として、オブジェクトは Solr に勝手に インデックスされる。ただし、「 searchable 」ブロック内のスキーマを変更した場合は、すべての オブジェクトの再インデックス( reindex )を行い、 Solr に変更を反映させる必要がある。
bundle exec rake sunspot:solr:reindex

# もしくは、特定のバッチサイズで、特定のモデルに対して再インデックスするなら
bundle exec rake sunspot:solr:reindex[500,Post]  # shell によっては、 [ with ¥[ and ] with ¥] をエスケープする必要がある



20) Use Without Rails
TODO


21) Solr のパラメータを、手動で設定するには、「 adjust_solr_params 」を使う
Post.search do
 adjust_solr_params do |params|
  params[:q] += " AND something_s:more"
 end
end



22) Session Proxies
TODO

23) Type Reference
TODO (→ 参照:APIドキュメントのType項


24) 開発について( Development )

24-1) 「 sunspot 」で、テストする。まず必要とされる gem をインストールする
cd /path/to/sunspot/sunspot
bundle install


Solr のインスタンスを、port 8983 で立ち上げる
bundle exec sunspot-solr start -p 8983
# フォアグラウンドでの実行は → `bundle exec sunspot-solr run -p 8983`


テストをはしらせる
bundle exec rake spec


必要があれば、Solr のインスタンスを止める
bundle exec sunspot-solr stop


24-2)「 sunspot_rails 」で、テストする。まず必要とされる gem をインストールする
cd /path/to/sunspot/sunspot
bundle install


Solr のインスタンスを、port 8983 で立ち上げる
bundle exec sunspot-solr start -p 8983
# フォアグラウンドでの実行は → `bundle exec sunspot-solr run -p 8983`


sunspot_rails のディレクトリに移動して
cd ../sunspot_rails


テストをはしらせる
rake spec # Rails の全バージョン
rake spec RAILS=3.1.1 # 特定バージョンの Rails だけ


必要があれば、Solr のインスタンスを止める
cd ../sunspot
bundle exec sunspot-solr stop




以上、Github 内の、オフィシャルドキュメント。 → Quickstart with Rails 3








ちなみに。ちょっと使ってて、便利だなあと思ったのは「 has_many :through 」とかのレベルまで Sunspot が理解してくれて、インデックスを作ってくれること。例えば、以下の様な感じ;
class Event < ActiveRecord::Base
 attr_accessible :xxxxxxx, :xxx, :xxxxx, :xxxxx, :xxxx, :xxxxxxx

 belongs_to :mother
 has_many :kids
 has_many :grandchildren, :through => :kids

 searchable do
  text :xxxx
  integer :xxxx
  string :xxxxxx

  string :xxxxxx, :multiple => true do  #子要素は、複数あるから、multiple
   kids.map(&:xxxxxx)
  end

  time :xxxxxxt, :trie => true, :multiple => true do
   grandchildren.map(&:xxxxxx)
  end
end

こんな感じで「has_many, :through」とかが設定されてれば、いきなり「grandchildren」とか出しても理解してくれるんです。






あと、こっちも参照。 →  Adding Sunspot search to Rails in 5 minutes or less

1) Gemfile 内に、以下記載
gem 'sunspot_rails', '~> 1.3.0'

2) バンドルインストール
$ bundle install

3) config/sunspot.yml を生成
$ rails g sunspot_rails:install

※ もし、Java が入ってない環境なら、先にインストールが必要だと思います。詳しくは、前回の Elasticsearch のエントリーを参照してください。

4) 現在の環境(おそらく development)で、solr を起動する
$ rake sunspot:solr:start

※ http://localhost:8982/solr/admin/ にて、Solr を操作することが可能。

5) model ファイルに、検索対象の記述を追加する(以下、例。)
class Post < ActiveRecord::Base
 searchable do
  text :title, :default_boost => 2
  text :body
 end
end


6) 検索用の index を作成する(※ ActiveRecord を使って保存されたデータについては、以後自動的に index に追加されるけど、初回なのでこれまでのデータを追加するために実行。)
$ rake sunspot:reindex


7) controller ファイルに、検索メソッドを追加する(以下、例。)
class PostsController < ApplicationController
 def search
  @search = Post.search(:include => [:comments]) do
   keywords(params[:q])
  end
 end
end


8) view ファイルに、検索部分を追加する(以下、Hamlでの例。)
.results
 - @search.each_hit_with_result do |hit, post|
  .result
   %h2= h post.title
   %h6== (#{h hit.score})
   %p= h truncate(post.body, :length => 100)
.pagination
 = will_paginate(@search.results)




以上、Adding Sunspot search to Rails in 5 minutes or less






あと。以下も参考になりました。

・『 Date range facets with Sunspot in Ruby on Rails 』
→ 日付を、ある範囲内で検索するような場合は、「 :trie => true 」を指定。「 time 」のみ対応( date では :trie を指定できない)。ちなみに、Database 上は、datetime を使ってると思いますが、その中に NULL( もしくは「0000-00-00 00:00:00」かも)があると「 $ rake sunspot:reindex 」した時に「 rake aborted! sunspot Error: Invalid Date String:'' 」みたいに出るから注意。日付の欄には、きちんと値を入れておく必要がある。みたい。
class Event
 searchable do
  time :start_time, :trie => true
 end
end

Event.search do
 facet :start_time do
  bod = Time.zone.now.beginning_of_day
  row :today do
   with :start_time, bod..(bod + 1)
  end
  row :tomorrow do
   with :start_time, (bod + 1)..(bod + 2)
  end
  # etc.
 end
end








あと。まだ詳しく診てないけど。 #hits を使った実例;
『Sunspot, Solr, Rails: Working with Results』






こちらも。実装のイメージを把握するのに、いい感じの実例;
『Full-text search in Rails with Sunspot』






こちらも、導入の参考にしました;
Railscast『 #278: Sunspotで全文検索 』






ちなみに Solr にはよさげな日本語の書籍があります。→『Apache Solr入門 ―オープンソース全文検索エンジン』。Rails関連の記述は古いですが、Solrについて理解を深めるには、良さ気な本だと思います。





・・・ぱーーーっと急いで書いたたので、誤字脱字。勘違いしてるぞ!などは、コメントくださいませ orz..
JUGEMテーマ:インターネット



Rails3.2 tire を使って、Elasticsearch を使うまでの道のり

JUGEMテーマ:インターネット


ここのところ、すっかり検索エンジン放浪者になってしまいました。 今回Railsで作ったアプリで扱うDBが巨大なので、MySQLのqueryベースだと、もたもたして使えない。というのが出発点でした。

で、まず発見したのが「Think Sphinx」。なんか、センスがよくて、いいなーっと思って。実装までしてみたんですが。なんと、日本語苦手なんですね、この人。はじめは、ぜんぜん日本語扱えなくて。で「Sphinx Search in Japanese」を参考に設定したら、なんとか扱えるようにはなったのだけれど。検索精度が悪い。。コンフィグ設定でできる範囲でいじってみたのですが、やっぱりイケてない。 日本語扱えない以外は、かなり好きなタイプなんだけど。でも、だめみたい。 ちなみに、PDFのチュートリアル(有料)があるんだけど、それがすごく読みやすい。英語だけど。 日本語、もうちょっとちゃんと扱ってくれたらなあ・・・。

で、いろいろ検索してたら「Sunspot」と「Tire」が有力候補としてあがってきました。

The Ruby Toolboxでも、その3つが巨塔みたい。Solr系もいいんだけど、なんとなく古いイメージがあって。だからまあ、枯れてていいのかもしれないけど。新しもの好きなので、Elasticsearchをまず使ってみようと思ったわけです。



以下、Centos6(さくら VPS)へのインストール記録です;
(※Ruby 1.9.3 や、Rails 3.2 、MySQL など基本的な構成で、既存のアプリケーションがあるという前提での記述です。)



1)まず、Javaをインストールしてない場合は、Java Runtime の最新版をダウンロードしてインストールします。(サーバ内のターミナルからDLしようとすると、いわゆる規約に同意するためのJSでエラーになってしまい。うまくいきせんでした。なので、ローカルにDLしてから、サーバにSFTPしました。)
http://download.oracle.com/otn-pub/java/jdk/7u4-b20/jre-7u4-linux-x64.rpm

2)ダウンロードしたファイルを、適当なディレクトリにコピーして、インストールします。
$ sudo rpm -ivh jre-7u4-linux-x64.rpm


3)バージョンの確認をしてみます。
$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b20)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)




4)次に、elasticsearch をDLします。
$ curl -L -O -k ╲ https://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.19.4.zip


5)解凍します
$ unzip elasticsearch-0.19.4.zip


6)適当に、移動します
$ sudo mv elasticsearch-0.19.4 /usr/local/elasticsearch


7)実行してみます
$ /usr/local/elasticsearch/bin/elasticsearch -f


※終了するには「Control + C」で落とします。
※「./elasticsearch/bin/service/elasticsearch start | stop | restart」が可能な、Service wrapper もあり。詳しくは、下記「参考」参照
※参考)「Setting up elasticsearch」



8)rails_app/Gemfile に、下記追加
gem 'tire'
gem 'will_paginate', '~> 3.0' # 既に記載済みの場合はOK。これ入れないと「elasticsearch 」でインデックス作るときに「undefined method `paginate'」みたいなエラーがでる。後述参照


9)バンドルインストール
bundle install


10)rails_app/config/environment.rb に以下追加
require 'will_paginate'

※参考)https://github.com/radiant/radiant/issues/221

11)検索対象の model ファイルに、記述追加
class Article < ActiveRecord::Base
has_many: xxxxx

include Tire::Model::Search #これを追加
include Tire::Model::Callbacks #これを追加
end

※参考)https://github.com/karmi/tire/blob/master/README.markdownの中の「ActiveModel Integration」

12)検索対象の controller ファイルの index メソッドをこんな感じに;
def index
if params[:query].present?
@shows = Show.search(params[:query], load: true)
else
@shows = Show.all
end

 ・
 ・
 ・
end


13)検索対象の view ファイルを、こんな感じに(※models_pathは適切に差し替える);
<%= form_tag models_path, :method => :get do %>


<%= search_field_tag :query, params[:query] %>
<%= submit_tag "Search", name: nil %>


<% end %>



14)elasticsearch の index を更新する
rake environment tire:import CLASS='Model名' FORCE=true

※参考)rake -T でコマンド確認可能

15)検索ボックスが表示されているので、そこから検索可能(な、はず)


・・・でもなんか、2〜3文字で検索すると、その中の1文字だけが一致する結果もひろってきたりと、あんまり信頼性ない感じ。例えば「中日」で検索すると「中国」とか「中村」がかかってくる。「中 AND 日」で検索すると、なんとかうまくいくけど。それでいいんかい? やっぱ、Solr なのか?それとも、elasticsearch の設定でなんとかなるのか??


以上、参考URL;
Elasticsearch 公式サイト
tire on Github
RailsCasts #306 ElasticSearch Part 1(日本語)





Mac OS X Lion で、emacs を楽に使うために、Meta キーを「option」に設定したい。

JUGEMテーマ:コンピュータ


ようやく、居場所を突き止めました・・・。っていうか、常識なの?

Mac では、標準のMeta キーは「esc」なんだけど。それって、小指が届かないっす。emacs とかやってると、もう嫌になる。

OS X Lion にする前は、「option」に変更する設定が「設定>キーボード>修飾キー」のところにあったはずなんだけど。。

設定_app

ないんです、Lionには!

で、.emacs で「(setq mac-command-key-is-meta t)」的な設定をするんだけど、機能しない。。。


いろいろ、ググッたんですが、なかなか情報が出てこなくて。

もう半分あきらめてたんですが。


ようやく、OS X Lion で、Meta キーを「 option 」に設定する場所を発見しました!







ターミナル_app

えと。場所は「ターミナル(terminal.app)」の「環境設定... > 設定 > キーボード」の中でした。「メタキーとして option キーを使用」。うん、これ!


tmux の中で emacs 使ってる時にも、問題ないっす!


ふー。これでひとつ問題が片付いた。


おやすみなさい。

本が出てます☆

主に、デザイン以外の
パート(企画・マーケティング等)を担当してます



発注者のためのWeb制作本。
制作者/開発者の方も必見!
Twitter
selected entries
categories
archives
recent comment
  • 携帯キャリアの、アクセス制限(未成年保護)についてのまとめ
    たけのこの里 (10/01)
  • Mac OS X Lion で、emacs を楽に使うために、Meta キーを「option」に設定したい。
    イシカワ (07/16)
  • さくらインターネットで、gem install すると「chown/chgrp: Operation not permitted 」と叱られる件の対応
    sean (04/20)
  • さくらインターネットで、gem install すると「chown/chgrp: Operation not permitted 」と叱られる件の対応
    てっちー (03/24)
  • Mac OS X Lion で、emacs を楽に使うために、Meta キーを「option」に設定したい。
    JO (01/04)
  • Passbook(パスブック)on iOS6 (NDAに触れない範囲で...)
    ぱん (09/28)
  • Passbook(パスブック)on iOS6 (NDAに触れない範囲で...)
    宮腰睦美 (09/23)
  • magit を、Lion の emacs にインストール
    ぱん (05/08)
  • 【 Xcode4.2 】Interface Builder使わずに、座標を合わせたい(習作1)
    ぱん (12/21)
  • 【 Xcode4.2 】Interface Builder使わずに、座標を合わせたい(習作1)
    kuronobee (12/02)
recommend
iOSプログラミング 第2版
iOSプログラミング 第2版 (JUGEMレビュー »)
アーロン・ヒレガス,ジョー・コンウェイ,Aaron Hillegass,Joe Conway
■独学で初心者を脱出するには、必読ではないでしょうか。翻訳でニュアンスが伝わらない部分があるので、原書と、サポートサイト(英語)を活用すべし!です。
recommend
iPhoneプログラミングUIKit詳解リファレンス
iPhoneプログラミングUIKit詳解リファレンス (JUGEMレビュー »)
所 友太
■内容古いですが、iOSプログラマー中級以上の階段を登るために、必要な本だと思います。iOS5対応版出ないかな。。
recommend
iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎
iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎 (JUGEMレビュー »)
大津 真
■Ch.1「iOS プログラミングを始めるための基礎知識」でXcodeの概要を理解して、Ch.2「Objective-C の基礎知識」で、Objective-Cの考え方を理解できます。iOSプログラミングのキックオフにぴったり。
recommend
去年ルノアールで
去年ルノアールで (JUGEMレビュー »)
せきしろ
■ルノアールで妄想が爆発
recommend
RailsによるアジャイルWebアプリケーション開発 第4版
RailsによるアジャイルWebアプリケーション開発 第4版 (JUGEMレビュー »)
Sam Ruby,Dave Thomas,David Heinemeier Hansson
■Railsのバイブル第4版の日本語版が2011年末にリリース!サーバサイドで準備するAPIや、Webサイト関連のもろもろは、やっぱRailsでしょう。
links
profile
search this site.
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM
sponsored links