F@N Ad-Tech Blog

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

クリック数の異常検知

こんにちは、株式会社ファンコミュニケーションズで8月6日から8月10日までインターンをしていた桐畑です。
クリック数の異常からシステムなどの異常を検知できないかというインターンをやったので、それについてとインターンの感想などを書いていこうと思います。
ブログはほとんど書いたことがないので、読みづらいかもしれませんが、ご了承ください。

1. 異常検知とは

基本的に3つあり、それぞれ外れ値検知、異常部位検知、変化点検知のことを異常検知と言います。
・外れ値検知
突発的なおかしい値を検知するもの
例) 一瞬だけサーバーのネットーワークが切れたなど
・異常部位検知
異常な値がある程度の長さ連続して起こっているのを検知するもの
例) アップデートをしたがミスがあり、再び修正したなど
・変化点検知
ある時点以降時系列の特徴が変わってしまう時点を検知するもの
例) テレビに出て、知名度が急激に上がったなど

今回はあまりそれぞれを区別せずに異常なものをなんでも検知しようという試みでした。
アプローチとしては、機械学習的なアプローチと統計学的なアプローチがあり、今回は統計学的アプローチを用いました。
細かい手法は以下を参考にしました。
異常検知と変化検知 9章 部分空間法による変化点検知

2. 結果

0時の日付が変わるタイミングでのスパイクを除けば、検知したい4つの異常のうち3つを見つけることが出来ました。
4つ異常でないものも検知してしまっていたので、適合率= 3/7、再現率= 3/4ということになります。

スパイクは以下のようなもので、これと異常値を区別するのが物凄く大変でした。
正直、最終的にもあまり出来ていないです。
0時にクリック数が急激に多くなるのは、漫画アプリとか色々なアプリのポイントなどの更新が0時だからなのかなと思ってます。

f:id:fan_m_kirihata:20180810174742p:plain

3. 実際にやったこと

FacebookのProphetというライブラリを使ってモデルを組んで、残差が大きいところを異常とみなしました。
なので、より良くデータにfitしているモデルを組むことが重要です。
Prophetでは、
 y(t) = g(t) + h(t) + s(t) + \epsilon_t
という式でモデルを推定します。
g(t):トレンドを表す関数
h(t):周期性を表す関数,
s(t):イベントの効果を表す関数
 \epsilon_t:誤差項

クロスバリデーションなんかで変数選択をして誤差を見てみるとこんな感じになりました。
yが実際の値(Box-Cox変換はしている)、yhatが推定値、residualが残差です。
f:id:fan_m_kirihata:20180810182142p:plain

異常なところで誤差が大きくなりました。
ただ、スパイクのときと区別がつきにくいです。
f:id:fan_m_kirihata:20180810182147p:plain

1次の自己相関を入れていたせいで、異常な値をすぐに補正してしまっているのだと思い、
1次の自己相関の項のみ移動平均で平滑化してみました。
すると、スパイクと異常部で残差の連続度に違いが出ました。
f:id:fan_m_kirihata:20180810182410p:plain
f:id:fan_m_kirihata:20180810182413p:plain

なので、残差が大きいところが連続するかどうかで異常を判定するとそこそこ上手くいきました。

ただ、スパイクの影響はまだまだ出ているので、その辺は今後の課題かなと思います。
あと、長い期間の異常も見つけられなかったので、それはどうしたらいいか時間がある時にでも考えてみようと思います。

4. 感想

インターンをするのは初めてなので、他のところとは比べられないですが、全体的に来てよかったなと思います。
良かったなと思ったところを2つ紹介したいと思います。
1つ目は、会社がすごく自由だったところです。僕は結構縛られるのが嫌なので、好き勝手やらして欲しいタイプなのですが、本当に好き勝手やらせてくれたので、すごくやりやすかったです。時系列の研究をしているので、それに関係する内容をやらせてもらえたし、やり方も特に指定されずにやらせてもらえたので、色々知識がついて良かったです。
2つ目は、データサイエンティストの仕事がどんなものか知れたことです。データサイエンティストという名前は良く聞くのですが、業務としてどのようなことをやっているのか謎だったので、それが一部でも知れたことは良かったなと思います。データをひたすら眺めて、おかしなところを探すのは凄く大変でしたが、いい経験でした。

