Bye Bye Moore

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

2014-11-01から1ヶ月間の記事一覧

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

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

【読書メモ】ロンドン貧乏物語

「ロンドン貧乏物語」はヴィクトリア時代の呼売商人(要はその日暮らしに近い零細商人)のお話を集めた本です。*1 今でいうところのノンフィクションにあたる内容で、「パックスブリタニカ」と呼ばれる黄金時代の英国における彼ら彼女らの姿を生々しく記録し…

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

次のような、何やらジゴクめいた数の内部変数を持ったクラスメソッドがあったとします。 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>…

Make Faire Tokyo 2014 レポート

Make Faire Tokyo 2014 レポート 毎年恒例のMake Faire Tokyo(MFT)、今年も行ってきました。 なんと、今回は東京ビッグサイトでの開催です! 異様にクオリティの高い展示 今回、個人的に気になったのは展示の魅せ方が上手いとこが多かったように感じます。…

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

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

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

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

救急車呼ぶか迷ったときは「救急相談センター」に電話してみても良いかも知れない

病気・ケガをしたけど意識がハッキリしていて救急車呼ぶほどでは・・・というケースでは 救急相談センターの利用がオススメです。 基本番号は「#7119」で、地区毎に個別番号があります受け付けているケースは 救急相談センターの主なサービス ○症状に基…

文字列を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#reverse_eachで逆回しのeachを使う

Enumerable#reverse_eachは逆回しのeachができるメソッドです。 [1,2,3].reverse_each {|i| puts i * 4} 12 8 4 #=> [1, 2, 3] reverseでメソッドチェインする時と違い、返ってくる配列はもとのままです。 [1,2,3].reverse.each {|i| puts i * 4} 12 8 4 => …

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…

Enumerator#rewindは要素を最初まで巻き戻す

Enumerator#rewindは要素を最初まで巻き戻すメソッドです。 ary = %w(a b c).each #=> #<Enumerator: ...> ary.next #=> "a" ary.next #=> "b" ary.rewind #=> #<Enumerator: ...> ary.next #=> "a" 同名のメソッドはFileクラスにも用意されており、これはファイルの先頭に戻るメソッドのようで</enumerator:></enumerator:>…

欧州の税関と郵便局は信用ならない(戒め)

立て続けにヤバさみ案件が続いたのでメモ。欧州の輸出入管理まわりと郵便局は信用ならないようです。 ネットで見ても、政府系の海外販路支援の先生方にしても先方の官僚機構は信用するなとの声がポツポツと。 なんでそんな話が出るのかなーなんて惚けていま…

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 少し複雑…

【読書メモ】戦争と広告

戦争と広告作者: 馬場マコト出版社/メーカー: 白水社発売日: 2010/09/18メディア: 単行本購入: 1人 クリック: 55回この商品を含むブログ (8件) を見る太平洋戦争時代の日本広告業にフォーカスした内容です。 プロジェクトX的な群像劇形式の冊子となっていま…

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とか芋臭いことしなくて良いんだ…

標準ライブラリ「set」で集合を扱う(その3)

Enumerable#to_setを使うと、既存のEnumerableインスタンスをsetクラスに変換する事ができます。 [{name: :shuzo, power: 10},{name: :vivit, power: 20}].to_set #=> #<Set: {{:name=>:shuzo, :power=>10}, {:name=>:vivit, :power=>20}}> ブロックを渡して加工する事もで</set:>…

標準ライブラリ「set」で集合を扱う(その2)

setはEnumerableです。 そのため、selectやらmapやらも難なく行けます set.select{|i| i.name == "shuzo"} #=> [{"power"=>10, "name"=>"shuzo"}] set.map{|i| i.name } #=> ["shuzo", "vivit"] lazyもイケます。 大量に使う場合には良いかもしれません set.…