渡り鳥の旅路

元半導体系エンジニア、今Webエンジニアの雑記

【WIP】【振り返り】GCJ2019 Qualification Round: Foregone Solution

昨日の記事の1問目について少しずつ振り返りを進めていきます。

roo-ashi.hatenadiary.com

ちなみにGoogle Code Jamのサイトに行くと、今でもSubmitしたコードを採点してくれます。

まずはけんちょんさんの記事を参考にRubyで実装していきます。

GCJ 2019 Qual A - Foregone Solution - けんちょんの競プロ精進記録

競技プロerにならったコード

def separator(n)
  a = ''
  b = ''
  
  (0...n.size).each do |idx|
    if n[idx] != '4'
      a << '0'
      b << n[idx]
    else
      a << '1'
      b << '3'
    end
    
    a = '' if a == '0' # leading zero対策
  end

  return a, b
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp
  a, b = separator(n)
  puts "Case ##{i + 1}: #{a} #{b}"
end

自分が本番でSubmitしたコードよりかなりシンプルです。

本番でSubmitしたコード

def include_digit_four?(num)
  /4/ =~ num.to_s
end

def find_index_of_four(num) # 中身が同じメソッドを書いてしまった 汗
  /4/ =~ num.to_s
end

def one_digit_separator(arr, num)
  index = find_index_of_four(arr[0])
  b = arr[1] + 10 ** (arr[0].to_s.size - index - 1)
  a = num - b
  return a, b
end

def separator(num)
  arr = [num, 0]
  while
    arr = one_digit_separator(arr, num)
    if !include_digit_four?(arr[0]) && !include_digit_four?(arr[1])
      break
    end
  end
  return arr[0], arr[1]
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp.to_i
  a, b = separator(n)
  puts "Case ##{i + 1}: #{a} #{b}"
end

ToDo

Webアプリの機能に導入したケースを想定して下記でも追記していく予定です。

  • Class/Module定義
  • 4以外のキーが壊れた場合

【参加ログ】Google Code Jam 2019: Qualification Round

Google Code Jam 2019のQualification Roundに参加したのでその記録です。

Google Code Jamとは

Googleが主催しているプログラミングコンテストです。 今年は予選から3回戦まではオンライン、決勝は1つの会場で行われます (今年はカリフォルニアのGoogleオフィス)。

codingcompetitions.withgoogle.com

今年のスケジュール

フェーズ 開始 (JST) 終了 (JST) 制限時間 通過条件
Qualification Round 4/6 08:00 4/7 11:00 27hrs 30pts取得
Round 1A 4/13 10:00 4/13 12:30 2.5hrs 上位1500位まで
Round 1B 4/29 01:00 4/29 03:30 2.5hrs 上位1500位まで
Round 1C 5/4 18:00 5/4 20:30 2.5hrs 上位1500位まで
Round 2 5/18 23:00 5/19 01:30 2.5hrs 上位1000位まで
Round 3 6/8 23:00 6/9 01:30 2.5hrs 上位25位まで
World Finals 8/9 4:30 8/9 08:30 4hrs

※Round1はA/B/Cのどれかで通過すればOKです (全部参加でき、A~Cで合わせて4500名が通過)

※決勝はCAの現地会場で実施されます。

スケジュールへのリンク

出題形式

今年のQualification Roundでは4種類の問題が与えられ、 問題に対して課された制約ごとに、ポイントが与えられます。

今回の配点はこんな感じです。

問題 Test set1 Test set2 Test set3
Foregone Solution 6pts 10pts 1pts
You Can Go Your Own Way 5pts 9pts 10pts
Cryptopangrams 10pts 15pts
Dat Bae 14pts 20pts

例えば、N桁の整数に関する問題に対して、 計算量でテストセットの難易度別にポイントが加算されるといった具合です。

  • Test set1 (6pts): 1 < N < 105
  • Test set2 (10pts): 1 < N < 105
  • Test set3 (1pts): 1 < N < 10100

ちなみにテストセットにはVisible/Hiddenの2種類があり、 Visibleは解答を送信した時点で正否がわかりますが、Hiddenはコンテスト期間が終わって初めて正否が公開されます。