スパイクに苦しめられた時は大変だなと思いましたが、全体的には楽しくて、色々な経験が出来たインターンだったなと思います。
ありがとうございました。

IT用語辞典アプリの作成とnendSDKによる広告表示

こんにちは、はじめまして。

8月6日から8月10日の1週間、ファンコミュニケーションズさんでインターンに参加しました、ししどです。

このインターンでの活動について綴ろうと思います。

なぜ、インターンに参加することになったか

 6月の中旬に東京で行われた「逆求人フェスティバル」に参加しました。
就職活動サイト[逆求人ナビ] 就活セミナー 2021年卒,2020年卒,2019年卒,2018年卒, 就職活動 逆求人フェスティバル

 そこで、ファンコミュニケーションズの社員の方とお会いしました。ファンコミュニケーションズさんの名前は知らなかったのですが、nendというサービスがあることは知っていました。社員の方からお話をきき、nendSDKを導入するインターンを行うことを知りました。

 私はもともと、スマートフォンアプリを趣味で作っていたのでこのインターンに非常に興味を持ちました。

 後日インターンの詳細メールを頂き、参加することを決めました。
 特別選考枠に合格したため、交通費や宿泊費等の補助が出、遠方住みの私には非常にありがたいお話でした。

インターンで何をしたのか

 大まかにやったことはこの3つです。

  • 作成済みのiOSアプリにnendSDKを導入、ネイティブ広告を表示
  • IT用語辞典アプリを新規作成
  • IT用語辞典アプリにnendSDKを導入、ネイティブ広告を表示

 以下は各日の詳細です。

1日目

 午前中はアドネットワークに関する大まかな仕組みについて教えて頂いた後、1週間の課題を設定しました。

 午後は自分が作ったiOSアプリにnendSDKを導入しました。バナー広告は既にこのアプリに実装していたので、動画ネイティブ広告をリストの一番上に表示される様にしました。

f:id:fan_t_shishido:20180810155718p:plain

2日目

 iOSアプリへのnendSDKの導入の残り作業を少しやった後、新たに作成するAndroidアプリの仕様を確認しました。新たにアプリを作るアイディアは特に持っていなかったので、社員の方が事前に考えておられたものを作ることになりました。IT用語の一覧が閲覧できるというアプリで、最低限実装する内容は以下の様な感じです。

  • WikipediaのAPIを使って「プログラミング用語一覧」を取得、リスト表示
  • リストの用語をタップ → WebViewの画面に遷移して詳細を表示
  • nendSDKを使って広告を組み込み

 これ以外にも単語のお気に入り機能など、付加機能をいくつか考えていましたが、期間的に実装できる量は限られるので、余裕があればやることにしました。Androidアプリを作成するための言語はKotlinを選びました。JavaでAndroidアプリを作成したことはあって、Kotlinも少し触ったことはあったので、せっかくなので新しい方のKotlinで作ることにしました。

 この日に出来たのは、プロジェクトの作成と使用するライブラリ等の導入、Wikipediaからプログラミング用語一覧をJSONで取得することでした。

 まだ、使ったことのないアーキテクチャを利用してみてはと、社員の方から参考文献やこんな技術があるというのを教えて頂きました。リアクティブプログラミングやDataBindingなど、目を通してみましたが、自分の技量ではすぐに開発に利用するのが難しいと思ったので、とりあえず、やったことのあるやり方で実装しました。余裕があれば、新しいアーキテクチャも取り入れたいと思いました。

3日目

 Wikipediaから取得したプログラミング用語一覧はJSONで取得した後、パースする必要がありました。スクレイピングは上記のiOSアプリでも利用していたので、特に戸惑うことはなかったです。あとは、ListViewに取得した用語一覧を表示して、用語の詳細を表示するWebViewを作成しました。用語一覧と詳細の画面はどちらもフラグメントとして作成したのですが、遷移の処理がうまく出来なかったので、アドバイス頂いた結果、詳細画面はActivityとして発行することに決めたところで、3日目が終わりました。

