Ruby

Rubyのリファレンスマニュアルを端末で読むrefe

Rubyのリファレンスマニュアルをmanのように端末上で読むコマンドとしてriがありますが、残念ながらこれで読めるのは英語のマニュアルだけです。 Rubyには日本語でかかれたマニュアル(通称「るりま」)がありますが、いちいちブラウザで読むのも面倒だしネッ…

第6回「オブジェクト指向設計実践ガイド」読書会に参加しました

11/15 NSEGの「オブジェクト指向設計実践ガイド」読書会の第5回に参加しました。参加者3名でした。寂しい。 nseg.connpass.com 今回は第6章を読みました。 第6章は継承の話でした。 普段あんまり意識せずになんとなく実装していたのですが、明文化されるとな…

Gitでコメントを無視して差分を見る

古いRubyのコードのコメントを独自のRDoc形式からYARD形式に変換して、さらにその後にプログラムを変更したんですが、その後に差分を見ると大量のコメントの差分が表示されて、実際のコードの差分が何かわからなくなったりしたので、コメントを無視して差分…

Rubyのbundlerをアップデートしたらプログラムが動かなくなった話

Ruby の bundler を 1.13 から 1.15 にアップデートしたら今まで動いたプログラムが動かなくなりました。 こんな感じ: % bundle _1.13.7_ exec ruby -r./hoge.rb -e Hoge.new % % bundle _1.15.4_ exec ruby -r./hoge.rb -e Hoge.new hoge.rb:3:in `initiali…

第5回「オブジェクト指向設計実践ガイド」読書会に参加しました

11/1 NSEGの「オブジェクト指向設計実践ガイド」読書会の第5回に参加しました。参加者7名でした。 nseg.connpass.com 今回は第5章を読みました。 オブジェクトの型(クラス)を調べて処理を変えるというコードの例としてcase文が使われてました: case preparer…

Rubyおもしろい

Rubyは括弧をつけなくてもメソッドを呼び出せます。メソッド名は普通は英小文字で始まります。ローカル変数も英小文字で始まります。 こんなRubyプログラムを実行すると(ifの条件部で代入しているのはtypoではありません)、 def hoge 123 end p hoge x = 456…

第3回「オブジェクト指向設計実践ガイド」読書会に参加しました

10/4 NSEGの「オブジェクト指向設計実践ガイド」読書会の第3回に参加しました。参加者11名でした。盛況ですね。 nseg.connpass.com 今回は第3章を読みました。 コード例が単順すぎて、より良い設計として挙げられてるコードがいまいちピンとこないところもあ…

NoException

役に立たないライブラリを作るシリーズです。 最近例外を発生させない某言語が流行ってるらしいと聞いて作ってみました。 インストール % gem install tmtms-noexception なんと noexception という名前は既に取られてた! 使い方 こんな風な例外を発生させ…

AutoForker

Rubyで何の役に立つかわからなくて自分でも使わない誰得なライブラリを作るのが趣味なのですが、RubyKaigiに参加して高まったので一つ作ってみました。 というか実際にはRubyKaigi前に作ってあったけど名前が思いつかなくて放置していたのですが、RubyKaigi…

RubyKaigi2017

RubyKaigi2017に参加したのでメモ。 0日目 10時に家を出て6時間掛けて広島へ。 広島は台風の直撃コースでどうなるかと思いましたが新幹線はちゃんと定時に広島に到着しました。 広島より先が停電したらしく乗ってきた列車は広島止まりで、その後は結構遅れた…

とちぎRuby会議07に参加しました

8/26に開催されたとちぎRuby会議07に参加してきたので雑感等。 昼飯の唐揚げのボリュームがすごい。 お弁当「小盛り」を頼んだのにこの大きさΣ(・□・;)アメリカ飯を思い出したよ!#toRuby pic.twitter.com/Z1yx77cxMh— ちょまど@MS本社チームになった (@c…

Gemの作り方

RightCSVで久々にGemを作ったので、最近のGemの作り方をメモっときます。 GitHub上にリポジトリを作って git clone 別に最初にやらなくてもいいですけど、どうせ GitHub で公開するのなら最初にやっといた方が楽です。READMEやLICENSEファイルも作ってくれま…

Rubyのnilを返さないCSVライブラリ

RubyのCSVライブラリは何故か空フィールドについてnilを返します(「"」で括られていると空文字列を返します)。 require 'csv' CSV.parse('a,,"","1,2"') do |row| p row end #=> ["a", nil, "", "1,2"] なのでそれを考慮していないと NoMethodError(いわゆる…

ZIP中のファイル名の文字化け(Ruby編)

tmtms.hatenablog.com という記事を書きましたが、今回はRubyでZIPファイルを作る時の話を。 RubyでZIPファイルを作るには、rubyzip というライブラリを使います。 % gem install rubyzip 次のようにしてZIPにファイルを追加できます。 require 'zip' Zip::F…

大江戸Ruby会議06

大江戸Ruby会議06 #oedo06 に行ってきたので雑感など。 会場 @sora_h さん生誕20周年記念ということで、会場も「ソラシティカンファレンスセンター」という場所でした。 Docker時代の分散RSpec環境の作り方 speakerdeck.com RSpecの実行に時間が掛かってたの…

Ruby製のEmacsライクなテキストエディタTextbringer

大江戸Ruby会議06で前田さんがRubyでEmacsライクなエディタTextbringerを作ったという発表をしていました。 発表資料 https://github.com/shugo/oedo06/blob/master/textbringer.md ブログ https://shugo.net/jit/20170320.html 最初はEmacs上の何かでプレゼ…

Sequelのトランザクション内でタイムアウトするとCOMMITされてしまう

ちょっと前にハマったのでメモ。 Sequelでトランザクションを使う時は次のように transaction メソッドにブロックを渡します。 require 'sequel' require 'logger' db = Sequel.connect('mysql2://user:passwd@localhost/test') db.loggers = [Logger.new($s…

Ruby の Enumerable#sum

「最近のruby-core (2016年7月)」に次のような記述がありました。 Enumerable#sum というメソッドが追加されており、特定の場合(浮動小数点数の配列とか)には誤差が累積しないアルゴリズムが採用されています。 Ruby 2.4 に Enumerable#sum が追加されたのは…

Ruby の Timeout の仕組み

Ruby で長い時間掛かるかも知れない処理のタイムアウトを行うにはこんな感じにします。 require 'timeout' begin Timeout.timeout(3) do # 3秒でタイムアウト hoge # 何かの処理 end rescue Timeout::Error puts 'なげーよ' # タイムアウト発生時の処理 end …

Sequelの罠

Sequel の罠っぽい挙動にハマったのでメモ。 次のようなテーブル a, b, c, d がありまして、 mysql> select * from a; +------+ | id | +------+ | 1 | +------+ mysql> select * from b; +------+ | id | +------+ | 2 | +------+ mysql> select * from c; …

要素数ができるだけ均等になるように配列を分割する

例えば10個の要素を持つ配列があって、これを3つに分割したい時に、 a = [1,2,3,4,5,6,7,8,9,10] n = 3 m = Rational(a.size, n).ceil a.each_slice(m).to_a #=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]] みたいにすると、3つには分割できるんですが、要素数…

Rubyで指定バイト数を超えない文字列の取得

文字エンコーディングにUTF-8を使用した場合、1文字は1バイト〜4バイトです。 ある文字列の先頭からn文字の文字列を取り出すには次のようにできます。 str = "本日は晴天なり" n = 3 str[0, n] #=> "本日は" 先頭からnバイトを超えない最大の文字列を取り出…

RubyからProtobufを使う

MySQL 5.7.12 から追加された X Protocol は Protobuf というのを使ってるらしいです。 Protobuf というのをそこで初めて知ったので、とりあえず Ruby から Protobuf を利用する方法を調べてみました。 Protobuf はデータ構造をバイト列にエンコードしたり、…

Ruby の文字列データの複製について

Ruby で String オブジェクトを複製しても、文字列データは複製されません。 data = "a"*10*1024*1024 system "grep ^VmSize /proc/#$$/status" t1 = Time.now a = [] 100.times do |i| a.push data.dup end t2 = Time.now system "grep ^VmSize /proc/#$$/s…

flock(LOCK_EX) で EBADF

ちょっとハマったのでメモ。 ファイルを flock() で排他的にロックするために次のようにすると成功します。 % ruby -e 'File.open("hoge").flock(File::LOCK_EX); puts "OK"' OK が、NFS 上で同じことをやると失敗します。 % ruby -e 'File.open("hoge").flo…

Crystal の名前付き引数は自然に書けてつらくない

これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の25日目の記事です。 qiita.com Ruby の名前付き引数の例です。 def hoge(a, b=1, c: 2) p [a, b, c] end hoge(123) #=> [123, 1, 2] hoge(123, 456) #=> [123, 456, 2] hoge(123, c: 789) #=> [123…

Crystal はソースコードも Crystal でつらくない!

これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の24日目の記事です。 qiita.com Crystal のソースコードは Crystal で記述されています。最初は Ruby で書かれていたようですが、現在はすべて Crystal で書かれています。 Ruby は本体と組み込みラ…

Crystal はブロックがエラーになることがあってつらい

これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の23日目の記事です。 qiita.com メソッドに渡されたブロックを実行するには次の2つの方法があります。 def hoge yield end hoge{ p 123 } def hoge(&block) block.call end hoge{ p 123 } ですが、…

Crystal には Thread がなくてつらい

これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の22日目の記事です。 qiita.com タイトルのまんまですが、Crystal は Thread がなくてつらい。 Thread というクラスはありますが、ソースを見ると、 # Don't use this class, it is used internally…

Crystal のバイナリデータ読み込みは C みたいでつらい

これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の21日目の記事です。 qiita.com Crystal の String は UTF-8 固定なのでバイナリデータを String で扱うことはできません。 バイナリデータを扱うには String ではなく Slice を使います。 Slice(UI…