週刊Railsウォッチ(20190218)Zeitwerkがやってきた、Railsバリデータの光と影、heavens_door、今月GitHubで盛り上がってるgemほか

こんにちは、hachi8833です。今回のつっつき開始直前にオフィスの蛍光灯が2つ立て続けに生涯を終えたので、morimorihogeさんとbabaさん(実は電気工事施工管理技士でもある)が楽しそうに交換作業してました。写真だとわかりにくいのですが、色味がもろ違ってます。


つっつきボイス:「どもども、やる気が盛り上がってるうちに蛍光灯を交換しようと思って」「すみません、ウォッチのドラフトがぎりぎりでお手伝いする余裕なくて😅」「まあまあ😊」「それはそうとはてブの過去ブクマが統合される件↓ありがたいです🙏: TechRachoのブクマがhttp時代とhttps時代で泣き別れだったのがこれで統合されるといいなと」「そういえば何年か前に問い合わせたら見積りが結構な額になりましたね💸」

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

先週のウォッチが特濃だったので、今回は軽めに戻しました🙇。

Rails: 先週の改修(Rails公式ニュースより)

直近コミットログから見繕いました。

今回はテストの修正が目立つ気がします。

Zeitwerkが6.0に統合された


つっつきボイス:「お、Zeitwerkついに入った🎊」「これ↓見るとJRubyとかではまだ動かないのかなと思ったり」「あーオートローダーみたいなのはCRuby以外の実装だとすぐにはできなかったりするかも: 最適化みたいなのはJRubyとかでも検証しないといけないから大変」

# Gemfile#L47
-gem "bootsnap", ">= 1.1.0", require: false
+gem "bootsnap", ">= 1.4.0", require: false
+
+gem "zeitwerk", ">= 1.0.0" if RUBY_ENGINE == "ruby"

喜びの声もありました↓。


同PRより

「Zeitwerkの注意書きらしきものもガイドに追加されたようです↓」「なるほど、独自に初期化したければafter_initilizeに書けと: たしかにコードによってはこれで動かなくなるものがありそう」「お〜」「after_initilizeって今まであまり書かなかったし」

注: すべてのgemの初期化が実行された後で自分の初期化が実行されることについては保証されない。したがって、指定のgemに依存する初期化コードはconfig.after_initilizeブロックに置くべき。
#35055より

「あとたぶん直接の関連はないんですが、Ruby trunkでautoloadにimmediateモードを追加して欲しいというリクエスト↓があって、Matzはautoloadを好まないとありました」「autoloadってちょろいものを書くときなんかには要らないし、autoloadを使うと他のところに持っていったときになぜか動かなくなったりすることあるし😰」「あ〜」「autoloadがあると何かと複雑になりやすいので、Rubyになくてもいいんじゃねみたいな気持ちはちょっとわかる気はする😅」

column_exists?typeを指定せずにオプションを渡せるようにした

# activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L133
-     def column_exists?(table_name, column_name, type = nil, options = {})
+     def column_exists?(table_name, column_name, type = nil, **options)
        column_name = column_name.to_s
        checks = []
        checks << lambda { |c| c.name == column_name }
        checks << lambda { |c| c.type == type.to_sym rescue nil } if type
        column_options_keys.each do |attr|
          checks << lambda { |c| c.send(attr) == options[attr] } if options.key?(attr)
        end
        columns(table_name).any? { |c| checks.all? { |check| check[c] } }
      end

つっつきボイス:「options = {}**optionsに変えたということですが」「こんなふうに↓ハッシュをキーワード引数として受け取るようにして、typeを渡さなくてもいいようにしたのね」「お〜」「type = nilがデフォルト値付きだからハッシュを渡すと**optionsに吸い込まれるのか(こんな仕様だったとは💦)」

# activerecord/test/cases/ar_schema_test.rb#L119
-   assert_not @connection.columns(:has_timestamps).find { |c| c.name == "created_at" }.null
-   assert_not @connection.columns(:has_timestamps).find { |c| c.name == "updated_at" }.null
+   assert @connection.column_exists?(:has_timestamps, :created_at, null: false)
+   assert @connection.column_exists?(:has_timestamps, :updated_at, null: false)

queue_classic gemのリポジトリパスを修正

# Gemfile#L52
  gem "sidekiq", require: false
  gem "sucker_punch", require: false
  gem "delayed_job", require: false
- gem "queue_classic", github: "rafaelfranca/queue_classic", branch: "update-pg", require: false, platforms: :ruby
+ gem "queue_classic", github: "QueueClassic/queue_classic", require: false, platforms: :ruby
  gem "sneakers", require: false
  gem "que", require: false
  gem "backburner", require: false

つっつきボイス:「修正はちょろいんですが、queue_classicって見たことなかったので: だいぶ古いgem?」「queue_classic知らないな〜: お、PostgreSQLでワーカーキューをやれるgemなのか」

# 同リポジトリより
# 引数なし
QC.enqueue("Time.now")

# 引数1つ
QC.enqueue("Kernel.puts", "hello world")

# 引数2つ
QC.enqueue("Kernel.printf", "hello %s", "world")

# ハッシュを渡す
QC.enqueue("Kernel.puts", {"hello" => "world"})

# arrayを渡す
QC.enqueue("Kernel.puts", ["hello", "world"])

# デフォルト以外のキューを使う
p_queue = QC::Queue.new("priority_queue")
p_queue.enqueue("Kernel.puts", ["hello", "world"])

