スレッドセーフでない Dir.chdir の使用を RuboCop で禁止する

週刊Railsウォッチ(20200225前編)RubyのShellwordsライブラリは知っておくべき、VCRはやはり有能、copを自作、Hix on Rails記事ほか|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社 RuboCopでコードレビュー支援: Net::HTTPを使わせないcop(Hacklines より) そういえば以前業務で似たことをやったので、メモがてら置いておきます。 Dir.chdir はスレッドセーフではない Sidekiq で Dir.chdir を使ったら、他のジョブと干渉してハマりました。 Feature #9785: Feature Proposal: Dir.chdir Thread Safety - Ruby master - Ruby Issue Tracking System ↑ こちらの Issue を見つけるまで、Dir.chdir がスレッドセーフでないことを知りませんでした。Dir.chdir はプロセス全体の working directory を変えてしまうようです。裏側を想像するに仕方がない気はしますが、ruby のドキュメントには書いてないです。 今後レビューで指摘し続けるのも大変なので、RuboCop の custom cop で解決できないか検討しました。 RuboCop の custom cop は作成も導入も割と簡単だった とは言え、rubocop-rspec みたいな gem を作るのは大げさです。 調べたところ、gem を作らずに、簡単に自作の custom cop を導入することが出来ました。 ruby 付属の ruby-parse コマンドで AST(抽象構文木)を得ることが出来ます。 $ ruby-parse -e 'Dir.chdir' (send (const nil :Dir) :chdir) $ ruby-parse -e 'hoge ?...

2020-02-25 (Tue) · masutaka

Heroku 上での bundler version の決められ方

Ruby apps will now have the BUNDLED WITH declaration in their Gemfile.lock removed after detecting Bundler version|Heroku Dev Center このアナウンスがあったので、調べてツイートした。ブログにも貼っておく。 loading... アナウンスの内容要約 Gemfile.lock の ‘BUNDLED WITH’ には問題があるから、Heroku では bundler version の決定(v1 or v2)に使った後、‘BUNDLED WITH’ は削除してからデプロイするよとのこと。 Heroku というより heroku-buildpack-ruby の話ね。 heroku-buildpack-ruby の処理 LanguagePack::Ruby#install_bundler_in_app から呼ばれるここで bundler v1 か v2 かを判別。 https://github.com/heroku/heroku-buildpack-ruby/blob/v207/lib/language_pack/helpers/bundler_wrapper.rb#L183-L192 下の LanguagePack::Helpers::BundlerWrapper#detect_bundler_version_and_dir_name! で、v1 なら 1.17.3、v2 なら v2.0.2 だと決定していた。 https://github.com/heroku/heroku-buildpack-ruby/blob/v207/lib/language_pack/helpers/bundler_wrapper.rb#L194-L204 その後の LanguagePack::Ruby#build_bundler で ‘BUNDLED WITH’ ブロックをゴリッと削除。 https://github.com/heroku/heroku-buildpack-ruby/blob/v207/lib/language_pack/ruby.rb#L788-L790 当該 PR Remove bundler version in Gemfile....

2019-12-17 (Tue) · masutaka

Ruby でライブラリがシステムに存在しているかどうかをチェックする

require 'mkmf' have_library('pq') checking for main() in -lpq... yes => true mkmf.rb を読んだところ、C++ のコードを生成してチェックしていた。 Kernel.have_library のコードはこちら。 カレントディレクトリに mkmf.log が作られるが、これを防止するには 以下で良いみたいだ。 MakeMakefile::Logging::logfile('/dev/null') ネット上には以下のコードがあったが、mkmf.rb を読んだら上でいけた。 MakeMakefile::Logging::logfile('/dev/null') module MakeMakefile module Logging @logfile = '/dev/null' end end 参考情報 instance method Kernel#have_library (Ruby 2.5.0) Module: MakeMakefile (Ruby 2.5.0)

2018-07-31 (Tue) · masutaka

Ruby で FTPS 接続する方法

まずは情報の整理から。 種類 暗号化なし 暗号化あり HTTP HTTP HTTPS FTP FTP FTPS 混乱しやすいが、SFTP は SSH を使って暗号化・認証を行うプロトコルで FTPS とは別。 ・HTTP のセキュア版が HTTPS ・FTP のセキュア版が FTPS と覚えると良いだろう。 サンプルコード FTP の SaaS である BrickFTP にアカウントを作った。 Net::FTP で接続可能。以下は FTPS 接続し、PWD を発行する Ruby コー ド。password はマスクしている。 #!/usr/bin/env ruby require 'net/ftp' ftps = Net::FTP.new( 'masutaka.brickftp.com', ssl: true, username: 'masutaka.net@gmail.com', password: '********', debug_mode: true, ) puts ftps.pwd 結果。 connect: masutaka.brickftp.com, 21 get: 220 Service ready for new user. put: AUTH TLS get: 234 Command AUTH okay; starting TLS connection....

2018-05-26 (Sat) · masutaka

github-nippou v3.0.0 released

