Tag Archives: tips

rubygemsをバージョンを指定して更新

メモ。

gem install rubygems-update -v <バージョン>
update_rubygems

バージョンの一覧はrubygems.orgなどで確認するとよい。


__FILE__と$0

FILE はそのコードが書かれているファイルを指し、$0は起動されたスクリプトを指す。

FILE は実行中のプログラムのファイル名」が詳しい。

先程の記事に載せたgistではこれを利用してサンプルプログラムを末尾に記述している。


コマンドラインアプリ作成にちょっと便利なStringの拡張

githubをうろうろしていたら「なるほど」と思ったコードを見つけたのでメモっておく。

get-twitter-oauth-token / bin / get-twitter-oauth-token (gistじゃないので残念ながら埋め込むことができない。コピペするのも微妙なのでリンクだけ提示しておく)

これは@jugyoさん作のコマンドラインからTwitterのOAuthのアクセストークンと秘密鍵を取得するスクリプトで、openコマンドを使ってるあたり多分Mac専用なんだと思う(Linuxとかでもあるのかな?)。

なるほどなーと思ったのはStringを拡張しているcolorとaskという二つのメソッド。

colorはその名のとおり文字列に色をつけるもので、引数numにはANSIエスケープシーケンス(?)で指定できる色の番号を渡す(「bashのプロンプトに色をつける」などを参照。zshでもいける)。

もうひとつのaskはユーザからの入力を受け付けを表示するもので、レシーバの文字列を印字してから入力された内容を返す。凄く短いメソッドだけど、これひとつだけで可読性が向上するから感動してしまった。

ただこれだとパスワードの入力もみえてしまうので、sttyを使って入力中の文字列を表示しないメソッドもあったほうが便利だと思い、ちょっと書いてみた。

ask_passwordなんて長ったらしいけど、パスワードはそうそう聞くものでもないしまぁいいかな、と。askとcolorはそのまま拝借した。これがあるだけでコマンドラインアプリがちょっと書きやすくなるんじゃないかと思う。


ChromeでWeb版Belugaのテキスト入力欄をリサイズ可能に

Web版Belugaのテキスト入力欄はデフォルトでリサイズ不可になっていて使いづらい。というわけでGoogle Chromeのユーザースタイルシートを使ってこの設定を上書きした。

Mac OSXではGoogle Chromeのユーザースタイルシートは~/Library/Application\ Support/Google/Chrome/Default/User\ StyleSheets/Custom.cssにあるので、ここに次のように追記する。

textarea { resize: both !important; }

これでtextareaは必ずリサイズ可能になる。


jQuery mobileでブラウザネイティブのselectダイアログを使う

jQuery mobileでselect要素を使うとbodyの後部に選択ダイアログ用のdiv要素を追加してそれっぽく表示してくれる(デモ)。

ただAjaxで動的にoption要素を生成するような場合だとjQuery mobileの初期化に行われるDOMツリーの書き換えのタイミングと合わなくて、意図したとおりにoption要素に追加したものがダイアログに表示されなかったりする。

こういうときはとりあえずselect要素にdata-native-menu="true"を追加すれば、ブラウザネイティブの選択ダイアログが使われるようになるので、動的にoptionを追加した場合にも追従できる。

<select name="fruit" data-native-menu="true">
  <option>Apple</option>
  <option>Orange</option>
  <option>Banana</option>
</select>

あまり見た目は良くないかもしれないけど、応急処置ということであれば十分かと思う。


watchrでautospecみたいなこと

watchrで更新のあったファイルに対してrspecを実行する方法。

secondlifeさんの記事を読んで、取り急ぎやってみた。

$ gem install watchr
$ gem install ruby-fsevent # Mac OSXの場合
$ gem install rev # Linux/*BSDの場合
$ cd (RAILSアプリのルートディレクトリ)
$ vi spec.watchr
watch('app/(.*)\.rb') { |md| system("ruby script/spec spec/#{md[1]}_spec.rb") }
watch('spec/(.*)_spec\.rb') { |md| system("ruby script/spec #{md[0]}") }
$ watchr spec.watchr

autospecより汎用性があって便利かも。

追記

Rails3だとbundle exec rspecを使うのでこんな感じ?


watch('app/(.*)\.rb') { |md| system("bundle exec rspec spec/#{md[1]}_spec.rb") }
watch('(lib/.*)\.rb') { |md| system("bundle exec rspec spec/#{md[1]}_spec.rb") }
watch('(spec/.*)_spec\.rb') { |md| system("bundle exec rspec #{md[0]}") }

MeCabをhomebrewでインストールする

brew install mecab
brew install mecab-ipadic

MacPortsでインストールするとmecabrcに書かれているdicdirを書き換える必要があったりするけど、homebrewでインストールした場合にはその必要はない。


Moduleでextend self

なるほどなーと思ったのでメモ。

Moduleのクラスメソッドを作りたいとき、次のような方法もある。

module Foo
  extend self

  def some_method
    puts "Hello!"
  end
end

実行すると次のようになる。

irb> Foo.some_method
#=> Hello!

module_methodだと取りこぼしがあり得るのでこの方法なら安心。 もしプライベートメソッドを作りたければprivateを付ければいい(これは結構いい)。 関数的な処理をまとめるだけでSingletonパターンを使うほどではないっていうときにきっと便利。

聞きかじったことをメモしてるだけなのでクラスでincludeしたらどうなるのかは気になるところだけど、多分インスタンスメソッドとしてもsome_methodが使えるんだろうな。


ファイルの更新を検知してコマンドを実行するRubyスクリプト

lessとかautospecとかはファイルの更新を検知してコマンドを実行してくれるけど、それっぽいのを任意のファイルとコマンドについてやりたくなったのでRubyで書いてみた。

コマンド名は適当にjamieとする(誰かすでに書いてあるだろうものに名前をつけるのもおこがましいけど)。次のような感じで使う:

$ jamie
Usage: jamie file command
$ jamie ~/.zsh_history "echo 'こんにちは!こんにちは!'"

やっつけでつくったのでクオリティとかは気にしない。

追記 (2010-11-12)

動機は、autospecだとそのときテストしていたspecファイルが通ったら自動で全部のspecファイルをテストするので、バッチ処理などの独立性の高いスクリプトを書いてるときにちょっとウザったかったこと。なので指定した一つのspecファイルを継続的にテストしてくれる仕組みが欲しかった。

で、思わぬ副作用として得られたのが、テスト対象のspecファイルが文法エラーなどで例外を吐いてもこのスクリプトだとループの処理自体は止まらない。autospecだと止まってしまっていたので、全体のテストの実行時間が長い現状ではなかなか辛いものがあった。


Gitで無視するファイルを設定する

gitの操作(addやstatus)で特定のファイルを無視するには、リポジトリのルートディレクトリに.gitignoreファイルを設定すればよい。

ただし以下の点に注意。

  • .gitignore自体をadd/commitしないと効果は現れない
  • 一度commitしたファイルはあとから無視設定をしても効果がない(一旦リポジトリから削除する必要がある)(gitignoreでハマる

以下、自分の設定内容をメモっておく。

Xcodeで作成したプロジェクト

*.DS_Store
profile
build/*
*.pbxuser
*.mode1v3

buildディレクトリ以下の更新内容は無視して構わない(と以前どこかで読んだ)。あとはnib/xib以下にできるバックアップファイルとか、Finderの設定ファイルとか。

Stack Overflowにもいろいろな例があがっている(そこからgistを作った人もいる)。

Rails

Railsアプリをgitで管理するときのやり方を参考にするとよさそう。