- Ruby / Rails関連
 
週刊Railsウォッチ(20181001)Railsアップグレード記事と各種支援ツール、CLI向けRubyワンライナー集、Rubyアプリをワンバイナリ化ほか
こんにちは、hachi8833です。ついにGobyのREPLを修正できました。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
 - 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄
 
今回のつっつきは軽めでお送りします🙇。
⚓【お知らせ】週刊Railsウォッチ「公開つっつき会」#3開催
いよいよ今週となりました「週刊Railsウォッチ 公開つっつき会 第3回」(10月4日(木)19:30〜)引き続き応募中です(つっつき・懇親会ともに無料)。ノートPC片手にお気軽にご来場いただけます。皆さまのご参加をお待ちしております🙇🙇。
⚓Rails: 先週の改修(Rails公式ニュースより)
今回はすべてコミットリストから見繕いました。
⚓ルーティングがコミットされてからルーティングヘルパーモジュールを一括ビルド
tenderloveさんのコミットです。engine/configuration.rbにpaths.add "config/routes.rb",    eager_load: trueが追加されてました。
このコミットでは、ルーティングが完了してからルーティングヘルパーをeagerビルドする。これでヘルパーモジュールがキャッシュされるようになるが、ルーティング定義が「進行中(in-flight)」でもモジュールに安全にアクセスでき、ルーティングが再構成されてモジュールが再生成されるとキャッシュが自動的にinvalidになる。
これにより、URLヘルパーモジュールにアクセスできるのはルーティングが確定した後だけになるという制約が生じる。
また、コントローラが読み込まれるとrailtie経由でURLヘルパーメソッドを(withメソッドで)インクルードする。development環境ではこれが頻繁に発生する可能性がある。上の「URLヘルパーモジュールにアクセスできるのはルーティングが確定した後だけになるという制約」を適用すれば、モジュールのeagerビルドとキャッシュを安全に行える。
同PRより大意
# railties/lib/rails/engine.rb#L473
    # files inside eager_load paths.
    def eager_load!
      config.eager_load_paths.each do |load_path|
-       matcher = /\A#{Regexp.escape(load_path.to_s)}\/(.*)\.rb\Z/
-       Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
-         require_dependency file.sub(matcher, '\1')
+       if File.file?(load_path)
+         require_dependency load_path
+       else
+         matcher = /\A#{Regexp.escape(load_path.to_s)}\/(.*)\.rb\Z/
+         Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
+           require_dependency file.sub(matcher, '\1')
+         end
        end
      end
    end
つっつきボイス:「routes.rb」「よくわからないけど最適化というか安全性を高めた感じ?」「url_helper記事と関係あるかしら」「ところで、ルーティングの再読み込みはproductionでは基本発生しないから関係ないけど、development環境では大いに関係アル😊」「開発中のリロードはしょっちゅうですしね: rails routesで結構待たされる重たい処理だし」「なのでこのあたりの最適化はありがたい🙏」「普段開発してても、ルーティングの更新によく追従するな〜ってときどき感心するし: resourcesでやれるものはいいけど、RESTに収まらないようなルーティングもざらにあるし」
⚓Railsエンジンのrailtieでのルーティングの無限ループを解消
上の#33970に含まれているコミットで、こちらもtenderloveさんでした。
# actionpack/lib/action_dispatch/routing/route_set.rb#L446
      def include_helpers_now(klass, include_path_helpers)
-       if namespace = klass.parents.detect { |m| m.respond_to?(:railtie_routes_url_helpers) }
          klass.include(namespace.railtie_routes_url_helpers(include_path_helpers))
+       namespace = klass.parents.detect { |m| m.respond_to?(:railtie_include_helpers) }
+        if namespace && namespace.railtie_namespace.routes != self
+         namespace.railtie_include_helpers(klass, include_path_helpers)
        else
          klass.include(url_helpers(include_path_helpers))
        end
       end