それでは今回自分が解いた問題 (2問目まで) について書いていきます。

1問目: Foregone Solution (6pts, 10pts, 1pts)

問題

  • 100桁以下のNが与えられる
    • Nの全桁のうち、最低1つに4が含まれる
  • a + b = N
    • a, bはどの桁にも4を含まない整数

問題へのリンク

制約

  • Test set1: 1 < N < 105
  • Test set2: 1 < N < 109
  • Test set3: 1 < N < 10100

考えたこと

まずはコンテストの形式に慣れるため、最初から全テストを通すことは狙わずにサブミットしていこうと考えました。 そのため、最初はNをシンプルに1ずつずらしていくという力技の処理で書いてみました。 案の定Test set2でランタイムエラーとなったため、4を検知したら1と3に分けるよう決め打ちするように変更したところパスしました。

自分の解答

1回目

def separator(num)
  a = 1
  while
    b = num - a
    if !include_digit_four?(a) && !include_digit_four?(b)
      break
    end
    a += 1
  end
  return a, b
end

def include_digit_four?(num)
  /4/ =~ num.to_s
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp.to_i
  a, b = separator(n)
  puts "Case ##{i + 1}: #{a} #{b}"
  # Case #x: A B
end

最終版

def include_digit_four?(num)
  /4/ =~ num.to_s
end

def find_index_of_four(num) # 中身が同じメソッドを書いてしまった 汗
  /4/ =~ num.to_s
end

def one_digit_separator(arr, num)
  index = find_index_of_four(arr[0])
  b = arr[1] + 10 ** (arr[0].to_s.size - index - 1)
  a = num - b
  return a, b
end

def separator(num)
  arr = [num, 0]
  while
    arr = one_digit_separator(arr, num)
    if !include_digit_four?(arr[0]) && !include_digit_four?(arr[1])
      break
    end
  end
  return arr[0], arr[1]
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp.to_i
  a, b = separator(n)
  puts "Case ##{i + 1}: #{a} #{b}"
end

2問目: You Can Go Your Own Way (5pts, 9pts, 10pts)

問題

問題へのリンク

  • N x Nのマス目が与えられる
    • 北西 (左上) の最頂点がスタート、南東 (右下) の最頂点がゴール
    • 東 (右) か南 (下) 方向にのみ進める
  • ライバルの道順が与えられる (例:SEEESSES)
    • マス間の移動で、ライバル同じ進み方をすることが出来ない (同じマスに止まることはできるが、そこから同じ方向に進めない)。

制約

  • Test set1 (6pts): 2 ≤ N ≤ 10
  • Test set2 (10pts): 2 ≤ N ≤ 103
  • Test set3: (1pts) 1 < N < 104

考えたこと

紙に書きながら動き方を考えたところ、常にライバルと違う方向に進めば良さそうなことに気づきました (要はスタートからゴールまでの対角線に対して、反転させた経路を通れば良い)。

実装中はゴールから逆順に経路を決めていくイメージで実装を進めていたので、かなり冗長な書き方になってますが、本当は簡単なループでいけますね。。

雑だけどこんなイメージ

route = ''
(1..N.size).each do |letter|
  if N[letter] == 'E'
     route << 'S'
  else
     route << 'E'
  end
end

自分の解答

def route_choice(str)
  route = ''
  rival_route = str
  while
  if check_last_motion(rival_route) == 'S'
    route.insert(0, 'E')
  else
    route.insert(0, 'S')
  end
    rival_route.chop!
    if rival_route == ''
      break
    end
  end
  route
end

def check_last_motion(str)
  str[-1]
end

def add_motion(route, motion)
  route.insert(0, motion)
end

t = gets.chomp.to_i

t.times do |i|
  n = gets.chomp.to_i
  str = gets.chomp
  route = route_choice(str)
  puts "Case ##{i + 1}: #{route}"
end

結果

1, 2問目ともTest set3までパスしていて、41ptsで予選通過となりました。

振り返り

今回事前の準備なしで取り組んだのですが、色々詰まりつつも結構楽しかったです。 普段のノリでメソッドの意味合いを考えつつ進めていたのですが、競技的には余分で削ぎ落とすべき要素なのかもしれません。

