pockestrap

Programmer's memo

Programming

Kaigi on Rails 2021 で登壇しました

先日Kaigi on Rails 2021で、Cache on Railsというテーマで登壇しました。 参加者としての感想は雑に日記に書きましたので、この記事では登壇者としての感想を書きます。 各種資料 スライド スピーカーノートを開くと(ほぼ完全な)トークスクリプトもついてい…

RubyKaigi Takeout 2021 に登壇した

RubyKaigi Takeout 2021 に登壇しました。 rubykaigi.org スライドはこちら。 docs.google.com 今回は、Ruby 3.1に向けてRBSはどのような機能追加を予定しているのか、という話をしました。私が最近開発しているrbs collectionコマンドを中心に据えて、souta…

Rails 7で導入される invert_where メソッドが危険そうだったので調べた

この記事は現時点(2021-04-28)のrails/railsのmainブランチの最新のコミットでテストしています。 TL;DR invert_whereはすべてのwhereをinvertする 使い方によっては意図しない条件をinvertして危険 invert_whereとは invert_whereは、Rails 7でActiveRecord…

Rubyで数値を 123_456_789 のように表示する

irbで3桁区切りで _ を入れて数値を表示するようにしてみた pic.twitter.com/CrPxSIiaqE— Pocke(ぽっけ) (@p_ck_) 2021年4月9日 twitter.com デバッグなどをしていて、数値が区切り無しで出力されると読みづらいため、_をはさんでみた。 Rubyでは数値リテラ…

RBSではRubyと定数探索がちょっとだけ違う

ほとんど一緒なので気にすることはあまりないとは思います。 タイトル通り、RBSとRubyでは定数探索がちょっとだけ違います。 具体的にはスーパークラスやinclude元のモジュールで定義された定数がRBSでは参照できません。 Rubyの場合 まずはRubyの場合の挙動…

RBS基礎文法最速マスター

RBSはRuby 3に組み込まれた、Rubyの型情報を記述する言語です。 この記事ではRBSの文法を駆け足で紹介します。 細かい話は飛ばしますが、この記事を読めば大体のケースでRBSを読み書きできるようになると思います。 事前準備 インストール まずは文法の前に…

2020年に作ったGitHubリポジトリ

年末なので、今年GitHubに作ったリポジトリを振り返ってみます。 このリストは次の記事のコードを使って生成しました。(記事は去年のものだけど、今年実行しても動くはず) pocke.hatenablog.com 今年は15個のリポジトリを作りました。去年の31個より減ってる…

RBSではmoduleのinclude先としてinclude先のクラスを指定してはいけない

タイトルを読んでも何を言っているのかわからないと思いますが、モジュールをincludeしようとするとRBS::RecursiveAncestorErrorが発生することがあります。 とくにObjectクラスにincludeするようなケースでは注意が必要です。 この記事ではrbs gem v1.0.0で…

RBS Railsを使ってRailsアプリケーションにSteepを導入する

RBS Railsを使ってRailsアプリケーションにSteepを導入するまでの解説します。 ただしこの「導入できる」というのは、解析が完走するという意味です。 型エラーを全てつぶすことや、Steepを実際の開発フローに乗っけることは私もまだできていないため、この…

OpenStructに信頼できない値を渡してはいけない

新しいOpenStructに信頼できない値を渡すと、GCされないシンボルが作成されメモリが使いつくされる可能性があります。 対象のバージョン 対象となるostruct gemのバージョンは、0.3.0かそれ以上です。 Ruby 3.0にはostructのバージョン0.3.1が添付されている…

RubyからRBSを生成する各方法の特徴

この記事はRuby 3.0 Advent Calendar 18日目の記事です。 qiita.com 昨日の記事は id:Pocke さんで「ruby/rbsに取り込まれた私のパッチ」でした。 pocke.hatenablog.com この記事ではRuby 3で導入される型定義ファイルであるRBSファイルを自動生成する方法に…

ruby/rbsに取り込まれた私のパッチ

この記事はRuby 3.0 Advent Calendar 17日目の記事です。 qiita.com 昨日の記事は id:gamelinks007 さんで「C APIのヘッダーが分割された話」でした。 gamelinks007.hatenablog.com この記事では、Ruby 3に同梱されるrbsに対して私が書いたPull Requestを紹…

Active Recordのクエリの実行元の表示から、特定のパスを除外する

TL;DR ActiveRecord::LogSubscriber.backtrace_cleaner = Rails::BacktraceCleaner.new.tap do |c| c.add_silencer { |line| line.include?('path/to/meaningless/file.rb') } end Problem Active Recordにはクエリの実行元をログに表示する機能があります。…

Rails.cache.fetch_multi するGraphQL BatchのLoader

Rails.cache.fetch_multiするLoaderを書いてみた。 コードのライセンスはCC-0とするのでご自由にお使いください。 class RailsCacheLoader < GraphQL::Batch::Loader def initialize end # @param args [Array<[untyped, Proc]>] The first item is cache ke…

gemspecのfilesとtest_filesとはなんなのか

TL;DR test_filesは使わない。 files と test_files gemspecで指定するこれらの挙動を説明します。 files https://guides.rubygems.org/specification-reference/#files パッケージに含まれるファイルを指定します。 Gem::Specification.new do |s| s.files …

