F@N Ad-Tech Blog

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

ミニ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日間という短い期間でしたが、全体としてとても満足のいくインターンでした。 ありがとうございました。

文系学生がデータサイエンティストを体験した結果

はじめまして。9月3日から9月7日まで5日間のインターンをしていたはなわです。
大学では経済学を学んでおり、プログラミング、統計、機械学習については基本的に独学です。

この度は株式会社ファンコミュニケーションズでデータサイエンティストを体験するというインターンに参加したので、それについて振り返ろうと思います。

インターンの内容

今回のテーマは広告をクリックしてくれる割合を予測するというものでした。
ここでいう広告とは、スマホアプリとかで遊んでいると下であったり、上であったり、時間制限つきで全画面に表示されるようなアレです。

ところで、スマホアプリの広告をミスクリック以外でクリックする人なんているんですかね?という問題提起をしようと思いましたが、私自身、3日程前に気になった広告をクリックしてました。しかし、長い時間スマホを使い、その中で広告をクリックしたことが何回あったでしょうか。私の場合は1年で10回クリックするかどうか程度ではないかと思います。
このようにごく稀にクリックする広告であるからこそ、今回のデータ分析は非常に大変なものでした。この分野だからこそなのですが、データの分布に偏りがあるとそのデータの分布自体を修正しなければならないとは思ってもいませんでした。

また、今までに触ったことのない膨大なデータを分析するため、データを読み込むだけでとても長い時間を費やしました。
私が触ったデータはビッグデータではないのかもしれませんが、これ以上のデータを扱うとは社員さんたちおそるべしです。

5日間で実施したこと

それでは、実際にどのようなことをやっていたかということを書いていこうと思います。

データ加工

5日間のインターンということですが、インターンの課題説明やあいにくの台風の影響などで実作業としては4日程度になります。
データサイエンティストは「業務の80%をデータクレンジングに費やす」という言葉がある通り、実作業の4日間のうち、ほとんどの時間がデータを加工する時間でした。
そもそものデータ加工のプログラムを書く段階でエラーが幾度となく発生したりで、本当にインターン期間の80%をデータ加工に使用していたのではないかと思います。
これほどまでにデータ加工に真剣に立ち向かったのは、初めてでした。

それでは、今回学んだデータ加工の手法を具体的に挙げていきます。

1.そのままデータを持ってくる。
一番簡単なデータ加工です。(これはデータの加工といっていいのでしょうか?)
しかし、これでもそのデータが使えれば問題なしです。 使 え れ ば 。

2.データを数字で分類。
例えば、月曜日を0、火曜日を1、……、土曜日を5、日曜日を6とするようにデータではなく数字で分類する手法です。これをLabel Encodingと言うようです。
ただ、この状態だと数字の大きさに意味のないデータの場合、不都合が生じてしまいます。

3.ダミー変数への加工による分類。
これも同様に曜日を例にあげると月曜だけ1を他の曜日は0とするように、1つの項目だけ1とし他は全て0と分類する手法です。これをOne Hot Encodingと言うようです。
もちろんこの手法にも問題があり、種類が1万あった場合、1個の1と9999個の0を入れるなどと、ただでも大きなデータがさらに大きくなってしまいます。

4.Count Encordingによる特徴量の変換。
これも比較的シンプルな手法で、データに含まれるカテゴリ変数の出現回数を数える手法です。
この手法を使用したのが初めてだったため、どう利用していいかわかりませんでしたが、メンターさんのサポートによりちゃんと理解することができました。

手法によって、どのときに使うのがベストなのかも今回学べたのではないかと思います。
今回学んだのは、この4つの手法ですが、もちろんこれ以上に様々な手法がありますので、今後も学習を続けたいと思います。

(余談ですが、今まで一番英文を読んでいたのは大学受験期に英語を集中的に学習していたときだと思うのですが、その時と等しいかそれ以上の英文を読んだような気がします。英語を読む力、体力も必要だと思いました。)

プログラミング

8割をデータ加工に費やし、残りの2割は機械学習を利用したモデル作成及び、精度検証のためのプログラミングをしました。

