すがブロ

sugamasaoのhatenablogだよ

Rails 6のコマンド周りで変わる細かい点(rc1調べ)

ブログを書くリハビリ

Rails 6.0で変わるであろうと思われる点のメモ

これのもうちょっと正確な説明ですが、bin/rails updatebin/rails setup の話の前に bin/rails db:prepare の説明が必要なんです。

rails db:prepare タスクの追加

PRはこちら https://github.com/rails/rails/pull/35768

タスク名より実装を見たほうがわかりやすいですが、DBが作成されていれば migrate を、そうでなければ setup を実行するタスクです。migrateとsetupの使い分けをしなくて良い便利タスクですね。

# PRのFiles Changedから抜粋
  task prepare: :load_config do
    ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
      ActiveRecord::Base.establish_connection(db_config.config)
      db_namespace["migrate"].invoke
    rescue ActiveRecord::NoDatabaseError
      db_namespace["setup"].invoke
    end
  end

bin/rails updatebin/rails setupbin/rails setup に統合

こちらが本題ですが、実装がほとんど同じジャン?ということでupdateはsetupを実行する形に変更されました。上記で追加された db:prepare を使うことで、動作的にもupdateとsetupを使い分けずとも同じ挙動になったわけですね。

これもPRを見たほうがわかりやすいでしょう https://github.com/rails/rails/pull/33139

そのうちupdateは無くなるんですかね。

かんたんRubyという書籍を執筆しました(6/21発売)

表題の通りですが、もうすぐ技術評論社から「かんたんRuby」というRubyの入門書が発売されます。

f:id:seiunsky:20180620081212p:plain

かんたんRuby is 何

技術評論社から出版している「プログラミングの教科書」シリーズのRuby版です。

http://gihyo.jp/book/series?s=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8

基本的にはプログラミングの経験があまり無い人向けの入門書という位置付けです。

gihyo.jp

対象読者

  • なんとなくターミナルの操作ができる
    • 難しいことはしていませんが、全く触ったことないとちょっと大変かも
  • プログラミングは初めて、あるいはちょっと触ったことがある

これくらいの経験の方向けに、Rubyを通じてプログラミングを経験してもらえると良いなと思っています。

目次

  • 1章 Rubyを始めよう
    • 01 Rubyとは
    • 02 Rubyの特徴
    • 03 開発環境の構築
    • 04 エディタの準備
    • 05 プログラムの入出力
    • 06 プログラムの実行
  • 2章 Rubyの基本を学ぼう
    • 01 Rubyをより深く学ぶために
    • 02 プログラムのはじまりとおわり
    • 03 変数とは
    • 04 オブジェクトとメソッド
    • 05 演算子とは
    • 06 コメントをつける
    • 07 インデント
  • 3章 変数
    • 01 変数の種類
    • 02 擬似変数
    • 03 定数
    • 04 nilオブジェクト
  • 4章 数値と演算子
    • 01 数値オブジェクト
    • 02 算術演算子
    • 03 シフト演算子とビット演算子
    • 04 比較演算子
    • 05 Integerのよく使われるメソッド
    • 06 Floatのよく使われるメソッド
  • 5章 文字列
  • 6章 制御構造
    • 01 条件分岐とは
    • 02 繰り返し処理
  • 7章 配列/レンジ/ハッシュ
    • 01 配列オブジェクト(Array)
    • 02 配列でよく使われるメソッド
    • 03 レンジオブジェクト(Range)
    • 04 ハッシュオブジェクト(Hash)
    • 05 ハッシュでよく使われるメソッド
    • 06 配列とレンジ,ハッシュのまとめ
  • 8章 メソッド
    • 01 メソッド定義
    • 02 メソッドと戻り値
    • 03 ブロック付きメソッド
  • 9章 クラスの基本
    • 01 クラスとは
    • 02 クラスにメソッドを定義する
    • 03 再び変数について
    • 04 アクセッサメソッド
    • 05 メソッドと可視性
    • 06 クラスの継承
    • 07 別ファイルを読み込む
    • 08 クラスと抽象化
  • 10章 モジュール
    • 01 モジュールとは
    • 02 モジュールを名前空間として使う
    • 03 モジュールでMix-inを実現する
    • 04 トップレベルや名前空間と値の探索順
  • 11章 例外処理
    • 01 例外処理とは
    • 02 例外を捕捉する
    • 03 例外を発生させる
  • 12章 組み込みライブラリ
    • 01 Timeクラス
    • 02 Fileクラス
    • 03 Dirクラス
  • 13章 標準添付ライブラリ
    • 01 標準添付ライブラリとは
    • 02 日付クラス(Timeクラスの拡張)
    • 03 CSVを扱う(CSVクラス)
    • 04 JSONを扱う(JSONクラス)
    • 05 YAMLを扱う(YAMLクラス)
    • 06 一時ディレクトリ/ファイルを扱う(tmpdir/tempfile)
    • 07 ファイルの操作を行う(FileUtilsモジュール)
    • 08 プログラムのテスト
  • 14章 組み込みツール
    • 01 irb
    • 02 RDoc
    • 03 Rake
    • 04 RubyGems
    • 05 Bundler
  • Appendix より高度なRubyの知識