さっそくアップされていた競プロの先輩達の振り返り記事を読んでみると、実装の仕方や観点が違い勉強になります。

GCJ 2019 Qual A - Foregone Solution - けんちょんの競プロ精進記録

GCJ 2019 Qual B - You Can Go Your Own Way - けんちょんの競プロ精進記録

Google Code Jam 2019 Qualification Round : A. Foregone Solution, B. You Can Go Your Own Way - kmjp's blog

PostgreSQLのバージョンを上げたらRails consoleが開かなくなった時の対処メモ

色々アップデートしてたらRails consoleが開かなくなり対処したのでそのメモです。

>bin/rails c

(Traceback省略)

/Users/(ユーザー名)/.rvm/gems/ruby-2.5.1/gems/bootsnap-1.4.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require': dlopen(/Users/(ユーザー名)/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/x86_64-darwin16/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)
  Referenced from: /Users/(ユーザー名)/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/x86_64-darwin16/readline.bundle
  Reason: image not found - /Users/(ユーザー名)/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/x86_64-darwin16/readline.bundle

エラーをみると/usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)あたりが怪しそうなのでググってみると出てきたのが以下↓

github.com (即効でRailsのissueじゃねぇ!ってクローズされてて吹いたw)

リンク先だといくつか対処法が書いてあるので整理します。 結論としては1が良いのかなと思います。

0. 開発環境

  • macOS sierra (10.12.6)
  • Rails 5.2.2
  • Ruby 2.5.1 (rbenv)

1. シンボリックリンクを作成する(し直す?)

2019/3/2時点だとこれでいけました。

ln -s /usr/local/opt/readline/lib/libreadline.8.0.dylib /usr/loc al/opt/readline/lib/libreadline.7.dylib

下記記事とHomebrewのサイトを見てみると、 最近PostgreSQLのバージョンを上げた影響でreadlineのバージョンも上がったため、

(原因)readline 7を読みに行ったが対象がない

(事象)LoadError

(対処)元の呼び出しでもreadline 8.0を呼び出せるようにシンボリックリンクを作成する。

という流れになったのだと予想。

thinkami.hatenablog.com

formulae.brew.sh

ちなみにシンボリックリンクとは?

www.itsenka.com

ln -s hoge fugaの意味について

http://www.turbolinux.co.jp/products/server/10s/manual/command_guide/command_guide/ln.html

ln の引数の順番で迷わなくなった - Qiita

2. rb-readlin gemを入れる

rb-readline gem

これでも一応動くようになりましたが、最近メンテされてないし。。

3. rbenv (またはrvm) を入れ直す

今回は試してないが、入れ直す時にリンクが作成されるのでは?と予想

まとめ

他にもバージョン上げた時に応用効きそう

【参加してきた】JAWS DAYS 2019

昨日JAWS DAYS 2019に参加してきました。初参加です!

今年のテーマは『満漢全席』というだけあり、A~Kまでの計11トラック、約100セッションのてんこ盛りなイベントでした。

公式サイト

jawsdays2019.jaws-ug.jp

参加目的

参加時点での自分のステータスはこんな感じ

  • 普段の業務でAWSはちょくちょく触るが、がっつりは学習できていない。
  • Dockerなどのコンテナ技術を含めたDevOpsに興味を持っている。

AWS周りの技術は何となく身近だけど真面目に勉強したことがないという状態だったため、どんな進め方で身につけるかのヒントを得ようと主に初心者向けのセッションをピックアップして参加しました。

新卒1年目のSREがコンテナをデプロイできるようになるまでの道のり

10:10~ Fトラック

speakerdeck.com

eureka/ex-eurekaのコンビが初めてDockerを触るところからKubernetesの導入、AWSへの展開、今後の展望など約300ページにも及ぶてんこ盛りな内容でした。

初心者からみて疑問を覚えるワードに逐一簡単な解説が挿入され、駆け足にもかかわらず置いていかれずに聴くことができました。 OJTでのやりとりベースで話が進んだところも、聴いている側が入り込みやすくてよかったです。

同日湊川あいさんのマンガでわかるDocker AWS編も販売されていたのですが、合わせて読むと完璧なのでは\(^o^)/ (今日からBoothでも購入できます!)

