シンギュラリティソサイティ小論文

ディープラーニングによるデータの利活用は大きく、以下の流れになる

データ取得⇒ベクトル化⇒分析⇒サービス化

この時にネックになるのが、ベクトル化と、サービス化である。

データがベクトル化しずらいものだと、ベクトル化の仕組みが重要になり、サービス化が複雑な場合は、サービス化のロジックが重要になってくる。

ディープラーニングの適用先としては、まず、ベクトル化もサービス化も難易度が低い領域が考えられる。

例えば、個人特定や、画像診断などが挙げられる。

次に、ベクトル化がやや困難な領域や、サービス化が複雑な領域が適用先として考えられる。

適切なベクトル化の方法が見つかり、適用可能になった例としては、ドラッグディスカバリーなどが挙げられる。

ただし、適切なベクトル化の方法の発見は、ディープラーニングそのものの特性とはあまり関係のないものであり、適用先の数はそう多くはないと予想される。

一方で、複雑なサービス化の例が自動運転であり、これは時間こそかかるが、確実に適用されていく分野だと思う。

以上の前提を踏まえた上で、直近に実現可能な「ベクトル化もサービス化も難易度が低い領域≒単純な画像認識を利用したサービス」と、いくばくかの時間を要す「サービス化が複雑な領域≒自動運転」がいかに社会を変えていくかを論ずる。

1. 単純な画像認識を利用したサービス

インパクトの大きな適用先として、個人特定と、画像医療診断が考えられる。

個人特定は、主にマーケティングや顧客分析の観点で大きな意味を持つ。

現在のマーケティング情報は、実際の購買行動があった際に、ポイントカードなどを提示した顧客でしか情報を取得できていない。

しかし、例えば監視カメラのデータをもとに個人特定をすることで、誰がどのように移動し、何を買ったのか、買わなかったといった情報が取得できるようになる。

一方で、プライバシーの問題も存在する。

故に、中国のようなプライバシーの管理が甘い国や、シンガポールのような監視カメラ大国での適用がまずは進むと予想される。

一方で、画像医療診断はレントゲンや胃カメラといった画像データから、病理の有無を判断する。

現在は、医師が経験や理屈から判断しているが、ディープラーニングを持ちいてれば、これが簡易に、かつ確実になる。

診断医という新しい職業が生まれ、まずは診断医が決められた方法で画像データを取得し、解析にかける。

そこで、少しでも怪しければ本当の医師へと連携される。

診断医の育成は、医師の育成と比較し、はるかに簡単であり、これにより医師不足解消や、医療費削減に貢献できるはずである。

2. 自動運転

まず適用可能になる自動運転は、幹線道路などの定期路線だと予想される。

もっともイージーなのが高速道路であり、これは特に流通面において大きなインパクトを与えうる。

高速道路の乗り降り地点で、運転手が待機し、そこからは人が運転するといったモデルが早期に成立すると思われる。

一方で、旅客輸送においても、十分に適用の余地はあり得る。

例えば、環状線のいくつかの車線を自動運転専用レーンとし、そこをバスなどの自動運転車を走らせるのであれば、初期の自動運転でも十分に運用可能だと思われる。

そのような定期路線が成立し、電車と同等の輸送能力を持つことが出来れば、都市の再開発が促進される。

過去に、山手の線の外周に環状線を作る計画があったが、用地買収の困難さから、頓挫している。

自動運転によって、環状7号線や8号線にあたらに路線ができれば、都市の人の流れが変化し、新たなオフィスタウン、ベッドダウンが生まれる。

これは都心の中心地への一極集中などを避ける施策となりうるはずである。

3. 最後に(ディープラーニングが意味すること)

ディープラーニングが意味することは何なのか、生命の進化になぞらえて語ってみたい。

ディープラーニングは、生命の進化における、目の獲得に非常に近いと思う。

実際に、ディープラーニングと画像解析の相性は非常によく、様々な応用が模索されている。

目の獲得は、生命の進化において何を意味したのか。

それはカンブリア大爆発である。

生命は目を手に入れたことで、様々な捕食の仕方、そしてそこからの逃れ方を見出した。

