ruby

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, "もげええええええ" # => …

Rubyでノーム・ソート

ノームソート - Wikipedia def gnome_sort(array, i=1) if i < array.size if array[i - 1] >= array[i] array[i - 1], array[i] = array[i], array[i - 1] i = i > 1 ? i - 1 : i + 1 else i = i + 1 end gnome_sort(array, i) else array end end returnを…

整数を英語へ変換

class Integer def english_name(delimiter=&#39;-&#39;) if self < 20 english_table[self] else ret = english_table[(self / 10) * 10] (self % 10) == 0 ? ret : ret + delimiter.to_s + english_table[self % 10] end end private def english_table { …

Enumerable#sort_by.reverse

hash = {:a => 30, :b => 50, :c => 40, :d => 20} hash.sort_by {|k, v| v }.reverse キーを単語、値を単語の出現回数とするハッシュをつくっていじくりまわしたりすることがある。そして出現回数でソートして Array#reverse で昇順に、ということをやるこ…

Rakeをつかって快適にBDD

ある程度の規模のプログラムを Ruby で書こうとおもうと、RSpec による BDD (Behavior Driven Development) は大事なんだな、っていうのがなんとなくわかってきた。 ディレクトリ構成やファイル構成はほぼ機械的に決まるので、じゃあ自動化しましょう、とい…

FileUtils#.mkpath と Pathname#mkpath の挙動

$ irb > require &#39;pathname&#39; => true > Pathname.new(&#39;~/tmp&#39;).expand_path.mkpath => nil mkpathFileUtils.mkpath(self.to_s) と同じです。 [SEE_ALSO] FileUtils.#mkpath class Pathname [RETURN]list を返します。 module function FileU…

dotfilesをよしなに扱うRakefile

require &#39;rubygems&#39; require &#39;rake&#39; module Enumerable def like?(val, op = :===) any? {|i| i.__send__(op, val) } end end class String def expand File.expand_path(self) end def exist? File.exist?(self.expand) end end SOURCE_DIR…

あいまいなEnumerable#include?

module Enumerable def like?(val, op=:===) any? do |i| i.__send__(op, val) end end end pattern = [/\.$/, &#39;.git&#39;] pattern.include?(&#39;.&#39;) # -> false pattern.like?(&#39;.&#39;) # -> true コード例がすべて。Enumerable#include?はOb…

ruby 1.8.7で1.9のBasicObjectを再現したみたいとおもって、次のようなコードを書いて実行した。 Prototype = Object.clone p Prototype.instance_methods # -> ["inspect", "tap", "clone", ...] BASIC_METHODS = %w(== equal? ! != instance_eval instance…

オリジナルと同じインデックスに同じ要素が現れないソート

unsorted = (&#39;a&#39;..&#39;z&#39;).to_a.sort randomized = unsorted.sort_by {|i| (pos = rand(unsorted.size - 1)) == unsorted.index(i) ? pos + 1 : pos } unsorted.zip(randomized).all? {|(i, j)| i == j } # -> false 小文字のアルファベットが…

長さの単位を扱う

class Length YARD = { :barleycorn => ((1.0 / 3) / 12) / 3, :in => (1.0 / 3) / 12, :ft => 1.0 / 3, :yard => 1.0, :pole => 5.5, :chain => 5.5 * 4, :furlong => 5.5 * 4 * 10, :ml => 5.5 * 4 * 10 * 8, :league => 5.5 * 4 * 10 * 8 * 3, } METRIC =…