本書を通じて、独り立ちできるように

これは「はじめに」にも書いてあるんですが、とにかく、自分がプログラミングを始めた時に一番困ったのは、入門書に書いてあることは理解できても、その後「どう調べていけば良いのか」がよくわからなかったという記憶があります。

そのため、本書では細かく本文中にリファレンスマニュアルのURLを記載しています。

このような文章を読むことで、わからないことがあったらまずはリファレンスマニュアルを見れば良いんだな、という体験をしてもらいたいという狙いがあります。

また、あまり深くは踏み込んでいないのですが、正規表現エンコード、テストについても解説があります。

これらをはじめとして「知らないとハマる」類のものや、初心者向けの説明としては不要と思われるかもしれないけれど、世の中のコードを見るときに知らないと意味がわからない類のものは適宜解説を入れているつもりです。

この本を読めば中級者になれる!とかそういうのは難しいかもしれませんが、ある程度自分で調べる分別が着くようになってほしいーーつまり独り立ちするための基礎体力がつくように、というコンセプトで執筆しました。

👏お礼👏

本書を書くにあたって、 @willnet さん、 @koemu さんにレビューをしてもらいました。なかなかタイトなスケジュールになってしまったにも関わらず、快く引き受けていただいて本当に嬉しかったです。ありがとうございました><

Rubyの動作について完全に思い違いしていた部分や、プログラミングの説明で難しいなーとついボヤかした部分などをズバッと指摘してもらって、かなりクオリティが高まったというか、本当に見てもらって助かりました……。余談ですが、頭がイカれていたのかGemfileを異常にtypoしていた(日常生活ではそんなことほとんどない)のをめっちゃ指摘してもらったのが印象深いです😇

購入はこちら

紙の書籍

Amazonで買えます(執筆時点では予約購入)。

かんたん Ruby (プログラミングの教科書)

かんたん Ruby (プログラミングの教科書)

あるいは、先行入荷している以下の書店では在庫があれば本日購入することが可能です!

電子書籍

技術評論社電子書籍サイトでEPUB/PDF版を購入できます。

かんたん Ruby | Gihyo Digital Publishing … 技術評論社の電子書籍

あるいは、AmazonKindle版を購入することもできます。

かんたん Ruby プログラミングの教科書

かんたん Ruby プログラミングの教科書

どちらもリフロー版とのことです。

良いなと思ってくれた方はぜひamazonのレビューなどに記載してくれるととても嬉しいです。おかしい点や改善点があれば技術評論社の書籍ページからいけるお問い合わせか、私に伝えてもらえると今後の改善につながるかもしれません。

それはそれとして単著 is 辛い

私は今まで、パーフェクトRuby, パーフェクトRuby on Rails, Webアプリエンジニア養成読本という書籍を共著で執筆してきました。 今回は色々あって単著という運びになったのですが、とにかく想像を絶する厳しさでほぼイキかけました

何が辛いかって、

  • 自分がやらないと進まない
  • 自分がやらないと進まない
  • 自分がやらないと進まない
  • 自分がやらないと進まない
  • 自分がやらないと進まない

