ruby

Ruby でメソッド内で定数を定義する方法

Ruby ではメソッド内で定数を定義することは通常できない。 例: def k K = 1 end # /Users/aereal/Dropbox/sketches/const.rb:2: dynamic constant assignment # K = 1 # ^ ちなみに dynamic constant assignment は「メソッドの定義内で定数を定義できない…

Module が要求する実装を宣言して、実際に要求を満たしているか検証する

タイトルにあることを Ruby でやる実装を書いた:aereal/module-requirement aereal/module-requirement · GitHubSwift / Objective-C の protocol は具象クラスがメソッドを実装していることを要求できるので、Ruby でも似たようなことをやってみる、という…

はてなブックマーク REST API のクライアントライブラリ in Ruby

aereal/hatena-bookmark-restful · GitHubJSON over HTTP な API であるのではたして「クライアントライブラリ」が必要なのか怪しい気もするけれど、手軽に API を利用しようと思ったときに生の Hash じゃなくてちゃんとオブジェクトが返ってくると嬉しいこ…

喫茶葦島の休業日を iCalendar 形式で出力する Web サービスを作った

葦島 定休日カレンダー aereal/ashijima-holidays-calendar · GitHub 喫茶葦島は不定休なので気が向いたときに行こうと思って休みだと悲しいので、いつも行く前にチェックするようにしているのだけれど、いい加減ばからしくなってきたのでカレンダーに入れる…

Pry で試行錯誤しながらスクリプトを書く

DB からレコードを引いてきて、その値をもとに HTTP API を叩くとか、そういったコードを書くこと機会はたくさんある。むずかしいことを一度にたくさん考えられないので、逐次、自分が正しい (= 意図した) 状態にあるか、ということを確認しないとこういう複…

Foreman で Test::mysqld のようにテスト用のデータベースを起動する

Test::mysqld とは Perl に Test::mysqld というモジュールがある。テストを実行するときに MySQL のインスタンスをよしなに起動してくれる。同じテストスイート (プロジェクト、リポジトリ) を並行して実行する場合、データベースの接続先は同じなので複数…

Sinatra + Sprockets で assets のテスト

config.ru に map "/assets" do run Sinatra::Application.sprockets end とか書いてもテストでは config.ru が暗黙のうちに読まれることはないのでマウントされず必ず 404 になる。テストで使う Rack アプリケーションのインスタンスを渡す際にも map すれ…

ActiveRecord::Tasks::DatabaseTasks のつかいかた

ActiveRecord には ActiveRecord::Tasks::DatabaseTasks というモジュールが定義されている。Rails の db:create などの Rake タスクは実質的にこのモジュールで定義されている create_current などのメソッドを呼び出している。ActiveRecord 単体でこれら A…

dotfiles を正しくインストールできるかテストする + Travis CI でビルドする

aereal/dotfiles · GitHubいわゆる dotfiles, シェルやエディタの設定の類を GitHub に置いてある。リポジトリ下にあるファイルを (ホームディレクトリに) インストールする Rake タスクを定義してあるのだけれど、このタスクが期待した動作をするかテストを…

Kyoto.rb でリファクタリングツール ambiguous.rb について話しました

リファクタリング // Speaker Deck曖昧な名前を発見してリファクタリングしたい→する - this A moment昨日ブログに書いた ambiguous.rb について Kyoto.rb で紹介しました。改めてご紹介すると、ambiguous.rb は異常に短かったりする変数やメソッドの名前を…

曖昧な名前を発見してリファクタリングしたい→する

意味の通らない名前 (a とか hoge) や、単語として意味はあるけれど曖昧さの残る名前 (begin とか) はリファクタリングを一考する余地があるよなあ、と考えている。効率よく発見したいけれど、名前の長さなどで一様に探せるものではないためむずかしい。そこ…

refe の Formula を書いてある

homebrew-aereal/refe.rb at master · aereal/homebrew-aereal · GitHub brew tap aereal/aereal brew install refe ご利用ください。

だいたいいつも入れるgem

bundler git-hub heroku padrino-gen pit pry Bundlerのおかげでグローバルにいろいろ入れなくて済むようになった。

Re:Excel列名変換問題で第2回社内プログラミングコンテストを開催してみた(前編)

