valid,invalid

関心を持てる事柄について

Ruby

『研鑽Rubyプログラミング』を読んだ

『研鑽Rubyプログラミング 実践的なコードのための原則とトレードオフ』を読んだ。ちょっとブームに乗り遅れたけどまぁ、本なんていつ読んでもいいものなので気にせず感想を書く。 研鑽Rubyプログラミング 実践的なコードのための原則とトレードオフ作者:Jer…

OpenAIのテキスト生成(GPT-3)APIをプログラムから呼び出す方法と料金

ChatGPTやDALL・E2で有名なOpenAIのAPIを呼び出す方法について*1。 一般的なWebサービスと大して変わらず、以下の2ステップで行う。 API Keyを取得 API Keyを用いてAPIを呼び出す 1. API Keyを取得 https://platform.openai.com/ からsign upし、 https://pl…

Kaigi on Railsに登壇します

2021-10-22 (土), 23 (日)に行われるKaigi on Railsに登壇します。 2日目の23日 13:50~14:20 の30分枠で "Safe Retry with Idempotency-Key Header" という題にて発表します。あと3週間ですね。 イベント参加はこちらから↓ kaigionrails.doorkeeper.jp 私の…

ISUCON11 ソロチームで参加して予選敗退しました

ISUCON11にソロチームBPM200で参加して予選敗退しました。 結果 最終スコア: 13458 最高スコア: 14484 使用言語: Ruby 去年↓よりは1人でも戦えた気がしたものの順位上の結果としては大差なく終わってしまい残念。 ohbarye.hatenablog.jp 使用したツール Vim …

NameError uninitialized constant ActiveStorage::Analyzer::ImageAnalyzer::MiniMagick

ActiveStorageで画像アップロードを行ったあとに非同期に実行される画像の解析処理で NameError ActiveStorage::AnalyzeJob uninitialized constant ActiveStorage::Analyzer::ImageAnalyzer::MiniMagick エラーが出た。 処理を行っているのはActiveStorage:…

ActiveRecordのgroupクエリの結果の件数取得、count vs size vs length添え

