- 開発
週刊Railsウォッチ(20170714)LicenseFinder gemで依存ライブラリを自動チェック、オピニオン「RubyはWebスケールでは遅いのか?」、PostgreSQL 10 Beta 2リリース、Ryan Bates氏ご結婚ほか
こんにちは、hachi8833です。エアコンと扇風機の二本立てはやりすぎでしょうか。
7月2週目のRailsウォッチ、いってみましょう。今回はJavaとKotlin成分もちょっぴり配合しました。
慶事その1: Railsのダウンロードが先週1億件を突破🎉
おめでとうございます!
Rails has passed 100 million downloads on RubyGems 😄🎊https://t.co/4cNTEFvu2k
— DHH (@dhh) 2017年7月6日
つっつきボイス: 「このうち自動でないダウンロード件数ってどのぐらいなんだろうねw」「テスト高速化のためにrubygems.orgをローカルにレプリケートしている事例もあったような」
私のようにrails new
する回数だけやたら多い人もいたりします。
慶事その2: Ryan Bates氏ご結婚㊗️🎊💒💍(RubyFlowより)
先週のRailsウォッチでRyan Bates氏がRailscastsの有料コンテンツを無償公開したことをお知らせしましたが、何と先週土曜にご結婚されたとのことです。おめでとうございます!
「女の子が生まれたら名前はやっぱりRubyにするよね?」というレスを上で見かけました。
祝福動画
上の動画はわずか5分ほどで、「Ryan Bates氏にみんなから祝福のメッセージを」とでも言うのでしょうか、急いで作ったと思われる中でもいろいろ芸が細かくて面白いです。
「手元でRailsアプリをrails new
で1から作ってお祝いのメッセージをそこから送信しよう!」という企画になっていて、ちゃんとRailscastsのスタイルを踏襲した構成でリスペクトを示しています。
途中Gemfileを編集するところで「ではここでproductionのWebサーバーをPumaからPassengerに変更しましょう」みたいなセリフとともに景気のいい音楽が流れておやっと思ったら、動画のスポンサーがPhusionでした。「スポンサー付き動画;-)
」とテロップも出てくる行儀のよさです。
こういう宣伝をさらりとやるのがいいですね。
Rails: 今週の改修
今週も公式ニュースが更新されていないので、コミットからみつくろいました。おおむね小粒です。
ActionController::Base
でprotect_from_forgery
をデフォルトでオンに
- PR: #29742 Default protect from forgery
- 元のissue: #29193 Make protect_from_forgery(with: :exception) the default on ActionController::Base
# https://github.com/rails/rails/pull/29742/files#diff-4525a7b40df77f1d9b8287da70913c63R73
+ initializer "action_controller.request_forgery_protection" do |app|
+ ActiveSupport.on_load(:action_controller_base) do
+ if app.config.action_controller.default_protect_from_forgery
+ protect_from_forgery with: :exception
+ end
+ end
+ end
なお、その後そっとタイポを修正したのはy-yagiさんでした。
-# Rails.applocation.config.action_controller.default_protect_from_forgery = true
+# Rails.application.config.action_controller.default_protect_from_forgery = true
つっつきボイス: 「うん、これは当然の処置」「protect_from_forgeryはどんなときでもオンにするとは限らないけど、デフォルト設定はActionController::Base
に入れておきたい」
SQLite3のbooleanシリアライズを't'と'f'から0と1に変更
PostgreSQLやMySQLでの整合性などについて多くの議論が行われました。
# https://github.com/rails/rails/pull/29699/files#diff-15fcde66de1c8e6b1c64d6ff32f6f223L108
def quoted_true
- "'t'".freeze
+ "TRUE".freeze
end
# https://github.com/rails/rails/pull/29699/files#diff-0a1222e7566af155bc3819e2edb580d2R25
+ def quoted_true
+ ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer ? "1".freeze : "'t'".freeze
+ end
レビュアーからのメッセージ↓。
Thank you for doing all the work -- the "sit on the side-lines and throw opinions" role is always much easier 😊
https://github.com/rails/rails/pull/29699#pullrequestreview-48989918より
「いろいろありがとう!横から口出しするだけってやっぱ楽でいいわー」という感じでしょうか。
つっつきボイス: 「SQLite3使わないけどねw」「今はどうなのか知らないけど、SQLiteの内部データは全部文字列だったのを覚えてる」「何と」「そのせいなのかどうか、ときどき変なエラーが出て困った」「むかーし某所で使ってた社内ツールはバックエンドがSQLiteだったけど、そのときは高速だった印象。中身にまではタッチできませんでしたが」
サードパーティ製キャッシュストアの設定を修正
# https://github.com/rails/rails/pull/29764/files#diff-438394335b9c1ce6ec4f67a407f50a42L104
def retrieve_store_class(store)
- require_relative "cache/#{store}"
+ require "active_support/cache/#{store}"
rescue LoadError => e
raise "Could not find cache store adapter for #{store} (#{e})"
else
Redisなどのキャッシュストアの設定が読み込めなかったのが修正されました。
normalize_path
でnil
を許容するよう再修正
# https://github.com/rails/rails/commit/03925dc26a747075ff37660d1f0a060a8178bf66#diff-a9076e165372faec4474942118b0aeb5R16
def self.normalize_path(path)
+ path ||= ''
encoding = path.encoding
path = "/#{path}".dup
path.squeeze!("/".freeze)
Utils.normalize_path(nil)
が/
を返すようになりました。
FakeKlassのほぼ同じテストコードを統合
これはkamipoさんによる修正です。テストコードを削る作業なので引用は省略します。
Response#charset=
のリファクタリング
# https://github.com/rails/rails/pull/29777/files#diff-0b53645cdb23933ef05759b2426f069aL261
# response.charset = 'utf-16' # => 'utf-16'
# response.charset = nil # => 'utf-8'
def charset=(charset)
- header_info = parsed_content_type_header
+ content_type = parsed_content_type_header.mime_type
if false == charset
- set_header CONTENT_TYPE, header_info.mime_type
+ set_content_type content_type, nil
else
- content_type = header_info.mime_type
set_content_type content_type, charset || self.class.default_charset
end
end
オピニオン「RubyはWebスケールでは遅いのか?」
刺激的なタイトルのおかげで各所でバズっているようです。
link: Is Ruby Too Slow For Web-Scale?: https://t.co/hlk1zMkjXo
— Yukihiro Matsumoto (@yukihiro_matz) 2017年7月11日
This is a GREAT article. Is Ruby Too Slow For Web-Scale?https://t.co/ULK1xzToD9 (thx @nateberkopec)
— Glenn Goodrich (@ruprict) 2017年7月11日
つっつきボイス: 「年に1ぺんはこういう記事でヒートアップしてるなw」「サーバーのレイテンシやスループットをじょうごで理解するのって、きっと定番なんでしょうね」
多くの男子は「ライオンとトラはどっちが強いか」「女の子は戦車か飛行機か」みたいなお題を出されると反射的にヒートアップしてしまうので、もうしゃーないですね。
Ruby trunkより
Rubyでエンコーディングエラー -> gemのせいでした(却下)
getting Encoding::UndefinedConversionError ("\xFF" from ASCII-8BIT to UTF-8): this error while uploding the image.
There's definitely no error in Ruby itself, in the encoding "ASCII-8BIT", only the lower half is convertible; the upper half is okay in the source, but undefined and so not convertible to any other encoding.
エンコードASCII-8BIT
だったら無理もありませんね。
pgloaderでMySQLからPostgreSQLに移行
- 元記事: from MySQL to PostgreSQL
- pgloader: http://pgloader.io/
PostgreSQL界でおなじみのDimitri Fontaine氏の最新記事です。氏みずから開発しているpgloaderが3.4.1にバージョンアップしたそうです。
つっつきボイス: 「この間のTechRacho記事にもあった外部データラッパー(FDW)があるのも移行に便利」
PostgreSQL 10 Beta 2がリリース
今朝morimorihogeさんが社内Slackに流してくれて知りました。
Beta 1からの変更点がてんこ盛りすぎるので引用はあきらめました。
その代わり、日付が空欄の10のリリースノートのドラフトがつい最近公開されているのを見つけました。PostgreSQL 10の新機能のまとまった情報がなかなかなかったので、これは助かりそうです。
Rubyの定数(constants)について知っておきたいこと(RubyFlowより)
Rubyの定数に関する解説です。
つっつきボイス: 「どちらかというと新人向けかな」「Rubyの定数はGlobal変数で上書きしようとするとwarningが出る程度ですね」
「Rubyで定数を完全にイミュータブルにしない理由って何なんでしょうか?」「モンキーパッチやメタプログラミングなんかで定数を変更できないと困ることがあるからでしょうね」
つっつきボイス:
「『#constantize
などのメソッドはセキュリティリスクが生じる可能性がある』↑ってありますね」「渡した文字列から本物のクラスを作れるから、もちろん取扱い注意」
「#eval
みたいな?」
「いやいや、#eval
よりは全然マシですw」「たとえばpolymorphicなフォームを受け取って、typeに入ってきた文字列をconstantize
するみたいな使い方はままある」
「その代わり#constantize
を使うなら必ず文字列をホワイトリストでチェックしないとダメ」
今気づきましたが、上のチートシート画像の「uninitialized」のスペルがちょっとだけ間違ってますね。
定数まだちゃんとわかってないわー、自分。
Firebase: Googleのモバイル系BaaS
Googleが2014に買収したサービスですが、Google Cloud Platform(GCP)とサービスの範囲がかなり似通っているように見受けられました。Google Analyticsとの連携が得意そうです。
つっつきボイス: 「BaaSってBackend as a Serviceか」「おー、Firebase、割りと汎用性高そう: もうちょい真面目に調べてもいいかも」「GCPとどう住み分けるんだろう?」「Firebaseはどうやらガチプログラマーじゃない人をターゲットにして、提供したいサービスを組み合わせて使える様子」「マーケティングとかSEOの人には魅力かも」
そこへちょうど通りかかったBPSアプリチームのメンバーが「お、Firebaseならうちのアプリチームで使ってる人いますよー」と耳打ちしてくれました。いいこと聞いた!
参考: Firebaseの始め方
Scenic: Railsでデータベースビューを使う
- 元記事: Database Views in Rails with Scenic
- 元記事: Announcing Scenic - Versioned Database Views for Rails
- リポジトリ: scenic-views/scenic: Versioned database views for Rails
Railsとデータベースビュー周りを調べていて見つけました。
sce·nic (ADJ 形容詞) 風光明媚な
つっつきボイス: 「シーニック、って読むみたい」「お、リポジトリをよく見たらthoughtbotじゃん!」「thoughtbot?」「Deviseやってる会社」「おー、paper_clipとかfactory_girlとかもここなのか」
つっつきボイス: 「thoughtbotならきっと設計もかなりまともだろうし、メンテも手厚くやってくれそう」「SQLファイルを元にmigrationを生成するのか: rollbackはどうやってるん?」
2017/07/30修正 by @morimorihoge
僕のうろ覚えで読み会時Deviseをthoughtbotと勘違いしておりましたが、正しくはplataformatecでした。お詫びいたします。
thoughtbot: paplerclip, factory_girl
plataformatec: devise, simple_form
です。きちんと確認しないと良くないですね。大変失礼いたしました。
※読者の方よりご指摘頂きました。ありがとうございました。
RSpecのちょっとした使いこなしのコツ(RubyFlowより)
subject
とlet
- ゆるふわなexpectationたち
anything
hash_including
match_array
instance_double
つっつきボイス: 「おー、これなかなかいい: サンプルコードが割りとまとも」「RSpecの新し目matcherが紹介されてる」「anything
ってこう使うのか↓」
# http://jakeyesbeck.com/2017/07/12/a-few-rspec-helpful-hints/ より
describe Author do
describe #has_written_a_book?' do
context 'when books are passed in' do
subject { Author.new(name, books) }
let(:books) { [Book.new(anything, anything)] } # 👈
it 'is true' do
expect(subject.has_written_a_book?).to eq(true)
end
end
end
end
⭐LicenseFinder: 依存ライブラリのライセンスを自動チェックするgem(RubyFlowより)⭐
- リポジトリ: pivotal/LicenseFinder/
Two tests you should run against your Ruby project nowという記事で紹介されていたのを見つけました。
Rubygemに限らず、JavaやNode.jsやPython EggsやGodepなどのライセンスもチェックできます。
つっつきボイス: 「これは( ・∀・)イイ!!」「こういうのありそうでなかったかも」「CIに仕込むとよさそうですね」「まさに: 脆弱性チェックと一緒に入れる感じ」
「ちゃんと調べたわけではないけれど、ライセンスが何も入っていないソフトウェアの方がおそらく法務上のリスクが高いんじゃないかな」「ライセンスが添付されてない場合であっても基本の著作権はあると解釈される可能性: ライセンスがないからといって自由に使っていいというふうにはならないだろうと思う」「ひー」
今週の⭐を進呈いたします。おめでとうございます。
オンラインドキュメント「Enterprise Rails」
- サイト: Enterprise Rails
Enterprise Railsはオライリーから出ていた書籍ですが、著者のサイトで全文が無料で公開されています。
著者のDan Chak氏はGoogleのプロダクトマネージャーで、自転車が趣味だそうです。
同書は2009年に日本語版も販売されていました。
つっつきボイス: 「うん、さすがに古いw: Rails 2ぐらいの時期か」「Rails経験の長い開発者がおさらい的に読むならともかく、新人が読むには向いてないかも」「設計の話が中心のようなので、今も通用する部分はありそう」「Enterpriseと謳っているから当然設計がテーマですね」
Rubyのスコープを理解する
2015年の記事なので新しくはありませんが、よさそうです。
つっつきボイス: 「特段新しいことは書いていなさそう」「Rubyのスコープってまとまった情報があまりないので、初学者にはいいかもですね」「スコープは文脈に依存する部分が大きいからある程度仕方ないかも」「この絵はちょっといい↓」「みんな言葉で書くのが好きだからw」「図は大事」
参考: 日本語でかつ2013年の記事ですが、Rubyにおけるスコープのおはなしも私には面白く読めました。つか「安倍首相」の部分が今も変わっていないのがクラクラします。
influxdbをRubyで使う
つっつきボイス: 「お、Goで書かれた時系列データベース(time series database)か: 昔研究で時系列データベース使ってたんで」「おー、どういうときに使うんでしょうか?」「超ざっくり言うと、たとえば測定なんかで『この閾値を超えたときに超えた部分のデータだけを取る』みたいなことをしたい場合、SQLでまともにやろうとすると常にクエリをかけつづけないといけない: 時系列データベースはトリガーベースでそこのデータだけを取ったりできる」「なるほど」「最近の時系列DBまでは追ってないけどw」
Vue Router: Vue.jsにルーティング機能を導入
// https://scotch.io/tutorials/getting-started-with-vue-router より
import Vue from 'vue'
import Router from 'vue-router'
import Hello from '@/components/Hello'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: Hello
}
]
})
つっつきボイス: 「まさしくルーティング」「Vue.jsってフロントに徹している印象がありました」
やばい匂いのするCSSコード
@extend
- CSSクラス名の結合
background
のショートハンド- キーセレクタを複数箇所で使う
- 他のコンポーネントのファイルで使われているクラス
- BEMミックス
- CSSの
@import
つっつきボイス: 「うん、これ使えるなー: あるあるネタの宝庫」「background
をショートハンドにすると-color
なのか-image
なのかがあいまいになったり」「@import
は最近のブラウザだと動いちゃうんでたちが悪いw」「これ翻訳したら読んでもらえるかな」
Kotlinの隠れたコストを探る
隣の芝生ではありませんが、ちょっとKotlin記事をあさってみました。
つっつき中にふたたびアプリチームのメンバーが通りすがってくれたので、lambda式などKotlinにあってJavaにない機能や、Kotlinの最適化などについての話題になりました。
今日になっていくつかリンクを教えてもらいました。
- Kotlinの最適化などについてはこちら: CA.ktでJavaに無い機能をKotlinがどう実現してるのか話してきました。
- Androidのベンチマークならこちら: Kotlin's hidden costs - Android benchmarks
ありがとうございます!
git-xlsx-textconv: XLSXファイルをgit diffで表示
- リポジトリ: tokuhirom/git-xlsx-textconv
社内Slackに投下されて知りました。
つっつきボイス: 「Go言語で書かれてるんですけど、コードがびっくりするぐらい短いです」
remotely ruby: Ruby開発者の求人サイト
- サイト: remotelyruby.com
求人リストのRubyアイコンがときたま不意にピク付くので、どきっとします。それだけです。
番外: ワーキングバックワード: 逆からたどってビジネスを形にする
- 元記事: Working Backwards
かなり古い記事です。
- プレスリリースから書く
- FAQから書く
- カスタマー・エクスペリエンスを先に定義する
- マニュアルから書く
つっつきボイス: 「お、AmazonのCTOが書いてるのか」「サービスとか事業を興すときの考え方の一つとしてなかなかよさそう」「スタートアップを企画したい人向け」
番外: Aaron Patterson氏の日本語ツイート
morimorihogeさんが社内Slackに投下したツイートです。
まじ、やばいです
— Aaron Patterson (@tenderlove) 2017年7月13日
今週は以上です。
バックナンバー(2017年度)
- 週刊Railsウォッチ(20170707)Railsの新機能ActiveStorage、高速Rubyフォーマッタrufo gemが超便利、Railscasts全コンテンツが無料公開ほか
- 週刊Railsウォッチ(20170630)Rails 5.1.2/4.2.9リリース、高機能なRailsキャッシュcounter_culture、Vue.jsの公式SSRガイドほか
- 週刊Railsウォッチ(20170623)gemを見極める7つのコツ、mixinがよくない理由、重いページをrender_asyncで軽減ほか
- 週刊Railsウォッチ(20170616)railsdiff.orgはアップグレードに便利、RubyのDSLとかっこの省略、TerraformをRubyで制御ほか
- 週刊Railsウォッチ(20170609)ついにtherubyracerからmini_racerへ、注意しないとハマるgem、5.1でのVue.jsとTurbolinksの共存ほか
- 週刊Railsウォッチ(20170602)チームが喜ぶ19のgem、Bundler 1.15が高速化&機能追加、Deviseに挑戦する新認証gem「Rodauth」ほか
- 週刊Railsウォッチ(20170512)Rubyの不思議な挙動「シャドウイング」、コードレビュー作法を定めるDanger gemほか
- 週刊Railsウォッチ(20170428)Rails 6.xでの’#form_for’と
#form_tag
廃止決定のその後、deviseの5.1対応はこれから、ほか - 週刊Railsウォッチ(20170421)RailsConfが来週アリゾナで開催、コントローラを宣言的に書けるdecent_exposure gemほか
- 週刊Railsウォッチ(20170414)サーバーを危うくする1行のコード、PostgreSQL 10の新機能ほか
- 週刊Railsウォッチ(20170407)N+1問題解決のトレードオフ、Capybaraのテスト効率を上げる5つのコツほか
- 週刊Railsウォッチ(20170331)PostgreSQLの制約機能を使えるRein gemはビューも使えるほか
- 週刊Railsウォッチ(20170324)Ruby 2.4.1リリース、GAEがついにRubyに対応、このgemがないと生きていけない27選ほか
- 週刊Railsウォッチ(20170317)Railsパフォーマンスチューニング本、DBレコード存在チェックの最速メソッド、RubyのUnicode正規化ほか
- 週刊Railsウォッチ(20170310)クールなDocker監視ツールCtop、RailsがGoogle Summer of Code 2017に正式参加、Unicode 10.0.0ドラフト発表ほか
- 週刊Railsウォッチ(20170303)5.0.2正式リリース、メタプログラミングに懲りた話、bundler 1.12のバグ、すぐ試せるWebアノテーションほか
- 週刊Railsウォッチ(20170227)Rails 4.2.8リリース、SHA-1コリジョンアタック、便利なハッシュ変換ツールほか
- 週刊Railsウォッチ(20170217)Rails 4.2.8.rc2リリース、Ruby 2.4正規表現とActiveSupportのnormalizeほか
- 週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
- 週刊Railsウォッチ(20170203)AnyLogin gemで開発中に楽々再ログイン、イベント数ベース課金の監視サービスRollbarほか
- 週刊Railsウォッチ(20170127)わかりやすいAWSサービス名、Rails DBは便利、TruffleRubyの驚異的速度ほか
- 週刊Railsウォッチ(20170120)Ruby 2.5.0 devリリース、古いMySQLのサポート終了、uniqメソッドが削除ほか
- 週刊Railsウォッチ(20170116)Ruby 2.4の詳細、範囲指定したsumメソッドは速い、rescueの挙動を動的に変更ほか
- 週刊Railsウォッチ(20170110)ReactをRailsに置き換える、Ruby 2.4の新機能ほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。