つっつきボイス:「ルーティングが無限ループすることって割となさそうですけど?」「あ、ルーティングにはconcernとかでshared example的に外に出せる機能があるんですよそういえば💡」「そこで循環参照しちゃうことがある?」「普通にやってればネストするだけなんで起きないんですけど、書き方によってはもしかすると起きるかも🤔」
⚓関連付けプリロードの検査を改善
# activerecord/lib/active_record/associations/preloader.rb#L100
        def preloaders_on(association, records, scope, polymorphic_parent = false)
-          case association
-          when Hash
+          if association.respond_to?(:to_hash)
            preloaders_for_hash(association, records, scope, polymorphic_parent)
-          when Symbol
+          elsif association.is_a?(Symbol)
            preloaders_for_one(association, records, scope, polymorphic_parent)
-          when String
+          elsif association.respond_to?(:to_str)
            preloaders_for_one(association.to_sym, records, scope, polymorphic_parent)
          else
            raise ArgumentError, "#{association.inspect} was not recognized for preload"
           end
         end
つっつきボイス:「hash-like objectって『ハッシュのようだけどハッシュでない』ってことでしょうか?」「確かにActionController::Parametersのstrong parametersはハッシュのように見えるけどあれハッシュじゃないっす: ハッシュのAPIもそこそこ備わってますが」「お〜やっぱり」「修正前はwhen Hashだったのがif association.respond_to?(:to_hash)に変わってますね」「うんうん、is_a?なんかじゃなくてrespond_to?を使おうぜってことね、ワカル〜😋」「ハッシュじゃないからwhen Hashでは引っかからないけど、to_hashには応答する: Rubyっぽい書き方💎」
参考: Action Controller の概要 -- 4.5 Strong Parameters | Rails ガイド
⚓シャドウイングを解消
# activerecord/test/cases/connection_adapters/connection_handler_test.rb#L170
        ActiveRecord::Base.configurations = config
-        ActiveRecord::Base.configurations.configs_for.each do |config|
-          assert_instance_of ActiveRecord::DatabaseConfigurations::HashConfig, config
+        ActiveRecord::Base.configurations.configs_for.each do |db_config|
+          assert_instance_of ActiveRecord::DatabaseConfigurations::HashConfig, db_config
        end
つっつきボイス:「ちょうど今日BPS社内勉強会でRubyのシャドウイングを扱ったので」「うは〜configがもろシャドウイングしてた: 動くは動くけどお行儀はよくない」「上手の手から水が漏ってた感じですね」「Rubocopも気づかないヤツかも?」「これは適切ないい修正😊」
⚓fixture_pathがnilの場合にエラーをraise
元のissue #19414が2015年と随分昔です。
# activerecord/lib/active_record/fixtures.rb#L893
      def fixtures(*fixture_set_names)
        if fixture_set_names.first == :all
+         raise StandardError, "No fixture path found. Please set `#{self}.fixture_path`." if fixture_path.blank?
          fixture_set_names = Dir["#{fixture_path}/{**,*}/*.{yml}"].uniq
          fixture_set_names.map! { |f| f[(fixture_path.to_s.size + 1)..-5] }
        else
           fixture_set_names = fixture_set_names.flatten.map(&:to_s)
         end
         self.fixture_table_names |= fixture_set_names
         setup_fixture_accessors(fixture_set_names)
       end
つっつきボイス:「fixture_pathって、active_record/fixtures.rbにあるみたい」「ActiveRecord本編で使うのかなと一瞬思ったけど、Railsのテストヘルパーでしたか」
「今更だけどRailsでfixtureとseedの違いについて教えてくださいって質問見つけた」「fixtureはテストデータを登録するもので、seedはマスタデータの登録用という使い分けですね😊」
⚓データベースconfigをシンボルのハッシュで渡せるようにした
# activerecord/lib/active_record/database_configurations.rb#L106
        build_db_config = configs.each_pair.flat_map do |env_name, config|
