F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8のエンジニア・技術ブログ

楽しいインターン SSP

おはようございます!!
3月25日から29日までの5日間インターンシップに参加させていただきました瀬川です。
楽しいインターンです!!
もう一度言います。楽しいインターンです!!

内容

Mini-SSPサーバの開発

1週間の振り返り???

1日目(初日)

初日ということもあって、入社書類等の提出書類の処理、社内見学?探検?、アドテク(DSP,SSP等について)の説明などなど。
自分はもともとSSP、DSPに興味があったのでSSP、DSPがどういうものかある程度知っていましたが、丁寧にDSP、SSP等について説明していただけるので全く知らない人でもわかりますし、自分も詳しいところまでは知らなかったので、詳しい中身まで理解して開発を行えます。 そのあとMini-SSP開発にあたって、言語選択から開始(ここで8~9割1週間の苦しみ具合が決まる)。
残り時間もあまりなかったので、残りは環境構築が主でした。

環境

OS - CentOS 7 (Centかubntでどちらでもいいと伝えたら、Centになった)
たぶん言えば別のOSでもやらせてくれるじゃないかな?・・・知らんけど

言語 - Scala (2.12.7) (最新版を使いたくないある程度安定版使いたい派なので、バージョンがちょっと古いのは許してくだせう) Scala触ったことなかったので挑戦を兼ねてScalaを選択

ビルドツール? - sbt (1.2.8)

エディタ - emacs (宗教戦争をするつもりはないです・・・でも、emacsのほうがいいですよですよね?)

のちにこのemacsが悲劇を生むことをこのときは知るよしもなかった・・・

[オススメ言語一覧]

  • c++
    dspとかssp用のライブラリーがある。並列処理をそのライブラリーでやってくれるので脳死で書ける。処理速度も早い。C++使ってる会社もある。
  • scala
    純粋に並列処理(リスト処理)が楽。処理速度も早い
  • python
    簡単に書ける。処理速度は遅い。
  • golang
    ゴルーチンは神。ゴルーチンとチャンネルのおかげで並列処理楽。処理速度はそこそこ速い。
  • Rust
    並列処理がいいんじゃない?・・・知らんけど
  • erlang
    並列処理向けの言語だから並列処理に向いてる。erlang使ってる会社も多い。
  • Assembler !? 高速通信ならアセンブラでしょ??できるのかわからないけど・・・
  • nginxモジュール !? Webサーバ本体が処理したらそっちのほうが早いに決まってんじゃんwww(誰もやらないだろう・・・)
  • Shell オススメはしてない。できそうだけど、速くはないと思うよ・・・ でも、誰かやってみてほしい。。。

余裕ある人は変わった言語で試してもらいたいなぁ|ω・`)

2日目

実装内容の確認

SDK -> SSP -> DSPの流れでリクエストが送られる。
そのレスポンスとして、DSP -> SSP -> SDK で送られる。

f:id:fan_h_segawa:20190411183414j:plain 

scalaが初めてで、sbtも初めて・・・
sbtのことをよくわかっていなかった。

とりあえず、リクエストを受けて、レスポンスを返すというものを作ったが・・・
ライブラリのエラーでずっと動かない!!
でも、コンパイル時ではエラー出てない!?
ずっと試行錯誤を繰り返していた。。。

3日目

ライブラリーのエラーで動かないという話をScalaのできる人に聞くと・・・
ででーん!!!!!!!!!!!!!
そもそも実行コマンドが間違っていた!!

sbt はコンパイルするためのツールと思っていた私( ́・ω・ )
sbt compileでコンパイルしたあとにsbt run で実行するんだってさ(;´Д`)
sbt compileでコンパイルしたあとに scala hogeで実行しようとしてた。。。
scala hogeでもできなくはないが、ライブラリをsbtで用意しているから当然scalaのライブラリの方にはないよね・・・
当然といえば当然なんですよね・・・

とりあえず、リクエストが送られて来るとレスポンスを返すようにできた。

4日目

3日目までに単一の処理しか実装できていないため、SDK,SSP,DSPで流れるようにしようとしたら、関数の使用時に別の関数を使用しろとエラーが起きていたが・・・

エラー内容がよくわかん( ́・ω・ )

時間かかっても自分で限界まで考えたいマンの僕は無駄に時間を消費した。。。(ただコミュ症なだけ)

