2014年5月31日土曜日

私と主成分分析と独立成分分析

データマイニング・ビッグデータなるものが流行っている.
多くの顧客情報や取得したセンサデータやログを対象にして,
何らかの数理的な仕組みを使って有用な知見を導き出すことである.

この「数理的な仕組み」の部分は,学生時代にPRML(Pattern Recognition and Machine Learning)を読んでいたこともあり,
読めばサクッと頭のなかに入ってくる.
特に主成分分析や独立成分分析は面白かったと記憶している.


主成分分析と私
主成分分析は,高次元データを低次元データで表現するために分散が最大になるような軸を見つけ出して整理するといった手法.
固有値固有ベクトルの数理的な問題に落とし込めるエレガントさがあったと記憶している.

学生時代は,グー・チョキ・パーの手の形をした膨大な画像を仕分ける課題が与えられたのが主成分分析と出会ったきっかけだったのだが,その数学的な美しさに感動していた.

数学的に美しいものは実装も容易で,画像のパターン認識くらいであれば,2次元画像をベクトル化して,定式化された式にぶっこんで学習フィルタを設計するだけ.
京大は研究費が結構貰えるありがたい環境だったので,MATLABが必ず与えられていた.
MATLABで書くと100行もいかなかったと記憶している.
# 今思うとこれがものすごくゆとり脳をつくる元凶だった
# C++で最適化するくらいのスピード狂にでもなっていれば優れたソフトウェアエンジニアになれていたと思う.

独立成分分析と私
あれは研究室選びをしていた学部三回生の頃だった.
あの頃は不景気だったこともあり,「就職できる」研究室選びを主眼においていた実につまらない学生だった.
バイオは就職できないし,機械系はドカタだし...なんて本当に失礼なことを考えていた.
そこで出会ったのが音声信号処理の研究室.
そこでは二人の話者が同時に喋った音声を分離する,「音源分離」という技術を見せてもらった,これが非常に面白い.
混ざった音声を分ける仕組みがどういうものなのか知りたくて知りたくて震えた.
聞いてみると独立成分分析という理論が使われている模様.
独立なサンプルの平均はガウス分布に近づくといった性質を逆手に取ることで,独立な信号に仕分ける仕組み.
# いまだによくわかっていない
「これがあればみんな聖徳太子になれるやん!」なんてことを言っていたのを思い出します.大学に来てくれた独立成分分析の権威 aapo hyvärinenさんの本を掲載しておく.多分日本語版だとこれが一番詳しくて正しい.



いろいろ思い出していくとやはり高度な数学的な香りがするお遊びが好きなようで,
数値解析・信号処理熱が再燃してきました.
修士課程のときに参加したICASSP(信号処理の世界的な学会)では,
音声認識やら雑音除去の研究論文発表をGoogle,Microsoft, IBMがこぞってやっていました.
ハイテク企業の彼らに少しでも近づきたいので私も個人的に研究活動をスタートしなければならん気が勝手にしてきたのでPCに環境セットアップする!

学生の時みたいに高価なMATLAB様は使えませんので,無料で何かできないか探したところ,見つけました.

無料でデータマイニングできちゃう,そうPythonならね
私はMBAでおしゃれにデータマイニングしたいので,
Mac上のVirtualbox仮想環境でUbuntuいれてリンクにある手順でセットアップしました.

2014年5月27日火曜日

いわゆるIoTの先駆け、SmartThingsが素晴らしすぎる件


IoT( = Internet Of Things ) というワードがいつのまにやら現れました。
直訳すると、「モノのインターネット」。
様々な家電製品を家庭内のLANに繋いでコントロールすることを意味します。


最近の家電業界に目を向けてみると全体的に
個々の製品はコモディティ化していて、今後は価格競争になって儲かんねー!って悩んでるように見えます。
多機能路線であったり、お客さんから分からないレベルのちょっとした高機能化程度の進歩にとどまってる。

今後の正しいイノベーションの方向性としては、
パソコン・クルマ・キッチン・冷蔵庫・洗濯機等々、全部をつないでより便利なシステムのトータルコーディネートが求められます。

これからは、白物家電・クルマ・PC等の機器類がいい感じにつながって、
ユーザーが気持ちよく使えるようなものが求められてる。ちょうど下の図のように。



この文脈に沿った会社がKickstarter(= アメリカの有名なクラウドファンディング)で2012年に資金調達に成功した。
その名は

SmartThings



動画を見てわかると思いますが、2014年の今はまだ家のインターネット化は進んでいません。
家がインターネットに接続されたら何ができるのか、未来の家電はどう進化するのかをいち早く先取りできるこのデバイス。

セットアップはすごく簡単でだれでもできる3つのステップ。
 1. 製品キットを買う
 2. スマホアプリをインストールする
 3. デバイスの接続設定をする