過去に学んだ際には、書かれているコードを写経しただけで、実際にどのような処理が行われているのかについては一切考えていませんでした。
(正確には、考えた瞬間に頭がショートして何も考えられなくなりました。)
今回は、統計について学習を行なっていたこと、予めデータ分析入門のテキストが渡されていたこと、
そして都度メンターさんが教えてくれたこともあり、以前よりは理解できるようになり、手法という観点からも考えられるようになったと思います。
0か1かを判別するということが基本であったため、期間中はロジスティック回帰を用いた分析をしていましたが、この記事を書きながら、最後に一つ、別の手法を使って機械学習の処理しています。
また、精度検証については決定係数を今まで使っていましたが、それ以外にも多様な検証方法があるということを教わり、Log Loss、normalized entropyを用いた検証を行いました。
この normalized entropy を計算する関数のプログラミングを行ったのですが、意味を理解していないとコードを書くこともできないと実感しました。
また、今回のデータには0と1で偏りが存在したので、バランスを修正したデータを検証に使いました。

これを書いているまさに今、先ほどの機械学習の処理が出たわけですが、期間中ずっと使っていたモデルよりもはるかにいい精度が出ました。
色々な機械学習の手法を学ぶことでより精度が出せる訳ですね。

社内の様子

インターンの内容はもちろん大切ですが、インターンの目的のもう一つには社内の様子を見るということもあります。
そこで私なりの社内の様子についての感想を一つ。

すごく作業がしやすい


このように思う理由としては四つ。
1.社内の雰囲気がいい。
静かすぎないという点とかは個人的によかったですね。
怒号が飛んでいるとか、社員さんたちが私語をしているというわけではなく、互いに相談しながら、笑いながら作業をしていたというのは外からきた私にとってはかなり居心地がよかったです。

『 寂 し が り な 訳 で は な い で す 』

2.質問を気軽にできる。
私のデスクの隣が今回指導をしてくれたメンターさんのデスクだったので、すぐに質問をすることができました。また、必要そうな資料を教えてくださったり、こちらから質問しなくても定期的に確認をしてくれたのはすごくありがたかったです。
また、そのメンターさんがデスクにいない場合であっても、Slackで質問をすると他の社員さんが答えてくれたりと私たちをサポートするという点では完璧であったとさえ思います。

『 コ ミ ュ 障 な 訳 で は な い で す 』

3.デスクの高さが変えられる。
私はこのタイプのデスクを初めて使いましたがすごいですね。高さが変えられるということは姿勢を調整できるということでもあり、このようなずっとパソコンに向かって作業をしていると同じ姿勢で疲れてしまうということがあります。家でも使いたいと思うほどに素晴らしかったですね。
私は可動範囲の最低まで下げて作業をしていました。この方が背筋が伸びて肘もつけられ、姿勢という観点からの疲れはなかったように思います。

『 背 丈 が 低 い 訳 で は な い で す 』


4.ノートPCの他にディスプレイが一枚使える。
パソコンを使うときにモニターが一つの人には想像できないことかもしれませんが、マルチモニターの人には理解していただけると思います。モニターが二つあるということは非常に作業しやすいです。
作業はメインモニターに、資料などすぐには使わないものをサブモニターに映すことで作業に集中できます。全て一つのモニターで行おうとすると画面が散らかって、気が散ってしまう私にはとてもよかったです。
ちなみに、私のサブモニターは常に六つ以上のウィンドウが開かれていました。

『 整 理 下 手 な 訳 で は な い で す 』

しつこいですか?
すみませんでした。

結論

初日は説明していることの半分程度の意味がわからず、このまま一週間大丈夫か?と胃が痛くなりかけましたが、わからないことにぶつかった際には詳しく説明をしてくださったため、徐々に意味もわかり、最終的には大方理解できたのではないかと思います。思っています。思わせてください。
上記の通りの素晴らしい環境であり、他では得られないような密度の高い5日間だったため、興味のある方にはオススメなインターンだと思います。
文系の私でもどうにか学んでこれたため、(大変かもしれませんが)やる気さえあれば多くのことを学べます!

5日間本当にお世話になりました!

1週間でFlutterを使ってアプリ開発させていただいた話

こんにちは。初めまして。
9月3日〜9月7日までの5日間で1週間インターンでお世話になりました澤です。

