F@N Ad-Tech Blog

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

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週間、本当にありがとうございました。

アドテクの会社でCTR予測をしてみた。

はじめまして!5日間インターンとして参加させて頂いた中島です。
データ分析のインターンは初めてだったのですが、簡単に紹介させて頂きます。
今回はCTR予測を行いました。

CTR予測

CTRとは「ユーザに広告を表示しクリックされる確率」を言います。
広告配信の最適化は、限られた広告予算の中でクリック率を最大化することであり、そのためにはCTRを正しく予測することが不可欠です。
この5日間で、より精度の高いCTR予測をするモデルの設計に取り組みました。

5日間の流れ

1日目 事務処理と大規模データベースへのアクセス

午前には事務手続きをし、その後アドテクについて教えて頂きました。

本格的に業務が始まったのは午後から。
まず、CTR予測をするためのデータの取得をします。Treasure Dataに接続し、SQLを用いて必要なデータを取り出しました。ここで、はじめてPrestoに触れました。

なんとなくSQLが書けるようになったら、今度はjupyter notebookから接続し、データをローカルの環境に引っ張ってきます。

広告のリクエスト数が1億以上あったため、
データをうまくサンプリングしないとカーネルが落ちて大変でした。

引っ張ってきたデータを眺めながら、広告のクリックされる確率の低さ(0.5%くらい?)に驚きつつ1日目を終えました。

2日目 データ整形とネガティブダウンサンプリング

この日は昨日とってきたデータの整形とネガティブダウンサンプリングを行いました。
ネガティブダウンサンプリングとは、意図的に負データを減らすことで、正データとの比を揃えることです。
今回のCTR予測ではクリックされない広告のリクエストを100分の1程度に減らしました。

その後欠損データの修正などデータハンドリングを行い、ロジスティック回帰を用いて学習しました。

モデルの評価に使うのはAUC, LogLoss, NEの3つ

AUC Area under the curve 予測した際のROC曲線の下側部分の割合。大きいほどよい。
LogLoss Logarithmic Loss 予測値と正解との距離を対数とった値。小さいほどよい。
NE Normalized Entropy モデルにより予測されたLogLossを、平均から予測されたCTRのLogLossで割った値。1より高いと平均から予測した方がまし。

それぞれの違いは今回メンターについてくださったsakaiさんの記事を参考にしてください。

tech-blog.fancs.com

3日目 特徴量の追加とグリッドサーチ

2日までは限られた特徴量のみを使っていたのですが、3日目から特徴量を増やしました。

そしてグリッドサーチを用いてロジスティック回帰モデルのパラメタチューニングを行いました。

が、大して成果が出ることはなくこの日は悲しみの帰宅。

4日目 他の学習モデルを試す

3日目まででロジスティック回帰に限界が見えてきた(個人的な特徴量エンジニアリング力不足)ので、他の手法を試してみることにしました。
今回試したのがLightGBMです。
Welcome to LightGBM’s documentation! — LightGBM documentation

LightGBMはXGBoostなどと同じ勾配ブースティングの一つです。
XGBoostと同程度の性能でありながら、より高速で機械学習コンペなどでもよく目にすることから使ってみました。

ワンホットエンコーディングなど色々勝手にやってくれるのでとても楽(特徴量エンジニアリングとは、、)

5日目 特徴量選択とパラメータチューニング

昨日試したLightGBMのモデルのスコアを上げるため、もう一度使用する特徴量を見直すことにしました。
LightGBMには訓練データのそれぞれの特徴量の重要度を測るメソッドがあるので、それを用いて特徴量の選別を行いました。

f:id:fan_k_nakashima:20180831182033p:plain
特徴量名は伏せてますが、こんな感じで可視化できます。

その後特徴量を選択し、簡単なパラメタチューニングを行った最終的な結果がこちら

f:id:fan_k_nakashima:20180831182110p:plain

訓練データ:2018年7月1日~31日のログ
テストデータ:2018年8月1日~7日のログ

