Tech Racho エンジニアの「?」を「!」に。
  • 開発

週刊Railsウォッチ(20170714)LicenseFinder gemで依存ライブラリを自動チェック、オピニオン「RubyはWebスケールでは遅いのか?」、PostgreSQL 10 Beta 2リリース、Ryan Bates氏ご結婚ほか

こんにちは、hachi8833です。エアコンと扇風機の二本立てはやりすぎでしょうか。

7月2週目のRailsウォッチ、いってみましょう。今回はJavaとKotlin成分もちょっぴり配合しました。

慶事その1: Railsのダウンロードが先週1億件を突破🎉

おめでとうございます!

つっつきボイス: 「このうち自動でないダウンロード件数ってどのぐらいなんだろうね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でした。「スポンサー付き動画;-)」とテロップも出てくる行儀のよさです。


https://player.vimeo.com/video/224951588より

こういう宣伝をさらりとやるのがいいですね。


www.phusionpassenger.comより

Rails: 今週の改修

今週も公式ニュースが更新されていないので、コミットからみつくろいました。おおむね小粒です。

ActionController::Baseprotect_from_forgeryをデフォルトでオンに

# 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_pathnilを許容するよう再修正

# 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スケールでは遅いのか?」

刺激的なタイトルのおかげで各所でバズっているようです。

つっつきボイス: 「年に1ぺんはこういう記事でヒートアップしてるなw」「サーバーのレイテンシやスループットをじょうごで理解するのって、きっと定番なんでしょうね」


www.speedshop.coより

多くの男子は「ライオンとトラはどっちが強いか」「女の子は戦車か飛行機か」みたいなお題を出されると反射的にヒートアップしてしまうので、もうしゃーないですね。

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に移行


pgloader.ioより

PostgreSQL界でおなじみのDimitri Fontaine氏の最新記事です。氏みずから開発しているpgloaderが3.4.1にバージョンアップしたそうです。

つっつきボイス:この間のTechRacho記事にもあった外部データラッパー(FDW)があるのも移行に便利」

PostgreSQL 10 Beta 2がリリース

今朝morimorihogeさんが社内Slackに流してくれて知りました。

Beta 1からの変更点がてんこ盛りすぎるので引用はあきらめました。

その代わり、日付が空欄の10のリリースノートのドラフトがつい最近公開されているのを見つけました。PostgreSQL 10の新機能のまとまった情報がなかなかなかったので、これは助かりそうです。


www.postgresql.orgより

Rubyの定数(constants)について知っておきたいこと(RubyFlowより)


www.blackbytes.infoより

Rubyの定数に関する解説です。

つっつきボイス: 「どちらかというと新人向けかな」「Rubyの定数はGlobal変数で上書きしようとするとwarningが出る程度ですね」

「Rubyで定数を完全にイミュータブルにしない理由って何なんでしょうか?」「モンキーパッチやメタプログラミングなんかで定数を変更できないと困ることがあるからでしょうね」


http://www.blackbytes.info/より

つっつきボイス:
「『#constantizeなどのメソッドはセキュリティリスクが生じる可能性がある』↑ってありますね」「渡した文字列から本物のクラスを作れるから、もちろん取扱い注意」
#evalみたいな?」
「いやいや、#evalよりは全然マシですw」「たとえばpolymorphicなフォームを受け取って、typeに入ってきた文字列をconstantizeするみたいな使い方はままある」
「その代わり#constantizeを使うなら必ず文字列をホワイトリストでチェックしないとダメ

今気づきましたが、上のチートシート画像の「uninitialized」のスペルがちょっとだけ間違ってますね。

定数まだちゃんとわかってないわー、自分。

Firebase: Googleのモバイル系BaaS


firebase.googleblog.comより

Googleが2014に買収したサービスですが、Google Cloud Platform(GCP)とサービスの範囲がかなり似通っているように見受けられました。Google Analyticsとの連携が得意そうです。

つっつきボイス: 「BaaSってBackend as a Serviceか」「おー、Firebase、割りと汎用性高そう: もうちょい真面目に調べてもいいかも」「GCPとどう住み分けるんだろう?」「Firebaseはどうやらガチプログラマーじゃない人をターゲットにして、提供したいサービスを組み合わせて使える様子」「マーケティングとかSEOの人には魅力かも」

そこへちょうど通りかかったBPSアプリチームのメンバーが「お、Firebaseならうちのアプリチームで使ってる人いますよー」と耳打ちしてくれました。いいこと聞いた!

参考: Firebaseの始め方

Scenic: Railsでデータベースビューを使う


github.com/thoughtbot/scenicより

Railsとデータベースビュー周りを調べていて見つけました。

sce·nic (ADJ 形容詞) 風光明媚な

つっつきボイス: 「シーニック、って読むみたい」「お、リポジトリをよく見たらthoughtbotじゃん!」「thoughtbot?」Deviseやってる会社」「おー、paper_clipとかfactory_girlとかもここなのか」


github.com/thoughtbot/より

つっつきボイス: 「thoughtbotならきっと設計もかなりまともだろうし、メンテも手厚くやってくれそう」「SQLファイルを元にmigrationを生成するのか: rollbackはどうやってるん?」

2017/07/30修正 by @morimorihoge

