ユユユユユ

webエンジニアです

Ruby

rm ~/.bundle/config

Rubygem にはパスというのがある。次のコマンドでそれをみられる。 gem env gempath bundle install はこの gempath がデフォルトのインストール先となるように作られている。 しかしこのデフォルトは弱い。実際のところ、環境によって変わることのほうがず…

四則演算パズル

日曜日の午後、こんな遊びを見かけた。 4つの数と四則演算のパズルと言えば、中学に入った時に数研のビラで1,1,9,9->103,7,7,11->23,5,12,13->30という3つの問題があって、1つ目は知ってたから残り2つもそのパターンかと思ったら実は微妙に違ってて、その日1…

rails/rails にはじめてのコントリビュートをした

rails/rails に初めての PR を出して苦い気持ち と書いていた。結局、そのあと二往復ばかりのレビューのやりとりがあって、無事にマージされた。これでぼくも rails コントリビュータのはしくれといえるだろうか。ふわふわした気分でいる。 rails/rails#4286…

rails/rails に初めての PR を出して苦い気持ち

rails レポジトリのイシュー一覧をみていたら、 good first issue のついた手ごろな問題があった。 rails/rails#42862 初コントリビュートのチャンスかとおもって、ドキドキしながらパッチの準備をした。環境を整えて、修正して、テストを動かして、コミット…

ctran/annotate_models に PR を送った

これまで従事したいくつかのプロジェクトにおいて高い採用率(個人の感想)を観測している ctran/annotate_models にプルリクエストを送った。 get_loaded_model_by_path is supposed to be nil-safe by sato11 · Pull Request #883 · ctran/annotate_models…

Ruby の基数変換において基数の上限は 36 である

SOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192) に参加した。D - Base n を解きながら、いままで知らなかった Ruby の振る舞いを知りえたので書いておく。 0-9 からなる文字列を、整数 d で基数変換し、整数 n 以下かどうか調べる。…

bundle update --conservative で狙った gem だけをアップデートする

TL;DR ミニマムなバージョンアップを行いたいときは bundle update --conservative を使おう gem の更新 ライブラリのバージョンアップをしようとしているとする。単に bundle update と叩いてすべての依存を一括でバージョンアップするのは、差分を追うこと…

任意の区間で任意の整数の倍数を数える

Codility の問題をいくつか解いてみていて、どうにも解けずに諦めてしまった問題があった。匙を投げて解法を検索してみて、あまりにスマートに解けるものだから、なおさら悔しい思いをしている。そこで供養の意味も込めて振り返りをまとめておく。 当該の問…

配列を任意の個数の部分集合に均等に分割するアルゴリズム

長さ N の配列があり、それを M 個の部分集合に均等に分割したい。 制約を簡単に定義するとこうなる。 0 <= N 1 <= M <= 100 TL;DR active_support/core_ext/array/grouping の Array#in_groups がそのものズバリである。 誤ったロジック 3年前の自分が実装…

ruby-doc のバグを報告した

ruby-doc.org が一部落ちていたので報告した。正しい報告先を探すのがたいへんだったので備忘録で書いておく。 落ちていたのは ruby 2.7.2 の標準ライブラリのドキュメントで、 stringio や time などいくつかのページが 404 を返していた。それから HTML の…

activerecord で一括更新を行うときの選択肢をベンチマークで比較してみた

Rails を使ってある程度の大きさのレコード群を一括更新する処理の実装方針を考えていた。愚直にイテレートして一件ずつ update していくのは論ずるまでもなくバッドプラクティスであるとして、その他の選択肢の優劣は検討してみないとよくわからないという…

`String#==` は実行時間が最適化されているか?

昨日の記事で、 secure_compare は String#== とは異なり常に一定時間で処理が行われる、と書いた。 jnsato.hateblo.jp あらためて GitHub Developer から引用する。 Using a plain == operator is not advised. A method like secure_compare performs a "c…

Rack::Utils.secure_compare を読む

Hanami と Sinatra の CSRF 対策のコードで、いずれも Rack::Utils.secure_compare という API を利用していることを発見した。何が secure なのだろうか? という思いがあり、読んでみた。 def secure_compare(a, b) return false unless a.bytesize == b.b…

Sinatra, Rails, Hanami それぞれの CSRF 対策の流儀

CSRF 対策がフレームワークでどう行われるかを読み比べていた。せっかくなので簡単にまとめることにする。 TL;DR 対応するクラス/モジュール 不正時の挙動 トークン Sinatra v2.0.8 Rack::Protection::AuthenticityToken [source] 403 base64 Rails v6.0.3 A…

heroku でのビルドが突然壊れたのでイシューを提出した

