週刊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のルーティングを極める(前編)

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_pathnilの場合にエラーを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_nameto_sするから文字列でもシンボルでもOKになったと」「文字列のシンボルをキーに取るハッシュか(ややこしい)」「stringify_keysはRubyのメソッドかなと思ったらRailsでした」「例のHashWithIndifferentAccessですね」「全部シンボルにできたらいいんだけどな〜、と思いつつハイフン-が入ってくるかもしれないから文字列のほうが安全なんですよね😅」

参考: ActiveSupport::HashWithIndifferentAccessstringify_keys

Rails

Shopifyの「deprecation_toolkit」gem


同リポジトリより

このgemは--record-deprecationsを付けてテストを実行するとshitlist(ブラックリストというか「殺す」リスト)を.ymlファイルに保存します。設定では#deprecation_path#behavior#allowed_deprecationswarnings_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はモノリスでなくなりつつあるということですが、以前TechRachoに掲載したAaron Pattersonさんのインタビュー↓では、GitHubはマイクロサービス化を進めてはいるけどそれでもRailsモノリスだという見解でした(会社の見解はまた違うかも?)」「ふむぅ、それはそれでRailsのライフサイクルかな〜」「Go言語が使われ始めているのもさもありなんです」

[インタビュー] Aaron Patterson(前編): GitHubとRails、日本語学習、バーベキュー(翻訳)

Active Storageのvariantに渡せるオプション(RubyFlowより)

# 同記事より
my_attachment.variant(combine_options: { resize: "400x300>", extent: "400x300", background: "grey", gravity: "center"})

つっつきボイス:「ActiveStorage、まだ使う機会なかった」「ほほぉ、ちょっと工夫すれば原理的にはvariantImageMagickのフラグを何でも渡せるのか」「combine_options:にさらにハッシュで渡すってことみたい」

has-many-with-set: Railsの多対多をスマートに扱うgem(GitHub Trendingより)

# 同記事より
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の無償提供が終了


astah.change-vision.comより


つっつきボイス:「今日社内Slackで流れてきました」「astahのCommunityエディションが提供終了したってヤツですね: お、無料のビューアー↑はあるみたいよ?」「あ、ほんとだ👀」「UML図といえばastahが長年の定番で、実績も多いですね」「むしろそれに代わるツールが意外にないという」「チームでも無料のdraw.ioとastahとどちらにするかで最終的に使いやすさでastahになりましたし👍」「ポンチ絵レベルのものが描きたいだけなら他のドロー系ツールの方が融通は効くけど、実装寄りの図とかプロパティの明確なUMLを描くならやっぱりこれかな😋: お客さまや技術者に渡せる成果物としては」「astahがJetBrainsのIDEと一緒に買えたらいいのにと思ったりします😆」「そういえばJavaのIDEであるEclipseにはモデル図を描けるプラグインもあった気がする(参考)」「あと韓国製のStarUMLを使ったことあったけど日本語化けた(今はわかりませんが)」


Wikipediaより

Ruby

コマンドラインで使えるRubyワンライナー集

# 同記事より
$ 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: 高速/高性能ルーティングエンジンgem「Roda」README: 前編(翻訳)

ruby-packer: Rubyアプリをワンバイナリ化するツール(RubyFlowより)


enclose.ioより

コンセプトの似ているtraveling-rubyというツールもありますが、ruby-packerはずっと新しいようです。LinuxのSquashFSというファイルシステムを使ってるそうです。

参考: SquashFS - Wikipedia


つっつきボイス:「Railsもフルサポートだそうです(データベースは明らかに別物になるでしょうけど)」「Rubyで書いたアプリを社内限定で配布するときによさそう」「RubyやPythonなどのスクリプト言語で書かれたツールを配布するときって、ユーザーの環境を揃えないといけないし、トラブルシューティングの問い合わせが社内から山ほど押し寄せたりしますもんね」「Rubyは一般ユーザーの環境にはデフォルトで入ってないし、その手間がバカにならない」「ワンバイナリならダブクリすれば動くから世話要らず😊」

