週刊Railsウォッチ(20181203)Railsのglobalidとは、AWS LambdaがRubyに対応、JSはPromiseを最初に学べほか

こんにちは、hachi8833です。この年で初めて親知らずを抜かなければなりません。セキュリティアップデートを当てたがらない人の気持が少しわかってきました。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

お知らせ: 週刊Railsウォッチ: 公開つっつき会#5

12/6(木)の公開つっつき会、引き続きご応募をお待ちしております🙇。お気軽にどうぞ!

臨時ニュース

AWS LambdaがRubyに対応

つっつき会の翌日に知りました。カスタムランタイムにちょっとときめいてしまいました。

Rails: 先週の改修(Rails公式ニュースより)

RailsのActive JobとActive Storageのセキュリティ修正リリースと5.2.2.rc1リリース

Railsセキュリティ修正リリース: 5.2.1.1、5.1.6.1、5.0.7.1、4.2.11(Active JobとActive Storage)

セキュリティ修正に伴い、Edgeガイドのセキュリティ関連の記述が更新されました。

# guides/source/security.md#L1241
- Please note that we do not accept patches for CVE version bumps. This is because application owners need to manually update their gems regardless of our efforts. Use `bundle update --conservative gem_name` to safely update vulnerable dependencies.
+ We don’t bump dependencies just to encourage use of new versions, including for security issues. This is because application owners need to manually update their gems regardless of our efforts. Use `bundle update --conservative gem_name` to safely update vulnerable dependencies.

つっつきボイス:「おー、セキュリティポリシーの文面が少し変わったのか」「前はCVE対応のためのパッチは受け付けないということになってたのが少し緩くなって、新しいバージョン(セキュリティ対応を含む)を使うだけのために依存gemのアップデートを強いることはしない、ということのようです」「そのために、アップデートの他にパッチも用意されたということなんでしょうね☺️」

「そうそう、bundlerで--conservativeオプションを使うともう少し穏やかにアップデートできる」「これ以前のウォッチ出てきたのを今思い出した💦」

bundle update --conservative gem名

Globalidとは

このセキュリティ修正でGlobalIDというgemを初めて知りました。

「globalid、社内Slackでもこんなのあったんだーって話題になってましたね」「gid://というURIはRailsのこのgem中で独自に定義しているっぽい」

# 同リポジトリより
person_gid = Person.find(1).to_global_id
# => #<GlobalID ...

person_gid.uri
# => #<URI ...

person_gid.to_s
# => "gid://app/Person/1"

GlobalID::Locator.locate person_gid
# => #<Person:0x007fae94bf6298 @id="1">

「Active Jobとかの内部で使われてるようですが、アプリ開発者がこれを直接使うことはない感じでしょうか?」「いや、こういうのがあったらあったで便利な場面はありますね😋: このgid://というURIの文字列カラム1つであらゆるオブジェクトを一意に参照できるってことだから」「というと?」「普通だと、こういう参照をもたせる場合にはポリモーフィックなassociationとtyped columnという2つのカラムが必要になるけど、これなら1カラムだけでできるから便利」「おー😳」

「Rails wayから外れる場合、globalidはどうなるんだろう?」「globalidって使ったことあります?」「うーん、意図して使ったことはないけど、いろんなところで使われているという印象」「やはり」「たとえばAction CableのRedisのキーでglobalid使われてますよね」「あーそれそれ!: そんなふうに1つの文字列であらゆる参照をまかなえるヤツ」「それもURI形式の文字列で」「globalidって今のRailsに標準で入ってるのかな?」「たぶん」「ま、Redisキャッシュに入るなら標準で入ってるはずだし」

後で調べると、少なくとも素の5.2.1には入ってました↓。Active Jobのgemもglobalidに依存していました。

「globalid、Railsの中ではかなり使われてるっぽい」「確かにマーシャリングするよりglobalidの方がずっとうれしい😂」「シリアライズとはまた違う?」「シリアライズではない😎」「ステートレスな状況でもこのidさえ持っていればアクセスできるものなんで、どっちかというとparamsとクラスがワンセットになったようなものですかね☺️」「globalidはどんなものにでもポリモーフィックできる、しかもそれを文字列カラムだけでできる」「なるほど!😃」

「ひとつ気になるのは、Rails wayに乗っている状態でサロゲートキーがあるならglobalidでいいと思うんだけど、そこから外れた場合どうなるんだろう?🤔」「確かめないとわからないけど、外れた場合もRailsで何かしら対応はしていると思いたい: でないとActive Jobが動かなくなるし😆」「他の普通のキャッシュも全部動かなくなるだろうし😆」