その結果、実に多様な種の生き物が短い期間で生まれたのである。

たかが目、されど目なのである。

おそらく、画像解析という、意見シンプルな仕組みの自動化が、これから非常に多岐にわたるサービスを変革させていくと思う。

まさに、カンブリア大爆発がこれから起きようとしているのではないだろうか。

MongoDBの設定方法

どーも。新しいMacbook pro購入しました。細川です。

touch bar がイマイチなんの役に立つのか分かりません。
目線や指の動きとか、考慮して作った機能なんですかね。謎です。

Macが新しくなって、諸々設定し直したので、備忘録として書いていきます。

1. Homebrewのインストール

brew.sh

2. MongoDBのインストール

brew update
brew install mongodb

3. データを保存するディレクトリを作成

デフォルトだとアクセス権限つけなくてはいけないので、
今回はテキトーにホームディレクトリ配下にフォルダを作ります。

例) ~/Data/MongoDB/db/data

4. ディレクトリを指定して起動

mongod --dbpath ~/Data/MongoDB/db/data

終了はコントロールCです。

データの管理にはMongo Management Studio を使ってます。

mms.litixsoft.de

デフォルト通信設定は、localhost:27017にすれば、繋がります。

Scalaのアプリケーションフレームワーク"Lift" (2: アプリ構築)

どーも、管理人の細川です。大分時間が空いてしまいましたが、
Scalaのアプリケーションフレームワーク"Lift" (2: アプリ構築)
を解説いたします。

  1. テンプレートプロジェクトの入手
  2. 設定ファイルの更新
  3. ライブラリの取得
  4. Eclipseプロジェクト化
  5. Eclipseでの実行

1. テンプレートプロジェクトの入手

公式のサイトから、テンプレートプロジェクトを一式ダウンロードします。
2016/05/05現在では、2.6がオススメ。

http://liftweb.net/download

中には色々と入っているけれど、利用するのはlift_blank
何も設定されていないのが、結局一番使いやすい。
(というか、ドキュメントが無いので、Advanceとか使いこなせません。)
lift_blankをフォルダごとコピーし、新しいプロジェクト名を付けて、
適切なディレクトリに配置しましょう。

2. 設定ファイルの更新

build.sbtというファイルが設定ファイルです。(記述はScalaです。)
nameとかバージョンとかをポチポチ変更しましょう。
一番変更する事になるのは、ライブラリです。

//ここにプロジェクト名
name := "xxx"

version := "0.0.1"

organization := "net.liftweb"

scalaVersion := "2.11.2"

resolvers ++= Seq("snapshots"     at "https://oss.sonatype.org/content/repositories/snapshots",
                "releases"        at "https://oss.sonatype.org/content/repositories/releases"
                )

seq(webSettings :_*)

unmanagedResourceDirectories in Test <+= (baseDirectory) { _ / "src/main/webapp" }

scalacOptions ++= Seq("-deprecation", "-unchecked")

//以下がライブラリ。サンプルとして、MongoDB系のライブラリを追加。
libraryDependencies ++= {
  val liftVersion = "2.6"
  Seq(
    "net.liftweb"       %% "lift-webkit"        % liftVersion        % "compile",
    "net.liftweb"       %% "lift-mongodb"         % liftVersion        % "compile->default" withSources(),
    "net.liftweb"       %% "lift-mongodb-record"  % liftVersion        % "compile->default" withSources(),
    "com.foursquare"    %% "rogue-field"          % "2.5.0" intransitive(),
    "com.foursquare"    %% "rogue-core"           % "2.5.0" intransitive(),
    "com.foursquare"    %% "rogue-lift"           % "2.5.0" intransitive(),
    "com.foursquare"    %% "rogue-index"          % "2.5.0" intransitive(),
    "net.liftmodules"   %% "lift-jquery-module_2.6" % "2.8",
    "org.eclipse.jetty" % "jetty-webapp"        % "8.1.7.v20120910"  % "container,test",
    "org.eclipse.jetty" % "jetty-plus"          % "8.1.7.v20120910"  % "container,test", // For Jetty Config
    "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container,test" artifacts Artifact("javax.servlet", "jar", "jar"),
    "ch.qos.logback"    % "logback-classic"     % "1.0.6",
    "org.specs2"        %% "specs2"             % "2.3.12"           % "test"
  )
}

