週刊Railsウォッチ(20191119後編)メソッド参照演算子が廃止、GitHub新機能続々、平成Ruby会議、GitHub OAuthバイパスほか

こんにちは、hachi8833です。うらやましさに身を焦がしてます。


つっつきボイス:「この間出たMacbook Proの16インチね☺️」「買った人or買いたい人…はさすがにいないか😆」「税金抜きでこの値段はやっぱ高すぎ💸」「メモリ64GBはたしかに欲しいけど」「つかそこだけ欲しい😭」「Escキーがやっと物理に戻ったし」「名前がProなのにプロ仕様じゃなかったとは😆」

「お集まりのMacな皆さんにはEsc付いてます?」「私のは付いてます😋」「いいな〜😢」「Touch Barタイプは物理Escキーありませんし」「ここ1年ぐらいはMacからWindowsに移行してるんですけど↓、たまにMacに戻ると物理Escキーないのは不便ですね〜😢」

Web開発環境をMacBook ProからWindows機に移行してみた話


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

後編も引き続き第16回公開つっつき会を元にお送りいたします。ご参加いただいた皆さまありがとうございました!🙇。

Ruby

メソッド参照演算子.:が廃止に

ruby-jp Slackで見かけました。以下の記事でも報じたメソッド参照演算子.:が廃止となりました。

Ruby 2.7.0-preview2がリリース

その少し前には.:は重いという記事も出ていました↓。

その後、廃止に関連するissueを見つけました。


つっつきボイス:「2.7preview1から実験的に入っていたメソッド参照演算子.:が先週廃止になってました😳」「Rubyゴルフに使えそうなシンタックス消えた😆」「#16275長いな〜」「コロン:の意味をこれ以上増やしたくないという意見が見えますね」「Matzの締めくくりコメントを読めばだいたいわかりそう」「.:は将来別の機能を足すときに使うかも😋」「ありそう」「今日出席できなかったkazzさんもちょっぴり残念そうにしてました☺️」

近年は関数型プログラミングにインスパイアされた機能の追加や議論が続いていたが、それらは大局的な設計に基づいていたのではなくアドホックな追加だった。今のところRubyには関数型プログラミングに関する「大きな絵」がないが、今後はより関数型的なRubyの「大きな絵」に基づいて設計すべきと思う。あと点字みたいな.:演算子は自分の好みでない。
#16275コメント#26より大意

「nobuさんがコメント#1で『.:は関数型のためだけではなくて、元々はobj.methodがオーバーライドされててもメソッドを正確に抽出するためのものだった』って書いてますね☺️」「え😅」「obj.methodをオーバーライドするケースってあんまり思いつかないけど😆」「同じく😆」「まあRubyだとそういうことがまったくないとは言えませんし😆」

そろそろrakeやめる?(RubyFlowより)

時間がなくてつっつきで追えなかったので、rakeの代替として記事にリストアップされていた以下の2つのgemだけピックアップします🙇。



whatisthor.comより

# http://whatisthor.com/より
class MyCLI < Thor
  desc "hello NAME", "say hello to NAME"
  def hello(name, from=nil)
    puts "from: #{from}" if from
    puts "Hello #{name}"
  end
end

# dazuma/toysより
tool "greet" do
  desc "My first tool!"
  flag :whom, default: "world"
  def run
    puts "Hello, #{whom}!"
  end
end

その他にコメント欄でrunfileというgemも挙がっていました。


runfile.dannyb.coより

GitHubのOAuthをバイパスしてみた

ruby-jp Slackで見かけました。


同記事より


つっつきボイス:「そんなことできちゃったんですね😳」「この記事書いた人270万円ばかし賞金ゲットしてるな🥇」「おぉ?」「セキュリティのコンペ?😅」「というよりこの人は仕事ではないところでアプリケーションの脆弱性を見つけるという高尚な趣味をお持ちらしくて😆、GitHub Enterpriseのトライアル版をダウンロードしてHEADリクエスト周りをゴニョゴニョしたらOAuth突破できたのでGitHubに報告したら25000ドルをゲットした、という感じっすね☺️」「すげぇ〜😳」「よく見つけたな〜」「日本だとあんまりありませんけど、自社のアプリの脆弱性を報告してくれたら内容に応じて賞金を出しますみたいな企画は最近見かけますね☺️」

