新しい認証技術であるImplicit Authenticationの紹介

今インターネットを使うとき、認証は必ず関わってきます。この認証の新しい技術であるImplicit Authenticationについて紹介します。

なおこの認証技術はまだ研究段階で、残念ながら実用化のめどは立っていません。

Implicit authentication - Wikipedia

概要

Implicit Authentication(暗黙認証、以下IA)とは認証技術の1つで、ユーザーの振る舞いから認証動作を行うものです。

分かりにくいですね。

ではまずIAと対照的なExplicit Authentication(明示認証、以下EA)について説明します。EAは認証にユーザーの何らかのアクションが必要なもので、例えばID/Passwordを使った認証や指紋認証などがこれに当たります。
これに対してIAは認証時にアクションが必要ないものです。

このIAを使用することにより認証動作の利便性を向上することができます。

認証方法

IAはスマートフォンセンサーデータからユーザーの振る舞いデータ(GPS, アプリ使用量、通話履歴など)を収集しこれを機械学習を使って学習することによりモデリングし、そのモデルに対してセンサーデータを入力として与えてその出力により認証を行うものです。

つまりIAは

  1. ユーザーの特徴モデルを作成するモジュール
  2. ユーザーモデルと認証用データを比較した時の一致度であるスコアを計算するモジュール

の2つから構成されています。

図1にモデル作成時のデータの流れを、図2に認証時のデータの流れを示します。

f:id:paging:20180619171726p:plain
図1. モデル作成時のデータの流れ

f:id:paging:20180619171732p:plain
図2. 認証時のデータの流れ

これまでの研究

IAはスマートフォンの普及に伴って考え出された技術です。(もっと言えばインターネットに繋がるセンサーをたくさんの人が持ったから生まれたとも言えます)

ですのでIAそのものの先行研究はそこまで多くありません。

Implicit Authentication for Mobile Devices

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.160.4599

2009年の論文

Data Driven Authentication: On the Effectiveness of User Behaviour Modelling with Mobile Device Sensors

https://arxiv.org/abs/1410.7743?context=cs

2014年の論文

モデル作成は、センサーデータのそれぞれに対して時間と場所に関する2つの確率密度関数を求めて並べることによりモデルにします。

スコア算出は、与えられたセンサーデータの時間と場所の頻度に基づいて計算されます。

ライフスタイル認証

IAとは違いますが、東大で行われている研究を紹介します。

ライフスタイル認証とは東京大学の山口利恵氏が提唱した認証手法で、2017年に大規模な実証実験を行っています。

このコンセプトはIAと非常によく似ていて(というかIAではないかと思う。なぜわざわざ新しく命名したのだろうか)、位置情報や買い物履歴、ウェアラブル端末のセンサ情報などのライフログデータを使って認証を行う手法です。

http://www.sict.i.u-tokyo.ac.jp/research/lifestyle.html

私はこの山口氏の論文をいくつか読んだのですが、誤字脱字があったり図番が間違っていたりそもそも再現性に乏しかったりと、正直あまりいい研究には思えませんでした。もしかするとこれからしっかり研究されて有用なものになるかもしれませんので動向には注意しておきたいです。

実際使えるの?

さて、いくら新しくて便利そうな技術でもセキュリティ上の問題があったり精度が悪かったりすると実用に耐えうるものにはなりません。

で、現状の研究を見る限り全然実用に耐えうるものにはなっていません。これからの研究を期待しましょう。

次の研究は精度を上げながらHTTPで使えるようにする研究でしょうか。

react-nativeでiOSのビルドをするとlibfishhook.aが無くてエラーが出る

react-nativeでiOSアプリをビルドしたときに詰まったので解決方法を書いておきます。

適当に新しいプロジェクトを react-native initで作成してXcodeでビルドした時以下のエラーが発生しました。

Build input file cannot be found: '/Users/nagaryo/src/new_project/node_modules/react-native/Libraries/WebSocket/libfishhook.a'

f:id:paging:20180619162111p:plain

libfishhook.aが無いと言われているので確認したのですが、しっかり存在します。 f:id:paging:20180619161210p:plain

解決方法を探したところ、以下のissueにたどり着きました。

github.com

真ん中くらいにあるコメントを見ると「次のバージョンでリリースされるよ。早く直したかったらこのPRの修正を手でやってね。」と書かれています。

github.com

vim node/modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj/project.pbxprojで該当ファイルを開いて上のPRの修正を手で行ったらビルドが通るようになりました。

ユニークキーの修正漏れですね。

環境

BOSEイヤホン三種買った