1週間のインターンの内容を紹介させていただきます。

F@Nにたどり着くまで

何社もインターンに応募しましたが、実力不足でなかなか決まらずに焦っていた矢先
偶然、WantedlyでF@Nの募集サイトを見つけ応募させていただきました。
運よく拾っていただいたので非常に感謝しています。

1日目

入社書類をたくさん書いた後、アドネットワークとは何かの説明を受けました。
今まで、何気なくアプリなどの広告を見ていましたが、裏ではこんなドラマがあるのかと非常に感動しました。
アドネットワークの世界は奥が深いのだと感じました。 

今回私は、nendSDKのチームにお世話になりました。
1日目は、nendSDKを理解するために、簡単な時計アプリを作成しました。
公式ドキュメントが充実しており、短時間で非常に簡単に広告を埋め込むことができて、感動しました。

 f:id:fan_k_sawa:20180907143901p:plain

今後アプリを開発した時は、是非とも広告を入れてみたいです。

2日目〜5日目

さて、ここからが本題です。
今回、定期テストの範囲を共有できるアプリをFlutterとFirebaseを使って作成しました。
 

Flutterとは?

Googleがオープンソースとして提供しているクロスプラットフォーム開発ツールです。
簡単に言えば、1つのコードで、iOS、Android両方のアプリを作れちゃう優れものです。
開発言語は、Dartという言語を使います。
僕の感想としては、Javaに似ている印象です。

Firebaseとは?

こちらもGoogleが提供しているモバイルアプリ開発のためのプラットホームです。
通常実装しようと思うと手間と時間がかかるユーザ認証やデータアクセス管理などを
簡単に実装することができる優れものです。
今回のアプリでは、リアルタイムデータベースを使用しました。
文字通りリアルタイムにデータベースを更新できるので、非常に便利でした。

2日目

テスト範囲共有アプリの大まかな構造とデザインを決めました。
Flutterとは何かということから、調べながら進めていきます。
また、FlutterとFirebaseの導入もしました。
FlutterもFirebaseもやらなければならない設定が多くて大変でした。
初めてのFlutterでのアプリ開発で慣れないことだらけでしたが、徐々にDartの作法などに慣れていきたいと思いました。

3日目

若干デザインを変更しつつ、
Firebaseを用いてテスト範囲を共有できる簡単なチャットのような機能を実装しました。
FirebaseとFlutterの連携は難しかったですが、様々なサイトを参考にしながら進めていきました。
また、この日はAndroidのエミュレータだけでなく実機でも正常に動かすことができました。
Dartに触れるのが初めてなのですが、Dartの作法などがJavaとは少し違い悪戦苦闘しました。
ドキュメントなどで調べながら慣れていきたいと思います。

4日目

アプリケーションのUIの細かな修正を入れつつ、全科目に対応できるよう機能拡張しました。
また、iOSのエミュレータでも動作することを確認しました。
今までAndroidのみでデバッグしてきましたが、iOSでも同じものが簡単に動きクロスプラットホーム開発の凄さを実感しました。
Flutterってすごい!
ただ、前日同様、Dart言語の作法に悪戦苦闘し、多くの時間をかけてしまいました。

5日目

複数科目のテストに対応できるように機能拡張し、科目詳細を表示できるようにしました。
また、テスト範囲共有ページで、一度投稿したものを編集できるようにもしました。
Flutterは、日本語の文献が少なく悪戦苦闘しましたが、無事編集もできるようになって嬉しかったです。

5日間で作ったアプリ

以下のようなリアルタイムでテスト範囲の共有ができるアプリを作りました。
5日間で、一通りの機能をつけることができました。iOSでもAndroidでも動きます。

まず、アプリを開くと、どの時期のテストなのかを聞かれます。
 f:id:fan_k_sawa:20180907181048p:plain

その後いくつかのステップを踏んで、科目一覧が表示されます。
 f:id:fan_k_sawa:20180907181213p:plain

科目を選ぶと、チャット形式で試験範囲や科目の情報を共有することができます。
 f:id:fan_k_sawa:20180907181604p:plain

コメントをタップすると編集画面になり、編集を行うことができます。
 f:id:fan_k_sawa:20180907182139p:plain

やり残したこと

