読者です 読者をやめる 読者になる 読者になる

さよならとりっぷ

しがないWebエンジニアの雑記とポエム

DogenzakaHack #4 API SpeedStar に参加してきた反省と感想


DogenzakaHack #4 - API SpeedStar - | 株式会社サイバーエージェント

これです。久々に渋谷でプログラミングしました。
始まるまで結構ドキドキしてました。とにかく楽しかったです。

忘れないうちに振り返りを書いていこうと思います。
適当です。

最初のとんでもない勘違い

最初、API使ってなにかをするかと思っていたらAPI作るほうだった。
メールをちゃんと読み直して「!?!??!」となった。めちゃ焦った。

使用技術選定

一応PHP(CodeIgniter)がメインのつもりだけど、その頃node.jsを少しだけ勉強していた。
Nodeビギナーズブック » Node.jsチュートリアル » Node.js 教程

軽くぐぐってみたところ、使うDBとの相性がnode.jsの方が良さそうなのと、
情報量が多いので、「よし新しい技術頑張るか」っていう軽いノリでnode.jsを選択。

後々、「CodeIgniterはリファレンスがしっかりしてるから情報をわざわざ書く人が少ない」
ということを聞いて、いかに自分がリファレンス読んでないのか自覚。。。

一応「得意なプログラミング言語を用いて」との言葉があったので、
PHPメインなのにnode.js選んだ点は申し訳なかった。

(というか、この時点で得意と言い切れる言語が自分にないこともわかった)

当日までの準備:API基礎知識

とりあえずこれ買って第3章まで読む
Amazon.co.jp: Web API: The Good Parts: 水野 貴明: 本

時間があまりなかったのでわかんない部分は適宜飛ばして、
うっすらとでもいいのでAPIについての基礎知識をつけた

当日までの準備:環境構築

前回の夏のインターン、環境構築の準備が甘かったのでここでこけないようにしっかり準備した。
一通り予習。コマンドをメモ。

当日までの準備:node.js

ほぼわからないのでググりまくりました。
参考コードを読みまくってとりあえず動くものを作った。

使ったのはこの辺
pg
Express - node Webフレームワーク | 日本語ドキュメンテーション

pgの公式サンプルコードにはもう少しちゃんと目を通すべきだった。。。
特に$1とかのプレイスホルダー?をちゃんと使わなければ、
SQLインジェクションの対象になってしまうとの指摘を、終わった後に頂いた。

この辺はCodeIgniter使ってたらActiveRecordClassとかで回避出来たかも。

当日までの準備:その他

Postman - REST Client - Chrome Web Store
これはめっちゃよかったし使いやすかった

fgnass/node-dev · GitHub
ファイル更新すると勝手にnodeが再起動してくれるコマンド

やらなくてよかったこと

負荷分散

テストツール使う=POSTとか投げまくる?=負荷???
という短絡的な思考でnode.jsの負荷分散をググりまくってた。

結果的には以下のモジュールを知ることにはなる。
memory-cache
Cluster in Node.js tutorial | Code for geek

当日の進行

環境構築

準備してただけあって特に問題無し。
localでのdumpfileのrestoreで少しだけハマったけど、冷静に対処。

node.js

routes/api.jsにガリガリ書いていく。
SQLがあんまり思い出せなかったのでググりながら実装。
パラメータ辺りの汚さに気づくのは数時間後。

途中で気づいたことへの対処

やってくうちにいくつか不具合があったので、行った対処法

・受け取ったパラメータのデフォルト値の設定
リファレンス引いた

・routerのplaceholderへの整数値の正規表現による指定
/musics/recent にGETしたいのに
/musics/:id が優先されてしまっていてid="recent"になっていた

・Date型の変換
日付入ってるの見た瞬間「おうおうおうおう」って思いました
date-utilsというモジュールを見つけて使った
JerrySievert/date-utils · GitHub

終わってみれば…

設定された基準を満たしているかどうかのスコアで、同着2位
頑張った自分

実際のコードと反省点

という訳で実際のコード
API by node.js + express

反省点めちゃめちゃあるので書いていく

汚い

・「とりあえず動く」ということを優先しすぎたコード
コメントアウトを消そう
・console.log()残り過ぎ
・負荷分散のために用意したコードとかも残っていてダサい

responseは仕様的にステータスコードだけで良かった?

・文章書いてしまった
apiなのでステータスコードが返ればよい?

SQLへの値の代入

・「SQLセキュリティは、もちろん実行速度より優先されるべきである」
・プレイスホルダー使えなかったのは残念
・limitなどの整数値に対するvalidationもない

テストスクリプトへの理解

・テストスクリプトへの理解がなかったために大量失点した部分があった
・もったいない

まとめと反省と感想

APIなんて作ったことなかったので機会を頂けてよかった
APIについてざっくり知れた
・node.jsを使ってしまったのは申し訳なかったけど、使えてよかった

SQLのセキュリティ関連の知識が必要だと気づいた
・何か一つの言語を深掘りする必要がある

・「人に見せるコード」の意識が少ないことに気づけた
・「とりあえず動く」を優先しすぎてる
・仕様があると頑張るタイプだと気づいた

・後のご飯で同世代のエンジニアから刺激を貰った

ありがとうございました!

f:id:b_kaxa:20150221003342j:plain

広告を非表示にする