スマホからiPhone/Androidアプリを経由して家電製品を制御する未来をいち早く体感したい方には是非おすすめ。若干高い気がするけども未来への投資と、技術動向の調査という観点で私は購入する予定です!


2014年5月26日月曜日

シリコンバレーで部屋の照明が再発明されてたことを知る

The lightbulb reinvented

LIFX® is a wifi enabled, multi-color, energy efficient LED light bulb that you can control with your smartphone.

シリコンバレーで今度は部屋の照明の再発明が行われてたようです( @2012年 )
LED照明がWiFi経由で屋内LANにつながって、スマホ経由で部屋の照明のON/OFFや色の制御ができちゃうというスグレモノ。

ユースケースとしては、
 - 気分に合わせて好きな色が選べる
 - タイマーをセットして照明を消す
 - SNSからのPUSH通知にあわせてLEDを点滅させてお知らせ
 - 寝るときにタイマーかけてゆっくり照明を暗くする
 - cafeやバーのおしゃれな照明に使う
 - 電気の消し忘れがあったときに外から消す
 - 音楽に合わせて照明を変える
 - スマホなくした時はハードウェアボタンで代替する
なかなかあったら嬉しいものです。

2012年のデバイスだから今の視点で見ると色々と改善点が見えてくる。
そもそも伝送量なんて数ビットなのでWiFiである必要が無い。
WiFiルーターのセットアップもいちいち面倒。

こういう時に選択すべき技術はBluetooth。
一度ペアリングすれば以降はマスタ・スレーブの関係で直接つながるので便利。
部屋の照明は日常的に使うものなので省エネのためBLEで代替すべき。

あと、どうせWiFi使うんだったらコントローラ側はiPhoneに限定するだけじゃなくて、他のデバイスからも制御できるようにしたいところ。
Restful APIを用意するとかしてHTTPで制御できるとかだと嬉しいかも。
本気で商用利用するのであれば、Webサーバー経由での制御ができると楽だし。

2014年5月24日土曜日

Raspberry Pi を買ってみたら幸せになった話。


遅ればせながらRaspberry Piを購入しました。これ、コスパ最高!
電子工作もできちゃう小さなLinuxとして使えます。
セットアップが驚くほど簡単で敷居がめっちゃ低いです。
プロトタイピングやらお勉強やら様々な用途で活躍中。

平々凡々なWindowsユーザーから見た、主要なLinux利用パターンのメリット・デメリットをざっくりまとめてみました。

メリット
デメリット
仮想環境
他のOSとの共存ができる
高いPCスペックが必要
メモリ割り当て等の設定が難しい
デュアルブート
ホストOSとしての軽快な動作
ブートローダーの設定が面倒
パーティションの設定が面倒
他のOSとの共存ができない
クラウド
sshでのログインでお手軽
IaaSベンダのHow to記事が充実
お金がかかる
Raspberry Pi
セットアップが簡単
電子工作入門が用意
ウェブ上に記事が充実
4000円程度でかなり安い
省電力
CPUが貧弱(700MHz)


Raspberry Pi のメリットについてそれぞれまとめていきます。

セットアップが簡単

Raspberry Piは、学校で基本的なコンピュータ科学の教育を促進することを意図して作られたものです。セットアップは簡単です。
SDカードにOSを焼いて、本体に差し込んで電源つけるだけです。
OSを焼くという行為がめんどくさい方、もしくはゆとりの方はamazonでRaspbianOS入りSDカードを買うとよいでしょう!(ちなみに私は面倒だったので買いました)






電子工作入門が用意


GPIOがむき出しなので、直接ジャンパーさして回路組めばハードウェア制御もラクにできます。
Lチカしてサクッと動作確認したらマイコン買ってきてつなげればなんでもできます。
つまづきたくない人は流行っているものを買ってみるといいでしょう。
ウェブ上にも情報が豊富なのでデバッグとかもしやすいですよ。



ハードウェアのセットアップが終わればソフトの実装に移るわけですが、
GPIOの制御用のコマンド(ライブラリ?)としてはshell, C, python等々あります。
色々メリット・デメリットありますが、私はpythonをおすすめします。
コンパイル要らずでコードが理解しやすいので




  こちらより引用。動作確認済
 http://netlog.jpn.org/r271-635/2013/01/raspberry_pi_gpio_test.html



ウェブ上に記事が充実

英国発祥なので英語の記事はかなり充実してます。
最近では日本国内でもScratchのハッカソンとかやってるのでraspberry Piも市民権を得たといってもいいでしょう。

4000円程度でかなり安い

超安いです。Amazonで4000円位で買えちゃいます。
PCを買って勉強することを考えたらコスパの高い買い物なんです。




省電力