Excel列名変換問題で第2回社内プログラミングコンテストを開催してみた(前編) - give IT a try Rubyで書いた。10分かからないくらい。 以下、コードを書く上での覚え書き。 単にアルファベットから1..26までの数値へ関連づける写像があればよさそう (#1) Ra…

はてなダイアリーのCSSを書くのにべんりそうなモックサーバ、Hatedをつくった

aereal/hated · GitHub 僕はCSSを書く上で、見通しのよい構造 (HTML) のアウトラインが不可欠だと考えていて、加えてSassみたいなアプローチが利用できるとなおよいと考えています。HTMLをアウトラインを見るのにいろいろべんりなツールはあるでしょうが、し…

padrino-sprocketsが "NameError: uninitialized constant Sprockets::Digest::VERSION" というエラーを吐く

Pull Request #2: I was getting an odd error when trying to load anything (check http://oi5 by dariocravero · nightsailer/padrino-sprockets · GitHub修正されたコミットを含むpull requestが出ているけどまだマージされてないので、使うときはdarioc…

kaminari.gemの依存関係を分離する

aereal/kaminari · GitHubfeature/separate-each-gemというブランチでRails (依存関係にはrailtiesが指定されているけどいっしょにrails.gemも入る) や特定のORMへの依存をそれぞれのgemへ分離する作業をしている。 Kaminari::Initializerというフックを叩く…

ActiveRecord (3.0.9) で group by を使いつつ will_paginate (3.0.pre4) でちゃんとページネーション

ActiveRecordは3.x系になってからQuery Interfaceというより抽象的にSQLを構築できるメソッド群が加えられた。groupはSQLのGROUP BY句を構築するメソッドで引数にグループ化する行を渡す。またcountは条件に該当する列の件数を数え上げる。ActiveRecord 3.x…

OS X LionでLLVMではなくGCCを使ってRubyをビルドする

いい加減RVMの行儀の悪さにうんざりしてきて、rbenv + ruby-buildに移行しようと思い立ったものの、cassandra_object.gem 0.6.0 preの組み合わせでCassandraObject::Persistence.multi_getを叩くと落ちる (bundle exec rails cがzsh.c: abortとか言う) ので…

RubyのリファレンスマニュアルをインストールするFormulaを書いた

るりまプロジェクトへはruby-lang.orgから辿れなくて、環境をセットアップするたびにどこだっけ、と右往左往して時間を浪費していたのでHomebrewのFormulaを書いた。 aereal's gist: 1287146 — Gist refeを入れておけばref.vimでサクサク引けてべんり。gemの…

Hash#fetch と Hash#[] その2

[] より fetch - 背中見せて少し笑う こんなエントリを書きましたが、しかし Hash#[] にもよいところはあって、もちろんあるインデックスへのアクセスとしてわかりやすい表記であることもそうですが、「値が偽値であるかどうか」をチェックできるということ…

[] より fetch

Array や Hash から要素を取得する度に nil チェックするのめんどくさいですね。 goddess = {perl: "Larry Wall", ruby: "Matsumoto Matz Yukihiro", python: "Guido van Rossum"} falled_php_god = goddess[:php].downcase # アッー! とりあえず同じクラス…

foo(&nil)

nil.respond_to? :to_proc # -> false [].map(&nil) # -> #<Enumerator: []:map> なんでEnumeratorがかえってくるんだ? としばし悩んだ。 def foo block_given? ? yield : puts("not given") end foo(&nil) # -> "not given" foo { puts "Hello" } # -> "Hello" つまりブロック引</enumerator:>…

Swafというswf_rubyのラッパを書いた

swaf | RubyGems.org | your community gem host aereal/swaf · GitHub swf_rubyという、SWFのバイナリを動的に書き換えるライブラリがあるのですが、インターフェースが少々低水準で再利用するときに冗長になりがちだったので、抽象化したインターフェース…

あたらしくGemをつくるときもBundlerで

% bundle gem mygem これで mygem というディレクトリが作られてその配下にいろいろつくられます。ちなみにかってにGitのリポジトリがつくられるので、Mercurialとかつかってる人やおれみたいにgit-flowをつかいたいよ、っていう人は rm -rf .git/ してから…

Rubyでコードを書くときのルール

モンキーパッチを適用するときは、必ずモジュールを書いてからそれをincludeさせるようにする class String def /(that) "#{self}/#{that}" end end こういうコードを書くのはイケてないという考え方。 module StringExtension def /(that) "#{self}/#{that}…

RSpec 2 + Growl + ZenTest で自動テスト

$ gem install autotest{,-growl} rspec $ echo 'require "autotest/growl"' >> ~/.autotest $ cd ${PROJ_ROOT} $ touch .rspec $ autotest -cv だいたいこんなかんじ

サブディレクトリを配下に持つディレクトリにシンボリックリンクを張るときに絶対パスと相対パスで挙動が変わる

$ cd $HOME $ ls src/ subdir/ $ ls src/subdir item $ mkdir dst && ls dst/ src/ $ ln -s src/subdir dst/ $ cd dst/subdir cd: no such file or directory: dst/subdir $ rm dst/subdir $ ln -s $HOME/src/subdir dst/ $ cd dst/subdir && ls item Vimの…

メッセージをGrowlに渡すだけのJabberクライアント

めでたくMacBook Proを購入して、Macユーザになったのですが、im.kayac.comの通知をうけとるのに使いもしないJabberクライアントを常駐させるのはかなりイヤンなかんじだったので、RubyでGrowlに渡すだけのスクリプトを書きました。書いた、というかid:cho45…

代入

*, a, b = [1,2,3,4] # a -> 3, b -> 4 *, c, * = [5,6,7] # -> SyntaxError *, (d, *) = [8,9,10] # d -> 10 括弧の有無で意味が変わる。たぶん括弧があるとこう解釈されてる。 *lhs1, lhs2 = [1,2,3] # lhs1 -> [1,2], lhs2 = 3 d, * = lhs2 # d -> 3 多重…