-          walk_configs(env_name, "primary", config)
+          walk_configs(env_name.to_s, "primary", config)
        end.compact
# activerecord/lib/active_record/database_configurations.rb#L117
       def walk_configs(env_name, spec_name, config)
         case config
        when String
          build_db_config_from_string(env_name, spec_name, config)
        when Hash
-          build_db_config_from_hash(env_name, spec_name, config)
+          build_db_config_from_hash(env_name, spec_name, config.stringify_keys)
        end
      end
つっつきボイス:「env_nameをto_sするから文字列でもシンボルでもOKになったと」「文字列のシンボルをキーに取るハッシュか(ややこしい)」「stringify_keysはRubyのメソッドかなと思ったらRailsでした」「例のHashWithIndifferentAccessですね」「全部シンボルにできたらいいんだけどな〜、と思いつつハイフン-が入ってくるかもしれないから文字列のほうが安全なんですよね😅」
参考: ActiveSupport::HashWithIndifferentAccess -- stringify_keys
⚓Rails
⚓Shopifyの「deprecation_toolkit」gem
このgemは--record-deprecationsを付けてテストを実行するとshitlist(ブラックリストというか「殺す」リスト)を.ymlファイルに保存します。設定では#deprecation_path、#behavior、#allowed_deprecations、warnings_treated_as_deprecationを設定できます。
# 同リポジトリより
DeprecationToolkit::Configuration.deprecation_path = 'test/deprecations'
DeprecationToolkit::Configuration.deprecation_path = -> (test_location) do
  if test_location == 'admin_test.rb'
    'test/deprecations/admin'
  else
    'test/deprecations/storefront'
  end
end
つっつきボイス:「deprecation_toolkitって、まさか非推奨になったものを復活させるとかじゃないよね😆」「違います😆」「gemも含めてdeprecationをチェックできるのはありがたいかも」「まだ★は少ないですが、Shopifyは『ぜひお試しを!』と胸を張ってます💪」「ActiveSupport::Deprecationを使ってないgemのwarningをdeprecation扱いすることもできるようです」「おぉ〜😘」
「RailsやRubyのバージョンアップをほとんど諦めてるようなプロジェクトってざらにあるけど、こういうツールがあると上げやすくなりますね😋: やってみたらわんさか出てきてそっ閉じかもだけど😬」「RailsのdeprecationはRailsが面倒見るとしても、gemまでは面倒見ないし」「一気にバージョン上げようとしても詰まるだけなので、RailsもRubyもバージョンは基本少しずつ上げるのが鉄則」「Aを上げるにはBを上げないといけなくて、Bを上げるにはRubyを上げないと、Rubyを上げるには...とかね⛈」「昔にDebian Linuxのパッケージをアップグレードするときに確かglibcの依存関係で似たような玉突き事故がぐるっとひと回りしたことありました💦」
参考: Rails アップグレードガイド | Rails ガイド
参考: GNU Cライブラリ - Wikipedia
shitlistドリブンについてのShopifyのプレゼン↓です。
⚓ShopifyのRails 5へのアップグレード
つっつきボイス:「今回は何だかRailsアップグレード特集みたいになってきましたが、これは同じくShipfyの昨年6月の記事で、依存gemが370個あったそうです」「うへぇ~😭」「で5.0へのアップグレードに成功したツィートが記事に貼り付けられてますね(実物は消えてますが)」「DHHにメンション飛ばしてるのが『ほめてほめて😍』って感じ😆」「このLinesとかLOCとかClassesのリストってどうやって出すんでしたっけ?🤔」「何だったかな...rake statsか」「そうでした: 今ならrails statsですね↓」「案件で既存のRailsアプリをチェックするときはまずこれとrails routesあたりから調べるのが定番」
ツィートのスクショを貼ると規約違反になるので中々面倒です😅。
「記事のまとめは『deprecatedはなる早で取り除け』『gemはこまめにアップグレードせよ』『Railsアプリの2本立て起動とCIが武器』『データベースやキャッシュにシリアライズデータを極力保存しないこと』となってる」「確かに〜😎」「シリアライズしたデータをDBに保存するのは基本的に悪手なので、アップグレード時にはそういうのを空っぽにしておきたい」「お😳」「というのもデータのシリアライズはRubyのバージョンに依存するから」「あー、マーシャリングですね」「それそれ👉」「以前のウォッチでも、Rubyバージョンが変わって以前のマーシャリングデータが読み込めなくなった話がありました」
参考: module Marshal (Ruby 2.5.0)
⚓スライド「ここ10年間のRailsアップグレード対応を振り返る」ともうひとつのアップグレード支援ツール
つっつきボイス:「こちらもアップグレードねたのスライドで、絵が中心なのでさっと見ていけますね😋」
「そうそう、アップグレードはこのあたり↑が鬼門だってmorimorihogeさんも言ってました」「Railsは3.0->3.1のアップグレードが最も面倒なことで有名で、Sprockets周りが特にキツイ」「5.xはそんなにキツくない印象ですね」「そこまでにちゃんとアップグレードしておけば基本的に通るハズ」「gemをアップグレードするかしないかの選択肢、あるある」「時間ないので次へ〜」
後で動画も見つけました(米国ピッツバーグでのRails Conf 2018)。
これも後で気づきましたが、発表者のJordan Raine氏は発表にちなんだten_years_rails_conf_2018という、上のdeprecation_toolkitとコンセプトの似たgemをこしらえていました。gem install ten_years_rails_conf_2018でインストールできます。
# 同リポジトリより
RSpec.configure do |config|
  # Tracker deprecation messages in each file
  if ENV["DEPRECATION_TRACKER"]
    DeprecationTracker.track_rspec(
      config,
      shitlist_path: "spec/support/deprecation_warning.shitlist.json",
      mode: ENV["DEPRECATION_TRACKER"],
      transform_message: -> (message) { message.gsub("#{Rails.root}/", "") }
    )
  end