llminatoll.booth.pm

EC2 T2インスタンスでつまづきやすいCPUクレジット〜EC2でチャットボット作って運用でハマって学んだ話〜

11:10~ Dトラック

www.slideshare.net

EC2のCPUクレジット切れ、自分も経験して焦ったことあるのでわかりみが深い〜と思いつつ聞きました。実はCPUクレジットの計算方法がよくわかっていなく、かなりわかりやすい説明でありがたかったです。

次の話でもあったのですが、最小構成でいいのでまずは始めて知見を貯めていくと良いよというお話がありました。

モバイルアプリのバックエンドをEC2で運用している話

(資料まだなし?)

コスト以外に技術検証にかけられる時間も、利用するサービスを制限する要素になる話があり、自分の中その手法が確立できているのが大切なのだなぁと思いました。

ランチ

弁当戦争に負けた我々をやさしく待ち受けていた豚丼

f:id:roo_oregon:20190224214041j:plain:w300

f:id:roo_oregon:20190224214056j:plain:w300

GitHub Actionsを使って、ワークフローもプルリクベースで開発しよう!

昨年10月に発表されたGitHub Actions(現状ベータ版)を利用して、EKSにデプロイするまでのデモがありました。

Actionsは基本Dockerfileに書いていくとのこと。そうすることで運用をモジュール化したり、OSS化したりと、皆で良い方向に進みましょうというコンセプトらしいです。

あまり資料が上がる雰囲気がなさそうなので(笑)、

ここらへんを追うといいかと思います。 (あとでまとめるかも)

昼寝

(お腹いっぱいだったので帰ってちょっと昼寝^^;)

AWS CLIではじめるコマンドラインライフ 〜 正しい「運用自動化」への第一歩

(資料まだアップされてないはず)

普段GUIでしか操作しない人向けに、CLIをちゃんと活用できることが運用自動化への最初の一歩だよ、というお話でした。 色々なtipsがてんこ盛りで、資料公開されたら一人ワークショップしたいところ。

twitter.com

アイコンにパンチが効いてます笑

資料

早速Qiitaにまとめてくださった方がいました。感謝!!

qiita.com

まとめ

自分はAWS初心者目線で参加したため、インフラのトレンドな話は聞かなかったのですが、自分のレベルに合わせて上記リンクを逐一見直して行こうと思います。 まずはDockerと最小構成でのAWSデプロイかな

【参加してきた】銀座Rails#6

銀座Railsについて

ginza-rails.connpass.com

『テストコード未経験者が RailsでそれなりにRSpecがかけるようになるまでの話』 by @shinkuFencerさん

資料

speakerdeck.com

ご本人の登壇記事

shinkufencer.hateblo.jp

メモ

自分もRSpec書き始めてから日が浅いので、めちゃ響く発表でした。新規開発でゼロからRSpecを導入するよ、という人に一番良さそうな内容(目の前の広大なRSpecの海に立ち向かうバージョンもどこかにないでしょうか 笑)

紹介されてたふつうのRailsアプリケーション開発、開発における「ふつう」の指針が整理されてて何度も読みたい神資料でした。

『Rails6からRailsをわかってく』 by cawaさん

資料

speakerdeck.com

メモ

Rails6の解説というよりは、「自分も詳しくないけどだいたいここらへん見とけば良い感じでキャッチアップできそう」というまとめでした。

