あけましておめでとうございます。hachi8833です。今回のつっつきは年末に行われました。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
狙ったわけではありませんが日本語記事が多めになりました。英語techニュース系サイトも年末ムードでまとめ記事が多そうです。
⚓新年: 週刊Railsウォッチ「公開つっつき会#6」開催のお知らせ
次回の新春公開つっつき会は1/10(木)に開催いたします。引き続きご応募をお待ちしております🙇。
⚓Rails: 先週の改修(Rails公式ニュースより)
今回はコミットリストから見繕いました。
⚓Action Mailboxのコミットが導入
- PR: Import Action Mailbox by georgeclaghorn · Pull Request #34786 · rails/rails
- PR: Follow up 34786 by bogdanvlviv · Pull Request #34801 · rails/rails -- 続き
9月のDHHコミットがずらっと並んでいてギョッとしましたが、これだったんですね。
つっつきボイス:「Action Mailboxは先週話題にのぼったRails 6の新機能ですね」「今週のコミットの大半はAction Mailboxでうずまってる感じでした」「コミット212件とかスゲー😆」「丁寧に追えばDHHがどんなふうにコードを書いているかわかりそうですね」「Basecamp社内でドッグフードしてたのがどどっとやってきた感じ」「デカすぎて全貌は追いきれない😅」
「amとかacとか何かと思ったらActive ModelとかAction Cableとかか↓」「さすがにここまで略されると意味不明ですね😅」「asがActive Supportとかヤバい😆: こういうのが直ったのはうれしいし、フルネームで書くのがダルかった気持ちもわかる」
# .travis.yml#L58
matrix:
- - "GEM=ap,ac"
- - "GEM=am,amo,as,av,aj,ast"
- - "GEM=as PRESERVE_TIMEZONES=1"
- - "GEM=ar:sqlite3"
+ - "GEM=actionpack,actioncable"
+ - "GEM=actionmailer,activemodel,activesupport,actionview,activejob,activestorage,actionmailbox"
+ - "GEM=activesupport PRESERVE_TIMEZONES=1"
+ - "GEM=activerecord:sqlite3"
+ - "GEM=guides"
- - "GEM=ac:integration"
+ - "GEM=actioncable:integration"
「コンポーネントがひとつガツンと入った感じか: ビューまであるし、ちゃんと見ないとわからないけど、もしかするとAction Mailboxはマウンタブルエンジンとして導入されたのかな?」「不要だったらオフにできるといいですね」「Railsの他のコンポーネントにもオフにできるものがあるし、できるんじゃないかなー🤔」
⚓フォームビルダーのAPIドキュメントを追加
# actionview/lib/action_view/helpers/form_helper.rb#L1683
##
# :method: text_field
#
# :call-seq: text_field(method, options = {})
#
# Wraps ActionView::Helpers::FormHelper#text_field for form builders:
#
# <%= form_with model: @user do |f| %>
# <%= f.text_field :name %>
# <% end %>
#
# Please refer to the documentation of the base helper for details.
...
つっつきボイス:「これはy-yagiさんのコミットで、今のままだとAPI Docがなくて不便だから追加したということみたいです」「ドキュメントが自動生成される?」「でしょうね: これはRailsガイド向けかな?API向けかな?: 見た感じYardでもRDocでもないように見える🤔」「そういえば独自っぽい」「そういえばRailsガイドにAPI Docの書き方が載っていた覚えが↓」「実際のAPI Docとはまた別っぽいしなー」
参考: API ドキュメント作成ガイドライン | Rails ガイド
⚓ルーティングテストからFacebook認証を削除
# actionpack/test/controller/routing_test.rb#L
def test_route_with_regexp_for_action
rs.draw { ActiveSupport::Deprecation.silence { get "/:controller/:action", action: /auth[-|_].+/ } }
assert_equal({ action: "auth_google", controller: "content" }, rs.recognize_path("/content/auth_google"))
- assert_equal({ action: "auth-facebook", controller: "content" }, rs.recognize_path("/content/auth-facebook"))
+ assert_equal({ action: "auth-twitter", controller: "content" }, rs.recognize_path("/content/auth-twitter"))
assert_equal "/content/auth_google", url_for(rs, controller: "content", action: "auth_google")
- assert_equal "/content/auth-facebook", url_for(rs, controller: "content", action: "auth-facebook")
+ assert_equal "/content/auth-twitter", url_for(rs, controller: "content", action: "auth-twitter")
end
つっつきボイス:「Facebook-freeっていうからぱっと見Facebookがキライなのかと思った😆」「Twitterならいいのかと🤣」「珍しくサムダウン👎がある」「ポリティカルコレクト云々というより宗教的な話っぽい雰囲気?: Facebookってアカウントがないと見ることもテストもできないから、それを敬遠してるんじゃないかしら」「ぶっちゃけ積極的な意味はないし自分的にはどうでもいいし😆: サムダウンも『本質的でないコミットは入れるな』的なものなのかも」
参考: Become A Facebook-Free Business – Signal v. Noise
- 私たちはFacebook/Messenger/Instagram/WhatsAppの広告を購入しません。
- 私たちはFacebook/Messenger/Instagram/WhatsAppで宣伝もしくはビジネス活動もしくは顧客とのやりとりを行いません。
- 私たちはFacebookのいいねボタンやFacebookログインの提供を介してFacebookのデータ収集体制を支援することはしません。
同ブログより
直接関係ありませんが、smoking-freeが「喫煙自由」と誤訳されるのは定番ですね。
参考: 毎日Eトレ!【145】知らないと危険! Smoking Freeは喫煙してもいい?
⚓Rails 6で必須になるRuby 2.5のFrozenError
に対応
- PR: No need to handle if FrozenError is available by yahonda · Pull Request #34778 · rails/rails
- PR: Handle `FrozenError` if it is available by yahonda · Pull Request #31520 · rails/rails -- 昨年の関連コミット
# activerecord/test/cases/aggregations_test.rb#L28
def test_immutable_value_objects
customers(:david).balance = Money.new(100)
- assert_raise(frozen_error_class) { customers(:david).balance.instance_eval { @amount = 20 } }
+ assert_raise(FrozenError) { customers(:david).balance.instance_eval { @amount = 20 } }
end
つっつきボイス:「なるほど、ビルトインのFrozenError
が使えるようになったからそっちに変えようという話」「上の2つ目の古いコミットはfrozen_error_class
が一時的に導入されたときのですね」「バージョン互換のために独自のfrozen_error_class
を使っていたのね」
参考: class FrozenError
(Ruby 2.6.0)
Object#freezeされたオブジェクトを変更しようとした時に発生します。
docs.ruby-lang.orgより
⚓不要なメソッドを削除
# actionpack/test/controller/rescue_test.rb#L65
- rescue_from ActionView::TemplateError do
- render plain: "action_view templater error"
- end
- rescue_from IOError do
- render plain: "io error"
- end
つっつきボイス:「これもy-yagiさんの年末大掃除っぽいコミット」「b00m
とか謎すぎるメソッド名」「何だろね😆テストコードの消し忘れっぽいけど」「GitHubで追えるかな...GitHubではコミットidで検索できなかったorz」「全部のコミットidをチェックアウトできるようにするとめちゃ重くなりそうではあるけど: でもGitLabだとできた気がするなー」(つっつきの合間にいろいろ試した結果)「うまく見つからん😢」「とりあえず次いきましょー」
# actionpack/test/controller/rescue_test.rb#L354
def b00m
raise "b00m"
end
GitLabだとできるようです↓。
⚓roleがない場合のエラーをわかりやすく改善
# activerecord/lib/active_record/connection_handling.rb#L160
def with_handler(handler_key, &blk) # :nodoc:
+ unless ActiveRecord::Base.connection_handlers.keys.include?(handler_key)
+ raise ArgumentError, "The #{handler_key} role does not exist. Add it by establishing a connection with `connects_to` or use an existing role (#{ActiveRecord::Base.connection_handlers.keys.join(", ")})."
+ end
handler = lookup_connection_handler(handler_key)
swap_connection_handler(handler, &blk)
end
つっつきボイス:「roleの話なのでこれもマルチDBがらみっぽいですね」「そういえば前は標準エラーで済ませてたような気がする」「connected_to
のインターフェイスはどうやら今の感じで落ち着くのかな?」
# activerecord/test/cases/connection_adapters/connection_handlers_multi_db_test.rb#L332
+ def test_calling_connected_to_on_a_non_existent_handler_raises
+ error = assert_raises ArgumentError do
+ ActiveRecord::Base.connected_to(role: :reading) do
+ yield
+ end
+ end
+ assert_equal "The reading role does not exist. Add it by establishing a connection with `connects_to` or use an existing role (writing).", error.message
+ end
+ end
⚓Rails
⚓Railsのパフォーマンス改善Tips集(Ruby Weeklyより)
つっつきボイス:「パフォーマンスの話をするときにちゃんと測定の話から始めているのはいいな」「ビューのフラグメントキャッシュ、DBのカウンタキャッシュ、HTTPのetagとlast_modifiedと」「このetagって何でしたっけ?」「これはHTTPのレスポンスに付けられるetagで、リクエストにこのetagを含めて送信してetagが変わっていなければレスポンスを全部返さなくてもよくなるWebの標準機能😎」「そうでしたか😅」
ETag: "686897696a7c876b7e"
Wikipediaより
「ActiveStorageを使うとパフォーマンスがよくなるというのはまた別の話の気がするけどなー?」
「HTTP/2を使えというのは納得」
「HTTP/2をCDNで使うのは不便という話: そもそもCDNってあんまりHTTP/2に対応していなかった気がするし、今のCDNでHTTP/2を使うと逆に遅くなるんじゃなかったかなー🤔」「おー?」「おそらくですが、今のインターネットではHTTP/2のように1つのTCPセッションですべてをやりとりするより、従来のように複数のTCPセッションを開く方が帯域を広く取れる気がする」「ふむう」
「Brotliって初めて見るけど何だろう?」「Gzip vsとあるから圧縮アルゴリズムか↓」「発音わからない😅」
「へー、Brotliって最近のブラウザで使えるのか↓: まあGzipがいにしえの圧縮アルゴリズムだし😆、新しい方がいいのかも」
Brötliは「パン」「(ハンバーガーの)バンズ」のことみたいです。
参考: Spanisch Brötli - Wikipedia
「Heroku vs Bare Metalはそのとおりで、Herokuを大規模案件で使うとめっちゃハマるし☺️☺️」「やっぱりー」「記事にもあるけど、Herokuはさくっとサービスを立ち上げるにはいいけど、パフォーマンス面ではよい選択肢とは言えない: おっしゃるとおり」「この間のRailsdmでもそんな話があった気がしました」
「やる前から十分予測できることなのに、ハイパフォーマンスを要求する案件にHerokuを使うというのは、正直インフラの見通しが甘いと言わざるを得ない🧐」「Herokuで最大に課金して操縦桿をめいいっぱい引いてもダメですか?」「もう全然足りないですね😇: そのためにもシステム構築の段階でインフラエンジニアに参加してもらうべきだし、その費用をケチると後々泣きを見ます」「でしょうね😅」
「Resource Hints: prefetch
って最近見かける」「prerender
とかpreconnect
なんてのもあるのか!」「ブラウザによってサポートまちまち...」「Resource Hintsを使うとしたら、もうミリ秒単位で速度を追求するときでしょうね」
<link rel="prefetch" href="(url)">
<link rel="prerender" href="(url)">
<link rel="preconnect" href="https://example-domain.com/">
参考: Resource Hints: prefetch
参考: Resource Hints: prerender
参考: Resource Hints preconnect
「記事は下の方に行くほど改善幅が小さくなるっぽい」「その分下の方にいくほど機能も新しい感じですね😋」
⚓SSRFとは
つっつきボイス:「徳丸先生の記事です」「Server Side Request ForgeryがSSRFか: CSRFになぞらえた感じの命名」
参考: クロスサイトリクエストフォージェリ - Wikipedia
参考: サイボウズ脆弱性報奨金制度で認定されたSSRF
「SSRFはおそらく概念としては前からある感じなんだろうけど...あーなるほど、これはもうおっしゃるとおりとしか」「というと?」
ここまで説明したように、任意のURLを対象とする処理はSSRF攻撃を受けやすく、また完全な対策は難しいのが現状です。
言い換えれば、「完全な対策が難しい」からこそ、今SSRFが注目されているとも言えます。
そもそも任意URLを受け取る処理が必要かどうかという仕様面の検討をした上で、実装の際にはできるだけ安全側に倒した処理と、アプリケーションとネットワークの両面からの対策を推奨します。
blog.tokumaru.orgより
「EC2には、URLを使って自分のインスタンスの情報(インスタンスメタデータ)を取れるという機能があるんですが、ここで例に使っているはてなブックマークみたいに、任意のURLを受け取ってそのコンテンツを取り出すサービスなんかだとこうやってEC2のメタデータを取ることができてしまう↓」「どっひゃー😱」
「メタデータを抜かれてどのぐらいヤバいかだけど...起動の変数とかcredentialとか抜かれたらエグいな😇」「ですね😢」「これは知らないと防げない脆弱性: そしてインスタンスメタデータを取れるというのは、どちらかというとAWSの知識」
「対策といってもURLの検証で完全にカバーするのは難しいしなー: 実際記事にも書いてあるし、URLの検証は結構奥が深い」「ネットワーク的な保護も有効です、とあるけど今度はプロビジョニングで詰まることもありそうだし、痛し痒し😅」「何らかのバリデーションは必要そう」
「これは確かに知っておくべき脆弱性👍」「対策は大変なんでしょうか?」「わかってしまえば対策そのものは大したことはないですね: 知っておかないとハマるヤツ」「なるほど!」
⚓Yuguiさんが解説するソフトウェアの設計手法
つっつきボイス:「お、これははてブで上がってたgrpc-gateway記事」「RubyやRailsと直接つながっているわけではありませんが、設計の参考になりそうに思えたので」
- リポジトリ: grpc-ecosystem/grpc-gateway
意図せざる技術的負債は厄介の種ですが、返済計画を立てた上で負債を選択すれば初期のアイディア検証段階にかけるコストを抑えられます。
同記事より
「技術的負債も薄い層でやってる分には問題ないだろうし、今後いつ問題になるかという見通しがちゃんと立っていれば、返済計画を立てて負債を選ぶというのはいいと思いますね」「ふむふむ」「アプリ側のインターフェイスでgrpcも使いたいしRESTも使いたいしJWTも使いたいみたいなことになってきたら、それぞれで薄いミドルウェアを実装するよりもこうやって間にgatewayをはさんで全部やらせる方に切り替えるというアプローチは、実装の手間をトータルで減らす方法としては悪くないと思います🧐」「なるほど!」「もちろん集中によるリスクも考慮したうえで、ね」
⚓その他Rails
論理DHH氏〜〜!すごいイベントになってきた。運営の皆さまには頭が上がらない🙏🙏 https://t.co/kGYrMY5kuk
— yasaichi (@_yasaichi) December 24, 2018
つっつきボイス:「論理DHH氏って一瞬そういうハンドル名の人がいるのかなと考えちゃいましたが、次回のRailsdmにDHHがリモートで質問に答えるということでした☺️: amatsudaさんが通訳で」「この通訳はRailsをわかっている人でないと務まらなさそう☺️」「試験的にで構わないから、リアルタイム英語字幕サービスを使ってくれたらうれしい」「あれ、このタイムテーブルだとDHHの時間が5分しかないことにw」「ホントだ🤣」(注: その後修正されています)
参考: UDトーク | コミュニケーション支援・会話の見える化アプリ
「そして秒速さんと神速さんが横に並んでるの図↓😆」「それでk0kubunさんがこのツイートを↓😆」
神速さんと秒速さんとrailsdmの発表枠被ってると僕も何速かにならなければいけない気持ちになる
— k0kubun (@k0kubun) December 24, 2018
- リポジトリ: wodby/docker4ruby(Hacklinesより)
⚓Ruby
⚓ko1さんとmameさんによるRuby 2.6解説
つっつきボイス:「これこれ、さすがコミッター🎊」「これで言い尽くされてる本命感」「Rubyはこういうコアな情報が日本語で出てくるのがいいっすね~😋」「ホントホント」「😋」「英語苦手な人にも読んでもらえるし」「このお作法も初めて知りました↓」
完全に余談ですが、Unicode の大文字・小文字の話題になると、「Dz」という字の話をするのがお作法です。これは D と z の 2 文字ではなく、D と z が合体した 1 つの文字です。こういう文字を、digraph、二重音字と言います。この文字には、大文字・小文字に加え、タイトルケース(先頭の文字だけが大文字)の 3 種類があります。
同記事より
「そういえば2.6.に入れたけどやっぱり外す方がいいかな〜みたいなmameさんのツイートをさっき見た気がする」「どれどれ」「あったあった🎯↓」「2.6と3.0のポリフィルが意図せぬ破壊的変更にー😢」「こんなコードはたぶん書かないけどっ😆」
なるほど。確かに失敗だったかも。
— Yukihiro Matz (@yukihiro_matz) December 26, 2018
そうですね。どこかで相談しましょう。
— Yukihiro Matz (@yukihiro_matz) December 26, 2018
⚓Rubyの演算子優先順位でやんちゃする
つっつきボイス:「動物イラストと関数型言語大好きのBrandon Weaverさんの記事ですが、&
がProc coercion operatorと呼ばれているって初めて知ったので」「マジですか!😳」「proc化する演算子だからわかるけど」
そういえば技術用語じゃないcoercionは基本的にネガティブな意味ですね。
{名-1} : 強制、無理強い
{名-2} : 抑圧、支配
{名-3} : 強制力、支配力
「名前あったんだー」「Rubyでは一応こういうものにはひととおり名前は付いているはずですが、検索しにくいという😆」「ホントホント」「Rubyを知った頃、&
でprocになるのって直感的でないなーって思った」「ホントホント」「慣れるまでは」
# 同記事より
[1, 2, 3].select(&:even?)
「それにしてもRubyはなぜ&
でprocになるのかと😆」「ましてや&:シンボル
という合わせ技になると余計考えちゃった」「そもそものselect
はブロックを取るメソッドだからまあいいとしてもー」「きっと当時空いてた記号を使ったんではないかと🤣」「🤣」
「もしやメソッド定義のブロック引数&
が起源なんじゃ?」「そんな気がする!😤」「にしても&:
の後ろがシンボルでないといけないし」「しかもこの&:
の組み合わせに呼び名がないし(ないよね?)」「&
と:シンボル
を組み合わせたときだけこういう挙動になるというのがまた直感的でないし😅」「🤣」「🤣」「さすがにもう慣れたけど☺️、特に他の言語からRubyにやってきた人が最初にギョッとしそう」「でも慣れると便利なショートハンド」「それは確か」
「ただこのショートハンドは書くのは楽だけど、中ではprocが動いてるので、そこは意識しておかないといけない」「そうっそうっ😤」「&:なんちゃら
をメソッドチェインしてさらに&:なんちゃら
とかやるとprocオブジェクトが大量に発生するするので、コードレビューでも気をつけてないといかんヤツ😅」
「procは速度的にも不利だし」「何と比べて遅いんでしょうか?」「もうprocするだけで何やっても遅い🐢」「上のコードはselect!
じゃないからselect
でprocオブジェクトを作るコストは確かに無駄: でもねー、こうやって書けるとキレイキレイって個人的に思っちゃう❤️」「ちょっとわかるー: チェインしなければ気持ちイイ!」
「表記はこんなにシンプルなのに、予想を超えて重いのが&:シンボル
」「めちゃくちゃデカいarrayに対して使うと詰んだり、ね☺️」「詰む詰む😅」「Integerのarrayなのに何でこんなに遅いんだ?みたいな」
「そしておなじみ、↓シンボルなしの&
渡し」「こっちはlambda作って渡すヤツ」「あんま使わないけど🤣」「カリー化星人にはなくてはならないヤツか🍛」「デバッグのときによくRailsコンソールでこれ使ってるのー🥰: ただproductionではやりすぎ感あるけど」「たしかに: 例外が起こったときにほぼ読めなくなるし😅」「その場で生成された一時オブジェクトの例外になるから、デバッガーシンボルに名前がついてないみたいな状態になっちゃう😭」「みんな名無しさんに🤡」「メソッドチェーンって基本デバッグがやりづらくなる😅」
# 同記事より
[1, 2, 3].map(&do_both)
=> [6, 11, 16]
「Mfって何だ?」「Modifier Function?!」「どことなく数学用語の匂い」
# scalaの書き方
List(1, 2, 3).map(_ + 5)
「Rubyだとたしかこの_
、直前に評価された結果が入るんじゃなかったっけ?」「そんな$
で始まる特殊変数みたいな微妙なものが?」「その_
は絶対使わないという宣言とかじゃなくて?」「Rubyにもそういうのがあるんだったかなー?🤔」
「Stackoverflowにこんなのあったし↓」「ひえぇ🤪」「簡単にアクセスできない呼び出し元にこうやってサクッとアクセスできるという感じかな」「JavaScriptにもこんなのがあった気が😅」「仕事のコードでは書いて欲しくない😅」
参考: ruby - Where and how is the _ (underscore) variable specified? - Stack Overflow
lambda { |x, x| 42 } # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42) # => 43
lambda { |_, _| _ }.call(4, 2) # 1.8.7: => 2
# 1.9.3: => 4
_ = 42
_ * 100 # => 4200
_, _ = 4, 2; _ # => 2
「で、さっきのproc coercionの&:even?
↓って、&
と:
のどっちが先に結合するんだろうか?」「ここはASTを調べてみるか」
[1, 2, 3].select(&:even?)
(require 'ripper'して
)「&:even?
は:args_add_block
と:symbol_literal
だから&
はやっぱりブロックか」「ということは...スペース入りの& :even?
とやってもASTがまったく同じだっ↓🥶」「ホントだ」「やべー」「やべー」
irb(main):007:0> Ripper.sexp('[1, 2, 3].select(&:even?)')
=> [:program, [[:method_add_arg, [:call, [:array, [[:@int, "1", [1, 1]], [:@int, "2", [1, 4]], [:@int, "3", [1, 7]]]], :".", [:@ident, "select", [1, 10]]], [:arg_paren, [:args_add_block, [], [:symbol_literal, [:symbol, [:@ident, "even?", [1, 19]]]]]]]]]
irb(main):008:0> Ripper.sexp('[1, 2, 3].select(& :even?)')
=> [:program, [[:method_add_arg, [:call, [:array, [[:@int, "1", [1, 1]], [:@int, "2", [1, 4]], [:@int, "3", [1, 7]]]], :".", [:@ident, "select", [1, 10]]], [:arg_paren, [:args_add_block, [], [:symbol_literal, [:symbol, [:@ident, "even?", [1, 20]]]]]]]]]
irb(main):009:0>
「まあこうやってASTをチェックすればわかるというのがいいところ😋」「あーびっくりした」
⚓Pryでコピペしたい
つっつきボイス:「この辺は.pryrcで割とどうにかなりそう」「この人はtmuxのコンフィグも使ってますね」
⚓Ruby trunkより
⚓Date.parse('2018')
がエラーになるなんて
つっつきボイス:「Date.parse('2018')
と書いたらそうなりそうだし」「'2018'
ってDateじゃないし😆」「ヨーロッパのdd.mm.yyyy形式とかその辺が絡んでるっぽい」「1.1.のどっちが月でどっちが日かとか😢」
「むしろissueで参照されている以下の動画↓が気になりました」「コードもスライドもなしでタイムゾーンを10分間熱く語ってるっぽい」「動画じゃなくていいんじゃね?😆」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓EKSが東京リージョンに
つっつきボイス:「そうそう、EKS来ましたね」「KはKubernetesなんですね」「そう、AWSのマネージドクバネテ⚓」
「AWSのECSはあくまでクローズドなサービスだけど、EKSはKubernetesなので、EKSで動けばGoogleの同種のサービスであるGKEでも原理的には動く、はず🙃」「おー」「厳密にはロードバランサーとかの仕様が違いますが、Kubernetesのレイヤは同じはずなので」「AWSにEKS、GoogleにGKEができたことでロックインされずにやれそうなのはうれしい😋」
⚓その他インフラ
つっつきボイス:「これもはてブから」「レイヤーゼロって物理層ですよね?」「いや、物理層よりさらに下です😎」「あ、そっちか!」「ビルとか土地とか立地条件とか」「↓こういうのがレイヤーゼロだそうです」「なるほどー」「レイヤーとは言わない気もするけど😆」
⚓SQL
⚓MySQL 8.0解説
つっつきボイス:「単なる機能紹介じゃなくて、割と運用面の具体的な注意点にも触れていてよさそうだったので」「ウィンドウ関数やっと入ったか」「おすすめはRANK関数...って、なかったの?」「そういえばRANK関数はじめて使ったのはぽすぐれだった」
参考: ウィンドウ関数
「そしてJSON機能と独特の記法↓...MySQLもとうとうJSON地獄に仲間入り👹」「きた〜」「きた〜」「こないだPostgreSQLでJSON地獄見た〜」
-- 同記事より
SELECT
doc ->> '$.firstname' AS firstname,
doc ->> '$.lastname' AS lastname,
doc -> '$.score' AS score
FROM
students
WHERE
doc->'$.score' > 80;
「リソースグループは、MySQLをカリカリにチューニングしたい人によさそう」
「お、認証プラグインがcaching_sha2_passwordに変わるのか」「しゃーつー」「古いMySQLクライアントからだと8に接続できなくなると: これは知らないとハマる😅」
「え、クエリキャッシュ消えるの?」「一度入ったのに消える?」「クエリキャッシュはかなり昔からあって、しかもよく使われてました😭」「あ、記事にもあるけど5.6からデフォルトで無効化されていたかも」
「log_bin
のデフォルトが1になった: これは注意しないとディスクがあふれる🚰」「log_bin
はバイナリログなんですが、トランザクションログというか実行された更新系SQLがすべて入っているのですんごい量になります」「ひょえー」「逆に言うとlog_bin
があればデータを巻き戻せる」「おー」「AWSだとデフォルトで8GBぐらいだからlog_bin
で割と簡単に死ねます😇」「記事には大丈夫ですよって書いてるけど」「どうかなー😆」「用途とかlog_bin
のローテーション設定にもよるけど、でかいバッチをぶん回したときとか危ないかも」「log_bin
を文字列で出すと容量が増えるので注意⚠」
⚓ぽすぐれびとに聞きました: お気に入りのツールや技は?(Postgres Weeklyより)
このgemはRubygemではありませんでした(´・ω・`)。
つっつきボイス:「ぽすぐれは知られざる機能がもう多すぎて😆」「この間のcitextもある」「psql -x
とか」「row_number() over()
とか」「FDWとか」「GIN Indicesとか」「この記事↓にあったヤツですね」「psqlでvimも使えるのか」「Unix的に普通に使えそうですね☺️」
「pl/brainfuck😆」「マジで😆」「brainfuckでストアドプロシージャ書くやついるのか😆」
「ぽすぐれはこういう機能がいろいろあっていいですね〜😋」
⚓JavaScript
⚓TypeScript Deep Dive
つっつきボイス:「これもはてブから」「もうそろそろ、TypeScriptがブラウザでそのまま動くようになればいいのに」「そうっそう思うっ👍」「デバッグのときにTypeScriptがコンソールで動いたらどんなにいいかと😂」「こっそりでいいから入れといて欲しいの😍」「Googleならやる😆」
⚓その他JavaScript
つっつきボイス:「おー、ブラウザだけじゃなくてNode.jsとかのHTTPリクエストを扱うライブラリか」「Fetchもあるし」
- リポジトリ: axios/axios
- リポジトリ: visionmedia/superagent
- リポジトリ: request/request
- Fetch
- リポジトリ: visionmedia/supertest
⚓CSS/HTML/フロントエンド/テスト
⚓WindowsのIME切り替え
つっつきボイス:「この記事見たかも」「今英語キーボードだからもともと半角/全角キーないし😆」
Macのコマンドキーだけ搭載したノートPCが欲しいのは私だけなのでしょうか。
⚓言語
⚓機械学習あるある
つっつきボイス:「これはいろいろわかりみ☺️」「わかりすぎる😆」「新しいものが出てくると割とこういう道を辿る感じですね」 「Railsもある意味似たような道を辿ってるし: 『Railsなら何でもあっという間に作れます』とか😆」「全部scaffoldでやるとか😆」
⚓その他言語
連休中C#を書いてて気づいたんですけど、古くからある言語ってググると古い情報ばっかりヒットするので、今どきな「正解」の書き方が分からないんですよね。これはJavaも同じだと思うんですが。
詳細な説明は要らない、正解のサンプルが膨大に欲しい、みたいな感じ。— Shin Tanimoto / CERO-METAL (@cero_t) December 25, 2018
つっつきボイス:「これもすっごくわかりみ〜」「かと思うと、あえてこの時期の古い情報が欲しい、というのもある😎」「これってRails 3ではどう書くんだっけ?とか」「たしかにー」
久々 Qiita のトレンド1位になったので記念スクショ撮っておこう。 pic.twitter.com/xudWxMF70O
— mattn (@mattn_jp) December 25, 2018
⚓その他
⚓コンクリートの平成史
つっつきボイス:「これもはてブで見た」「ジャンルは違うけどエンジニア記事としていいなと思って」「視点が割と固定気味かなとも思うけどいい感じの記事👍」「どの世界でも専門家の話はやっぱり面白い😋」
「これで連想したんですが、ちょっと前に自宅付近の道路でアスファルト張替え工事が終わったら、自動車の走行音がびっくりするほど静かになってたので(体感で1/3ぐらい)、きっとこういうの↓をやったんだろうなと思って」
- PDF: 低騒音舗装
⚓社名変更
つっつきボイス:「ダイナブックといえば大昔にアラン・ケイが提唱した『ダイナブック構想』↓でしょう」「私もー」「ダイナブックという名前もだいぶくたびれてきた感」
「シャープといえばMURAMASAっていう当時としてはうっすいノートPCがありましたね」「あったあった!」「知らなかった〜」「↓記事の写真はまだもりっとしてますね」「これじゃなくてA4サイズの大きいヤツだったはず」
参考: 【モバイラーが憧れた名機を今風に蘇らせる】シャープ「MURAMASA PC-CV50F」 ~暗黒時代を生き抜いたEfficeon搭載小型モバイル - PC Watch
「当時はこれちょっといいなって思ったことあり😋」「ネーミング的にそっちの路線の方が好き😍: スズキのカタナみたいで」「名前負けしたらそれはそれで恥ずかしいかも😆」「こうなったのはシャープがチャイナブランドになったからなのかなー」「チャイナブック😆」「😆」
⚓群衆の英知もしくは狂気
- サイト: 群衆の英知もしくは狂気(音が出ます)
今日の社内勉強会で紹介されていました。
つっつきボイス:「これも実はちょっと前にはてブでバズってましたね」「勉強会の後Macbookからずっと音がしててどのタブだろうと思ったらこのサイトでした😅」
⚓番外
⚓ロボット手術@築地
つっつきボイス:「リモート手術は日本でもだいぶ始まってますね: しかも海外だとさらに普及してるし」「実用性はクリアしていて、後はコストだけだって記事にもありました」「さすがに全自動ではない?」「ゲーセンのコントローラみたいなので操作するみたいです: 手ブレとか危険な動きを完全にキャンセルしたり」
今回は以上です。
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。