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はそのまま拝借した。これがあるだけでコマンドラインアプリがちょっと書きやすくなるんじゃないかと思う。
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要素を使うと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で更新のあったファイルに対して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]}") }
brew install mecab brew install mecab-ipadic
MacPortsでインストールするとmecabrcに書かれているdicdirを書き換える必要があったりするけど、homebrewでインストールした場合にはその必要はない。
なるほどなーと思ったのでメモ。
Moduleのクラスメソッドを作りたいとき、次のような方法もある。
module Foo
extend self
def some_method
puts "Hello!"
end
end
実行すると次のようになる。
irb> Foo.some_method #=> Hello!
module_methodだと取りこぼしがあり得るのでこの方法なら安心。 もしプライベートメソッドを作りたければprivateを付ければいい(これは結構いい)。 関数的な処理をまとめるだけでSingletonパターンを使うほどではないっていうときにきっと便利。
聞きかじったことをメモしてるだけなのでクラスでincludeしたらどうなるのかは気になるところだけど、多分インスタンスメソッドとしてもsome_methodが使えるんだろうな。
lessとかautospecとかはファイルの更新を検知してコマンドを実行してくれるけど、それっぽいのを任意のファイルとコマンドについてやりたくなったのでRubyで書いてみた。
コマンド名は適当にjamieとする(誰かすでに書いてあるだろうものに名前をつけるのもおこがましいけど)。次のような感じで使う:
$ jamie Usage: jamie file command $ jamie ~/.zsh_history "echo 'こんにちは!こんにちは!'"
やっつけでつくったのでクオリティとかは気にしない。
動機は、autospecだとそのときテストしていたspecファイルが通ったら自動で全部のspecファイルをテストするので、バッチ処理などの独立性の高いスクリプトを書いてるときにちょっとウザったかったこと。なので指定した一つのspecファイルを継続的にテストしてくれる仕組みが欲しかった。
で、思わぬ副作用として得られたのが、テスト対象のspecファイルが文法エラーなどで例外を吐いてもこのスクリプトだとループの処理自体は止まらない。autospecだと止まってしまっていたので、全体のテストの実行時間が長い現状ではなかなか辛いものがあった。
gitの操作(addやstatus)で特定のファイルを無視するには、リポジトリのルートディレクトリに.gitignoreファイルを設定すればよい。
ただし以下の点に注意。
以下、自分の設定内容をメモっておく。
*.DS_Store profile build/* *.pbxuser *.mode1v3
buildディレクトリ以下の更新内容は無視して構わない(と以前どこかで読んだ)。あとはnib/xib以下にできるバックアップファイルとか、Finderの設定ファイルとか。
Stack Overflowにもいろいろな例があがっている(そこからgistを作った人もいる)。
Railsアプリをgitで管理するときのやり方を参考にするとよさそう。