Ruby

Rubyのパターンマッチを使ってMarkdownからコードブロックを抜き出す

Rubyのパターンマッチを使って、(GitHub Flavored) Markdownのテキストからコードブロックを抜き出す。次のようなテキストを考える。 # Ruby ## hello world Rubyでは次のようにhello worldします。 ```ruby puts 'hello world' ``` ``` これはRubyではあり…

Railsアプリのテスト実行時に特定の警告だけを例外に変換する

今後役立つのかわからないがRuby 2.7→3.xアップデートのときに使った方法のメモ。 Warning[:deprecated] = true すると表示される非推奨警告を発生させるコードがRailsアプリに含まれないように、テスト実行時だけこのような警告をあらかじめエラーに変換で…

Gemfile.lockをもとに特定のバージョンのRubyで利用できないgemの一覧を出す

Railsアプリなど、Bundlerでgemの依存管理をしているプロジェクトでRubyのアップデートをしようとするとき、不幸なことにgemが全体的に古いことがある。 また、gemspecでrequired_ruby_versionというメタデータでRubyのバージョンの範囲を設定していると、そ…

既存のgemにRBSで型定義を書く

RBSの練習としてhatenablogというgemの型定義をRBSで書いた。 https://github.com/kymmt90/hatenablog/blob/v0.8.0/sig/hatenablog.rbs まだ該当gemのsigディレクトリに置いているだけだが、やったことを書いておく。 作業の流れ Ruby 3.0をインストールする…

Rack::Timeoutによるリクエストタイムアウトの仕組み

はじめに Rackミドルウェアの一つであるRack::Timeoutを使うと、Rackアプリがリクエストを受け取ってから一定時間が経過すると、アプリのどの場所でコードが実行されていても、その場所からRack::Timeoutの例外RequestTimeoutExceptionが発生する。 サンプル…

APIスロットリングの実現方法

ある期間でのあるWeb APIに対するアクセス回数上限を与えたときのスロットリングについて、一例ではあるがRack::Attack (v6.3.1)で採用されているしくみについて調べた。 ここでは、ある期間において特定のクライアントからのアクセスを一定回数以下に制限す…

graphql-guardとポリシーオブジェクトをgraphql-ruby 1.8で使うための方法