「Rails wayから外れるgemといえば、えっと何て名前だったかな(ググる): composite_primary_keysだ!」

参考: Railsで規約に沿わない古いデータを扱う - Qiita

「composite_primary_keysって、いわゆる複合キーを扱うgemなんですね」「つまりこのgemはglobalidに相当する部分を拡張しているんだろうな」「これってサードパーティgemですか?」「ですね」

後でRailsのリポジトリを検索してみると、abstractのSchemaStatementsにcompositeのコードが少しあり、その他はテストコードでした。Rails自身は複合主キーを直接はサポートしない様子です。

「globalidって、フォントによってはgloballdに見える😆しょうがないけど」「globalid、比較的新し目の機能なのかな」「いつだったか、Railsがサロゲートキーでない主キーにも対応するとかしたとか、そんな話があった気がする」

後でglobalidのリポジトリを見てみると、first commitは2014年5月で、DHH自らのものでした。Rails 4になってから登場していました。

「こういう機能が背後にあるっていうことは知っておくといいのは確かだけど、割と暗黙な機能のようだし、どこまで触っていいものやら🤔」「あんまりつっつき回さない方がいいんでしょうかね…」

「思いつきだけど、globalidを使って、たとえばSPAをやってるときなんかにクライアント側のキャッシュキーとサーバー側のキャッシュキーのフォーマットを揃えておくと、キャッシュをexpireするときに便利だったりするのかな🤔」「ふむむ、なるほど」「そうやって統一されていれば、サーバーからクライアントにキャッシュの破棄を指示するときにラクになるとか」「それはあるかも」「『現在のキャッシュのリスト』をクライアントとサーバーで共有したいときって、両者のフォーマットが揃っている方がちょっとうれしい感じじゃないですか😋: かつキャッシュの更新時刻もリストにあれば、クライアントのキャッシュの状態がサーバーからわからなくなったときにクライアントキャッシュのリストを全部スキップするなんてことをせずに、細かいキャッシュの制御をもう少し安全にやれるようになるのかな、なんてのを取りあえず思いついてみた😊」

おたより発掘

Action CableのCoffeeScriptがES2015に置き換えられた

例の//= requireもES2015の方式に変わるそうです。


つっつきボイス:「出た、こーひーすくりぷと😆」「CoffeeScriptのコードがES2015に書き換わったそうです」「おお、それはマジでありがたい🙏」「はぁぁー、ありがたいっす🙏」「今の声、とっても実感こもってますね☺️」

「今となっては、こーひーすくりぷとのコードは見たくないなー」「正直、もっと早くやって欲しかった😭: そもそもCoffeeScript読んでないし、Action CableのJavaScriptのコードを読むときもコンパイル済みのJSの方を読んでたし😆」「😆」「CoffeeScript覚えるのイヤでしたもん😛」「まあ単なるトランスパイラだと思って使っている分にはそんなにおかしなことにはなりませんけど、今更CoffeeScriptを書くのはねー☺️」

create_table:if_not_existsオプションが追加

# ctiverecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L256
     class TableDefinition
      include ColumnMethods

      attr_accessor :indexes
-     attr_reader :name, :temporary, :options, :as, :foreign_keys, :comment
+     attr_reader :name, :temporary, :if_not_exists, :options, :as, :foreign_keys, :comment
-      def initialize(name, temporary = false, options = nil, as = nil, comment: nil)
+     def initialize(name, temporary = false, if_not_exists = false, options = nil, as = nil, comment: nil)
        @columns_hash = {}
        @indexes = []
        @foreign_keys = []
        @primary_keys = nil
        @temporary = temporary
+       @if_not_exists = if_not_exists
        @options = options
        @as = as
        @name = name
         @comment = comment
       end

つっつきボイス:「おー、こんなのが入ったのか」「マイグレーションで使うんでしょうか?」「いやー、dumpならまだしも、マイグレーションで:if_not_existsなんてやるかなー🤔: オプションとしてあってもいいとは思うけど、そんなカジュアルに使うものではない気がする」「どんな状況で使うのやら😆」

「もし:if_not_existsを使う状況があるとしたらですが、設計にもよるけど、たとえばマルチテナントのアプリでPostgreSQLのクラスタを使っていて、テナントごとのデータをテーブル名で分散している状況で、『この機能を使うまではcreate_tableしない』ようにしたいときとか、かなー🤔」「あー、そういう形のマルチテナントか😯」「あるいは特定のプラグインを導入したときだけcreate_tableするとか」

「だからマイグレーションというよりは、使う必要が生じたときに初めてテーブルを作りたいという感じなんじゃないかな: それならめちゃでかいマルチテナントアプリでもマイグレーションが軽くなるだろうし🤓」「確かにー: あるいは普通じゃない状況でのリカバリーに使うとか、ですかね」

