松江Ruby会議09でRedmineについて発表してきた

松江Ruby会議のスタッフとして準備をしつつRedmineについて発表もしてきた。

Redmineの更新を楽にしたくてredmine_auditというプラグインを作った話をしたんだけど、Redmineどうでもいい人向けの情報も入れようとしたのが無駄だったかもしれない。Redmineの事だけ話せばよかったかも。

ところで自分はスライドたくさん書いてしまう人なんだけど、今回は15分で29枚だった。絵とかが多めだったりしたので多いけど多すぎというほどでもなかった(時間ややたりなかったけど)。そんな事を思ってたら懇親会でも「橋本さん、大人になりましたね」と冗談を言われてちょっとおもしろかった。

今日はMatsue.rb定例会だった

今日はMatsue.rb定例会だったので貯めてた作業を幾つかやっつけた。春が近づいてるのか人がたくさんだった。以下の作業をした(現時点ではまだいずれも取り込まれるかわかってない)。一方で今日はるりまの作業はお休みした。

最後のPRはちょっと気に入ってて、did_you_meanに手を入れて引数を間違えるArgumentError起こすと(わかる範囲で)正しいものを教えてくれるというもの。

require 'did_you_mean/experimental'

Dir.glob('*', 0, 1, 2)
# test.rb:n:in `glob': wrong number of arguments (given 4, expected 1..2) (ArgumentError)
# Did you mean?
#                  Dir.glob( pattern, [flags], [base: path] )
#                  Dir.glob( pattern, [flags], [base: path] ) { |filename| block }

Array.new(3, "foo", "bar")
# test.rb:n:in `initialize': wrong number of arguments (given 3, expected 0..2) (ArgumentError)
# Did you mean?
#                  Array.new(size=0, default=nil)
#                  Array.new(array)
#                  Array.new(size) {|index| block }

a = [1,2,3]
p a.slice(1, 2, 3)
# test.rb:n:in `slice': wrong number of arguments (given 3, expected 1..2) (ArgumentError)
# Did you mean?
#                  ary.slice(index)
#                  ary.slice(start, length)
#                  ary.slice(range)

実は前から欲しかったんだけど、どう実現しようかなと思ってたら @hanachin_さんのQiitaをみてひらめいたのでPRにしてみた。これはもしや沖縄Ruby会議効果でもあるのでは?などと思ったりもした。現時点だと少なくともCIに怒られてるのは直さないといけなさそうだけど...。

次回は4/21(土)の予定ですので松江近辺の人はよかったらどうぞ。

asdf触ってみた

RWCで範囲が広いrbenv的なやつ教えてもらったので隔離環境で試してみる。Python向けにpyenvとか手で入れるなら言語が増える度にそうなるので嫌だった。rbenvを捨てるかrubyプラグインを使わないかにしないといけないと教えて貰っていたが、1個に絞れるならrbenvである必要はない(というか中でrbenvもpyenvも呼ばれてるのかしら?)のでこれにする。

ぐぐりにくいので名前はひどいけど、anyenvだと `$ anyenv install rbenv` して `rbenv install` するみたいな流れになるので今知ってる範囲だとこちらの方が好ましい。Rubyは--HEADでruby-buildインストールしてるのでそれで困りそうだから本格的に移行はせずにまだ仮想環境だけだけど。

gitが入ってる状態で、READMEの通りにしてインストール。

$ sudo apt-get install -y automake autoconf libreadline-dev libncurses-dev libssl-dev libyaml-dev libxslt-dev libffi-dev libtool unixodbc-dev
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.0
$ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

シェルを再読み込みしてあとはRubyPythonを入れてみる。

$ asdf plugin-add ruby       # Ruby用のプラグインをインストール
$ asdf install ruby 2.4.2    # Ruby 2.4.2をインストール
$ asdf plugin-add python     # Python用のプラグインをインストール
$ asdf install python 2.7.14 # Python 2.7.14をインストール
$ asdf install python 3.6.3  # Python 3.6.3をインストール

使ってみる。

$ ruby -v
No version set for ruby
$ asdf global ruby 2.4.2
$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]

$ python -V
No version set for python
$ asdf global python 3.6.3
$ python -V
Python 3.6.3

以下を見るに、gem installした時も環境が汚れそうにない(/home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0にインストールされそう)。pipで同じ情報を見る方法がまだわからない。asdf plugin-updateすればプラグインの更新まではできそう。

