Clik here to view.

こんにちは、hachi8833です。やっとGobyにRipper
ライブラリをマージしました。
束の間の涼しい夏日のウォッチ、いってみましょう。
各記事冒頭にはImage may be NSFW.
Clik here to view.でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
Image may be NSFW.
Clik here to view.
【お知らせ】週刊Railsウォッチ「公開つっつき会 第1回」今週8/2(木)開催
今週木曜日です。引き続き参加をお待ちしております!Image may be NSFW.
Clik here to view.懇親会にて軽食&ビールもお待ちしていますImage may be NSFW.
Clik here to view.。
【宣伝】弊社で毎週やっているRuby/Rails/Web開発関連の最新survey会である週刊Railsウォッチのオフライン公開勉強会を8/2(木)に開催します。10人以下のひっそりとした規模で試しにやってみる感じですが、興味のある方は是非ご参加下さい! https://t.co/lYOQuBjrwq
— Masato Mori (@morimorihoge) July 24, 2018
Image may be NSFW.
Clik here to view.
Rails: 先週の改修(Rails公式ニュースより)
先週は公式の更新情報がなかったので、masterブランチなどから見繕いました。
Image may be NSFW.
Clik here to view.
scoping
メソッドの廃止(オープン中)
これまでの
scoping
は、元のスコープチェインを伝搬させる目的で、リレーション由来の名前付きスコープメソッドの委譲に使われてきた。しかしクラスメソッドへのクエリがすべて汚染されるという望ましくない振る舞いが生じていた(例↓)。
class Topic < ActiveRecord::Base
scope :toplevel, -> { where(parent_id: nil) }
scope :children, -> { where.not(parent_id: nil) }
scope :has_children, -> { where(id: Topic.children.select(:parent_id)) }
end
# 期待どおり動作
Topic.toplevel.where(id: Topic.children.select(:parent_id))
# `toplevel`から`Topic.children`にお漏らししてるので動かない
Topic.toplevel.has_children
#29301で名前付きスコープ内のレシーバがモデルクラスから元のスコープチェインに変更されたので、クラスメソッドのクエリ汚染は必要でなくなった。
同PRより大意
# activerecord/lib/active_record/relation.rb#L310
def scoping
- previous, klass.current_scope = klass.current_scope(true), self
- yield
+ previous, klass.current_scope = klass.current_scope(true), scope
+ delegate_to { yield }
ensure
klass.current_scope = previous
end
kamipoさんによるPRです。まだマージされていません。
つっつきボイス: 「Railsdmのオーラスでkamipoさんが言及してたので(先週のウォッチ)」
Image may be NSFW.
Clik here to view.
Rubocopのお導きでパフォーマンスを改善
- PR: Turn on performance based cops by oniofchaos · Pull Request #32381 · rails/rails
- 関連: Use fast ruby idioms by oniofchaos · Pull Request #32337 · rails/rails
# actionpack/lib/action_controller/metal/strong_parameters.rb#L793
protected
attr_reader :parameters
- def permitted=(new_permitted)
- @permitted = new_permitted
- end
+ attr_writer :permitted
- getter/setterメソッドより
attr_accessor
を使うべし(メソッドは12%遅い) map.flatten(1)
よりflat_map
を使うべし(flatten
は66%遅い)- (正確には「
map.flatten(1)
は66%遅い」ですねImage may be NSFW.
Clik here to view.)
- (正確には「
- 引数が1つなら
hash.merge!
よりhash[]=
を使うべし(merge!
は166%遅い)
つっつきボイス: 「flat_map
って初めて見たImage may be NSFW.
Clik here to view.」「TechRachoにあるRubycop式Rubyスタイルガイドにも載ってた気がします(↓あった:2-70)」「
flatten
は泥臭いデータ構造を処理するときに結構使うけど最近あまり使ってないImage may be NSFW.
Clik here to view.、
flatten
の動作は再帰的だと思われるので遅そう」「何となく英語圏にflatten
好きが多い気も」「ちーっす」「お、ちょうどいいところへ: flat_map
って使います?」「存在は知ってるけど使ったことはちょっと…Image may be NSFW.
Clik here to view.」「やっぱりねー」「
flatten
してからmap
するってことかな?」「可読性とのバランスもあるし、速い書き方よりメジャーな書き方の方がいいときもあると思うんだけどなーImage may be NSFW.
Clik here to view.」
#flat_map
: 配列の階層を1段階浅くする#flatten
: 配列の階層を完全にフラットにする(再帰)
参考: instance method Array#flatten
(Ruby 2.5.0)
参考: instance method Enumerable#collect_concat
(Ruby 2.5.0) — flat_map
はこのエイリアスでした
「『merge!
は166%遅い』というのもスゴイImage may be NSFW.
Clik here to view.」「これは確かに
hash[]=
の方がわかりやすいし速いのも納得だけど、例外が発生する可能性があるならmerge!
がいいかもね: それにフレームワークのコード(strong parametersとか)はいくつ渡すか決められないものも多いからmerge!
になるだろうし」
このPRで引用されていた#32337で、fast-rubyとfasterer gemを知りましたのでこの後の「Ruby」のコーナーで。
Image may be NSFW.
Clik here to view.
ブロック渡しよりシンボル渡し
2014年のコミットなのでだいぶ古いですが、上の#32381で言及されていたので。
def finalize!
route_sets.each do |routes|
routes.finalize!
end
end
# ↓
def finalize!
route_sets.each(&:finalize!)
end
ざっと見ると、インスタンス変数の個数が少ない場合はブロック渡しのほうが速く(Proc
オブジェクトが生成されないので)、多くなるとシンボル渡しの方が速くなるとあります(16833#)。
つっつきボイス: 「&:finalize!
みたいなProcにシンボルを渡す記法、今でこそ慣れたけど最初見たときは『へ?Image may be NSFW.
Clik here to view.』って思いましたね: もうイディオムとして普及しているので、単純な呼び出しならProcシンボル渡しの方がいいのかも」
自分でもRuby 2.5.1でベンチ回してみました。
Image may be NSFW.
Clik here to view.
参考: &演算子と、procと、Object#method について理解しなおす - Qiita
Image may be NSFW.
Clik here to view.
日付を2000-01-01で正規化してサマータイムのDBとの日付のズレを修正
- PR: Normalize the date component to 2000-01-01 automatically by azbshiri · Pull Request #33358 · rails/rails
- commit: Normalize time value not to be affected by summer time · rails/rails@c02f357 — SQLite3用修正
- PR: Summer time · Issue #32550 · rails/rails(マージされずにclose) — サマータイム問題の提起
# activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L132
def quoted_time(value) # :nodoc:
+ value = value.change(year: 2000, month: 1, day: 1)
quoted_date(value).sub(/\A\d\d\d\d-\d\d-\d\d /, "")
end
つっつきボイス: 「今はもう2000-01-01で正規化できちゃうのね(遠い目」「UNIX時間だと1970年あたりから開始でしたっけ↓」「connection_adaptersのあたりとか触ったことない」「サマータイムなければいいのにって思うし」
参考: Ruby on Rails 5.2 / ActiveRecord::ConnectionAdapters::Quoting#quoted_date
— DevDocs
参考: UNIX時間 - Wikipedia — 「協定世界時 (UTC) での1970年1月1日午前0時0分0秒から」
「そういえば昔『インターネット時間』ってものがありましたねー: 自分が覚えているのはPSOことファンタシースターオンライン(セガのネトゲ)で使われてたくらいImage may be NSFW.
Clik here to view.」
参考: ファンタシースターオンライン - Wikipedia
「あ、ちょうど今日タバコ吸いながらその話になったんですが、その昔腕時計で有名なSWATCHがインターネット時間を提唱したんだそうです↓」「へー?そっちが元だったのか」「何でも一日を1000で割るという豪快な案らしくてImage may be NSFW.
Clik here to view.」「何ちゅうImage may be NSFW.
Clik here to view.」「PSOもたぶん初期がそれだったし: 世界中で同時にサービスしてたからでしょうけど」「時差というか経度に影響されない時間だからですね」「細かい単位を小数点で表せるのは10進数ならでは」「結局インターネット時間はさっぱり定着してませんがImage may be NSFW.
Clik here to view.: UNIX時間でいいけど別に」
参考: スウォッチ・インターネットタイム - Wikipedia
Image may be NSFW.
Clik here to view.
Wikipediaより: [CC BY 2.5](Creative Commons — Attribution 2.5 Generic — CC BY 2.5)
Image may be NSFW.
Clik here to view.
Railsガイドへのリンクを遅まきながらHTTPS化
# README.md#L78
5. Follow the guidelines to start developing your application. You may find
the following resources handy:
- * [Getting Started with Rails](http://guides.rubyonrails.org/getting_started.html)
- * [Ruby on Rails Guides](http://guides.rubyonrails.org)
+ * [Getting Started with Rails](https://guides.rubyonrails.org/getting_started.html)
+ * [Ruby on Rails Guides](https://guides.rubyonrails.org)
* [The API Documentation](http://api.rubyonrails.org)
* [Ruby on Rails Tutorial](https://www.railstutorial.org/book)
つっつきボイス: 「ほら、Chromeが最近…」「API DocはまだHTTPS化されてない?」
なおAPI Documentationは既にHTTPSされてますが、執筆時点のmasterのリンクはまだ修正されてないようです。
Image may be NSFW.
Clik here to view.![⚓]()
limit(1).first
とlimit(1).last
で前者だけがデフォルトで主キーでソートされていたのを修正
# activerecord/lib/active_record/relation/finder_methods.rb#L552
def ordered_relation
- if order_values.empty? && primary_key
+ if order_values.empty? && primary_key && limit_value.blank?
order(arel_attribute(primary_key).asc)
else
self
end
end
よくみると2016年にオープンされていたのをkamipoさんがつい最近マージしていました。breaking changeなのでバックポートはしないようです。類似の#27597はbreakingではないので早々にマージされたとのこと。
つっつきボイス: 「2年越しのマージ」「あーなるほど、遅延評価されるときにfirst
とlast
の結果が違ってたということか: でもlimit(1).first
なんて異常な書き方は普通まずしないしImage may be NSFW.
Clik here to view.」「でもスコープに
limit
書いちゃうと踏むことがあるかも?」「#27597は以前のウォッチで見たことあるな」「#27597は明らかにバグだから全員困るけど、この#24131は修正することで逆に困る人が出てくるからバックポートしなかったんでしょうね」
Image may be NSFW.
Clik here to view.
Active Recordコールバックの引数を厳密にチェック
# activemodel/lib/active_model/callbacks.rb#L127
private
def _define_before_model_callback(klass, callback)
- klass.define_singleton_method("before_#{callback}") do |*args, &block|
- set_callback(:"#{callback}", :before, *args, &block)
+ klass.define_singleton_method("before_#{callback}") do |*args, **options, &block|
+ options.assert_valid_keys :if, :unless, :prepend
+ set_callback(:"#{callback}", :before, *args, **options, &block)
end
end
def _define_around_model_callback(klass, callback)
- klass.define_singleton_method("around_#{callback}") do |*args, &block|
- set_callback(:"#{callback}", :around, *args, &block)
+ klass.define_singleton_method("around_#{callback}") do |*args, **options, &block|
+ options.assert_valid_keys :if, :unless, :prepend
+ set_callback(:"#{callback}", :around, *args, **options, &block)
end
end
def _define_after_model_callback(klass, callback)
- klass.define_singleton_method("after_#{callback}") do |*args, &block|
- options = args.extract_options!
+ klass.define_singleton_method("after_#{callback}") do |*args, **options, &block|
+ options.assert_valid_keys :if, :unless, :prepend
options[:prepend] = true
conditional = ActiveSupport::Callbacks::Conditionals::Value.new { |v|
v != false
}
options[:if] = Array(options[:if]) << conditional
- set_callback(:"#{callback}", :after, *(args << options), &block)
+ set_callback(:"#{callback}", :after, *args, **options, &block)
end
end
つっつきボイス: 「おー、今までの*args
の他に**options
も追加されてる」「options.assert_valid_keys :if, :unless, :prepend
でアサーション追加してますね」「コールバックメソッドに余計なオプションを付けられないようにしてるようだ」
Image may be NSFW.
Clik here to view.
番外: Railsガイドの囲みの背景色を変更
PRそのものより、これを投げたlanzhihengさんのアバターが喚起する極めて強い既視感が気になったので。
つっつきボイス: 「こういう修正は地味だけど重要ですね: 見やすいは正義」「とりあえずアバターをどぞ」「これは結城浩さんのスレッドおばけっぽいw: 結城さんのアバターはこういうクォータービューじゃないけどImage may be NSFW.
Clik here to view.」「好きなのかな?」「間違える人いそうImage may be NSFW.
Clik here to view.」
アマゾンで予約が始まりました!
『数学ガールの秘密ノート/行列が描くもの』(結城浩)https://t.co/yfpBzTP80c— 結城浩 (@hyuki) June 19, 2018
Image may be NSFW.
Clik here to view.
Rails
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
今週の人気Railsリポジトリ(2018/07/23)Image may be NSFW.
Clik here to view.![⭐]()
今回最も盛り上がりました。目ぼしいもののみピックアップしてみました。Railsアプリでないものもあったりします。こちらの記事にImage may be NSFW.
Clik here to view.を進呈いたします。おめでとうございます。
つっつきボイス: 「お、知らないものがいろいろあるなー」「どれどれImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Zammad: ヘルプデスク/カスタマーサポートアプリ
- サイト: Zammad Community | Home & Download
- スクリーンショット: Zammad Community | Screenshots
- リポジトリ: zammad/zammad
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
同サイトより
「ヘルプデスク/カスタマーサポートのシステム」「Redmineと同じような感じで、Railsで書かれたアプリか」「errbitみたいな感じで導入できそう」「そんな感じで単体でも導入できるしRailsエンジニアがカスタマイズもできると: これなかなかよさそうじゃないImage may be NSFW.
Clik here to view.」「Image may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
flutie: content_for
を改善
- リポジトリ: thoughtbot/flutie
Factory_botでおなじみThoughtbotのgemです。
つっつきボイス: 「フルーティ?」「むむん?ははー、content_for
をもっと使いやすくするgemか!」「地味といえば地味」「SEO的な改修をしたい人向けっぽいかも」「確かに今のcontent_for
って生々しすぎてちょっと使いづらいし、デフォルト値書き忘れたりするし、lambda渡し始めるとつらくなってくるし」「content_for
って、記述したものがyield
で呼び出されるのが違和感あるんですよ: 『え?yield
でやるの?』っていう気持ちになるし、そのことを知らないと直感的にわかりづらい」「その意味ではflutie
はcontent_for
よりは読みやすいですねImage may be NSFW.
Clik here to view.」
#同リポジトリより
content_for(:site_page_title, 'My title of my page')
page_title(:app_name => 'My app name', :page_title_symbol => :site_page_title, :separator => " | ")
=> "My app name | My title of my page"
参考: Ruby on Rails 5.2 / ActionView::Helpers::CaptureHelper#content_for
— DevDocs
Image may be NSFW.
Clik here to view.
OpenProject: プロジェクト管理
- サイト: OpenProject - online project management software - free and open source
- インストールガイド: Install OpenProject - Free Download
- リポジトリ: opf/openproject
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
同サイトより
つっつきボイス: 「これはプロジェクトマネージメントのアプリ」「おおー!?これなかなかよくできてるかも: ガントチャートもカンバンも標準でついてて必要な機能がひととおり揃ってそうな感じ」「Redmineにライバル出現?」「JIRAより好きかも」「UIがんばってるし」「Redmineのデータをインポートできたらスゴイな(追伸: 一応手順あり)」「OpenProject悪くなさそう: 機会があったら使ってみたいImage may be NSFW.
Clik here to view.(自前でホスティングするのは面倒だけど)」
Image may be NSFW.
Clik here to view.
bootstrap-rubygem: Bootstrap 4の公式gem
- リポジトリ: twbs/bootstrap-rubygem
つっつきボイス: 「前からあるんでしょうね」「ですね: SCSS版のBootstrap 4が使えるヤツ」「そういえばBootstrap 4って今もjQuery必須なんですねImage may be NSFW.
Clik here to view.」「jQuery手放してないですね」「jQueryがないとBootstrap 4でJavaScriptが動かないからImage may be NSFW.
Clik here to view.」「将来はjQueryなくすみたいなプランぐらいあってもよさそうだけど(追記: 今の所見当たりませんでした)」
Image may be NSFW.
Clik here to view.
getbootstrap.comより
Image may be NSFW.
Clik here to view.
Skinny: RailsにインスパイアされたScala言語向けWebフレームワーク
- サイト: Skinny Framework
- リポジトリ: skinny-framework/skinny-framework
- サンプルアプリ: skinny-framework/skinny-orm-in-play — デモは動いてませんでした(´・ω・`)
つっつきボイス: 「サーブレット?」「Javaサーブレットですね」「ScalaでRailsが動く?」「いや、これはRailsにインスパイアされたとあるから、RailsっぽいWebフレームワーク」「コマンドもRailsっぽい↓」「PHPのSymfonyフレームワークなんかもRailsに影響受けてますしね」
# 同サイトより
./skinny db:migrate test
./skinny test
参考: Scala - Wikipedia
参考: Symfony - Wikipedia
Image may be NSFW.
Clik here to view.
Wikipediaより(パブリックドメイン)
Image may be NSFW.
Clik here to view.
react-rails: React.jsの「公式」gem
- リポジトリ: reactjs/react-rails
つっつきボイス: 「お、WebpackerをちゃんとサポートしてるしImage may be NSFW.
Clik here to view.」「Sprocketsもサポートされてる」「サポートされているWebpackerは3まで… 4はまだ入ってない(惜しい!)Image may be NSFW.
Clik here to view.」「誰か人柱になるImage may be NSFW.
Clik here to view.?(チラッチラッ」
「そういえばreact_on_railsなんてgemもありませんでした?」「紛らわしいImage may be NSFW.
Clik here to view.」「お、でもこのreact-railsはReact.jsの公式ですよ」「ほんとだ!Image may be NSFW.
Clik here to view.」「待てよ、ということはReact.jsはWebpackerを公式に推しているってことなんじゃ?」「Image may be NSFW.
Clik here to view.」「公式が推してくれているんなら、Webpackerを導入するときに宗教戦争にならないで済みそう?」「もしそうなら安心感が違うImage may be NSFW.
Clik here to view.」「ま、いつまで公式に推してくれるかはわかりませんけどねImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Oj: Ruby製高速JSONパーサー
- サイト: Oj
- リポジトリ: ohler55/oj
# 同リポジトリより
require 'oj'
h = { 'one' => 1, 'array' => [ true, false ] }
json = Oj.dump(h)
# json =
# {
# "one":1,
# "array":[
# true,
# false
# ]
# }
h2 = Oj.load(json)
puts "Same? #{h == h2}"
# true
つっつきボイス: 「高速なJSONパーサー」「このロゴ見たことがある気がします」「こういう高速なgemはあるときRailsにしれっと入るかもしれませんからねImage may be NSFW.
Clik here to view.」「よく見るとC拡張だった…」「ほんとだ: 環境によってはインストール面倒かも」
後でohler.com/ojを見てみると、Oj 3.0.0でRuby標準のjson gemの代わりに使ったり、RailsモードにすることでActiveSupport 5.0のエンコード/デコードをすべて置き換えられると書かれています。
Image may be NSFW.
Clik here to view.
その他
- 「snibox/sniboxはスニペットマネージャ」「スニペットをリモートに置く理由って、ローカルに置いとくと何かのはずみで消えそうでコワイからだよねっImage may be NSFW.
Clik here to view.」
-
「refinery/refinerycmsはRailsのCMS、trestleは管理画面フレームワーク」「こういうのはどっちももの凄い数あるしなーImage may be NSFW.
Clik here to view.」「でもCMSでは誰もWordPressに勝てないという…」
-
「activerecord-importは息の長いアプリ: いいやつImage may be NSFW.
Clik here to view.」
-
「ifmeorg/ifmeって何だろう…?」「メンタルヘルスのコミュニティみたいだけど」「そのサイトをRailsで作ってソースを公開しましたってことなのかな…Image may be NSFW.
Clik here to view.」
-
「spreadsheet_architect、すごい名前Image may be NSFW.
Clik here to view.」「ActiveRecordからXLSXやODSやCSVを作成できるらしい」「ODSってたしかOpenOfficeのフォーマットですね」「使ってみないとわからないけどActiveRecordから楽に作れるならいいかも」
# 同リポジトリより
Post.to_xlsx(instances: posts, spreadsheet_columns: Proc.new{|instance|
[
['Title', :title],
['Content', instance.content.strip],
['Author', (instance.author.name if instance.author)],
['Published?', (instance.published ? 'Yes' : 'No')],
:published_at, # uses the method name as header title Einstance. 'Published At'
['# of Views', :number_of_views, :float],
['Rating', :rating],
['Category/Tags', "#{instance.category.name} - #{instance.tags.collect(&:name).join(', ')}"]
]
})
-
「突然にRailsの#33079が: Rails 6でWebpackerがデフォルトのJSコンパイルになると」
-
「acts-as-taggable-on! こんな古いのまだあったとはImage may be NSFW.
Clik here to view.」「だいぶ前に自分で書く方が早いって言ってたヤツですね」
-
「RRRSpecといえばクックパッドさんの有名な分散RSpecシステム」
参考: 分散テスト実行システムRRRSpecをリリースしました - クックパッド開発者ブログ
- 「koudokuはStripe IDを設定すれば購読フローを楽に作れそう」「どうやらサインアップが必要っぽいかな?」
「しかし知らないgemやアプリが結構ありましたね」「しばらくサーベイしていないと意外にいろんなのが出てるなー」「GitHub Trending以外にも情報源が見つかってうれしいImage may be NSFW.
Clik here to view.」
なお、上の元記事は以下から抜粋・再構成したものだそうです。
参考: Weekly trending Ruby on Rails repositories. June, 11
Image may be NSFW.
Clik here to view.
テストでTimecopとVCRを連携させる(Hacklinesより)
短い記事です。
つっつきボイス: 「VCRってブラウザの画面操作を記録再生するツールですね」「VCRでwebmockが動かなくなってハマってた人いましたよImage may be NSFW.
Clik here to view.」「VCRはHTTPリクエストを横からトラップするから」「うろ覚えですけど、テスト書いている途中にwebmockしたいリクエストを間違えたりすると、VCRが無いときは単にwebmockが『mockがない』ってエラーを出すだけなのに、VCRと組み合わさると実際にリクエスト飛ばしてwebmockのカセットが作成される、みたいなことがありました」「ありゃー」「この種の自動でよしなにやってくれるgemはさり気に注意が必要Image may be NSFW.
Clik here to view.: ロード順序が変わると動かなくなったりとか」「VCRはこれはこれでいいgemだけどしっかり理解して使わないといけないっすねImage may be NSFW.
Clik here to view.」
- リポジトリ: vcr/vcr
参考: VCRを使って開発中にあほみたいにリクエストを飛ばさないようにする - かずおの開発ブログ(主にRuby)
Image may be NSFW.
Clik here to view.
rails_event_store: ActiveRecord向けEvent Store
- サイト: railseventstore.org
- リポジトリ: RailsEventStore/rails_event_store
記事を先に出してましたが。
つっつきボイス: 「rails_event_store、一度使ったことある気がする」
Image may be NSFW.
Clik here to view.
Avdi Grimm氏のオンライン講座「Master the Object-Oriented Mindset」(Hacklinesより)
- 元記事: Now available: Master the Object-Oriented Mindset in Ruby and Rails – avdi.codes
- サイト: Master the Object Oriented Mindset in Ruby and Rails – avdi.codes
略してMOOMだそうです。
つっつきボイス: 「Avdi Grimmさんなのでたぶんちゃんとしてそう」「現実のオブジェクト指向設計って、単に勉強しただけでは意外に習得できなくて、自分で実際に何度もやってみて失敗を重ねていかないとなかなか腑に落ちないところがありますねImage may be NSFW.
Clik here to view.」「それあるかもImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Dockerイメージビルドを10分から5分に短縮(Hacklinesより)
つっつきボイス: 「この手のDockerビルドの速度改善はいろいろやり方がありますね」「意識的にキャッシュするように書いたりとか」
Image may be NSFW.
Clik here to view.
Rails 5.1の機能を使ってメール送信をリファクタリング(Ruby Weeklyより)
# 同記事より
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "\"mkdev\" <#{ENV['SUPPORT_EMAIL']}>",
subject: -> { default_i18n_subject },
to: -> { @recipient.email }
before_action :load_recipient
private
def load_recipient
@recipient = params[:recipient]
I18n.locale = if @recipient.is_a?(User)
@recipient.locale
elsif @recipient.user
@recipient.user.locale
else
:en
end
end
end
つっつきボイス: 「Rails 5.1の#27825でメイラーがパラメタライズされたのでそれを活用したと記事の冒頭にありました」「その機能追加されてたなー: 上のsubject: -> { default_i18n_subject }
みたいにパラメータにlambda使えたり」「書きやすくなったしこれはいいんじゃないかなImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
その他Rails
- Podcast: RR 353: Removing Business Logic from Rails Controllers with Aaron Sumner | Devchat.tv
- Podcast: MRS 053: Jerome Hardaway | Devchat.tv — Railsを選んだ理由など(Hacklinesより)
テストコード内とはいえRails本体にrubocop:disableコメントが入ってしまった
— Ryuta Kamizono (@kamipo) July 26, 2018
つっつきボイス: 「社内Slackで貼っていただいたやつです」「これはついウケた: Rails本体ですらRubocopに怒られてしまうのかとImage may be NSFW.
Clik here to view.」「DHHは見た感じRubocopに何言われても気にしてなさそうですけどねImage may be NSFW.
Clik here to view.」「気にしてなさそうImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
Ruby trunkより
Image may be NSFW.
Clik here to view.![⚓]()
ruby -wc
を取れるAPIが欲しい
- Feature #14938: Provide API to get same result as ruby -wc - Ruby trunk - Ruby Issue Tracking System
つっつきボイス: 「-wc
って何だったかな」「コンパイルのみってことらしいです」「ははぁいわゆるシンタックスチェックか」「Dry-run的な」「Ruby Language Serverで使いたいんだそうです」「分かりみある」「Ruby Language Serverってまだそんなに普及してないのかな?」「でもたとえばGitLabにRuby Language Serverが入ったらめちゃくちゃうれしい」「今ならGitLabのWebIDEも使えますしね」「そうなったらもうGitLabだけで開発しちゃうImage may be NSFW.
Clik here to view.: リポジトリをチェックアウトしてIDEで開かなくてよくなるしImage may be NSFW.
Clik here to view.」「そういえば2017年のRubyKaigiの発表でもRuby Language Serverをエディタのシンタックスハイライトに使ってましたね」
- リポジトリ: mtsmfm/language_server-ruby
Image may be NSFW.
Clik here to view.![⚓]()
do
–end
ブロックと{}
ブロックの挙動が違う->仕様どおり
# 同issueより
puts [1,2,3].map do |i|
puts i
end
#<Enumerator:0x007ffe930b76d0>
puts [1, 2, 3].map { |i| puts i }
1
2
3
演算子結合の優先順位の違いのようです。
つっつきボイス: 「へー、挙動違うのか: でも普段こんなコードをそもそも書かないし」「書かないですねー」「こういうのを見つける人たちがスゴイImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
ハングルのUnicode正規化が仕様と異なる(調査中->closed)
-if length>2 and 0 <= (trail=string[2].ord-TBASE) and trail < TCOUNT
+if length>2 and 0 < (trail=string[2].ord-TBASE) and trail < TCOUNT
ハングルはわかりませんが、Rubyのunicode_normalize
がNFC(デフォルト)、NFD、NFKC、NFKDのすべてに対応していることを今頃知りました。
つっつきボイス: 「RubyというよりはUnicodeの仕様の話が中心ですね: 主に私の興味で選びました」「Unicodeは言語側で面倒見るのは大変だし、Unicodeのテストコードを書くだけでもつらそう…」「unicode_normalize
にはハングルにだけ特殊な正規化コードがあることをついでに知りました」
参考: instance method String#unicode_normalize
(Ruby 2.5.0)
参考: Unicode正規化 - Wikipedia
参考: Unicode正規化 — ハングルの正規化について説明しています。
なお#14934はつっつきの時点では調査中でしたが、その後Martin先生が「パッチは技術的には正しいが現実には問題ない」として今後に備えてテストをコミットしてクローズされました。
Image may be NSFW.
Clik here to view.
Ruby
Image may be NSFW.
Clik here to view.
臨時ニュース: RubyWorld Conference 2018参加受付開始
#RubyWorld Conference 2018の参加登録の受付を開始しました!ご入場には事前の参加登録(有料: 5,000円/1名)が必要です。定員になり次第締め切りとなりますので、お早めにご登録ください。 https://t.co/GGKJmV1Ekd
— RubyWorld Conference (@RubyWorldConf) July 30, 2018
Image may be NSFW.
Clik here to view.
fast-ruby: ベンチマークを元にした「Rubyが速くなる書き方集」
- リポジトリ: JuanitoFatas/fast-ruby
# 同リポジトリより
$ ruby -v code/general/attr-accessor-vs-getter-and-setter.rb
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
Calculating -------------------------------------
getter_and_setter 61.240k i/100ms
attr_accessor 66.535k i/100ms
-------------------------------------------------
getter_and_setter 1.660M (± 9.7%) i/s - 8.267M
attr_accessor 1.865M (± 9.2%) i/s - 9.248M
Comparison:
attr_accessor: 1865408.4 i/s
getter_and_setter: 1660021.9 i/s - 1.12x slower
つっつきボイス: 「おー、なるほど: 現実にこれがコメントで付いた場合にどこまでそれに従うかというのはあるけどなっ」「速さが問題にならない箇所なら見やすさを優先したいときもあるし」「そういえばJavaの文字列にもこんなのがありましたね」「というと?」「Javaだと+
じゃなくてStringBuilderで結合するみたいな定番中の定番の書き方があるんですよ」「Rubyで言うと+
じゃなくて式展開で文字列を組み立てるみたいなヤツです」
参考: StringBuilder (Java Platform SE 8 )
Image may be NSFW.
Clik here to view.
fasterer: 「fast-ruby」にインスパイアされたRuby高速化サジェスチョンツール
- リポジトリ: DamirSvrtan/fasterer
# 同リポジトリより
app/models/post.rb
Array#select.first is slower than Array#detect. Occurred at lines: 57, 61.
db/seeds/cities.rb
Hash#keys.each is slower than Hash#each_key. Occurred at lines: 15, 33.
test/options_test.rb
Hash#merge! with one argument is slower than Hash#[]. Occurred at lines: 84.
test/module_test.rb
Don't rescue NoMethodError, rather check with respond_to?. Occurred at lines: 272.
spec/cache/mem_cache_store_spec.rb
Use tr instead of gsub when grepping plain strings. Occurred at lines: 161.
つっつきボイス: 「でこっちのfastererがサジェスチョンしてくれるツールですね」「まあこういうツールがあってもいいけどねImage may be NSFW.
Clik here to view.、これがCIに入ったらますます怒られることが増えそうだなー」「サジェスチョンが賢ければいいんですけど、たとえば
#merge!
を使うと必ず怒られたりしたらつらいImage may be NSFW.
Clik here to view.」「『こっちの方が速い』と言われればもっともなんだけど、本質的な指摘とも限らないし」「サジェスチョンの言い回し次第かも」「でもどんな感じなのか一度使ってみたいですねImage may be NSFW.
Clik here to view.」
「上のArray#select.first
よりArray#detect
の方が速いというのは確かにもっとも: #select
は全部をまとめたものを出すんですけど、#detect
は最初に見つけたものを出すんで、結果は同じでも見つけた瞬間に終わる#detect
の方が速いし、たぶん可読性もこっちの方がいいし」「たいていの言語でも、全部をスキャンするメソッドと見つけた時点で終わるメソッドがそれぞれありますからね」「後者はany?
的なメソッドですね」
「fastererがrubocop -a
みたいに自動書き換えまでやってくれるならいいかなという気はする」「rubocop -a
も万能じゃないですけどねImage may be NSFW.
Clik here to view.」「でも
-a
があるからrubocop使う気になれるというのはある: 重箱の隅的な指摘はこれでだいたい消えるし」
Image may be NSFW.
Clik here to view.
pragmatic_segmenter: 文章を文ごとに区切るgem(Ruby Weeklyより)
- リポジトリ: diasks2/pragmatic_segmenter
# 同リポジトリより
text = "Hello world. My name is Mr. Smith. I work for the U.S. Government and I live in the U.S. I live in New York."
ps = PragmaticSegmenter::Segmenter.new(text: text)
ps.segment
# => ["Hello world.", "My name is Mr. Smith.", "I work for the U.S. Government and I live in the U.S.", "I live in New York."]
# Specify a language
text = "Այսօր երկուշաբթի է: Ես գնում եմ աշխատանքի:"
ps = PragmaticSegmenter::Segmenter.new(text: text, language: 'hy')
ps.segment
# => ["Այսօր երկուշաբթի է:", "Ես գնում եմ աշխատանքի:"]
# Specify a PDF document type
text = "This is a sentence\ncut off in the middle because pdf."
ps = PragmaticSegmenter::Segmenter.new(text: text, language: 'en', doc_type: 'pdf')
ps.segment
# => ["This is a sentence cut off in the middle because pdf."]
# Turn off text cleaning and preprocessing
text = "This is a sentence\ncut off in the middle because pdf."
ps = PragmaticSegmenter::Segmenter.new(text: text, language: 'en', doc_type: 'pdf', clean: false)
ps.segment
# => ["This is a sentence cut", "off in the middle because pdf."]
# Text cleaning and preprocessing only
text = "This is a sentence\ncut off in the middle because pdf."
ps = PragmaticSegmenter::Cleaner.new(text: text, doc_type: 'pdf')
ps.clean
# => "This is a sentence cut off in the middle because pdf."
つっつきボイス: 「どこからどこまでが1つの文かをマルチリンガルで検出するやつですね: READMEに区切りのルールがびっしり書いてあります」「言われてみれば?
や!
も文の終わりを表すのか: ラノベをこれで処理したら相当戸惑いそうではあるImage may be NSFW.
Clik here to view.」
「そういえばタイ語は文末にストップマーク(。や.など)がなくてスペースを置く、でも行末だとスペースは略すという凄い言語なのでパーサー泣かせで有名ですImage may be NSFW.
Clik here to view.」「単語と単語の間はスペースあるんでしょうか?」「えっとどっちだったかな…(追記: 単語間のスペースはありませんでした)」「まあそもそも文の中に単語があるみたいな構成の言語ばかりじゃないですしね: ヒエログリフとかImage may be NSFW.
Clik here to view.」「そういえばヒエログリフは顔が右を向いてるか左を向いてるかで文の進行方向が変わりますねImage may be NSFW.
Clik here to view.」
参考: TRADOS - Wikipedia — 翻訳支援ツール(文の区切りを事細かに設定可能)
Image may be NSFW.
Clik here to view.
どこまで継承でやるか
- 元記事: Matzにっき(2003-08-06)
継承は悪か
(中略)
「継承はカプセル化の概念を破壊する」件については、また別にもう少し考えなければなりません。 なぜ継承がカプセル化の概念を破壊するかといえば、 サブクラスはインスタンスの構造に直接触ることができるからです。
インスタンス変数を直接参照すれば、スーパークラスの実装に強く依存してしまいますし、 インスタンス変数を直接更新すれば、インスタンスの不整合な状態を作り出すことができます。 確かにこれはカプセル化の原則に対立します。
しかし、スーパークラスで定義されたインスタンス変数に直接触ることができることは、 オブジェクト指向言語にとって必須ではありません。たとえばC++はprivateなメンバには サブクラスからもアクセスすることができません。そしてさいわいなことにprivateがデフォルトです。 これが私の考えるC++の唯一優れた点なのですが。
(中略)
結局問題なのはRubyのような言語がスーパークラスのインスタンス変数に簡単に触れてしまうという 「言語上の欠陥」なのであって継承そのものの問題ではないのですよね。 Rubyの次の世代の言語はぜひ「インスタンス変数はクラスローカル」が常識になってもらいたいものです。 事実、Perl6ではそうなるってDamian Conwayが言ってました。
同記事より
2003年のMatzの日記です。
つっつきボイス: 「何でも継承で書くもんじゃないというのはそのとおりですねImage may be NSFW.
Clik here to view.」「どちらかというと、オブジェクト指向の教科書がおしなべて最初に『継承(Javaで言うと
extends
)がオブジェクト指向』的なことを書いてしまっているから、それに釣られてみんな何でも継承でやろうとしちゃっている面があるんじゃないかな」「Matzも『is-aの関係かどうかが継承を使うときの唯一の基準』と書いてますしね」「言い換えれば継承は機能を拡張するためのものじゃないってこと」
「『スーパークラスのインスタンス変数に簡単に触れてしまう』はどうでしょう?」「Rubyのprivate
はprivateじゃないからImage may be NSFW.
Clik here to view.」「Rubyの
protected
が一番難しい: 毎回ググってるし」「そういえばC++はvirtual
を書かないとメソッドをオーバーライドできないので、他の言語をやってからC++をやると結構戸惑うImage may be NSFW.
Clik here to view.:
virtual
だと同名の別メソッドができるし」
参考: JavaやC#の常識が通用しないRubyのprivateメソッド - give IT a try
参考: 仮想関数 - C++入門
Image may be NSFW.
Clik here to view.
書籍『Working with TCP Sockets』
TCPソケットをRubyで解説しています。有料です。
参考: 「Working with TCP Sockets」を読んだ - Fire Engine
つっつきボイス: 「TCPソケットのようなネイティブなものを勉強するなら個人的にはC言語でやるのをおすすめしたいImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.![⚓]()
Rake::DSL
を使おう(Ruby Weeklyより)
# 同記事より
# lib/tasks/bicycle.rake
class BicycleTasks
include Rake::DSL
def initialize
namespace :bicycle do
task :assemble do
bicycle = Bicycle.new
# Assemble the bicycle:
attach_wheels(bicycle)
attach_handlebars(bicycle)
attach_brakes(bicycle)
end
end
end
private
def attach_wheels(bicycle)
# ...
end
def attach_handlebars(bicycle)
# ...
end
def attach_brakes(bicycle)
# ...
end
end
# Instantiate the class to define the tasks:
BicycleTasks.new
しかしなぜか最近のRuby公式ドキュメントにはRake::DSL
のドキュメントが見当たらないようです。
参考: Module: Rake::DSL (Ruby 2.2.1)
参考: library rake (Ruby 2.5.0)
Ruby 2.5.1のmasterにはRake::DSL
モジュールはあり、読み込めました。
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
splatとdouble splatの挙動
mrubyのキーワード引数を実装してたらRubyのキーワード引数に謎の挙動を「発見」した。
— Yukihiro Matsumoto (@yukihiro_matz) July 26, 2018
知らない挙動です。すごいなー
— Yusuke Endoh (@mametter) July 26, 2018
つっつきボイス: 「上みたいに示されると引数の"a" => 1, a: 1
のハッシュが別物というのは何となくわかる気がする」「3つ以上引数が渡されるとどうなるのかな?↓あー[[{"a"=>1}], {:a=>1, :b=>2, :c=>3, :d=>4}]
だから1つ目以外は全部**k
に吸い込まれるのかImage may be NSFW.
Clik here to view.」「1つ目のsplat
*a
と2つ目のdouble splat **k
が連続しているとどっちに吸い込まれるのかがわかりにくいってのが問題なんでしょうねImage may be NSFW.
Clik here to view.」
irb(main):004:0> p m("a" => 1, a: 1)
[[{"a"=>1}], {:a=>1}]
=> [[{"a"=>1}], {:a=>1}]
irb(main):005:0> p m("a" => 1, a: 1, b: 2)
[[{"a"=>1}], {:a=>1, :b=>2}]
=> [[{"a"=>1}], {:a=>1, :b=>2}]
irb(main):006:0> p m("a" => 1, a: 1, :b => 2)
[[{"a"=>1}], {:a=>1, :b=>2}]
=> [[{"a"=>1}], {:a=>1, :b=>2}]
irb(main):007:0> p m("a" => 1, a: 1, :b => 2, c: 3, :d => 4)
[[{"a"=>1}], {:a=>1, :b=>2, :c=>3, :d=>4}]
=> [[{"a"=>1}], {:a=>1, :b=>2, :c=>3, :d=>4}]
Image may be NSFW.
Clik here to view.
クラウド/コンテナ/インフラ/Linux/Serverless
Image may be NSFW.
Clik here to view.
Googleの「Serverless containers」と「Knative」
- 元記事: Google Cloud Platform Blog: Cloud Services Platform: bringing the best of the cloud to you
- アーリープレビュー申し込み: Serverless containers Alpha - Sign Up – Google
- リポジトリ: knative/docs
Image may be NSFW.
Clik here to view.
つっつきボイス: 「ああこれね: Serveless containersといいつつサーバーあるじゃんって思ったりImage may be NSFW.
Clik here to view.」「流行り系」「これはもうリソースすら意識しなくてよくなるってことですかね?」「今日のBPS勉強会で出てきたDockerの話で言うとそうでしょうね: AWSのFargateに近い感じで、インスタンスを意識しなくてよくなる」
「GKEというかKubernetesのPodって、AWS ECSでいうサービス(タスク定義の実体)に相当するんだと思うんだけど、とにかくKubernetesのPodだとまだインスタンスを意識しないといけない」
Image may be NSFW.
Clik here to view.
github.com/knative/docsより
「Knativeは何でしょうね?Kubernetesのnative?」「まだ詳しく見てないけど、KnativeはKubernetesが最終的に目指したい夢なんでしょうね」「ただこうやって自動化すると今度はlocalityの問題が出てくるから大変: 現在の管理ツールでどのインスタンスで動作するのかまで設定しないといけない理由のひとつが、データベースとアプリのコンテナみたいなものは互いにうんと近くないとパフォーマンスがめちゃくちゃ落ちるから」「あーImage may be NSFW.
Clik here to view.」「だからそういうクリティカルなもの同士はlocalityつまりできる限り同じ物理サーバ上で動くことを担保したい: AWSのDedicated Hostsもそのためのオプション」「ふむぅ」「だから単に自動化されると、いつの間にかlocalityが失われてパフォーマンスが落ちたなんてときにトラブルシューティングしようがなくなってしまうので、そういう部分をうまく設定できるかが重要: まだちゃんと見てないけど、やるからにはそういう部分を扱えるだろうと予想してる」「Image may be NSFW.
Clik here to view.」
「ちなみにlocalityはインフラ業者側にとっても常に切実な問題で、同じ物理サーバーに乗っていればネットワークトラフィックがその中で収まるのに、遠くに配置されてしまえばその分トラフィックが増えてしまう: だからインフラ業者もlocalityを損なわないようにいろいろやっているはず」「なるほどー」
参考: [速報]Google、コンテナ実行環境をサーバレスで提供する「Serverless containers」発表。Google Cloud Next ’18 - Publickey
参考: 最強のServerlessプラットフォーム? Knative登場 - Cloud Penguins
Image may be NSFW.
Clik here to view.
RailsをDockerに置くな(Hacklinesより)
短い記事です。
つっつきボイス: 「気持ちは一応わかる: 記事にもあるpry
やbundle open
やbundle install
とかはDockerに置いても一応同じことはできなくはないんだけど、やり方が面倒になるのは確か」「確かRailsdmでもこのあたりについて話していた発表があったと思う↓」「Docker化するとコマンドが増えますし」「本来の設計からかけ離れてしまったり」「複数のサーバークラスタに分散しているときにどのコンテナでrails console
を実行すべきか?、とかDockerだと何かとややこしくなるわけですよ」「ふーむ」
Image may be NSFW.
Clik here to view.
Twitterのアプリ連携仕様が変更
Twitterがサードパーティ製アプリケーションを審査制に切り替え。もう気軽に「Login with Twitter」なんて作れなくなるね。。。
そしてアプリからのTweetも3時間に300に制限。この制限はユーザごとではなく、アプリ全体で300。。。https://t.co/rpx3lPLmpe
— Atsuo Ishimoto (@atsuoishimoto) July 24, 2018
つっつきボイス: 「めちゃめちゃ不評を買ってたやつですねImage may be NSFW.
Clik here to view.」「Image may be NSFW.
Clik here to view.」「開発者を切り捨てる方向に向かってるとしか思えない…」
Image may be NSFW.
Clik here to view.
Go Cloud: クラウド全般向けライブラリ
// 同記事より
// setupBucket opens an AWS bucket.
func setupBucket(ctx context.Context) (*blob.Bucket, error) {
// Obtain AWS credentials.
sess, err := session.NewSession(&aws.Config{
Region: aws.String("us-east-2"),
})
if err != nil {
return nil, err
}
// Open a handle to s3://go-cloud-bucket.
return s3blob.OpenBucket(ctx, sess, "go-cloud-bucket")
}
つっつきボイス: 「マルチクラウドプラットフォームでやれるみたいなので、Terraformをちょっと思い出す」
Image may be NSFW.
Clik here to view.
terraform.ioより
「ちなみにTerraformは理想は高いけど、AWS向けに書いたTerraformのコードが無修正でGCPで使えるかというと現実にはそんなことはないのでImage may be NSFW.
Clik here to view.」「Image may be NSFW.
Clik here to view.」「Terraform自体はどんなものでしたっけ?」「Terraformはクラウドの設定をTerraformの書式で書けるもので、普通だとGCPにはGCPの設定ファイルを書かないといけないしAWSだとCloudFormationというのがあってそれで書かないといけないので互換性がないんですけど、Terraformの中間コードで設定を書けばGCPにもAWSにも変換できるというものです」「Image may be NSFW.
Clik here to view.」「おー、もっと壮大なものを想像してたんですが、設定を生成するマクロというか中間言語的なものだったんですねImage may be NSFW.
Clik here to view.」
「Terraformが流行った理由のひとつが、かつてのAWS CloudFormationがJSONにしか対応していなくて設定がとてもつらかったからなんですが、ここ一年ぐらいの間にCloudFormationがYAMLでも書けるようになったりGUIエディタが使えるようになったりと充実してきたせいか、前ほどTerraformの話題を見かけなくなったような気がする」「ふーむ」
Image may be NSFW.
Clik here to view.
モバイル/Android/iOS
Image may be NSFW.
Clik here to view.
Flutter Weekly
- サイト: Flutter Weekly
Image may be NSFW.
Clik here to view.
flutterweekly.netより
早くも#29だそうです。
つっつきボイス: 「社内アプリチームのFlutter勢からです」「iOSアプリもAndroidアプリもこれで書けるとしたらスゴイかもImage may be NSFW.
Clik here to view.」
参考: FlutterでAndroid/iOS両対応アプリを作ってみる
Image may be NSFW.
Clik here to view.
Firebase SDK 2.0がリリース
つっつきボイス: 「社内でもアプリチームが使ってるみたいですね」「Firebaseはフロント系の人には大人気です: サーバーサイドのコードが要らないのでフロントエンジニアだけでアプリが作れるし」「お?!」「Firebaseの裏にデータベースを置いてそこにアクセスするAPIを自由に書けるみたいな感じ?」「それもできますが、Firebase自体はもっともっと壮大ですよ: Firebaseがあればマジでサーバーレスで何でもできるImage may be NSFW.
Clik here to view.」「管理コンソールも充実してるし」「通知やレポートを投げたりとかもできるし」「データベースを置くとかもできるし、アプリのリリース管理もできるし、ほんと何でもできる」「アプリに更新をプッシュするだけじゃなかったんですねImage may be NSFW.
Clik here to view.」「そういえばFirebaseは何年か前にGoogleが買収したんでしたね」「(最初からGoogleの製品だと思ってた…Image may be NSFW.
Clik here to view.)」「フロントエンジニアにとってはとてもいいプラットフォームImage may be NSFW.
Clik here to view.」
参考: Cloud Functions for Firebase | Firebase
Image may be NSFW.
Clik here to view.
SQL
Image may be NSFW.
Clik here to view.
PostgreSQLのSQL方言は先進的(Postgres Weeklyより)
- PDF: PG-stays-ahead.key
つっつきボイス: 「ぽすぐれは機能が異常に多いからもうしょうがないImage may be NSFW.
Clik here to view.」「使ったことないSQLとかいっぱいあるし」「(スライドを見ながら)ちょうど
XMLTABLE
が目についたので: 自分が学生だった頃は、データベースで一番権威のある国際会議のプロポーザルが2000ページぐらいあったんですけど、その半分ぐらいがXMLデータベースだった」「Image may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
私の愛するPostgreSQLクエリたち(Postgres Weeklyより)
つっつきボイス: 「バックスラッシュ\
使うクエリとかあったねー」「もう思い出せない…Image may be NSFW.
Clik here to view.」「
\?
とかすれば表示されますよImage may be NSFW.
Clik here to view.」「PostgreSQLはコマンドもバックスラッシュだらけですし」「しかもロングバージョンがないし」「そんなにたくさんはないから覚えられますけどねImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
PostgreSQLのJSONドキュメントAPI拡張「dox」を作った(Postgres Weeklyより)
# 同リポジトリより
select * from dox.search(collection => 'customers', term => 'jill'); -- full text search on a single term
select * from dox.find_one(collection => 'customers', term => '{"name": "Jill"}'); -- simple query
select * from dox.find(collection => 'customers', term => '{"company": "Red:4"}'); -- find all Red:4 people
つっつきボイス: 「生のJSONBの検索はいろいろつらいからもう少しマシな方法でやれるようにしたってことか」「クエリとして書けるようにしたんですね」「JSONBの比較演算子はもう宇宙語並にわけわからないし」「こうやって見やすく書けるならいいかもねImage may be NSFW.
Clik here to view.」
参考: JSON関数と演算子
Image may be NSFW.
Clik here to view.
JavaScript
Image may be NSFW.
Clik here to view.
Note.muがフロントエンドをAngular.jsからNuxt.jsに移行予定
Image may be NSFW.
Clik here to view.
ja.nuxtjs.orgより
noteのフロントエンドがNuxt.jsを採用し話題となっていますが、TERIYAKIも
AWS、PHPからGCP、Go(gin) + Nuxt.jsで既に移行作業を進めてます! #nuxtjs #vuejs #nuxt @takapon_jp— Ryo IKEUCHI (@ryo_ikeuchi) July 26, 2018
つっつきボイス: 「Nuxt.jsはVue.jsのベストプラクティス的なものらしいですね」「移行することのビジネス上のメリットがどのぐらいあるのか知りたいところではあるImage may be NSFW.
Clik here to view.」
Image may be NSFW.
Clik here to view.
WebAssemblyの未来を探る(JavaScript Weeklyより)
プロポーザルなどが紹介されています。
つっつきボイス: 「最近のWebAssemblyではLinuxカーネルも動きますからねImage may be NSFW.
Clik here to view.」「マジでImage may be NSFW.
Clik here to view.?!」「シェルはまだ動かないみたいですが」「LLVMも動いたと思う」「mrubyも動きますしね」「それだけ動けばもうたいていのものは動きそう」
スレチですがこんな記事も見つけました。
参考: サクッと Go → WebAssembly を試す - Qiita
Go 1.11beta1で動きましたImage may be NSFW.
Clik here to view.↓
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
hypernova: JSのビューをサーバーサイドレンダリング(JavaScript Weeklyより)
- リポジトリ: airbnb/hypernova
airbnb製です。gemもあり、Railsでも使えると言ってます。
# 同記事より
class SampleController < ApplicationController
around_filter :hypernova_render_support
end
<%= render_react_component('MyComponent.js', :name => 'Hypernova The Renderer') %>
hypernova {名} : 極超新星
つっつきボイス: 「似たようなSSR(サーバーサイドレンダリング)用のものをどこかで見た気が」「これを入れるだけでちゃんと動くならいいけど、どうせデバッグしないといけなくなるだろうしImage may be NSFW.
Clik here to view.SSRは基本やりたくない」
「SSRは、速度向上と、SEO向けの対応という2つの側面がありますね」「後者は、SPAアプリとかでJavaScriptで画面を作っていると、動的なコンテンツを検索エンジンのクローラーが評価できなくなってSEO的に不利だから、その対応としてSSRを行うというヤツ」「もともとそれがSSRの目的でしたね」
「今はクローラーがJavaScriptを実行してからクロールするらしいから大丈夫になったのかな?」「Googleはそうだと言ってるけど、どこまで大丈夫かはまだ読みきれないところがあるImage may be NSFW.
Clik here to view.」
参考: SPAを導入する際に必要だったSEO対策についての話 -SSR? Prerendering?- - Qiita
Image may be NSFW.
Clik here to view.
CSS/HTML/フロントエンド/テスト
Image may be NSFW.
Clik here to view.
Chrome 68リリースでついにHTTPサイトに警告表示開始
たまたま気づきましたが、Windows版(上)とMac版(下)でメッセージの訳文が違ってますね。
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
つっつきボイス: 「違ってるImage may be NSFW.
Clik here to view.」「そんなに強い言葉でもないからまあ大丈夫かな…」「背景が赤だったらインパクト大きい」
参考: 「Chrome 68」公開、HTTPサイトに「保護されていません」の警告を開始 - CNET Japan
Image may be NSFW.
Clik here to view.
重要なHTTPセキュリティヘッダーとデプロイ方法(Hacklinesより)
つっつきボイス: 「X-Content-Type-Options
は、最近これを付けないと通らないことある」「このヘッダーって、確かすごく古いブラウザで問題が起きないようにするやつでしたね: 古いIEでPDFの中身を見ると落ちちゃう場合にnosniff
を指定する」「X-Frame-Options
は、iframeを開いていいかどうかを判断するヤツで、SAMEORIGIN
にするとoriginが同じなら開ける」「任意のJSをぶち込まれてもこれが入ってれば防げることになっている」「面倒だけどこの手のヘッダーはまだまだ必要なので、こういう記事は読んでおくとよいですImage may be NSFW.
Clik here to view.」
参考: X-Content-Type-Options
: nosniff つかわないやつは死ねばいいのに! - 葉っぱ日記
参考: X-Frame-Options
- HTTP | MDN
Image may be NSFW.
Clik here to view.
言語よろず部屋
Image may be NSFW.
Clik here to view.
臨時ニュース: Python作者Guido van Rossum氏が意思決定から手を引くと表明
BDFL(Benevolent Dictator For Life: 優しい終身の独裁者)という略語を初めて知りました。
参考: 優しい終身の独裁者 - Wikipedia
参考: どうなるPython--生みの親「優しい終身の独裁者から引退」表明で衝撃 - ZDNet Japan
Image may be NSFW.
Clik here to view.
その他
Image may be NSFW.
Clik here to view.
セキュリティ関連
- 元記事: IPA「情報セキュリティ白書2018」PDF版の無料公開開始! 仮想通貨やIoTなどをテーマに解説 - INTERNET Watch
- 元記事: 2018年版セキュリティ担当者が情報収集する際に見ておくべき資料・サイト80選
PDFは無料で読めます。
Image may be NSFW.
Clik here to view.
四分位数とは
これまで散発的につぶやいていた文科省の「四分位数」の定義について,まとめました https://t.co/Ze44z9RPiR
— Haruhiko Okumura (@h_okumura) July 24, 2018
平成29年度の中学校の指導要領に含まれているそうです。
つっつきボイス: 「四分位数…?」「なるほど箱ひげ図ね: 大学に入って必要に迫られて使ったけど習った覚えがないImage may be NSFW.
Clik here to view.」「箱ひげ図ってたいてい縦向きですよね」「箱ひげ図は、最大値と最小値がひげの端で、端から1/4のところに箱を置いて、さらに中央値(メジアン)を置くことで分散を見やすくする」「箱ひげ図という表し方があることを知っておくとデータを見せるときに便利Image may be NSFW.
Clik here to view.」
参考: 箱ひげ図 - Wikipedia
Image may be NSFW.
Clik here to view.
誰しも最初は
昔(8年くらい前)に書いたソースコードを見ていたら、
if(condition){
hoge = true;
} else{
hoge = false;
}
というコードが200行くらい続いていて、私プログラミングの才能なさすぎでは??という気持ちになった。— hikalium (@hikalium) July 25, 2018
つっつきボイス: 「あのhikaliumさんでもそうだったとはImage may be NSFW.
Clik here to view.: 小学生のときにOS自作本を読んでその道に進んだスゴイひとで、例のTuring Complete FMによく登場している人」
Image may be NSFW.
Clik here to view.
番外
Image may be NSFW.
Clik here to view.
火星の話題2つ
参考: 火星に巨大地下湖、欧州探査機が発見 水の存在「疑いない」 写真3枚 国際ニュース:AFPBB News
ついでながら、明日7/31は火星が大接近します。
つっつきボイス: 「この間から真夜中に火星ばかり異様に目立っててキモチワルイと思ってました」「天文好きな人はぜひImage may be NSFW.
Clik here to view.Image may be NSFW.
Clik here to view.」「そういえば天文出身の人ってまだBPSにいないな: ちなみに上の世代でコンピューターに詳しい人って数学とか天文とか音楽の人が多い」
そういえばパズル作者としても有名なこの方↓も天文出身でした。
参考: 岸田孝一 - Wikipedia
今回は以上です。公開つっつき会でお会いしましょう!
バックナンバー(2018年度後半)
週刊Railsウォッチ(20180723)Railsdm Day 3 Extremeを後追い、PSDにはZeplin.io、好みの分かれるJSX、負荷テストツール比較ほか
- 20180709 Rails Developers Meetup Day 3 Extreme今週末開催、RailsのSTI/キャッシュ/添付ファイル/Redis/PDF出力、ECMAScript 2018、プロフェッショナルIPv6ほか
- 20180702 Ruby 2.2メンテ正式終了、Ransackがつらくなるとき、書籍『Domain-Driven Rails』、GitHubの高可用MySQLほか
- 20180622 Railsの需要未だ巨大、Unicode 11.0リリース、WebDriverがW3Cで勧告、Flutter.io、2封筒問題ほか
- 20180615 TTY gemとHTTPClient gemは優秀、Rubyの謎フリップフロップ、ちょいゆるRubyスタイルガイドほか
- 20180608 特集「RubyKaigi 2018後の祭り」、
Enumerable#index_with
は優秀、コントローラから@
を消し去るほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。