4日目

 詳細画面をアクティビティとして発行させて遷移するように実装しました。用語を選択すると、その用語のWikipediaのページが表示されるようになりました。あとは、1日目にやったのと同じようにnendSDKを導入して、用語一覧の一番上の行にネイティブ広告が表示されるようにしました。あとは、細かなところだと、用語一覧をあかさたなでセクション分けされるように処理を追加しました。

5日目

 用語一覧のセクションヘッダやタブの色、行の間隔などデザインの調整を軽く行って、アプリの実装作業としては終了にしました。
 残った午後の時間は1週間のフィードバックと今後についてお話ししたあと、この記事を作成しました。
 
 最終的に出来上がったアプリのスクリーンショットです。

f:id:fan_t_shishido:20180810170228p:plain
f:id:fan_t_shishido:20180810170236p:plain

感想、所感

 1週間、非常にあっという間でした。メンターとして面倒を見てくださった福岡さん、他社員の皆さんありがとうございました。自由に自分のやり方で作業を進めることができたので、とても居心地の良い空間でした。ランチにも毎度誘って頂き、お話ができたのでとても楽しかったです。nendSDKを実際に組み込むことで、どのようにして広告をアプリにあった形で表示するかを知ることができました。1週間の作業としてはいくつか心残りもありますが、インターンに参加できたことをとても感謝しています。

tcpdumpをGolangで作成しながら低レイヤに触れた

はじめまして!F@Nでバイトをしている友人からの誘いにより4月から2ヶ月間インターンで来ていた島仲です。
今回は、このインターン(通称:何でもインターン)でしたことの紹介とファンコミュニケーションズさんでインターンをしての感想を紹介します。

  • 制作物の紹介
  • 実装から得られたこと
  • 実装で躓いた所
  • 今後の課題
  • インターンの感想

制作物の紹介

タイトルにもある通りtcpdumpというキャプチャツールをGolangを使用して再実装してみました。
github.com

目的

・低レイヤの実装について理解を深める

具体的に行ったことは、外部パッケージの使用を極力控えて実装できる部分は最も低い部分から調べ、実装する形をとりました。主にGo側からシステムコールを叩いて実装しています。わからないところは外部パッケージのソースコードを読み、紐解いていきました。

差別化

ただtcpdumpを再実装するのは車輪の再発明なため、独自の機能を実装したりしました。

機能

・キャプチャ機能
・Pcapファイルの読み書き
・フィルタリング
・ブリッジキャプチャモード(差別化を図った所)

実装から得られたこと

バイナリの扱い方

・パケットの生データ(バイナリ)の扱い方に慣れた。
・Wiresharkなどで扱われるpcapファイルの仕様について理解できた。

システムコール

カーネルの機能を使用したい時には、システムコールを発行する。
また、同時期にDPDKを勉強していたのでカーネルを介した割り込み処理などに関しても詳しく知ることができた。

キャプチャ

・パケットをキャプチャする際のタイプやオプションがあることを知れた。
・フィルタの実装がkernelに実装されていることを知った(BPF)。

アライメント

・他アーキテクチャへの対応は時間の都合上できませんでしたが、アライメントなどを実際に意識する部分をコード・リーディング中に見ることができた。

実装で躓いた所

f:id:fan_y_shimanaka:20180715170421p:plain
BPF(Berkeley Packet Filter)を使用したパケットフィルタリングを実装するには、フィルタから写真のようなレジスタマシンの配列を生成しソケットにアタッチしなければならないのですが、このレジスタマシンの生成方法がわからず最終的に
github.com
を使用することになってしまいました。(できれば自分で実装したかった…)

今後の課題

・BPFの実装を読む(カーネルコードリーディングになるのかも…)
・UIの作成を行う

今後の目標

インターンを通して、ますます低レイヤ部分に興味が湧いてきたので、システムプログラミングとまでは行きませんが知識をつけ低レイヤ沼に溺れて行きたい所存です。

インターンの感想

技術的な感想

このインターンを通して、改めて理解を深めるためには自分で実装してみるのが大事だと言うことを実感しました。

全体的な感想

オフィスを初めて見学させてもらった時は割と自分の想像してた雰囲気(人も含めて)だったのですが、2ヶ月間のインターンで社内イベントやランチなどに参加させてもらったりと想像を超えるアットホームさでした(笑)
最終日には全体会議での発表にも参加させてもらい、このインターンを通して会社がどう動いているかなどを少しは感じ取ることができたと思っています。
貴重な体験ありがとうございました!