prism: mrubyとWebAssemblyでフロントエンドWebアプリ(Ruby Weeklyより)

試しにgem install prism-cliしてprism initすると以下のapp.rbが生成され、prism serverでブラウザのlocalhost:3042/app.rbにアクセスすると動きました。

class HelloWorld < Prism::Component
  attr_accessor :name

  def initialize(name = "World")
    @name = name
  end

  def render
    div(".hello-world", [
      input(onInput: call(:name=).with_target_data(:value)),
      div("Hello, #{name}")
    ])
  end
end

Prism.mount(HelloWorld.new)
<!DOCTYPE html>
<html lang=en-us>

<head>
  <meta charset=utf-8>
  <meta content="text/html; charset=utf-8" http-equiv=Content-Type>
</head>
  <body>
    <div id="root"></div>
  </body>
  <script type="text/javascript" src="/prism-assets/prism.js"></script>
  <script type="text/javascript" async src="/prism-assets/bundle.js"></script>
  <script type="text/javascript">
    Prism.run("#root", "/app.rb");
  </script>
</html>

つっつきボイス:「とりあえず手元で試したらするっと動いてくれました😋」「皆さんWebAssemblyでいろいろ遊んではる😆」

mrubyをWebAssemblyで動かす(翻訳)

その他Ruby


つっつきボイス:「平成Ruby会議よさそうですよね👍」「まだ参加できます?」「つっつきの時点であと7人なので今のうちですよ」「2スロットありますね」「ドリコムさんの会場だから例によってあの2つの部屋でやるんでしょうね☺️」「『TextbringerでつくるTextbringer』って😆」「Rubyの話もRailsの話もありますね😋」「割とRuby寄りかなとは思いますけど☺️」「12/14は忘年会シーズンですけど😆」「こういう濃いイベントに参加すると脳みそがめっちゃ疲れますけど😆」「期待できそう!」



こちらはつっつき後のツイートです↓。

DB

PostgreSQL 12のクエリパフォーマンス第一印象;(DB Weeklyより)


つっつきボイス:「PostgreSQLも12か〜」「そういえばPostgreSQLは年1でメジャーバージョンアップされるポリシーに変わってましたね☺️」「タイトル通りファーストインプレッション😆」「軽くベンチ回してますけど↓だいたい誤差の範囲かと😆」


同記事より

シェアと用途

「質問なんですけど、日本国内でPostgreSQLを使ってる大手のサービスってありますか?」「大手になると1種類のデータベースだけということはあまりないですね: ぶっちゃけて言えばWebアプリではMySQLもPostgreSQLも使われてます」「なるほど😋」

「自分はWebアプリを長くやってきたのでその範囲で言うと、(クリティカルでない)エンドユーザー向けのWebアプリではMySQLを使っていることがやっぱり多いと思います」「お〜」「主な理由は、単純なクエリであればMySQLの方が速いことが多いから🚄: 今でもぽすぐれより速い」「おぉ〜」

参考: PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較! - エンジニアHub|若手Webエンジニアのキャリアを考える!

「対照的にPostgreSQLは複雑なクエリをちゃんと書けるという特徴があります: なのでシンプルなWebアプリだとMySQLで十分なことが多いんですけど、複雑なビジネスロジックをクエリにする場合はたとえばMySQLだと通らなくてPostgreSQLだと通るということがあります😭」「ふぅむ🤔」

「MySQLとPostgreSQLは使い始めてみるといろいろ違いが出てくるんですよ: どちらかというとPostgreSQLの方が標準SQLと呼ばれる規格に近くて、MySQLは標準から外れているところがちょくちょくあるという😆」「訛り強そう😆」「MySQLで通るクエリがPostgreSQLだと通らないというのはよくあります、しかもめちゃくちゃよくあります💀」「ひぇ〜😅」

移行について

「困るのは、たとえば最初はMySQLにマッチする要件だったのに、アプリが育ってきてPostgreSQLの機能を使いたくなったときとかですね: 自分の経験上、MySQLからPostgreSQLへの移行は死ぬほどつらかったことしかなかった😇」「うぅ😅」「後から別のものにお引越しするのは本当に本当に大変😢」

