ruby

ikm-opengraph.gemをリリースしてみた

リリースしてみた。初gem。forkだけど。 opengraphという、HTMLのヘッダに埋め込まれたOGPの情報を抜き出すgemがあるんだけど、内部で使用しているRESTClientがUTF-8固定で処理をするためにそれ以外のエンコーディングだと文字化けしてしまうという問題があ…

Rack::Profilerを使う

Rack::Profilerを使うのに少し躓いたのでメモ。 Gemfile: gem "ruby-prof" gem "rack-contrib", :require => "rack/contrib" app.rbのconfigureブロックあたり: require "rack/contrib/profiler" Rack::RubyProf = RubyProf use Rack::Profiler Rack::RubyPr…

RestClientの返り値はStringとちょっと違う

インターフェースが簡潔で使いやすいRestClientだけれども、各種HTTPメソッドの返り値をto_iするとステータスコードを返すみたいだ。 たとえば次のようなSinatraアプリが起動していたとする。 get '/' do "1" end このgetルーティングに対してRestClientでア…

Object#presenceが便利

ActiveSupport 2.3で導入されたObject#presenceが便利。 たとえば、 time = options[:timestamp].presence || Time.now で初期値の代入に使えるし、 time = options[:timestamp].presence && Time.at(options[:timestamp]) で値がある場合に限って加工に使え…

Mongoid/MongoDBでauto increment

Auto Increment with MongoDBより、Mongoid/MongoDBでMySQLのauto incrementみたいなことをする方法。 連番を保持するためのCollectionを用意して、新しくDocumentを作る際にそれをfind_and_modifyで1増加させるという方法をとる。 find_and_modifyを使うの…

yard-sinatraでSinatraのドキュメントにYARDを使う

yardのプラグインであるyard-sinatraを使うとSinatraのアクションごとに記述されたyardocからHTMLドキュメントを生成できる。 インストールと設定 yard-sinatraをインストールすれば必要に応じてyardもインストールされる。 ただしyardはデフォルトではプラ…

µ-optparseを使って.rvmrcを生成

optparseのラッパーであるµ-optparseを使って.rvmrcを生成するスクリプトを書いてみた。 オプションは下記の通り。--helpでも見れるし、コードを読むだけでもわかりやすい。 -r, --ruby : Rubyのバージョン。デフォルトはこのスクリプトを実行しているRuby -…

RubyKaigi2011(二日目)に参加してきた

今日も午後から参加してきた。@a_matsudaさん、@yharaさんの話が聞けなくて、寝坊してしまったことを激しく後悔している。 5 years know-how of RSpec driven Rails app. development. / @moro 最近のrspecやfixture-replacementを使ったテストの書き方のノ…

RubyKaigi2011(初日)に参加してきた

午後から参加してきた。 とりあえず箇条書きのメモを載せておく。あとで感想を書こう。 Ruby を利用した大規模ウェブサービスの開発・運用 / @hotchpotch cookpadの中の話。extensionsがとても興味深かった。 この後のgithubとかもそうなんだけど、テスト=C…

geminaboxでローカルにgemをホストする

geminaboxを使ってローカルにgemをホストしてみる。 (とりあえずでやってみただけなので、手順等にミスがあるかも) まずはサーバを立てる rvmとpowが入っている前提で。 ~/var/geminabox 以下を使うとする。 $ rvm use 1.8.7@geminabox --create $ gem ins…

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

メモ。 gem install rubygems-update -v update_rubygems バージョンの一覧はrubygems.orgなどで確認するとよい。

4/20のTokyo Rubyist Meetupに行ってきた

4/20のTokyo Rubyist Meetup - After the Earthquakeに行ってきた。Twitterのハッシュタグは#trbmeetup (あとで書く)

__FILE__と$0

FILE はそのコードが書かれているファイルを指し、$0は起動されたスクリプトを指す。 「FILE は実行中のプログラムのファイル名」が詳しい。 先程の記事に載せたgistではこれを利用してサンプルプログラムを末尾に記述している。

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

githubをうろうろしていたら「なるほど」と思ったコードを見つけたのでメモっておく。 get-twitter-oauth-token / bin / get-twitter-oauth-token (gistじゃないので残念ながら埋め込むことができない。コピペするのも微妙なのでリンクだけ提示しておく) …

MechanizeをMac OSXにインストール