end
アップグレードの最終的な成果は以下のとおりだそうです🎊。
なお、GitHubがRailsを3.2から5.2というハードなアップグレードを終えたというニュースがつい先ごろ飛び込んできました。次回のつっつきで取り上げると思います。
参考: Upgrading GitHub from Rails 3.2 to 5.2 | GitHub Engineering
⚓GitHubがRails以外にもさまざまな技術を導入
- 日本語: GitHubのRails離れと、迫りくるMicrosoft | Yakst
 - 元記事: GitHub goes off the Rails as Microsoft closes in • The Register
 
つっつきボイス:「訳したかったこれ😢: 上の記事ではGitHubはモノリスでなくなりつつあるということですが、以前TechRachoに掲載したAaron Pattersonさんのインタビュー↓では、GitHubはマイクロサービス化を進めてはいるけどそれでもRailsモノリスだという見解でした(会社の見解はまた違うかも?)」「ふむぅ、それはそれでRailsのライフサイクルかな〜」「Go言語が使われ始めているのもさもありなんです」
⚓Active Storageのvariantに渡せるオプション(RubyFlowより)
# 同記事より
my_attachment.variant(combine_options: { resize: "400x300>", extent: "400x300", background: "grey", gravity: "center"})
つっつきボイス:「ActiveStorage、まだ使う機会なかった」「ほほぉ、ちょっと工夫すれば原理的にはvariantにImageMagickのフラグを何でも渡せるのか」「combine_options:にさらにハッシュで渡すってことみたい」
⚓has-many-with-set: Railsの多対多をスマートに扱うgem(GitHub Trendingより)
- リポジトリ: ebobby/has-many-with-set
 
# 同記事より
class Article < ApplicationRecord
  has_many_with_set :tags   # <--- ここが重要!