後で試しに小規模なオレオレRailsアプリをビルドしてみたところ、Rubyをコンパイルするところから始まり、ビルドに30分ほどかかりましたが、gemの依存関係もbundler経由で面倒を見ているようです。時間切れでまだアプリとして動かすところまではたどり着いてませんが、バイナリサイズは100MBほどになりました。後でもう少し追ってみたいと思います。

imageflow: 新しい画像処理ライブラリ


imageflow.ioより


同リポジトリより

Ruby製ではありませんが、Rubyバインディングもあるということなので。ImageMagickより17倍速いと言ってます。

その他Ruby


つっつきボイス:「来年のRubyKaigi 2019@Fukuokaもエントリしてます」

クラウド/コンテナ/インフラ/Linux/Serverless

コンテナのデザインパターン


つっつきボイス:「ついにコンテナにもデザインパターンが」「Leader electionパターンやらAmbassadorパターンやら: こういうのがあると設計の幅が広がってくるし😋」「共通言語にならないと意味がないから、普及するかどうかですね: まだ途中でしょうし」「いいパターン名を付けられるかどうかもポイントのひとつかな」「名前が長すぎないのも」


同記事より

参考: ギャング・オブ・フォー (情報工学) - Wikipedia

クラウド4強のサーバーレスをベンチマーク比較してみる(Serverless Statusより)


同記事より


つっつきボイス:「4強はAWS、Microsoft Azure、Google GCF、IBM」「パフォーマンス以外にも課金方法とか使い勝手とかあるから単純な比較は難しいですね」「あと宗教も😆」「↑これだけ見れば、AWSはメモリを増やすと計算時間が短縮されるけどある程度以上は頭打ちで、Googleも似た傾向だけど分散が大きい、IBMのは時間の分散に埋もれがちな感じ」「Azureは変化なし😆」「Azureのメモリ量は計算パワーと連動させないつくりなのかな?」「ともあれ、あくまで取っ掛かりというか参考までにということで」「自分たちとしてはいくらかかるか、つまり課金体系が一番気になる💰」

その他クラウド

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

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 Tokyo、AWSアカウント持ってれば無料だそうです」「10/1から目黒でオープンすると: 何だかすげ〜な〜😳」「AWSの専門家が常駐してて予約なしで無料相談できるとも」「そこ重要!」「Amazonダンボール模様のエレベーター!」「マイクロソフトやGoogleも同じようなサービス始めるかも?なんて😆」「コワーキングスペースはいっとき流行ったけど今後はどうだろう?🤔」「資金力のあるクラウド会社が提供するというのが今までのコワーキングスペースと違うかも」「さすがに守秘義務を伴う請負開発作業には向いてないと思いますが、学生さんやスタートアップ系の人にはよさそうですね」

あまりに遠い昔ですが、かつてNECが「Bit-INN」という一種のたまり場を作って相当な人気を博したのを思い出してしまいました。

参考: NEC Bit-INN - Studio RUM サイト

今までなかったのが不思議


つっつきボイス:「VSCodeのプラグインなんだそうです」「これは( ・∀・)イイ!!欲しいヤツ〜😍」「コマンドライン向けのツールとしてGoとかでも作ったら人気出そう」「色とか細かく指定できなくてもいいからとにかく色分けしてくれればいい、みたいな感じで☺️」「5色ぐらいを循環させるだけでもいいくらい」「そうそう😆」

番外

いにしえのスプリングリバーブ

参考: スプリングリバーブ: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ほか

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

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

Rails公式ニュース

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

WebOps Weekly

webops_weekly_banner

Postgres Weekly

postgres_weekly_banner

DB Weekly

db_weekly_banner

Serverless Status

serverless_status_banner

GitHub Trending

160928_1701_Q9dJIU

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