- Ruby / Rails関連
週刊Railsウォッチ(20190218)Zeitwerkがやってきた、Railsバリデータの光と影、heavens_door、今月GitHubで盛り上がってるgemほか
こんにちは、hachi8833です。今回のつっつき開始直前にオフィスの蛍光灯が2つ立て続けに生涯を終えたので、morimorihogeさんとbabaさん(実は電気工事施工管理技士でもある)が楽しそうに交換作業してました。写真だとわかりにくいのですが、色味がもろ違ってます。
つっつきボイス:「どもども、やる気が盛り上がってるうちに蛍光灯を交換しようと思って」「すみません、ウォッチのドラフトがぎりぎりでお手伝いする余裕なくて😅」「まあまあ😊」「それはそうとはてブの過去ブクマが統合される件↓ありがたいです🙏: TechRachoのブクマがhttp時代とhttps時代で泣き別れだったのがこれで統合されるといいなと」「そういえば何年か前に問い合わせたら見積りが結構な額になりましたね💸」
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
先週のウォッチが特濃だったので、今回は軽めに戻しました🙇。
⚓Rails: 先週の改修(Rails公式ニュースより)
直近コミットログから見繕いました。
今回はテストの修正が目立つ気がします。
⚓Zeitwerkが6.0に統合された
- PR: Zeitwerk integration by fxn · Pull Request #35235 · rails/rails
- PR: Let Zeitwerk be a dependency of Active Support by fxn · Pull Request #35261 · rails/rails
- New autoloading based on Zeitwerk.
Xavier Noria
e53430fのCHANGELOGより
つっつきボイス:「お、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"
喜びの声もありました↓。
「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なのか」
- リポジトリ: QueueClassic/queue_classic
# 同リポジトリより
# 引数なし
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もそこそこあったので」
- ⚓リポジトリ: solidusio/solidus
「solidusはかのSpreeの後継というかfork」「eコマース用なんですね」
- ⚓リポジトリ: ankane/secure_rails
「secure_railsは見た覚えが」「あ、secure_railsはankaneさんだ: そういえば前取り上げました(ウォッチ20170303)」
- ⚓リポジトリ: eliotsykes/real-world-rails
「Real World Railsもどこかで見たような」「あ、apps/
やengines/
の下にいろんなRailsアプリやエンジンがずらっと入っている: 学習やコードベースの参考に便利ということか」「これ1つgit clone
すればあれこれ探して回るよりいいかも😋」
- ⚓リポジトリ: mixonic/ranked-model
「ranked-modelはacts_as_sortableやacts_as_listの置き換えと言ってるからそういうヤツか」「acts_asなんちゃらは古いgemが多いって言ってましたね(ウォッチ20180126)」
- ⚓リポジトリ: pat/combustion
「combustion知らないけど、Railsエンジンをテストしやすくするものらしき」「ちなみにRailsのマウンタブルエンジンはRailsアプリが丸ごとに近いかたちで入っているので割とかさばります」
- ⚓リポジトリ: remiprev/her
「herは好きだって前言ってましたね(ウォッチ20171027)」「結構好き😍: これだけですべて賄えるとまではいかないけれど」
- ⚓リポジトリ: feedbin/feedbin
「feedbinはマウントするだけで動くRSSリーダーアプリ、ローカルでも動くよって😆」「😆」「RSSリーダーって結局いつの間にか使わなくなるし」「私も今はRSSはSlackのチャンネルで受けて読んでます: リーダー立ち上げなくて済むので断然読みやすいしシェアも楽だし😋」「やっぱそうなるし☺️」
- ⚓リポジトリ: prettier/plugin-ruby
「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/manageiq
- サイト: ManageIQ
「ManageIQ?雑にググってみるとクラウド管理サービスということらしき↓」「2012年にRed Hatが買収したのか」「こんな感じのツールってあったかもそういえば: 自分たちで立ち上げるのはやだけど😆」
参考: Red HatがManageIQを買収、ハイブリッドクラウド管理サービス強化へ:既存のIaaS/仮想化ツールを補完 - @IT
- ⚓リポジトリ: algolia/algoliasearch-rails
「あ、Algoliaは以前翻訳した超高速の検索APIサービスです」「AlgoliaをRailsから使えるgemね」
- ⚓リポジトリ: danmayer/coverband
「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エディタですね」
「今ならsimple_form使うよりbootstrap_formの方がよさげ👍」
「macinboxもこの間取り上げたし(ウォッチ20190204)、heavens_doorはたまたま次にエントリ用意してあるので次へ👉」「おk」「solargraphも前扱ってた(ウォッチ20190121)」
- ⚓リポジトリ: zdennis/activerecord-import
- リポジトリ: ddnexus/pagy
「これもよく登場した定番gemですね☺️(ウォッチ)」「Pagyは高速ページネーション↓」
- ⚓リポジトリ: ankane/blazer
- デモサイト: Blazer
「これもankaneさんのBlazerはビジネスインテリジェンス向けってありますけど、ビジネスインテリジェンスってそもそも何でしたっけ?😅: 経営戦略をサジェスチョンするとか?」「いえいえそういうのじゃなくて、大量にあるデータの中から意味のあるデータを抽出すること😎」「あ、もっと広い意味でしたか💦」
「BIは言ってみればデータビジュアライゼーションとデータ集計を組み合わせたような分野で、この種のBIツールで有名なのはtableau↓とかですね」「タブロー、知りませんでした...」「tableauは超有名よん✨」
「対象としてよく使われるのはCSVだったり、あるいはデータベースのデータの正規化をあえて落として、第3正規形を第1正規形にしたものだったりしますね」「お〜!」「そういうデータウェアハウスなんかの超絶デカいデータ🗻なんかにクエリをかけてよしなに分析するみたいなのをやります」
参考: [DB] 第一正規化・第二正規化・第三正規化の違い | ロジカルシンキンぐんっ!
「ビジネスという言葉につられてしまったけど、BIはそういうことだったんですね」「そうやって得られた結果を次のビジネス戦略に使ったりしますね」
「でblazerなんだけど、自分だったらこの手のgemで頑張るよりtabreauで頑張る方がいいと思うし😆」「たしかに〜😆」「BIやってみようっと」
「run.rbも先週やりましたね(ウォッチ20190204)」
- ⚓🌟リポジトリ: jbodah/suggest_rb🌟
「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)
おそらく既に古参勢から同様のツッコミが入っていることかと思いますが、suggest ってやつは、drnic の what? (a.k.a. what_methods) の初出が2006年なのでめちゃめちゃ古典的なやつですね。パクりだとまでは言わないけど、一周回って新しいみたいな感じでしょうか。 https://t.co/aqIlzcZF1y
— Akira Matsuda (@a_matsuda) February 19, 2019
ご指摘ありがとうございます!これは気づきませんでした🙇。
参考: Andrew Birkett's MethodFinder in Ruby -- 上のarchive.orgからたどりました。
「TTYはイイやつ(ウォッチ20180615)」
- ⚓リポジトリ: awesome-print/awesome_print
「awesome_printはデータ構造をこうやってキレイに整形して色付きで出力してくれる🌈↓」
似たような感じで、k0kubunさんがだいぶ前に作ってくれたGo言語向けのpp↓はいつも愛用してます🙇。
- リポジトリ: k0kubun/pp
「pipe_operatorもこの間出ましたね(ウォッチ20190121)」「本当に使われてるんだろうか?って思ったりするけど😆」
「Netflixの高速なfast_jsonapiも出てた(ウォッチ20180209)」
- リポジトリ: rubysherpas/paranoia
「paranoiaは論理削除gem」「使う前によく考えないといかんヤツですね↓」
⚓heavens_door: amatsudaさん謹製のCapybaraスクリプト生成gem
- リポジトリ: amatsuda/heavens_door
「先週エントリに載せようと思って漏らしてました😅」「右上のボタンを押すとレコーディング開始して、Capybaraのテストスクリプトを生成してくれる🥰」「おーなるほど!自分のところでこんなにキレイに取れるかしら?」「見た感じマウスオーバーまでは取ってないようなので、そのあたりは自分でやる感じでしょうね☺️」「fill_in
のリンクとかも、同じようなリンクがいっぱいあったりする場合にどこまでキレイに取れるかはわからないし」
「まあそんなのは手で直せばいいことで、それよりもこうやってスタブコードをどんどん作れるのはとてもありがたい🙏」「うれしいよぉ〜😂」「いいgem👍」「天国見えた😇」
天国の扉はボブ・ディランの曲かなとも思いましたが、カウボーイビバップの方がありそうかなと思いました。
⚓strftimer: strftimeのジェネレータサイト(Ruby Weeklyより)
つっつきボイス:「おお、これはstrftime
の日時フォーマットを生成してくれるヤツ😂」「『クリックしてAdobe Flash Playerを有効にします』って😆」「わお😆」「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
⚓番外: 翻訳のノウハウ動画
いい翻訳実況動画...!! 😻✨ #Railsチュートリアル でも @hachi8833 さんと相談して、読んでいる人達にとって『読みやすい』『クスッときた』と感じる文章をなるべく心掛けようと決めましたが、構成や文体を工夫するだけでどのぐらい読みやすくなるのかが端的に解説されてて素晴らしい動画でした! 👏✨ https://t.co/OTOjUlEVdB
— 安川要平/Yohei Yasukawa (@yasulab) February 10, 2019
つっつきボイス:「ファクトフルネス、買ったけどまだ読んでなかった」「この動画を安川さんに教えていただいたんですが、翻訳上の配慮の説明がよかったので😍」「お〜では」(しばし鑑賞)
「なるほど〜、ちょっとコードのリファクタリングみたい😊」「確かに良くできてるけど、構成まで変わったものを本来の意味での翻訳と呼んでいいのかどうかちょっと疑問が😅」「まあどちらかというとライティングのテクニックではありますね」「ライティングの手法としては非常にいいけど、翻訳と呼びたくない気が😆」「まあ翻訳も一種類じゃないのでものによりますね: コアな技術ドキュメントは丸めたり構成を変えたりするわけにいかないですし」「論文みたいに元々論理的に書かれている文書の翻訳なんかも構成とか曲げて欲しくないし☺️」
「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
今日はバレンタインデーなので豚まんをもらった
— Yukihiro Matz (@yukihiro_matz) February 14, 2019
かわゆいです❤️
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓SNIでサイトを遮断?
つっつきボイス:
「記事の中で遮断をSNIプロトコルベースで行ったとあって、遮断やら通信の秘密やらもさることながら、そっちが気になってて、SNIってそういう使い方するものなのだろうかと思って😅以下↓を貼ってみました」「このQiita記事のEncrypted SNIとか、あとはDNS over HTTPSあたりの記事は、今のようなときこそ読んでおくといいですね👍」
「韓国のサイト遮断ってまさか抜き打ちでやったんだろか?🇰🇷」「どうなんでしょう、普通なら事前周知でしょうけど...」「日本もこの辺いろいろ言われてたりするけど🇯🇵」「そういえば漫画村遮断するとかしないとかやってましたね」「カドカワの退陣劇とか😆」
これを見る限りですが、法改正も含めて10年ぐらいかかってるようです↓。
⚓その後
韓国では既にEncrypted SNIをブロックしているようです…https://t.co/88huaaiy1l
— migimigi (@migimigi_) February 13, 2019
⚓今やスクショの方がWebサイトより軽い
参考: 「著作権侵害だから」という理由で「スクリーンショットを規制」するとマジで死ぬというのをかつて証明した実例がある - GIGAZINE
「上の記事はサイト遮断とは関係ないんですが、規制で自分の首を絞めた話ということで貼ってみました」「そういえばはてブあたりでこんな話が: 今の若い人はWebサイトをスマホで友だちとかにシェアするときにURLではなくてサイトのスクショ画像を投げ合ってたりするけど、今やWebサイトを開くよりもスクショの方がデータ転送量が軽いよねって指摘してた人がいた」「あー!😮言われてみれば...」「スクショ投げ合ってる人たちがそこまで考えてやってるかどうかまでは知りませんが😆」「😆」
「スマホだとURLよりスクショの方が取りやすいというのはありそう」「それもありますが、今どきのWebサイトはWebフォントも含めてたいていメガ単位の通信量でデータ投げてくるし🗿: TechRachoもちょっとChrome DevToolsで見ただけでメガ単位だし↓」「普段から私がウォッチにツィートやら動画やら貼ってるせいもありますね😅」「あ、今のスクショは解像度が高いから撮り方にもよるだろうけど、うまく圧縮かかればスクショの方が軽くなるナ😎」「何という逆転⚽」
なお上はシークレットモードで初回読み込んだときのスクショなので、キャッシュが効いてない状態です。
「あとSNIがらみということで、ちょうどRuby trunkにあった以下のissueをあえてここに貼ってみました」「IMAPが懐かしすぎるのはさておいて🤣、Rubyにnet/imapなんてのがあったなんてねー」「修正はめちゃピンポイントですね↓」「hostを受け取れるようにしただけと☺️」
- Feature #15594: [PATCH] net/imap: support SNI - Ruby trunk - Ruby Issue Tracking System
- net/imap: support SNI by Keruspe · Pull Request #2077 · ruby/ruby
# 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
⚓コンテナビルドツール続々
- 元記事: Google、コンテナイメージへのビルドをより高速にする機能を「Cloud Build」に搭載。Kanikoを採用 - Publickey
- 元記事: Javaアプリケーションを自動的にコンテナイメージにビルドするツール「Jib」がバージョン1.0に到達 - Publickey
つっつきボイス:「Publickeyでkanikoとjibが仲良く立て続けに出ていたので🦀」「あーなるほど、コンテナイメージだけ欲しいときに誰かがビルドしてくれるとうれしいというヤツ」
- リポジトリ: GoogleContainerTools/kaniko
- リポジトリ: GoogleContainerTools/jib
「こういうのが出てくると、DockerデーモンがなくてもDocker環境を作れるようになるナ」「あー、そこがうれしみなんですね😀」「もういい加減みんなLinuxサーバーを1台もホスティングしたくないんでしょう😆」「😆」「だからビルドも何もかも全部外でやりたいと: Dockerイメージをビルドする専用のCIを回したいならこういうのがあってもいいかもですね🥰」
⚓その他クラウド
パフォーマンスに関して言うと結構前に元MSの中の人が嘆いていたな。「モジュール単位で部署が別れてセクショナリズムに陥ってる」「そもそもWindowsのビジネスを脅かす最大の脅威はパフォーマンスではなくセキュリティだからWindowsの性能を改善するモチベは実はほぼ無い」という感じ。
— くまぎ (@kumagi) February 11, 2019
つっつきボイス:「相当昔の話ですが、マイクロソフトに転職した知人がその後すごく消耗して辞めたときに『社内の権力争いがひどすぎる』と漏らしてたのを思い出しました」「まあその手の話はちらほら聞いたことあるし、あれだけ大きい会社ならあっても不思議じゃないし☺️」「それだけに最近のマイクロソフトの浄化の進み具合が驚きですね」
はい!!! public な Piping Server を踏み台にすれば,外向きへのTCP 80しか許されていない2つのピア間で SSH が張れることが分かりました!!! クライアント・サーバ合計で3つのコマンドを実行するだけです!!! これ以上これで遊ぶのは全企業の情報システム管理部署から指名手配されるので終了! pic.twitter.com/18nYbgc3Vz
— Akso de la Malbono (@Cryolite) February 9, 2019
つっつきボイス:「これはまたえらく古めかしいテクニック🏛: Skypeがこういうのやってたのもいったいいつの頃だったか😆」「やっぱり〜」「この手のover HTTP的にプロトコル通すのはSkypeが一番積極的にやってましたね👾: いわゆるNAPT越え」「あーそれか: ググると2000年代初頭の記事がズラリですね」
⚓SQL
⚓ MandrillのPostgreSQLが止まった(DB Weeklyより)
つっつきボイス:「PostgreSQLが息しなくなったみたいな話がHacker Newsにあがってたそうです」「そういやGitLabでもそんなことがあったし😇」「このMandrillって何のサービスでしたっけ?」「あーMailchimpのアドオンみたいなやつ」「メールのマーケティングとかそっち方面みたい: chimp(=チンパンジー)だからマンドリルなのかも🐵」「結構昔からあるサービスだったと思う: Rails 2ぐらいの頃とか」
- サイト: Transactional Email from Mailchimp - Mandrill
- Mailchimp: Marketing Platform for Small Businesses
⚓csvq: SQLでcsvに直接アクセス
# 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しかやったことのないエンジニアが作ったアプリのデータベースがやってきたりすると結構つらい😭: もうそういうときはデータベースごと作り直すなんてこともしますし」「泣けてくる😢」
We use SQLite mounted on a shared volume in WAL mode, which uses a shared memory segment. Works great.
— rick branson (@rbranson) January 30, 2019
⚓JavaScript
⚓「実践: React Hooks」
// 同記事より
function Foo({x}) {
useEffect(() => console.log('x changed'), [x]);
return <div>{x}</div>
}
つっつきボイス:「React Hooksはよくわがんねけど、まあmizchiさんがこういう解説を書いてるうちは積極的に使わなくても大丈夫かなと😆」「それいいかも😆」「mizchiさんは特殊系というか強い人だし、彼が使ってみた感想書いてる段階ならproductionであえて使わなくてよさげかも☺️」
「上と関係ありませんが、mizchiさんにもお師匠さんいるんだなと思って↓」「mizchiさんがメンターの下にいた時代面白い😆: 最終的にメンターとは相性次第だと思いますけどね☺️」
一度タイトで粒度の綺麗に切れたコミットをできるようになると、あとは崩してもなんとかなるからなあ。と書いてみて思ったけど自分はコミットが整理できていないときは仕事がゴールを見失ってることがほとんどだわ
— 藤村 | CTO@STORES (@ffu_) February 7, 2019
⚓言語
⚓GoのモジュールとGOPATH汚染問題
つっつきボイス:「GOPATH
ってモードなんだ!」「Go言語が次のバージョンでパッケージ管理をいよいよモジュールに切り替えるので、今はエクスペリメンタルに使える形なんですが、まだ試す余裕がなくて😅」「Go言語って元々でかいものを作ることが想定になかった節がありますよね😆: 言語仕様が小さいからと当時ドヤリングされてたのが結局こうなってきたし🤣」「クラス的なものもないし、コマンドラインツールをさっと作る感じでしたね🤣」「ある程度以上大きくなってくると、モジュールの名前空間を管理できるようにならないといろいろつらくなるだろうなって想像つくし😎」
「GOPATH
に縛られる問題はいろいろつらい目に遭いました: go get
すると常に最新のパッケージをfetchするのでそのままだとバージョンロックできなかったし、GCPでGo言語やろうとするとGOPATH
にあるパッケージを全部アップロードされたりしたのでenvを無理やり切り替えてドツボにはまったり😢」
⚓「未踏ジュニア」を応援しよう
2019年度の #未踏ジュニア は文科省も後援に追加!テクノロジー系の飛び抜けた才能を伸ばす教育に全振りしている未踏ジュニアのような活動を文科省が後援してくれるなんて!公教育関連の話題は悪いニュースの方がシェアされがちだけど、こういう良いニュースも広まって欲しいhttps://t.co/HcnBddNL3N
— 寺本.hackforplay(); (@teramotodaiki) February 13, 2019
つっつきボイス:「お、未踏ユースって今は未踏ジュニアって言うんだ」「あ、違う名前で前からやってたんですね?」「こういう名前はいろいろ変わったりしますけどね☺️」
「何と、未踏ジュニアってスポンサーがついてるじゃん↓❣️: 国の予算が減ったとか?😆」
「あ、RailsチュートリアルとRailsガイドで私が一緒にやってる安川さんもPMとスポンサーになってるし↓: そういえば安川さんも未踏出身でした」「ko1さんもいる、お、竹内さんがスーパバイザー😍」「お〜」
参考: 竹内郁雄 - Wikipedia
「うん、未踏は国の金を使うプロジェクトとしてはいいんじゃないって思うし👍」「かなり成果出してる印象ありますね🥰」「まあユースは本家未踏に比べて予算安いですが😆」
「ジュニアは今見てみると50万か: 本家はたしか一千万ぐらい出せてだいたい何でも買えるし💰、物を買う以外に給与みたいな人件費にも使えるし」「クラウド課金とかもですね」「もちろん経費にできます😎」
⚓その他言語
皆んな争うのはやめて!(´・ω・) https://t.co/GpBfSLjANc
— 16tons (@16tons_) February 10, 2019
⚓その他
⚓RedmineからBacklogへ
つっつきボイス:「社内のRedmineヘビーユーザーがいろいろつらそうにしてたので、移行記事を拾ってみました」「移行か〜」「Redmineの移行は難しそう😅」「Redmine捨ててこれからはBacklogとかならともかく😆」
「Redmineのプラグイン地獄とかあるし👺」「ま、Backlogはできないことがいろいろあるところがいいよね、なんて😅」「機能が絞り込まれてるとも言いますね😅」
「そうそう、Backlogは安い(16,000円/月程度)というのはメリット💰」「Basicプランでユーザー100個作れるしほぼほぼ無限と言っていいし、次のプランも大して高くないし」「そこまでいったら1プロジェクト100円とかそんな値段😆」
「それにしても既存のチケットがある状態でよく移行したなと思うし」「スゴい」「既存システムはそのままで新規プロジェクトから新しい方を使うとかできればまだ傷は浅そうだけど」「でもそれって既存システムからの移行という目標を達成できなかったということだし」「特に既存システムでうまく回っているプロジェクトのメンバーを説得するのが大変そう」「移行を指揮した側は達成感あっても、裏で密かに不満がたまってこっそりRedmineを立ち上げるとか🤣」「ありそう🤣」「プラグイン地獄になるくらいRedmineを使いこなしてるなら、そうそう手放さないだろうし」
⚓幼少期のコンピュータ利用と学力
つっつきボイス:「『幼少期のコンピュータ利用と学力に関連がある』みたいな説をどこかで見たんですけど」「その手の説っていろいろ恣意的だったりしますよね😆」「でしょうね😆」「対象となる年齢層が子どもの頃家にパソコンがあったとして、その家庭の世帯収入はどうだったのかみたいな要素だってあるだろうし」「今なんてスマホが流行ってるせいで、情報通信白書あたりによると一時期よりパソコンの所有率下がり始めてるぐらいだし↓」「あ〜」「キーボード打てないとか当たり前みたいな」「きっとこれからもっと下がるんでしょうね😅」
参考: 総務省|平成30年版 情報通信白書|情報通信機器の保有状況
「コンピュータ使用開始年齢にしても然り: 大卒の人たちがコンピュータ使用開始年齢だった頃に家にコンピュータがあったということは、それなりに昔なわけだから、その時代はそもそも今よりもコンピュータの所有率って低かったんじゃね?って思ったり😆」「たしかに😆」「昔にコンピュータ持ってた家なら世帯収入もそれなりにいいだろうし、教育にも金かける傾向が強まるみたいな話にきっとなると思うし😆」「時間推移を調整しておかないとってことか😳」「結局世帯収入の方が学力に影響するってオチだったりして」「実際そっちの可能性の方が濃厚だったりするし」
参考: データえっせい: 幼少期のコンピュータ利用と学力の関連
⚓その他のその他
つっつきボイス:「ラーメン屋で顔認証って、店に入った瞬間に『はいマシマシですね』って機械に先回りされるとか😆」「へ〜、これは意外に広まるかも?」「お〜?」「ほら、常連客って自分がお店から大事にされてると思いがちだったりするし」「店はそこまで思ってなかったりしそうだけど😆」
「こういう情報ってPOS端末あたりに表示すればいいからお客さんに直接見せる必要もないし」「あとはコスト的に見合うかどうか💰」「その店だけで使うならいいけど、与信情報みたく広く共有されてどの店に行っても同じものばかり勧められても困りそう😭」
「あと、おそらくだけど今の日本の法律では客の許可取らずにこれできないと思うし」「あ、そうか🤭」「会員証発行みたいな形式を取ればクリアできそうだけど」「あとはデータの扱いかしら」「学習データは個人情報ではないという見解の人もいたりするけど今後どうなるかだし」
「とにかく自分はこのシステムはちょっと面白そうって思う: 可能性ありそうだし🍜」「割といけそうかも🍲」「ラーメン屋1軒でペイするかどうかはさておいてですが😆」「技術的にはイケそうだけどビジネスはどうなるか」(以下延々)
Link: 「日本人だけが知らない」鳥取県が外国人観光客をうなぎのぼりに集める3つの理由 | 文春オンラインhttps://t.co/QYCewUhmJG
— Yukihiro Matz (@yukihiro_matz) February 13, 2019
つっつきボイス:「鬼太郎って海外でそんなに知られてましたっけ?👁」「どうだっけ😆」「たぶん海外からの観光客も、いい加減日本の観光地ずれしたテンプレのサービスに飽き飽きしてるのかも?」「インバウンドとかおもてなしとかで、日本中どこに行っても同じになったらそれはそれでイヤだろうし」
「一回目はアキハバラー!!とかでよくても、2回目ぐらいからはもっと違うところを見たくなるだろうし」「私の親戚がアメリカから遊びに来たときは、まさに1回目はアキハバラ〜!で、2回目は池袋で少年ジャンプのテーマパーク」「あんまし変わってない🤣」「そういう観光客に画一的なおもてなしサービスをぶつけると、たいてい引いていなくなっちゃう🤣」「またそれかよ!みたいな」
⚓番外
⚓昆虫が種類も量も減っているらしい
https://www.youtube.com/watch?v=WTU4HDHq3k4
つっつきボイス:「これマジだったらちょっと怖いかも😨: 温暖化より直近でヤバそうな」「人類が今までばらまいてた農薬の希釈がだんだん追いつかなくなってきたとか?」「マイクロプラスチックなんてのも」「食物連鎖的なところにヒビが入ったりとか」「よく知らないところでいつの間にか大ごとになってるみたいな」「一度も起こったことのないことを研究するのって予測難しそう📈」「地球の歴史スケールで見ると何かのパラメータがピコっと揺れただけだったみたいなことかもしれないし」「でもそのピコっにたまたま俺らが出くわしたら死ぬことになるんだけど😇」
参考: 昆虫種の「壊滅的崩壊」、地球規模で進行中 研究 写真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ほか
- 20190204 あってうれしい40のgem、Ruby 2.6.1セキュリティリリース、Hanami v2.0.0.alpha1リリースほか
- 20190128 Rails 6のオートローダーがZeitwerkに置き換わる?Rails 6はRuby 2.5が必須、最近のSQLiteほか
- 20190121 Rails 6.0.0 beta1リリース、Railsは2019年も「あり」か、Jetsでサーバーレス、ES2018の新機能、RSpecの心ほか
- 20190115 Rubyの<=でクラス同士を比較、Rubyの記号の読み方いろいろ、Ruby C API解説サイトほか
- 20190107 Railsのパフォーマンス改善Tips集、Rubyの
&:シンボル
ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。