end
Tag.create(:name => 'programming')
Tag.create(:name => 'open source')
Tag.create(:name => 'startups')
Tag.create(:name => 'ruby')
Tag.create(:name => 'development')
tags = Tag.all
1000.times do
  a = Article.new(:title => "Buzzword about buzzwords!",
                  :body => "Lorem ipsum")
  a.tags = tags.sample(rand(tags.size + 1))
  a.save
end
ArticlesTagsSetsTag = Class.new(ApplicationRecord)
ArticlesTagsSetsTag.count # this class doesn't exist by default,
                          # I had to create it by hand for the example.
=> 80
つっつきボイス:「★は200超え」「with setだから文字どおりいわゆる数学の集合として扱うってことなんでしょうね」「数学の集合は重複を認めないものだから、それに基づいて記事ごとのタグが重複なしに扱えるってことかな?」「いわゆるブログ記事のタグにぴったりな感じ」「時間ないので次へ〜」
一方で、どんな「集まり」でも集合と呼んでよいわけではない。その「集まり」が集合と呼ばれるためには、対象が「その集まりの元であるかどうかが不確定要素なしに一意に決定できる」ように定義されていなければならない。
Wikipedia: 集合より
つっつきの後で関連記事を見つけました。集合として扱う場合、引き換えに保存と更新のコストが上がるとのことです。用途を選んで使うものですね。
⚓astah* communityの無償提供が終了
つっつきボイス:「今日社内Slackで流れてきました」「astahのCommunityエディションが提供終了したってヤツですね: お、無料のビューアー↑はあるみたいよ?」「あ、ほんとだ👀」「UML図といえばastahが長年の定番で、実績も多いですね」「むしろそれに代わるツールが意外にないという」「チームでも無料のdraw.ioとastahとどちらにするかで最終的に使いやすさでastahになりましたし👍」「ポンチ絵レベルのものが描きたいだけなら他のドロー系ツールの方が融通は効くけど、実装寄りの図とかプロパティの明確なUMLを描くならやっぱりこれかな😋: お客さまや技術者に渡せる成果物としては」「astahがJetBrainsのIDEと一緒に買えたらいいのにと思ったりします😆」「そういえばJavaのIDEであるEclipseにはモデル図を描けるプラグインもあった気がする(参考)」「あと韓国製のStarUMLを使ったことあったけど日本語化けた(今はわかりませんが)」
⚓Ruby
⚓コマンドラインで使えるRubyワンライナー集
- リポジトリ: learnbyexample/Command-line-text-processing
 - Ruby: Command-line-text-processing/ruby_one_liners.md at master · learnbyexample/Command-line-text-processing
 
# 同記事より
$ s='foo=5, bar=3; x=83, y=120'
$ # 数値を大きさ順に取り出す: 「perl -lne 'print join " ", /\d+/g'」と同じ
$ echo "$s" | ruby -lne 'print $_.scan(/\d+/).join(" ")'
5 3 83 120
つっつきボイス:「learnbyexample/Command-line-text-processingというワンライナーをたくさん集めてるリポジトリがあって、その中のひとつです: ★7500超え」「こういうワンライナーは深く考えずにターミナルにペタッと貼り付けて使えるのがいいっすね」「いわゆるsed的に使う感じですね: このリポジトリもどちらかというとそれが目的みたいです」「パズル系のワンライナーではなさそうなので結構実用的かも❤️」
⚓ruby-warning: Rubyの不要なwarningを除外
# 同リポジトリより
# 初期化されてないインスタンス変数のwarningをすべて無視
Warning.ignore(/instance variable @\w+ not initialized/)
# 現在のファイルについて、初期化されてないインスタンス変数のwarningをすべて無視
Warning.ignore(/instance variable @\w+ not initialized/, __FILE__)
# 現在のファイルについて、初期化されてないインスタンス変数のwarningをすべて無視
Warning.ignore(:missing_ivar, __FILE__)
# 現在のファイルについて、FixnumやBignumのwarningをすべて無視
Warning.ignore([:fixnum, :bignum], __FILE__)
# warningをwarningレベルでLOGGERに書き込む
Warning.process do |warning|
  LOGGER.warning(warning)