「…言われてみればPostgreSQLにキュー機能ってあるし!」「マジで?: ぽすぐれってほんとに何でもありますね😳」「あるある😆: どこかでメッセージキューに使ってるのを見たことあった」「Redis入れずにやりたいときとかなのかな…」

ドキュメント: test_shm_mq
参考: アナログを愛するデジタル生活館 PostgreSQLでMQ

マルチデータベースのコネクションプールエラーを修正

# activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L1007
      def retrieve_connection(spec_name) #:nodoc:
        pool = retrieve_connection_pool(spec_name)
-       raise ConnectionNotEstablished, "No connection pool with '#{spec_name}' found." unless pool
+
+       unless pool
+         # multiple database application
+         if ActiveRecord::Base.connection_handler != ActiveRecord::Base.default_connection_handler
+           raise ConnectionNotEstablished, "No connection pool with '#{spec_name}' found for the '#{ActiveRecord::Base.current_role}' role."
+         else
+           raise ConnectionNotEstablished, "No connection pool with '#{spec_name}' found."
+         end
+       end
+
        pool.connection
      end

つっつきボイス:「poolがない場合のエラーメッセージの親切度をアップした感」

update_attributesの非推奨メッセージを追加

# activerecord/lib/active_record/persistence.rb#L438
    alias update_attributes update
    deprecate :update_attributes
    deprecate update_attributes: "please, use update instead"

つっつきボイス:「これは非推奨であって欲しいヤツ😤」「以前のウォッチでも話題になったupdate*系メソッドのひとつですね: ついに非推奨に👋」「つか非推奨はその前からと思われ😆: これもメッセージの親切化ということで」

後で調べると、Rails 4.1で消えた後、#8705で#updateのエイリアスとなって「soft deprecate」扱いとなり、そして今回非推奨になったという流れのようです。

参考: Rename update_attributes method to update by amparo-luna · Pull Request #8705 · rails/rails
参考: rails commit log流し読み(2018/02/18) - なるようになるブログ
参考: update_attributesが非推奨扱いになる - Qiita

番外: テストの正規表現を素直な文字列に変更

# actionpack/test/dispatch/debug_exceptions_test.rb#L44
      case req.path
-     when %r{/pass}
+     when "/pass"
        [404, { "X-Cascade" => "pass" }, self]
-     when %r{/not_found}
+     when "/not_found"
        raise AbstractController::ActionNotFound
-     when %r{/runtime_error}
+     when "/runtime_error"
        raise RuntimeError
...

つっつきボイス:「これはワラタ😆」「必然性のない正規表現がどっちゃり😆」「テストをコピペしてるうちに広がっちゃったとかなんでしょうね」

Rails

今月の「盛り上がってるRails関連リポジトリ」(Hacklinesより)


つっつきボイス:「『定番gemリスト』にしようかと思いましたが、この記事とかぶるのでもっと人の多いときに回します🙇: 知らないgemもそこそこあったので」

「solidusはかのSpreeの後継というかfork」「eコマース用なんですね」


spreecommerce.orgより


「secure_railsは見た覚えが」「あ、secure_railsはankaneさんだ: そういえば前取り上げました(ウォッチ20170303)」


「Real World Railsもどこかで見たような」「あ、apps/engines/の下にいろんなRailsアプリやエンジンがずらっと入っている: 学習やコードベースの参考に便利ということか」「これ1つgit cloneすればあれこれ探して回るよりいいかも😋」


「ranked-modelはacts_as_sortableやacts_as_listの置き換えと言ってるからそういうヤツか」「acts_asなんちゃらは古いgemが多いって言ってましたね(ウォッチ20180126)」


「combustion知らないけど、Railsエンジンをテストしやすくするものらしき」「ちなみにRailsのマウンタブルエンジンはRailsアプリが丸ごとに近いかたちで入っているので割とかさばります」


「herは好きだって前言ってましたね(ウォッチ20171027)」「結構好き😍: これだけですべて賄えるとまではいかないけれど」


「feedbinはマウントするだけで動くRSSリーダーアプリ、ローカルでも動くよって😆」「😆」「RSSリーダーって結局いつの間にか使わなくなるし」「私も今はRSSはSlackのチャンネルで受けて読んでます: リーダー立ち上げなくて済むので断然読みやすいしシェアも楽だし😋」「やっぱそうなるし☺️」


同リポジトリより


「Prettierはコード整形というかLinterというか」「Ruby以外にいろんな言語向けのぷりてぃあ〜があるんですね」「変数名の置き換えまではさすがにやらないかな😆: rufoよりは強めな感じだけど、Rufoより設定できるものが少ないのが惜しい気が」「Rufoは安心感ありますね☺️」

# 同リポジトリより
        d=[30644250780,9003106878,
    30636278846,66641217692,4501790980,
 671_24_603036,131_61973916,66_606629_920,
   30642677916,30643069058];a,s=[],$*[0]
      s.each_byte{|b|a<<("%036b"%d[b.
         chr.to_i]).scan(/\d{6}/)}
          a.transpose.each{ |a|
            a.join.each_byte{\
             |i|print i==49?\
               ($*[1]||"#")\
                 :32.chr}
                   puts
                    }
