Rso's Jotter

日々の開発の知見のメモやその他雑記

paiza で遊んでみました。採用する側からみた所感。

長らく更新できていなかったので、この三連休で時間があったので久々の投稿です。 今年に100本ブログ書くと言っていたのに全然かけていないので、ぼちぼち再開していきたいです。

今回は、エンジニア転職サイトのpaizaのスキルチェックで遊んでみた感想です。

paizaとは

エンジニア向けの転職マッチングサイトで、コーディング問題を説いて己のスキルが判定され、 そのスキルが高ければおいオファーが来るというのが売り、のサービス(と解釈しています)。

paiza.jp

採用する側にとっては、求職者がどういうコードを書いているのかが分かるので、それをもとに判断できる、 というメリットを推しています。

問題の性質、レベル感

問題に関しては、お題が与えられてコードを提出し、そのコードを提出先のサーバで実行して テストケースを全て通過すれば合格という仕様で、 AtCoder などで開催される競技プログラミングの仕様と似ています。

実際に解いてみたら、Sランク問題を2問やって1問はテストはパスできたけど時間制限超過で100点ならず、2問目はめでたく時間内に正解できました。

f:id:rso:20190811223642p:plain
スーパープログラマ!!(笑)

問題の難易度としてはAtCoderで出題される問題よりもかなり優しく、ものすごくざっくり言うと、paizaのSランク問題が AtCoderのRegular Contestの2問目よりもちょっとやさしい、ぐらいの印象です。

求人にどう活きるのか

さてこのスキルチェックを経て、募集する側が求職者のスキルを判定する上で、どのような情報が得られるのでしょうか。 例えば求職者がpaizaのSランクやAランクになっていたら、何ができると判断できるのでしょうか。

判断できそうなことと, できなさそうなことを挙げてみます。

ある程度(最低限)確認できそうスキル

  • 問題分(仕様)を読んでそれなりのスピードでなんとなく把握できる

    制限時間内にコードを書くために、問題分を読んで仕様をすぐに理解しないといけません。コーディング問題と現実の仕様は複雑度が全然違いますが、まあ小難しい文章から仕様(文意)をつかむことはできると思っても良さそうです。

  • 実装したいロジックがどのような手段であれそれなりのスピードでなんとなく実装できる。手が動く。

 制限時間にそれほど余裕ないため、実装したい処理が思いついても、それを早く実装しないと制限時間内に完了できません。なのでコードの品質、可読性はともかく、やりたい処理をある程度の速度で書くことができると思って良さそうです。

この問題を解いたからといって判断できないスキル

  • コードの品質、可読性

 短時間でテストを通過すればよいコードを書くだけなので、リーダブルコードにあるようなきれいなコードは提出されませんし、その心構えがあるかどうかも判断できません。

  • 設計に関する考え方

 単一の問題を解くだけなので、ある程度の規模のコードをどうやって抽象化して設計するか, その考え方などは判断できません。

  • 問題を解くためのアルゴリズム選択能力

 残念ながら競技プログラミングほどの難度も問題ではないので、アルゴリズム選択に関する能力は計れません。

  • コーディングに付随するのりしろ的な関連能力

 開発に絡んでくるデータベース、ネットワーク、セキュリティに関する理解、バージョン管理ツールやコマンドの操作はどれぐらいの経験があるのかなどは当然わかりません。

  • テストに関する考え方

 テストなんてないので判断できません。

  • 人となり、社風にあうか

 当然わかりません。

..などど書き出すと枚挙に暇がありませんが、要するになんとなく把握できるで上げたところ以外は結局のところ会ってみるしか判断でき無いと思いました。 実際提出したコードベースに会話できるのが売りと言っていましたが、提出するコードは動けばいいだけの汚いコードなので、これだと会話しづらいかなと思いました。

私も採用の面接をする側になることもあるのですが、聞きたいのは、判断できないスキルの方に書いてあることだったりします。

色々不足点を書いてしまいましたが、コーディングスキルを判定するという発想はとてもおもしろいので、この問題の方式以外で客観的にスキルを判定できる方法があれば、 もっと良いなと思った次第です。

Auth0でSafariからのログインができなかったときの対応

Auth0を使用したログインでハマったのでメモっておきます。

構成