end
# 現在のファイルについて、warningをerrorレベルでLOGGERに書き込む
Warning.process(__FILE__) do |warning|
  LOGGER.error(warning)
end
つっつきボイス:「y-yagiさんの昨年のブログ記事でこのruby-warningを見かけました」「gemのwarningを抑え込むヤツか〜😍: warningが多すぎると本来のものが埋もれちゃうし、かといって単にwarningを抑制しちゃうと、今度は自分がwarning出すようなコードを書いても気づけなくなっちゃうという」「さっきのdeprecation系ツールに通じるものがありますね」「いぶし銀的なツール: よさそう👍」「今更ですが、Rodaなどでお馴染みのJeremy Evansさん↓のgemでした」
⚓ruby-packer: Rubyアプリをワンバイナリ化するツール(RubyFlowより)
コンセプトの似ているtraveling-rubyというツールもありますが、ruby-packerはずっと新しいようです。LinuxのSquashFSというファイルシステムを使ってるそうです。
つっつきボイス:「Railsもフルサポートだそうです(データベースは明らかに別物になるでしょうけど)」「Rubyで書いたアプリを社内限定で配布するときによさそう」「RubyやPythonなどのスクリプト言語で書かれたツールを配布するときって、ユーザーの環境を揃えないといけないし、トラブルシューティングの問い合わせが社内から山ほど押し寄せたりしますもんね」「Rubyは一般ユーザーの環境にはデフォルトで入ってないし、その手間がバカにならない」「ワンバイナリならダブクリすれば動くから世話要らず😊」
後で試しに小規模なオレオレRailsアプリをビルドしてみたところ、Rubyをコンパイルするところから始まり、ビルドに30分ほどかかりましたが、gemの依存関係もbundler経由で面倒を見ているようです。時間切れでまだアプリとして動かすところまではたどり着いてませんが、バイナリサイズは100MBほどになりました。後でもう少し追ってみたいと思います。
⚓imageflow: 新しい画像処理ライブラリ
- サイト: imageflow = libimageflow + imageflow-server
 - リポジトリ: imazen/imageflow
 - Rubyバインディング: imazen/imageflow/tree/master/bindings/ruby
 
Ruby製ではありませんが、Rubyバインディングもあるということなので。ImageMagickより17倍速いと言ってます。
⚓その他Ruby
- 元記事: Ruby Conferences ‘n’ Camps in 2019 - What’s Upcoming? | calendar -- 来年までの主なRubyカンファレンス(RubyFlowより)
 
つっつきボイス:「来年のRubyKaigi 2019@Fukuokaもエントリしてます」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓コンテナのデザインパターン
- 元記事: コンテナのデザインパターンを学べる論文「Design patterns for container-based distributed systems」を読んだ - kakakakakku blog
 - 論文: Design patterns for container-based distributed systems -- 45406.pdf
 