# 上を下のように整形する
d = [
  30644250780,
  9003106878,
  30636278846,
  66641217692,
  4501790980,
  671_24_603036,
  131_61973916,
  66_606629_920,
  30642677916,
  30643069058
]
a, s = [], $*[0]
s.each_byte { |b| a << ('%036b' % d[b.chr.to_i]).scan(/\d{6}/) }
a.transpose.each do |a|
  a.join.each_byte { |i| print i == 49 ? ($*[1] || '#') : 32.chr }
  puts
end


同サイトより

「ManageIQ?雑にググってみるとクラウド管理サービスということらしき↓」「2012年にRed Hatが買収したのか」「こんな感じのツールってあったかもそういえば: 自分たちで立ち上げるのはやだけど😆」

参考: Red HatがManageIQを買収、ハイブリッドクラウド管理サービス強化へ:既存のIaaS/仮想化ツールを補完 - @IT


「あ、Algoliaは以前翻訳した超高速の検索APIサービスです」「AlgoliaをRailsから使えるgemね」

インタビュー: 超高速リアルタイム検索APIサービス「Algolia」の作者が語る高速化の秘訣(翻訳)


「coverbandはカバレッジ」「あー、そういえばこういうのを一時期漁ってたことあったし: なおcoverbandはproductionコードのカバレッジをチェックするらしい」「testじゃなくてproductionですか」「これがどの程度イケるかわからないけど、新しい分よかったりするのかな?🤔」

「coverbandは、正体不明のRailsアプリがやってきたときのチェックに使ったことがあったような覚えがあったようなないような: 使われてないコードがどのぐらいあるかを調べるとか」「rails aboutコマンドとかrails notesコマンドの次ぐらいにやってみる感じでしょうか?」「そういうコマンドは大した情報取れませんけど😆: そういうのをさっと調べられるツールって、結構欲しいヤツなんですよ☺️」


<!-- 同リポジトリより -->
<%= bootstrap_form_for(@user) do |f| %>
  <%= f.email_field :email %>
  <%= f.password_field :password %>
  <%= f.check_box :remember_me %>
  <%= f.submit "Log In" %>
<% end %>

「bootstrap_formなんてのが出たのね」「この間話題になったsimple_formよりもイケてますかね?(ウォッチ20190204)」「ほー、Bootstrap 4に対応してるし: ノリはsimple_formだからキライな人もいそう〜😆」「😆」「でもこのbootstrap_formはform_with↓に対応してるし😋、今使うならこっちの方なのかな」「おほ、TRIXにも対応してるって😆」「TRIXはRails 6で入る予定のAction Textの元になったBasecampのRich Textエディタですね」

[Rails 5.1] ‘form_with’ APIドキュメント完全翻訳

「今ならsimple_form使うよりbootstrap_formの方がよさげ👍」


macinboxもこの間取り上げたし(ウォッチ20190204)、heavens_doorはたまたま次にエントリ用意してあるので次へ👉」「おk」「solargraphも前扱ってた(ウォッチ20190121)」


「これもよく登場した定番gemですね☺️(ウォッチ)」「Pagyは高速ページネーション↓」

Rails:「Pagy」gemでRailsアプリを高速ページネーション(翻訳)



デモサイトより

「これもankaneさんのBlazerはビジネスインテリジェンス向けってありますけど、ビジネスインテリジェンスってそもそも何でしたっけ?😅: 経営戦略をサジェスチョンするとか?」「いえいえそういうのじゃなくて、大量にあるデータの中から意味のあるデータを抽出すること😎」「あ、もっと広い意味でしたか💦」

「BIは言ってみればデータビジュアライゼーションとデータ集計を組み合わせたような分野で、この種のBIツールで有名なのはtableau↓とかですね」「タブロー、知りませんでした…」「tableauは超有名よん✨」


tableau.comより

「対象としてよく使われるのはCSVだったり、あるいはデータベースのデータの正規化をあえて落として、第3正規形を第1正規形にしたものだったりしますね」「お〜!」「そういうデータウェアハウスなんかの超絶デカいデータ🗻なんかにクエリをかけてよしなに分析するみたいなのをやります」

参考: [DB] 第一正規化・第二正規化・第三正規化の違い | ロジカルシンキンぐんっ!

「ビジネスという言葉につられてしまったけど、BIはそういうことだったんですね」「そうやって得られた結果を次のビジネス戦略に使ったりしますね」

「でblazerなんだけど、自分だったらこの手のgemで頑張るよりtabreauで頑張る方がいいと思うし😆」「たしかに〜😆」「BIやってみようっと」


run.rbも先週やりましたね(ウォッチ20190204)」


「suggest_rbって何をサジェスチョンするんだろ?」「お〜!what_returns?とかすると、その値を返すメソッドが何なのかを教えてくれるのか↓」「え〜何それスゴい😍」「言われてみれば『これを返すメソッド、きっとあるはず』という探し方はありだわ😋」「逆検索というか逆関数的な?」「内部は泥臭そうな予感🐌」

# 同リポジトリより
require 'suggest'

# Object#what_returns?で、指定の値を返すメソッドを返してくれる
[1,2,3].what_returns? 1
=> [:first, :min]

# 引数も指定できる
[1,2,3].what_returns? [1], args: [1]
=> [:first, :take, :grep, :min]

# デフォルトではオブジェクトを改変しないメソッドのみを返す
[1,2,3].what_returns? [1], args: [1], allow_mutation: true
=> [:first, :take, :shift, :grep, :min]