「それともテストコードで、:if_not_existsをつけてcreate_tableしたときにテーブルが作成されるかどうかをテストするとか…?しないしない😆」「まともな使い方ってマルチテナントぐらいしか思いつかない😆」

db:schema:cache:dumpdb:schema:cache:clearがマルチDBをサポート

# activerecord/lib/active_record/railties/databases.rake#L300
    namespace :cache do
      desc "Creates a db/schema_cache.yml file."
      task dump: :load_config do
-       conn = ActiveRecord::Base.connection
-       filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.yml")
-       ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(conn, filename)
+       ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
+         ActiveRecord::Base.establish_connection(db_config.config)
+         filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.spec_name)
+         ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(
+           ActiveRecord::Base.connection,
+           filename,
+         )
+       end
      end

      desc "Clears a db/schema_cache.yml file."
      task clear: :load_config do
-       filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.yml")
-       rm_f filename, verbose: false
+       ActiveRecord::Base.configurations.configs_for(env_name: Rails.env).each do |db_config|
+         filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config.spec_name)
+         rm_f filename, verbose: false
+       end
      end
    end
  end

つっつきボイス:「おー、これもマルチDBでサポートしないといけないヤツ」「次から次へとサポートしないといけなくて大変😅」

db:schema:cache:dumpって何を吐くんだろ?」「この間使ったdb:schema:dumpはdb/schema.rbを更新するヤツだったけど、これはcacheだし🤔」「ヘルプ見たら普通にdb/schema_cache.dumpを吐いてる↓」「コードを見るとschema_cache.ymlなんてのがある: 何に使うのかよくわからないけどっ😆」

rake db:schema:cache:clear # Clear a db/schema_cache.dump file
rake db:schema:cache:dump # Create a db/schema_cache.dump file

「今見つけたはてブに『db/schema_cache.dumpがあると、ロード時にDBへSHOW FULL FIELDS table_nameを発行しません』ってある」「あー、そういう使い方か!: 確かにそこは裏でめちゃ頻繁に実行されるから、そこがキャッシュされていれば速くなるかもね」

「Railsって何かにつけて動的にスキーマ情報を取ってくるから、目に見えて遅いとまではいかなくても内部で余分なSQLを発行しているのは確かだし: そしてこのスキーマ情報はキャッシュに乗るヤツなので、そういう余分な処理がなくなるならいいですね😋」「何でデフォルトでschema_cache.dump吐かないんだろう?🤔」「わかんないけど、ちゃんとclearしないと消せないからだったりして😆」「かもね😆: デフォルトで生成するとむしろ事故ったりとか」

queue_name_prefixdefault_queue_nameにも効くよう修正

# activejob/lib/active_job/queue_name.rb#L36
    included do
-     class_attribute :queue_name, instance_accessor: false, default: default_queue_name
+     class_attribute :queue_name, instance_accessor: false, default: -> { self.class.default_queue_name }
      class_attribute :queue_name_delimiter, instance_accessor: false, default: "_"
    end

つっつきボイス:「Active Jobの修正か」「あー、バグというよりは、どうして今までそうなってなかったのかという感じ」「Active Jobもだいぶキュー管理の仕組みが増えてきたようだ: Active Jobあんまり使ってないけどっ😆」

番外: ActiveSupportにString#truncate_bytesが追加

1年前のコミットですが、思わず目を惹かれました。

>> "hï".truncate_bytes(2, omission: nil)
=> "hi"

>> "💅🏾".truncate_bytes(5, omission: nil)
=> "💅"

>> "👩‍👩‍👧‍👦".truncate_bytes(18, omission: nil)
=> "👩‍👩‍👧"

>> "👩‍👩‍👧‍👦".truncate_bytes(12, omission: nil)
=> "👩‍👩"

>> "👩‍👩‍👧‍👦".truncate_bytes(8, omission: nil)
=> "👩‍"

つっつきボイス:「この4人家族になってる絵文字、そちらから見えます?」「見える見える」「いわゆるUnicodeの合字ですよね: 複数の文字をこうやって合体させて1つの文字にするヤツ」

参考: 合字 - Wikipedia
参考: Unicode「合字」使う企業は修正が必要に、日本マイクロソフトが新元号対応 | 日経 xTECH(クロステック)

「しかしこの18とか12が何なのかという」「omission:も謎い」「構造を知らないと使えなさそう…」「おー、まさにこうやってバイト単位で安全にtruncateするってことか↓」「omission:は省略文字の指定なのね」