ActiveRecordでgroupクエリの結果の件数をスマートに取得したいだけ。 SELECT COUNT(*) FROM ( SELECT "users"."id" FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id" GROUP BY "users"."id" HAVING (count(1) > 5) ) 前提: count vs s…

Rack middlewareとスレッドセーフ

Rack Middleware で以下のようなイディオムを見かけることがあるが何のためにdupしているかを理解していなかったので調べてみた。 class MyMiddleware def call(env) dup._call(env) end def _call(env) # do whatever end end 結論 Rack middleware の inst…

壊れたルーティングを検出する route_mechanic gem と、その内部実装の話

壊れたルーティングの検出、routing specを自動化するroute_mechanic gem を作って公開しました。この gem の紹介と内部実装の話を書きます。 rubygems.org 背景 Rails 開発者のうちの N% は、Rails application のルーティングを検証するために以下のような…

Rubyでemojiとcodepointsの変換

emoji から codepoints に変換 "".unpack("U*") => [128077] "".codepoints => [128077] # Convert to hexadecimal "".each_codepoint.map {|n| n.to_s(16) } => ["1f44d"] codepoints から emoji に変換 [128077].pack("U*") => "" 0x1f44d.chr('UTF-8') =>…

rubocopのNaming/MethodParameterName, Naming/BlockParameterNameで警告の指摘箇所がずれているのを修正してみた

ActiveRecord Association Extensionとwith_optionsを併用するとrubocop-railsのRails/HasManyOrHasOneDependent警告が出るので修正してみた - valid,invalid でrubocopの中身に少し興味を持ったのでシュッと倒せそうなissueがないかを拙作の goofi で検索し…

ActiveRecord Association extensionsでメソッドを追加する

has_many*1にblockを渡すとassociationにメソッドを追加することができる。 class User < ActiveRecord::Base has_many :posts do def stats group(:status).count # このcontextで`self`は`ActiveRecord::Associations::CollectionProxy` # `proxy_associat…

Rails ActiveRecord 1ファイルで 新機能試す デバグ バグレポート 便利

(追記: 2021-03-21) 本家が提供しているテンプレートがあった…!! rails/active_record_main.rb at main · rails/rails · GitHub いつもググったり思い出したりしながら書いているのでメモしておく。 新機能触ったりデバグしたりバグレポートしたりするときに…

複数のDocker Compose YAMLをマージして1つにする

複数のdocker-compose.ymlをマージして1つのYAMLにする方法です。 複数のアプリケーションが協調して動くようなシステム*1を開発していて、各レポジトリにdocker-compose.ymlが存在している状況を想定します。 ローカルで複数アプリを協調して稼働させるには…

sentry-ravenでエラー通知するとrack envの中身が書き換わることがある

エラー検知・監視ツールであるところのSentryが提供するRubyのSDKにsentry-ravenというgemがあります。 このgemを利用するとごくわずかなコードの記述をするだけでSentryに対してイベントを送信することができます。イベントにはユーザーが定義したカスタム…

Sorbetのドキュメント読みつつ型付けの練習

仕事で利用しているライブラリがSorbetを使っており、sorbet-runtimeをupgradeするdependabotのpull requestsがバリバリ供給されてくるのでもう少し中身を知っておきたいと思って公式ドキュメントを拾い読みしたりしたメモと所感。 ドキュメントではStripe社…

ISUCON10 予選敗退した

ISUCON10にソロチームBPM200で参加し、最終スコア770で予選敗退しました。通過スコアには大きく届きませんでした。 戦略 ソロなので時間は絶対に足りない、という前提のもと予めフォーカスするポイントはある程度決めておきました。 大方針としてはなるべく1…

ISUCON9 予選の過去問で予選突破スコアを出すまで練習

ISUCON9 予選の過去問でNew Relicを使う - valid,invalidの続きです。 この記事は1台のVM上でベンチマーカーすべて含むstandalone構成のまま、予選突破スコアを超える12260点を出すまでにやったことのメモ。(ISUCON 9の予選突破スコアは9650点: 参照)過去…

ISUCON9 予選の過去問でNew Relicを使う

あとN+1回寝るとISUCONです。私はいま予選突破の夢を見つつNew Relicを素振っています。 本記事ではNew Relicの説明は特にしません。また、Rubyで実験しててちょっとハマったところを掘り下げたログが実はメインです。 (2020-07-22追記) 本記事を書いたとき…

既存のRESTish APIエンドポイントにOpenAPI定義を足していく試み

昨年、とあるアプリケーションのフロントエンドリニューアルプロジェクト*1の際に取り組んだ課題について書きます。Ruby, Railsの話が出てきますがRESTish APIの定義をどのように管理するか、API定義が存在しない既存アプリケーションにどのようにドキュメン…

『なるほどUnixプロセス』付録DのSpyglassを起動する (Ruby2.6.3, bundler1.17.2)

『なるほどUnixプロセス』付録D の「Spyglass」は触って学べるWebサーバー。同書で解説されているUnixプログラミングのテクニックを盛り込んでいる。 せっかくなので試そうと以下のコマンドにて起動を試みたが、起動しない。 # application's root dir $ spy…

macOSでirbのhistoryが使えなくなったときの対処法

あるmacOSでいつの間にか、irbのhistoryが使えなくなっていた。使えないとは、irbで矢印キーの↑を押すと制御文字 ^[[A が表示され、ENTERを押すとirbプロセスが終了するような状態。 $ irb irb(main):001:0> RUBY_VERSION => "2.6.0" irb(main):002:0> ^[[A …

Meguro.rb#19で『決済のトランザクション管理術』というタイトルでLTをしました

第19回 Meguro.rb に参加し、『決済のトランザクション管理術』というタイトルでLTをしました。 言い足りないことと反省 うーん、5分LTでやる内容じゃなかったかもしれないなぁと思っている。 だいぶ早口でザーッと喋ってようやく決済機能の開発に親しんでい…

gem install することなく Slim, Haml, Pug を HTML に変換する

Rails の view を React で書き直したときに使った脱 Slim のやり方 各種 gem を install して手元でコマンド叩いてもできるけど面倒くさい場合に使える 結論 converter - How can I convert html.slim files to html or html.erb? - Stack Overflow この回…

JavaScript が動作する Capybara の feature spec でブラウザのコンソールを確認する

結論 page.driver.browser.manage.logs.get(:browser) 調べた経緯 フォームの text input に対する fill が働かないのでどうしたかと思い、Selenium で操作中のブラウザをのぞいてみると React の component が一切 render されていなかった。 どこかで Java…

Rails で Slack のような Magic Link による認証を実装する

passwordless という gem が最近リリースされたようなので少し触ってみた。 名前の通り認証時にパスワードを必要とせず、いわゆる Magic Link によるログイン機構を Rails アプリケーションで実現できる。 Magic Link とは Slack や Medium が実装しているこ…

ag を使った複数行にわたる grep

既存コードで .all とかやっている場所を ag である程度まで*1洗い出そうと正規表現と格闘した。 ag 'users?(.where.+)?.all' みたいなので単一行のユースケースは良い感じに絞り込めたものの、メソッドチェーンしているやつ (multi line) が拾えないよと同…

automaildoc gem でメール一覧と文面を自動生成する

RSpec からメール一覧を自動生成する gem を書いてみた。 github.com 使い方 gem を install したのちコマンドラインから AUTOMAILDOC=1 rspec を走らせるとメールを一覧表示するHTMLを生成する。 名前も設計もほとんど autodoc を参考にしている。 背景・課…

Gem の install / uninstall フックの使い方

Git hook を手軽に管理できる husky の Ruby 版が欲しいかもと思い最近 rusky という gem を作っている。 github.com gem install 時に Git hook スクリプトを自動生成し、uninstall 時には勝手に消してくれる感じにしたい。そんなわけで gem のインストール…

bundle install を --jobs=N で高速化

公式に思いっきり書いてあったけど知らなかった。 --jobs=[<number>]: The maximum number of parallel download and install jobs. The default is 1. .zshrc にも突っ込んでおいた。</number>

Rails の cookie session をデコードする

staging のアプリケーションでのみ起こるバグを調査している折、どうやらセッションにちゃんと値をセットできていないぽいと気付いた。 そのアプリは cookie session を採用していたので簡単に暗号化された値は手に入ったが、これはどうやったらデコードでき…