アペフチ

渋谷.rb[:20160120]

久し振りに渋谷.rb[:20160120]に行って来た。初参加の人が半分近くいて、すごいなあと思った。

予め予告のあった主人がExcel方眼紙に殺されてRubyを書き始めてから5ヶ月が過ぎましたっていう発表のほか、みんな何かしら話すことがあって、九時過ぎまで発表が続いていた。中でもyuku-tさんの発表が印象に残っていて、最終的にはduck_testingっていうRubyGemの紹介と「いい感じにしてほしい」というお願いになったんだけど、このgemを作るに至る経緯の説明がよかった。

基本的には、型でチェックしたいという話。だから、各メソッドにはYARD向けのコメントで引数の型と戻り値の型を書いている。でも当然ながらYARDのコメントをRubyは見てくれないので、contracts.rubyの導入を検討した。でも、実装方法が危なっかしい(中では、古い人は知っているかも知れない、MethodDecoratorsを使っている)のと、本番でオフにできないので、やめた。YARDのコメントを読み取って自動で型に関するテストを生成し実行する、というgemを作ったとのこと。

YARDはコードの解析にRipperを使っていて、そのASTにプラグインからアクセスできるので、contarcts.ruby用のプラグインを書けばそこからドキュメントを自動生成できるはずだし、事実そういうYARDプラグインがあるらしい。でも既にYARD向けのコメントをたくさん書いていて、それを全部直して回るのは大変。さらに、YARDでドキュメントコメントを書いているgemは多いので、そこに一行足すだけで自動的にテスまでできるという物は、多くの人に役立つはずだ、という説明がされた。最後の、自分の問題を解決すると、より多くの人の問題も、労力無く解決できるという視点が素晴らしいなと思った。期待したい。

僕は先日の日記に書いた『nginx実践入門』をシンタックスハイライトするの内容をデモしつつ、「コードからその言語を判定するところ、今は目視でやって設定をハードコードしていて辛いので、やってくれるgemを知っている人がいたら教えてください」という相談をしてきた。その後の夕食の時とかに聞くと、意外とこれが反響があって嬉しかった。もうちょっと抽象化してgemにしたいなという気持ちになってきた。

あと、渋谷.rbとは関係ないけど日記なので書くと、itamae-plugin-resource-security_contextというItamaeプラグインをリリースした。今のところrestoreconをするだけだけど、仕事で必要になるに連れてほかのこともできるようにしていきたい。SELinux使っている人がもしいたら、一緒に開発していきましょう……。

Sendagaya.rb #133

Sendagaya.rb #133に行って来た。今日は、前半『メタプログラミングRuby 第2版』を読んで、後半はAction Cableを読んだ。

メタプログラミングRuby 第2版

fukajunさんが「本を読むってどうやってやるんですかねえ?」って言ったけど誰も答えを持ち合わせていなかった。十五分みんな黙読し、その後気になったことを話すというスタイルになった。範囲は「2章 月曜日:オブジェクトモデル」の始めから「2.2.4 オブジェクトとクラスのまとめ」まで。みんなRubyを書けるので特に問題がなく、字が汚いとか

module Rake
  class Task
    # ...

class Rake::Task
  # ...

って書いたらHoundCIに怒られるんだけどなんでだろう? といったことを話していた。

次回は「2.2.5 ネームスペースを使う」から。毎週ちょっとずつは読むとのこと。

また、ここのところ本にシンタックスハイライトを入れるのをやっていたので、この本も帰ったらやろうと思っていたが、始めからハイライトされていた。 『メタプログラミングRuby 第2版』は始めからシンタックスハイライトされている

Action Cable

ApplicationCable::Channelのユーザー定義のメソッドのスタックトレースを遡って、どこから呼ばれるのかを見ていった。

fukajunさんがプロジェクターで映しながらエディターを開いてソースを追い掛け、みんなで横からああだこおだと言っていた。読んだのはだいたいこの辺。

一度CelluloidをやめてConcurrent Rubyにしたところ(3b7ccad)、それを巻き戻し(d0393fc)、更にまた巻き戻す(01c3200)ということをしていて、この辺の扱い大変なんだなあという話をした。使いたいのはCelluloidの方であるようだ(#22977)。

ここを読んだおかげで、Rails5.0.0-beta1のActionCableを使って超簡易チャットを実装してみたにある

class MessagesController < ApplicationController
  def create
    ActionCable.server.broadcast "messages",
      message: params[:message][:body],
      username: cookies.signed[:username]

    head :ok
  end
end

みたいなコードを見ても驚かずに「なるほどActionCable.server.broadcastに渡している"messages"コマンドは別スレッドで実行されるからここはブロックせずに、即座にブラウザーに応答することができるんだな」と考えることができるようになった(でも、僕は気にならないけど、コントローラー内でこういうことするのに違和感を覚える人もいた)。

electron、rails-assets、JavaScript生態系

なんかelectronが盛り上がってるらしく、夕食を頂きながら仕組みとかHTMLで作るのどうなの? とか、rails-assetsとか派生してJavaScriptの開発環境って今どんな感じなの? といった話をした。

『nginx実践入門』をシンタックスハイライトする

nginx実践入門』を買った。

早速設定ファイルの所などをシンタックスハイライトした。 Nginxの設定ファイルがシンタックスハイライトされている

以下の手順で再現可能。本のEPUBファイルがpath/to/nginx実践入門.epubにあるものとする。

$ gem install epub-parser -v '>= 0.2.4'
$ gem install epub-maker -v 0.0.3
$ gem install rouge rouge-lexers-docker
$ git clone https://gist.github.com/0779a34fd74bae96468f.git rougify-gdp-book
$ cd rougify-gdp-book
$ ruby rougify-gdp-book.rb path/to/nginx実践入門.epub

EPUBファイルを上書きするので注意すること。

APIデザインケーススタディ』(『APIデザインケーススタディ』を、ソースコードのシンタックスハイライトしながら読む)とか『Dockerエキスパート養成読本』(Dockerエキスパート養成読本を、ソースコードのシンタックスハイライトしながら読む)とか、EPUBファイルに後から手を加えてシンタックスハイライトしているけど、別にこれがそれほどいいことだとは思っていない。こういうことができるように、DRMなしのEPUBを売ってくれている技術評論社には感謝しているが、できれば本を作る時にハイライトを入れてくれるのが一番いいと思っている。

追記

こんなコメントを貰った。

なるほど、確かに。色の区別がつきにくい人もいるし、白黒のままのほうがよさそうだ。切り替えられるように作るべきかは、悩ましいところ。