# 同コミットより
  #   >> "🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪".size
  #   => 20
  #   >> "🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪".bytesize
  #   => 80
  #   >> "🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪🔪".truncate_bytes(20)
  #   => "🔪🔪🔪🔪…"

「わかんないけど、バイト単位で固定長にしないといけない事情があるときなんかに便利なのかも?🤔」「バイト単位でtruncateしたいニーズはいろいろあるはずですね」「あるいは、ものすごくたくさんの字を合体させてバッファオーバーフロー的な攻撃されたときに備えるとか」「そういえば前にそういう記事訳しました↓」

Unicodeで絶対知っておくべきセキュリティ5つの注意(翻訳)

truncate_bytes、セキュリティ周りで欲しくなりそうな趣」「これ、Ruby本体にも欲しいです😋」「確かにRubyに入ってもおかしくないかも😋」

Rails

Rails 6.0.0のマイルストーン

以下のツイートにあったGistで今頃知りました。


つっつきボイス:「実はさっきのtruncate_bytesはこのGitHubマイルストーンのClosedリストで見かけました: もっと早くマイルストーンに気付け自分😅」

「ところでRails 6.0.0のマイルストーンって、今そこに上がっている以外のものはもう足されないのかな?」「あー、どうなんだろう?🤔」「たぶん期限を切るためのマイルストーンだろうし、まだここに機能が足されるんじゃないかという気がするので、最終的な機能リストとは別のものと考える方がよさそう」「それもそうですね」「少なくともマイルストーンのリストにあるものは6.0.0に入れようという動きがあるのはわかるのでその意味では有用そう: あくまで『今の時点』のですが😎」

ダジャレつながりですが、Miles Davisの『Milestones』です↓。「マイルスの音(Miles Tones)」というアナグラムになってるんですね。

「6.0.0ってリリース日決まってるんでしたっけ?」「どうだったかな…?」「RailsはRC版が出た頃にリリース日が知らされるぐらいの感じですよね」「でも延びるという😆」「そういう印象ある😆」「マイルストーンに入っている機能は6.0に導入される可能性が高い、ぐらいに思っておこうかなー」

そういえば、昨日参加した東京Ruby忘年会 2018で、Rails 6は来年春頃のリリースだろうという話が聞こえてきました。

CircleCIでgemをキャッシュする(RubyFlowより)


つっつきボイス:「CIはgemをキャッシュしとかないとつらい😭」「こういう作業をちまちまやらないといけないし、でもたまにキャッシュが悪い方向に働いて詰んだりとかね😆」「😆」

「キャッシュは最初からやるよりは、遅いなと感じてからやるぐらいでいい気がするし、週に1度ぐらいはキャッシュなしでCI回しておかないと、後になってアプリを新規インストールしてみたら実は動かなくなってた、なんてことになりそうだし😭」

GitLabの中の人がRailsを使う理由

短めの読み物系記事です。


つっつきボイス:「GitHubがRailsを使っているから、だったりして🤣」「🤣」「そうだ、社内GitLabサーバーもそろそろアップグレードしなきゃ💦」

GitLab自社運用のための注意点とノウハウ(2018/06版)

プルリクがマージされるまでを分析


つっつきボイス:「いかにもCodeClimateが書きそうなプロジェクトの健康診断記事…と思ったら本当にCodeClimateの記事🎯」「短い記事なのでここにグラフは貼りませんが、プルリクが開かれるまでの時間が短ければ短いほど、マージされるまでの時間が短いんだそうです」「つまりなかなか開いてもらえないプルリクほどマージまでの時間が長いという😆」「プルリクの塩漬け😆」「CodeClimateは何年も前からこの辺を頑張ってますよね❤️」

その他Rails


techplay.jp/event/702297より


つっつきボイス:「Railsdmの定員が一瞬で埋まるということは、少なくとも都内にはRailsエンジニアが大勢いるんだなっていうことが伺えますね🤓」「YouTubeで配信されるならそっちで見ようかな📺: 一日がかりのイベント、長丁場が意外としんどいんだよねー😓」

「実は今度のRailsDMで、Railsチュートリアルでお馴染みのYassLabの安川さんと一緒に裏方をお手伝いすることになりました: 私はたぶん配信周りで」「おぉ、いいんじゃないすかね😋」


yasslab.jpより

Ruby

RubyがSnappyパッケージに登録された(Ruby公式ニュースより)


つっつきボイス:「お、Ubuntuでお馴染みのCANONICAL↓のサイトか」


canonical.comより

「Snappyって何だろうと思って: aptとかrpmみたいなパッケージ管理をディストリビューションを超えて使えるものみたいですね」「Portsとかも含めて、こういうのは昔からいっぱいありますね、たいてい流行らないけど🤣」「🤣」「それぞれ夢はあるんですけどね☺️」

