最近ブログで写真をたくさん使うので書いた。
#!/usr/bin/env ruby
dir = ARGV[0]
Dir.chdir(dir) do
system "mogrify -format jpg *.HEIC"
system "rm -f *.HEIC"
system "mogrify -path '#{dir}' -resize 1920x1920 -quality 90 -auto-level -normalize '#{dir}/*'"
end
最近ブログで写真をたくさん使うので書いた。
#!/usr/bin/env ruby
dir = ARGV[0]
Dir.chdir(dir) do
system "mogrify -format jpg *.HEIC"
system "rm -f *.HEIC"
system "mogrify -path '#{dir}' -resize 1920x1920 -quality 90 -auto-level -normalize '#{dir}/*'"
end
千歳烏山.rb #01 - connpassに参加してきました。
地元に地域rbが出現するなんて嬉しい。
初回になる今回はもくもく会をしてその後飲み会という感じでした。もくもくも、まとまった時間あったらやりたいな〜と思ってたことを持っていったらすごくはかどったので充実度が高かったです。
飲み会も普段ご飯を食べにいってる場所っていうのが不思議な感じ。
家が50mぐらいしか離れてない方がいてご飯屋さんの情報交換で盛り上がったり、いろんな方とお話しできて楽しかったです。 歩いて帰れる飲み会最高!ということで少し飲み過ぎたかもしれません🤭
主催してくださったたわらさんや参加者の皆さんありがとうございました。
2回目も行きたかったですが、RubyConf Taiwanの翌日なので移動中で参加できなさそう。
千歳烏山在住でなくても参加されている方はたくさんいたので、京王線沿線の方などは急行が止まるし、アクセスしやすくていいかもしれません。行ける方はぜひご参加を〜。
bundle2.2からか対応platformが細かくなった。
arm64-darwin-22
arm64-darwin-23
x86_64-darwin-21
x86_64-darwin-22
x86_64-linux
こんな感じでosのバージョン毎に追加してくのは辛い。みんなどうやってるのかなと思ってSlackのruby-jpのsupportチャンネルで質問させてもらいました。
gohさん、kojix2さんに教えていただきました。ありがとうございます。
結論から言うとこう言う感じで良さそう。
PLATFORMS
universal-darwin
x86_64-linux
mac関連は全部universal-darwin
でOK。CIや本番環境、WSL2の人用にはx86_64-linux
でOK。
brewでmacのpostgresを14にアップグレードした際にpgを使ってるrailsが立ち上がらなくなった。(M1 Macです)
/Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require': dlopen(/Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/pg-1.4.4/lib/pg_ext.bundle, 0x0009): Library not loaded: /opt/homebrew/opt/postgresql/lib/libpq.5.dylib (LoadError)
Referenced from: /Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/pg-1.4.4/lib/pg_ext.bundle
Reason: tried: '/opt/homebrew/opt/postgresql/lib/libpq.5.dylib' (no such file), '/usr/local/lib/libpq.5.dylib' (no such file), '/usr/lib/libpq.5.dylib' (no such file), '/opt/homebrew/Cellar/postgresql@14/14.5_5/lib/libpq.5.dylib' (no such file), '/usr/local/lib/libpq.5.dylib' (no such file), '/usr/lib/libpq.5.dylib' (no such file) - /Users/komagata/go/src/github.com/fjordllc/bootcamp/vendor/bundle/ruby/3.1.0/gems/pg-1.4.4/lib/pg_ext.bundle
/
opt/
homebrew/
opt/
postgresql/
lib/
postgresql@14/
libpq.5.dylib <- 有る
libpq.5.dylib <- 無い
/opt/homebrew/opt/postgresql/lib
の中にはlibpq.5.dylib
が無くてpostgresql@14
ってディレクトリの中にある。なんかシンボリックリンク作成やコピーのミスのような雰囲気がするけど、とにかくライブラリの位置が変わってるっぽい。
とりあえずシンボリックリンクを貼ったら動いた。HomebrewのFormulaのreposを覗いてみたけどちょっとよくわからなかった。
$ ln -s /opt/homebrew/opt/postgresql/lib/postgresql@14/libpq.5.dylib /opt/homebrew/opt/postgresql/lib/libpq.5.dylib
abstract_notifierで通知を実装する - komagataのブログ
ここでminitestでのテストが書きづらいのでPRするって書いてましたが、それがマージされたバージョン0.3.2がリリースされました。
READMEに書いてありますがminitestではこういうふうに書くといい感じです。
require 'abstract_notifier/testing/minitest'
class EventsNotifierTestCase < Minitest::Test
include AbstractNotifier::TestHelper
test 'canceled' do
assert_notifications_sent 1, identify: "123", body: "Alarma!" do
EventsNotifier.with(profile: profile).canceled(event).notify_now
end
assert_notifications_enqueued 1, identify: "123", body: "Alarma!" do
EventsNotifier.with(profile: profile).canceled(event).notify_later
end
end
end
最近のrailsでのパスワード認証gemって何使ってます?
The Ruby Tool BoxのWeb Authentiationカテゴリーを参照。
やってくれることは多いがカスタマイズしづらいので嫌う人も多い。俺はこれ使ってる。 しかし登場から時間が経ち、railsの仕様に追従していくにつれて初期の設計に無理がきてる感。特にrails7からはさらに。
やってくれることは少ないが、カスタマイズしやすい。bootcampのアプリはこれを使ってる。(確か @hrysd が入れた) リニューアル版sorcery(sorcery-rework)が別リポジトリで進んでるが、当分完成しそうにな。
使ったことないけどちょっと古い感?
使ったことないけどちょっと古い感2
これが多いのかも?
個人的には認証などのセキュリティが大きく絡むところはなるべくgemなどみんなが見ている(セキュリティパッチがすぐ入りやすい)ところのを使いたいな〜と思っております。
みなさんのプロジェクトではどんな感じでしょう? 温度感が知りたい感。
railsの6系最新(6.1.4.4)とrubyの最新(3.1.0)にアップグレードするときに対応してないgemにPRを送る作業をやっています。
https://github.com/fjordllc/bootcamp/pull/4101
pgのwarningが残ってる。(こういうところも粘り強く対応できるようになっていきたい)
https://github.com/fjordllc/bootcamp/pull/4108
@ima1zumiさんが3.0.2にアップデートする作業を初めてくれて、そこに乗る形でやりとりさせていただいてました。3.0.3だと起きるけど3.1.0では起きない問題があったので一気に上げちゃう方針に。こういうところも粘り強く(略
おかげでCI通ったようなのであと一歩。
https://github.com/hayfever/sorcery-jwt/pull/14
sorcery-jwtはdependencyの設定を変えないと最新のsorceryで使うことができない。sorcery-jwt自体、リニューアル後(予定)の新sorceryではcore pluginになる予定だそうで、こちらのgemをもうupdateする気はないのかもしれない。とりあえずforkして対応してるけど、メールを送ってみる予定。
https://github.com/kenn/active_flag/pull/19
これはbundlerのバージョンによるものだった。
ruby 3.1.0にできたら次はrails 7.0.1に上げる作業をやる予定。こっちも色々PRに必要になるでしょう。
ActiveFlagのテストでrequire 'set'
が必要かもという問題。
人によって結果が違うのなぜかな〜という状態だったんですが、(実行していただいた方々ありがとうございます)
これ俺の環境だけのせいかも?(エラー出るの俺だけかも?)もしどなたか試してみていただけるとありがたいです〜。 https://t.co/YTmgFA49jR
— Masaki Komagata (@komagata) January 30, 2022
bundler 2.2.8でrequire 'set'
がなくなったのが原因だそうです。
https://github.com/kenn/active_flag/pull/19#issuecomment-1025093171
この行。
ほぼ標準といえるようなgemから依存がなくなるとこういうことが起きるんですね。setについて他のライブラリでも似たようなこと起きてるかもしれません。環境を示すときはbundlerのバージョンも示した方がいいんだなと勉強になりました。
フィヨルドブートキャンプではチャットをSlackからDiscordに移行しようとしています。
DiscordにはSlackのようなReminder機能がメジャーなBotの中には無いので定期的なミーティングのリマインドを簡単に移行することができません。
有名なreminder-botでは「72時間おきにリマインド」のような単純Interval形式しか対応してません。「毎月1日の9時にリマインド」のようなことができないので困ってました。
ブートキャンプでは現在リマインドすべきものは3つしかなく、SlackのようなReminder Botを僕が作るのも面倒なのでCloud Functionsでやってみました。
Cloud Scheduler -> Pub/Sub -> Cloud Functions -> Discord
Cloud Schedulerでcronと同じインターフェースで時間を指定できるのでjobを作ります。
ターゲットにはHTTPを指定してリクエストを飛ばしたりもできますが、Pub/Subも指定できます。
Pub/Subはややこしいかと思ってたんですが単に名前決めて作るだけでした。
Cloud FunctionsではPub/Subで作ったイベントをSubscriptionしてそのタイミングで実行できます。
require 'functions_framework'
require 'net/http'
require 'json'
FunctionsFramework.cloud_event 'reminder_sub' do |event|
uri = URI.parse(ENV['WEBHOOK_URL'])
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
params = { "content" => "💬 14:00からふりかえりミーティングが 🔈ミーティング チャンネルで始まります。" }
headers = { "Content-Type" => "application/json" }
http.post(uri.path, params.to_json, headers)
end
Discordの発言はwebhookにPOSTするだけです。Cloud Schedulerからpayloadに何か値を入れてれば上記のeventの中にそれが(base64でエンコードされて)入っているのでその内容を使って処理を分けたりもできます。(実際のコードでは3種類の通知をそれで出し分けてます。)
最初のテンプレにGemfileも含まれていて、gemを使うのも何にも苦労せずでした。
Cloud Functionsは高度な用途もありますが、こういうふうに週1回しか動かないクソちょっとしたプログラムを動かすにも安くていいなと思います。
(ハライチ感)
Foo.configure do |config|
config.name = "foo"
config.email = "foo@example.com"
end
こっちでもかけたりする。
Foo.config.name = "foo"
Foo.config.email = "foo@example.com"
こういうやつ。
実装は大体こういう感じになってる。
module Foo
class << self
def configure
yield config
end
def config
@_config ||= Config.new
end
end
class Config
attr_accessor :name, :email
def initialize
@name = "no name"
@email = "default@example.com"
end
end
end
これrubyでよくあるけど(他の言語であんま見ない)これなんて呼ぶのがいいのかな?
フィヨルドブートキャンプで説明する時にこれを表現したくても
「blockで設定するやつ」
としか言えない。
「なんでこれで設定できるんですか?」
と言われても、口で説明するのが大変なのでここに置いておきます。