こんにちは。BOSE教信者のナガリョーです。BOSEのイヤホンなしには生きられない体になってしまいました・・・ f:id:paging:20180618133438j:plain

ついにBOSEイヤホン3種類を買ってしまったので

音質は全て「BOSEらしいバランスの良い音」です。この音が耳に合う人はBOSEを買い続けて問題ないと思います。

正直2万円以上のイヤホンの音の違いなんて分からないので、以下では音以外でレビューします。

QuietControl 30 Noise Cancelling Earphones

購入理由

カフェなど周囲がうるさい環境での作業が多いので集中するためにノイズキャンセリングイヤホンを探していました。

ここでヘッドホンじゃない理由は、メガネだからです。ヘッドホンを長時間つけているとメガネのつるが耳の裏に挟まって痛いんです・・・

そこでイヤホンショップで働いたことがある後輩くんに意見を求めると、「QC30は最強のノイキャン」とのことだったので信用して購入しました。

性能レビュー

  • 文句なしのノイズキャンセリング性能
  • 毎日充電すればバッテリーは大丈夫
  • 充電時間が短い
  • 少しだけ遅延がある(0.05秒とか?)

買って大満足のイヤホンです。ノイズキャンセリングは十分働きますし、音質も問題ありません。3万円以上出して買う価値のあるイヤホンです!

しかし実際、完全な静寂ではありません。まず、ザーッというホワイトノイズが常に聞こえます。そして人の話し声などはしっかり聞こえます(これは多分長所です)。

ノイズキャンセリングのレベルは、BOSEのアプリからと、本体のボタンを直接操作することにより調節することができます。

f:id:paging:20180618133454p:plain

ほとんどの時は最大レベルで固定なのですが、たまに外の音も聞く必要がある時には重宝します。痒い所に手が届く感じが素晴らしいです。

地味な点ですが、冬は首に引っ掛ける時ちょっと冷たいです。なるべく襟付きの服を着るなど服装で対策しています。

SoundSport Free wireless headphones

満を辞して出たBOSEの完全ワイヤレスイヤホンです。

あ、完全ワイヤレスイヤホンは安いもの(だいたい中国製)は買わない方が良いですよ。安かろう悪かろうですから。

購入理由

ランニングの時につけるBluetoothイヤホンを探していました。

もっと安いものも選択肢にあったのですが、完全ワイヤレスイヤホンを使ってみたいという気持ちがあってこのイヤホンを買おうかどうか悩んでいました。

決め手となったのは、アメリAmazonでこのイヤホンがセールで22000円程度になっていたことです。即買いでした。

性能レビュー

  • wi-fiと干渉してブツブツ途切れることがある
  • ケースと合わせるとかなり充電がもつ
  • ランニングしても全然取れない
  • 結構遅延がある(動画を見るのはしんどい)

一つ注意点があります。Amazonのレビューにもちらほら「ブツブツ途切れる」とあるように、環境によってはブツブツ途切れます。

これはきっとBluetoothと同じ2.4GHz帯を使用するWi-Fiが干渉していることが大きな原因だと思います。

正直これは5GHz帯のWi-Fiを使う以外の解決方法がありません。思い切ってWi-Fiルーターを買い換えるか、5GHzを使うよう切り替えましょう。

SoundSport IE CHL

Bose SoundSport in-ear headphones イヤホン チャコール

Bose SoundSport in-ear headphones イヤホン チャコール

購入理由

三つの中では一番古いイヤホンです。前のイヤホンが壊れた時にAmazonで7000円くらいだったので思わずポチッとしました。

性能レビュー

  • マイク、音量調節なし
  • 見ての通り有線

正直あまり大きな特徴はありません。。。ただ、シンプルなイヤホンが良い方はこちらを買うのも良いと思います。

まとめ

多少高くても欲しいと思ったものを買うと満足度がかなり高いですね!

IoTの異常検知

IoTシステムで異常を検知する方法に関して調べました。

概要

運用しているシステムがもしダウンしたとしてもダウンタイムをなるべく短くしたい。これは開発者共通の願いです。

もし自動でIoTシステムのデバイス群の異常を検知して迅速にアップデートできるのならば、いくつかのデバイスでバグが発生したとしても全てのデバイスにそのバグが浸透する前に解決することができますよね?そのために異常検知技術が必要になります。

IOT ANOMALIES AND HOW TO DETECT THEM

f:id:paging:20180616215622p:plain IoT Anomalies And How To Detect Them

この記事は2016年9月の記事で、IoT開発業務を行なっているintersog社のブログです。

この記事は要するに、「ビッグデータツールを使って集めたセンサーデータから例外を検知しよう」ということを言っています。