参考: Snappy - Wikipedia
参考: Ports - Wikipedia

「そういえばMacのHomebrewも最近Linuxで使えるようになってたんじゃないかな: Linuxbrewとかいう名前で」「知らなかった!😳Homebrewと同じくソースコード配布でしょうか?」「もちろん😎: ユーザー権限でできるというのが利点」「へー!」


linuxbrew.shより

「aptはバイナリ配布ですよね?」「ですね: rpmはバイナリとソースと両方ですが、rpmはいろいろ難しいんだよなー😅: そういえば昔rpmパッケージを自分で作ったりしてたし」「へー😳」「ちなみにCheckInstallっていう昔ながらのツールを使うと、configure、make、make installでインストールできるソフトウェアなら自分でdebとかrpmとかのパッケージを作れます🤓差分を取ってくるとかも含めて」

参考: APT - Wikipedia
参考: RPM Package Manager - Wikipedia
参考: CheckInstall - Wikipedia

「とにかくCANONICALがやってるSnappyでRubyがパッケージになったと」「CANONICALって会社だったかな、団体だったかな、とにかくここがubuntuをやるようになってからちゃんとした感じになったような覚えがある」「サイトの証明書がGBだからイギリス🇬🇧なんですね」

RubyのOptionパターン

# 同記事より
Maybe("I'm a value").is_some? 
#=> true 
Maybe("I'm a value").is_none? 
#=> false 
Maybe(nil).is_some? 
#=> false 
Maybe(nil).is_none? 
#=> true

つっつきボイス:「そんなに新しい記事ではないんですが、関数型っぽいOptionパターンをRubyでやろうとしてるみたいで、記事の最後にも『他にも似たようなことやってる人いろいろいるけど、やってみた』と他のgemにもリンクしてますね」「何だかカリー化とかそういうのが好きそうな雰囲気😆」「なぬカリー化とな🍛(ざわっ)」

参考: カリー化 - Wikipedia

ES2015は「最初にPromiseを学べ」

一気にES2015とPromiseの話題に進みました。

「自分が今大学で教えている授業で、ES2015で初めてプログラミングに触れる人たちに最初に何を教えるべきかっていうのをいろいろやってるわけですよ」「ははぁー😳」「その結果、ES2015のPromiseは最初の段階で知っておいてもらわないとダメ、という結論に達した😆」「あーやっぱし😆」「でもすっごくわかりみ😆」

JavaScript: 5分でわかるPromiseの基礎(翻訳)

「なぜかというと、Promiseを知らないとAPIを叩けないから😆」「たしかにそう!」「fetch()してthen()できないし」「まコピペしてSuccessとかぐらいならできるかもしれないけどっ😆」

「それにsetTimeout()sleep()とかも、Promiseで使わせないとメインスレッドが固まったりとかいろいろつらいことが起きるし: よくわかっていないうちだからこそPromiseを使わせないと、と思った!」「もうわかりすぎる😆」「極端に言えば『わからなくなったら取りあえずPromise使え』ぐらいの勢いで🤣」「わからない状態でPromiseって使えるものなんでしょうか🤣」「🤣」

追記(2018/12/04)

上のsetTimeout()の件は、sleep()のつもりで話してた文脈で、よくある「ページを開いてN秒後にアニメーションをスタートし、アニメーションAが終わったら次のアニメーションB・・・」みたいな話のつもりで言ってました。うろ覚えってこわい。

むしろPromiseなしだとsetTimeout()使わないといけないやつでした。

「Promiseなら、たとえ使い方間違ってても取りあえずメインスレッドは固まらないし😆」「右も左も分からないうちにPromiseを刷り込むと」「『もうPromiseしかねーから』ぐらいの勢いで」「『API取るときはPromiseでこうやるんだよ』って😆」

「何つうか、初めてプログラミングを学ぶ人が、JavaScriptで、しかもPromiseで非同期やるってかなりハードル高そうですよね😆」「まあその段階では非同期を教えるのは目的じゃないし😆: でもたとえば、ダウンロード処理ひとつ書くにしても、ダウンロード自体が非同期だからシングルスレッドでやりようがないし」

「結局、Webプログラミング自体のハードルがもろもろ高いということでしょうね🏋🏻‍♀️」「今どきPromiseが使えないと本当にショボいものしか作れないし、学生の興味をそそるようなものを作れるカリキュラムにしようと思うと、そこが悩ましい🤔」(学生に出した課題のスライドを一同で見る)

「適当に作ったJSONを用意して、これを取ってみなさいという感じで学生にやってもらってる: ややこしくなるからcatch()とかまだ教えない🤣」

