ページ

2012年3月31日土曜日

CoffeeScriptのREPLでUnderscore.js使おうとしてハマった

結論を先に書くと、nodeとかcoffeeのREPLでは, _(アンダースコア)に最後の式の結果が入る。

なので
> _ = require 'underscore'
~略~

> _.VERSION
'1.3.1'

> _.VERSION
undefined

> _
'1.3.1'
みたいなことになる。

余談だけど、この性質があるので最初の _ への代入はわざわざ書かなくても
require 'underscore'
だけ書けば、少なくとも次の一回はUnderscore.jsとしての_を使えるね。

2012年3月21日水曜日

XcodeでMacRubyのgemを使う

Xcodeのバージョンは4.3.1
MacRubyはRVMで入れたのを使う。

% rvm use macruby-nightly
% rvm info

で出力される中に書いてあるGEM_HOMEとGEM_PATHをXcodeの環境変数に入れる。

やり方。

下の画像、Deploymentって書いてあるところをクリックすると出てくる「Edit Schme...」的なやつを選択。

ArgumentsにあるEnvironment Variablesにこんな感じで追加してやる。


で、require 'rubygems' すればgemが使えた。
(MacRubyってRuby1.9系 な気がしたんだけど、require 'rubygems'がいるのはなんでだっけ)
これでちゃんと合ってるのかわかんないんだけど、間違ってたらそのうち誰かが指摘してくれると信じてる。


あと、デプロイするときにgemを含めたい場合は、この画面で

Argumenstのところに
--gem なんとか --gem かんとか
って書いてやればいいようだ。


3/22 追記: MacRuby DoJoに書いてあった
CRuby 1.9 では require 'rubygems' が不要なのですが、MacRuby で RubyGems を利用する際には必須となります。「MacRuby の起動にさらに時間がかかるので、rubygems をロードしていない」というのが理由です。

MacRubyをRVMでインストールしてXcodeで使う

Xcodeのバージョンは4.3.1

macruby-0.10はXcode4.3に対応していないらしいので、nightly-buildを使う。
% rvm install macruby-nightly

インストールして、XcodeでMacRuby Applicationを新しく作ると、こういう風にMacRuby.frameworkのところが赤くなってる。
(RVMを使わないでMacRubyをインストールしておいた場合にもなるのかは知らない)

赤くなってるMacRuby.frameworkはdeleteキーを一押しして消してしまい、/Library/Frameworks/ にMacRuby.frameworkがあるのでそいつをD&Dしてやればいい。

左のツリーにあるFrameworksの中にあるMacRuby.frameworkも赤くなってるので、消してやって、読み込まれたMacRuby.frameworkをそこに移動させればすっきり。

2012年3月18日日曜日

Stylus気に入った

今や数あるCSSテンプレートの一つだろう、ぐらいに思っていたら

http://learnboost.github.com/stylus/docs/css-style.html

普通のCSS を書いても大丈夫だった。

ちょいとコピペしてきたのを試すときにも変換したりする必要がないし、stylus式の書き方を完全に覚えてなく てもなんとなく書けるのはとてもいい。

expressコマンドのオプションとして指定できるだけのことはあるな。

追記: ていうかExpressとStylusの開発者同じじゃん

2012年3月11日日曜日

MongoDBのコレクションからランダムなドキュメントを取り出す

色々間違ってそうで不安だ。

http://eric.lubow.org/2010/databases/mongodb/getting-a-random-record-from-a-mongodb-collection/
ググるとこういうやり方が出て来るのだけど、実際やってみるとこれではランダムにならない。

上のやり方を僕の理解でなんとなく説明してみると
{id:1, random:9}
{id:2, random:2}
{id:3, random:5}
{id:4, random:1}
みたいな、あらかじめそれぞれのドキュメントがランダムな値を持ってるコレクションがあって
db.docs.findOne( { random : { $gte : rand } } )
みたいな感じでドキュメントを取り出すと、randよりも大きいrandom(先述したランダムな値)を持ってるドキュメントを一つ取り出す。

このrandってのはドキュメントを取り出そうとするたびに変わる値で、それゆえにrandよりも大きいrandomを持つドキュメントは毎回変わるということ。

問題はここから。

findOne()ってのはfind()したやつの中の1個を返して来る。
find()で返ってくるのはカーソルっていうハッシュみたいなやつらしく、 どうやら中身がid順で並んでる。

例えばrandが8のとき、8より大きいrandomを持つのはid:1のドキュメントだけなのでそれが取り出される。これはいい。
次に、randが3のとき、この場合はid:1とid:3が該当する。

この2つ
{:id1, random:9}
{:id3, random:5}

このとき出てきて欲しいのは、3より大きいrandomの中では一番小さい5を持つドキュメント。
でも、実際取り出されるのは並んでるのの1個目なのでid:1のドキュメント。

つまり、idが若くてrandomの値が大きいやつに偏って取り出されてしまう。

どうしたものかと考えていたらこんな解決法があった。
http://cookbook.mongodb.org/patterns/random-attribute/#comment-452243980

地理空間のインデックスを利用して、randから"一番近い"randomを持ってるやつを検索取得するようにしてる。


最初にrandomフィールドに地理空間のインデックスを作成しておく。
db.docs.ensureIndex( { random: '2d' } )

そのあとの流れは上のと大体同じ。
// それぞれのX軸の値をランダムにする
for ( i = 0; i < 10; ++i ) db.docs.insert( { key: i, random: [Math.random(), 0] } );

// $nearを使うことでランダムな値に近いやつを取れる
db.docs.findOne( {random : { $near : [Math.random(), 0] } } ) 

// 任意の個数取り出すこともできる
db.docs.find( { random : { $near : [Math.random(), 0] } } ).limit( 4 ) 


あと、そんなに早くなくてもいいからとりあえず1個取り出したいようなときはこれだけでもいける。

参考: http://stackoverflow.com/questions/2824157/random-record-from-mongodb/2824166#2824166

Vimでrbファイル作成時にマジックコメントつける

参考: Rubyのエンコード指定マジックコメントを##<esc>で挿入できるようにした - LazyLoadLife

~/.vim/templates/rb.tpl を作成。
中身はマジックコメント
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

で、~/.vimrc に以下を追加。
autocmd BufNewFile *.rb 0r ~/.vim/templates/rb.tpl

自動生成したファイルとか、既存のファイルにつけるにはこんなのがあった。
https://github.com/m-ryan/magic_encoding

Gyaimで変換候補ウィンドウが出なくなったときの対処

Gyaimを使ってると何かの拍子に変換候補ウィンドウが出なくなることがある。

そんなときは一度
% killall Gyaim
してやればいい。

Pryで日本語入力できるようにする

pryの読み方って「ぷらい」なんですね。「ぷりい」って読んでた。

% rvm pkg install readline

するとreadlineが /Users/zakuni/.rvm/usr とかにインストールされるので
そいつを使ってrubyをreinstallする

% rvm reinstall ruby-1.9.3 --with-readline-dir=/Users/zakuni/.rvm/usr

これでPryで日本語入力できる。

参考: irbやpryで日本語を入力できるようにする - IwazerReport

Vimの日本語入力がおかしかった

vimで日本語を入力しようとすると、入力してる途中で確定されてしまい、変換前のひらがなとアルファベットが入り混じることがあった。

コメントで入力しようとすると大丈夫だったりするのでAutocomplpopあたりが怪しい気もするのだけど、とりあえず以下で解決した。

.gvimrcにこれを追加
set imdisable