# Stringなどさまざまなコアモジュールで使える
"HELLO".what_returns? "hello"
=> [:downcase, :swapcase]

「これが使えるのってRuby標準のメソッドだけ?自分の書いたメソッドでこれできたらかなりうれしいんだけど」「あ〜どうでしょう?🤔」「やってみないとわからないかな〜」

「RubyMineとかならこういうことできるでしょうか?」「いや〜Rubyはランタイムでいろいろ変わるから無理っしょ😅: Javaとかならできるかもしれないけど」

「これは中々のアイデア!」「ありそうでなかったというか、どうして今までこれがなかったんだ的なツールですね」「ググりにくいメソッドとか記法を調べるときとかにうれしい🥰」「『このメソッドからこういう結果を取り出したいのに名前がわからん!』みたいなのを調べられるのはいいっすね〜」

Rubyの標準になってもいい機能かもと思いました。ちょっと狭っ苦しいですが今週の🌟を進呈いたします。おめでとうございます!

追記(2019/02/19)

ご指摘ありがとうございます!これは気づきませんでした🙇。

参考: Andrew Birkett’s MethodFinder in Ruby — 上のarchive.orgからたどりました。


TTYはイイやつ(ウォッチ20180615)」


「awesome_printはデータ構造をこうやってキレイに整形して色付きで出力してくれる🌈↓」

似たような感じで、k0kubunさんがだいぶ前に作ってくれたGo言語向けのpp↓はいつも愛用してます🙇。


同リポジトリより


pipe_operatorもこの間出ましたね(ウォッチ20190121)」「本当に使われてるんだろうか?って思ったりするけど😆」

「Netflixの高速なfast_jsonapiも出てた(ウォッチ20180209)」


「paranoiaは論理削除gem」「使う前によく考えないといかんヤツですね↓」

論理削除用paranoia gemがあるRailsプロジェクトで物理削除する方法

heavens_door: amatsudaさん謹製のCapybaraスクリプト生成gem


同リポジトリより

「先週エントリに載せようと思って漏らしてました😅」「右上のボタンを押すとレコーディング開始して、Capybaraのテストスクリプトを生成してくれる🥰」「おーなるほど!自分のところでこんなにキレイに取れるかしら?」「見た感じマウスオーバーまでは取ってないようなので、そのあたりは自分でやる感じでしょうね☺️」「fill_inのリンクとかも、同じようなリンクがいっぱいあったりする場合にどこまでキレイに取れるかはわからないし」

「まあそんなのは手で直せばいいことで、それよりもこうやってスタブコードをどんどん作れるのはとてもありがたい🙏」「うれしいよぉ〜😂」「いいgem👍」「天国見えた😇」

天国の扉はボブ・ディランの曲かなとも思いましたが、カウボーイビバップの方がありそうかなと思いました。

strftimer: strftimeのジェネレータサイト(Ruby Weeklyより)


strftimer.comより


つっつきボイス:「おお、これはstrftimeの日時フォーマットを生成してくれるヤツ😂」「『クリックしてAdobe Flash Playerを有効にします』って😆」「わお😆」「strftimeは慣れればだいたい覚えるけどっ」「いつもとりあえずググってます😆」

[Ruby/Rails] strftimeのよく使うテンプレート

Railsのバリデーターにパッチを当てる(Hacklinesより)


つっつきボイス:「いきなりDeviseとかつらそう😆」「あー、email uniquenessのバリデーターか」

Railsのバリデータ

「ところで、他のWebフレームワークと比べてRailsのバリデーターは比較的拡張しやすい気がする」「わかるわかる」「何というか、過去にいろいろ見かけた他のバリデーション機能って、ものすごく大仰というかやけに重厚な作りになってることが多くって🐘、正規表現バリデータだけだと足りないような機能を3行ぐらい足そうと思っただけなのに、バリデーションクラスやら何やらをどっかん足して、さらにassignしないと使えないみたいなことがありすぎて🥶」「あるあるありすぎる〜🤣」「何というオーバーキル🗡」「他のフレームワークってPHPとか?」「PHPだったりJavaだったり」

「その点Railsはある意味設計上の諦めがよくてvalidateメソッド付けて貼ればできちゃうし、バリデーションクラスにするとしてもクラス作っちゃえばそんなに大変じゃないし😋」「とってもいい子😘」「まあエラーメッセージの扱いはともかくとして😆」「そうっi18nがつらいのっ😤」「根本は日本語と英語の文章構造が違ってるせいなんですけどね🇬🇧」

参考: 【Rails】バリデーションの追加方法とエラーメッセージの表示 - Qiita

「ほどよく拡張性があって、しかも簡単に作れるバリデーターを設計するのはさじ加減が結構難しい」「言えてる」「どこが難しくなりがちかというと、バリデーターってネストしたいものなんですよ🐢」「あ〜たしかに!」「単品のバリデーターなら練習みたいなものなんですけどね☺️」

「バリデーションの中にグループがあってifで場合分けとかし始めると、このバリデーションがオンのときはこっちはオフにしたいとか始まって、するとグループの中に別のグループをネストしたくなる: そういうのにまで対応できる設計にしようとすると大変すぎて死ぬ🎃」「そういうことでしたか!」「そこまでやらなければならない場合って、はっきり言えば1割もない😆」