「逆はどうでしょう?」「PostgreSQLからMySQLへの移行が発生することはめったにありませんね☺️: 単純なクエリを速くしたい以外のモチベーションがありませんし、今ならmemcachedやRedisで高速化する方法などもありますし」「なるほど!」「そういうわけで、RDBMSの選択で悩むぐらいならぽすぐれにしとけば?って自分なら思いますし😆」「😆」「もちろん異論は認めます😆」

RDBMSの違い

「質問ですけど、MySQLとPostgreSQLの書き方はそんなに大きくは変わらないと思ってもいいんでしょうか?」「単純なクエリであればざっくり8割ぐらいは同じに書けますけど、一方でしか通らないクエリも書けます: そもそも引用符の使い方からして違いがありますし↓😢」「そうでしたか😳」

Web+DB Pressの特集を自分でまとめたメモから引用します↓。

「まあOracleでもMicrosoft SQL Serverでもみんなそれぞれ方言ありますし、どれが正しいという話でもありませんし、まずは1つに決めてみっちり学習して、それから他のものについて違いを学んでいくのがいいと思います🧐」「なるほど!」

その他DB


つっつきボイス:「Rubyコミッターのk0kubunさんが作ったツールをどなたかがWebAssemblyでブラウザで動くようにしてくれたそうです」「なるほど、スキーマを別のRDBMS用に更新するCREATE TABLE構文を生成してくれるのね😋」「上の話題とシンクロした感😆」

参考: k0kubun’s blog


sqldef.github.ioより

ALTER TABLE user ADD COLUMN created_at datetime NOT NULL AFTER name

「ちょうど今表示されてますけど、MySQLだとAFTER nameって書けるんですよ↑」「そういえば!」「MySQLなら作成済みのカラムの間に新しいカラムをこれで挿入できるんですが、ぽすぐれはできない😇」「PostgreSQLはカラム順変えられないんでしたっけ?」「CREATE TABLEレベルではできません😆」「テーブル作り直しか😢」「とまあこういうところにもRDBMSの違いがあったりします: 両方経験すれば『こういうカラム順変更は簡単じゃないゾ』ってわかりますけど、片方しか知らないとハマったりします😆」「😆」


「質問ですが、RDBMSを別のものに変えて欲しいみたいな注文を受けたときに、できるできないを見分けるコツってあるんでしょうか?」「自分もさんざんこの種のワナを踏んできたことで、だんだん鼻が利くようになってきたかなと思います😆」「妖怪アンテナが立つというか😆」「逆にこれは実は簡単とか、この機能は移行先にもきっとあるはずだと確信を持ったりするというのもだんだん見えるようになってきました☺️」「やはり経験なんですね😀」

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

最近のIaas PaaSクラウド動向


同記事より


つっつきボイス:「Synergy Research Groupの調査結果だそうです」「ともするとポジショントークになりがちですけど😆、Alibabaがランクインしてるということは一応世界をカバーしているかな🤔」「ちょっと前に、Office 365の売上を足すとMicrosoftの方が売上高いみたいな報道が流れて、Amazonがクラウドで負けたのかと勘違いする人が続出したりしてましたけど😆」「それ足したらあかん😆」「この記事はIaaS+PaaSで比較してるから割と正しそうかな🤔」「この種の記事はどう売りたいのかという意図まで読んでおきたいですね☺️」

「Azureが割と伸びてる」「オンプレのWindows Serverからの移行が多そう🤔」「あ、オンプレ(オンプレミス)というのは機材を自社内に物理的に置くことを指します」「クラウドと対になる概念なんですね」

参考: オンプレミス - Wikipedia

「オンプレではなくAWSみたいなクラウドに置く場合、クラウド側のハードウェア置き換えの都合などで『今度何月何日何時にインスタンスをシャットダウンして再起動します』みたいに強制的に再起動させられたりしますが、AWSは契約上そうしていいことになっています😆」「😆」「その代わりクラウドはハードウェアの老朽化とかについて利用者側は考えずに済むというメリットがあります☺️」