本当にこれに尽きるというか、共著の場合はチームで誰かが執筆している気配があると良い意味でプレッシャーになって自分も書かなくてはという感じになるのですが、とにかく自分一人しかいないのでやらないと何も進まないんですよね……。

チームでやるのは、それはそれで苦労があるのですが単著というのはとにかく夏休みの宿題をギリギリまでやらないタイプのスタンド使いとは相性悪いのではないか😇

色々あって自分が手元でテキストベースの原稿を執筆した期間がおよそ3ヶ月(その後はDTPしてPDFになった原稿での調整や見直しがある)で、その後の加筆修正なども考慮するとだいたい24万文字くらい書いた感じですが、とにかく執筆期間は人間性を捨てて時間を作っていた結果3kgくらい太って厳しみがあります(こんなの人生で初めて)。

そんなわけで、結構苦労して書いたのでもし本屋さんで見かけたらどんなもんかチラ見くらいしてもらえると幸いです(良いと思ったら買ってね!)。

Rubyのnilクラスを調べたい

nilクラスが実際にどうなってるのか調べたい

Rubyの実装がどうなっているか、一年に365回くらいは調べたくなると思うのですが、今日はnilクラスについて調べました。

Rubyの組み込みクラスは(多分)リポジトリ直下にそれぞれ、それっぽい名前.cとして存在しているのですが、nilについてはどうやらそうではない模様。

GitHub - ruby/ruby: The Ruby Programming Language

仕方がないので頑張って探してみましょう。

おもむろに git grep nil

rubyリポジトリをgit cloneしてきて*1、おもむろに git grep nil。当たり前だけど普通にnilばっか出てきてダメですね;;

よく考えればnilはクラスではないのでクラス名で検索しないとダメだろう。というわけでNilClassを調べます。念のため書いておきますが、nilのクラスは以下のようにして調べることができますよ。

irb(main):001:0> nil.class
=> NilClass

気を取り直して、おもむろにgit grep NilClass。これでも結構たくさんの結果が出てきてしまいました。ここから目grepするだけでも目的のものはわかるのですが、もうちょっと楽をするために.cのみで検索してみましょう。

