ユユユユユ

webエンジニアです

Ruby

`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…