- Ruby / Rails関連
週刊Railsウォッチ(20181203)Railsのglobalidとは、AWS LambdaがRubyに対応、JSはPromiseを最初に学べほか
こんにちは、hachi8833です。この年で初めて親知らずを抜かなければなりません。セキュリティアップデートを当てたがらない人の気持が少しわかってきました。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
⚓お知らせ: 週刊Railsウォッチ: 公開つっつき会#5
12/6(木)の公開つっつき会、引き続きご応募をお待ちしております🙇。お気軽にどうぞ!
⚓臨時ニュース
⚓AWS LambdaがRubyに対応
Link: [速報]AWS LambdaがRubyに対応。さらにカスタムランタイムであらゆるプログラミング言語にも対応へ。AWS re:Invent 2018 - Publickey: https://t.co/INPAbNiq0L
— Yukihiro Matsumoto (@yukihiro_matz) November 29, 2018
つっつき会の翌日に知りました。カスタムランタイムにちょっとときめいてしまいました。
Lambda で Perl 動いたらそれもう CGI だしオッサンの時代が来る。
— mattn (@mattn_jp) November 30, 2018
⚓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ガイドのセキュリティ関連の記述が更新されました。
- 元記事: Amend CVE note and security guide section wordings by gmcgibbon · Pull Request #34392 · rails/rails
# 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を初めて知りました。
- リポジトリ: rails/globalid
「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するときに便利だったりするのかな🤔」「ふむむ、なるほど」「そうやって統一されていれば、サーバーからクライアントにキャッシュの破棄を指示するときにラクになるとか」「それはあるかも」「『現在のキャッシュのリスト』をクライアントとサーバーで共有したいときって、両者のフォーマットが揃っている方がちょっとうれしい感じじゃないですか😋: かつキャッシュの更新時刻もリストにあれば、クライアントのキャッシュの状態がサーバーからわからなくなったときにクライアントキャッシュのリストを全部スキップするなんてことをせずに、細かいキャッシュの制御をもう少し安全にやれるようになるのかな、なんてのを取りあえず思いついてみた😊」
おたより発掘
もともとActiveJobで、キューにジョブを入れる時に対象ARオブジェクトを指定する手段として導入したんじゃなかったかな。
— さく (@sakuro) December 4, 2018
⚓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:dump
とdb: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_prefix
がdefault_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したいニーズはいろいろあるはずですね」「あるいは、ものすごくたくさんの字を合体させてバッファオーバーフロー的な攻撃されたときに備えるとか」「そういえば前にそういう記事訳しました↓」
「truncate_bytes
、セキュリティ周りで欲しくなりそうな趣」「これ、Ruby本体にも欲しいです😋」「確かにRubyに入ってもおかしくないかも😋」
⚓Rails
⚓Rails 6.0.0のマイルストーン
以下のツイートにあったGistで今頃知りました。
#Rails 5.2 => 6.0 目前的重要變動https://t.co/GJjsoJLRmA
— Jerry Lee 🦀 (@wildjcrt) November 29, 2018
つっつきボイス:「実はさっきの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サーバーもそろそろアップグレードしなきゃ💦」
⚓プルリクがマージされるまでを分析
つっつきボイス:「いかにもCodeClimateが書きそうなプロジェクトの健康診断記事...と思ったら本当にCodeClimateの記事🎯」「短い記事なのでここにグラフは貼りませんが、プルリクが開かれるまでの時間が短ければ短いほど、マージされるまでの時間が短いんだそうです」「つまりなかなか開いてもらえないプルリクほどマージまでの時間が長いという😆」「プルリクの塩漬け😆」「CodeClimateは何年も前からこの辺を頑張ってますよね❤️」
⚓その他Rails
- 元記事: Hanami my personal return of experience(RubyFlowより)
-
イベント: Rails Developers Meetup 2018 Day 4 Nouvelle Vague|IT勉強会ならTECH PLAY[テックプレイ]
つっつきボイス:「Railsdmの定員が一瞬で埋まるということは、少なくとも都内にはRailsエンジニアが大勢いるんだなっていうことが伺えますね🤓」「YouTubeで配信されるならそっちで見ようかな📺: 一日がかりのイベント、長丁場が意外としんどいんだよねー😓」
「実は今度のRailsDMで、Railsチュートリアルでお馴染みのYassLabの安川さんと一緒に裏方をお手伝いすることになりました: 私はたぶん配信周りで」「おぉ、いいんじゃないすかね😋」
⚓Ruby
⚓RubyがSnappyパッケージに登録された(Ruby公式ニュースより)
- 元記事: The official ruby snap is available
- サイト: Install ruby for Linux using the Snap Store | Snapcraft
つっつきボイス:「お、Ubuntuでお馴染みのCANONICAL↓のサイトか」
「Snappyって何だろうと思って: aptとかrpmみたいなパッケージ管理をディストリビューションを超えて使えるものみたいですね」「Portsとかも含めて、こういうのは昔からいっぱいありますね、たいてい流行らないけど🤣」「🤣」「それぞれ夢はあるんですけどね☺️」
参考: Snappy - Wikipedia
参考: Ports - Wikipedia
「そういえばMacのHomebrewも最近Linuxで使えるようになってたんじゃないかな: Linuxbrewとかいう名前で」「知らなかった!😳Homebrewと同じくソースコード配布でしょうか?」「もちろん😎: ユーザー権限でできるというのが利点」「へー!」
「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は最初の段階で知っておいてもらわないとダメ、という結論に達した😆」「あーやっぱし😆」「でもすっごくわかりみ😆」
「なぜかというと、Promiseを知らないとAPIを叩けないから😆」「たしかにそう!」「fetch()
してthen()
できないし」「まコピペしてSuccessとかぐらいならできるかもしれないけどっ😆」
「それにsetTimeout()
sleep()
とかも、Promiseで使わせないとメインスレッドが固まったりとかいろいろつらいことが起きるし: よくわかっていないうちだからこそPromiseを使わせないと、と思った!」「もうわかりすぎる😆」「極端に言えば『わからなくなったら取りあえずPromise使え』ぐらいの勢いで🤣」「わからない状態でPromiseって使えるものなんでしょうか🤣」「🤣」
「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 - Rails Developers Meetup - Railsdm Podcast - https://t.co/QtEyM1cTBF #iTunes https://t.co/hNrrDTPW2w
— 🇸🇬 (@yoshi_hirano) November 29, 2018
つっつきボイス:「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年のことも考える時期なのか😳」「もう遠い先の話じゃないのかー」
「何も考えずに+30年とかやると死ねますよね😆: よくあるのが、証明書の期限を適当に100年先とかにしちゃうヤツ」「😆」「😆」
「で、上はタイムゾーンをnil
にしたりするとおかしくなってるみたいだけど、そもそもそういう設定ってするものかしら😆」「しかしこの日時、まるでズレてるじゃないですか...」「2月31日とか画期的🤣」「うは🤣」「🤣」「『僕の夏休みぼくのなつやすみ』みたいな🤣」
「でもわかんないですよー、今後暦法が変わることが絶対ないとも言い切れないし😆」「ほら、明治時代に暦を切り替えたときに12月がすごく短くなっちゃった事件とかありましたよね」「そうそう、12/31に返すはずだった借金はチャラでいいよねとか解釈されて騒ぎになった↓🤣」「掛取り涙目🤣」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓AWSの新サービスが続々
- 元記事: The best way to learn Docker for Free: Play-With-Docker (PWD) - Docker Blog
- 元記事: [速報]AWS、独自のセキュアなコンテナ実行用マイクロVM「Firecracker」、オープンソースで公開。AWS re:Invent 2018 - Publickey
- 元記事: [速報]AWS Transfer for SFTP発表、Amazon S3へファイル転送するマネージドなSFTP。AWS re:Invent 2018 - Publickey
- 元記事: [速報] AWS DataSync発表。オンプレミスとクラウド間で高速なデータ同期を実現。AWS re:Invent 2018 - Publickey
- 元記事: Amazon、AWSでのオンライン「機械学習大学」を無料で開講 - ITmedia NEWS
つっつきボイス:「AWSの新サービスがあまりに多すぎたのでざくっと絞り込みました😅」「そうそうAWS Summitいろいろ発表されてましたね: 次回の勉強会あたりでAWS Summitサーベイでもやってみようかな」「それやりましょう!」
FirecrackerはGitHub Trendingでも上昇していました。
- サイト: Firecracker
- リポジトリ: firecracker-microvm/firecracker
あとこんなのも↓。
「そういえば衛星が借りられるようになったんですよね😆」「あーそれもあった😆」
「いろいろ出てたけど、超大物というよりは痒いところに手が届く感じのサービスが中心という感じかなー: AWS Transfer for SFTPとか『顧客が本当に欲しかったもの』感あるし😆」「まあWinSCP接続はちょっと前からS3に接続できるようになりましたけどね」
おめがってる!!
社会の闇を体験してみたよ꒰*´꒳`*꒱👇動画はこちら👇https://t.co/phpq8Dj8bn#おめシス #ボドゲ #顧客が本当に必要だったもの pic.twitter.com/XdwJDGOqym
— おめがレイ@バーチャル双子YouTuber (@omesis_ray) October 1, 2018
「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
- 元記事: Five Cool Things I Learned at the PostgreSQL Conference Europe 2018 | Severalnines(Postgres Weeklyより)
つっつきボイス:「PostgreSQLの情報をリリースノートとかで見ると多すぎるので、こういうカンファレンス見物記事の方がまとまってて読みやすいかなと思いました」「この手のはまとめ記事で見るのがラクですね☺️」
⚓JavaScript
⚓mizchiさんのWebpack記事
以下のスライドへのレスです。
つっつきボイス:「あーこのスライド、自分も見てて何だかよくわからなかったし😇」「mizchiさんの記事見てちょっとホッとしたし☺️」
「今日の社内勉強会でも発表のあったParcel、mizchiさん記事に書いてあるこれ↓に尽きる😆」「『webpackを完全に理解した仙人』ってどんだけ😆」「結局Parcelが中で何やってるのかよくわからないし、かといってつらいWebpackを使うのもつらいし、結局どれを使ってもつらい😭」
(Parcelは)実際にはwebpackの慣習やお気持ちに深く精通して初めてparcelの挙動が理解できる
同記事より
parceljs.orgより
「何となくだけど、Webpackに踏み切れるかどうかって、browserifyを経験したかどうかが境目な気がする😆」「あー😆」「browserifyあまり使ってないしなー」
⚓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の改修
GitHub のリポジトリ subscribe に Release Only というのが増えた。issue の watch はしたくないけど Release だけは知りたい場合には便利そう。 pic.twitter.com/R1CPdWmu1t
— mattn (@mattn_jp) November 27, 2018
GitHubでforce pushしたのが表示されるようになってforce pushしまくってるのがバレるようになってしまった恥ずかしいforce push履歴もってるの言っといてほしかった
— Ryuta Kamizono (@kamipo) November 24, 2018
つっつきボイス:「このRelease Only、地味にありがたい🙏」「確かにリポジトリを大量にウォッチしてるとダルかったし: 少なくとも自分の使ってるgemぐらいはウォッチしときたいし」
「force pushがバレる件」「さっきのRailsリポジトリにも出てますね」「やべーオイタしたところがバレちゃう」「これって過去のforce pushがすべてバレるってこと?」「それは今でもGitGitHubの履歴にはあるはずだから、それをわかりやすく表示したということでしょうね」「あー」「今後はmasterブランチにforce pushが表示されてたら、おやおや☺️という感じになりそうですね」
⚓法とは
今日息子が持って帰ってきた「円を十等分し、九九の一桁目の点をつなげ」という宿題、面白い。これ、10を法とする剰余類になっている。10と互いに素な奴はすべての点を巡る。また、1と9、2と8といった、「足して10になるペア」は同じ形になる。5は自己共役ですね。 pic.twitter.com/xOrF5I22jI
— ロボ太 (@kaityo256) November 22, 2018
つっつきボイス:「これはkazzさん向けに☺️」「あれ?圏論の人かと思ってたけど?」「大学ではこっちでしたー😊」「そういえば『法』っていう数学用語、ものすごく検索しづらいです😭」「モッドだったかな」「数学方面は元がラテン語だったりするのが多いからさらにわかりにくかったりするし」
参考: 圏論 - Wikipedia
参考: moduloの意味・使い方|英辞郎 on the WEB:アルク
⚓番外
⚓可動部分がまったくないイオン駆動静音飛行機
つっつきボイス:「謎動力とかではない?😆」「オカルトではなさそう」
「次回はオープンつっつき会ですね」「お疲れさまでした〜」
今回は以上です。
バックナンバー(2018年度後半)
週刊Railsウォッチ(20181119)レビューでチェックされる非効率な書き方、Local Storageは使うなほか
- 20181112 Ruby 2.6.0-preview3リリース、非同期スレッドのテストはつらい、MySQL 8のGROUP BYほか
- 20181105 DBマイグレーション9つのコツとハマった話、Railsのモデルとディレクトリの設計ほか
- 20181029 特集『肥大化したActiveRecordリファクタリング7つの方法』今ならどうなる?Redis 5のストリーム機能ほか
- 20181022 Railsの名前空間地獄とrequire_dependency、PostgreSQL 11がリリース、clean-rails.orgほか
- 20181015 Rails初心者と一発でバレる書き方、次のVue.js構想、RubyのOpenStruct、Twilioほか
- 20181001 Railsアップグレード記事と各種支援ツール、CLI向けRubyワンライナー集、Rubyアプリをワンバイナリ化ほか
- 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など)です。
上の
setTimeout()
の件は、sleep()
のつもりで話してた文脈で、よくある「ページを開いてN秒後にアニメーションをスタートし、アニメーションAが終わったら次のアニメーションB・・・」みたいな話のつもりで言ってました。うろ覚えってこわい。むしろPromiseなしだと
setTimeout()
使わないといけないやつでした。