Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ruby

mオプションでRailsプロジェクトの生成テンプレートを使う

「-m」はrails newの際、gist等々に放り込んだレシピに従ってあれこれしてくれるオプションです。 こんな感じで使います。*1 $ rails project_name -m <https://gist.github.com/banker/219223/raw/>生テキストでないと読み込まないので注意してください。 できること テンプレートの記述にはUNIX系コマン</https://gist.github.com/banker/219223/raw/>…

Railsをデーモンで動かす

Railsアプリはデーモンとして起動する事ができます。 やり方は簡単で $ rails s -dと、オプションを一個つけるだけ。とはいえ、これだけだとデーモンらしく動かすのは至難の技なので mirasrael/daemons-rails · GitHub や resque/resque at 1-x-stable · Git…

railsでActiveRecordを使いたくない場合

RailsはデフォルトでActiveRecordというORMがついてます。 ただ、軽い個人的プロジェクトで使うような場合などです。 また、Mongoidを使いたい場合はそもそも取り除く必要があったりします。今回はそういった場合の対処法です。 方法 rails new myapp --skip…

String#end_with?とString#start_with?が地味に便利

Stringクラスには、文字列を含むか否かを判定するinclude?メソッドがあります。 "hoge.html".include?('.html') #=> true 正規表現を渡すことができないので、先頭や末尾一致には使えないなーなどと思っていたのですが… ありました。String#end_with?とStrin…

RubyでSHA1やMD5のようなハッシュ値生成する

前の記事ではコマンドでハッシュ値を生成する方法を紹介しましたが、 Rubyにもそういう方法があります。 Digest::MD5.hexdigest('shuzo_kino') => "ee8d178973ee4f7a39debb9cd63ce336" MD5は手っ取り早くファイル情報を暗号化したい場合に有効です。 非可逆…

「BasicObject#!=」は実装上、「BasicObject#==」を否定した結果を返す

「BasicObject#!=」は実装上、「BasicObject#==」を否定した結果を返します。公式をみると、 デフォルトでは self == other を評価した後に結果を論理否定して返します。 このため、サブクラスで BasicObject#== を再定義しても != とは自動的に整合性が と…

配列の全組み合わせを生成する

comninationは配列の組み合わせを列記してくれるメソッドです。 ary #=> [1, 10, 100, 2, 43] ary.combination(3).each{|i| p i} # [1, 10, 100] # [1, 10, 2] # [1, 10, 43] # [1, 100, 2] # [1, 100, 43] # [1, 2, 43] # [10, 100, 2] # [10, 100, 43] # […

単語境界にマッチさせる場合、(?!\w)と書く方法もある。

正規表現で単語境界にマッチさせる場合、 以前扱った\bや$以外にも別の方法があります。数値の文字列を三桁区切りする正規表現で考えると "123456".gsub(/(?<=\d)(?=(\d\d\d)+\b)/, ",") => "123,456" は "123456".gsub(/(?<=\d)(?=(\d\d\d)+(?!\d))/, ",") …

instance_execとprocを使って、微妙に似ているメソッドチェインを簡略化して書く

今回のネタは完全に趣味の領域なので…おそらく実用性皆無です。instance_execとprocを使って、微妙に似ているメソッドチェインを簡略化して書く事ができます。たとえば…次のような実用性ゼロの似たメソッドチェインがあるとします。 "s".upcase.next.downcas…

キーワード引数を使って初期値設定で楽をする

今まで良く理解せずに使っていたのですが…Ruby2.0以上から導入されたキーワード引数は相当強化されていたようです。例えば、 def comment( date: TIme.now, msg, user: "UNKNOWN") #{user} said: #{msg} [date] end と書くと、本体で一々初期値を使うための…

内部変数の数がジゴクめいたものになる場合、専用のクラスを設計して振り分けた方が幸せになれるかもしれない

次のような、何やらジゴクめいた数の内部変数を持ったクラスメソッドがあったとします。 class Hoge def set_unit_price(val, power, speed, mp) special_param = power * speed * val magic_param = mp * speed * 13 if val > 10 unit_price = special_para…

caseやif-elseで実行コードを分配するような実装をしている時は素直に異なるメソッドとして分割してみる

個人的によくやりがちな実装法なのでメモ。メソッドにパラメータを渡し、case文やif-else文で実行コードを分岐させるような実装は、 以下のよな手順でリファクタリングできます。 例 class TestClass def self.create_member(type) case type when :admin Ad…

\bは単語境界にマッチする…じゃあ単語境界って何よ? というお話

正規表現におけるアンカーの一つ、\bは単語の境界にマッチします。 単語の両端を括れば、前後に余計な文字が入っているものを除外できます。 /foobar/.match("foobarii") #=> #<MatchData "foobar"> /\bfoobar\b/.match("foobarii") #=> nil ・・・では、この単語の境界ってナン</matchdata>…

正規表現で「*(0個以上)」や「?(0または1個)」を使うときに気をつける事

正規表現で0個以上系の量指定を使うときにはちょいと注意が必要です。 基本、*はゼロ個以上 ""io899hoge".match /(\d*)hoge/ #=> #<MatchData "899hoge" 1:"899"> ?は0または1個のマッチに対応します。 "io899hoge".match /(\d?)hoge/ #=> #<MatchData "9hoge" 1:"9"> ところが・・・ 例えば「iohoge」という文</matchdata></matchdata>…

instance_evalで似たメソッドをまとめる