つっつきボイス:「ついにコンテナにもデザインパターンが」「Leader electionパターンやらAmbassadorパターンやら: こういうのがあると設計の幅が広がってくるし😋」「共通言語にならないと意味がないから、普及するかどうかですね: まだ途中でしょうし」「いいパターン名を付けられるかどうかもポイントのひとつかな」「名前が長すぎないのも」
参考: ギャング・オブ・フォー (情報工学) - Wikipedia
⚓クラウド4強のサーバーレスをベンチマーク比較してみる(Serverless Statusより)
つっつきボイス:「4強はAWS、Microsoft Azure、Google GCF、IBM」「パフォーマンス以外にも課金方法とか使い勝手とかあるから単純な比較は難しいですね」「あと宗教も😆」「↑これだけ見れば、AWSはメモリを増やすと計算時間が短縮されるけどある程度以上は頭打ちで、Googleも似た傾向だけど分散が大きい、IBMのは時間の分散に埋もれがちな感じ」「Azureは変化なし😆」「Azureのメモリ量は計算パワーと連動させないつくりなのかな?」「ともあれ、あくまで取っ掛かりというか参考までにということで」「自分たちとしてはいくらかかるか、つまり課金体系が一番気になる💰」
⚓その他クラウド
- 元記事: Use YubiKey security key to sign into AWS Management Console with YubiKey for multi-factor authentication | AWS Security Blog(WebOps Weeklyより)
 - 元記事: [速報]マイクロソフト純正のデスクトップ仮想化サービス「Windows Virtual Desktop」発表。Azureからクラウドサービスとして。Microsoft Ignite 2018 - Publickey
 
⚓SQL
⚓SQLスタイルガイド(DB Weeklyより)
-- 同サイトより
(SELECT f.species_name,
        AVG(f.height) AS average_height, AVG(f.diameter) AS average_diameter
   FROM flora AS f
  WHERE f.species_name = 'Banksia'
     OR f.species_name = 'Sheoak'
     OR f.species_name = 'Wattle'
  GROUP BY f.species_name, f.observation_date)
  UNION ALL
(SELECT b.species_name,
        AVG(b.height) AS average_height, AVG(b.diameter) AS average_diameter
   FROM botanic_garden_flora AS b
  WHERE b.species_name = 'Banksia'
     OR b.species_name = 'Sheoak'
     OR b.species_name = 'Wattle'
  GROUP BY b.species_name, b.observation_date)
つっつきボイス:「↑こうやって縦を揃えたりするみたい」「SQLのスタイルガイドってありそうで見たことなかったかも?」「SQLの整形ツールもいろいろあるんですけど、実は結構難しくて🤔: JOINのときにONを改行するかしないかとか流派がいろいろあるし」「SELECTとかFROMを大文字で書くというのは割と行われてる感じですね」「『SQLやデータベース構造にオブジェクト指向を適用するな』というルールもある」「そうね☺️(もちろん😤)」
「SQLだとlintかけろみたいなことあまり言われないですね」「SELECTの次がFROMみたいのは確実だけど、うんと長いSQLになるともうキリがないし、一般のプログラミング言語と比べて、SQL文の整形にコストをかける価値があまりない気がする: そもそもアプリ層やってるときにそうそう生SQLは書かないし」「そのためのORMですしね」「それに生SQLを書くときってバッチ処理みたいなワンショットのものが多いし、lintかけようにもそもそもSQL文をファイルに保存しなかったりするし」
⚓その他SQL
- 元記事: Death By Database(DB Weeklyより)
 - 元記事: Append-only databases and the GDPR conundrum – Bloor Research
 - 元記事: select * from depesz; » Blog Archive » pg_terminator released(Postgres Weeklyより)
 - 元記事: Sequel Proを超えるGUIツールが出てきたぞ - Qiita
 
