根性駆動開発

備忘録とか日記とか

ニフティインターンでやったことに関するメモとか

github.com

ぼくのコードはこのリポジトリのfeature/MYFEATUREというブランチの、Desktop/intern_backendというディレクトリ。(ブランチ壊したりしてよくわからない感じになった。)

インターン終わって一週間以上経っていい加減忘れそうなので知見的なモノを記録する。

やったこと

⬇️の画像の用なアーキテクチャでバックエンドにあたる所を主に担当した。 f:id:syathi:20160913015645p:plain

android端末(クライアント側)はチームの別の子が担当。

androi端末からAPIリクエストする機能は間に合わなかった。

クラウドサーバ設定について

この内容はインターン中にメモとして投稿したけど、クラウドの主にファイアウォール周りの設定をした。

具体的には、

  • 22番、80番ポートは特定のネットワークからのアクセスに限定
  • 3000番ポートは全部からアクセスを許可

全部アクセス許可する時の設定は0.0.0.0/0という風に記述しておく。 詳しいことは別記事にかいてあるのでそっち参照。

バイルバックエンドについて

ここだけサーバ経由してなくて、webとクロスプラットフォームとかしたいときサーバ経由するように直さなくちゃいけないしイケてないとか思ったけど、こういうアーキテクチャにしたのには理由があって、

  • expressからORMとか使ってmysqlとかにアクセスするのにはexpressで使うORMについての知識がなかった。
  • それを学習する時間も(5日間のインターンだし)なかった。
  • 突貫でスキーマ設定するには仕様が明確には決まってなかった。
  • もし仕様が変わったとして、スキーマ設定変えたりする時間も惜しかった。

という理由からとりあえず過去にも使ったことがあるしスキーマレスで楽だからNCMBを使った。

実際これにしたことで他のORMの使い方はわからなくて詰まるということも当然なかったし、最後の方であるカラムの型が変わることになったけどスキーマレスなので問題無く普通にあとから新しいデータ追加するだけで済んだ。

きっちり開発するならもうすこしこの辺はこだわった方がよさそうにも感じるけど突貫で作る分には問題ないと思った。

API叩くAPIサーバについて

メインで開発したのはここ。

やりたかったのは、送信された距離(家具とかの幅)のデータから商品をネット通販からサジェストする機能をつくること。

具体的には、リクエストが送られた時に楽天yahoo!APIをnode.jsのサーバが叩いて、二つのAPIから返ってきた異なるデータを同じ形式に直してレスポンスするというもの。

処理の流れとしては、

  1. リクエストにある家具の名前と長さとかで検索ワードを作る。
  2. レスポンス用の新しい空オブジェクトを作る。
  3. 非同期処理内でAPIを叩く。
  4. APIのレスポンスを空オブジェクトに追加する。
  5. JSON文字列に直してクライアントに返す。

といった流れ。

上の方にある画像のように、楽天JSONでデータを返してきて、yahoo!ショッピングXMLでデータを返してくる。(たぶんyahoo!JSONでも返すよう設定出来るけどなんかよくわからなかった)

また、それぞれのデータの内容も異なるので、商品名とか値段とかURLとか必要そうなものにだけ絞って新しいJSONオブジェクトに配列で追加して行った。

以下のコードがそのあたりの処理

var datas = {
          service:[],
          name: [],
          url: [],
          images: [],
          price: []
}
request(options, (error, response, body) => {
          if(error){
                  console.log(error)
          }else{
                  var parsedResult = JSON.parse(xml2json.toJson(body, opt))
                  parsedResult.ResultSet.Result.Hit.forEach( (hit) => {
                          datas.service.push("yahoo")
                          datas.name.push(hit.Name)
                          datas.url.push(hit.Url)
                          datas.images.push(hit.Image.Medium)
                          datas.price.push(hit.Price.$t)
                  })
          }
})

クライアントに返すJSONオブジェクトについて、そのときは何も考えずに一つのオブジェクトにそれぞれvalueが配列になっているkeyを設定し、クライアントはループ回すとかして全部にアクセスする見たいな形式にしてあるけど、

今思えばそれぞれの商品ごとに個々のオブジェクトに分かれてないの意味分からない。すごく使いにくそうな気がする。

こういう設計のところとかは明らかに経験不足というか、考えの浅さとかが露呈しててつらい。

もっと頭使えって話だけど、コツとかあったら教えてほしい。

実際にそのあたりが開発中に問題にならなかったのは、5日間の間でクライアントがリクエストを送るところまで実装するのに至らなかったから。

たぶんここでリクエスト機能が間に合ってて使いにくい!ってことになったらめちゃ焦ってたと思う。

もっと経験積もう。もっと頭使おう(反省)

ブランチ壊した話

インターンではgit flowを使うよ!と事前に言われていて、ブランチをしっかり分割して開発するよう指示されていたのだけど、ブランチを切って開発するという経験が自分にはなかった。(にもかかわらず碌にその辺を予習してなかった。)

インターン期間の夜中にQiitaの関連記事とか見てよくわからないながらブランチ作ったりした結果が上に貼ってあるリポジトリ。(自分のコードだけ新しくリポジトリつくってpushしようかと思ったけど戒めとしてあげておく。)

謎にDesktopからディクレクトリが分かれているのは別にDesktopをそのままpushしたわけではなくて、元々express_practice2という名前でpushしたものの、名前が適切じゃないから変えようと思って後からローカルで勝手にリネームしてpushしたらそうなった。というかそうなるらしい。

対策としてはgit mvか何かのコマンド(何かは忘れてしまった)で名前の部分を変更するとかすると上手くいくらしい。

ちゃんとした修正方法は別の記事で備忘録として書くと思う。

まとめ

ハッカソン形式で突貫開発すると一気にわからないことが出てきたり、発見することがあったりと忙しいのでこうやって忘れないうちにメモすることが必要。たぶんもう時間があいてるから書こうと思って書き忘れてることもあると思う。できればその日の晩に書けたら良いと思った。

あと反省は次に活かしたい。

感想的な記事はまた別で書くかもしれない。