フロントエンドはNuxt.jsを使用しており、認証はAuthModuleを使っています。 認証はAuth0のUniversal loginの使っており、Auth0の認証ダイアログが開かれて、そこで認証されたらフロントエンドにcallbackされるという作りです。

経緯と対策

開発中はChromeで動作確認していたのですが、Safariで疎通すると、Universal Loginの認証後のcallbackページで止まってしまう現象が発生しました。

状況を調べてみると、どうやらうまくCookieが書き込めていない感じでした。その他認証に関するエラーログは一切出力されず。

いろいろ調べてみるとSafariは3rd party cookie を防ぐからクロスオリジンのドメインじゃだめ、という説明を見かけました。

auth0.com

そこでとりあえずAuth0のドメインをカスタムドメインにして再度疎通したのですが、症状は変わらず。

更に調べてみると、以下の記事が見つかり、callbackのURLにスラッシュつけてcallback -> 'callback/' にしたら動きました。。

community.auth0.com

これはエラーログも出ないのでこれはハマるでしょ、、思ったのでここに記録しておきます。

Firebase Meetup #13 セッションの内容と所感

それほど今はFirebaseを使い込んでいたり、これから使うような予定はないのですが、情報収集目的で以下のイベントに参加しました。

firebase-community.connpass.com

以下聞いたセッションのメモと所感です。

firebaseでWebアプリを作る際のTips

途中参加のため、聞けず。

FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する

FirebaseNotificationつかってプッシュ通知を送る方法の紹介。 使用したサービスは以下の通り。 - Notification(FCM) - RemoteConfig - User Property

元々の実装では、ユーザ全員にPush通知を送ってしまう作りになっていたので、負荷が高い。 負荷の軽減のために、ユーザセグメント毎にPush通知を送る。

アプリ起動時に、RemoteConfigに自身のグループNoを登録する仕組みを実現したとのこと。

所感

自分はアプリでPush通知を実装したことがないので詳細はわからないですが、それほど高い難度でなく実装可能な印象を受けました。

Firebase Test Labの紹介

Firebase Test Labとは?会場内で使っている人は少ない.. 私も知らなかった..

  • UIテスト実行基盤
  • Googleが管理しているAndroid実機を利用してテストできるサービス

apkファイルをアップロードして、テストしたい機種とOSバージョンを指定したら、テスト実行してくれるとのこと。

Roboテスト - テストがなくても、ボタンなどを自動で認識して、ガチャガチャテストしてくれる。

所感

Firebase Test Lab知りませんでした。これがあればわざわざ端末借りてテストみたいなことを省けるので便利。登壇者はDeNA所属の方でしたので、そのくらい大規模なサービスでは必須なんだろうなと感じました。 直近ではアプリ開発要件はないのですが、Web画面もRoboテストしてもらえたら良いのになぁと感じます。

Outside of Stack Trace

  • Firebase Crashlityicsのテーマ

アプリがクラッシュした時にそのクラッシュレポートを収集して見やすくしてくれる機能。

  • Analyticsと統合したクラッシュレポートが取れるのが良い。
  • アプリの画面遷移経路、時刻などの情報を元にレポートが取れる。
  • クラッシュ時に収集したい情報をカスタムキーとして収集できる。

所感

これも知りませんでした。アプリでなくNuxtなどWebベースでも似たようなログ収集が適用できるか知りたいところです。

2プロジェクトでAuthentication UserをSyncさせる 〜LINEログインを使ったカスタムログインでやる編〜

FIrebase認証がテーマ(Firebase Auth)

  • LINEには標準で対応していない。のでカスタム認証を使用する必要がある。
  • GoogleIDとかだとフェデレーションプロパイだなので、SDKが上手いことやってくれる。
  • カスタム認証だと、認証部分の仕組みを一部自分で実装する必要がある。

所感

カスタム認証はちょっと面倒な印象を受けました。なのでLINE認証は辛そう.. 認証はAuth0を採用したことありますが、認証単体で見るとAuth0の方が多機能そうな印象を受けました。その他の機能も統合されているのがFirebaseの良いところなので 単純に認証だけでもちろん良し悪しは決めれないですが。

Firestore における CQRS の可能性