またRails6.0にはRuby2.5以降が必要ということで、そちらのRubyとRailsの両方のキャッチアップ情報が含まれていました。

  • 基本的にはリリースノートで注目すべき差分を押さえる。
  • リリースノートから関連するPRへリンクが貼られているので詳しくはそこへ
  • Railsのclosed PRを読んでみるとなるようになるブログのrails commit log流し読みの理解度up
  • 新機能のソースコードを読んで見る(発表で言ってたactionmailboxの各メールツール向け実装はここらへん

とここまではリリース済み(もしくは決まっている)内容のキャッチアップなのですが、 この先どうなるのかなーと気になったらこのあたり見ると良さそうです。

今まで何となく見たことあるかも、という情報群でしたが、もうちょっと真面目にウォッチしようと思ういいきっかけになりました。そのモチベを保つには普段触れるRubyやRailsのバージョンが最新に近いかどうかが効いてくるので、何とかしないと。

1からの再出発 by onkさん

資料(ブログ)は公開されていません。togetterだとこのあたり

メモ

  • 自分の中でこうあるべきという指針を持つ。その指針は世界のどこへ行っても通用する王道をベースとして実践する(っょぃ)
  • 転職などで新しい環境へ移動した時、前後のギャップを感じられるのははじめの数ヶ月(その期間を大切にしよう)
  • レガシーなアプリをメンテし続けると世間から置いていかれる感が積み上がり退職に繋がる
  • ADKARモデル

総括

開始1時間前に申し込むというドタ参もいいとこな感じでしたが、参加してよかった〜

世の中には自分が気づいてない公開された知見が、まだまだたくさんあるなぁと再認識しました。

【参加してきた】次世代Webカンファレンス

先週開催された次世代Webカンファレンスに参加してきました。

nextwebconf.connpass.com

各セッション資料は用意されておらず、各分野の有識者によるディスカッション形式で話が進みました。

セッションの構成は下記になります。

  • アクセシビリティ
  • パフォーマンス
  • WebXR(*)
  • セキュリティ(*)
  • 広告
  • 認証
  • マイクロサービス
  • SRE
  • HTTP3(*)
  • フロントエンド
  • HTTPS(*)
  • CSS
  • Webミュージック
  • デザイン

*付のセッションに参加

このところはRubyによるオブジェクト指向/デザインパターン、JavaScript、Gitの基礎的なところを勉強しているので、今回は視野を広げるべく普段あまりインプットしないジャンルのセッションに参加しました。 (動画が公開されているため、全て観られるのですが)

基本的にはなるほど知らなかった、というトピックが多く検索しつつ箇条書きしたメモになります。

メモ

セキュリティ

今度から徳丸本の輪読会を始めるし、生徳丸先生もいらっしゃるのでちょっとしたミーハー感もありつつ選びました笑

  • Webアプリの開発者はセキュリティについてどの程度気にするべきか?

    • あまり気にしなくていいのでは?(気にしたいけど)
    • ブラウザ側の問題なのにアプリ側で対応する、というのはいけてない。
    • Flashだとクロスドメインなのにjsonが送れる問題(徳丸本に書いてあるとのこと)
    • 正しく理解せずに「いいから黙ってつけとけ」に従っていると、機能が動かない時などよくわからず外してしまったりするので危険
  • クッキーの上書きに対して

    • __hostのクッキーで対応できる。
    • githubのクッキーでも採用されている。
    • これをman in the middleで設定していないと、httpsに対応していても、クッキー上書きにより他人がログインできてしまう。
    • プリロードでの対応策もある?
  • ダブルサブミットクッキーはダメ?

    • fuelPHPやDjangoでデフォルトで入っていたらしい。
    • OWASP
  • クッキーの使用では;のみ区切り文字だが、

    • パーサーにより:も対応しており、
    • それによるニッチなバグがあったりする。
  • CSPについて

  • GDPRの影響

    • クッキーをセットするのに同意を求めるやつ
    • 今形骸化してしまっているのですごく良くない。
      • 昔話) IEのP3Pポリシー
  • 個人情報の収集について

    • google検索でリファラーが送られていたり(今はやめたらしい)、マーケティング目的でユーザーの動作を収集していたりするが、これは業界的にはなし崩し的に常識となっているが、知識のない一般ユーザーはそういうことを認識していなかったりする。
    • そのうち「このサイトではJavaScriptが使われています」と出さないといけなくなるのでは? →ディストピア感。。
  • ハードウェアだとPL法によりセキュリティバグを公表しなければならないが、ソフトウェアはそうでなく公表されないケースが多い。

  • man in the middleプロキシ

  • Webアプリケーションエンジニアに対するお気持ち表明

    • 徳丸さん「何でもかんでもコピペするのは危ない」
      • 検索して一発目に出てくるコードがイケてないことが良くある。
    • bulkneetsさん「開発者みんながセキュリティに対する当事者意識を持ってほしい」
      • 全ては分かってなくても良いが、取っ掛かりでそこに気づいてほしい。気づいてくれれば、あとは相談してもらえれば良い。
    • k2wankoさん「開発者のみなさんにもセキュリティについてもっと興味を持ってもらえると嬉しい」
      • リクルートだと開発者とセキュリティのジョブローテがあるらしい。

