Homebrewを使う。couchまで入れる。

ずっとMacPortsを使っていたのですが、HomeBrewがいいらしいというのでいれてみた。

MacPortsだと元から入っているライブラリや自分で入れライブラリは完全無視で、依存関係のあるパッケージをかたっぱしから入れるので、物によってはインストールに時間が掛かる。あと/optとかに入るので使いにくい。。

HomeBrewだと/usr/local以下にインストールされるとのこと。依存関係もうまいことやってくる。らしい。。

Homebrew
http://github.com/mxcl/homebrew

インストールは下記の通り
http://wiki.github.com/mxcl/homebrew/installation

$ ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)"

と出たので完了したらしい。

そしてさよなら MacPorts...

$ sudo port -f uninstall installed

ああ、あれインストールするのにすごい時間かかったなぁとか思いながら消えていく。。。結構後先考えずにやります僕。はい

あ、さすが実運用サーバーではやりません。

couchdbのインストール。

ためしにインストールしてみる。couchdbもhomebrewに入ってるぜ!というわけでLucuneごと。。

$ brew install git couchdb couchdb-lucene

インストールが終わったところで下記のように言われる。

==> Caveats
If this is your first install, automatically load on login with:
    cp /usr/local/Cellar/couchdb/1.0.1/Library/LaunchDaemons/org.apache.couchdb.plist ~/Library/LaunchAgents
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist

If this is an upgrade and you already have the com.mysql.mysqld.plist loaded:
    launchctl unload -w ~/Library/LaunchAgents/org.apache.couchdb.plist
    cp /usr/local/Cellar/couchdb/1.0.1/Library/LaunchDaemons/org.apache.couchdb.plist ~/Library/LaunchAgents
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist

Or start manually with:
    couchdb

ログイン時に自動的に起動するためにはこれを実行しろというので、言われたとおりに実行。
launchctlについては
http://d.hatena.ne.jp/amachang/20080108/1199778615
に詳しく書いてありました。

    cp /usr/local/Cellar/couchdb/1.0.1/Library/LaunchDaemons/org.apache.couchdb.plist ~/Library/LaunchAgents
    launchctl load -w ~/Library/LaunchAgents/org.apache.couchdb.plist

couch-luceneにも同様のメッセージが出たので同じように実行

  cp "/usr/local/Cellar/couchdb-lucene/0.5.3/couchdb-lucene.plist" ~/Library/LaunchAgents/
  launchctl load -w ~/Library/LaunchAgents/couchdb-lucene.plist

とりあえずインストールできたみたいです。

Nexus Oneの修理

少し前の話ですが、NexusOneを床に落として、液晶を割ってしまいました。

左下が割れてます。。

# 実はDesireも持っているのですが、それも落として全面のガラスを割ってしまっていました。。。Softbankから買ったものなので、保険修理で3000円で直せました。。