これの続きです。 blog.kymmt.com 問題 graphql-guardはインラインでポリシーを書く方法の他に、ポリシーオブジェクトを定義して GraphQL::Guard.new に渡すという方法があります。使いかたはREADMEに書いてあるとおりです。 class GraphqlPolicy RULES = { …

graphql-guardをgraphql-ruby 1.8で使うためのある方法

問題 graphql-ruby 1.8ではclass-based APIが導入されました。フィールド定義は型を表すクラスのコンテキストでクラスメソッド field を呼ぶ形で定義します。 class Types::Query < Types::BaseObject field :viewer, Types::User, null: true def viewer co…

Yokohama.rb Monthly Meetup #88 に参加した

2018-02-17(月)のYokohama.rb Monthly Meetup #88 参加メモです。 yokohamarb.doorkeeper.jp Rubyレシピブック 気づいたら第11章「オブジェクトとメタプログラミング」に入っていました。 273: オブジェクトが同じか調べる 274: オブジェクトを複製する 27…

dry-containerとdry-auto_injectでDIコンテナを作る

dry-rbファミリーのdry-containerとdry-auto_injectを使うと、POROの組み合わせでDIが実現できます。 DIについてハイパーざっくり理解を得るには次の記事を読めばよいです。 qiita.com 上の記事の中のDIコンテナを適用したコードをdry-containerとdry-auto_i…

Yokohama.rb Monthly Meetup #85 に参加した

2017-11-11(土)のYokohama.rb Monthly Meetup #85メモです。 yokohamarb.doorkeeper.jp Rubyレシピブック @igrepさんと、第10章の「Webプログラミング」の続きで次のレシピを読みました。 265: クッキーを処理する 266: セッションを使用する cgiとRackを…

Yokohama.rb Monthly Meetup #84 に参加した

2017-09-09(土)のYokohama.rb Monthly Meetup #84参加のメモです。 yokohamarb.doorkeeper.jp Rubyレシピブック 今回から最終章のひとつ手前、第10章の「Webプログラミング」に入りました。次のレシピを読みました。 261: RSSを扱う 262: Rackを使う 263: …

GraphQL::Batchのサンプルコードを読む & 使ってみる

単純にGraphQLクエリを投げると、サーバサイドでの関連を含むレコード取得時にN+1問題が発生することがあります。こういうケースでは、複数のデータ取得リクエストをひとまとめにして、単一のリクエストとしてDBからデータを取得するbatchingが推奨されてい…

Yokohama.rb Monthly Meetup #82に参加した

2017-07-08(土)のYokohama.rb Monthly Meetup #82参加メモです。 yokohamarb.doorkeeper.jp Rubyレシピブック レシピ257から260まででした*1。259, 260についてメモ。 259: リモートホストが稼働していることを確認する リモートホストが動いているかを確…

Yokohama.rb Monthly Meetup #81に参加した

2017-06-10(土)のYokohama.rb Monthly Meetup #81参加メモです。 yokohamarb.doorkeeper.jp 3月の#78も参加していたのにメモを書いていなかったので、久しぶり感あります。 Rubyレシピブック レシピ254から256まで。HTTP, SMTP, FTPというプロトコル3連発…

Yokohama.rb Monthly Meetup #76 に参加した

2017-01-14(土)の Yokohama.rb Monthly Meetup #76 に参加したので、メモを書きます。1 週間たってしまった。 yokohamarb.doorkeeper.jp Ruby レシピブック 今回はレシピ 244 から 247 まで読みました。システム寄りの話題が中心です。 レシピ 244 スレッ…

Yokohama.rb Monthly Meetup #75 に参加した

2016-12-10(土)の Yokohama.rb Monthly Meetup #75 に参加しました。 yokohamarb.doorkeeper.jp 次の流れでした。 前半は Ruby レシピブック読書会 後半は LT 今回は、参加者の @Nabetani さんがすでにメモを書いてくださっています。僕もメモしておきます…

Ruby (on Rails) で使える enumeration 実装を比較してみた

こんにちは、GMO ペパボの人間です。これは pepabo Advent Calendar 2016 の 9 日目の記事です。 昨日は我らが CTL けんちゃんくんさんの 「gemビルドしようとして The validation error was 'yourgem-x.y.z contains itself (yourgem-x.y.z.gem), check you…

Ruby のテストカバレッジを Travis CI から Code Climate へ POST する方法が変わっていた

Travis CI 上で Rubygems のテストを実行して、テストカバレッジの集計結果を Code Climate へ POST するときにエラーが発生していたので、解決方法をメモしておきます。 エラー /home/travis/.rvm/rubies/ruby-2.0.0-p598/bin/ruby -I"lib:test" -I"/home/t…

hatenablog gem 0.5.0 をリリースした

Rubygem の hatenablog 0.5.0 をリリースしました。 github.com アップデート Hatenablog::Client.new にブロックを渡すことで認証情報を設定できるようにしました。 client = Hatenablog::Client.new do |config| config.consumer_key = '<consumer key>' config.consumer</consumer>…

Yokohama.rb Monthly Meetup #74 に参加した

2016-11-12(土)の Yokohama.rb Monthly Meetup #74 に参加しました。 yokohamarb.doorkeeper.jp 前半は Ruby レシピブック読書会 後半は LT という 7 月以来の流れでした。 レシピブック 今回はいつもより 30 分短かったこともあって、レシピ 238, 239 だ…

Fukuoka.rb #66 に参加した

現在、会社の研修で福岡に来ています。福岡には、地域 Ruby コミュニティとして Ruby コミッタの nagachika さんや弊社の udzura さんが主催されている Fukuoka.rb があります。今回、udzura さんに誘っていただき、10/12(水)に福岡・天神のグルーブノーツ…

hatenablog gem 0.4.0 をリリースした

Rubygem の hatenablog 0.4.0 をリリースしました。今回追加したのは Basic 認証ではてなブログの API を使えるようにする機能です。 github.com PR ありがとうございます! Basic 認証による利用方法 はてな API で Basic 認証による操作認可を得るには、AP…

読書メーター→ブクログ移行用スクリプトを書いた

読書メーターからブクログへ宗旨替えすることにしたので、データを移行したい気持ちになりました。 幸い、ブクログには CSV データによる読書データのインポート機能が備わっていたことと、私が以前読書メーターのスクレイピング gem である bookmeter_scrap…

hatenablog-writer 0.1.1 と hatenablog 0.3.0

今月は自分の gem にいくつか PR をいただいて新バージョンをリリースしました。PR をくださった方々、ありがとうございました。 hatenablog-writer 0.1.1 hatenablog-writer は CLI からはてなブログに投稿できるツールです。作ったきりほったらかしていた…

Ruby で順列の列挙を実装する

最近いろいろな人が次の本をやっているのを見かけるので、気になって読み進めてみています。 プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問作者: 増井敏克出版社/メーカー: 翔泳社発売日: 2015/10/14メディア: 単行本(ソフ…

Yokohama.rb Monthly Meetup #71 に参加した

2016-08-06(土)の Yokohama.rb Monthly Meetup #71 に参加しました。 yokohamarb.doorkeeper.jp 前半はもくもく会 後半は LT 2 本 吉田飯店で懇親会 という流れでした。今回も初参加の方が 2 名いらっしゃいました。 もくもく会 僕は次のようなことをやっ…

Itamae + Vagrant でステージング環境を構築しようとしている

ここ数日、構成管理ツールの練習と自作の Rails アプリケーションを本番に近い環境で動かせるようにすることを兼ねて、Itamae を使って Vagrant 上にステージング環境を作ろうとしています。 とりあえず、Rails で構築した自分の web サイトである kymmt.com…

Yokohama.rb Monthly Meetup #70 に参加した

2016-07-09(土)の Yokohama.rb Monthly Meetup #70 に参加しました。 yokohamarb.doorkeeper.jp 参加者は 8 人。内容は次のような感じでした。 レシピブック読書会 どう書く 吉田飯店で懇親会 レシピブック読書会 今回はレシピ 234 から 237 まで読みまし…

Yokohama.rb Monthly Meetup #69 に参加した

6/11(日)の Yokohama.rb Monthly Meetup #69 に参加しました。3 回目ぐらいです。 yokohamarb.doorkeeper.jp 今回は初参加の方が 4 人ほどいて、そのなかにはプログラミング始めたての学生の方もいました。行動力! 内容は次のような感じでした。 レシピブ…