CQRS ... コマンドクエリ分離 FIresotreでチャットルームのデータモデリングを実装したケースのテーマ

  • コマンドとクエリを分離することで、書き込みの構造と読み込みの構造を分離することで、複雑性を下げる。
  • コマンドはWrite Onlyスキーマは RDBライクな構成となる。
  • クエリはRead Only. データに冗長性があってもよく、非正規でも良い。
  • データの繊維は コマンド -> クエリ の一方向のみで、逆は許可しない。
  • 上記のようにすることで、一見データ構造は複雑になったように見えるが、Writeする側、Readする側それぞれからはアクセスしやすい。

所感

コマンドとクエリの分離をスキーマをどう定義するかの事例が見れて勉強になりました。CQRSの考え方は普段あまり意識したことなかったので、データモデルを設計する際に選択肢の1つとして覚えておきたいと思いました。

全体の感想

FirebaseについてはCloud FunctionとかDynamic Linkとか, Realtime Databaseぐらいしか知りませんでしたが、思っていたより "すげー便利そう"な機能を多く知ることができました。 普段の開発ではバックエンドはRuby on RailsとかNodeJS + MySQL を選びがちなんですが、Cloud Functionでサーバサイド側をどこまでさくっと実装できるかが気になるところです。 アプリ開発はそれほどメインではないのですが、Nuxtなどのウェブベースでどこまで使えるか調査してみたいと思います。

SECCON CTF Beginners 初参加したのでその記録と、使ってよかったツール、コマンドのメモ

SECCON CTF Beginners

前回の マイクリハッカソン に参加したメンバーと、SCCON 2019 Beginner に参加しました。

2018.seccon.jp

以下その概要と結果です。

チーム人数 3名:(うち自分含む2名初参加)

結果 666チーム中 200位ぐらい (上位1/3ぐらい)

解けた問題

f:id:rso:20190527074414p:plain
解けた問題

  • Web 2/5問
  • Pwnable 0/4問
  • Reversing 1/4問
  • Crypto 1/4問
  • Misc 2/4問

ほとんどWarmupレベルの問題しか解けてないという.. でも初参加で全く手が出ないという状況ではなかったので、良いレベル感だったかなと思いました。

Sliding Puzzleぐらいは解けばよかったかなと後から思いました(全部の問題みていない)

あったら便利だなと言うツール

WriteUpはwarmupレベルの問題しか解けなかったので、ここでは書きませんが、 もし次回参加するときの備忘の意味を兼ねて、調査で使用した/便利だったコマンドをメモしておきます。

インストール方法もググったら出てくると思うので、ここでは省略します。

nmap

おなじみポートスキャンコマンド。サーバのどこのポートが空いているかを教えてくれます。 CTFではとりあえずこれを打つということが多々ありました。

$ nmap 153.120.129.xxx

Nmap scan report for 153.120.129.xxx
Host is up (0.022s latency).
Not shown: 996 closed ports
PORT      STATE    SERVICE
22/tcp    open     ssh
9100/tcp  filtered jetdirect
10000/tcp open     snet-sensor-mgmt
20000/tcp open     dnp

cURL

HTTPリクエストを送ることができるコマンド。 リクエストヘッダやボディを事由に入れれるので、スクリプトを入れたPOSTなどで試行錯誤するときなど、 あらゆる箇所で使用されます。

binwalk

今回始めて知りました。 バイナリファイルを引数に与えてやれば、内部がどういうファイルなのかを判定してくれます。 画像と圧縮データなど、複数の要素が合成されてる場合でも見分けることができます。

githubja.com

$ binwalk e35860e49ca3fa367e456207ebc9ff2f_containers                                                                                                             ~

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
16            0x10            PNG image, 128 x 128, 8-bit/color RGBA, non-interlaced
107           0x6B            Zlib compressed data, compressed
738           0x2E2           PNG image, 128 x 128, 8-bit/color RGBA, non-interlaced
829           0x33D           Zlib compressed data, compressed

foremost

こちらも初めて知りました。 こちらもバイナリデータのデータ構造を元に、中身を判定してくれて、さらにこちらは抽出までやってくれます。 qiita.com

od

バイナリのダンプを表示してくれます。 私は以下のコマンドで16進ダンプを見ることが多かったです。