そうここでemacsでの悲劇だったのだ。
ここまでサーバ上の素emacs(no package)でやったきたため、どれが関数かパッとわかりにくいのである!!

結果、IntelliJで開発することにした(最初からそうしろ!!)

IntelliJで書きだしたら、見える見える関数がどれか見える!!!!!!!!! コーディング速度がめっちゃ上がった。

Javaはやってたが、eclipseでやってたので知らなかったがIntelliJめっちゃいいね♥ ここまでScalaが嫌いになりかけていたが、なんとか持ちこたえたのである。

5日目(最終日)

IntelliJのおかけでなんとかSDK->SSP->DSP->SSP->SDKと流れるに動作するよにでき、 複数台DSPに対して、リストで処理するようした。 でも、残念なことにDSPからのレスポンスをSSPで受け取り、1位のDSPに勝利報告をするところがよくわからず時間内には実装しきらなかった・・・・・(帰って自宅鯖で完成させた)

感想

昇降机など自分にあった物理的開発環境を整えることができるのは長時間働く上ですごく大事だなと思った。高さがあってなければ、腰や首、目などに多大な影響を与えるため働き安い環境であると思った。 ただ、正直オフィス内の温度は暑かった・・・・ 大体のオフィスがそうなんだろうが、夏は寒く!!、冬は暑い!! ここだけは本当に辛かった。 ただ、それ以外に不満はなく本当に自由にできる最高のインターンでした。 ありがとうございました!!!

GoでSSP構築をやってみた

こんにちは。
3月25日〜3月29日までの5日間、インターンでお世話になりました澤です。
9月にもSDKインターンでお世話になりましたが、今回またお誘いをいただき、今度はSSP構築インターンに参加させていただきました。

課題

課題は、SSP(Supply Side Platform)を構築するというものでした。
よくWebサイトを閲覧したり、スマホでゲームをやったりする時に広告が出ていると思います。
Webサイトにその広告を配信しているのがSSPです。

簡単に言えば、SSPとは、Webページに広告を掲載したいという時に、いい感じに処理して、広告を配信してくれているサーバのことです。

前回、SSPやDSPに関する説明を受けた時に、アドネットワークの世界にはこんな物語があるのかと感動した記憶があるので、今回SSPというアドネットワークの一部に触れることができる課題で非常に楽しみにしていました。 

5日間の流れ

1日目

いくつかの書類を書いて、会社についての説明を受けました。
そして、今回の課題についての説明を受け、課題をスタートしました。
僕自身サーバサイドのプログラムの経験は乏しいのでとても不安なスタートでした。
どの言語で書くかを自由に決められたので、Goを使うことにしました。
理由としては、
・比較的速度が速い
・並列処理に強い
・ライブラリなどが充実していて書きやすい
というのが主な理由です。

ネット上の記事を参考にしながら、何となくですが触りの部分は実装することができました。

2日目

Go言語を書くのも初めての経験だったので、非常に苦戦しました。
 
例えば、このような構造体があったとします。
 

type DSPRequest struct {
	ssp_name     string
	request_time string
	request_id   string
	app_id       int
}

何とこのままでは、他のパッケージからアクセスすることができないのです。
他のパッケージからのアクセスを有効にするには、以下のように要素の初めの文字を大文字にしないといけないのです。

type DSPRequest struct {
	Ssp_name     string
	Request_time string
	Request_id   string
	App_id       int
}

Javaのようにpublicをつけるという訳ではないので、知った時は目から鱗でした。
これに気づくのに2,3時間かかってしまい、非常に痛いミスでした。

SSPの話ではなくGo言語の話になっていますが、Go言語の仕様に悩まされつつSSPの構築を進めました。
サーバサイドのプログラムだけでなく、Go言語の学習にも繋がったので良かったです。

3日目

SDKからSSPにアクセスし、SSPからDSPに広告を要求し、その結果である広告のURLをSDKに返すという一連のSSPの処理を完成させることができました。

Goもサーバサイドも初めてで苦労しましたが、何とか形にはできて嬉しかったです。

ソースコードが読みづらかったので、少し綺麗にしようと試みました。
しかし、結果10行程度の削減にしかならなかったので、もう少しコンパクトに書けるように訓練していきたいと思いました。

4日目

この日はローカルの環境ではなく実際のサーバ上で動くかどうかを確認しました。
結果、サーバ上でも動作したので良かったです。