$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.13
  - RUBY VERSION: 2.4.2 (2017-09-14 patchlevel 198) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0
  - USER INSTALLATION DIRECTORY: /home/vagrant/.gem/ruby/2.4.0
  - RUBY EXECUTABLE: /home/vagrant/.asdf/installs/ruby/2.4.2/bin/ruby
  - EXECUTABLE DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/bin
  - SPEC CACHE DIRECTORY: /home/vagrant/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /home/vagrant/.asdf/installs/ruby/2.4.2/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
    - /home/vagrant/.asdf/installs/ruby/2.4.2/lib/ruby/gems/2.4.0
    - /home/vagrant/.gem/ruby/2.4.0
    ...

以下がプラグインの保存先みたいだけど、このレポジトリを覗くにrbenvは使ってなさそう。

$ cd ~/.asdf/plugins/ruby/
$ git remote -v
origin	https://github.com/asdf-vm/asdf-ruby (fetch)
origin	https://github.com/asdf-vm/asdf-ruby (push)

$ git branch
* master

うーん、以下ら辺を見るに「このバージョンのRubyはこのURLな」とだけするからrc1とかも簡単に入りそうだけどそれは微妙だ。anyenvの方がいいかもしれない(使った事ないけどあっちはいまのところラッパーでない事だけがつらい)。branchを見たのはbranchによってオプションを指定する事ができるかもと思ってだけどそれ以前の話だった。

PRもIssueも見当たらないけど皆それでいいのかしら?(rbenvのruby-buildみたいにする事になると思うのだけど

とりあえず隔離環境でだけ使う事にしてもう少し詳しくなろう。でもanyenvにする気がする。

8/26(土)は Matsue.rb 定例会

8/26(土) 09:30〜17:00 に松江テルサ別館 2F で Matsue.rb の定例会をやります。87 回目の定例会でございます(募集ページをDoorkeeperに移したので久しぶりに書きました)。

はじめての方は(できればでいいので) PC をご用意くださいませ。m(_ _)m

Windowsでbcrypt gemを使うのに一癖あった

Windowsでbundle installで入ったbcryptを使おうとしたら以下のような感じで怒られた。

LoadError: cannot load such file -- bcrypt_ext
C:/.../config/application.rb:7:in `'
C:/.../Rakefile:4:in `require_relative'
...

確かにbcrypt_ext.soがないのでコンパイルされてなさそうだとコンパイル(DevKitが必要)。というか作っては削除し作っては削除しという稀有な環境なので一時的にインストールまでしてしまった。site-ruby以下にあると思うので、gem uninstallの時に注意しとこう。あるいは違うバージョン使う時とか。makeだけでもいい気もするけどそれで動くかは確認していない。

> cd \path\to\ruby\lib\ruby\gems\2.3.0\gems\bcrypt-3.1.11-x86-mingw32\ext\mri
> ruby extconf.rb
> make
> make install

さて当面は問題なくなったので、Issueがなければ報告しようとおもったらすでにあった。なんか長引いてるみたいなので修正にはしばらくかかるのかもしれない。

2018/08/12追記: 3.1.12で直ったらしい。これはうれしい。

Apache+passengerでRailsアプリを動かす場合は必要なくてもGemfileにpassengerを書くことにした

Rails側からは使わないから不要なんだけど、書くというお話し。

自分が使ってるLinux(主にVM)にはだいたいruby_auditbundler-auditがセットで仕込まれてて、cronでRuby本体/RubyGems/入れてるgemの脆弱性に未対応のものがないかメールで通知するようにしてる。

bundler-auditは当たり前だけどGemfileを見る必要があるのでそれに書いてないものは見てくれない。passengerはBundlerから読まれないのでうっかり見落としてしまう事があったので対策としてpassengerと関係する側のRailsアプリのGemfileに書いておく事で同じくくりでメールが飛んでくるようにした。

RailsInstaller 3.3.0は動かないけど3.2.1は動く

少し前の話だけど、Windows向けのRailsInstallerの新しいバージョンがでていてイベントの準備で動作確認をした。以前よりパスがハードコーディングされててそのままでは動かないみたいな話があったりする。

可能なら直してPRしようと思ってmasterをビルドしてみたら動くのではて?と思いもう少し追いかけたらPRがあった。masterである3.2.1の方はscaffoldしてみるくらいまで試したが動くようだ。

「リリース前にテストしてるん?」みたいなチケットも見かけたのでもうメンテナンスしないのかもと思って探してみるとそんな記事も見つかったりした。

3.2.1/3.3.0タグのどちらも存在しないようだし困る人がいるならその人が引き取らないとダメそう。たぶん3.3.0が動かないのは3.2.1の修正が適切にマージされてないのだろう。タグがないのでちゃんと比較してはないけど。

せめてビルドするまでに引っかかった所だけPRして自分はおしまい。

追記: 3.4.0がダウンロードできるみたいだ。差分はRuby/Railsのバージョン更新とバッチまわりのみっぽい。