$ od  -Ax -tx1z file.bin 
000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  >.ELF............<
000010 03 00 3e 00 01 00 00 00 f0 4d 00 00 00 00 00 00  >..>......M......<
000020 40 00 00 00 00 00 00 00 60 dc 02 00 00 00 00 00  >@.......`.......<
000030 00 00 00 00 40 00 38 00 09 00 40 00 1c 00 1b 00  >....@.8...@.....<
000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00  >........@.......<
 ... 

objdump

いろいろな使い方ができますが、今回はバイナリ実行ファイルを機械語に逆アセンブルして確認するために使いました。

$ objdump -S -d seccompare
  400630:       c6 45 d0 63             movb   $0x63,-0x30(%rbp)
  400634:       c6 45 d1 74             movb   $0x74,-0x2f(%rbp)
  400638:       c6 45 d2 66             movb   $0x66,-0x2e(%rbp)
  40063c:       c6 45 d3 34             movb   $0x34,-0x2d(%rbp)
  400640:       c6 45 d4 62             movb   $0x62,-0x2c(%rbp)
  400644:       c6 45 d5 7b             movb   $0x7b,-0x2b(%rbp)
  ...

ここから先のバイナリを読むのに慣れておらず、これ以上の解析は苦戦しました.. もっとBinary力を身に着けないと、warmup以降の問題を解くのは難しいのかなぁと思いました。

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

  • 作者: 高林哲,鵜飼文敏,佐藤祐介,浜地慎一郎,首藤一幸
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/11/14
  • メディア: 単行本(ソフトカバー)
  • 購入: 23人 クリック: 383回
  • この商品を含むブログ (223件) を見る

Nuxt AuthModule + Auth0 + Rails での認証環境構築でのハマりポイントを残しておく

タイトルの通りなのですが、 以下の構成で認証する仕組みを試してみたら、思ったよりハマったのでその内容をメモしておきます。

  今回試した構成

  • フロント: Nuxt.js ライブラリは Auth Moduleを使用バックエンド:
  • バックエンド: Ruby on Rails
  • 認証および IdP: Auth0

  フロントエンドNuxtからでAuth0のauthorizeを呼び出し認証して、認証時にJWTを取得してそれをバックエンドに渡して認証する、ということをやろうとしました。 認証のサービスは Firebase Authや AWS Cognito など他にもありますが、Auth0が一番てっとり早くできそうなのかなと思い、こちらを採用したのですが、以下の点でハマりました。

 

JWTがAuth0から帰ってこない

フロントからの認証(authorize)まではすんなりいって、どうも返ってくるJWTらしき文字列が短い.. これはJWTでなくOpaque strings と呼ばれているもので、JWTでは無いようです。調べてみると、どうやらJWTを得るためには、audience を指定しないとかえってこないとのことでした。

auth0.com

OpenID Connectの仕様をあまり理解できていませんが、audience ってなんぞや、何のために設定しないと行けないのかももやっとしたまま、とりあえず設定方法を調べました。  

Auth-moduleで audienceの指定ができない

Auth Module の以下の issue を見ると、どうやら Auth Module 側で audience を指定することはできない様子。

github.com

じゃあどうするのかというと、 Auth0のconfig で default audienceを指定できるので、 それを指定すれば良いとのこと。

というわけで以下の設定画面で default audienceの設定を実施しました。

f:id:rso:20190504230715p:plain
Auth0での default audienceの設定

上記の設定を行なった後に認証を行なったら、 Opaque stringsでなく JWTを得ることができました。  

RubyのJWT認証 ライブラリ knockが現在のAuth0に対応していない

RubyでJWTを扱うライブラリでknock というgemがあったので、このgemで バックエンド側のJWTの検証を試しました。

github.com

auth0 + knockで認証を行なった例は検索でいくつか引っかかるも、どうやらAuth0から取得した JWTの 読み込みで失敗します。 上記のURLのissueでいくつかtopicが上がっていましたが、どうやら更新が長らく止まっているようで、いくつかクラスを書き換えれば動きそうなものの、ちょっと今後使っていくには厳しい印象を受けました。

なのでこのGemの採用は諦めて、公式のAuth0の Quick Startを参考に認証ロジックを自前で書いてやることで対応しました。

auth0.com

所感

上記の3点を解消したら無事に認証を実装することはできたのですが、思ったよりサクっとは行かず、試行錯誤が結構ありました。 Auth0側での仕様が変更されたりもあったので、過去の事例がそのまま参考にできなかったところが大きいと思います。 また、 実際に運用する上では OpenID Connectの仕組みをもう少し把握しておかなければいけないのかなと感じました。そちらに関しては別途理解をまとめた内容を残せればと思います。