MechanizeはNokogiriに依存しており、Nokogiriはlibxml2とlibxsltに依存している。 libxml2はhomebrewで提供されているのでそれを利用し、libxsltはソースから入れる。 $ brew install libxml2 # libxml2 v2.7.7 $ wget ftp://xmlsoft.org/libxml2/libxslt-1…

RMagickで枠線を付ける

RMagickを使って画像に枠線を付ける方法。 require 'rubygems' require 'RMagick' input = "/path/to/input" # 元画像 output = "/path/to/output" # 書き出し先 thick = 10 # 枠線の太さ color = "black" image = Magick::ImageList.new(input) # 上下左右…

RSpec 1.3でカスタムマッチャ

ある処理で行われるファイルの移動が適切かどうかテストしたかったので、カスタムマッチャを作ってみた。使用したのはRSpec 1.3.1。 目標のspec lambda { foo }.should move_file(src, dest) チェックする項目 fooメソッドを実行する前にsrcにファイルが存在…

watchrでautospecみたいなこと

watchrで更新のあったファイルに対してrspecを実行する方法。 secondlifeさんの記事を読んで、取り急ぎやってみた。 $ gem install watchr $ gem install ruby-fsevent # Mac OSXの場合 $ gem install rev # Linux/*BSDの場合 $ cd (RAILSアプリのルートデ…

Rubyでクロージャ

こうやればいいのか。 def gen x = 0; return lambda { puts x x += 1 } end y1 = gen y1.call #=> 0 y1.call #=> 1 y2 = gen y2.call #=> 0 y1.call #=> 2

jQuery.extend

WEB+DB Press No.60のjQueryに関する記事がとても面白かった。で、jQueryで提供されているextendの使い方を今になって理解してきたのでメモっておく。 jQuery.extendはRubyでいうところのHash#merge!だった。 var foo = { a: 1 } jQuery.extend(foo, { b: 2 …

homebrewとrvmをセットアップするスクリプト

Macbook ProとMacbook Airでちまちまと同じ環境を用意するのが面倒になったので、最初の処理をまとめたスクリプトを書いてDropboxで共有するようにした。 see https://gist.github.com/728353 個々のgemに関してはbundlerを使ってGemfile(.lock)やプロジェク…

Moduleでextend self

なるほどなーと思ったのでメモ。 Moduleのクラスメソッドを作りたいとき、次のような方法もある。 module Foo extend self def some_method puts "Hello!" end end 実行すると次のようになる。 irb> Foo.some_method #=> Hello! module_methodだと取りこぼし…

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