投稿の削除機能の追加

編集はできるけど、削除はできないので、今後追加していきたいです。

日本語の表示がおかしくなる

Android、iOSで実行すると文字が中国語っぽくなってしまいます。
Flutterの仕様のようなので、改善されるのを待ちます。

ログイン機能の追加

現在は、誰でも読み書き可能な設定にしているので、セキュリティ的に問題が残ります。
Firebaseを使って簡単に実装できるそうなので、今後実装してみたいです。

などなど更に実装を進めていきたいです。

まとめ

今回のインターンでは、初めて一からアプリ開発を行いました。
インターン前はとても不安でしたが、1週間やり遂げることができてよかったです。

自分のやりたいことを比較的自由にやらせていただいたので、非常に感謝しています。

メンターの方には、Flutterを使った開発を行なったことがないにも関わらず、
Flutterでの開発を勧めてくださったり、レビューまでしていただいて感謝の気持ちでいっぱいです。
質問にも的確に答えてくださり、開発を効率よく進めることができました。
nendSDKが使えないアプリになってしまい申し訳ないです。

社員さんも皆優しく接してくださり、非常に居心地がよかったです。

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

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

PythonによるSSP構築インターン!!

こんにちは、8月27日~8月31日の1週間インターンに参加した、みしまです!!

インターンの課題は、SSP構築でした。サーバ構築など研究以外の技術を学びたいと思い、今回のインターンに参加させて頂きました。

インターンの詳細は「目的・目標」、「概要」、「成果」、「まとめ・感想」の順で書きます。

目的・目標

今回、インターンでの個人的な目的・目標を以下に示します。

  • サーバ構築ができるようになる
  • バックエンドの技術を学ぶ

概要

インターンの課題はSSP構築でした。構築に利用したWebサーバやフレームワークなどを以下に示します。

Flask

Flaskは、Djangoより軽量で自由度が高い特徴があります。
課題ではSDK-SSP、SSP-DSPのやり取りにはjsonファイルのみだったので軽量で扱いやすいFlaskを利用するのが良いと思いました。

Gunicorn

Gunicornは、Python製のWSGIサーバの一種です。WSGIサーバはWebサーバとWebアプリケーションの間を最適化するためのものです。 FlaskはPythonで構築を行うためGunicornが適しています。

Nginx

Nginxは、メモリ使用量の少ない高速なWebサーバです。並列処理で負荷分散が可能になっています。SDKからのアクセスが多くなった時に1つのサーバでは処理できません。そのため、Nginxでアクセスを複数のサーバで処理するために利用します。今回はメモリの関係上、2つのSSPを構築しました。


システム全体を図に示します。

f:id:fan_t_mishima:20180903180053j:plain

成果

作成したシステムのパフォーマンスを確かめるために「1秒で処理できるリクエスト数」を指標として、値が大きいほどパフォーマンスが良いことを示します。
検証として以下の4通りの状態でパフォーマンスの変化を測りました。
①Nginx・Gunicornなし
②Gunicornなし
③Nginx・Gunicornあり・プロセス
④Nginx・Gunicornあり・スレッド
①~③はSSPから複数DSPにRequestsを送る際の並列処理をプロセスで行い、④ではスレッドで行いました。結果を以下に示します。

f:id:fan_t_mishima:20180903211741j:plain

結果から並列処理をプロセスからスレッドに変更した際に大幅にパフォーマンスが向上しました。両方の違いとしてスレッドは1つのプロセスで並列処理を行います。プロセスは同じプロセスを生成して、並列処理を行います。そのため、スレッドはCPU使用率が低いためパフォーマンス向上に繋がりました。

まとめ・感想

「目的・目標」に示したサーバ構築ができるようになりました。サーバ構築にはインタプリタ言語であるPythonを使用しました。これを並列処理が得意なコンパイラ言語にすることで、さらにパフォーマンス向上に繋がると考えられます。個人的にコンパイラ言語でサーバ構築をしようと思います。
 バックエンドの技術「Nginx」、「Gunicorn」は、研究では使わないため貴重な経験ができて良かったです。
最後に、サーバサイドの技術を多く学ぶことができてすごく楽しいインターンとなりました。
1週間、本当にありがとうございました。