% git grep NilClass -- "*.c"
class.c:    SPECIAL_SINGLETON(Qnil, rb_cNilClass);
class.c: *       NilClass, TrueClass and FalseClass.
complex.c:    rb_define_method(rb_cNilClass, "to_c", nilclass_to_c, 0);
ext/json/generator/generator.c:             mTrueClass, mFalseClass, mNilClass, eGeneratorError,
ext/json/generator/generator.c:static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self)
ext/json/generator/generator.c:    mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass");
ext/json/generator/generator.c:    rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1);
object.c:VALUE rb_cNilClass; /*!< NilClass class */
object.c: *  <code>false</code>, it returns NilClass, TrueClass, or FalseClass,
object.c: *     nil.singleton_class         #=> NilClass
object.c: * Document-class: NilClass
object.c:    rb_cNilClass = rb_define_class("NilClass", rb_cObject);
object.c:    rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
object.c:    rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
object.c:    rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
object.c:    rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
object.c:    rb_define_method(rb_cNilClass, "to_h", nil_to_h, 0);
object.c:    rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
object.c:    rb_define_method(rb_cNilClass, "&", false_and, 1);
object.c:    rb_define_method(rb_cNilClass, "|", false_or, 1);
object.c:    rb_define_method(rb_cNilClass, "^", false_xor, 1);
object.c:    rb_define_method(rb_cNilClass, "===", rb_equal, 1);
object.c:    rb_define_method(rb_cNilClass, "nil?", rb_true, 0);
object.c:    rb_undef_alloc_func(rb_cNilClass);
object.c:    rb_undef_method(CLASS_OF(rb_cNilClass), "new");
rational.c:    rb_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0);
rational.c:    rb_define_method(rb_cNilClass, "rationalize", nilclass_rationalize, -1);
spec/ruby/optional/capi/ext/constants_spec.c:static VALUE constants_spec_rb_cNilClass(VALUE self) {
spec/ruby/optional/capi/ext/constants_spec.c:  return rb_cNilClass;
spec/ruby/optional/capi/ext/constants_spec.c:  rb_define_method(cls, "rb_cNilClass", constants_spec_rb_cNilClass, 0);
sprintf.c:      if (value == rb_cNilClass) {
vm.c:    if (klass == rb_cNilClass) return NIL_REDEFINED_OP_FLAG;
vm.c:          C(NilClass), C(TrueClass), C(FalseClass));

かなり人間がわかるような量になりました。 これで必要な情報はほぼわかったようなものですが、実装はobject.cにあるようです。

object.c 👀

もはや説明不要なレベルですが、先ほどの結果を抜粋すると、object.cのここら辺が見るべきポイントのようですね。

object.c:    rb_cNilClass = rb_define_class("NilClass", rb_cObject);
object.c:    rb_define_method(rb_cNilClass, "to_i", nil_to_i, 0);
object.c:    rb_define_method(rb_cNilClass, "to_f", nil_to_f, 0);
object.c:    rb_define_method(rb_cNilClass, "to_s", nil_to_s, 0);
object.c:    rb_define_method(rb_cNilClass, "to_a", nil_to_a, 0);
object.c:    rb_define_method(rb_cNilClass, "to_h", nil_to_h, 0);
object.c:    rb_define_method(rb_cNilClass, "inspect", nil_inspect, 0);
object.c:    rb_define_method(rb_cNilClass, "&", false_and, 1);
object.c:    rb_define_method(rb_cNilClass, "|", false_or, 1);
object.c:    rb_define_method(rb_cNilClass, "^", false_xor, 1);
object.c:    rb_define_method(rb_cNilClass, "===", rb_equal, 1);
object.c:    rb_define_method(rb_cNilClass, "nil?", rb_true, 0);

あまりCの実装には詳しくありませんが、少なくともrb_define_class でNillClassを定義していて、rb_define_method(rb_cNilClass, ...) でメソッド名と実装の紐付けを行なっていることがわかります。 例えば、to_inil_to_iで実装されているようですね。このnil_to_iも同じobject.cで実装されているのでみてみましょう。

static VALUE
nil_to_i(VALUE obj)
{
    return INT2FIX(0);
}

こんな感じでゼロを返すという強い意志を感じます。

というわけで、NilClassの実装を見ることができました。まあ今回のポイントはどのファイルで実装されているのか?というのを調べる部分で、それはobject.cでした、ということですね。

合わせて読みたい

あんまり関係ないけどこちらもよろしくお願いします

改訂2版 パーフェクトRuby

改訂2版 パーフェクトRuby

*1:実際はruby/rubyghqで手元に取得済みなのであった

「あなたの知らないセキュリティの非常識」を読んだ

辻伸弘さんから、「あなたのセキュリティ」シリーズ第一弾(http://sugamasao.hatenablog.com/entry/2016/10/31/083124)に続いて頂きました! (本当は12月中にこのエントリを書くつもりだったのですが遅くなってしまった……)

今回の内容も実際に発生したセキュリティインシデントに対して対策や対応方法について書いてあります。 が、なかなか事例が生々しい例が多いということもあって身が引き締まる思いです。

あなたの知らないセキュリティの非常識

あなたの知らないセキュリティの非常識

気になった内容メモ

ランサムウェアにお金を払うか?

バックアップから人質に取る事例。昨年はよく話題に上がった事例だと思います。 とにかく恐ろしい。

個人の端末ではなく、サーバにアクセスして復旧手段を封じてから本丸を暗号化させて身代金要求するようなケースの紹介があるのですが、暗号化や侵入の手順の説明だけではなく、被害にあった業者と攻撃者が交渉して代金の支払いやデータの復旧が行われたという事例の紹介になっていて、読んでいるだけで胃が痛くなる。 こんなんやられたら死ぬわ、、、。

また、脅迫型のDDos攻撃の事例も紹介されている。 これは言ってしまえばDDos攻撃されたくなかったら金を払えということなのだけど、脅迫メールとともにお試しで攻撃してブラフでないことを証明したり攻撃方法としてMiraiボットネットを使用するなどが書かれていたらしい。

Miraiボットネットについてよく知らなかったのだけど、Iot機器に感染させて様々な機器からDDos攻撃を仕掛けるとか言われるの怖すぎますね……。単にIPアドレスで弾くみたいなことはできないでしょうし。 参考 : http://techfactory.itmedia.co.jp/tf/articles/1704/13/news010.html

他にも、筆者がアノニマスのアカウントから人物像をプロファイリングしている話や、Webサイトを改ざんしたハッカーに直接コンタクトを取ってみたりする話が載っているのですが、スリリングで面白いというか、すげえって感じですね。

攻撃の被害者になったら

この章は実際に筆者の会社で被害にあった時の対応などが書かれている。最高の知見では???

実際の対応について、三つのポイントというのが書いてあって、例えば対応の意思決定者として社長が参画しているとか、きちんと情報を公開するという方針をとったなど。

これはぜひ本書を手にとって読んでみてもらいたい。

本作の見どころ(難易度:高)

前作の「あなたのセキュリティ対策間違ってます」で、Amazonのレビューに著者である辻さんのお母さんがレビューを書いていたことがありました。 非常に良い内容で一部界隈では盛り上がったのですが、なんらかの事情でAmazonから消えてしました(親族からのレビューはダメとかあるのかな?)。

そのレビューの文章が本作には載っているので、もし見逃してしまった人は一見の価値ありです。

合わせて読みたい

前作の「あなたのセキュリティ対策間違ってます」はこちらからどうぞ

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

High Sierra上にPallarels DesktopでHigh Sierraの仮想環境を構築する

うまくインストールできなくて困った

この時はPallarels Desktop 13.1.0を使っていた

それからしばらくして

気を取り直してリベンジしたもののうまくできない・・・

のだが、Pallarels Deskotop 13.1.1がリリースされていることに気がついたのでアップデートしてから再チャレンジ。

できた

めっちゃわかりにくいと思うけど仮想環境上のHighSierraです

f:id:seiunsky:20171024203814p:plain

バージョン情報と手順

f:id:seiunsky:20171024203440p:plain

手順は特に何もないのだけど、記憶を失った時のために書いておくと、仮想環境の新規インストールから「インストール」の「回復パーティションを使用」からOSのイメージを使ってインストールする。

f:id:seiunsky:20171024203451p:plain

わかばちゃんと学ぶ Git使い方入門を読んだ

読みました

わかばちゃんと学ぶ Git使い方入門

わかばちゃんと学ぶ Git使い方入門

目次

  • CHAPTER 1 Gitって何?
  • CHAPTER 2 個人でGitを使ってみよう
  • CHAPTER 3 複数人でGitを使ってみよう
  • CHAPTER 4 実用Git 〜 こんなときはどうすればいい?
  • CHAPTER 5 Gitで広がる世界

読むモチベーション

普段から仕事などでgitは使っているので、今さらgitとは?のような話を学ぼうと思ったわけではなくて、本書の目次のCHAPTER 4「実用Git 〜 こんなときはどうすればいい?」が目当てでした。

というのも、基本的には必要に迫られて色々なコマンドを覚えてきたので体系的な(というか詳しい人の)「こういう時はこうする」という方法が果たして自分の普段やっていることと合っているのだろうか?という不安があったんですね。

結論から書くと

自分が普段やっていたのと同じことが本書に書かれていたので間違ってなかったんだなwと安心できてよかったし、説明がとてもわかりやすくてよかった。

読んだメモ

  • ブランチやリモートとローカルの関係などが図示されているのはとてもわかりやすい
  • コンフリクトやrebaseなども丁寧に説明されているのは非常によかった
  • 説明は基本的にSourceTreeの画面で行われるので、SourceTreeユーザはドンピシャでわかって良さそう
    • 普段CLIでしかやらないので馴染みはなかったけど普段使っているコマンドの知識があるので問題なく読めた
    • 逆にいうと、完全に知識がない状態でCLIベースで学ぼうとするにはちょっと頑張る必要があるかも
  • コラムでGitHub Flowの説明はあるけど、基本的にはブランチを使ったリリースフローなどの説明はなくて、あくまでブランチ自体の使い方などにとどめてある。のでそっち方面は別の書籍などで補完すると良さそう

日頃使っている人はともかく、VSC関連のツールを使ったことないけどgit使ってみたい人とか、gitをたまにしか使わなくて慣れていない人などが読むには非常に良いと思う。 使い始めた時に疑問に思うようなことはきちんとわかばちゃんが疑問に思う→説明→実演という流れで解決していくので、怖くて実行できない、みたいな恐怖心はだいぶ和らぐんじゃあないかな。

新人研修などでgitをゼロから教える場面があったらこの本渡せば良いんじゃないかと思うのでおすすめです(たぶん)。

読む用、保管用、布教用で3冊購入すると良さそうです。

わかばちゃんと学ぶ Git使い方入門

わかばちゃんと学ぶ Git使い方入門

Ruby2.4のoptparseでHashにパース結果をマッピングするintoという便利オプションを調べた

表題の通りなんですが

blog.cognitohq.com

上記のページの「Parse CLI options into a Hash」の項目を見ると、以下のように parse メソッドに :into でハッシュオブジェクトを渡すと自動でマッピングしてくれるという地味に便利な機能が追加された。

上記のURLから抜粋

require 'optparse'
require 'optparse/date'
require 'optparse/uri'

cli =
  OptionParser.new do |options|
    options.define '--from=DATE',    Date
    options.define '--url=ENDPOINT', URI
    options.define '--names=LIST',   Array
  end

config = {}

args = %w[
  --from  2016-02-03
  --url   https://blog.blockscore.com/
  --names John,Daniel,Delmer
]

cli.parse(args, into: config)

config.keys    # => [:from, :url, :names]
config[:from]  # => #<Date: 2016-02-03 ((2457422j,0s,0n),+0s,2299161j)>
config[:url]   # => #<URI::HTTPS https://blog.blockscore.com/>
config[:names] # => ["John", "Daniel", "Delmer"]

:into で便利になるのはわかるものの、このサンプルを見ると define って何だろう、とか短いオプション名(-uとか)も指定した場合どうなるの?ってところが色々と疑問だったので調べてみた。

define is 何

情弱なのでリファレンスマニュアルに載ってないAPIだから define を使ったオプションの定義したことがなかった(実は載っているのかと思ってドキドキしたけどやっぱり載ってない)。

library optparse (Ruby 2.4.0)

というわけでRubyのソースを確認して見るとこんな感じ

https://github.com/ruby/ruby/blob/v2_4_2/lib/optparse.rb#L1465-L1505

抜粋すると以下のように、いつも使っている on メソッドが内部で呼び出しているメソッドなんですね。

  def define(*opts, &block)
    top.append(*(sw = make_switch(opts, block)))
    sw[0]
  end

  def on(*opts, &block)
    define(*opts, &block)
    self
  end

ソース内の雰囲気からすると、 on は公開用で define は内部で使う用っぽい気がするけど*1、普通に呼び出せるしどっちでも良いのかもしれない。まあ、今まで通り on 系を使えば良いかなって気がしますね……。

オプション名 is 何

割り当てるオプション名ってどう決まるのか。

options.on '-a, '--argument=VAL'

みたいに定義した時にどっちが使われるのかなという話でもありますし、オプション名に - が含まれていた場合どうなるのか(ネタバレすると:"foo-bar"みたいになる)など疑問が湧きますよね。

これを知るにはざっくり :into オプションの流れを追う必要があるのですが、結論を先に書いておくと

  • 短いオプション名と長いオプション名があった場合長いオプション名が使用される
  • オプション名の先頭ハイフンを取り除いた文字列を .to_sym した値になる

という動作のようです。

プログラム的には

という流れのようですね。

まとめ

    OptionParser.new do |options|
      options.on '-r', '--ruby=VAL' do |val|
        val.downcase
      end
      options.on '-p', '--perl=VAL' do |val|
        val.upcase
      end
      options.on '-g', '--go-lang' do
        'go'
      end
      options.on '-d' do
        true
      end
      options.on_tail '-h', '--help', 'hi'
    end

こんな定義をした場合、 into オプションでHashを渡した場合は

  {
      ruby: 'ruby',
      perl: 'PERL',
      'go-lang': 'go',
      d: true
  }

こんな値が得られます。便利ですね。

サンプルソースコードとテストケースは以下にあります(主に test/unit を使ってみたかっただけw)。 https://github.com/sugamasao/optparser_ruby24_into_sample

*1:実際のところはどうなんでしょうか?