instance_evalにブロックとしてメソッドをわたすと、上から順繰りに実行して あたかもメソッドチェインかのように振舞います。ただし、連続して実行するだけなので "1234-5678-9123-4567".instance_exec do sub(/\d+/,'*' * 4) sub(/\d+/,'*' * 4) sub(/\d+/…

正規表現の肯定先読みを使うと、末尾だけ対象外…といった挙動を実現できる

前の記事の続きです。 肯定前方読みという、やや特殊な正規表現の記法を使うと「最後だけ除く」といった If文が必要となりそうな話も一行で書く事ができます。 たとえばクレジットカードの認証なんかで良くある、「末尾4桁だけは表示する」ような仕組みの場…

文字列をN文字まで切り詰める

考えてみれば当たり前なのですが 文字列を配列を見立てれば、番号指定で切り詰める事ができます。 "hogefugapiyo"[0..5] #=> "hogefu" 日本語もこの通り。 "今日は晴れ"[0..3] #=> "今日は晴" 入力はN文字まで! なんてケースでも、一々正規表現で拾いに行か…

Active_supportのString#squishで邪魔な改行文字や空白を綺麗にする

Active_supportのString#squishで邪魔な改行文字や空白を綺麗にできます。つまり、これが puts "\n HOGE \r\n fuga" # HOGE # fuga こうなります。 puts "\n HOGE \r\n fuga".squish #HOGE fuga 実装上の話 もちろん、正規表現なんかでもいけます 実際、実装…

in_groups_ofで配列を指定個数毎に切り分ける

in_groups_ofは配列を指定個数ごとに切り分けてくれるメソッドです (1..10).to_a.in_groups_of(3) #=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, nil, nil]] 空白を任意の値で埋める事もできます (1..10).to_a.in_groups_of(3,42) #=> [[1, 2, 3], [4, 5, 6],…

Active_support提供のEnumerable#sumで合算時に楽をする

Active_support提供のEnumerable#sumで合算時に楽をできるメソッドです 使い方 [1,2,3].sum #=> 6 (1..100).sum #=> 5050 ブロックを渡して、ちょっと入り組んだ合算をやる事も可能です。 下の例では、各要素の二倍を合算する例を挙げています。 (1..2).sum …

Object#dupでオブジェクトのコピーをつくる

Object#dupとObject#cloneはオブジェクトをコピーします obj = ["a","b","c"] #=> ["a", "b", "c"] obj_d = obj.dup => ["a", "b", "c"] obj_d[0] << "PLUS" => "aPLUS" obj => ["aPLUS", "b", "c"] obj_d => ["aPLUS", "b", "c"] obj[1] = "HOGE" => "HOGE"…

Enumerable#flat_mapで多重配列が返ってきそうな処理もシンプルにできる

Enumerable#flat_mapは各要素をブロックに渡し、その返り値を連結した配列を返すメソッドです。 通常のmapなら ['ab','cd','ef'].map(&:chars) #=> [["a", "b"], ["c", "d"], ["e", "f"]] となるところを、 ['ab','cd','ef'].flat_map(&:chars) #=> ["a", "b…

Rubyでも文字列クラス使って正規表現を楽に書く

ちょっと前にやったPOSIX 文字クラスですが、これらはRubyでも活用できます。 [:alnum:] 英数字 (Letter | Mark | Decimal_Number) [:alpha:] 英字 (Letter | Mark) [:ascii:] ASCIIに含まれる文字 (0000 - 007F) [:blank:] スペースとタブ (Space_Separator…

countで条件に一致する文字(or要素)の個数を数え上げる

countは、条件に一致する文字(or要素)の個数を数え上げるメソッドです。 Stringや "Si Vis Pacem, Para Bellum".count("A-Z") #=> 5 引数は複数指定できますがAND条件なので注意して下さい。 "Si Vis Pacem, Para Bellum".count("A-Z","i") #=> 0 少し複雑…

Array#sampleをつかって配列からランダムに要素を引っ張り出す

Array#sampleは、配列からランダムに要素を引っ張り出すメソッドです。 実は以前の記事でちょっと触れたのですが、理解が深まったのでメモ。 用途 何もつけなければ、一個の要素をランダムに抽出します。 (1..99).to_a.sample #=> 36 (1..99).to_a.sample #=…

String#splitの小ネタ集

文字列を配列として切り分けるsplitメソッドですが、 引数を工夫する事でロジック簡略化に貢献することができます。 正規表現を使う 第一引数には、文字列以外にも正規表現を使う事ができます。 "hoge 123 Jaga 太郎".split(/\s*/) => ["h", "o", "g", "e", …

Rubyにおけるレアケースfor文による繰り返し表現について

コードリーディング中に久々にforを見かけたのでメモします。Rubyにもfor文による繰り返し表現があります。 たとえば、多重配列を弄るには以下のようにします。 for first, second, third in [[1,2,3],[4,5,6],[7,8,9]] puts first, second, third end これ…

Rangeを使う際に便利なメソッド

Rangeを使う際に便利なメソッド集です。 最初と最後を取る (1..9).first #=> 1 (1..9).last #=> 9 長さを取る (6..9).size #=> 4 含まれているか調べる 似たメソッドですが、比較手法が違います。 coverは、include?は ===です。 後者はcaseで活用されます。…

数値のsizeをとると実装上のバイト数が返ってくる

数値のsizeをとると、実装上のバイト数が返ってきます。 2056.size #=> 8 0x100_000_000_000_000_000.size #=> 9 0x1_000_000_000_000_000_000.size #=> 10 誤爆して「8」とだけ出たので何事かと思いましたが・・・ displayといい、時折用途がよくわからな…

String#scanをつかってルイズコピペから「ルイズ」出現回数を抽出する

Stringにはscanというフレーズ抽出メソッドが備わっています。 一致条件には正規表現を使う事ができるため、数値だけ…みたいな用途にも使えます。 結果は配列で帰ってくるので便利です。 配列に切り分けてからブロックでGrepとか芋臭いことしなくて良いんだ…