700mA(3.5W) で1年間起動させっぱなしでも、1000円もかからないです。

※ 見積もり計算 : 電気料金が 30[円/kWh]と仮定
   3.5[W] * 24[h] * 365 * 30/1000 [円/Wh]  ≒ 920円

データビジュアライゼーションのためのd3.js最速入門




D3.jsとはなにか?


 D3 = Data Driven Document
 データビジュアライゼーション向けJavascriptライブラリ
 公式サイト: http://d3js.org/
 必要な知識: html, css, javascript, SVG
 できること:
   データのグラフ化
   ヒートマップ
   デンドログラム
   地形図
   (参考) 数字で見るFacebookのIPO
  



導入方法


1. ライブラリのリンクをして、
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>

2. 要素を指定(select selectAll)して、値の設定や取得をするだけ

    // text, attr, style, append, remove
    var p = d3.select("body").selectAll("p");
    // method chain
    p.text("Hello from d3!")
        .style("font-size", "28px")
        .style("font-weight", "bold");
    // brief description
    p.text("Hello from d3!")
        .style({
            "font-size" : "28px",
            "font-weight": "bold"
        });

学習メモ

詳しくはdotinstallを参照。
勉強用のソースコードをgithubにもおいておく。
 https://github.com/ks6088ts/d3.js

2014年5月17日土曜日

非同期勉強会に参加してきた

先日,C#エンジニア向けの非同期勉強会なるものがあったので参加してきました.
私はC#というよりはC,C++系の人間ですが,非同期処理についてはしょっちゅう実装する機会がありましたので,非同期処理の一般的な話についての知見を深めるために参加しました.
当日の講師の方々はMicrosoft MVPを取られた技術に明るい人ばかりで,すごく豪華な勉強会でした!


以下概要.

2014/05/10 (土) 13:00 - 18:00

非同期勉強会開催

非同期勉強会を開催します!
非同期処理はC#5.0から非常にシンプルな記述で出来るようになりました。ただシンプルに記述できるようになったからと言って簡単に書けるとは限りません。そこで、日本中から集まった豪華エキスパートの方々から半日間非同期の話をみっちり聞きまくる非同期Day、非同期勉強会を開催します。
これから勉強を始めたい方も、現在勉強中の方も、既にバリバリ使っている方も初心者向けから幅広くセッションを行いますので是非参加してくださいー。

スケジュール

12:45 開場

講師時間タイトル/概要プロフィール
鈴木 孝明 @xin9le13:00-13:50「.NETにおける非同期処理の歴史」 .NET Frameworkが登場してから12年、非同期処理の記述方法もC#/.NETと共に進化してきました。この進化の歴史を今一度確認し、それぞれの方法をおさらいしてみましょう。社会人になってからプログラミングを始めるも、新人研修の担当が某C# MVPという幸運に恵まれたラッキーボーイ。Hokuriku.NETの中心メンバーとして北陸のIT業界を盛り上げるべく鋭意活動中。最近はSignalRが大好き。Microsoft MVP for Visual C# (2012/07-2014/06)。
森理麟@moririring14:00-14:50「C#の高速化入門」 高速化の話をメインに非同期とマルチコアとマルチスレッドについての説明を入れながらゲームプログラマです。C#が好きでスピーカーをしたり、勉強会を開催したりしています。「VSハッカソン倶楽部」の主催です。C#、VS、ハッカソン、自動化、CI、TDD、Unity、リファクタリングが好きです。Microsoft MVP for Visual C#(2013/01-2014/12)
 遥佐保(はるかさお)@hr_sao15:00-15:30「C++/CXの非同期処理まとめ」 ブログ 出没コミュニティ→Room metro、C++テンプレート完全ガイド読書会 Microsoft MVP for Client Development [Jan,2014 - Dec,2014]
山本 康彦 @biac15:40-16:30「Windows ストア アプリでスレッド間排他処理(仮)」 async/awaitでlockは使えない。それじゃ、どう書けばいいのか?実践編このところ Windows ストア アプリばかりやってます。@IT で「WinRT/Metro TIPS」連載中。昨年出版した「C#によるマルチコアのための非同期/並列処理プログラミング」は、それなりに売れてるらしいです。以前はSIer勤務で業務アプリばかりやってました。もっと以前は自動車の開発やってて、さらに前は大学で自動制御をやってたという、よく分からない人生(笑
岩永信之 @ufcpp16:40-17:30「非同期処理の基礎知識」 スレッドの切り替えやデータ競合の回避など、非同期処理に関わるコストやその回避方法を、CPUやOSレベルの話も交えて解説します。++C++; の中の人。C# でぐぐれ。
@yone6417:30-17:35非同期LT
@pocketberserker17:35-17:40非同期LT
@StoneGuitar77717:40-17:45FriendlyLT
@moririring17:45-17:50次回予定
17:40-18:005分間で何かLTしてくれる人を募集します!