もう少し詳しく言うと、ログのストリーミングデータからリアルタイムでデータのパターンを解析し、過去データと照らし合わせて異常の発生を予測するシステムを使えば異常検知できるよ!ってことです。

具体的な手法を挙げるのでなくIoTシステムにおける異常検知に関してざっくりと書かれています。

USING IOT AND MACHINE LEARNING FOR INDUSTRIAL PREDICTIVE MAINTENANCE

f:id:paging:20180616221726p:plain

www.losant.com

IoTデバイスから収集したデータを機械学習で解析して自動で予測をしたそうです。

Google Cloud machine LearningとLosant IoT Platformを主に使って、この2つの連携によりPredictive Maintenance System (予知保全)システムを構築できます。これは異常が起こる前にそれを検知するシステムのことであり、condition monitoring(状況監視)によって実装されます。

感想:
自社のサービスのプロモーション記事って感じです。機械学習 x IoTのざっくりしたアーキテクチャの話。IoTの異常検知と言ってもメインの技術は全部機械学習ですね。

異常検知周りの論文たち

以下にIoTの異常検知に関する論文を挙げておきます。

[1] Kodeswaran, P. A., Kokku, R., Sen, S., and Srivatsa, M. (2016). “Idea: a system for efficient failure management in smart IoT environments,” in Proceedings of the 14th Annual International Conference on Mobile Systems, Applications, and Services (Singapore: ACM), 43–56.

http://pages.cs.wisc.edu/~sdsen/papers/2016idea.pdf

IBM Researchの4人による論文です。

[2] P.H. Su, C.S. Shih, J.Y.J. Hsu, K.J. Lin, Y.C. Wang, “Decentralized Fault Tolerance Mechanism for Intelligent IoT/M2M Middleware,” Internet of Things (WF IoT), IEEE World Forum, pp. 45-50, 2014.

Decentralized fault tolerance mechanism for intelligent IoT/M2M middleware - IEEE Conference Publication

台湾国際大学の5人よる論文です。

まとめ

IoTの異常検知はwebやデバイス機械学習ビッグデータ解析など幅広い分野にまたがるものですので統合的な手法というのはまだ存在しません。

そもそもIoTシステム自体のフレームワークのスタンダードが現在存在しない以上、異常検知に関しても統合的な手法はまだ見込めませんね。

IoTの異常検知システムを構築するにはまず異常検知に関する知識を得るほうがいいと思います。

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

最高の小説6選

こんにちは、ナガリョーです。

私が今まで読んできた小説の中で面白かったおすすめのものを紹介します。

選考基準は「今の私が読む気になるか」です。

リスト

  1. テロリストのパラソル
  2. 嘘つきアーニャの真っ赤な真実
  3. 5分後の世界
  4. イン・ザ・プール
  5. 家族八景
  6. ランチのアッコちゃん

テロリストのパラソル

この作品は江戸川乱歩賞直木賞をダブル受賞した最高のミステリー小説で、もしかしたら今まで読んだ小説の中で一番面白かったかもしれない、というくらい本当に面白くて万人にお勧めできる小説です!

少しでも気になる方は読むべきです。絶対後悔しません。

嘘つきアーニャの真っ赤な真実

嘘つきアーニャの真っ赤な真実 (角川文庫)

嘘つきアーニャの真っ赤な真実 (角川文庫)

2006年にガンのため亡くなったロシア語同時通訳家の米原万里さんが書いたノンフィクション作品です。

あらすじ

1960年プラハ。マリ(著者)はソビエト学校で個性的な友達と先生に囲まれ刺激的な毎日を過ごしていた。30年後、東欧の激動で音信の途絶えた3人の親友を捜し当てたマリは、少女時代には知り得なかった真実に出会う! Amazon CAPTCHA

ノンフィクションなのですが、米原万里さんの文章力の高さと展開の面白さから、途中までフィクションの小説だと思うほどの名作です。米原万里さん本当にすごい。亡くなったのが惜しまれます。

5分後の世界

五分後の世界 (幻冬舎文庫)

五分後の世界 (幻冬舎文庫)

村上龍が書く、日本がポツダム宣言を受諾せず戦争を続けているif世界です。村上龍曰く自身最高傑作の作品で、村上龍の代表作品となっています。

グロい表現が結構あるのでちょっと注意ですが、戦争ものを読みたい時にはとてもおすすめです。

あらすじ

箱根でジョギングをしていたはずの小田桐はふと気がつくと、どこだか解らない場所を集団で行進していた。そこは5分のずれで現れた『もう一つの日本』だった。『もう一つの日本』は地下に建設され、人口はたった26万人に激減していたが、第二次世界大戦終結後も民族の誇りを失わず、駐留している連合国軍を相手にゲリラ戦を繰り広げていた……。 五分後の世界 - Wikipedia