また、DSPから100ms以内に返事がもらえないときにタイムアウトする処理の実装を忘れていたので実装を行いました。
しかし、タイムアウトの実装が非常に難しく一日行いましたが、終わりませんでした。
ネット上で色々探して、実装してみましたが、どれも上手くいきませんでした。

やっぱりGoはあまり好きではないと感じたので、時間があれば他の言語でも書いてみたいと思いました。
(あるいはサーバサイドのプログラムが好きではないのかもしれない)

5日目

引き続きタイムアウトの実装を続けて、昼前には何とかそれっぽいものが完成しました。
良いか悪いかは別として、チャンネルを使いこんな風に(取得する値の数次第では、修正する必要あり。)書いてみました。(全体像はこちら

ch := make(chan string)
for i := 0; i < 1; i++ {
	go func() {
		Request_id, Url, Price, err = communicateDSP(url, dspRequestJson)
		ch <- "ok"
	}()
}

// タイムアウトを設定する
timeout := time.After(100 * time.Millisecond)

for i := 0; i < 1; i++ {
	select {
	case result := <-ch:
		fmt.Println(result)
	case <-timeout:
		err := errors.New("timeout")
		return "", "", 0, err
	}
}


書いたものの、不安定なので、それからもどうしたらいいのだろうかと考えてました。
負荷をかけてみても結果はよくありませんでした。

色々後悔することはありますが、レビューをいただいて、ブログを書いてインターン終了しました。

まとめ

今回、実装したコードはGitHubに公開しているので興味のある方は是非ご覧ください。
github.com

初めてGo言語を触ったので言語仕様にもなれず非常に苦戦しましたが、良い経験になったと思います。
また、サーバ構築を本格的にしたのも初めてだったので勉強になりました。

時間がなくて取り組めなかったことや後悔していることとしては、

・捌けきれない量の通信が来てもいいように作成したプログラムの前にnginxなどを置くこと
・コードが綺麗ではなかったり、無駄なところ多かったりしたので綺麗に書きたかった
・もう少しサーバサイドの知識やGo言語の知識を身につけてインターンに臨みたかった
・英語が苦手だが、英語から逃げずに英語の文献やページも読んで実装したかった
・分かりやすいログを出してどこで詰まっているのかを明確にして取り組むべきだった

といったところです。

最後に

インターンを受け入れてくださり、ありがとうございました。
会社の雰囲気もよく、非常に過ごしやすい1週間でした。
特に机の高さが自由に変更でき、立っても座っても作業できるのは新鮮で良かったと思います。

メンターのy_kawasakiさんをはじめとしてサポートしていただいた社員の皆さんありがとうございました。

非常に楽しく自分のペースで進めていくことができたので、おすすめです。

F@Nのインターンに応募するか迷っているのなら、ぜひ応募することをおすすめします。

5日間という短い期間でしたが、ありがとうございました。

サイトの分類を機械学習で予測する(MeCab + TF-IDF + Word2Vec)

こんにちは!5日間インターンに参加させて頂いた中島です。
昨年の夏に続き2回目の参加となりました。
前回はCTR予測を行いましたが、今回は自然言語処理をテーマにサイトの分類を行いました。
tech-blog.fancs.com

なぜサイトの分類を行うのか

ユーザーに合わせた広告を配信することは、収益をあげる上で重要です。
サイトを訪れるユーザーに合わせた広告を配信するためには、サイトの傾向を掴み分類する必要があります。
人間が目視で確認すればタグ付けできますが、何億件もあるサイトに適切なタグを1つ1つ付けるのには限界があります。
そこで機械学習でよしなにやってしまおうという訳です。

今回の目標

与えられたサイトのurlデータからそのサイトが広告に適したサイトかどうか(違法サイトかどうか)を2値分類する。

手法

サイトには様々な情報があります。

  • 画像
  • 動画
  • テキスト
  • リンク

今回は与えられたurlからサイトをスクレイピングし、得られたテキストデータを特徴量として分類モデルを作成しました。

データ概要および取得方法

データは以下の通りです。

  • urlからスクレイピングし得られた約1000件のテキストと広告に適したサイトかどうかのタグ。
  • タグは人力で違法サイトかどうか判断してつけられたもの。
  • 1000件のうち、違法データは約20件。

スクレイピングにはRequestsBeautiful SoupというPythonライブラリを使用しました。

特徴量の作成と実験

得られたテキストに対して形態素解析およびTF-IDFをして特徴ベクトルに加工し、大きく3段階に分けて実験を行いました。

  • 1. テキストに対して形態素解析、TF-IDFする
  • 2. テキストに対して形態素解析、TF-IDFし、オーバー及びアンダーサンプリング
  • 3. 2に加えてWord2Vecにより作成した特徴量を追加

尚すべてロジスティック回帰を用いて分類し、結果は混同行列で確認、評価にはF値を使用しました。

1. テキストに対して形態素解析、TF-IDFする

まずは、最も基本的な手法を試しました。以下2つはこちらの記事で詳しく触れられています。

形態素解析とは
日本語の文書から形態素(意味をもつ表現要素の最小単位)に分割する分析手法。
今回はMeCabを用いて、辞書にはネット用語に対応したmecab-ipadic-NEologdを使用。

TF-IDFとは
ある文章において、ある名詞がどれだけ重要かを特徴ベクトルとして数値化すること。
ある文書でよく出てくるが、他の文書であまり出てこなければ、その単語は重要という感じ。
これによって作られた特徴ベクトルを分類器に投げます。

32件のテストデータに対し,分類器の予測結果は以下の通り
f:id:fan_k_nakashima:20190329161743p:plain

混同行列は次のように読みます。

モデルの予測結果
違法である 違法でない
実際のタグ 違法である 0 6
違法でない 0 26

結果から、すべて違法でないと判定するモデルになっていることが分かります。
これは違法サイトのサンプル数が極端に少ないためです。
天気予報でいえば、「今日雷が落ちるかどうか」を当てろと言われた時に「落ちない」と答え続けば高確率で当たりますよね。

多少間違えたとしても、違法サイトを検出したいため、特徴量作成の工夫を考えます。

そこで、訓練データの違法サイトの数と違法でないサイトの数を調整します。

2. テキストに対して形態素解析、TF-IDFし、オーバー及びアンダーサンプリング

オーバーサンプリングとは
少数派のデータをもとに不足分のデータを補完する方法。
SMOTE(synthetic minority over-sampling)というライブラリでかさ増ししました。

アンダーサンプリングとは
少数派のデータ件数に合うように多数派データからランダムに抽出する方法。
違法でないデータを10分の1に削減しました。

また、TF-IDFにおいて単語の出現頻度を設定しました。
これによりほとんど出現しない単語の特徴ベクトルを作成しないようにし、より重要な特徴量に注目します。

分類器の予測結果は以下の通り
f:id:fan_k_nakashima:20190329164134p:plain

少しだけ当てられるようになったことがわかります。
まだ外しているサイトがあるため、どんなサイトの分類に失敗しているのか確認しました。
主観ですが、違法サイトは大きく2つに分類できます。

  • アダルトサイト
  • 漫画、動画などの違法ダウンロードのサイト

どうやら違法ダウンロードのサイトの分類に失敗しているようでした。
それは訓練データのTF-IDFの重要度にも表れていました。

順位 名詞
1 考察
2 ワンピース
3
4
5
6 ちゃんねる
7
8 ネタバレ

?はすべてアダルトワードのため自主規制

上の表は違法サイトだと分類するのに重要だとされている単語を上位から並べたものです。
アダルトワードは正しく検出されましたが、マンガタイトルなども上位にきてしまっています。

実際に違法漫画サイトと合法な漫画サイトを見比べてみましたが、使われている単語の大きな差はあまり無かったです。
そこで単語の出現頻度だけではなく、単語同士の類似度にも注目してみることにしました。

3. 2に加えてWord2Vecにより作成した特徴量を追加

Word2Vecとは
Word2Vecとは文章中の単語を任意の次元のベクトルに変換します。
類似語のベクトルをベクトル空間にグループ化することで単語同士の演算や単語の類似度の導出を可能にします。

TF-IDFでの特徴量に加えてWord2Vecで作成した特徴量も加えます。

分類器の予測結果は以下の通り
f:id:fan_k_nakashima:20190329175938p:plain

まだ少し外していますが、違法ダウンロードサイトも一部分類できるようになりました。
精度向上の理由の考察は深められていませんが、TF-IDFでは拾いきれなかった特徴量が拾えているようです。

まとめと感想

3つの手法のうち,1,2日目で1を,3日目で2を,4日目で3をし,5日目は考察とまとめを行いました。

  • MeCab + TF-IDF + Word2Vec でそれなりの特徴量が作成可能
  • 不均衡データにはサンプリングが大事

今回はテキストデータだけに注目しました。加えて画像データやリンクの数などにも注目すると、より精度が向上すると期待できます。
機会があれば画像処理なども取り入れていきたいと思います。

最後になりますが、メンターのkawasakiさんをはじめ、社員の方々にはお世話になりました!
聞きたいことを聞きつつ自分のペースで伸び伸びやらせて頂きました。
5日間ありがとうございました!

ミニSSP作ってきたん

02月18日〜02月22日までファンコミュニケーションズで1週間のインターンでお世話になりました福田です.

何やったん?

ミニSSP作りました. githubにコードあげてます.興味あったらどうぞ

1日目

SSPとDSPがどんなものかを教えていただきました.正直,教えていただくまでSSPがなんなのかいまいち理解できていませんでした. 「SSPってなんなん?」って人はぜひ参加して見てください.理解できると思います.

その後,どの言語で作るかを決定しました.私はgolangで開発しようと決めました.

なんでgolang選んだん?

選んだ理由としては3つです.

  • コンパイル言語だから実行速度がそこそこ速い
  • ビルド後一つの実行ファイルにできて扱いやすい
  • 最近流行ってる

言語を選んだ後は仕様書を渡されて開発に入りました.初日は開発環境を揃えて,少しgolangのコードを書きました. 仕様書に関しては他のインターン生が上げてくれているので省略します.

1日目の感想として

  • 現状エラー無視しているのでどうにかしたい

2日目

本格的にgolangで開発してました.困ったこととして,golangでの数値->文字列, 文字列->数値の処理で結構悩みました.
単純には変換してくれないんですね....勉強になりました. この日から新たにdockerを使い始めました.理由としては開発効率をあげるためです.dockerの可搬性を利用して,サーバと開発環境との差異をなくせるようにしていました.

2日目の感想として

  • docker使うと可搬性が上がる
  • goの型変換辛い
  • goのjson辛い

3日目

静的言語の辛いところや,golangの恩恵にあやかりながら7割くらい実装できました.
サーバにデプロイして実際に動かしてみたところ,まぁまぁできている.エラーも所々でているが,とりあえずレスポンスは帰ってきている状態でした.
実際に大量のアクセス負荷もやってみました.ツールはvegetaを使いました.

3日目の感想として

  • docker使うと可搬性が上がる
  • gitのコミット100超えた

4日目

この日は,ほぼリファクタリングしてました.リソースを効率よく使うためにcadvisorも入れてみましたが,特にメモリ容量も1G超えることなく,よく捌けてたんじゃないかなと思ってます.golangのおかげですね.

4日目の感想として

  • git難しい
  • docker難しい
  • goroutine難しい
  • cadvisor入れるとコンテナ単位でリソースを見てくれる

5日目

綺麗とは到底言い難いコードのリファクタリングをやりました.golangで捌ける量を超えているような気がしたので,golangの前にnginxを置くように改修していました.結果できず....悔しい.
ちなみにnginxを前に起きたかった理由はgolangでリクエストを受けきれなくなった時に適切に返したかったからです. vegetaでリクエスト量を増やしていくとステータスコード0のタイムアウトが目立つようになってきました.そこでnginxで受けてgolangに流すことができればとりあえずタイムアウトは減らすことができるのではないかと考えてnginxを前に置くように変更してました.

感想

めっちゃ良かったです.
プロの方にレビューをもらいながら,作業する経験はなかなかできないので,技術の向上になったのではないかと考えています.
スタンディングデスクめっちゃ良かったです. 5日間という短い間でしたが,ありがとうございました.

楽しいインターン

初めましての方は初めまして、そうじゃない方はおはこんばんちは、酒匂(さこう)です。

2月18日〜2月22日の5日間、SSP構築インターンに参加しました。 特に凝ったことも書けないので、つらつらとインターンの記録を綴ろうかと思います。

5日間の流れ

1日目 事務手続き → ウェルカムランチ → 環境構築 → SSP開発 → 卓球

インターン初日ということで、ガチガチに緊張しながらオフィスに入りました。

午前中は事務手続きとインターンで使用するPCのセットアップ、その後ウェルカムランチということで、社員の方々と昼食を食べながら歓談しました。 うにいくら丼、美味しかったです。

午後はローカルの開発環境を整えて、早速SSP開発を始めました。 言語に関しては、PythonかGoならサポートしてもらえるとのことだったので、触ったことのあるPythonを、フレームワークはFlaskというPython用のシンプルなWebアプリケーションフレームワークを選択しました。 初日の作業はSDKからのリクエストを受信するところまで作って終了。

卓球サークルがタイミングよく活動日とのことで、せっかくの機会なので退勤後に参加させてもらいました。 普段あまり体を動かすことがないので、久しぶりに運動できて最高に楽しかったです。 また機会があれば、マイラケットを持ってきて参加したいと思います。

2日目 DSPのモック作成 → 並列処理 → タイムアウト処理 → sudoers破損

2日目ということで、出社にも慣れた酒匂さんはバッチリ優雅にオフィスに入りました。
嘘です。バリバリ緊張しました。

午前中はDSPのモックサーバーを作りました。 これに関してはSSPの処理を7割くらい流用したのでサクッと終わりました。

午後は並列処理やらタイムアウト処理やらUbuntuの環境構築やら色々やりました。 sudoersに誤った設定を記述してsudoが使えなくなったのは良い思い出です。

3日目 Dockerチャレンジ → サーバー構築チャレンジ

若干筋肉痛の残る足を引きずりながらオフィスに入りました。

午前中は「サーバーサイドは触ったことないし、せっかくだからDockerを使ってみよう」と思い、Dockerで色々やってました。 が、なかなかうまいこと構築できず、SSP自体の構築の方に時間を割いた方が良いだろうと判断し断念。 最終的に断念せざるを得ない状況になったのは心残りです……。 そのうち自分のPCで色々遊んでみようと思います。

午後からはメンターの方が用意してくれたDSPのモックサーバーを叩くために、SSPのサーバ構築に挑みました。 NginxやらGunicornやらの設定がうまくできなくてかなり苦労しましたが、良い経験になったように思います(川崎さん、その節はどうもありがとうございました)。

4日目 パフォーマンス改善 → Elixirに移植

4日目は流石に慣れてきて程々に緊張しながらオフィスに入りました。

HTTP負荷テストツールのVegetaを使いながら、今回作ったSSPのパフォーマンス改善をしました。 ほとんどリクエストが捌けない状態からスタートしましたが、メンターの方に色々助けてもらいながらカーネルパラメータ(net.core.somaxconnとかTIME_WAITとか)をいじったりして、まぁ少しくらいはリクエストを捌けるようになりました。

ここまででSSP構築が一段落ついたので、Elixirに移植してみることにしました。 数日間かけて作ったSSPも一度作り終えて慣れてる状態だと数時間で完成したので、成長を実感しました。 Pythonより楽に作ったのにPythonのときと数倍以上性能に差があって苦笑しました。 言語ごとの得意不得意でここまで顕著に差が出るんだなぁと思いました。

退勤後はメンターの方々と一緒に↓のイベントに参加しました。

logly.connpass.com

色々と面白い話も聞けてよかったです。 また東京に来る機会があれば参加しようと思います。

5日目 事務手続き → フィードバック面談 → ランチ → ブログ執筆

最終日、連日の疲れが溜まっていたのか、若干寝坊しました。 一応寝坊しても間に合う時間に目覚ましはかけてましたが、ホテルにスマホを忘れて取りに帰ったりした関係で渋谷駅に着いたのが9:57。 全速力でオフィスまで駆けつけた酒匂さんは無事間に合いませんでした。 反省。

午前中は事務手続きとフィードバック面談、その後ランチに連れて行ってもらいました。 最終日ともなると流石にメンターの方々とも打ち解けて色々と楽しくお話できました。 フィードバックもとても丁寧で嬉しかったです。

午後はElixirに移植したSSPのパフォーマンス改善しながら本ブログ記事を執筆してました。 普段アウトプットする習慣がないので、なかなか新鮮で意外と楽しかったです。

成果物

拙いですが一応リポジトリ貼っておきます。

github.com

github.com

まとめ

アドテク業界は全然知らなかったので、こっち方面のインターンは新鮮でした。 初めてサーバーサイドに触れたので、色々と苦労することも多かったですが、社員の方々がフレンドリーでオフィスの居心地が良く、一週間楽しく開発できました。

5日間という短い期間でしたが、全体としてとても満足のいくインターンでした。 ありがとうございました。