3. ライブラリの取得

更新したら、ターミナルでプロジェクトのディレクトリまで移動し、

./sbt

4. Eclipseプロジェクト化

ライブラリの取得が終わったら、

eclipse

完了したら、

exit

Eclipseを立ち上げて、 File>Import>General>Existing Projects into Workspace

Next, Browsで作成したプロジェクトを選択して、実行。

5. Eclipseでの実行

Run>Run Configurations>Scala Applicationをダブルクリック
Projectは目的のプロジェクトを設定。
Main Classは RunWebApp

実行し、ブラウザで http://localhost:8080 にアクセス。
停止はEclipseのConsoleの赤いボタンで。

Scala×Dispatchでスクレイピング【編集途中】

近頃忙しくなってしまい、更新する余裕が無いので、現状で一旦アップします。
(誰か、残り埋めてくれ。。。なんならソースコードまるっと送るので。)

近年はAPIが充実してきていますが、それでもAPIが用意されていないサイトのデータが欲しい!
という時がありますよね。

今回は、Scalaとその非同期Http通信ライブラリである、
Dispatchを使ってスクレイピングを行っていこうと思います。

Dispatchとは

Scalaの非同期通信ライブラリであり、Scalaの並列処理の仕組みであるFutureが使われています。

スクレイピング目的であまりに頻繁にサイトにアクセスする事は好ましいことでは無いですが、
ある程度の通信を並列して行いたい時には非常に便利なライブラリです。

Dispatchは一度大きな仕様変更を行っており、過去のバージョンはDispatch classicと呼ばれております。
現行バージョンは、Dispatch 又は Dispatch reboot と呼ばれています。
古いドキュメントだと、Dispatch classicの説明であることが多いので注意してください。

詳細は以下のリンクを。ライブラリの導入方法などは割愛致します。
Dispatch — Dispatch

チートシート
(Dispatch classicのものですが、多くのメソッドの呼び出し方は共通です)
Periodic Table of Dispatch Operators

Dispatchの使い方

Dispatchによる処理は大きく三つのステップに分かれます。

  1. HTTPリクエストの作成
  2. HTTPリクエストの送信
  3. HTTPレスポンスの処理

HTTPリクエストとかレスポンスとか良くわからん。。。
という人は以下の書籍の購入をオススメします。

0.import

import dispatch._
import scala.concurrent.ExecutionContext.Implicits.global

1.HTTPリクエストの作成

ドメインの指定
val domain = :/("xxx.com")  

//httpsの場合
val sdomain = domain.secure
ディレクトリの指定
val url = domain / "sp" / "index"  
パラメータの指定
val param = List( ("param1","1"), ("param2","a") )

//Getの場合(URLにパラメータを追加)) )
val url_with_param = url <<? param

//Postの場合(Bodyに追加)
val url_with_bodyparam = url << param

//ファイルの場合は、<<<で追加 
ヘッダー情報の追加
//Auth認証
val url_with_auth = url as_! ( "id", "pass" )

//その他ヘッダー情報
val hparam = List( ("hparam1","1"), ("hparam2","a") )
val url_with_header = url <:< ( hparam )

1.HTTPリクエストの実行

Edisonでeddystone-URLビーコンを出す

最近はビーコンが簡単に出せるという話を耳にしたので、試してみました。

1. Edisonの初期化

しばらく放っておいたEdisonはアップデートをライブラリ毎にするのも面倒だし、初期化して使うのが良いのですが、最近流 行も過ぎたせいか正しい初期化方法を書いているブログが見つけられませんでした。

まずは、各OSのインストーラーで必要なデバイスドライバを一括インストール。ここでEdisonをつなげという指示が出るのですが、つないでもナゼかUpdateしてくれた試しがありません。というわけで、自分で最新のFirmware Release 2.1をダウンロード。Complete imageをダウンロードします。

software.intel.com