「初歩的ですけど、jQueryはそういう非同期処理みたいな部分ってカバーしてくれるんでしたっけ?」「基本しない😆」「最近は微妙にPromiseっぽい書き方が入ってきつつあったりして、しかも書き方がバージョンごとにちょろちょろ変わってたような印象」「昔のjQueryにはPromise的なものはなかったので、エラーハンドリングとかしようと思ったら自力で鬼ネストしないといけなかったし」

「そういえばjQueryには一応Deferredってのはありますね: Go言語にも似たようなのあるけど」「Goにdeferあるある!」「DeferredとPromiseの関係がよくわかってないという😅」

参考: jQuery Deferredまとめ - Qiita

「だからw、学生にはこうやってPromiseで書くんだよって最初から教えると😆」「最初からそう教える方がいい気がしてきた」「Promiseでfetch()してthen()さえできるようになれば、ほぼすべてのRead APIを叩けるようになりますからね😎」「理屈はもう後でいいと」「非同期とは何ぞやは今は考えないと」

「そうやって学生さんたちがGoogleのSheets APIとかそういうのを叩けるようにならないと、ほんとショボい静的サイトみたいなものしか作れないから」「仕事どころか趣味にもならないと」「満足感がまったく得られないし」(以下延々)


「そういえばさっきのOptionパターン記事ってちょっとPromiseっぽいなーと思ってついそこから話が飛んでしまった😆」「ところでこのmapの連続↓って😆」「実は最近こういう書き方が好き❤️」「めちゃ重くなりそうだけどー?」「きっと大丈夫😤」「ほんとに〜?😆GCとか走るんじゃ?」「それはイエスですっ😆」

# 同記事より
= Maybe(@current_user)
  .map { |user| user.profile }
  .map { |profile| profile.real_name }
  .map { |real_name| real_name.downcase }
  .or_else { "Real name unknown" }

その他Ruby




つっつきボイス:「RailsdmのPodcastがiTunes Music Storeに載ったそうです」「おーホントだ!」「iTunesのPodcastチャンネルって品揃えが残念な印象」「私はiTunes自体邪魔くさくてめっきり起動していないです」「iTunes Musicは使ってるからiTunesは普通に立ち上げるかなー」

Ruby trunkより

2038年以降のTime.localの挙動がおかしい

# 同issueより
irb(main):001:0> ENV['TZ']=nil
=> nil

irb(main):002:0> Time.local(2037,2,28,0,0,0,0)
=> 2037-02-28 00:00:00 +0900
irb(main):003:0> Time.local(2037,2,29,0,0,0,0)
=> 2037-03-01 00:00:00 +0900
irb(main):004:0> Time.local(2037,2,30,0,0,0,0)
=> 2037-03-02 00:00:00 +0900
irb(main):005:0> Time.local(2037,2,31,0,0,0,0)
=> 2037-03-03 00:00:00 +0900

irb(main):006:0> Time.local(2038,2,28,0,0,0,0)
=> 2038-02-28 00:00:00 +0900
irb(main):007:0> Time.local(2038,2,29,0,0,0,0)
=> 2038-03-01 00:00:00 +0900
irb(main):008:0> Time.local(2038,2,30,0,0,0,0)
=> 2038-02-28 00:00:00 +0900
irb(main):009:0> Time.local(2038,2,31,0,0,0,0)
=> 2038-03-01 00:00:00 +0900

つっつきボイス:「そろそろ2038年のことも考える時期なのか😳」「もう遠い先の話じゃないのかー」

参考: 2038年問題 - Wikipedia

「何も考えずに+30年とかやると死ねますよね😆: よくあるのが、証明書の期限を適当に100年先とかにしちゃうヤツ」「😆」「😆」

「で、上はタイムゾーンをnilにしたりするとおかしくなってるみたいだけど、そもそもそういう設定ってするものかしら😆」「しかしこの日時、まるでズレてるじゃないですか…」「2月31日とか画期的🤣」「うは🤣」「🤣」「『僕の夏休みぼくのなつやすみ』みたいな🤣」

「でもわかんないですよー、今後暦法が変わることが絶対ないとも言い切れないし😆」「ほら、明治時代に暦を切り替えたときに12月がすごく短くなっちゃった事件とかありましたよね」「そうそう、12/31に返すはずだった借金はチャラでいいよねとか解釈されて騒ぎになった↓🤣」「掛取り涙目🤣」

参考: 太陰太陽暦と歴史表記、乱暴な明治改暦

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

AWSの新サービスが続々


つっつきボイス:「AWSの新サービスがあまりに多すぎたのでざくっと絞り込みました😅」「そうそうAWS Summitいろいろ発表されてましたね: 次回の勉強会あたりでAWS Summitサーベイでもやってみようかな」「それやりましょう!」