F@NでWebサービスを開発するインターンしてきました

 こんにちは、1月から2月末まで株式会社ファンコミュニケーションズでインターンをしていた浦野です。現在は同じくファンコミュニケーションズでアルバイトをしています。
 私はファンコミュニケーションズさんがWantedlyにて「会社を使って『これ作りたい』『あの技術に挑戦したい』を実現したい人を募集! 」と題している通称(?)「なんでもやっていいインターン」に参加してきました。おそらく他社ではあまり見かけないユニークなインターンシップではないでしょうか。このブログ記事では私がこのインターンで実際に制作したものと、インターンを通じた感想を紹介します。

  • 制作物「日報アプリ」について概略
  • 実装詳細
  • インターン感想

制作物「日報アプリ」について概略

 私がインターンで製作したものは「日報を編集・投稿したり、閲覧してコメントをつけることのできるWebアプリケーション」です。今回はファンコミュニケーションズさんで実際に使われているフレームワークや設計を参考にするために、Play FrameworkなどのWebフレームワークは使わずに、Finchというルーティングに特化したマイクロフレームワークを使ってWebAPIのみを提供し、SPA(Single Page Application)でクライアントを実現する方法をとりました。インターンではこのうちWebAPIの実装をしました。システム全体ではだいたいこんな感じです。

f:id:fan_r_urano:20180314181611p:plain
システム概観

実装詳細

 設計は実際の業務コードの一部を見せて頂き、それに沿って設計をしました。そのため多くのWebフレームワークが採用しているMVCではなく、DDDに基づいた設計になりました。といってもDDDに準拠して作ったわけではないので"なんちゃって実装"が多分に含まれています。
 設計のレイヤー図は以下のようになります。

f:id:fan_r_urano:20180314181600p:plain
レイヤ図

 上から見ていくと、RouterはFinchを使ったルーティング部分で、ControllerはServiceとRouterを結ぶ部分です。Serviceは業務ロジックを司る部分ですが、今回のアプリケーションはあまり複雑なことはしていないので規模的にはかなり小さいです。その下にはDBと接続するRepositoryがあります。

 Serviceが一部突き出ているのはWebサーバのセッション部分の実装です。Finch/Finagleにはセッションの機能は搭載されていないので、今回は独自に実装することにしました。JWTという選択肢もありましたが、ここはある程度慣れている技術を使ってコスト削減を目指しました。と言っても一から実装したのであまりコスト削減にはなりませんでした...残念。

インターン感想

 今回実装したのはAPI部分のみで見せられるデモンストレーションが無いのでこのまま感想に移ります。
 実装にあたっては設計の参考のために実際の業務コードを閲覧させていただきました。業務コードを読むのは初めてだったのでとても参考になりました。ありがとうございました。また社員の方には何度も相談に乗っていただいたので、過去の自分の制作物と比べても綺麗な設計と実装ができたと思います。
 今回参加したファンコミュニケーションズさんのインターンは「自分のやりたいことを実現する」インターンということで、いきなり業務に参加するインターンと比べると心的な敷居は低いのではないでしょうか?ぜひ長期インターンへの参加を踏みとどまっている人は参加してみてください!

CPU作りました

2月から3月までの二ヶ月間インターンをさせていただきましたko_tamuraです.
私自身は計算機科学の専攻ですが,計算機アーキテクチャに興味があって研究も特定用途向けプロセッサの開発をしてます.
今回F@Nさんとご縁があって,CPUを作りましたので,そのまとめをしたいと思います.

参加の経緯

サポーターズの逆求人イベントでF@Nの方とお話し,ぜひインターンシップに参加したいと考えました.
普通のインターンシップだと業務体験みたいな感じで,与えられたテーマに学生は取り組むという形になると思います.
F@Nのインターンシップでは自由になんでも開発してよい,しかもF@Nの事業に関係なくてもよいという寛大な心と懐の広さに惹かれました.

インターンの目的

だいたい次のつもりで参加してました.
・計算機の知識を深める
・F@Nの方が何やってるか,雰囲気だけでも知る

以上の2つはおおむね達成できた気がします.