「Railsの設計は、そういうのをクラスだとかモデルでコンポジットしているものだとかでやろうとする代わりに、単にコード書けばいいじゃんwという方法🤣」「🤣」「あの割り切り方はデータ構造が複雑にならずに済むので好き😋: その代りRailsではコードの方がスパゲッティ化する可能性がありますが🍝」「🤣」「Railsのバリデータが受け入れられたのはそういう割り切りのおかげなんじゃないかな🧐」「Railsは『バリデータ欲しけりゃ書いといてくれ、引っかかったら通さないでおくから』のノリなんで楽ちん😋」

大量のネステッドルーティングの扱いはRailsの方がSinatraより上(Ruby Weeklyより)


同記事より


つっつきボイス:「Sinatraはルーティングが重くなると急激に重くなると」「Sinatraでルーティングが万単位のアプリ書きたくねぇ〜😆」「そんなの想定になさそう😆」「他のフレームワークにせいと😆」

ペアプロの目的とは


つっつきボイス:「上は永和システムマネジメントさんの記事です: 難しいところはペアプロでなどの話題」「以前他の人のペアプロを横で見学したことありましたが、それだけでも得るものが多かったと感じました😀」

「まず、開発でペアプロにどこまでコストを割けるかがひとつ難しい点ですね」「それはある」「ペアプロやるなら時間を取ってみっちりやらないといけないし」

「そしてRailsの場合、個別のアプリのコードベースを見るよりも『そもそも何が問題なんだっけ?』みたいなところにかかる時間の方がずっと多いですし」「うんうん」「もっとコード量の増えがちな他のWebフレームワークだったり言語だったりすると、コードを見るところで多くの時間を使うんですが、Railsの場合はコードを見るよりも設計の方を考える時間の方が圧倒的に長いから😆」「そうそう😆」「ビューとかやってればコードを見る量も少しは増えるけど、どちらかというと設計の絵を描きながらやってく方がペアプロでは多いし🎨」「それって見方を変えればRailsというフレームワークがものすごくちゃんと機能してるってことなのかも」

「ペアプロでは、教育目的を別にすると、やる人同士のレベル差があまりないことが基本的に多いかな」「あー、どちらかというと情報共有のためのペアプロなんですね」「ペアプロというとレベルの高い人が初心者をグリグリするみたいな教育的イメージを持たれているところがあって、そういう面もなきにしもあらずだし効用は確かにあるけど、実は本来ペアプロはそういうもんじゃない😎」

「特にXP(エクストリームプログラミング)の文脈では、ペアプロは教育のための一方的なものではない」「そうそうっ」「同じレベルの人同士でやるのが本来🧐」「XP、昔流行った😆」「流行った😆」

参考: エクストリーム・プログラミング - Wikipedia

番外: 翻訳のノウハウ動画


つっつきボイス:「ファクトフルネス、買ったけどまだ読んでなかった」「この動画を安川さんに教えていただいたんですが、翻訳上の配慮の説明がよかったので😍」「お〜では」(しばし鑑賞)

「なるほど〜、ちょっとコードのリファクタリングみたい😊」「確かに良くできてるけど、構成まで変わったものを本来の意味での翻訳と呼んでいいのかどうかちょっと疑問が😅」「まあどちらかというとライティングのテクニックではありますね」「ライティングの手法としては非常にいいけど、翻訳と呼びたくない気が😆」「まあ翻訳も一種類じゃないのでものによりますね: コアな技術ドキュメントは丸めたり構成を変えたりするわけにいかないですし」「論文みたいに元々論理的に書かれている文書の翻訳なんかも構成とか曲げて欲しくないし☺️」

「Yahoo!ニュースあたりのヘッドラインに出てくるような翻訳記事ならこれでバッチリ👍」「ですね〜」「語のかぶりを削除するとかライティングでとても参考になる😋」

「英語と日本語で情報密度の違い云々があったりするけど、このやり方だと元の英語より情報増えてるのかも😆」「😆」「意訳が多いほど量は増えるだろうし」

「ところでこういう文書修正法は、もうワードプロセッサが当たり前の世代のやり方だなと思ったり😆」「たしかに😆: 原稿用紙でこれやろうとしたら超大変」

「しかし原文の構成まで変えるとなると、契約によっては翻訳権あたりに引っかかったりしないのかな?」「あ〜言われてみれば」「翻訳じゃなくて要約ならわかるけど」「そういえば昔シドニィシェルダンの『ゲームの達人』っていうベストセラーになった本が超訳という触れ込みでしたけど、本当に原文とはごっそり変わってましたね: 出だしが『花の都パリ、霧の都ロンドン』みたいな感じなのに原文にそんなものどこにもないとか😆」「そういうのはさすがに通常の翻訳とは違う契約にしたとかなんでしょうね: 超訳と名乗ってやってる分にはいいけど、翻訳の名目でそれをやるとなると😆」「翻訳の定義次第かも😆」「ファクトフルネス訳した人は自分で論文も書いたりしてるし、もろもろ心得たうえでやってると思いますが☺️」

参考: ゲームの達人 - Wikipedia
参考: “超訳”って一体なんなの? (2010年3月4日) - エキサイトニュース

その他Rails

Ruby

Rubyで無限ループをテストする(Hacklinesより)

# 同記事より
lass DoUsefulWork
  def self.call
    # do useful work
  end
end

class Worker
  def self.start
    loop do
      DoUsefulWork.call
    end
  end
end