学習モデル AUC LogLoss NE
XGBoost 0.71 0.0326 0.9557
LightGBM 0.74 0.0320 0.9391

同時に試したXGBoostのスコアも載せてあります。
スタッキングなどをすればもっと上がったんでしょうが、5日間ということもあってここでタイムアップ。
NEが0.9391なので平均から予測するよりは良いモデルになってくれました。

まとめと感想

  • LightGBMを用いてそこそこ精度の高いモデルができた
  • ビックデータのハンドリングはサンプリングが大事

まともにデータ分析を行ったのは初めてでしたが、メンターのsakaiさんが丁寧に教えてくださったおかげで全体の流れがみえました。
レベルに合わせて教えて頂けるので、聞きたいことを聞きつつ伸び伸びやらせて頂きました。
生データを使ってデータ解析をしたい人、自分のペースに合わせて進めたい人にはとても良いインターンなのではないかと思います!
5日間お世話になりました!

SSP構築インターンに参加してきた

初めまして、森です。
8月20日~24日の5日間、SSP構築インターンに参加させて頂きました。
一緒に参加した倉林くんは日記形式のブログでした。
インターンの詳細なレポートにつきましてはそちらを参照して頂けると幸いです。
tech-blog.fancs.com

私はこのインターンに参加しようか考えている人に向けて書きたいと思います。

はじめに、結論から申しますと

めっちゃオススメのインターンです!!

サーバサイドの開発やアドテク業界に興味のある方は、是非参加を検討してほしいと思いました。

内容も勿論ですが、交通費や宿泊費についても殆ど全て支給して頂けるので、私のように遠方の学生でも安心です。
どうやら、私は特別選考枠に合格したようです。

内容

SSP (Supply-Side Platform) を少し簡単な仕様にしたMini-SSPの開発インターンです。
Mini-SSPをざっくりと説明すると、『広告のリクエストを受けて、DSPに広告の入札リクエストを投げて、最も入札金額の高い広告をレスポンスとして返すサーバサイドのプログラム』です。
開発したMini-SSPは最終的には、用意して頂いたSDK(広告をリクエストする部分)、DSPでテストします。

開発言語はかなり柔軟に対応して頂けるようでした。
今回私は、オススメして頂いたこともありScalaを選択しました。なおScalaは未経験の模様。かなり難しくて苦労しました

日程は5日間。
初日は入社書類の記入や社内案内、SSPに関するイントロダクションが主でした。残った時間で開発をしますが、開発環境は殆どまっさらな状態から始まるため、実際には開発環境を整えるところから始まります。
2日目~4日目はすべて開発に時間を使うことができました。
5日目は本番環境でテストをする日……

だったのですが、私は3日目の夜に食べたご飯があたったのか、胃腸炎になりダウン。
後になって分かったのですが、4日目の実習中に見舞われていた関節痛は、寝違えたのではなく胃腸炎の炎症に由来するもの?だったそうです。まさに馬鹿は風邪をひかない
インターン中はとても充実していて楽しかった分、悔いを残しての幕引きとなってしまいました。二度と炙りサーモンは食べない。

オフィス

オフィスは東京都渋谷区の青山ファーストビル4F。
通りに面していて、駅からも遠くない、コンビニや食事処が近くにある好立地でした。
とても綺麗なオフィスで、コーヒーやお茶などが飲み放題、オフィス中央には社員の人が補充した軽食などが置かれていました。
お茶の飲み放題がとても良かったので、作業に疲れたら気分転換にお茶を汲みに行っていました。

オフィスの机は自動昇降機能付きの机で、高さを調整する機能付きでした。
オフィス内にはこの机を高くして立って業務に取り組んでいる方もおられました。

ファンコミュニケーションズさんの社員の皆さん

社員の皆さんはとても気さくで優しい方ばかりでした。
Scalaらしいコードの書き方についてアドバイスを頂いたり、親身になって一緒にデバッグして頂いたりと、お世話になりっぱなしでした。

まとめ

  • 学生に合わせた柔軟な実習
  • かなりガッツリ開発を体験
  • 社員さんが優しい