v3.0.0 から出力フォーマットをカスタマイズ出来るようになりました。 @ryz310 に大感謝です! リリースノートは以下をどうぞ。 https://github.com/masutaka/github-nippou/releases/tag/v3.0.0 新しいサブコマンド init を実行すると、デフォルト設定 から新しい Gist を作り、その後はその設定が参照されます。 参考までに私の設定はこちら です。subject を h3 から h4 に変えている のと、GitHub ユーザ名をリンクにしています。 副作用として v2 と同じフォーマットでは出力できなくなりました。 ご不便をおかけしたらすみません。 他の機能としては以下になります。 ・新しいサブコマンド open-settings 前述の Gist URL をデフォルトブラウザで開きます。設定していなければ、 デフォルトの GitHub URL を開きます。 ・Docker サポート 依存 Gem が増えてきたので、Dockerize してみました。ラッパースクリ プト docker-github-nippou を介して使うと良いです。ただし、Launchy を使う関係で、サブコマンド open-settings は使えません。

2017-08-07 (Mon) · masutaka

GitHub Organization をメンテナンスするスクリプトを作った

成り行きで会社の GitHub Organization の管理者業をしています。 Organization 配下のリポジトリやユーザが増えてきて、気にかけるのが 大変になってきたので、メンテナンス用の Ruby スクリプトを作りました。 permission.rb 指定した Team パーミッションが付与されていないリポジトリを検索し、 Slack 通知する。実行しない曜日を設定可能。 tfa.rb 2FA を無効にしているユーザを検索し、Slack 通知する。無視ユーザや実 行しない曜日を設定可能。 こういった GitHub Organization の管理は、皆さんどうしているのだろう?

2017-05-28 (Sun) · masutaka

任意の Ruby オブジェクトを YAML として書く

実際使うことはないだろうがメモ。 hoge: !ruby/object:ActiveSupport::Duration value: 7776000 parts: - - :months - 3 結果 hoge を取り出すと、ActiveSupport::Duration としての 3 months が 格納されている。 $ irb -r active_support/time -r yaml -r erb irb(main):001:0> YAML.load(ERB.new(IO.read('hoge.yml')).result) => {"hoge"=>3 months} irb(main):002:0> YAML.load(ERB.new(IO.read('hoge.yml')).result)['hoge'] => 3 months irb(main):003:0> YAML.load(ERB.new(IO.read('hoge.yml')).result)['hoge'].class => ActiveSupport::Duration 求め方 irb(main):007:0> print YAML.dump(3.months) --- !ruby/object:ActiveSupport::Duration value: 7776000 parts: - - :months - 3 => nil 参考情報 library yaml (Ruby 2.3.0) Rubyist Magazine - プログラマーのための YAML 入門 (中級編)

2016-12-19 (Mon) · masutaka

Ruby の $ERROR_INFO などの特殊変数は require 'English' が必要だったのか

先日会社の tech channel で話題になったのでメモ。Rubiest の方々にとっ ては常識なんですかね…? $ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin15] $ ruby -e 'raise "aaa" rescue p $!' #<RuntimeError: aaa> $ ruby -e 'raise "aaa" rescue p $ERROR_INFO' nil $ ruby -r English -e 'raise "aaa" rescue p $ERROR_INFO' #<RuntimeError: aaa> Ruby はグローバル変数の初期値が nil なのがたちが悪い。個人的にはも う $ERROR_INFO とかは使わないと思う。 C: Prefer $ERROR_INFO from the stdlib ‘English’ module over $!. RuboCop 先生がこのようにお怒りだったので、出来るだけ長い変数名を使 うようにしていましたが、行間を読む必要があったみたいです。 => require ‘English’ も必要。...

2016-12-19 (Mon) · masutaka

bundle install で Your Gemfile.lock is corrupt. と怒られる件

個人のいくつかのリポジトリで bundle install できないことがあり、困っ ていました。 $ bundle install Fetching gem metadata from https://rubygems.org/............ Fetching version metadata from https://rubygems.org/. Resolving dependencies... Using rake 11.3.0 Using concurrent-ruby 1.0.2 Using i18n 0.7.0 Using thread_safe 0.3.5 Using net-ssh 3.2.0 Installing minitest 5.10.1 Your Gemfile.lock is corrupt. The following gem is missing from the DEPENDENCIES section: 'ffi' loading... 結論から言うと $ bundle install --without development で回避できま した(当該リポジトリでは development group は使っていなかった)。 今回は Gemfile に gem ‘ffi’ を追加して回避できました。bundler は最...

2016-12-10 (Sat) · masutaka

compare_linker v1.3.0 をリリースした

compare_linker | RubyGems.org | your community gem host 仕事やプライベートで、毎週自動 bundle update していますが、Gem に よっては GitHub の compare Link を作れませんでした。 人間が手動でリンクを作ってコメントするのが無駄な作業で、なんだか申 し訳なかったので修正してみました。これで GitHub に Git のタグがな い Gem 以外は救えるようになったはず。 出力フォーマットもシンプルになっています。 circle.yml とかで circleci-bundle-update-pr をインストール していれ ば、自動的に v1.3.0 の compare_linker が使われます。 @kyanny さんが作った頃のフォーマット v1.30 のフォーマット 変更内容はリリースノート に書いてあるとおりです。こんな変更をしました。 RubyGems の API から GitHub の URL が分からない Gem は data/rubygems.yml に GitHub のリポジトリ情報を書くことで回避。 例: https://rubygems.org/gems/capistrano Git の Tag が多すぎて、GitHub compare Link の生成に失敗すること があった件を修正。...

2016-10-09 (Sun) · masutaka