Page List

Search on the blog

2015年9月29日火曜日

[NewLang] Learn Scala(1)

 なんとなく新しい言語を学びたくなったので、Scalaについて勉強していこうと思う。
まずは、tutorialspointというサイトの『LEARN SCALA PROGRAMMING』を読んでみた。今日は半分くらいまで読んだ。

学んだこと
  • 2003年にMartin Odersky氏によって開発された言語
  • オブジェクト指向言語
  • 関数型言語
  • 静的型付け言語
  • JVM上で動作する
  • すべてオブジェクト。Primitive型はない。
  • mutableな変数はvarで宣言
  • immutableな変数はvalで宣言
  • 型推論あり
  • アクセス修飾子はprotected/privateの2つが指定可
  • アクセス修飾子を省略するとpublic
  • イコール記号とメソッドのボディを省略すると、メソッドはabstractになる
  • voidの代わりにUnitを使う
  • methodはクラスに属する処理
  • functionは変数に代入できる完全なオブジェクト
  • 戻り値の無い関数はprocedureと呼ばれる
  • call-by-name(変数: => 型)を使うと遅延評価
  • 無名関数は引数 => 戻り値のように宣言
  • 関数の部分適用をサポート
  • 関数のカリー化ができる

環境インストール
MacにScalaの環境をインストールした。
> brew install scala
> brew cask install scala-ide

サンプルプログラム
FizzBuzz、ユークリッドの互除法、たらい関数を書いてみた。
object FizzBuzz {
  def main(args: Array[String]) {
    var i = 0;
    for (i <- 1 to 100) {
      if (i % 3 == 0 && i % 5 == 0)
        println("FizzBuzz")
      else if (i % 3 == 0)
        println("Fizz")
      else if (i % 5 == 0)
        println("Buzz")
      else
        println(i)
    }
  }
}
object Gcd {
  def main(args: Array[String]) {
    println(gcd(132, 66));
  }
  def gcd(a:Int, b:Int) : Int = {
    if (b == 0)
      return a
    return gcd(b, a%b)
  }
}
object Tarai {
  def main(args: Array[String]) {
    println(tarai(20, 10, 5));
  }
  def tarai(x:Int, y:Int, z: => Int) : Int = {
    if (x <= y)
      return y
    return tarai(tarai(x-1,y,z), tarai(y-1,z,x), tarai(z-1,x,y))
  }
}

2015年9月27日日曜日

[Coursera] Game Theory Week 3: Alternate Solution Concepts

"N Seoul tower"

 I started taking "Game Theory" lecture of Stanford University on Coursera platform two weeks ago. I am going to keep track of the lectures here on my blog.

Result:
  • Video Lectures: all seen and understood
  • In-Video Quizzes: 2/2 (passed)
  • Problem Sets: 5/5 (passed)

What I learned:
  • strictly dominated strategy
  • iterated removal of strictly dominated strategies
  • relation of Nash Equilibrium and iterated removal method
  • maxmin strategy
  • minmax strategy
  • Minimax theorem (von Neumann, 1928)

2015年9月24日木曜日

[TED] Rajiv Maheswaran: The math behind basketball's wildest moves

 TEDでリスニング第二回目。
スポーツで利用される機械学習の技術について語られる。プロのスポーツチームがデータサイエンスの手法を用いているのは有名だが、ここまで高度な技術が使われているのは知らなかった。機械がコーチにアドバイスするとか、もはやSFの世界だ。


ラジブ・マヒシュワラン氏と彼の同僚は”点の科学”に魅了された。

点とは何か?
点とは我々のことである。家庭やオフィスで移動する点、買い物や旅行をするときに移動する点である。この点は私たちの街を、そして、世界中を移動する。この点の動きを理解できたら素晴らしいことではないか?移動のパターン、意味を理解できたとしたら。

幸運にも、現在を生きる私たちには情報をキャプチャするための方法に恵まれている。
センサー、ビデオ、アプリなどをつかえば、移動情報を驚くべき正確さで収集できる。もっともデータ収集に適した場面の一つは”スポーツ”だ。

スポーツ選手の動きを点で表してみただけでは、面白いことは起こらない。
人間はこの生データをすべて見ることはできないし、機械はこの生データから意味のある情報を取り出すことはできない。
それでは、機械を学習させて、”コーチの眼”を与えるとどうだろうか?

まず彼らは、バスケットボールゲームを例に、パス、シュート、リバウンドという概念を機械に教えた。それからポストアップやピックアンドロール、ダウンスクリーンなどのより複雑な概念を教えた。
これらの概念をどのように教えたのだろうか?
例えば、ピックアンドロールというプレーはプレイヤーの微妙な動き、位置、タイミングなどのニュアンスが難しく概念を正確に表現することは困難だ。それを解決したのが機械学習である。
機械学習を使うことで、表現することが非常に困難な概念を機械に教えることができた。
機械に、「これはピックアンドロールだ」、「これはピックアンドロールではない」と教え、それらの違いを”コンピュータ自身に”学習させるのである。