FirecrackerはGitHub Trendingでも上昇していました。

あとこんなのも↓。

「そういえば衛星が借りられるようになったんですよね😆」「あーそれもあった😆」

「いろいろ出てたけど、超大物というよりは痒いところに手が届く感じのサービスが中心という感じかなー: AWS Transfer for SFTPとか『顧客が本当に欲しかったもの』感あるし😆」「まあWinSCP接続はちょっと前からS3に接続できるようになりましたけどね」

「AWS Transfer for SFTPはちょっと調べてみたけど、これは内部的にsshサーバーのインスタンスを立てるようになってますね」「おー!」「なのでインスタンス料金がかかります💰: そんなに高くないけど」「アクセス単位の課金とかじゃないんですね」「インスタンスを立てている間課金されることになる」

「AWS Transfer for SFTPは、その気になれば自分でもnanoのインスタンス立ててS3マウントしたりして同じようなものを作れちゃうけど、こうやってボタンぽちぽちでできるなら、たとえば顧客にAWSアカウントだけ取ってもらってこちらで作った手順書通りにやってもらえばSFTPが使えるということなので、その意味で顧客が本当に欲しかったもの感ありますね☺️」

「あと個人的に上の機械学習大学とやらが気になってます」「今更感というか、似たようなやつなら他にもいろいろあるんじゃ?」「それに、AWSのこの手のトレーニング・学習ツールって個人的にはまったく期待してない😆: いろいろ残念な水準」「マジで!?」「それって日本語の翻訳が?」「試験ツールとか問題文の翻訳がちょくちょく間違ってますしね」「ひえー😇」「英語はマシな方だったと思うけど」「やるなら英語の方にしとこうかな…」

「後は、DynamoDBがトランザクションをサポートしたのはさり気にデカイですね↓」

参考: 新機能 – DynamoDB Transactions | Amazon Web Services ブログ

ネットワーク依存関係グラフ


つっつきボイス:「こういうのは昔からWIDEとかでやってますね: プロバイダからデータをもらって解析したり」「ルーターのメーカーなんかもこういうのをやってて、実のところこの分野はネットワーク屋さんたちの方がビジュアル化とかも含めて圧倒的に先を行っていますね😎」「あれー、そんなに😳」「もちろん必要な研究なんですけどね: ちなみに自分が昔未踏プロジェクトでお手伝いしてたのもまさにこういう感じの研究🤓」

SQL

PostgreSQLでsequential UUIDを生成(Postgres Weeklyより)


つっつきボイス:「UUIDってシーケンシャルじゃないですよね?」「仕様的にもシーケンシャルじゃないはず」「あ、記事を見てみるとORDERをかけられるUUIDってことか」「連番じゃないけど順序は取れるというヤツですね」「sequentialって順序性があるっていうことだろうな」

「しかし単純に順序性を担保しようとすると生成時にロックして詰まっちゃいそう🤔」「ですね」「順序性があって、かつジャイアントロックが必要ないUUIDジェネレータが欲しいんだとしたらわかる」「それは欲しい」

「Googleはそれを、各リージョンに原子時計を置いて実現してますよね🕑」「あー、以前のウォッチでもその話出ましたね」「それぞれが原子時計を使うことで時刻同期をそもそも不要にする技術」「はーすげ~😳」「多数決方式も使ったり」「AWSもAuroraでそうやってマルチリージョンを実現してたと思う」

参考: Googleの最新データ分散技術が凄すぎる ―独自の原子時計を設置 | GGSOKU – ガジェット速報
参考: Amazon Time Sync Service で時間を維持する | Amazon Web Services ブログ

「多数決による決定は、分散コンピューティングの同期で昔からあるissueですね🧐」「規模が大きくなるほど同期が大変になりそう」「そもそも完全な同期というものは実現不可能なので😇」

RedisGraphのベンチマーク(Postgres Weeklyより)


同記事より


つっつきボイス:「Redislabsがいろいろベンチマーク取ってて、どれもRedisが勝ってるという😆」

その他SQL


つっつきボイス:「PostgreSQLの情報をリリースノートとかで見ると多すぎるので、こういうカンファレンス見物記事の方がまとまってて読みやすいかなと思いました」「この手のはまとめ記事で見るのがラクですね☺️」

JavaScript

mizchiさんのWebpack記事

以下のスライドへのレスです。


つっつきボイス:「あーこのスライド、自分も見てて何だかよくわからなかったし😇」「mizchiさんの記事見てちょっとホッとしたし☺️」