「実機を構築したことがあるとわかるんですけど、実機ハードウェアの部品って5年後にも同じものがあるかどうかわからないんですよ」「😱」「特にハードディスクはロットによって微妙な違いがあったりして組み合わせると具合が悪いみたいな一種の神話があったりするので、近いロットで揃えるようにしたりしますね」「逆にロットを合わせない方がいいみたいな神話もあったりしますけど🤣」「そうそう、どっちもあるんですよ🤣」「ロットが同じだと同時に壊れやすいらしいとか😆」「工場が違うとダメらしいとか😆」「RAID 5で1個壊れて差し替えたらリビルド中にまた1個壊れて、それを差し替えたらさらに壊れて…なんて話も聞きますし」「それはひどい😆」

「でクラウドだとそういうつらい目に遭わなくて済むので広く使われるようになったという感じです☺️」「なるほど!」「物理サーバーはほこり溜まるからキライ😆」「Azureが伸びているというのも、おそらくそういうオンプレのWindows Serverをクラウド化したいという需要に乗ってるのかもしれない🤔」

GitHubの新機能


つっつきボイス:「ついさっき上が流れてきました🎉」「GitHubで定義ジャンプできるようになったか🎉」「さしあたってRubyとGoとPython」「定義ジャンプは先々週ぐらいからできてたかな〜、GitHub Universe↓でいろいろ新しいものが発表されてましたし」「あ、GitHubのイベントですね」


githubuniverse.comより

「PHPの定義ジャンプはまだ難しいんだろうな😆」「Rubyの方が難しそうですけど😆」「候補リスト出すぐらいならやれそう」「method_missing使ってると無理かも😆」「今Active Supportあたりで定義ジャンプやってみると、インスタンス変数なのにメソッド引いてきたりしてるし😆」「それでもないよりうれしい😂」「ソース取ってくるのめんどいときとかね😆」


「スマホアプリでプルリクやマージできるとか何とか😆」「スマホでまでやりたくないな〜🤣」


「GitHub Actionsも来ましたね🎉」「今のところ/actionsの管理方法がまだバタバタしてる感じかな〜」「その辺の運用はこれからでしょうね☺️」「GitHubでやれることがいろいろ増えるのはいい👍」


「これもさっき流れてきました↑」「Rosetta Project↓みたい?😆」「砂漠にアーカイブデータを置くプロジェクトってのもあった覚えが🤔」「砂漠も極地も環境が安定してるからでしょうね」「南極の氷はそろそろ溶け始めてるんじゃ?😆」「Git自身は分散管理だから本来こういうプロジェクトはなくてもいいはずで、その意味ではGitではなくてGitHubのプロジェクトなんだな〜ってちょっと思ったり😆」


rosettaproject.orgより

その他クラウド

JavaScript

TypeScript 3.7リリース(JSer.infoより)

breaking changesもビシビシ入っているようです。


つっつきボイス:「TypeScript書いてる人います?」「ほい🤚」「おぉやってますか」「まあTSもどこまで厳しくやるかで原理主義派とそうでない派の紛争が勃発してて面倒ですが😆」「any許すかどうかとか😆」

参考: TypeScriptのanyは嘘? - Togetter

「CoffeeScriptを使っている方は?」「rails newするときに真っ先に外すgem😆」「さすがに使う人減ったか」「実は数年前にCoffeeScript 2↓ってのが出てるみたいですけど😆」「おや😆」

参考: CoffeeScript 2という新たなる希望 - Qiita

その他JS

// 同記事より: 見苦しくなる例
// Compiled with faster.js
const arr = [1, 2, 3];
const results = new Array(arr.length);
const _f = (e => 2 * e);
for (let _i = 0; _i < arr.length; _i++) {
  results[_i] = _f(arr[_i], _i, arr);
}

つっつきボイス:「いわゆる『早すぎる最適化はよくない』という話☺️」「よくある記事ですけどJavaScriptベースですね」「もうJITに任せればいいんじゃね?😆」

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

h2とh2c

ということで、h2 も h2c も HTTP/2 のこと、TLSによって暗号化がされているものがh2、暗号化されていないものがh2cという事だった。
同記事より