私自身は知識を身につけるだけで満足するタイプの人間ですが,工学分野では開発と理論はきっても切り離せない関係にあります.開発を通じてより知識を深めるという普通の企業の開発とは逆の目的でやってました.

やったこと

CPU作りました.
具体的には主に次の本にならって学びながら作りました.
gihyo.jp
XilinxというFPGAベンダの開発環境Plan Aheadを使ってCPUと,それを動かすために必要なシステムをVerilog HDL(回路を記述できる言語)を使って開発しました.

FPGAについて

FPGAってなんぞや?という人のために,簡単に説明します.FPGA (field-programmable gate array)は,書き換え可能な論理デバイスです.普通のASIC(application specific integrated circuit)のような回路は焼付けたら変更は不可能ですが,これはレジスタ(フリップフロップ)と演算器によって構成される単位から構成されており,その単位同士の配線をユーザが切り替えることで任意の回路を構成できるというアーキテクチャをしています.

従来はその設計柔軟性から制御系の産業でテスト的に使われることが多かったのですが,半導体の性能向上によって情報処理分野でも使われることが増えました.

処理の高速化やコスト削減のためにマイクロソフトのBing検索エンジンに使われた事例があります.また,クラウドでもAWSが提供するF1インスタンスを利用すれば,FPGAによる高速化の恩恵を享受できるソリューションを構成できます.しかも今では高位合成という,高級言語から回路を生成する技術も生まれ,トップダウン的なFPGA開発ができるため,興味があればぜひグーグルに聞いてみてください.

構成モジュール

全体構成

f:id:fan_ko_tamura:20180328144215p:plain

クロックソース

ICはクロックに同期した処理を実行した方が都合が良いので,評価ボードに備わるクロックジェネレータから入力します.
非同期設計にするとデータアクセスのタイミング設計がとても難しなります(同期回路でもクロックとデータ信号の遅延差を考慮せねばなりませんが).

CPU

いわずもがなです.
32bit RISCプロセッサを構成しました.詳しくは後述します.

SPM(スクラッチパッドメモリ)

キャッシュメモリのような役割を果たしますが,これは主記憶装置とは接続されず,プロセッサ側からのみのアクセスに利用できます.
PS3などで利用されていたセルプロセッサではSPMが搭載されているものがありましたが,メインストリームにはなれませんでした.

バス

各モジュールをつなぐ部分です.
バスは各モジュールがいつ使うかという管理機構が複雑でした.
関係ないけどバスって移動手段のバスと同じ語ですよね.Busはラテン語のomnibus(すべての人のための)という意味らしいので,このバスはすべてのモジュールのためのものとなります.

UART

UARTという規格でUSBを通じて外部の機器と通信できます.
外部から機械語の入力をこのシステムに与えればCPUが動く,みたいな用途を想定しています.

タイマ

時間を計ります.
ハイデガーによると存在は時間を根拠にしています.

ROM

記憶領域です.
ROMはFPGAベンダが提供しているIPコア(APIみたいなものです)を使って評価ボード上に搭載されているROMにアクセスができます.



プロセッサの構成

計算機の構成は大きく分けてCISC(Complex Instruction Set Computer)とRISC(Reduced Instruction Set Computer)の2パターンあります.
両者の大きな違いは命令長の長さです.

従来の計算機は命令長の長いCISCで,CPUが実行する命令が長いとデコードに時間がかかり,また並列処理に向きません.消費電力も大きいです.
実際にユーザが計算機で使う命令は単純な命令の組み合わせで実現できることがほとんどなので,命令長を短くして,それを並列に行ってスループットをあげよう,という思想から生まれたのがRISCアーキテクチャでした.
RISCでは命令パイプライン(命令を実行するライン工みたいなイメージです)によってレイテンシを隠蔽し,スループットの向上を実現しています.また,これによってレジスタ間の伝達遅延を抑えられるため,動作周波数が向上できます.
最もよく使われている命令パイプラインアーキテクチャは次の5つのステージで構成されます.

  1. Instruction Fetch: 命令をメモリから取り出す
  2. Instruction Decode: 命令を解釈して,演算に備える
  3. EXecute: 演算を実行する
  4. MEMory access:メモリのロード,ストアを行う
  5. Write Back:CPUレジスタにデータを書き込む

