読者です 読者をやめる 読者になる 読者になる

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 多重…

Gestopft, Framework for CLI Application

Gestopftというライブラリを公開しました。 aereal/gestopft · GitHub gestopft | RubyGems.org | your community gem host gem install gestopft でインストールできます。 なんて読むの? ゲシュトップ、でいいとおもいます。GetOptっぽいもの、って考え末…

and/or 演算子

x = "hoge" && puts x # -> SyntaxError y = "fuga" and puts y # -> "fuga" && は優先度が高くて、前者のコードは x = ("hoge" && puts) x と解釈されてしまう。and は優先度が低いので、後者のコードは (y = "fuga") and (puts y) と解釈される。

RSpecの書き方がつかめてきた

describe Person do subject do Person.new( :family_name => "Aoki", :given_name => "Hanae", :age => 20 ) end it "#name is his name." do subject.name.should == "Aoki Hanae" end context "who became a adult" do it "#adult? is true" do subject.a…

tig.rbでURLを含む内容を投稿できない問題を解決する

tig.rb: failed to post urls · dc9eb08 · cho45/net-irc · GitHub このコミットで解決しています。 git pull しましょう。 tig.rbはURLが内容に含まれているときにbit.lyで短縮する、という機能がついていて、APIキーをオプションで渡さないとデフォルトで…

PerlのApp::CLIみたいなやつ

class MyApp < App::CLI::Dispatcher options :verbose, :debug def install(pkg_name) # ... end def uninstall(pkg_name) # ... end def mysubcmd(*args) Class.new(App::CLI::Dispatcher) { def subsub # ... end }.run(args) end private def my_helper …

RSpec2

${PROJ_ROOT}/spec/spec.opts -> ${PROJ_ROOT}/.rspec || ${HOME}/.rspec autotest を走らせるとき ${PROJ_ROOT}/.rspec があると RSpec2 でテストする。 spec -> rspec spec --f[ormat] s[pecdoc] -> rspec --format d[ocumentation] # ~/.autotest Autotes…

Termtterを自前でビルドする

TermtterがRSpec 1.xに依存しており、さらにRSpec 1.xと2.xで大幅に設計が変わったらしく互換性が失われている。なので、まずRSpec 1.xをインストール。 $ gem search rspec -ar ::: rspec (2.4.0, 2.3.0, 2.2.0, 2.1.0, 2.0.1, 2.0.0, 1.3.1, 1.3.0, 1.2.9,…

Re: Rubyはトップレベルで宣言したメソッドがインスタンスメソッドになる

Rubyはトップレベルで宣言したメソッドがインスタンスメソッドになる(追記:と思ったのは気のせいかも...。) (Kanasansoft Web Lab.) 実際に実行してみるとわかりますが、 "hello".f などは NoMethodError が出るはずです。トップレベルで定義されたメソッド…

常に空ではない最小のインデックスへ要素を追加するリスト

GNU Screenのウィンドウの追加/削除を実装したつもり。

ごく簡単なバリデータを書く

コマンドラインツールのオプションは極端に省略されていて、可読性に欠けている面があったりする。(また他のツールと一貫性のない略語が使われていたりするので、なおさらタチが悪い)Rubyでそういったコマンドラインツールのラッパをメソッドで実装しよう…

tig.rbで投稿するときに常に「幼馴染と一緒に」をつける

*** tig.rb.old 2010-10-17 23:34:59.817551695 +0900 --- tig.rb 2010-10-17 23:37:49.842437369 +0900 *************** *** 739,744 **** --- 739,745 ---- mesg = escape_http_urls(mesg) mesg = @opts.unuify ? unuify(mesg) : bitlify(mesg) + mesg = o…

連想配列のソート

キーに文字列、値に数値をもつ連想配列 hashmap について考える 対応する数値でキーを降順にソートした配列を返す関数 sort_hashmap を定義する def sort_hashmap(hashmap) hashmap.sort_by {|(k, v)| v }.map {|(k, v)| k } end hashmap = {&#39;VimL&#39; …

screen の backtick であれこれ

# $HOME/.screenrc hardstatus alwayslastline "[%02c] %-w %{.r.}%{!}%n%f%t%{dd} %+w %= %0`" backtick 0 0 0 ${HOME}/.screen/backtick.rb #!/usr/bin/env ruby # $HOME/.screen/backtick.rb require "logger" require "open-uri" class Backtick def sel…

Module#define_methodで魔術

klass = Class.new klass.send(:define_method, &#39;!@#$&#39;) { puts &#39;Can you catch me?&#39; } puts klass.instance_methods - Class.instance_methods # -> ["!@\#$"] klass.new.!@#$ # もちろんだめ klass.new.&#39;!@#$&#39; # もちろんだめ Obj…

Skypeの通知をnotify-osdにまわす

Skypeにはイベント(コンタクトがオンラインになるだとか、ファイル送信のリクエストが飛んできたりだとか)毎に通知を出したり、音声を流したりする機能がある。この機能の中に、イベントに応じてコマンドを実行する機能がある。また、イベントによっては変…

無名関数を引数にとる関数

#!/usr/bin/perl use strict; use warnings; use feature qw( say ); sub hoge(&) { my ($func) = @_; $func->(); } hoge { say &#39;call from anonymous function!&#39; } Perlを書きはじめている。なにもかもがわからない(なにがわからないのかすら、わ…

システムにあるコマンドがインストールされているかどうか

FileUtils とか探したけど見当たらなかったので。 module Kernel def installed?(cmd) FileTest.executable?(`which #{cmd}`.strip) end end String#strip が肝。 irb で出力確認したら末尾に \n がついていたので、取り除かないと true が返らない、はず。

Enumerable#grep を使うときに Regexp.last_match をさわりたい

うまいタイトルが思い付かない。Ruby は $~ や Regexp.last_match などで、カレントスコープで実行した最後の正規表現マッチの結果を得ることができる。 /(.)(.)/ === &#39;abcdef&#39; puts $1 # => a puts $2 # => b こんな風に。ところで、 Ruby には Enu…

return と ensure 節

Rubyのensureはreturnを撤回できる - Hello, world! - s21gこれを見て気になったので試した。 def yuno true ensure false end def miyako return true ensure return false end def hiro return true ensure false end def sae true ensure return false en…

声優の新谷良子さんへの愛を叫ぶ

TaniRyoko = "谷良子" def new(syntanix, shout=nil) if shout puts "#{shout}! 新#{syntanix}, #{shout}!!!" else puts "New #{syntanix} って…100万回も言われてます。もうあきましたっ!!ばーかばーか。" end end new TaniRyoko, "もげええええええ" # => …