つっつきボイス:「先週のウォッチ制作中に見つけた記事です」「DevToolsのプロトコル欄にh2とかh2が出ると」「暗号化してないのがh2c😳」「知らんかった〜別に困らんけど😆」「ちょい短すぎかと😆」「まだ広まってないし名前また変わるかもしれませんし😆」「そのうちHTTP/3出ちゃうでしょうし🤣」「最近はバージョンをカジュアルに上げるの流行ってますし🤣」

言語・ツール

Test Anything Protocol(TAP)とは


testanything.orgより

# testanything.orgより
TAP version 13
1..N
ok 1 Description # Directive
# Diagnostic
  ---
  message: 'Failure message'
  severity: fail
  data:
    got:
      - 1
      - 3
      - 2
    expect:
      - 1
      - 2
      - 3
  ...
ok 47 Description
ok 48 Description
more tests....

つっつきボイス:「最初Ruby Weeklyでrspec-tap-formatters↑を見つけたのですが、TAPが何なのかが気になって」「どれどれ、1から6までテストするとして、以下だと1と3がfailして、6番目のテストもないから6もfailするという感じ↓」「言語に依存しないでテストを書けるようにするものみたい」

1..6
not ok
ok
not ok
ok
ok
FAILED tests 1, 3, 6
Failed 3/6 tests, 50.00% okay

「rspec-tap-formattersはspecをそのTAP形式↓で出せるのね」「他のテストツールもTAP扱えるようになればテストを共通化できるだろうという夢の世界😆」「そういえばcucumberも言語非依存なんで、複数言語向けのライブラリでcucumberでテスト書いてるところもあったりするけど、そういうふうに1段階上がるノリなのかも🤔」「それはそれでわかりますね☺️」

TAP version 13
# test: String {
  # group: #present? {
    # group: when whitespaces and other characters {
      ok 1 - returns true
      1..1
      # tests: 1, passed: 1
    }
    # group: when nil {
      not ok 1 - returns false
        ---
        location: "./resources/string_spec.rb:8"
        error: |-
          Failure/Error: expect(string.present?).to eq(false)
          NoMethodError:
            undefined method `present?' for nil:NilClass
        backtrace: "./resources/string_spec.rb:9:in `block (4 levels) in <top (required)>'"
        ...
      1..1
      # tests: 1, failed: 1
    }
    # group: when whitespaces only {
      ok 1 - returns false
      1..1
      # tests: 1, passed: 1
    }
    1..3
    # tests: 3, passed: 2, failed: 1
  }
  1..3
  # tests: 3, passed: 2, failed: 1
}
1..3
# tests: 3, passed: 2, failed: 1
# duration: 0.026471 seconds
# seed: 27428

その他

これもソリューション

ボヘカラ on Twitter: “これやると、その店だけ原価率が如実に上がるので、SVがお店に張り付く事になります。最初はオーバーポーションが疑われますが、暫くするとSVが居る時だけ原価率が落ち着くので、抜いてるなと判明します。そうなると監視カメラとマイクとPOS… https://t.co/V6NXqfPBqm”

台湾のレシートは宝くじ https://www.ouchi.link/entry/taiwan-receipt /薬を飲んだら宝くじチャンス。ただし薬を飲まなかったら当選金は渡さない。これで98%が薬を飲むようになった。https://ameblo.jp/gawayo508/entry-11969395639.html

2019/11/12 10:34

番外

英語のお気持ち


つっつきボイス:「そういえばpriorityって文脈でちょい変わるなと思って」「どっちもありますね〜☺️」

「footgunは翻訳中に調べて見つけたんですが普通の辞書にはまだ載ってませんでした」「新しい言葉っぽい🤔」「これ単語になるのか😆」「『自分の足を撃ち抜く』がどんどん短くなってついに1語になった感😆」「略しすぎ😆」「プログラマーならわかる😆」「たぶんIT業界限定☺️」


後編は以上です。

おたより発掘

バックナンバー(2019年度第4四半期)

週刊Railsウォッチ(20191118前編)ActiveJob引数のログ抑制、RailsガイドProプランお試し、ファイルアップロードのレジュームgemほか

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

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

DB Weekly

db_weekly_banner

Publickey

publickey_banner_captured

Serverless Status

serverless_status_banner

JSer.info

jser.info_logo_captured

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

この記事の著者

hachi8833

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

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