もっとちゃんというと
Rails Way に従うこと、その合理的な理由、コレガワカラナイ
RubyKaigi2017に参加した。 楽しかった。
せっかくRubyKaigiに来てるので、セッションの間とか終わったあとの飲み会後とか、来てからとかセッションを聞いてない時間とかにRのつく言語を触ろうと思った。 ので、Rustでほしいと思ったツールを作った
これを作った。
No Test なので実用的じゃないです。
&mut
を使ってしまったString
と &str
と Char
とかの違いに戸惑ったまだ一章? だけど、 PyQくらいStep by Stepでも、隣に少しは分かる人が居ないと本当の初心者には難しいのかも? と思った。 ただ、隣に少しでも分かる人がいると内容もわかりやすいし、結構小さい粒度で成功体験を得られるので良いサービスな気がする。
PyQ というサービスが有る。プログラミング初心者はPython初学者に向けたサービス。 pyq.jp
嫁が「プログラミング勉強して、エンジニアとしてお賃金を稼ぎたい」と言い始めたので、話題になっていたPyQに登録してやってみている。
嫁のステータスとしては
とまぁ、「プログラミングに関しては本当にド素人で、キーボードをタイプすることには抵抗がない」くらいのステータス。
実際の画面をキャプチャしてよいのかわからないので、以下の公式サイトに有る画像を見てほしい
こういう感じで、Side by Side に「問題文や解説文」が左側、右側にエディターがあって、右上の「実行」を押すと右下にTerminalで出力結果が出たりする感じだ。 問題によっては「判定」ボタンがあって、テストが通ってOK,NGが出る感じ。
内容も
こういう感じで、本当に初歩の初歩から初めていく。
個人的には本当に初歩の初歩からなのでわかりやすいとは感じたが……
割りと初っ端から「写経」という言葉が出てくる。 写経という言葉を見て嫁は笑っていたが、これをうまく表現する言葉がないなぁと感じた。 コピペではなくて、見ながらタイプすることを、写経と表現されても、真の初学者にはわからない気がした。 実際には、「書き写しましょう」 みたいな言葉が出ていて、あぁ同じものをタイプすればいいんだな、と気がつくが、 「写経」という言葉の仰々しさに「うっ」っとくる。
SyntaxErrorとかを説明するフェーズがあったり、「SyntaxErrorの詳細はこちら」みたいなLinkを飛んで見たりできるが、その文章が初学者にはちょっとわかりづらい。 まぁこればっかりはしょうがない気もするが、エラーをいい感じに表現するのは難しい…… そしてこれを僕が改めて説明するのもまた、難しい……
「コメント」ができるよ、みたいな課題があって、そう言われても、ぶっちゃけ初学者には「これができてなんなん?」みたいな感じになる。 実際そういうニュアンスで聞かれた。「まー、プログラムの説明を書くためのもんだよ」と説明しても、「ふ〜ん」みたいな感じ。 とはいえ、こればっかりはまじで書いてみないとわからない気もしているので限界な気もする。
a = 'ほげ' print(a)
みたいなコードがあって、でもこれがなんで嬉しいのかが「こうやってできる」と「これはこう嬉しい」が遠いから、ちょっとわかりずらい。
「例えば a が【寿限無寿限無五劫の擦り切れ海砂利水魚の……】だったら、何度も打つの大変だけど、 a
って入れるだけでそれが出てきたら楽だし?」みたいな説明をして「確かにそれは嬉しいね」となったけど、実際には関数の返り値を使いまわすとか、そういう使い方のほうが嬉しかったりして、ちょっと違うなーって思いながら説明する。
頻繁に「これがなんで嬉しいの?」と聞いてくる嫁氏は、割りと筋が良い気がするなぁと思ったりした。 「なんでこうなってるの?」と聞くこと、考えることはプログラミングをしていく上で必須スキルだけど、前段の自発的に聞くことすら出来ない人がたまにいる。(自分のことですごめんなさい……) ただ、「なんでこうなってるの?」と聞いたときにPyQ上だけだとどうしても書いてあることで理解できないとそこに対してあんまり納得がないまま進むことになってしまう。
あとで「ああこれってこういうときに嬉しいのね」ということが分かっても、そこまでで離脱する可能性もあってちょっと難しいなぁという感じ。
まだ初めて二時間くらいなので、とりあえず一ヶ月分はやりきってほしいので横でアドバイスしながら、「とりあえず実行してみ?」みたいなスタンスで見守っていく。
気持ちが高まったら続編も書く。
faraday-middleware が突如として ArgumentError: options must be a hash.
というエラーを吐いて落ちた
この原因を探ってしまったので(本当は issue にあった)、記録として残しておく。現状この問題は解決済み
Oj で mimic mode を使っていると、 faraday-middleware の v0.12.0 で入った改修により、落ちる。
回避方法としては Oj のアップデートを行うか、 mimic mode を利用しない。
faraday middleware 側の改修も Master には取り込まれているが、 2017-08-03時点ではReleaseされていない。
Oj という Gem は、Rubyの早いJsonParseであり、大部分がCで実装されている。
また、Oj は mimic
というモードを備えており、これを利用すると、既存の JSON.parse
などのコードをOjのコードに差し替える。
Faraday Middleware の https://github.com/lostisland/faraday_middleware/pull/156/files#diff-5af7802308edb2ce67e963810b810354R11 この改修により、 parse_option を特に指定しない場合において JSON.parse(body, nil)
が実行されるようになった。
しかし、 Oj の mimic mode によって上書きされた JSON.parse は、第二引数が Hash かどうかだけをチェックしており、ここで落ちる https://github.com/ohler55/oj/blob/b1504563d8eaadad549aa56b1eaac1845bb63a3d/ext/oj/mimic_json.c#L513
元の JSON.parse では、 オプションが nil の場合はOptionのパースは実行されないので、落ちない https://github.com/flori/json/blob/master/ext/json/ext/parser/parser.c#L1734-L1739
よって、今回の問題は Oj を利用しており、 Oj の mimic mode を利用している場合のみ発生していた。
というのが ↑ の issue にまとまってるので読むと良い。
↓ のSpeeeさんで行われた技術的負債ナイトに参加してきた。 その軽いまとめ。 speee.connpass.com
まとめしか書かない。内容はそのうち資料が揚がる……きっと……
Approve
しない。 Approve
したコードは自分でもメンテするつもりでいるべき。yardoc
良いぞ最初二つ目くらいまではBearにまとめて書いてたけど途中から諦めてSlackに書き出したので雑になった。
class Point < Struct.new(:x, :y); end Point.new(x: 1, y: 2)
みたいなことをしたかった。
class Point < Struct.new(:x, :y) def initialize(x:, y:) super(x, y) end end
似たような class OpenStruct (Ruby 2.4.0) ならばできるが、OpenStructは #freeze
をしないとAttributesが動的に増やせてコワイ。Hashと何が違うねん、みたいな気持ちになる
実際には異なるけどそれはそれ
でもOpenStructは便利で、 OpenStruct.new(x: 1, y: 2)
ってできる。引数の順番を約束しなくてもよいので便利。
Structでもそうしたい。HashのKey:valueは取り出したときの順序を保証してないので、適当にぶち込むと謎のエラーになったりする可能性がある。
これをどうにか、静的な構造体として定義しつつ、引数の順序は問わずにいい感じにぶちこみたかった。
というわけで完成したのが結論のコード
↓ をGemにしただけ。 haito.hatenablog.com
Gem 本体は ↓
rubygems.org は↓
https://rubygems.org/gems/activerecord-relation-exec2hash
AwesomeModel.exec_query
とか出てくるとウッとなるから隠したかっただけ