ダウンロードしたファイルを展開すると、中にflushall.bat と flushall.sh というファイルがあるので、Windowsはflushall.batをダブルクリック、 Mac, Linuxは flushall.shをコンソールから実行します。EdisonをUSBでつなげと指示があるので、ココでつなぐとめでたく認識されて、15分ほどほおっておけば完全に初期化された状態になります。

2.Edisonの初期設定

ファームウェア以外の手順は、以下のブログの通りで問題ないです。 ターミナルでログインして"configure_edison --setup" と打てばさくさく進みます。 trac.switch-science.com

3.eddystone-URL ビーコンを飛ばす

ココに書かれているとおりでOK。 古い情報だとなんかライブラリをいっぱい入れろと書かれていますが、ココのものでOK。 気をつけるところは、sudoが不要なところだけ!

EdisonでEddystoneを使いURLを送信する | Developers.IO

4.EdisonでBluetoothを常時ONで起動するようにする

ココに書かれている設定を入れればOK。いちいちrfkillコマンド打たなくて良くなります。 intel edison (3) - /var/log/messages

5.Edison起動したらBeacon飛ばして欲しい

起動スクリプトを書いてしまう。たとえば、以下のように起動スクリプトを記述。

vi /etc/systemd/system/eddystone.service

[Unit]

Description=Eddystone Beacon Node Service

[Service]

Environment=/home/root

ExecStart=/usr/bin/forever -l /dev/null -a /home/root/sample.js

[Install]

WantedBy=multi-user.target

あとは、記述したサービスを登録すれば良い。コマンドは以下の通り。

systemctl enable eddystone.service

これで、電源を入れるだけでビーコンが飛ぶようになります。

"LAMP" ならぬ "EDoMoS" 【2. Docker】

どーも、管理人の細川です。
今回は、EDoMoSの"Do"、Dockerの解説を行おうと思います。

EC2の前に何故、Dockerなのかというと、書き手の都合です。

  1. Dockerとは何か?
  2. MacでDockerを動かす
  3. Dockerのコマンドを叩く
  4. Docker Hubを利用する

1. Dockerとは何か

以下のスライドが非常に分かりやすいです。

2. MacでDockerを動かす

DockerはLinux上でしか動きませんので、
Mac上でLinuxの仮想環境を構築する必要があります。

少し前までは、Vagrant使ってCoreOSを立ち上げていたのですが、
そういったもろもろの処理を纏めて行ってくれるツール
"Docker Toolbox" が登場したのでそれを使いましょう。

qiita.com

blog.tokoyax.com

qiita.com

3. Dockerのコマンドを叩く

おおまかな流れは以下のリンクを参照

qiita.com

コマンドのチートシート

qiita.com

Dockerfileのチートシート

qiita.com

4. Docker Hubを利用する

自作したイメージの管理には、Docker Hubが便利です。
私はjettyにwarを乗っけたものをDocker Hubにあげていたりします。

Docker Hubの使い方は以下のリンクをご参照のこと。

Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる - さくらのナレッジ

"LAMP" ならぬ "EDoMoS" 【1. EDoMoSとは】

どーも、管理人の細川です。
Digital Blogも投稿者が増えて来ましたね!
これからは投稿者の名前を記して行こうかと思います。

今回は"EDoMoS"の話をしようと思います。
聞いた事がない?

それは当然。"EDoMoS"は私が考えた言葉です。

EDoMoSとは、LAMPに対抗する、Webアプリケーション構築パターンです。

LAMP (ソフトウェアバンドル) - Wikipedia

  • EDoMoSの内訳
    E: EC2
    Do: Docker
    Mo: MongoDB
    S: Scala

OSやWebサーバはどこにいったんだという話ですが、
Dockerを利用する以上、OSはLinuxで、
Webサーバは好きなものを使ってくれ、というスタンスです。

EC2の上にDockerという二重の仮想化に違和感を覚えるかもしれませんが、
EC2はHW構築の簡素化が目的で、DockerはMW構築の簡素化が目的です。

MongoDBはデータ定義の柔軟性、Scalaはスケーラビリティを期待しての採用です。

私は実際には、ScalaフレームワークLiftを使い、
WebAppサーバはjettyを採用しています。

ここは好みによっては、Playなどでもいいのかな、と考えております。

次回からは各要素についての解説を書いていこうと思います。