f:id:fan_ko_tamura:20180330152401p:plain

しかし,様々な要因によって図に示すような理想の動作ができません.
次に示すパイプラインハザードが発生した時には,何もしない命令を途中にはさんで処理の整合性を保つ必要があります.

IFとMEMが同じタイミングで発生し,伝送路が競合する場合

命令キャッシュとデータキャッシュを分ければ解決できます.ハードウェア的に領域を分けるということです.

EXの演算結果がレジスタに書きこまれない間に参照される場合

キャッシュレジスタを用意し,そこに演算結果を書き込んで参照すればよいですね.
賢いコンパイラならコードをなるべく依存関係がない順番にアセンブルしてくれます.

分岐命令により,順次実行されてきた命令が破棄される場合

( ˘•ω•˘ ).。oஇ



私自身は今回フォワーディング(EXの結果を直接次の命令で参照すること)を実装しました.
参考した本でも実装例があり,たぶん上記の中でこれが一番楽です.

こちらに実際Verilogで記述したコードがあるので,もし良ければご参照ください.https://github.com/flublight/my_CPU_with_SPARTAN3
自分で書いたコードとテキストのサンプルコードがごちゃまぜなので読むに耐えない感じになっています.

プログラマ的にRISCを知っておくと何がいいか

インテルのCPUも内部的にはRISCアーキテクチャを採用しているため,RISCの知識があるとより高速なプログラムを書けるかもしれません.
たとえば分岐命令を少なくすれば,上述のとおりパイプラインハザードを防ぐことができます.
更には,コンパイラや命令セットの知識があれば,パイプラインハザードを防ぐ効果的なプログラムが書けるようになります(しかし,その場合たいてい可読性が犠牲になります).高速性が必要となるソリューションでは,このような知識がかなり重要になります.

しかし,もっと早くするには,FPGAを使った専用回路を構成することが必要になると思います.

動作確認

をしたかったのですが時間の都合上できませんでした.
また現状ではデバッグが不十分なので十中八九動作しないと思います.
また,ロジックが正常であってもタイミング制約を与えてないので,もしかしたら動作しないかもしれません.10MHzの低速動作のため,遅延猶予は十分あるので杞憂かもしれませんが.
また,入出力機構はUARTしかないため,電気的な信号劣化の可能性は低いと信じています.

開発のまとめ

やったこと

  1. FPGA上にCPUと周辺回路を作った.
  2. CPUは32bitRISCプロセッサで,フォワーディング機能を持つ

できなかった(から後にやるべき)こと

  1. デバックちゃんとやる(めんどくさい)
  2. UART通信が正常にできるか実機確認する
  3. 機械語を送って動作するか確かめる

つらかったこと

  1. 配線がめんどう
  2. デバッグがめんどう
  3. 社内プロキシにはじかれる
  4. FPGA開発ツール探し(使ったFPGAが古かったので,それにあうバージョンを探す必要があった)

インターンの感想

かなりスケールの大きいデジタル回路を1から設計し実装したのは初めてだったので,システム全体の把握や,波形シミュレーションを使ったデバッグが大変でした.
機能の十分な検証にはあと数週間くらいかかりそうです(テスト項目をちゃんと作ったりしたら数ヶ月かかると思います).
しかし,計算機の内部の細かい仕様がわかり,実際にプロセッサを実装するのに必要な論理設計がなんとなくでも理解できたのは大きな収穫でした.

また,F@Nで働いている方の隣で開発ができて,働いている方々の実態がある程度わかりました.みなさん自由に,リラックスした環境で開発できるはすごく良いところだと感じました.また,社員の方にランチに連れて行っていただいたり,卓球の部活動に参加できたりと楽しい時間が過ごすことができて嬉しかったです.

最後に

二ヶ月間たいへんお世話になりました.
在学中にこのような貴重な体験ができて本当に良かったです.
本ブログは半分くらい計算機アーキテクチャのお勉強的な中身になってしまいましたが,エンジニアの方々の教養にでもなれば幸いです.
お世話になった方々はもちろんですが,事業とは関係ない開発を受け入れていただいたF@Nの懐の広さに改めて感謝いたします.ありがとうございました.