【WIP】【振り返り】GCJ2019 Qualification Round: Foregone Solution
昨日の記事の1問目について少しずつ振り返りを進めていきます。
ちなみに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 - けんちょんの競プロ精進記録
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
を呼び出せるようにシンボリックリンクを作成する。
という流れになったのだと予想。
ちなみにシンボリックリンクとは?
ln -s hoge fuga
の意味について
http://www.turbolinux.co.jp/products/server/10s/manual/command_guide/command_guide/ln.html
2. rb-readlin gemを入れる
これでも一応動くようになりましたが、最近メンテされてないし。。
3. rbenv (またはrvm) を入れ直す
今回は試してないが、入れ直す時にリンクが作成されるのでは?と予想
まとめ
他にもバージョン上げた時に応用効きそう
【参加してきた】JAWS DAYS 2019
昨日JAWS DAYS 2019に参加してきました。初参加です!
今年のテーマは『満漢全席』というだけあり、A~Kまでの計11トラック、約100セッションのてんこ盛りなイベントでした。
公式サイト
参加目的
参加時点での自分のステータスはこんな感じ
- 普段の業務でAWSはちょくちょく触るが、がっつりは学習できていない。
- Dockerなどのコンテナ技術を含めたDevOpsに興味を持っている。
AWS周りの技術は何となく身近だけど真面目に勉強したことがないという状態だったため、どんな進め方で身につけるかのヒントを得ようと主に初心者向けのセッションをピックアップして参加しました。
新卒1年目のSREがコンテナをデプロイできるようになるまでの道のり
10:10~ Fトラック
eureka/ex-eurekaのコンビが初めてDockerを触るところからKubernetesの導入、AWSへの展開、今後の展望など約300ページにも及ぶてんこ盛りな内容でした。
初心者からみて疑問を覚えるワードに逐一簡単な解説が挿入され、駆け足にもかかわらず置いていかれずに聴くことができました。 OJTでのやりとりベースで話が進んだところも、聴いている側が入り込みやすくてよかったです。
同日湊川あいさんのマンガでわかるDocker AWS編も販売されていたのですが、合わせて読むと完璧なのでは\(^o^)/ (今日からBoothでも購入できます!)
EC2 T2インスタンスでつまづきやすいCPUクレジット〜EC2でチャットボット作って運用でハマって学んだ話〜
11:10~ Dトラック
www.slideshare.net
EC2のCPUクレジット切れ、自分も経験して焦ったことあるのでわかりみが深い〜と思いつつ聞きました。実はCPUクレジットの計算方法がよくわかっていなく、かなりわかりやすい説明でありがたかったです。
次の話でもあったのですが、最小構成でいいのでまずは始めて知見を貯めていくと良いよというお話がありました。
モバイルアプリのバックエンドをEC2で運用している話
(資料まだなし?)
コスト以外に技術検証にかけられる時間も、利用するサービスを制限する要素になる話があり、自分の中その手法が確立できているのが大切なのだなぁと思いました。
ランチ
弁当戦争に負けた我々をやさしく待ち受けていた豚丼
GitHub Actionsを使って、ワークフローもプルリクベースで開発しよう!
昨年10月に発表されたGitHub Actions(現状ベータ版)を利用して、EKSにデプロイするまでのデモがありました。
Actionsは基本Dockerfileに書いていくとのこと。そうすることで運用をモジュール化したり、OSS化したりと、皆で良い方向に進みましょうというコンセプトらしいです。
あまり資料が上がる雰囲気がなさそうなので(笑)、
ここらへんを追うといいかと思います。 (あとでまとめるかも)
- #jd2019_h
- @ikeike443
- GitHub Actions · GitHub
- Marketplace · Tools to improve your workflow · GitHub
- GitHub - sdras/awesome-actions: A curated list of awesome actions to use on GitHub
- Home - GitHub Community Forum
昼寝
(お腹いっぱいだったので帰ってちょっと昼寝^^;)
AWS CLIではじめるコマンドラインライフ 〜 正しい「運用自動化」への第一歩
(資料まだアップされてないはず)
普段GUIでしか操作しない人向けに、CLIをちゃんと活用できることが運用自動化への最初の一歩だよ、というお話でした。 色々なtipsがてんこ盛りで、資料公開されたら一人ワークショップしたいところ。
アイコンにパンチが効いてます笑
資料
早速Qiitaにまとめてくださった方がいました。感謝!!
まとめ
自分はAWS初心者目線で参加したため、インフラのトレンドな話は聞かなかったのですが、自分のレベルに合わせて上記リンクを逐一見直して行こうと思います。 まずはDockerと最小構成でのAWSデプロイかな
【参加してきた】銀座Rails#6
銀座Railsについて
『テストコード未経験者が RailsでそれなりにRSpecがかけるようになるまでの話』 by @shinkuFencerさん
資料
ご本人の登壇記事
メモ
自分もRSpec書き始めてから日が浅いので、めちゃ響く発表でした。新規開発でゼロからRSpecを導入するよ、という人に一番良さそうな内容(目の前の広大なRSpecの海に立ち向かうバージョンもどこかにないでしょうか 笑)
紹介されてたふつうのRailsアプリケーション開発、開発における「ふつう」の指針が整理されてて何度も読みたい神資料でした。
『Rails6からRailsをわかってく』 by cawaさん
資料
メモ
Rails6の解説というよりは、「自分も詳しくないけどだいたいここらへん見とけば良い感じでキャッチアップできそう」というまとめでした。
またRails6.0にはRuby2.5以降が必要ということで、そちらのRubyとRailsの両方のキャッチアップ情報が含まれていました。
- 基本的にはリリースノートで注目すべき差分を押さえる。
- リリースノートから関連するPRへリンクが貼られているので詳しくはそこへ
- Railsのclosed PRを読んでみるとなるようになるブログのrails commit log流し読みの理解度up
- 新機能のソースコードを読んで見る(発表で言ってたactionmailboxの各メールツール向け実装はここらへん)
とここまではリリース済み(もしくは決まっている)内容のキャッチアップなのですが、 この先どうなるのかなーと気になったらこのあたり見ると良さそうです。
- Ruby trunk / ロードマップ
- Rails 6.0.0 / マイルストーン (GitHub Milestones最近おぼえた)
今まで何となく見たことあるかも、という情報群でしたが、もうちょっと真面目にウォッチしようと思ういいきっかけになりました。そのモチベを保つには普段触れるRubyやRailsのバージョンが最新に近いかどうかが効いてくるので、何とかしないと。
1からの再出発 by onkさん
資料(ブログ)は公開されていません。togetterだとこのあたり
メモ
- 自分の中でこうあるべきという指針を持つ。その指針は世界のどこへ行っても通用する王道をベースとして実践する(っょぃ)
- 転職などで新しい環境へ移動した時、前後のギャップを感じられるのははじめの数ヶ月(その期間を大切にしよう)
- レガシーなアプリをメンテし続けると世間から置いていかれる感が積み上がり退職に繋がる
- ADKARモデル
総括
開始1時間前に申し込むというドタ参もいいとこな感じでしたが、参加してよかった〜
世の中には自分が気づいてない公開された知見が、まだまだたくさんあるなぁと再認識しました。
【参加してきた】次世代Webカンファレンス
先週開催された次世代Webカンファレンスに参加してきました。
各セッション資料は用意されておらず、各分野の有識者によるディスカッション形式で話が進みました。
セッションの構成は下記になります。
- アクセシビリティ
- パフォーマンス
- 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プロキシ
- 中間者攻撃 - Wikipedia
- 作って学ぶ 「Https Man in The Middle Proxy」 in Go - ( ꒪⌓꒪) ゆるよろ日記
- バーク(綴りわからん)
- http2、grcpに対応してない
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との付き合い方
- Khronosという団体がWebGLをサポートしている。
テレビはしばらくなくならなさそう
- WebとつながることによりXRへつながっていく。
今時はリンクをシェアしない。画面をキャプチャしてシェアする。
- URLをわからず使っている。
- ARと知らずにARを使う世の中になるのでは。
play canvas
- 導入 | Learn PlayCanvas
- インストールしなくて使える、はかなり使いやすい体験
ARはWebがいいと思うが、VRはWebでなくてもいいのでは
- VRとARの違いはCGの濃度の違い
- 現時点のARとVRは融合する手前の状態
- nreal light
いつ来るのか?
- 今は仕様策定の最中
- WebVRはすでにChrome LTSに載っている。ARはまだ載っていない。
- ポジトラ:ポジショントラッキング
- KhronosはOpenXRをやろうとしている。
- 今乱立されているのを、標準化したいお気持ち。
- OpenXR Overview - The Khronos Group Inc
- 2020年に5Gが来るので、その頃には来るのでは?
- モバイルよりはSSRしたものを送ってしまった方がいい説
- 3Dに触れておくとか、3Dに数学が必要なんだな、ということを今のうちに知っておくのが良さそう。
CSSシェーダーなくなってしまったのが残念。。
- WebGL村はCG国とWeb国の派閥の間にいる
- WebGLは色々自分でやらないといけない。結構難しいのは知って置いた方が良い。
- だが、手軽な方向に行って欲しい。
- シェーダー
- ジオメトリ
- google poly
今のうちに低レイヤーの仕様をきちんと策定しておきたい。
WebXRは機械学習と相性が良さそう
HTTPS
2018振り返り
- Symantecの事件
- PKIベンダー苦難の年
- ワールドワイドでシェア3割だったのに、一瞬でディストラストされてしまった。
- Symantecはブラウザの信用を外されてしまった。
- Chromeで信頼されなくなるSymantec発行のSSL証明書かどうか判定・確認する方法:Tech TIPS - @IT
- Symantecの事件
- 今理解しておくべきトラスト〜Web PKIのサーバ証明書事情〜
- CT (Certificate Transparency) 証明書の発行ログを見られるようにすることで、みんなで変な証明書が発行されていないかを監視したいというモチベでやっている。
CAの重要性が上がっているが、使えるルート認証局が減少する問題
- 大手 (Symantec) でも信用できないとなると、結局どこを選べば良いのか?
- ルート認証局の数自体は減っておらずむしろ増えている。ルート自体は増えている
- lets encryptのようなDV証明書が主流になっている。EV証明書は無くなる方向
- Let’s EncryptがVerisignと棲み分けできる理由: SSL証明書の「DV、OV、EV」とは何か
- 今さら聞けないSSL証明書とは、DV、OV、EVとは、常時SSLについて | レンタルサーバーのCPIスタッフブログ
TLSは認証はしているが、信頼はしていない
- DV証明書は認証はするが、信頼はしていない
- EV証明書は、信頼をちょっと上乗せしている
- EV証明書は去年インシデントがあった。
- イギリス:identity verified
- アメリカ:stripe
- 違う州で違う会社が同じ名前で証明書をとったケース
- EV証明書を使用して既知の企業になりすませる可能性が指摘される | スラド セキュリティ
- EV証明書は去年インシデントがあった。
EV証明書は信頼されなくなったこれには2つの理由がある。
— Yosuke FURUKAWA (@yosuke_furukawa) January 13, 2019
- Identity Verified という証明書が出た、これを悪用するケースがiOSであった。
- 別の組織の人がお金さえ払えばEV証明書を作れてしまう事例があり、これによりお金さえ払えばフィッシングサイト作れるという事例ができてしまった#nwc_https
(自分がよくわかっていないところ、大体古川さんの要約ツイートがされてて助かりました)
EVも信頼を失いつつある今、CAは何を売るのか?
HTTPSだけで安全を保証できないなら、「安全に安全を保証するにはどうすれば良いか?」
TLS1.3
- RFC 8446 - The Transport Layer Security (TLS) Protocol Version 1.3
- TLS1.2との後方互換性を大切にしているため、それほど変わっていない?なぜか?
TLS1.3印象:
— Yosuke FURUKAWA (@yosuke_furukawa) January 13, 2019
- 今までボロボロの長屋をダンボールで補強してたのをプロトコルごと変えたのは良い
- ただし、あんまりドラスティックに変わってない
- ドラスティックに変わってない理由の反面教師はIPv6
- 後方互換性をなくすと絶対変更について来れない#nwc_https
- MLS: Message Layer Security
SSL pulse
TLS1.0と1.1を消すのはどのくらい大変なのか?
TLS1.3以降で必要になって来るものは?
- TLSの量子コンピュータへの対応も必ず必要になって来る
- 量子コンピュータがデプロイされる前に準備されておかなければならない。
量子コンピュータは周期性があるものに対する計算が強い
- 鍵交換では素数を使っているのでなんとかしないといけない(素数には周期性がある)
- ハッシュ値を使っているものは、桁数を上げれば対応できるはず。
LTSという土管を通る前後の安全性をどう扱うか?
- LTSの上位レイヤーの話
SXG
コンテンツに対して証明できるようにしたい。
AMP: Accelarated Mobile Pages
URLで識別するには、もう限界がきている。
- TLSの量子コンピュータへの対応も必ず必要になって来る
HTTP3
- HTTPなのにTCPじゃないの?
- なぜHTTP3と名乗っているの?
- 低レイヤー側は変えているが、インターフェイス的にはセマンティクスは変わっていないからいいんじゃない?的に思っている。
- 詳解 HTTP/3
- 元々の課題感
- Googleが作るQUICとIETFが作るQUICが混乱を招きそう
- ブラウザがログを吐くときにバージョニングする方が便利
- QUICは意外と広まっている (5-10%)
- キャリアグレードNAT
- Firewallが想定している挙動とQUICやTLS1.3の挙動が一致していないため通らない問題
- バージョンごとに通ったり通らなかったりする問題。。
QUICとロードバランサーの両立はどうすれば良いか?
- 対応策
- connection idはipが変わったら変更する。
- connection idを外側からは暗号化する
- 対応策
ロードバランサーがQUICに対応しないといけない?
0RTT
LRU
BBR 輻輳制御アルゴリズム
Wifiと公衆回線の切り替え時に、通信が途切れる問題が解決されるのでHTTP3 (QUIC) 使って欲しいとのこと。
new reno cubic
WebRTC over QUIC
Webのこれから
まとめ
話題も多岐にわたりいろいろと消化しきれていないのですが、各分野で前線を貼っている人たちが何を気にして戦っているのかを知れたのは良かったかなと思います。
あと「そもそも普段自分が触っている技術の最前線を抑えられているか?」と自分に問い直してみると、 「ニュースとして流し見はしているが理解度は高くない」ということが多いのでまずはそこから対応した方が良いよね、というお気持ちです。
【参加してきた】よちがや.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さんが以前読書会をして、良い本だったとのこと。
- 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アプリの構造が自分の中でより整理できたように思います。参加して良かった〜