トップ 追記   RSS 1.0 FEED  

Journal InTime


2022-11-18 (Fri) [長年日記]

_ anonymous keyword rest parameterのバグ修正

とみたさんから報告があったanonymous keyword rest parameterのバグを修正した。 Ruby 3.2で

def foo(**)
  bar(**)
end

のように匿名でキーワード引数を他のメソッドに転送する機能が追加されたが、

def foo(x: 1, **)
  bar(**)
end

のようにキーワード引数を一部だけ転送する場合に文法エラーになるというもの。

修正自体はごく短いが、修正したらRubyVM::AbstractSyntaxTreeの動作が変わってしまったりしてあるべき動作を確認するのが大変だった。

調査の過程で動作に疑問がある部分があったので別のissueを作成しておいた。

def foo(...)
  bar(*) # OK
  baz(&) # OK
  quux(**) # NG
end

上記のように ... を使った時に *& は使えるが、 ** は使えない、というもの。 全部使えるか、全部使えない、のどちらかがよいように思うが、 & はRuby 3.1でも使えるので、全部使えるようにした方が互換性の面ではよさそう。

Tags: Ruby

2022-11-12 (Sat) [長年日記]

_ フクオカRuby大賞応募

mruby/c会議に来られていた福岡県庁の方から応募を勧めていただいたのでフクオカRuby大賞にTextbringerを応募してみた。

※MicrosoftOfficeがご利用いただけない場合は、応募用紙PDFをご覧いただき、記載されている各項目にご記入の上、ご提出ください。

ということだったが、Textbringerの応募資料をWordで書くのはプライドが許さなかったので、Markdownで書くことにした(「MicrosoftOffice」(スペースなし)という製品は知らないので「MicrosoftOfficeがご利用いただけない場合」に該当すると判断した)。

用紙サイズはA4です。

というレギュレーションをクリアするため、md-to-pdfでPDFに変換して、Textbringer上のMournmailから送信した。

問題は、

最近(概ね過去1年程度)のものを対象とします。

という部分だが、Mounrnmail 1.0.0を出したのが昨年6月なので周辺プラグインを含めて成熟したのがそのあたり、新規性を主張したString#byteindexの提案と利用も過去1年以内である。 担当者の方が「だいたいでいいですよ」とおっしゃっていたので大丈夫だろう。


2022-11-05 (Sat) [長年日記]

_ Rubyで理解する統計解析の基礎: 4〜5章

4章(notebook

4章はPyCallを使ったらほとんどPythonのコードそのままで動いてしまったので、Rubyで書き直した意味があまりなかったかも。

5章(notebook

5章は確率関数などの表現にあまりnumpyの機能が必要なさそうだったので、普通の配列で書いて、グラフの描画だけMatplotlibを使うことにした。 確率関数などをメソッドで表現すると、メソッド定義内で外側の変数が見えない、first class objectでない、などの問題があってPythonのサンプルコードの直訳が難しいので、Procで表現することにした。 また、大文字ではじまる変数名はRubyだと定数になってしまって不都合があるので、 _X のように先頭に _ を付けることにした。


2022-10-30 (Sun) [長年日記]

_ Rubyで理解する統計解析の基礎: 3章

numo-gslにpolyfitがなさそうなのと、rb-gslのインストールにRuby 3.xだと失敗するので、3章の途中からあきらめてPyCallを使った。

poly_fit = Numpy.polyfit(english_scores, math_scores, 1)
poly_1d = Numpy.poly1d(poly_fit)
xs = Numpy.linspace(english_scores.min, english_scores.max)
ys = poly_1d.(xs)

だとysがpoly1d([37. , 37.85714286, 38.71428571, ... になってしまって関数が適用されないので

ys = Numpy.array(xs.to_a.map { |x| poly_fit[0] * x +  poly_fit[1] })

としたけど何かもっといい方法がありそうな気がする。

10/31追記

Numpy.poly1dは関数風のクラスを返すようで、

poly_1d = Numpy.poly1d.(poly_fit)

のように .() を使用したら poly_1d.(xs) で期待した結果を得られた。 クラスなので、 Numpy.poly1d.(poly_fit)Numpy.poly1d.new(poly_fit) でもよいようだ。


2022-10-28 (Fri) [長年日記]

_ Rubyで理解する統計解析の基礎: 1章〜2章

サンプルコードをRubyで書き直しつつPythonで理解する統計解析の基礎を読んでいる。 Python版のサンプルのforkにRuby版のnotebookを追加していく予定だけど、途中でRubyで書き直すのは挫折しそうな気が……。

環境

  • ruby 3.2.0dev (2022-09-26T05:44:54Z master a8ad22d926) [x86_64-darwin21]
  • iruby-0.7.4
  • numo-narray-0.9.2.1
  • numo-gsl-0.1.2
  • daru-0.3
  • charty-0.2.12

1章(notebook

numpyの代りにnumo、pandasの代りにdaruを使用してだいたい問題なかった。 ただ、index_col相当の機能がDaru::DataFrame.from_csvにない(多分)せいで、 df.shape はインデックス分だけ列が増えて [10, 6] になってしまった。

2章(notebook

2章もmatplotlibの代りにCharty(バックエンドはplotly)を使ってだいたい書けたが、いくつか細かい問題が。

  • IRubyやdaruに浮動小数点数の出力の精度を指定する方法がなさそう。
  • Numo::NArray#[]で、 beginless range(...10)が使えない。
  • Numo::DFloat#varは不偏分散で、標本分散を返すオプションや別メソッドはなさそう。
    • Daru::Vector#varianceも不偏分散だが、variance_populationという別メソッドがある。
  • Numo::GSL::Histogramにデータをまとめて渡せない(使い方が悪いだけかもしれないが)のが効率が悪そう。
  • リスト内包表記の代りにstepを使ったが読みにくい。
  • Chartyで目盛りなどの細かい指定や、異なる種類のグラフの重ね合わせができない。箱ひげ図を縦向きに描く方法がわからない。

箱ひげ図

自分が使い方を知らないだけかもしれないので、「こうすればできるよ」というのがあったら教えてください。