「今日の社内勉強会でも発表のあったParcel、mizchiさん記事に書いてあるこれ↓に尽きる😆」「『webpackを完全に理解した仙人』ってどんだけ😆」「結局Parcelが中で何やってるのかよくわからないし、かといってつらいWebpackを使うのもつらいし、結局どれを使ってもつらい😭」

(Parcelは)実際にはwebpackの慣習やお気持ちに深く精通して初めてparcelの挙動が理解できる
同記事より

parceljs.orgより

「何となくだけど、Webpackに踏み切れるかどうかって、browserifyを経験したかどうかが境目な気がする😆」「あー😆」「browserifyあまり使ってないしなー」


browserify.orgより

Node.jsでAmazon Alexa Skillsを構築してみた(Node Weeklyより)

// 同記事より
const Alexa = require("ask-sdk-core");
const Request = require("request-promise");
const SSMLBuilder = require("ssml-builder");
const { parseString } = require("xml2js");

const ErrorHandler = {
    canHandle(input) {
        return true;
    },
    handle(input) {
        return input.responseBuilder
            .speak("Sorry, I couldn't understand what you asked. Please try again.")
            .reprompt("Sorry, I couldn't understand what you asked. Please try again.")
            .getResponse();
    }
}

var skill;

exports.handler = async (event, context) => {
    if(!skill) {
        skill = Alexa.SkillBuilders.custom()
            .addRequestHandlers(
                // Handlers go here...
            )
            .addErrorHandlers(ErrorHandler)
            .create();
    }
    var response = await skill.invoke(event, context);
    return response;
};

つっつきボイス:「Alexa Skills Kitを知らなかったので: どうやらAlexaを調教するキットみたい」「社内のあそこの角にAlexa置いてるけどマイクがいつもoffだし」「通りすがりにこっそりonにしてやったら😆」「もの凄いものが到着したりして😆」「今のところ高級液晶時計としてしか使われてないAlexa😆」

参考: 何を開発できるか知る | Alexa Skills Kit | アレクサ

CSS/HTML/フロントエンド/テスト

2019年のWebデザイントレンド


つっつきボイス:「何となくでも眺めておけば心の準備ができるかなと」「どこまで本当に流行ってるのか謎だったりしますけどね😎」「Broken Grid Layout…だと?」「ノングリッドデザイン…😇」「また面倒そうなものが😅」「フロントデザイン2.0🤣🤣」「🤣🤣」「10年後はどうなってるのやら🤣」

「デザインは別に新しさがメインじゃないんだけどねー」

最近の何とかaaSを解説してみた


同記事より


つっつきボイス:「サーバー系の話か」「CaaSがContainer as a Service」「Functional as a Service」「最近はID as a Serviceなんてのもあるし」「へぇ〜😳」「もう名前付けちゃったもん勝ちですね☺️」「地上げ競争」

言語

漫画の自動翻訳サービス


つっつきボイス:「社内Slackでちょっと話題になったヤツですね」

その他

最近のGitHubの改修


つっつきボイス:「このRelease Only、地味にありがたい🙏」「確かにリポジトリを大量にウォッチしてるとダルかったし: 少なくとも自分の使ってるgemぐらいはウォッチしときたいし」

「force pushがバレる件」「さっきのRailsリポジトリにも出てますね」「やべーオイタしたところがバレちゃう」「これって過去のforce pushがすべてバレるってこと?」「それは今でもGitGitHubの履歴にはあるはずだから、それをわかりやすく表示したということでしょうね」「あー」「今後はmasterブランチにforce pushが表示されてたら、おやおや☺️という感じになりそうですね」

法とは


つっつきボイス:「これはkazzさん向けに☺️」「あれ?圏論の人かと思ってたけど?」「大学ではこっちでしたー😊」「そういえば『法』っていう数学用語、ものすごく検索しづらいです😭」「モッドだったかな」「数学方面は元がラテン語だったりするのが多いからさらにわかりにくかったりするし」

参考: 圏論 - Wikipedia
参考: moduloの意味・使い方|英辞郎 on the WEB:アルク

番外

可動部分がまったくないイオン駆動静音飛行機


つっつきボイス:「謎動力とかではない?😆」「オカルトではなさそう」

「次回はオープンつっつき会ですね」「お疲れさまでした〜」


今回は以上です。

バックナンバー(2018年度後半)

週刊Railsウォッチ(20181119)レビューでチェックされる非効率な書き方、Local Storageは使うなほか

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

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

Ruby 公式ニュース

Rails公式ニュース

RubyFlow

160928_1638_XvIP4h

Postgres Weekly

postgres_weekly_banner

DB Weekly

db_weekly_banner

Node Weekly

nodeweekly_captured

デザインも頼めるシステム開発会社をお探しなら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の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