僕のうろ覚えで読み会時Deviseをthoughtbotと勘違いしておりましたが、正しくはplataformatecでした。お詫びいたします。

thoughtbot: paplerclip, factory_girl
plataformatec: devise, simple_form

です。きちんと確認しないと良くないですね。大変失礼いたしました。
※読者の方よりご指摘頂きました。ありがとうございました。

RSpecのちょっとした使いこなしのコツ(RubyFlowより)


http://jakeyesbeck.com/より

  • subjectlet
  • ゆるふわな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より)⭐

Two tests you should run against your Ruby project nowという記事で紹介されていたのを見つけました。

Rubygemに限らず、JavaやNode.jsやPython EggsやGodepなどのライセンスもチェックできます。

つっつきボイス: 「これは( ・∀・)イイ!!」「こういうのありそうでなかったかも」「CIに仕込むとよさそうですね」「まさに: 脆弱性チェックと一緒に入れる感じ」

「ちゃんと調べたわけではないけれど、ライセンスが何も入っていないソフトウェアの方がおそらく法務上のリスクが高いんじゃないかな」「ライセンスが添付されてない場合であっても基本の著作権はあると解釈される可能性: ライセンスがないからといって自由に使っていいというふうにはならないだろうと思う」「ひー」

今週の⭐を進呈いたします。おめでとうございます。

オンラインドキュメント「Enterprise Rails」

Enterprise Railsはオライリーから出ていた書籍ですが、著者のサイトで全文が無料で公開されています。
著者のDan Chak氏はGoogleのプロダクトマネージャーで、自転車が趣味だそうです。

同書は2009年に日本語版も販売されていました。

つっつきボイス: 「うん、さすがに古いw: Rails 2ぐらいの時期か」「Rails経験の長い開発者がおさらい的に読むならともかく、新人が読むには向いてないかも」「設計の話が中心のようなので、今も通用する部分はありそう」「Enterpriseと謳っているから当然設計がテーマですね」

Rubyのスコープを理解する

2015年の記事なので新しくはありませんが、よさそうです。

つっつきボイス: 「特段新しいことは書いていなさそう」「Rubyのスコープってまとまった情報があまりないので、初学者にはいいかもですね」「スコープは文脈に依存する部分が大きいからある程度仕方ないかも」「この絵はちょっといい↓」「みんな言葉で書くのが好きだからw」「図は大事」


www.sitepoint.comより

参考: 日本語でかつ2013年の記事ですが、Rubyにおけるスコープのおはなしも私には面白く読めました。つか「安倍首相」の部分が今も変わっていないのがクラクラします。

influxdbをRubyで使う


blog.arkency.comより

つっつきボイス: 「お、Goで書かれた時系列データベース(time series database)か: 昔研究で時系列データベース使ってたんで」「おー、どういうときに使うんでしょうか?」「超ざっくり言うと、たとえば測定なんかで『この閾値を超えたときに超えた部分のデータだけを取る』みたいなことをしたい場合、SQLでまともにやろうとすると常にクエリをかけつづけないといけない: 時系列データベースはトリガーベースでそこのデータだけを取ったりできる」「なるほど」「最近の時系列DBまでは追ってないけどw」

Vue Router: Vue.jsにルーティング機能を導入


scotch.ioより

// 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コード


csswizardry.comより

  • @extend
  • CSSクラス名の結合
  • backgroundのショートハンド
  • キーセレクタを複数箇所で使う
  • 他のコンポーネントのファイルで使われているクラス
  • BEMミックス
  • CSSの@import

つっつきボイス: 「うん、これ使えるなー: あるあるネタの宝庫」「backgroundをショートハンドにすると-colorなのか-imageなのかがあいまいになったり」「@importは最近のブラウザだと動いちゃうんでたちが悪いw」「これ翻訳したら読んでもらえるかな」

Kotlinの隠れたコストを探る


medium.com/@BladeCoderより

隣の芝生ではありませんが、ちょっとKotlin記事をあさってみました。

つっつき中にふたたびアプリチームのメンバーが通りすがってくれたので、lambda式などKotlinにあってJavaにない機能や、Kotlinの最適化などについての話題になりました。

今日になっていくつかリンクを教えてもらいました。

ありがとうございます!

git-xlsx-textconv: XLSXファイルをgit diffで表示

社内Slackに投下されて知りました。


github.com/tokuhirom/git-xlsx-textconvより

つっつきボイス: 「Go言語で書かれてるんですけど、コードがびっくりするぐらい短いです」

remotely ruby: Ruby開発者の求人サイト

求人リストのRubyアイコンがときたま不意にピク付くので、どきっとします。それだけです。


remotelyruby.comより

番外: ワーキングバックワード: 逆からたどってビジネスを形にする

かなり古い記事です。

  • プレスリリースから書く
  • FAQから書く
  • カスタマー・エクスペリエンスを先に定義する
  • マニュアルから書く

つっつきボイス: 「お、AmazonのCTOが書いてるのか」「サービスとか事業を興すときの考え方の一つとしてなかなかよさそう」「スタートアップを企画したい人向け」

番外: Aaron Patterson氏の日本語ツイート

morimorihogeさんが社内Slackに投下したツイートです。


今週は以上です。

バックナンバー(2017年度)

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

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

Rails公式ニュース

RubyFlow

160928_1638_XvIP4h


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。