いいところばっかりの紹介になってしまいましたが、本当にいいところばっかりのインターンシップでした。

いろいろ助けて頂いてようやく完成させることができたMini-SSPをテストすることができなかったのは悔やまれますが、とても充実した4日間でした。
知らないことづくめでしたが、様々な新しいことに挑戦することができ、とてもいい刺激になりました。
これを読んでいる貴方の参加する一助となれば幸いです。

謝辞

実習中は色々と教えていただきました。
とても良い経験になり、沢山の刺激を受けることができました。
この場をお借りしてお礼を申し上げたいと思います。
ありがとうございました。

また、最終日には関係者の方々に多大なご心配とご迷惑をおかけしてしまいました。
今ではすっかり元気になりました。
まだまだ残暑の厳しい季節ですので、ご自愛ください。
生ものには要注意です。

1週間のデータ分析インターンを終えて

こんにちは.
F@Nさんの1週間インターンに参加した にしかわです.
インターンで行ったこと、感じたことを書こうと思います.

インターンに参加した理由

・就活イベントでお話させて頂いた時に社員の方が自社のシステムについて楽しそうに話していたので、自分もこんなエンジニアになりたいと思ったから.
・興味のある分野のインターンだったから.

何をしたのか

CTR予測をしました.
アドテクノロジーについて無知だったため、メンターの方にシステムについて丁寧に教えて頂きました.

SQLにつまずく

社内でのデータベースから特徴量を抽出する際に、SQLを使用しました.
アプリを作る際にちょこっと使ったぐらいのスキルだったので、1日目はほぼSQLにつまずきタスクが進みませんでした.

特徴量のエンコードにつまずく

性別・IDなどはone hotする必要があるので、LabelBinarizerというsklearnのメソッドを使いました.
なぜかエンコードできず、ほぼ1日悩んでいました.
原因がデータがfloat型だったことだと気づいた時は、発狂しそうでした.

ロジスティック回帰を使い、CTR予測

sklearnのLogisticRegressionを使用しました.
精度確認するため、ROC曲線、AUC値、Logarithmic Loss、Normalized Entropyという指標を使いました.
詳しいことはこちらを見てください.
https://tech-blog.fancs.com/entry/ctr-prediction-model-evaluation

カーネルとpcが落ちる

初日はjupyter notebookのカーネルが落ちるたびに驚いていましたが、1週間で普通のことだと悟りました.
しかし、pcが落ちるのは絶望ですね...
ダウンサンプリング大事

k-meansで新しい特徴量を作ってみる

特徴量の種類が少ないことが問題ということなので、既存の特徴量を用いて新しい特徴量の作成に挑みました.
サイトIDを使い、クラスタリングを行ってラベルを抽出しました.
以下が結果です.
campaign_id,frequencyを適用
AUC = 0.6726877465581093
Logarithmic Loss = 1.4451557532902062
Normalized Entropy = 2.700788250592528

campaign_id,frequency + 作成した特徴量
AUC = 0.6678840993331718
Logarithmic Loss = 1.366609496859506
Normalized Entropy = 2.6290588331512277

ちょっとよくなってる!

作成した特徴量の傾向を眺める

f:id:fan_a_nishikawa:20180831181154p:plain
gender 1は男性、2は女性を表しています.
クラス1は男性が多くて、2は女性が多いことがわかります.
サイトIDから性別をちょっとだけ予想できることを発見しました.

まとめ

とても良い環境でインターンをさせてもらえた

わからないことだらけでどうなることやらと思っていましたが、メンターの方が丁寧に教えてくださったので、なんとかタスクを進めることができました.
もくもくと作業したい時はほっといてくれるので、自分にとってとても作業しやすい環境でした.
あと、隣の席のインターン生がとても優秀だったので、色々教えてもらいました.←良い刺激になりました!

つまずくことが多かったですが、その分技術力を身につけることが出来ました!
メンターのt_sakaiさん、y_kawasakiさん、面倒を見てくださったa_uchidaさん、ランチに連れて行ってくださった社員さん、本当にありがとうございました.