イン・ザ・プール

イン・ザ・プール (文春文庫)

イン・ザ・プール (文春文庫)

直木賞を受賞した奥田英朗空中ブランコの前作です。ちなみに本作品も大藪春彦賞を受賞しています。

かなり変わった精神科医の伊良部と水泳中毒、ケータイ中毒、慢性勃起症状などちょっと変わった症状に悩む患者達とのコミカルな治療(???)を描いた作品です。

メディアミックスもされており、イン・ザ・プール阿部寛主役で実写映画化、空中ブランコはアニメ化されています。

空中ブランコ (文春文庫)

空中ブランコ (文春文庫)

町長選挙 (文春文庫)

町長選挙 (文春文庫)

家族八景

家族八景 (新潮文庫)

家族八景 (新潮文庫)

あらすじ

18歳の火田七瀬は人の心を読めてしまう精神感応能力者(テレパス)の女性である。高校卒業後、住み込みのお手伝いとなり様々な家庭を転々とする。家族それぞれの内面を読んでしまうことで、行く先々の家庭に亀裂や事件を起こしてしまう。女性として肉体的成熟を迎えて性的な関心を向けられるようになり、20歳を迎える最終話でお手伝いをやめることを決意する。 家族八景 - Wikipedia

人の心を読む力をもつ火田七瀬がいろんな家で家事手伝いをしながら、その家庭に潜む闇を見ていくESP小説です。

七瀬シリーズは3部作から成っていて、2作目は七瀬ふたたび、3作目はエディプスの恋人です。全部めちゃくちゃ面白いです。

七瀬ふたたび (新潮文庫)

七瀬ふたたび (新潮文庫)

エディプスの恋人 (新潮文庫)

エディプスの恋人 (新潮文庫)

ランチのアッコちゃん

ランチのアッコちゃん (双葉文庫)

ランチのアッコちゃん (双葉文庫)

あらすじ

地味な派遣社員の三智子は彼氏にフラれて落ち込み、食欲もなかった。そこへ雲の上の存在である黒川敦子部長、通称“アッコさん”から声がかかる。「一週間、ランチを取り替えっこしましょう」。気乗りがしない三智子だったが、アッコさんの不思議なランチコースを巡るうち、少しずつ変わっていく自分に気づく。

この本、働く女の人にめちゃくちゃお勧めします。アッコ女史と三智子の上司部下のような友達のような関係が心地よくて、読むと元気が出るビタミン小説です!

終わりに

どれも本当に面白い小説なので読んでみてください!

assertでテスト駆動C言語

競プロの問題を解くときにassert()でテストを書きながらRed-Green-Refactoringサイクルなテスト駆動開発をしたら捗った話。

assert()とは

プログラムの実行中にある条件が成立するかどうかチェックする機能で、その条件が満たされていないとエラーが発生してプログラムが終了します。

以下のようにして使います。

#include<stdio.h>
#include<assert.h>  // assert.hが必要

int main(void) {
  int value = 0;
  assert(value == 1); // 条件を満たさないのでここでエラーが発生する
  return 0;
}

上の例は極端な例ですが、ざっくりassert()の使い方の紹介です。

テスト駆動開発(TDD)とは

プログラムのロジックを書く前にまず、期待する動作のテストプログラムを書き、このテストが正常に失敗することを確認したらロジックを実装し再度テストを実行して期待する動作をするプログラムであることを保証する開発手法。

と書いてもTDDをやったことがない人には分かりにくいですよね。。。

そこで階乗を求めるという具体例を使って説明します。

階乗を求めるプログラム

階乗を求めるプログラムをTDDで実装してみます。

1. 関数のインターフェイス設計(引数と返り値の型を考える)

階乗は1からnまでの自然数の積で、以下のような数式で表されます。

n! = n * (n - 1) * (n - 2) * .... * 2 * 1

まずはこの式をどんな関数に落とし込むかを考えてみます。

  1. 計算したらint型の値を返して欲しい
  2. 引数にはint型の値nを入れる

この2つを盛り込むと int factorial(int n)という関数のインターフェイスが見えてきます。

2. 何もしない関数を作る

ではまず空の関数factorial()を実装してみます。

#include <stdio.h>

int factorial (int n) {
  return 0;
}

int main (void) {
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

上で考えた通りのインターフェイスの関数factorial()を実装しましたが、ロジック部分が空で常に0しか返しません。

これを実行してみると以下のようになります。

$ ./factorial
0

書いた通り0が出力されます。

3. assert()を使ってテストを書く(Red)

では次にassert()を使ってテストを書いてみます。

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  return 0;
}