WebXR

  • XR: AR/VR/MRを合体させたもの

  • WebXRは来ると思うか?

    • モバイルデバイスから来ると思っている。ARが来る。
    • その中でWebで有用性があると思うのは、ショッピングサイトの商品を自分の部屋に置いてみる体験をしてもらう。
    • 例えば教育。博物館などにあるようなものを実際に部屋に置いてみる。
    • また地図。自分が行きたい方向へ矢印を表示する

Webの良さはインストールがいらないところ

  • ARクラウドという情報インフラが出て来るのでは?と各社興味を持っている。

  • WebGLは来る?

    • ハイエンドのゲームから、一般ユーザー向けの簡単な動きを作るところまで。
    • ブラウザからGPUの力を使うためにWebGLを使う。
    • CG界隈は堅苦しい?WebGL界隈にはその雰囲気は持ち込みたくないと思っているが、、
    • WebGL:ゲームのようなハイエンドから、サイト上での簡単な動気をつける、GPUを使うためなど、色々な使い方がある
    • 3Dは必要になるし、学んで置いた方が良いのでは?
    • 今の時点では3Dの表現をできるのはWebGL一択
    • WebGPU、Web用のシェーダー言語、などWebGLに変わる新しい仕様が出るかもしれないが、今のところはWebGL一強
  • Web開発者目線でのARとの付き合い方

  • テレビはしばらくなくならなさそう

    • WebとつながることによりXRへつながっていく。
  • 今時はリンクをシェアしない。画面をキャプチャしてシェアする。

    • URLをわからず使っている。
    • ARと知らずにARを使う世の中になるのでは。
  • play canvas

  • ARはWebがいいと思うが、VRはWebでなくてもいいのでは

  • いつ来るのか?

    • 今は仕様策定の最中
    • WebVRはすでにChrome LTSに載っている。ARはまだ載っていない。
    • ポジトラ:ポジショントラッキング
    • KhronosはOpenXRをやろうとしている。
    • 2020年に5Gが来るので、その頃には来るのでは?
    • モバイルよりはSSRしたものを送ってしまった方がいい説
    • 3Dに触れておくとか、3Dに数学が必要なんだな、ということを今のうちに知っておくのが良さそう。
  • CSSシェーダーなくなってしまったのが残念。。

  • WebGL村はCG国とWeb国の派閥の間にいる
  • WebGLは色々自分でやらないといけない。結構難しいのは知って置いた方が良い。
    • だが、手軽な方向に行って欲しい。
  • シェーダー
  • ジオメトリ
  • google poly
  • 今のうちに低レイヤーの仕様をきちんと策定しておきたい。

  • WebXRは機械学習と相性が良さそう

HTTPS

(自分がよくわかっていないところ、大体古川さんの要約ツイートがされてて助かりました)

  • EVも信頼を失いつつある今、CAは何を売るのか?

  • HTTPSだけで安全を保証できないなら、「安全に安全を保証するにはどうすれば良いか?」

  • TLS1.3

  • MLS: Message Layer Security
  • SSL pulse

  • TLS1.0と1.1を消すのはどのくらい大変なのか?

  • TLS1.3以降で必要になって来るものは?

    • TLSの量子コンピュータへの対応も必ず必要になって来る
      • 量子コンピュータがデプロイされる前に準備されておかなければならない。
    • 量子コンピュータは周期性があるものに対する計算が強い

      • 鍵交換では素数を使っているのでなんとかしないといけない(素数には周期性がある)
      • ハッシュ値を使っているものは、桁数を上げれば対応できるはず。
    • LTSという土管を通る前後の安全性をどう扱うか?

      • LTSの上位レイヤーの話
    • SXG

    • コンテンツに対して証明できるようにしたい。

    • AMP: Accelarated Mobile Pages

    • URLで識別するには、もう限界がきている。

HTTP3

まとめ