いわゆる「何もしていないのに壊れた」という状況に陥った。 症状としては、 Hanami アプリのデプロイにおける rake assets:precompile タスクの実行時に、 uninitialized constant Bundler とはねつけられてしまう。スタックトレースによると ここ でコケて…

ActiveSupport は気軽に使ってもいいものだろうか?

ActiveSupport はきめ細かく require できる ということを学んだのが昨日。とはいえ、それでもやはりためらいはある。 次に示すのは ActiveSupport が依存するモジュールである。 % gem dep activesupport Gem activesupport-6.0.3.1 concurrent-ruby (~> 1.…

ActiveSupport はきめ細かく require できる

hanami を利用した開発への所感 にて、こう書いた。 タイムスタンプを「○日前」と文字列に変換するだけのために、 ActiveSupport を丸ごと取り込むのは、理にかなった判断とは言えまい。 断定してしまっているが、実はよく調べないまま印象で語ってしまって…

宗教と暦の「歴史的文脈」を担うDateTimeクラス

DateTime クラスのドキュメントを読んでいた。 ほんの小さな好奇心で調べ始めたものだったが、世界文学のふたりの巨匠の命日を引き合いに出して暦の問題を鮮やかに示す文章に興奮させられて、つい読み込んでしまった。それはこんな例である。 shakespeare = …

hanami を使ってみて得られた知見と所感

Hanami で小さな開発をやってみた。 jnsato.hateblo.jp 単機能のウェブページに過ぎず、 Rails であれば1日でできただろうと思う。 hanami の機能や API を追いかけながらの実装だったので、やや時間はかかった。とはいえ、それでもファースト・コミットから…

hanami でブックマークマネージャを作った

1週間ばかり、 hanami による開発に取り組んでいた。動機付けを描写したのは以下のエントリ。 jnsato.hateblo.jp jnsato.hateblo.jp そして、作ってみたものがこちら。 heroku の無料 dyno にデプロイしている。 hanami-news.herokuapp.com ブックマーク管理…

Ruby 2.7 + hanami 1.3.3 + pg のプロジェクトでは bigdecimal 1.4 を使う

sqlite を pg アダプタに付け替えていた。一通り設定を終えて、開発サーバーを立ててみると、こんなエラーが発生した。Ruby 2.7 + hanami 1.3.3 + pg 1.2.3 で再現するはず。 undefined method `new' for class `#<Class:BigDecimal>' bigdecimal とは標準ライブラリで、 Ruby </class:bigdecimal>…

hanami の ApplicationLayout は単体テストすべきでない

hanami new コマンドは application_layout_spec.rb を自動生成し、レイアウトクラスの単体テストのボイラープレートを用意してくれる。しかし実はこれは private API に依存しているとのこと。 github.com 具体的なエラー発生ケースはこう。まずこれが自動…

Rack::Session::Cookie と Secure 属性

hanami にセッション管理を導入しようとしている。デフォルトでは Rack::Session::Cookie を使って cookie にセッションキーを格納する ことになっている。ちょうど先日、 Real World HTTP を読んで cookie の仕組みを復習したところだったので、 Rack がそ…

認証系 gem から知った BCrypt のこと

認証系の機能を持った gem を調べていた。見ていると多くの gem がパスワードのハッシュ化を BCrypt で実装している。きっと BCrypt ならば安心という一般的な合意があるのだろうとだけ推測して、あまり深入りはしなかった。 これだけであればただのつぶやき…

hanami の Getting Started をやった

表題通り、公式ガイドが提供しているハンズオンをやってみた。 guides.hanamirb.org 書かれていることをひととおりなぞったに過ぎなく、批評的に何かを語ることはまだできないけれど、アークテクチャの単純明快な美しさには心を揺さぶられた。明確な責務を与…

hanami をやることにした

自分の軸となる技術としての Ruby をさらに磨きたいという気持ちが強まっている。なにせ時間だけはあるから、これまでなかなか取り組めていなかったテーマに腰を据えて組み合ってみようかと思っている。 で、やりたいこともそれはそれでいくつかあるのだが、…

オマカセからアラカルトへ

Ruby と Rails は明らかに自分の軸となる技術だ。そもそもこれらとの出会いがなければ僕はエンジニアになっていなかった。人生を変えてくれた技術であるとも言える。ただ、知れば知るほどに別の技術に目移りし始めてしまっていたのも事実。 あれやこれやの言…

Ruby は 64-bit より大きい整数値をどう扱っているか?

先週末の AtCoder ABC169 B の問題で、long long 型の整数をオーバーフローさせてしまった。しかもそれに気づけずにだいぶつまずいてしまった。 atcoder.jp Ruby や Python であれば意識せず扱える部分であっただけに悔しさがある一方で、こうも思った。 Rub…