2014年5月11日日曜日

Raspberry Piで遊びつつ技術習得をするまとめ( Node.js, Socket.IO, Samba, カメラモジュール, Dropbox)

目的

Raspberry Piで遊びつつ技術習得をする!
買うならRaspberry Pi Type B 512MBの奴が使いやすくていいっすよ。


習得する技術

1. Node.jsでウェブサーバーを立てる
2. Socket.IOでローカルチャットサーバーを立てる
3. Sambaでファイル共有サーバーを立てる
4. カメラモジュールで監視システムを作る
5. デバイスのGPIO制御をブラウザから実行してみる



1. Node.jsでウェブサーバーを立てる

まずはNode.jsのインストール。
下記リンクにある方法でNodeをインストールします。
⇒ 【Node.js】nvmをインストールして設定するまでの方法

【注意】
 - Raspberry Piの貧弱CPUでビルドするので2h近く掛かる
 - nodeの設定をターミナル起動時に毎回読み込む必要があるため、
  以下を参考にして、 .bashrc等に設定スクリプトを入れる。
  http://d.hatena.ne.jp/white_chi/20111101/1320097898

インストールできているかは以下で確認。
$ node -v

NodeでのHello worldはこんな感じにサクッと書けます。



2. Socket.IOでローカルチャットサーバーを立てる

以下のコードを実行してSocket.IOをインストール
$ npm install socket.io

環境設定はこれで完了したので、あとはサンプルアプリを実装して動作確認したいところ。
少し知識が必要な部分なので、こちらはdotinstallのSocket.IO入門を参照。
あとはこっちも参考にしましたね。
http://lealog.hateblo.jp/entry/2012/10/04/005326
実装コードはこんな感じ。

<サーバーサイド>

<クライアントサイド>


動作方法の一例としては、raspberry piにsshで入って以下のコマンドで実行でサーバーを立てる
$ node app.js

raspberry piと同一のLANに接続されたPCからブラウザで以下のURLにアクセス
http://192.168.11.4:9999/

【注意】
IPアドレスは実行環境に合わせて変更する必要があります。
この辺自動取得しておくべきところですが面倒なのでハードコーディングしてしまっています。。

3. Sambaでファイル共有サーバーを立てる

Sambaのインストール
$ sudo apt-get install samba

Sambaの設定
sudo nano /etc/samba/smb.conf

以下の設定を追記
# 末尾に追加
[share]
path=/home/pi/share
read only=no1
browsable=yes
guest ok = yes
force user = pi 
共有ディレクトリを作成
$ mkdir /home/pi/share # 共有ディレクトリ作成

sambaが自動起動するように設定


$ sudo update-rc.d samba defaults; sudo update-rc.d ssh defaults

【 参考リンク 】
sambaのインストール:
  http://j-caw.co.jp/blog/?p=1046
共有ディレクトリへのアクセス:
  http://junkroom2cyberrobotics.blogspot.jp/2013/01/raspberry-pi-windows-samba.html


4. カメラモジュールで監視システムを作る

【カメラモジュールの設定】

監視システムの構成は以下のとおり。
- カメラモジュールをつかって画像を取得
Amazonで3000円やそこらで買えちゃいます。

買ったら以下の動画を参考にしてセットアップします。

ソフト側の設定も変更しなきゃいけないので以下を参考にして設定変更します。
http://www.rs-online.com/designspark/electronics/jpn/blog/jpn-raspberry-pi-camera-module-setup

ここまで設定できたら以下のコマンドで画像が撮れるか検証。

$ raspistill -o image.jpg

画像の確認方法として手っ取り早いのは、sambaで設定した共有ディレクトリ上に撮影した画像を置いて、ホストPCからエクスプローラ経由で画像を確認すると楽かも。

【cronで定期的にタスクを実行する】

cron編集:
$ crontab -e
cronの表示:

$ crontab -l
cronの設定:

*/10 * * * * hogehoge.sh # 10分に1回実行
00  * * * *  hogehoge.sh # 1時間に1回、毎時00分に実行
45 23 * * * hogehoge.sh  # 1日1回、毎日23時45分に実行

あとは、hogehoge.shにカメラ動作コマンドをぶち込んで実行すれば定期的に写真が取れるようになります。

【参考リンク】
http://www.limemo.net/blog/2013/07/%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%AEcron%E3%81%A7%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99.html

【Dropboxにアップロード】

すっごくまとまっているし、手順通りやればDrobboxにアップロードできるようになったので以下のリンクを参照下さい。
 http://daisukeblog.com/?p=2067
 


5. デバイスのGPIO制御をブラウザから実行してみる

後で書きます。