Ruby

ruby2_keywordsの使い方

Module#ruby2_keywordsの説明はここを見るとよさそう。 github.com ruby2_keywordsを宣言したメソッドでは、従来(Ruby2以前)の可変引数配列にキーワード引数の情報が暗黙的に保存されるということでよいのかな。 なので、次のメソッド呼び出しに渡すときにき…

DRb remote method call with keyword argument occurs warning message of deprecated on Ruby 2.7.0, and fails on Ruby 2.8.0dev

Rubyのバグを報告したら速攻で対応されてた。 bugs.ruby-lang.org Module#ruby2_keywordsってこんな風に使うのか。 github.com

RubyのRegexp.last_matchのスコープ

ちょっとハマったのでメモ。 Rubyでは正規表現を一致させた結果をRegexp.last_matchや$~などで取得する。 リファレンスマニュアルでは次のように説明されている。 カレントスコープで最後に行った正規表現マッチのMatchDataオ ブジェクトを返します。 このカ…

Rubyスクリプトでパスワード入力

io/consoleをrquireしてからIO#getpassを使う。 $ ri IO#getpass = IO#getpass (from ruby core) ------------------------------------------------------------------------ io.getpass(prompt=nil) -> string ------------------------------------------…

Rubyの文字列検索いろいろ

単純な文字列検索ならString#include?が速い。 正規表現なら余分なMatchDataを生成しないRegexp#match?が速い。 MatchDataが生成されると遅くなる。 String#~は何らかの最適化が入っているようで、検索後にMatchDataにアクセスしなければRegexp#match?の次に…

DRbでプロセスをまたがった大域脱出ができるか確認した

結論としてはできなかった。 Rubyのバージョン: $ ruby -v ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux] 確認用のコード: require 'drb/drb' require 'drb/unix' require 'logger' stdlog = Logger.new(STDOUT) module Jump def ping yield('p…

RubyのRefinementでモジュールincludeやalias定義はどうなるか

確認してみた結果、refineでincludeしたモジュールのメソッドや定義したエイリアスは、refinementをusingしたときだけ有効になった。 refineでincludeしたモジュールはusingしても見えないがメソッドは有効になるようだ。 確認コード: module IncludeMethod …

RubyのRefinementされたメソッドの性能

通常のメソッドと比べて性能に差があるのかどうか比べてみた。 require 'benchmark' class Integer def to_comma to_s.reverse.scan(/\d\d?\d?/).join(',').reverse end end def method_no_args end module RefineMethod refine Object do def refine_method…

Rubyのaccept_nonblock(exception: false)

Rubyのサーバーソケットのaccept_nonblockは、IOのread_nonblockと同様にexception: falseでIO::WaitReadableを投げないようにできる。 例外を投げる場合と投げない場合で、どれくらい差があるものなのか実験してみた。 require 'benchmark' require 'socket…

rubyにおけるソケットのaccept_nonblockの競合

Rubyで1つのサーバーソケットを2つのプロセスから同時にaccept_nonblockするとどうなるか。サーバーのgraceful restartでよくありそうなシチュエーションを試してみる。 実験コード: require 'io/wait' require 'socket' s = TCPServer.new(0) p [ :listen, …

LinuxとWSLの差異: UNIX Domain Socket

LinuxはUNIX Domain Socketを何度もlisten(2)できるが、WSL (Windows Subsystem for Linux)は2回目のlisten(2)がエラーになる。backlogを変更しようとしてはまった。Rubyで検証した結果は次のとおり。 Linux: $ uname -a Linux gut 4.14.74-v7+ #1149 SMP Mo…

GNU screenからssh-agentを使う

GNU screenからssh-agentを使う場合、エージェントソケットのシンボリックリンクを張るのが常道のようなのだが、WSL環境でホームディレクトリをdrvfsにしているとunix domain socketとシンボリックリンクの相性が悪いようでどうにもうまく動かなかった。 そ…

TLSのローカル動作確認用のオレオレ証明書作成

方針 設定ファイルやツールを使うとなにがどうなっているか分からなくなるのでOpenSSLの素のコマンドを使って作る。 OpenSSLには様々なコマンドやオプションがあるが必要最低限のものだけを使う。 作った証明書を実際に使ってTLSで接続できることを確認する…

RubyのThread::SizedQueueのチューニング

前提 Thread::Queueは際限なくサイズが伸びるので使わない。Thread::SizedQueueを使う。 生産者(Thread::SizedQueue#pushする)側は1スレッドとする。 消費者(Thread::SizedQueue#popする)側は複数スレッドとする。 結論 いろいろい試してみたが、次のように…

EmacsからRubyのTest::Unitのテストを実行する

経緯 rubyunitからの流れでRubyのテストフレームワークはずっとTest::Unitおよびその互換I/Fを使っている。実は流行りのRspecは使い方を知らなかったりする。 探し方がよくないのかEmacsとTest::Unitを連携させる既存のパッケージが見つからなかったので、Em…

dRubyのパフォーマンス測定

経緯 プロセス間通信でdRubyを使おうと思ったが、パフォーマンスが気になったので測定してみた。 コード ベンチマークは自作の次のスクリプトを使う。 github.com のbenchmark_basic.rbを使用。 ベンチマークコードの抜粋: n = ARGV.shift || '1_000_000' n …

Rakeのタスククラスの作法

Rakeで同じパターンのタスクを繰り返すとき、メソッドでサブルーチン化してもタスク関連の記述(descとか)が冗長なのでいまいち感がぬぐえない。 のでタスククラスの書き方を調べた。 明文化されたルールが見つからなかったが、サンプルを見たりRakeのコード…

QDBMのrubygem化

ラズパイの32bit環境で2GB超のデータベースを扱えるアプリケーション組み込み型のKVS(Key-Value Store)を使いたかったので、QDBMをgem化してみた。 経緯 ラズパイ上でGDBMを使ってアプリケーションを動かしていたが、データベースファイルのサイズが2Gバイト…

サーバにメッセージを保存したままGmailからIMAPでメッセージを取得する

経緯 Raspberry PIでサーバを立てたので、こいつにメールサーバを立ち上げてGmailのバックアップにしようとたくらんだ。 普段のメールはGmailからPCやスマホのアプリで見るので、Gmail上にメッセージを残し既読フラグも一切更新せずにメッセージをダウンロー…