lessとかautospecとかはファイルの更新を検知してコマンドを実行してくれるけど、それっぽいのを任意のファイルとコマンドについてやりたくなったのでRubyで書いてみた。 コマンド名は適当にjamieとする(誰かすでに書いてあるだろうものに名前をつけるのも…

Shibuya.rbに行ってきた

ECナビさんのバーAJITOで行われた第1回Shibuya.rbに行ってきた。 LT的なものの内容を覚えている限り書き出してみる。 渋谷.rbとか東京Ruby会議04とか お手伝いしてくれる人募集中 Azabu.gem 毎週水曜の19:30-21:30 DSLの話 DSLを使ってスライドを作る Excel…

ActiveSupport::Concern

以前書いたモジュールの特異メソッドをincludeして使うと同じことが、ActiveSupport::Concernを使うことでもうちょっと綺麗に書ける。 module A extend ActiveSupport::Concern included do # Aがincludeされた際に、includeしたクラスのコンテキストで実行…

ActiveModel::Callbacks

ActiveModel::Callbacksを使えばafter_saveなどのコールバックを手軽に実装できる。 まずActiveRecord::Baseのような抽象クラスを次のように定義する。 class AbstractModel extend ActiveModel::Callbacks define_model_callbacks :save def save _run_save…

オブジェクトをbooleanとして評価

rubyでオブジェクトをbooleanとして評価した値を得たい場合、次のようにすれば良い。 !!object !objectで反転した真偽値が得られるので、さらに!で反転することでobjectをbooleanとして評価している。

rvmふたたび

ruby 1.9.2が出たのでrvmを入れ直して整理した。 $ gem install --user-install rvm $ PATH=$HOME/.gem/bin:$PATH $ rvm-install $ vi ~/.zshrc # ~/.gem/binをパスに追加、rvmの初期化コードを追加 $ exit 1.9.2と1.8.7をインストールする。 ただしMacPorts…

MeCabをrubyから使ってみる

インストール まずMacPortsで本体と辞書を入れて読み込む辞書を設定する。 $ sudo port install mecab $ sudo port install mecab-ipadic-utf8 $ sudo vi /opt/local/etc/mecabrc # 編集内容は下記を参照 mecabrcは次のように書き換える。 dicdir = /opt/loc…

モジュールでnamed_scopeを追加

モデルの機能ごとにモジュールにまとめてあとからまとめてincludeしたいというときに、どうせならその機能のために用意したちょっと複雑なnamed_scopeも同じように外に出してしまいたい。 そんな場合にはincludedとclass_evalを使う。 class Message ActiveR…

テスト用oauth_callback

oauth gem(0.4.0)のoauth_callbackでちょっとはまったのでメモ。 [ruby 1="OAuth" 2="を使ってみる実験" language="で"]/rubyを参考に、Twitterに登録しているコールバックURLとは別にテスト用のURL(が使いたかったので、いろいろ試してみた結果、次で動い…

コマンドラインからWEBrickを起動

一時的に任意のディレクトリをHTTPサーバに公開したくなったので、WEBrickを起動するスクリプトを組んでみた。既存のものがある気がしなくはないけど、OptionParserの勉強という意味も含めて。 #!/usr/bin/env ruby require 'optparse' require 'webrick' in…

名前空間付き定数対応のObject.cost_set

Object.const_getをハックした話 を参考に、Object.const_setもモジュールによる名前空間付き定数に対応させてみた。車輪の再発明をした気がしなくはないけど、そこは気にしない。 class Object def self.nested_const_get(name) stack = (name.is_a?(Array)…

非同期処理にはWorkling

Ajaxで非同期に処理をキックして、一定間隔でその進捗を確認して…というのを書く必要があったのでBackgrounDRbを試してみたら、どうも使いにくかった。理由としては、 MetaWorkerのサブクラスでワーカを実装したのに、MiddleMan.workerで呼び出したときにはR…

rvm

基本はasakusa.rbによる記事を見ればok。 デフォルトのバージョンを指定する useサブコマンドに--defaultオプションを付ける。 rvm use 1.8.7 --default gemsetを使う rvm use 1.8.7 rvm gemset create rails222 rvm use 1.8.7%rails222 gem install rails -…

Machinist+DatasetでFixture代替

概要 Machinistは定義された条件下でテストデータを生成するプラグイン・gem。 DatasetはRubyのコードで記述したテストデータをDBに読み込むプラグイン・gem。 この2つを組み合わせることで(比較的)メンテナンスのしやすいfixtureの代替を構築することが可…

jrubyでrails

jrubyでrailsを動かす際の、導入手順のメモ。DBはMySQL。 sudo port install jruby vi ~/.zshrc > export JRUBY_HOME=/opt/local/share/java/jruby source ~/.zshrc sudo jgem install rails # JDBC用のドライバをインストール # 詳しくは http://jruby-extr…

.irbrcでirbを便利に

~/.irbrcに、irbを起動したときに読み込むスクリプトを記述できる。さらにこの設定はRailsのscript/consoleでも有効になる。詳しくはirbとscript/consoleの超便利なTipsなどを参照。 というわけで、自分の今の設定をメモしておく。 require 'rubygems' requi…

モジュールの特異メソッドをincludeして使う(修正)

以前の記事が恐ろしく分かりにくいので、軽くまとめ直す。 module A def instance_method_of_a puts "A#instance_method_of_a was called." end module ClassMethods # A::ClassMethodsで定義されたインスタンスメソッドは、 # Aをincludeしたクラスのクラス…

モジュールの特異メソッドをincludeして使えるようにする

次のようなFooモジュールの特異メソッドbarをBazモジュールに特異メソッドとして使えるようにしたい場合、BazでFooをincludeするだけでは不十分。これは、includeによって追加されるのが、Fooのインスタンスメソッドのみだから。 module Foo def bar puts "b…

Ruby:Hashの値でソートしたArray

Ruby 1.8.7で。 hash.map { |k, v| { :name => k, :count => v } }.sort { |a, b| b[:count] a[:count] }

Growlでautospecの結果を表示

Growlの準備 Growlをインストール インストーラと一緒に入っているExtra/growlnotify/install.shを実行する autotest + growl で楽々テストを参考に、Growlが「受信される通知を聞く」、「リモートアプリケーション登録を許可」するように環境設定パネルから…