nend・新規事業のエンジニア・技術ブログ2019-09-24ファンコミュニケーションズのインターンに参加しました!インターンはじめまして!京都で技術補佐員をやっている林と申します(秋から院生になります笑)。今回は、9月9日~13日の1週間で、ファンコミュニケーションズで「広告配信システム(DSP)の構築」というインターンに参加させていただきました。このブログでは、インターンの参加までの流れから、インターンの内容や感想について書いていこうと思います。1番最初に面談をしてもらえたことがかなり記憶に残っています。このサポーターズでのイベントをきっかけに「そもそもアドテクって何?」「広告配信の裏側を知りたい!」と思い、このインターンに応募しました。オンライン面接での選考が行われました。一度インターン参加確定になったのですが、私的な諸々の都合で日程をずらしていただき、9月9日から無事に参加させていただけることになりました。前日から東京で宿泊していました。インターン中の宿泊先は外苑前という駅にあるホテル(神宮球場の目の前)だったのですが、そこが大変綺麗だったので、前日から一人でテンションが上がっていました笑。インターンの内容インターンの内容は、PHPを使ってminiDSPを構築する、という内容でした。最初は、「DSP???」という感じでしたが、初日に広告配信の仕組みを解説してもらい大枠を理解することが出来ました。SSP」とかでググると良い記事が沢山出ると思います。SSPからのリクエスト(「Aというメディアが広告欲しがってるよ」、SSP)に対し、そのメディアの広告枠を買う金額を予測し(ここは対象外、ML)、最適な広告を決定して返す(「私たちはこの広告をこの値段で出すのが良いと思います」、DSP)という処理を実装しました。深夜に台風が関東を直撃した日だったので、会社には出社出来た数人しかいませんでした(運良く地下鉄は動いてた)。午前中は、書類の手続きと社内見学、SSP・DSPの説明、PCのセットアップ等がありました。ランチは、入社して数年目の若手社員の方々と食べました。午後は、メンターの人とオンラインで挨拶をした後(電車が動かなかったらしい)、仕様の説明や技術選定、開発のスケジュール等を話し合い、実際に開発に取り組んでいきました。言語はPHPだったので素のPHPでも良いかなと思ったのですが、とりあえずAPIを光速で作りたいなと思ったので、自分が慣れているLaravelというフレームワークを使用しました。その他、選定したものは以下になります。2NginxFluentdこれらを全てDockerにのせ、Docker-Composeで立ち上げられるようにしました。その後、今回のAPI作成で関わるモデルのDB設計をして、実際にAPI作成の途中までを行いました。Docker化には以下の参考サイトが非常に役立ちました!qiita.com2日目2日目はひたすらAPIを作っていきました。リクエスト毎にMysqlに接続するのは無駄な処理なので、Predisを使ってRedisにキャッシュさせるようにしました。DSPサーバーからMLサーバーへリクエストをする必要があるので、Guzzleを使用してリクエストを送るようにしました。MLサーバーを立ててないことに気づいたので、Slim4という軽量のフレームワークを使って簡易的に立てました。(Laravelばっかりでもね・・・)メディアタイプや金額でフィルタリングをする必要があるのですが、それはLaravelで使われているCollectionクラスで実装しました。インターンの課題に含まれていた、イベントに対してログを出すという仕様も実装しました。(Laravelは便利!)結果として、2日目で仕様に書かれていたAPIやログは一応全て実装できました!!3日目コントローラーに処理を殴り書きしていたので、関数に切り出す作業を行いました。運用を考え、1つのRedisで書き込みと読み込みを行うのは負荷が高くなるので、書き込み用のRedisと読み込み用のRedisに分けることにしました。(世に言うmaster-slave構成です)3日目のお昼は社内で食事をしましたが、昼以降はとあるイベントのため帰宅となりました。(3日目の午後は、私は渋谷に行ってカラオケと本屋で楽しんでました笑)4日目4日目は、Redisのmaster-slave構成を終わらせ、AWS上でメンターに用意してもらったSSPとの連携を行いました。その後に、速度計測をすると想定よりも遅かったので、速度改善にシフトしていきました。具体的に行ったことは、不要な処理を削除し出来るだけデータ操作回数を減らしたのと、Slim4をLumenというフレームワークに変えたことです。これとは別に、ログをFluentdで集約するように設定しました。仕様を満たしていない箇所があったので(ログにmsecを残す部分)、そこを修正しました。AWS上で動いているかを最終確認し、発表のためのスライドを作成していました。発表には多くの社員さんが来ていただき、無事に終えることが出来ました。その後は、このブログ記事を書いて終わりです・・・。広告全体の仕組みやその裏側の仕組み等、アドテクの基礎が理解出来るようになったと思います。実際の技術や仕組み等も見ることができ、自分でもminiDSPを作ることが出来たのは大きな収穫だったなと思います。Lumen)にも触れられたので大変良かったです。会社自体で言うと、とてもフレキシブルな会社だなと思いました。リモートで作業している社員さんが多いだけでなく、出勤・退勤時間も裁量労働制なのでかなり自由です。自分に合った働き方が出来る会社で素晴らしいなと思いました。メンターさんについてですが、かなり優しく接して頂いたという印象です。技術的なことからサービス的なことまで、色んな質問に答えていただき非常に勉強になりました。まとめインターンに行くことで会社の中の雰囲気を感じ取ることが出来て非常に良かったと思います。アドテク自体への興味もかなり深まったので、個人的には最高に良かったインターンだと思いました。12:00Tweetもっと読むコメントを書く2019-09-20ネット広告CTR予測業務体験記インターンデータ分析コースのインターンシップに参加させていただいた大庭です。今回はデータサイエンティストとしての働き方を間近で体感するためにインターンに応募しネット広告のCTR予測について5日間取り組みました。CTR予測とはネット広告が表示される流れとして、ユーザがサイトに訪問したときに広告リクエストがアドネットワークに送信されます。そのリクエストに含まれる情報により、広告主側が入札金額を決定し、その入札に勝った広告主の広告がサイトに表示されます。このとき、広告主側は当然クリックの確率が高いユーザへ広告を流したいので、リクエストに含まれる情報から広告が表示されたときのクリックの確率を予測するというのがCTR予測です。本記事では2~4について言及していきます。データを特徴量に変換するDBから取得したデータを予測に役立ちそうな形式(特徴量)に変換します。DBにtimeと呼ばれる広告が表示された時刻を記録したデータがある場合、hourのような時間帯の情報に変換したり、土日か平日かなどに変換するといったことが挙げられます。貰った処理例から変数を減らすなどを検討しました。特徴量をモデルに入力し、学習させる2で変換した特徴量を機械学習のモデルに入力、学習させます。モデルには主成分分析ロジスティック回帰を用いました。カテゴリカルな変数が多く入力次元数が数千となったため、主成分分析で次元圧縮を行い、ロジスティック回帰に入力しました。5%を残すランダムサンプリングをしたのですが、それでも膨大なデータが残っていました。ハイパーパラメータの探索にOptunaを用いました。データしかないので、適切な評価指標を定めにくいという問題があります。そこで、予測確率と正解ラベルのないクリック確率の近さを測るキャリブレーション精度により評価します。(こちらの記事をご参照ください。期待キャリブレーション誤差の結果、私が改良した処理の結果の方が誤差が小さいですが、キャリブレーションカーブを見ると対角線から離れたグループがより見受けられる結果となりました。深くは検証していませんが、貰った処理例で使われている変数を減らしたのと、主成分分析が結果に出たかなと思っています。12:00Tweetもっと読むコメントを書く2019-09-19本番サーバを止めてみたよ。某マッチングイベントで仲良くなり、5日間のインフラ系インターンに参加させていただいた。大阪の専門学生で、しがないWebエンジニアをやっています。インフラは素人に毛が生えた程度にしか分かりません。インフラ系のインターンを選んだのか今まではWebを中心にやってきましたが、自分のスキルの幅を広げたかったからです。何をやったのか端的に言うと、本番環境で動いているサーバを止めてみました。それに至るまでにサーバの構成や役割、ユーザからのリクエストがどう流れているか等を調べ、最終的に「止めても問題ない」と判断できたサーバを止めました。技術的な話インフラの細かい構成の話とかをすると怒られそうな気がするので、代わりに技術調査メモをいい感じにまとめてここに貼り付けておこうかなあと思います。sysctlsysctlはLinuxカーネルのパラメータを確認したり変更したりできるコマンド。カーネルの再構築が不要で、コマンドで動的に動作を変更できる。systemctlsysctlと似ているが別物。systemctlはsystemdを操作するコマンド。サービスのステータスを確認したり、設定したりできる。7からはsystemdが採用されたためsystemctlを使うようになった。journalctlsystemdの動作している環境では、標準のログ(≒ジャーナル)収集・格納サービスとしてjournaldが用意されている。