⚓JavaScript
⚓GAEがNode.jsを標準サポート
つっつきボイス:「知人が「めちゃ速い」と感激してましたので」「Node.jsやらんといかんかな〜」「Node.js、ありそうでなかったんですね」
参考: Google App Engine とは? | App Engine | Google Cloud
⚓30秒でわかるJavaScriptサンプルコード集i(GitHub Trendingより)
つっつきボイス:「↓こんな感じでJavaScriptのコードスニペットと利用例がずらっとあります: GitHubにも同じものもありますし」「オレの知らないJavaScript😅: deepFlatten↓とかもある〜」「この手のサイトはいっぱいあるけど、結構使いやすそうな感じ😋」
const deepFlatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)));
⚓その他
⚓Amazonのコワーキングスペース『AWS Loft Tokyo』
AWS Loftは期間限定のところもあるが東京は世界で3番目のパーマネントな施設とのこと。
背景に、東京のスタートアップエコシステムの拡大、技術水準の高さ、東京への集積度、行政などの支援基盤などから判断。
— 山口健太 | Kenta Yamaguchi (@tezawaly) September 19, 2018
つっつきボイス:「AWS Loft Tokyo、AWSアカウント持ってれば無料だそうです」「10/1から目黒でオープンすると: 何だかすげ〜な〜😳」「AWSの専門家が常駐してて予約なしで無料相談できるとも」「そこ重要!」「Amazonダンボール模様のエレベーター!」「マイクロソフトやGoogleも同じようなサービス始めるかも?なんて😆」「コワーキングスペースはいっとき流行ったけど今後はどうだろう?🤔」「資金力のあるクラウド会社が提供するというのが今までのコワーキングスペースと違うかも」「さすがに守秘義務を伴う請負開発作業には向いてないと思いますが、学生さんやスタートアップ系の人にはよさそうですね」
あまりに遠い昔ですが、かつてNECが「Bit-INN」という一種のたまり場を作って相当な人気を博したのを思い出してしまいました。
参考: NEC Bit-INN - Studio RUM サイト
⚓今までなかったのが不思議
CSVの表示,色分けするとめっちゃ見やすいです pic.twitter.com/WBY3Xp52Nz
— なかひこくん (@takanakahiko) September 21, 2018
つっつきボイス:「VSCodeのプラグインなんだそうです」「これは( ・∀・)イイ!!欲しいヤツ〜😍」「コマンドライン向けのツールとしてGoとかでも作ったら人気出そう」「色とか細かく指定できなくてもいいからとにかく色分けしてくれればいい、みたいな感じで☺️」「5色ぐらいを循環させるだけでもいいくらい」「そうそう😆」
⚓番外
⚓いにしえのスプリングリバーブ
信じられますか、この巨大な木の箱、コイルで反響作るリバーブボックスなんですよ… pic.twitter.com/7MeG7EejbK
— hatis noit ハチスノイト (@hatis_noit) September 26, 2018
参考: スプリングリバーブ:Spring Reverbとは | 偏ったDTM用語辞典 - DTM / MIDI 用語の意味・解説 | g200kg Music & Software
参考: The Shadow Of Your Smile クリスマス鉄板バージョン! ( その他音楽 ) - ひやしんす通信 - Yahoo!ブログ
⚓最古の動物の化石
脂肪を検出できたというのが驚きです。
参考: 地球最古・5億5800万年前の生き物の痕跡が報告され、古生物学が追い求めてきた数十年来の謎が解明へ - GIGAZINE
今回は以上です。
バックナンバー(2018年度後半)
週刊Railsウォッチ(20180925)Rails大規模支払サービス開発のノウハウ、RailsのMySQLがutf8mb4に移行、Rpush gemほか
- 20180918 ビューテンプレート探索が高速化、mini_scheduler gem、レガシコントローラのリファクタリングほか
 - 20180910 公開つっつき会#2、RSpecは何を参考にするか、イベントソーシング、marginalia gem、負荷テストツールvegetaほか
 - 20180903 次世代アップローダーgem「Shrine」、RSpecをどこまでDRYに書くか、Rubyのmainオブジェクトの秘密、GitLabのCookie利用許諾機能はエライほか
 - 20180827 Ruby Prize 2018募集開始、Interactor gemとReader Object、書籍『Real World HTTP』、Basecampのヒルチャート機能ほか
 - 20180820 Railsで構築されたサイト40選、Deviseはつらいよ、ARのスコープとクラスメソッドの使い分けほか
 - 20180813 Rails 5.2.1リリース、sanitize_sql_arrayは5.2からpublicだった、Dev.toがRailsアプリのソースを公開ほか
 - 20180806 Rails 5.2.1.rc1リリース、Railsガイド日本語版が5.1に対応、Regexp#match?ほか
 - 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など)です。
      






