話題も多岐にわたりいろいろと消化しきれていないのですが、各分野で前線を貼っている人たちが何を気にして戦っているのかを知れたのは良かったかなと思います。

あと「そもそも普段自分が触っている技術の最前線を抑えられているか?」と自分に問い直してみると、 「ニュースとして流し見はしているが理解度は高くない」ということが多いのでまずはそこから対応した方が良いよね、というお気持ちです。

【参加してきた】よちがや.rb REST会

よちがや.rb REST会について

普段開催日が被っているよちよち.rbとSendagaya.rbの合同開催で、tkawaさんがRESTについてRailsチュートリアルを進めている/終えたレベルの人に向けて、tkawaさんがRESTを解説する会でした。

RESTといえば、去年自分達でやっていたWebを支える技術のテーマもRESTでした。輪読会向けの資料を作る際、毎度tkawaさんの過去記事が参考になりいつかお礼を言いたいなぁと思っていたので、個人的に今回は願ったり叶ったりな会なのでした。

資料

RailsスタイルからRESTを学ぼう よちがや.rb

www.slideshare.net

内容メモ

  • RESTful Web APIs

翻訳されていないらしいですが、tkawaさんが以前読書会をして、良い本だったとのこと。

www.crummy.com

  • RESTとは制約である
  • 9個の要素で出来た枠に沿って当てはめていく

RESTという制約の元でうまく調和を保ちつアプリを作るには、その要素であるURL/HTTP/HTMLのことをよく知り、正しく使いましょう(この3つはWebを支える技術でも再三重要であると挙げられていました)

  • リソースの名前(URI)と4種類の操作(リクエストメソッド)で機能を実現する
  • Railsが広まることで、RESTも広まった。
  • Railsのアクションとリソース/メソッドの対応
  • リクエストメソッドが当てはまらないときは、隠れたリソースがある。

Railsはver2以降、そのリソース設計のパターンをRESTに沿うように方向転換した。それとRailsの普及が相まり、REST視点で違和感のある設計が減少したとのこと。

この点について、規約の強いフレームワークには技術の差分を埋める役割があると以前聞いたことがあったのですが、Railsはある意味正しいフォームの要請ギプスになっているのかなと感じました(逆に隠蔽されることで、意図しないとその差が埋まりづらいとも言えるかも)。

またRailsがデフォルトで作成するControllerのアクションとリソース/メソッドの対応表のがわかりやすかったです。

そして「リクエストメソッドが当てはまらないときは、隠れたリソースがある」という話は、とても学びがあるなぁと頷きながら話を聞いていました。制約に従うことにより、考え方の指標ができるのですね。

  • PUTとPATCHについての質問

ここまでRailsでデフォルトで利用するリクエストメソッドはGET/POST/PUT/DELETEの4つという話だが、Railsではver4からPUTの代わりにPATCHが採用されていますよね?という感じの質問が出ました。tkawaさんが想定Qです!と元気よく返答してたのが印象的でした笑

ちなみにPUTとPATCHは両方ともリソースの更新を行うリクエストメソッドで、 PUTでは変更対象のリソースのデータを丸ごと更新するが、PATCHでは変更対象のリソースのうち変更するデータのみ部分的に更新するという違いがあります。これにより更新操作においてPUTが持っていたべき等性が、PATCHに変更することでべき等でなくなり、色々議論があったそうです。

【参考記事】次期RailsがPATCHメソッドを採用 - ぶろぐ。@はてな

  • 現実的にはRESTから外れる部分もある(なのでRESTful)

とはいえ現実的にはRESTから外れることもあるよね、ということでいくつか質問も挙がっていました。

おまけ

  • Rails周りのHTTP1.1とHTTP2.0の話

RailsではHTTP1.1で通信しているが、その先のCDN以降はHTTP2に変換されてたりする。その距離をできるだけ短くすることで通信の高速化を実現している。元々RailsでHTTP2を採用する構想もあったが、結局そうなってないらしい。

まとめ

今までRailsとRESTは密接に関係があるよという話は聞いていたのですが、tkawaさんの解説によりWebを支える技術で学んだことや普段触るRailsアプリの構造が自分の中でより整理できたように思います。参加して良かった〜