この端末はexpansys(http://www.expansys.jp/)から購入したもので、ほぼ個人輸入。メーカー修理をしてもらえるのか。仮に受け付けてもらえたところで、輸送の時間とか費用とかどうなるかわからない状態。

とりあえずどこか直してくれないかぐぐってみた、、N1じゃないがiPhoneは直せるみたい。
iPhone factory (http://www.iphone-factory.jp/)
ということで電話してみました。すると

「ちょっとやったことが無いので、明日確認して折り返すとのこと」

なんだか不穏な雰囲気、、、なので、他の手段も探すことにします。見た感じ、液晶が割れているだけで、他の部分は無傷のハズ。液晶を単体で購入できて、交換すれば元通りになるはず!との思いで、探してい見る。

すると怪しげなところに、売ってました。
http://moumantai.biz/
価格は8,000円。。いい値段します。

次の日、問い合わせた店から回答がきました。

「やったことはないですが、できます。13,000円で直せますとのことでした。」

工賃考えたら、絶対頼んだほうがいいです!良心的な値段のはずです。でも「開けてみたい」、とかちょっとここにも書けない、複雑な事情で自分で直すことにしました。というわけで、液晶をポチっとしました。支払いはPayPal送金、、、怪しい、本当に届くのか??

数日後、怪しげな包くくるまれて無事郵便で届きました。早速交換!と行きたいところが、トルクスネジが無いとばらせません。時間が夜遅かったのと、手持ちに無かったので平和島ドンキまで買いに行きました。

あるんですよ。ドンキにはこの手の工具

本当はiPhone用のリムーバーとか欲しかったんですが、手に入りにくそうだったので、適当なもので代用しようと思いました。

分解(破壊?)手順w

結構必死だったのでほとんど写真が残っていません!覚えている範囲なので参考にならないぐらい。抜けていますwネジの長さとか種類が場所によって違うので、メモしながらばらすことをおすすめします。

それから分解は自己責任でお願いします。

  • 背面カバーを外します。
  • バッテリーを外します。
  • ネジ(トルクスネジもあり)を外して、バッテリーをうけているカバーを外します。
    • 脇のボタン類も外れるので注意
  • ボトムカバーを外します。
    • この時ちょっと気をつけないと、充電用の端子とかを巻き込んで壊してしますので注意。細いカードか何かを隙間に刺して徐々に外していくしかありません。
  • インナーカバーを外します。(ネジを外す必要あり)
    • ここもかなり気をつけないとやばいです。このあたりは、マイクとかバイブ用のモーターとかが付いています。僕は基板のパターンを壊しそうになりました。。。
  • コネクタ類を外します。
    • こんな状態になっているはず

  • 基板を引き抜きます。
    • あっちこっち外さないと出てこないです。引き出すとこんな感じ。

  1. 液晶をとりだします。

    • テープで固定してあったり、アルミテープのシールドがあったりするのでそれを破らないようにベリベリはがしながら作業します。液晶裏にべったりアルミテープが付いているので、勇気を振り絞って剥ぎとります。。。もうこの時点で嫌になってきました。。
  1. 液晶を交換。
    • 新しい液晶に交換します。元あったアルミテープなどをそのまま移植します。
  2. あとはの手順で戻します。
    • マイク部分のゴム?には注意が必要。ちゃんと付けないと音声を受付なくなっちゃいます。

全部組み終わると、お決まりのようにネジが余りましたが、、、問題なく動作するようになりました。

最近の電子機器の特にスマートフォンとかの集積率はヤバすぎです。結果的にはうまく行ったのでよかったですが。ちょっと間違うと壊します。本当におすすめしません。工賃を+数千円払ってリスクが回避出来るならその方いいですね。

ちなみに、格闘の挙句ちょっとボトムカバーに傷跡を残してしまったので、別途購入して交換したいと思います。

この一件以来。ちゃんとカバーを付けることにしました。。。


さっきみたらもうNexusOne用の液晶は売ってませんでした。有機発光ダイオード・ディスプレーなので、希少なのかなぁ、

SQLからCouchdbへ

SQL的にこういうクエリはCouchdbではこうするという感じのメモ

いくらNoSQLと言われてもSQLに馴染んできた人にとっては、じゃあどうするのということで、SQL的にこういう事はCouchdbではこんな風に呼び出せるというのをまとめてみました。

※デザインドキュメントの作り方などは今回はすっ飛ばします。使っているデザインドキュメントは下記参照。

http://gist.github.com/563730

SELECT * from car(全件取得)

テーブルから全件取得します。mapコードは下記のように、keyもvalueは何でも構わないです。全件取得するだけですので、単純にmapするだけでreduceは必要ありません。複数の形式のドキュメントが入っていてだし分けたい場合などはここで条件判定すればできます。下記の例だとtypeに"car"と指定されているもののリストを出すようにしています。

// map
function(doc) {
    if (doc.type == 'car') {
       emit(null, null);
    }
}

あとはリクエストを投げてみると

$ curl -X GET http://localhost:5984/dbname/_design/select/_view/all?include_docs=true

下記のようにJSONで出力結果が得られます。

{"total_rows":2,"offset":0,"rows":[
{"id":"b0b5c3537c0c39e32c6045a4260025f0","key":null,"value":null,"doc":{"_id":"b0b5c3537c0c39e32c6045a4260025f0","_rev":"3-99978135684ebb90ff34416214f0e19c","type":"car","maker":"AMG","model":"C65","year":2009,"price":10200000}},
{"id":"b0b5c3537c0c39e32c6045a426002fa2","key":null,"value":null,"doc":{"_id":"b0b5c3537c0c39e32c6045a426002fa2","_rev":"2-2e56ce81f3608095b296f94cfd35028b","type":"car","maker":"BMW","model":"M3","year":2009,"price":10200000}}
]}

リクエスト時にinclude_docs=trueを付けることですることで、ドキュメント全体も取得できるようになります。欲しい情報が決まっているならinclude_docsを指定せずに、emitするときにkey,valueを指定しても良いかも。

このままだと全件一気に出力されるのですが、下記のようにskip,limitのパラメーターを付けることでページングさせることも可能です。

curl -X GET http://localhost:5984/dbname/_design/select/_view/all?include_docs=true&skip=10&limit=10

descendingパラメーターを使用することによりSQLで言う、descをつけた時と同じように、降順でソートすることも可能です。

curl -X GET http://localhost:5984/dbname/_design/select/_view/all?include_docs=true&descending=true

SELECT count(*) from TABLE (レコード数の取得)

テーブル(ドキュメント)のレコードを数を取得してみたいと思います。
下記のようなdesignviewを用意します。

//map
function(doc) {
    emit(null, 1);
}
// reduce
function(keys, values) {
    sum(values) 
}

mapでは単純にvalue値として1とmapします。それをreduceで集計し件数を出します。5件のレコードならば1+1+1+1+1=5ということみたいです。

そしてcouchdbにリクエストを投げます。

http://localhost:5984/dbname/_design/select/_view/count

結果次のように帰ってきます。

{"rows":[
{"key":null,"value":10}
]}

この場合10件のドキュメントが見つかりました。
keyがnullなのは不思議なのですが全件reduceするとkeyは関係なくなるので、必ずnullで良いみたいです。

SELECT * from TABLE WHERE maker = 'AMG'

テーブルからmakerがAMGであるのドキュメントの一覧を取得してみます。

mapでkeyにmakerを指定しておくだけでOKです。

// map
function (doc) {
  emit(doc.maker, null);
}

下記のようにリクエストします。keyに渡す文字列はjsonである必要があるので、”で囲みます。

http://localhost:5984/test/_design/select/_view/by_maker?key=%22AMG%22&include_docs=true

SELECT maker, model from TABLE WHERE maker = 'AMG' group by model

makerをAMGで絞り込んだ上model名でgroupします。

// map
function (doc) {
  emit([doc.maker, doc.model], 1);
}
// reduce
function (keys, values, rr) {
  return sum(values);
}

emit時にキーに配列でmakerとmodelを指定します。

starkeyとendkeyをうまく指定し,groupを指定することでgroup by的なアクセスが出来ます。

http://localhost:5984/dbname/_design/select/_view/by_maker?startkey=["AMG"]&endkey=["AMG",{}]&group=true

AMGのmodel一覧が帰ってきました。

{"rows":[
{"key":["AMG","C65"],"value":1},
{"key":["AMG","E55"],"value":1}
]}

startkeyとかendkeyとかまだあまり理解できてないので、ちょっと調べてみます。

SSH Key認証

いつも忘れてしまうので、メモです。

SSHKey認証する方法

まずクライアントマシンで秘密鍵を作ります。今回はrsaで作成しました。

ssh-keygenを実行してキーを作成します。パスフレーズが聞かれるので同じパスワードを2回入力します。

$ssh-keygen -t rsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/takahashi/.ssh/id_rsa):         
Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

次に、サーバーに公開鍵を転送します。間違っても平文で送らないようにそして、authorized_keysに転送した公開鍵を登録します。

$scp .ssh/id_rsa.pub username@servername:.
$ssh user@hostname "cat id_rsa.pub >> .ssh/authorized_keys"

これでSSHKey認証ができるようになりましたが、このままだと毎回パスワードを聞かれます。ssh-agentを使うとキーの暗号化が解除され、キャッシュされます。するとパスフレーズなしに接続できるようになります。

ssh-agentを起動します。

$eval `ssh-agent`

ssh-add で秘密鍵を指定して実行します。
パスワードが効かれるので、ssh-keygen時に指定したパスワードを入力します。

$ssh-add ~/.ssh/id_pub
Enter passphrase for /Users/mistat/.ssh/id_rsa: 
Identity added: /Users/mistat/.ssh/id_rsa (/Users/mistat/.ssh/id_rsa)

これで秘密鍵の暗号化が解除され、パスなしで接続できるようになります。

Apple Special Event

Apple Special Eventの内容のまとめについて

iOS4.1リリース

  • バグフィックス
  • HDR(High Dynamic Range Photos)
  • Game Center正式リリース
  • HDビデオ
  • TV番組のレンタル(日本はむりだろな。。)

iOS4.2 iPad向けを発表

  • プリント機能
  • AirPlay ( Air Tune )
  • Folder
  • Multitask

iPod

http://www.apple.com/jp/ipodnano/features.html

  • iPod Shiffle
    • 4800円
    • 15時間再生
    • ボタンが戻った
    • Voice Over
    • Playlist
  • iPod Nano
    • 8G ¥13,800
    • 16G ¥16,800
    • タッチディスプレイ
    • FMラジオ
  • iPod Touch
    • 8G 20,900
    • 16G 27,800
    • 64G 36,800
    • No1 ゲーム機である
    • DisplayはiPhone4と同じRetina
    • 薄くなった
    • 40時間再生
    • 背面、全面カメラ

iTunes10

すでにサイトがアップされている。
http://www.apple.com/jp/itunes/whats-new/

iTunesはダウンロード可能のように見えるが、実際に落とせるのは9.2.1

iTunes上のソーシャルネットワーク

Apple TV

  • 電源内蔵
  • HDMI
  • Remote付き
  • ストレージがなくなった
  • ストリーミングで配信
    • abc foxが配信する。
  • 日本は発売未定
  • iPad, iPhoneからリモートコントロールできる。