つっつきボイス:「ループのブロックをテストしやすく切り出す方法、タイムアウトを使う方法、loopをスタブで塞ぐ方法の3つか」「無限ループのテストがしたいときってたまにあるし: ループカウンタとか」「イベントループなんかもでしょうか?」「イベントループはブロックするから別に大丈夫🧐」

dry-schemaをご紹介(Ruby Weeklyより)


つっつきボイス:「dry-schemaは名前からしてdry-rbシリーズのgemですね」「以下の記事にはないので新しいみたい」「dryシリーズいっぱいありすぎてよくわがんね😆: 使うときだけ検索してるし」「dryシリーズには欲しいものがだいたい入っているという感触は伝わってくる」「dry-allみたいなの作って全部入れられるようにしてくれないかな😆」「Active Support的に全部突っ込んで使うみたいな😆」

Ruby: Dry-rb gemシリーズのラインナップと概要

その他Ruby

かわゆいです❤️

クラウド/コンテナ/インフラ/Linux/Serverless

SNIでサイトを遮断?


つっつきボイス:
「記事の中で遮断をSNIプロトコルベースで行ったとあって、遮断やら通信の秘密やらもさることながら、そっちが気になってて、SNIってそういう使い方するものなのだろうかと思って😅以下↓を貼ってみました」「このQiita記事のEncrypted SNIとか、あとはDNS over HTTPSあたりの記事は、今のようなときこそ読んでおくといいですね👍」

「韓国のサイト遮断ってまさか抜き打ちでやったんだろか?🇰🇷」「どうなんでしょう、普通なら事前周知でしょうけど…」「日本もこの辺いろいろ言われてたりするけど🇯🇵」「そういえば漫画村遮断するとかしないとかやってましたね」「カドカワの退陣劇とか😆」

これを見る限りですが、法改正も含めて10年ぐらいかかってるようです↓。

その後

今やスクショの方がWebサイトより軽い

参考: 「著作権侵害だから」という理由で「スクリーンショットを規制」するとマジで死ぬというのをかつて証明した実例がある - GIGAZINE

「上の記事はサイト遮断とは関係ないんですが、規制で自分の首を絞めた話ということで貼ってみました」「そういえばはてブあたりでこんな話が: 今の若い人はWebサイトをスマホで友だちとかにシェアするときにURLではなくてサイトのスクショ画像を投げ合ってたりするけど、今やWebサイトを開くよりもスクショの方がデータ転送量が軽いよねって指摘してた人がいた」「あー!😮言われてみれば…」「スクショ投げ合ってる人たちがそこまで考えてやってるかどうかまでは知りませんが😆」「😆」

「スマホだとURLよりスクショの方が取りやすいというのはありそう」「それもありますが、今どきのWebサイトはWebフォントも含めてたいていメガ単位の通信量でデータ投げてくるし🗿: TechRachoもちょっとChrome DevToolsで見ただけでメガ単位だし↓」「普段から私がウォッチにツィートやら動画やら貼ってるせいもありますね😅」「あ、今のスクショは解像度が高いから撮り方にもよるだろうけど、うまく圧縮かかればスクショの方が軽くなるナ😎」「何という逆転⚽」

なお上はシークレットモードで初回読み込んだときのスクショなので、キャッシュが効いてない状態です。


「あとSNIがらみということで、ちょうどRuby trunkにあった以下のissueをあえてここに貼ってみました」「IMAPが懐かしすぎるのはさておいて🤣、Rubyにnet/imapなんてのがあったなんてねー」「修正はめちゃピンポイントですね↓」「hostを受け取れるようにしただけと☺️」

# lib/net/imap.rb#L1092
      begin
        if options[:ssl]
-         start_tls_session(options[:ssl])
+         start_tls_session(options[:ssl], @host)
          @usessl = true
        else
          @usessl = false
        end

参考: Internet Message Access Protocol - Wikipedia

コンテナビルドツール続々


つっつきボイス:「Publickeyでkanikoとjibが仲良く立て続けに出ていたので🦀」「あーなるほど、コンテナイメージだけ欲しいときに誰かがビルドしてくれるとうれしいというヤツ」


同リポジトリより


同リポジトリより

「こういうのが出てくると、DockerデーモンがなくてもDocker環境を作れるようになるナ」「あー、そこがうれしみなんですね😀」「もういい加減みんなLinuxサーバーを1台もホスティングしたくないんでしょう😆」「😆」「だからビルドも何もかも全部外でやりたいと: Dockerイメージをビルドする専用のCIを回したいならこういうのがあってもいいかもですね🥰」

その他クラウド


つっつきボイス:「相当昔の話ですが、マイクロソフトに転職した知人がその後すごく消耗して辞めたときに『社内の権力争いがひどすぎる』と漏らしてたのを思い出しました」「まあその手の話はちらほら聞いたことあるし、あれだけ大きい会社ならあっても不思議じゃないし☺️」「それだけに最近のマイクロソフトの浄化の進み具合が驚きですね」



つっつきボイス:「これはまたえらく古めかしいテクニック🏛: Skypeがこういうのやってたのもいったいいつの頃だったか😆」「やっぱり〜」「この手のover HTTP的にプロトコル通すのはSkypeが一番積極的にやってましたね👾: いわゆるNAPT越え」「あーそれか: ググると2000年代初頭の記事がズラリですね」

参考: NAT traversal - Wikipedia

SQL

MandrillのPostgreSQLが止まった(DB Weeklyより)