今年のNBAチャンピオンシップに参加したチームのほぼすべてが、この機械学習ソフトを使っている。このソフトを使えばプレイヤーの動きを判定するだけでなく、試合に勝つために戦術をどのように変えればいいのかをアドバイスすることもできる。これはとてもエキサイティングなことである。30年間在籍したコーチが機械の出したアドバイスを喜んで受け入れるのだから。

今や機械はラジブ氏より多くのことを知っている。これはそれほど特別なことではない。
それでは、機械がコーチより多くのことを知っているだろうか?答えはYESだ。
我々は人間はプレーの良し悪しを感覚的には知覚できるが、定量的には知覚できない。機械にはそれができる。プレイヤーの位置・速度、ゴールまでの距離、ゴールとの角度などをもとに空間情報をモデル化し、シュート成功率を計算できる。

この機械のおかげで、プロの選手じゃなくても選手の動きを追うことができる。
そしてこれはスポーツに限定した話ではない。我々は常に移動しているのだ。
それは私の娘が始めの一歩を歩いた瞬間を教えてくれるかもしれない。建物のよりよい活用法や、よりよい都市計画を教えてくれるかもしれない。

”点の科学”により、われわれはよりよく、より賢く、前進することができるだろう。

2015年9月17日木曜日

[TED] Fei-Fei Li: How we're teaching computers to understand pictures

 最近Apple Musicをインストールしてから、通勤時間中はESLじゃなくて音楽ばかり聴いている。つい最近までやっていた海外オフィスとのミーティングの通訳(全然役目を果たせなかった泣。いやあればインド人が…)も終わり、英語を聞く時間が確実に減っている。

 ということで、毎週木曜日をTEDの日にして、動画見て要約するということをやっていこうと思う。第一回目はスタンフォードの人工知能ラボのディレクターを務めるFei-Fei Li氏のスピーチだ。


要約

コンピュータがオブジェクトを認識するのは難しい。
コンピュータ上では画像は二次元配列上に配置された意味のない数字にすぎないからだ。

彼女はコンピュータビジョンと機械学習の研究を行ってきた。
コンピュータに物を認識させる、人を判別させる、物の関連を理解させる、物の動きを理解させる、物体の意識を理解させるというのが最終的な目標だ。

最初のステップはコンピュータに物体を認識させることだった。
例えば猫を認識させることを考える。最初のアプローチはコンピュータに猫の形を教えることだった。これはうまくいかなかった。変な体勢の猫や、隠れている猫をうまく認識させることができなかったのだ。

8年前、ブレークスルーがあった。
子供はどのようにみることを覚えるのだろうか?
彼らは、200ミリ秒に1度新しい画像を見ている。3歳になるころには数億枚もの画像を見ていることになる。
これをコンピュータビジョンにも適用できないだろうか?
よりよいアルゴリズムの開発に集中するよりも、アルゴリズムに大量の良質の訓練データを与えることに集中したほうがよいのではないか?

それから大量の画像を集めるプロジェクトを始めた。
インターネット上で数十億の画像を集めた。クラウドソーシングを使い画像のラベリングを行った。2009年にはIMAGENETプロジェクトは、英語でラベリングされた1500万の画像を有するに至った。

訓練データが集まったところでアルゴリズムだ。IMAGENETのデータは、あるアルゴリズムととても相性がよかった。Convolutional Neural Networkだ。
IMAGENETConvolutional Neural Networkの組み合わせは大成功だった。
猫の認識はもちろんのこと、画像中の車のモデル、年式さえも正しく認識できるようになった。

これでコンピュータは人間の能力に追いついたのだろうか?
いや、まだオブジェクトが認識できるようになったにすぎない。
次のステップは画像を見せて画像の内容を文章で説明できるようにすることだ。
画像の一部分を単語と結びつけるようなモデルを使って、コンピュータに画像と言語の関連を学習させた。画像から人間が使う自然な言語を自動で生成する世界最初のコンピュータの完成だ。

象の隣に男性が立っている
飛行場の滑走路に大きな飛行機がとまっている

上記のような文章をコンピュータが画像から自動で生成することができるようになった。
次のステップは、画像の中の物体に関する知識や補足情報を表現すること、画像の中の人間の感情や思想を認識させることだ。
コンピュータビジョンの発達により、医療、自動運転技術、災害時に活動するロボット、人類未踏の地の開拓への応用が期待される。

2015年9月14日月曜日

Gitのdiffのタブ幅設定

Haneda Airport (Midnight)