CircleCIでparallel_testsのruntime logを保存する

TL;DR # from .circleci/config.yml - restore_cache: name: 'parallel spec runtime log' keys: - parallel-spec-runtime-log-{{ .Environment.COMMON_CACHE_KEY }}-{{ .Branch }} - parallel-spec-runtime-log-{{ .Environment.COMMON_CACHE_KEY }}- - run…

Gemfileでバージョン指定している時にコメントを強制するRuboCopの設定

TL;DR Bundler/GemComment: Enabled: true OnlyFor: - git - github - version_specifiers 目的 私はGemfileではなるべくバージョンを指定せず、bundle updateによって常に最新のgemが使われることを意識しています。 # Gemfile # bad gem 'rubocop', '0.93.…

rbs_railsにRailsの型を取り込む手順 2020-07-16版

なんか色々がちゃがちゃやっていて面白いので、メモしておく。 rbs_rails とは github.com Rails で RBS (Rubyの型定義ファイル)を扱うためのライブラリ。 「rbs_rails に Rails の型を取り込む」とは rbs_rails には2つの機能がある。 1つは、ユーザーの書…

Rubyの日本語リファレンスマニュアルに、英語のページが現れるようになります

こんにちは。ruremaメンバーの id:Pocke です。 Rubyの日本語リファレンスマニュアルで、未翻訳の英語のドキュメントが公開されるようになりました。 この記事では、それについて簡単に解説します。 何が変わるのか 今までは、未訳のメソッドは日本語リファ…

rbs cli

github.com RBSというRubyの型のためのソフトウェアがあり、RBSはrbsコマンドを含んでいる。 このコマンドは、.rbsファイル(Rubyの型定義ファイル)を書いていく上で必要になる。 この記事では、そのrbsコマンドの各サブコマンドについて、簡単に解説する。 r…

Ovtoでコンポーネントに閉じたStateを作る

結論 実装に無理があるので、OpalからReactを使いたい。 これ何 Ovtoはhyperappをベースにしている。Ovtoではstateはappに対して1つのツリーしかない。 つまり、各コンポーネントに閉じたstateを持つことはできず、全てはグローバルなstateを触ることになる…

GraphQL Rubyで起きたエラーをSentryにいい感じに通知する

GraphQL Rubyで定義したスキーマの実行中に起きたエラーをいい感じに通知するようにしたので、それを紹介します。 Problem GraphQL Rubyで定義したスキーマのフィールドのresolve中にエラーが起きた場合、Rubyレベルのバックトレースはあまり当てになりませ…

Action Mailerのpreview機能を使って、Railsアプリケーションから送るメールを一覧するページを作った

ある時「アプリケーションがどういうタイミングでどういうメールを送るか、エンジニア以外も把握したい」という要望が社内で上がりました。 これはもっともな要望で、アプリケーションがどういうメールを送っているのか分からずユーザーサポートするのはしん…

CircleCIの実行を速くした

先週仕事でやったのをメモします。 CI力が低いので、記事を公開することでツッコミをもらうのが目的です。 モチベーション 弊社ではCIの実行が1回あたり20分ほどかかっています。 これはわりとストレスなので速くしたいです。幸いにも削れそうなところが2つ…

Rails/UniqueValidationWithoutIndex copを追加した

rubocop-rails にRails/UniqueValidationWithoutIndex copを追加しました。 rubocop-railsの次期リリース(おそらくv2.5.0)から利用できます。 github.com これはなに Rails/UniqueValidationWithoutIndex copは、RDBMSのunique indexがついていないカラムに…

RubotyでSKIコンビネータ計算する

RubotyはRubyで書かれたチャットボットフレームワークです。 github.com RubotyはRubyでプラグインを実装して拡張できます。つまりRubyでできることはRubotyでできます。便利ですね。 ということでRubotyでSKIコンビネータ計算をしてみました。 しかし、Ruby…

毎日日記を書く技術

最近、 https://commits.hatenablog.com で毎日日記を書いている。 この毎日というのは一日も欠かさずという意味で、実際日記を書き始めた2019-12-17から一日も欠かさずに続けている。1 これを続けるために2つ工夫していることがあるので紹介したい。1つは仕…

2019年に作ったGitHubリポジトリ

年末なので、今年GitHubに作ったリポジトリを振り返ってみます。 このリストは次の記事のコードを使って生成しました。 pocke.hatenablog.com リポジトリたち 今年は31個のリポジトリを作りました。 下に行くほど新しいリポジトリです https://github.com/po…

Kernel.#systemの型はむずかしい

adventar.org この記事は ruby-signature advent calendar 23日目の記事です。 今日が祝日じゃないと今月に入ってから知りました。 私はruby-signatureにKernel.#systemメソッドの型を修正するPRを出しました。 https://github.com/ruby/ruby-signature/pull…

rubocop-rubycwとは

github.com TL;DR ruby -cw をRuboCopのインターフェイスで扱うためのgem ruby -cwとは rubyのコマンドラインオプション。 -cを付けると、Rubyはコードを実行せず、構文のチェックのみを行う。 -c check syntax only -wを付けると、Rubyは見つけた警告をすべ…