つっつきボイス:「PostgreSQLが息しなくなったみたいな話がHacker Newsにあがってたそうです」「そういやGitLabでもそんなことがあったし😇」「このMandrillって何のサービスでしたっけ?」「あーMailchimpのアドオンみたいなやつ」「メールのマーケティングとかそっち方面みたい: chimp(=チンパンジー)だからマンドリルなのかも🐵」「結構昔からあるサービスだったと思う: Rails 2ぐらいの頃とか」


mailchimp.comより

csvq: SQLでcsvに直接アクセス


mithrandie.github.io/csvqより

# Simple query
csvq "select id, name from `user.csv`"
csvq "select id, name from user"

# Specify data delimiter as tab character
csvq -d "\t" "select count(*) from `user.csv`"

# Load no-header-csv
csvq --no-header "select c1, c2 from user"

# Load from redirection or pipe
csvq "select * from stdin" < user.csv
cat user.csv | csvq "select *"

つっつきボイス:「Go言語で書かれているそうです」「これ系のツールって昔からあったりしそうだけど?」「きっとありそう: ちょっとやってみた限りではあまりうまく動かせなくて😅、素直にSQLiteあたりに読み込む方が早かったかも」

その他SQL


つっつきボイス:「エンジニアHub記事です」「実際システムやアプリなんかよりデータベースの方が寿命長いっすね🧐: ごく基本的な話」「データベースをアプリに任せっぱなしにするとその辺が疎かになりそう」「Railsしかやったことのないエンジニアが作ったアプリのデータベースがやってきたりすると結構つらい😭: もうそういうときはデータベースごと作り直すなんてこともしますし」「泣けてくる😢」


JavaScript

「実践: React Hooks」

// 同記事より
function Foo({x}) {
  useEffect(() => console.log('x changed'), [x]);
  return <div>{x}</div>
}

つっつきボイス:「React Hooksはよくわがんねけど、まあmizchiさんがこういう解説を書いてるうちは積極的に使わなくても大丈夫かなと😆」「それいいかも😆」「mizchiさんは特殊系というか強い人だし、彼が使ってみた感想書いてる段階ならproductionであえて使わなくてよさげかも☺️」

「上と関係ありませんが、mizchiさんにもお師匠さんいるんだなと思って↓」「mizchiさんがメンターの下にいた時代面白い😆: 最終的にメンターとは相性次第だと思いますけどね☺️」

言語

GoのモジュールとGOPATH汚染問題


つっつきボイス:「GOPATHってモードなんだ!」「Go言語が次のバージョンでパッケージ管理をいよいよモジュールに切り替えるので、今はエクスペリメンタルに使える形なんですが、まだ試す余裕がなくて😅」「Go言語って元々でかいものを作ることが想定になかった節がありますよね😆: 言語仕様が小さいからと当時ドヤリングされてたのが結局こうなってきたし🤣」「クラス的なものもないし、コマンドラインツールをさっと作る感じでしたね🤣」「ある程度以上大きくなってくると、モジュールの名前空間を管理できるようにならないといろいろつらくなるだろうなって想像つくし😎」

GOPATHに縛られる問題はいろいろつらい目に遭いました: go getすると常に最新のパッケージをfetchするのでそのままだとバージョンロックできなかったし、GCPでGo言語やろうとするとGOPATHにあるパッケージを全部アップロードされたりしたのでenvを無理やり切り替えてドツボにはまったり😢」

「未踏ジュニア」を応援しよう


jr.mitou.orgより


つっつきボイス:「お、未踏ユースって今は未踏ジュニアって言うんだ」「あ、違う名前で前からやってたんですね?」「こういう名前はいろいろ変わったりしますけどね☺️」

参考: 未踏ユースとは - はてなキーワード

「何と、未踏ジュニアってスポンサーがついてるじゃん↓❣️: 国の予算が減ったとか?😆」


jr.mitou.org/#sponsorより

「あ、RailsチュートリアルRailsガイドで私が一緒にやってる安川さんもPMとスポンサーになってるし↓: そういえば安川さんも未踏出身でした」「ko1さんもいる、お、竹内さんがスーパバイザー😍」「お〜」


jr.mitou.org/#pmsより

参考: 竹内郁雄 - Wikipedia


jr.mitou.org/#supervisorより

「うん、未踏は国の金を使うプロジェクトとしてはいいんじゃないって思うし👍」「かなり成果出してる印象ありますね🥰」「まあユースは本家未踏に比べて予算安いですが😆」

「ジュニアは今見てみると50万か: 本家はたしか一千万ぐらい出せてだいたい何でも買えるし💰、物を買う以外に給与みたいな人件費にも使えるし」「クラウド課金とかもですね」「もちろん経費にできます😎」

その他言語

その他

RedmineからBacklogへ


つっつきボイス:「社内のRedmineヘビーユーザーがいろいろつらそうにしてたので、移行記事を拾ってみました」「移行か〜」「Redmineの移行は難しそう😅」「Redmine捨ててこれからはBacklogとかならともかく😆」

「Redmineのプラグイン地獄とかあるし👺」「ま、Backlogはできないことがいろいろあるところがいいよね、なんて😅」「機能が絞り込まれてるとも言いますね😅」


redmine.jpより

「そうそう、Backlogは安い(16,000円/月程度)というのはメリット💰」「Basicプランでユーザー100個作れるしほぼほぼ無限と言っていいし、次のプランも大して高くないし」「そこまでいったら1プロジェクト100円とかそんな値段😆」