Gitでdiffしたときにデフォルトのタブ幅が8になっていて見にくかったので、タブ幅を設定した。

以下のコマンドを実行すると、デフォルトのページャがタブ幅4のlessに設定される。
その結果、diffしたときに見やすくなる。

git config --global core.pager 'less -x4'

という、まあそれだけ。

2015年9月11日金曜日

Javaから外部プロセスを起動する

Javaから外部プロセスを起動するサンプルを書いてみた。
  1. 外部プロセスを実行する
  2. 別スレッドで外部プロセスを実行する
の2つのサンプルを書いた。

外部プロセスを実行する
まずは簡単な例から。

以下のようなechoTwice.pyというプログラムを用意しておく。
#!/usr/bin/python

if __name__ == '__main__':
    x = raw_input()
    print x * 2

上記のプログラムをJavaから外部プロセスとして起動する。
以下のようにプロセスの標準入出力を使ってデータをやりとりすることも出来る。
package com.kenjih.sample;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;

public class Sample1 {
	public static void main(String[] args) throws IOException {
		
		Scanner sc = new Scanner(System.in);
		String word = sc.nextLine();
		sc.close();
		
		new Sample1().run(word);
	}
	
	public void run(String word) throws IOException {
		ProcessBuilder processBuilder = new ProcessBuilder("./echoTwice.py");
		Process process = processBuilder.start();
		BufferedReader reader = 
				new BufferedReader(new InputStreamReader(process.getInputStream()));
		BufferedWriter writer = 
				new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
		
		writer.write(word);
		writer.newLine();
		writer.flush();
		
		String ret = reader.readLine();
		System.out.println(ret);		
	}
}

別スレッドで外部プロセスを起動する
次に別スレッドで外部プロセスを起動するサンプル。
別スレッドで呼び出すことで”制限時間付き”で外部プロセスを起動できる。
以下のようなechoWithDelayというプログラムを用意しておく。このプログラムは与えられた文字列をechoするだけだが、文字長に等しい秒数だけスリープする。
#!/usr/bin/python

import time

if __name__ == '__main__':
    x = raw_input()
    time.sleep(len(x))
    print x
このプログラムをJavaから別スレッドで起動する。
スレッドから処理結果を戻り値として受け取りたい場合は、Futureクラスを使うと便利。
5文字以上の文字列を渡すと処理時間オーバーとなり、例外がスローされる。
package com.kenjih.sample;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Sample2 {
	
	class Task implements Callable<String> {
		
		private final String word;
		
		Task(String word) {
			this.word = word;
		}
		
		@Override
		public String call() throws Exception {
			
			ProcessBuilder processBuilder = new ProcessBuilder("./echoWithDelay.py");
			Process process = processBuilder.start();
			BufferedReader reader = 
					new BufferedReader(new InputStreamReader(process.getInputStream()));
			BufferedWriter writer = 
					new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

			writer.write(this.word);
			writer.newLine();
			writer.flush();
			
			String ret = reader.readLine();
			return ret;
		}
		
	}
	
	public static void main(String[] args) throws IOException {

		Scanner sc = new Scanner(System.in);
		String word = sc.nextLine();
		sc.close();

		new Sample2().run(word);		
	}
	
	public void run(String word) {
		
		ExecutorService executor = Executors.newSingleThreadExecutor();		
		Future<String> future = executor.submit(new Task(word));
		
		try {
			System.out.println(future.get(5000, TimeUnit.MILLISECONDS));
		} catch (InterruptedException | ExecutionException e) {
			e.printStackTrace();
		} catch (TimeoutException e) {
			e.printStackTrace();
		} finally {
			executor.shutdown();			
		}
	}
}

2015年9月1日火曜日

MacBook買った!

 最近MacBookを買った。設定したことを概要レベルでメモしておく。

キーボードまわりの設定
キーのリピート→最速に設定
リピート入力認識までの時間→最短に設定
修飾キーの設定→controlをcommand、optionをcontrol、commandをoptionに設定
メタキーとしてOptionキーを使用→On
Spotlight検索のショートカットキーをalt + spaceに変更(ctrl + spaceはemacsで使いたい)
ファンクションキー→標準のファンクションキーとして使用

パッケージマネージャ
Homebrewをインストール
Homebrew Caskをインストール後、caskroom/cask、caskroom/versionsをtap

プログラミング環境の構築
gcc/g++のインストール→ターミナルにg++と入力するとdeveloper toolsのインストールを促されるのでそこから
java/javac→brew cask install java7
eclipse 公式ページからダウンロードしてapplicationフォルダに格納

前のPCからのデータ移行
Dropboxで同期

Bashの設定
~/.bash_profileを編集

export PS1="\u$ "
export CLICOLOR=1

export LSCOLORS=DxGxcxdxCxegedabagacad

その他
OpenOfficeインストール