void spec () {
  assert(factorial(4) == 24);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

spec()関数内に書いたのがテストになります。ここでは4の階乗が24になることを期待します。

しかしこれを実行すると以下のようにエラーが出ます。

$ ./factorial
Assertion failed: (factorial(4) == 24), function spec, file a.c, line 9.
zsh: abort      ./factorial

factorial()関数は常に0を出力するので、これはつまり正常にエラーが出たということになります。

4. factorial()関数のロジックを埋める(Green)

ではfactorial()関数のロジックを埋めましょう。

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

void spec () {
  assert(factorial(4) == 24);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

こうなります。(プログラムの説明は省略)

これを実行すると

$ ./factorial
24

となるように4の階乗がちゃんと24になります。

5. テストの改善

さて、次にテストケースを増やしていきます。

  1. 引数に0を入れたら正常に1が返るだろうか
  2. 引数に負の数を入れてもエラーは起きないだろうか

ざっと2つテストケースを挙げました。(他にも「intの最大値最小値を入れてみる」などありますが今回は省略)

これを実装すると以下のようになります。

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

void spec () {
  assert(factorial(4) == 24);
  assert(factorial(0) == 1);
  assert(factorial(-1) == 0);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

これを実行すると、、、エラーが出てしまいます。

> ./factorial
zsh: segmentation fault  ./factorial

ああそうだ。引数が負の数の場合を実装していません。これではエラーが起きてしまいますね。

6. factorial()関数の改善(Refactoring)

factorial()関数に負の引数が入った場合に0を返すようにします。(階乗は0を返すことがないからホントはこれもあんまよくない)

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  if (n < 0) return 0;
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

void spec () {
  assert(factorial(4) == 24);
  assert(factorial(0) == 1);
  assert(factorial(-1) == 0);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

こうすると、

$ ./factorial
24

成功しました!

まとめ

今回はassert()を使ったテスト駆動開発C言語で行うことについて書きました。

ここでは分かりやすく階乗を例に出しましたがもっと複雑な状態になるプログラム(スタック、キューなど)だとかなり力を発揮してくれると思います!

C言語でのテスト駆動開発関連の本があります。

本を読むことについて

読書に関して考えてることのまとめ

最近どう本を読めばいいのかわからなくなってきた(好きなように読めばいいのだろうけど)のでちょっと読み方を変えたい。

小説を読んでいて読んだ時に感じたこと、思ったことから自分の考えをまとめていくことをもっとうまくする方法を知りたかったのだろうか。

そうならばいい読書感想文の書き方を調べることなんかは多少参考になると思う。だけど読書感想文とは違う。書評ブログとも違う。

インターネットと読書

パッと検索するとほとんどが「いかに効率よく知識を吸収して読んだ本について忘れないようにするか」の点に関する議論が多い気がするけど、自分が求めているのはそうではない。「すぐ良く効く」は長期的に見たら意味をなさないので10年後を考えた読書がしたい。

普通にググっても本をお勧めするページは無難なものしかない残念さ。書店員のブログとかをうまく見つけ出したい。

もしかするとamazonで本を買わない方がいいかもしれない。レビューが見えてしまってそれが判断基準になるとだんだん同じような本しか買わなくなってしまうから。

kindle

今漫画はほとんどkindleで買っている。引越しの時辛い思いをしたので。

電子書籍は紙の本より読むのに時間がかかる。確かに、kindleと紙の本で1文字あたりの視覚情報量に差がありそう。 電子書籍は紙の本より読書スピード遅い――専門家がテスト - ITmedia NEWS

読書力

英語の勉強などと違って読書はいくらしても読書力メーターみたいなものが存在しないのでどうやってもただの趣味にしかならない。物書きは読書の先にあるものであって読書の結果ではない。

仮定: 本を読んで書いた文章の量によって読書力は定義されうる

これはほとんど経験論である(だからこその仮定)。大量に本を読んで見た時期があったけど、ただ読んだ本のバリエーションが増えるに止まっていて先に進んでいない感覚があったから。読むだけでは咀嚼されないので咀嚼の機会を課す必要があるはず。

現代の小説を深く読むためには、古典をたくさん読んだ方がいいと思う。なぜなら、作者は古典に少なからず影響を受けているはずだからである。

ただ、ブックレビューを書くにしても、「この本の面白さを伝えたい」と思わないと書く気にすらならない。

読書とお金

どんな本でも良いと思ったら値段を気にせずに買うようにしたい。

値段が理由で買わない本はきっと無料でも読まないんだろうな。