backlog.comより

「それにしても既存のチケットがある状態でよく移行したなと思うし」「スゴい」「既存システムはそのままで新規プロジェクトから新しい方を使うとかできればまだ傷は浅そうだけど」「でもそれって既存システムからの移行という目標を達成できなかったということだし」「特に既存システムでうまく回っているプロジェクトのメンバーを説得するのが大変そう」「移行を指揮した側は達成感あっても、裏で密かに不満がたまってこっそりRedmineを立ち上げるとか🤣」「ありそう🤣」「プラグイン地獄になるくらいRedmineを使いこなしてるなら、そうそう手放さないだろうし」

幼少期のコンピュータ利用と学力

つっつきボイス:「『幼少期のコンピュータ利用と学力に関連がある』みたいな説をどこかで見たんですけど」「その手の説っていろいろ恣意的だったりしますよね😆」「でしょうね😆」「対象となる年齢層が子どもの頃家にパソコンがあったとして、その家庭の世帯収入はどうだったのかみたいな要素だってあるだろうし」「今なんてスマホが流行ってるせいで、情報通信白書あたりによると一時期よりパソコンの所有率下がり始めてるぐらいだし↓」「あ〜」「キーボード打てないとか当たり前みたいな」「きっとこれからもっと下がるんでしょうね😅」

参考: 総務省|平成30年版 情報通信白書|情報通信機器の保有状況

「コンピュータ使用開始年齢にしても然り: 大卒の人たちがコンピュータ使用開始年齢だった頃に家にコンピュータがあったということは、それなりに昔なわけだから、その時代はそもそも今よりもコンピュータの所有率って低かったんじゃね?って思ったり😆」「たしかに😆」「昔にコンピュータ持ってた家なら世帯収入もそれなりにいいだろうし、教育にも金かける傾向が強まるみたいな話にきっとなると思うし😆」「時間推移を調整しておかないとってことか😳」「結局世帯収入の方が学力に影響するってオチだったりして」「実際そっちの可能性の方が濃厚だったりするし」

参考: データえっせい: 幼少期のコンピュータ利用と学力の関連

その他のその他


つっつきボイス:「ラーメン屋で顔認証って、店に入った瞬間に『はいマシマシですね』って機械に先回りされるとか😆」「へ〜、これは意外に広まるかも?」「お〜?」「ほら、常連客って自分がお店から大事にされてると思いがちだったりするし」「店はそこまで思ってなかったりしそうだけど😆」

「こういう情報ってPOS端末あたりに表示すればいいからお客さんに直接見せる必要もないし」「あとはコスト的に見合うかどうか💰」「その店だけで使うならいいけど、与信情報みたく広く共有されてどの店に行っても同じものばかり勧められても困りそう😭」

「あと、おそらくだけど今の日本の法律では客の許可取らずにこれできないと思うし」「あ、そうか🤭」「会員証発行みたいな形式を取ればクリアできそうだけど」「あとはデータの扱いかしら」「学習データは個人情報ではないという見解の人もいたりするけど今後どうなるかだし」

「とにかく自分はこのシステムはちょっと面白そうって思う: 可能性ありそうだし🍜」「割といけそうかも🍲」「ラーメン屋1軒でペイするかどうかはさておいてですが😆」「技術的にはイケそうだけどビジネスはどうなるか」(以下延々)



つっつきボイス:「鬼太郎って海外でそんなに知られてましたっけ?👁」「どうだっけ😆」「たぶん海外からの観光客も、いい加減日本の観光地ずれしたテンプレのサービスに飽き飽きしてるのかも?」「インバウンドとかおもてなしとかで、日本中どこに行っても同じになったらそれはそれでイヤだろうし」

「一回目はアキハバラー!!とかでよくても、2回目ぐらいからはもっと違うところを見たくなるだろうし」「私の親戚がアメリカから遊びに来たときは、まさに1回目はアキハバラ〜!で、2回目は池袋で少年ジャンプのテーマパーク」「あんまし変わってない🤣」「そういう観光客に画一的なおもてなしサービスをぶつけると、たいてい引いていなくなっちゃう🤣」「またそれかよ!みたいな」

番外

昆虫が種類も量も減っているらしい


つっつきボイス:「これマジだったらちょっと怖いかも😨: 温暖化より直近でヤバそうな」「人類が今までばらまいてた農薬の希釈がだんだん追いつかなくなってきたとか?」「マイクロプラスチックなんてのも」「食物連鎖的なところにヒビが入ったりとか」「よく知らないところでいつの間にか大ごとになってるみたいな」「一度も起こったことのないことを研究するのって予測難しそう📈」「地球の歴史スケールで見ると何かのパラメータがピコっと揺れただけだったみたいなことかもしれないし」「でもそのピコっにたまたま俺らが出くわしたら死ぬことになるんだけど😇」

参考: 昆虫種の「壊滅的崩壊」、地球規模で進行中 研究 写真1枚 国際ニュース:AFPBB News
参考: Can Honeybees Learn Math? Research Suggests They Can


今回は以上です。

バックナンバー(2019年度第1四半期)

週刊Railsウォッチ(20190212)EnvoyとIstioに大注目、SQLQLとは、buildkite.comのCI、さよならItanium、PWA vs Androidほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Publickey

publickey_banner_captured

DB Weekly

db_weekly_banner

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ

BPSアドベントカレンダー