4.22.2013

Git: How to Rewrite Author's Name of the Last Commit

Git: 直前のコミットログの「作者」を書き換える

Gitで誤った名前でコミットをしてしまった場合の対応方法のメモ。

ディレクトリ単位のユーザ名・メールアドレスの設定 (--global でも可)

$ git config user.name 名前
$ git config user.email メールアドレス

を行って

$ git commit --amend

としても 前に記録された Author は書き変わってくれない。

$ git commit --amend --author="名前 <メールアドレス>"

とするのが正解。

4.21.2013

The Future of Computer Shogi

コンピュータ将棋の未来

2013年4月20日、現役プロ棋士とコンピュータ将棋ソフトの対局イベント「第2回将棋電王戦」の第5局が行われ、
三浦弘行 八段 が GPS将棋(東京大学大学院 Game Programming Seminar) に敗北した。

GPS将棋開発者の談話にもあるように、たった一度の勝敗で優劣を結論づけることはできないが
一つのマイルストーンとして重要な意味を持つ日となったことに異論はないだろう。

2005年(もう8年も経ってしまった)に発行された書籍に「コンピュータが勝ったあとの心構え」が書かれているので
読み返してみる。
Amazon.co.jp: アマトップクラスに迫る―コンピュータ将棋の進歩〈5〉: 松原 仁: 本 

 

コンピュータがプロに勝つということの定義

「プロに勝つ」という言葉は曖昧なので、まずはその条件を固定化しなければあまり意味がない。

  • 勝つ回数
    1回勝つのと多数回では意味が違う。
    多くの対局を重ねた上で、どの程度の勝率を得られるか。
    コンピュータオセロは何回やってもコンピュータが勝つという状態に既になっている。 
     
  • プロのレベル
    平均的プロと順位戦Aクラスの間、Aクラスと最強の間には大きなレベル差がある。
    つまり、羽生三冠や渡辺竜王は、三浦八段よりも果てしなく遥かな高みにいるということだ。 
     
  • 対局条件 
    • 持ち時間
      一般に、持ち時間が短いほどコンピュータが有利だと言われている。
      名人戦と同じレギュレーション(9時間, 2日制)だった場合にどうなるのか。 
    • 心理的要因
      たとえば、観客がいると人間にはプレッシャーになる。
      今回のような生中継であれば尚更だろう。
      体調やバイオリズムの問題もある。
      コンピュータにはそんなものを感じる仕組みはない。 
       
  • 人間プレイヤの対策
    人間が前もって対策を講じているかが最も重要なファクターとのこと。
    コンピュータのコードや特性を体系的に研究すれば効果は大きい。

「数回以下の対戦で、特にコンピュータ将棋を研究していない平均的プロとの戦いで、
持ち時間25分切れ負けで互角に戦う」レベルは2年半後に達成されるだろう

この本が発行された2005年の2年半後なので、既に過去となり、この予測は現実となった。

しかし、「多数回の対戦で、コンピュータ将棋を体系的に研究している名人との戦いで、
名人戦と同じ持ち時間で、コンピュータが勝ち越す」のはさらに数年後のことだろう

と予測している。
棋士の間でソースコード読書会が行われる光景が目に浮かぶ。

 

コンピュータが勝ったあとの心構え

しばらくするとどうやってもコンピュータ将棋に人間プレイヤが勝てないようになる。これは必然である。

オセロは既にこうなった。チェス・将棋も時間の問題である。
囲碁はもっと先の話であろうが、その日は必ずやってくる。

人間同士の対戦こそ将棋文化の中心であることを忘れてはならない

やはり人間の尊厳の問題。
ひとたび人間が負ければマスコミは大きく取り上げるだろうが、それに踊らされないようにと警鐘を鳴らしている。

コンピュータ将棋はあくまでも将棋文化のそれほど大きくない一部であって、中心であるべきではない。

 

勝敗に一喜一憂したり、プロの指し手に感動したりする気持ちは持ち続けてほしいと切に願う。 

 

一方、これは私の直感であるがコンピュータ将棋にはまだまだ改善の余地があると思うし
おそらくあと数回、Bonanza の登場・オープンソース化のような大きなイノベーションが起こる気がする。

最終的には将棋を解くこと(先手勝ちかどうかを結論づけること)も決して不可能ではないと信じている。

そうなれば、そのアルゴリズムは様々な分野へ応用されていくに違いない。

(ただし、アルゴリズムが人間に牙を剝く未来がくることを忘れてはならない
  ケヴィン・スラヴィン 「アルゴリズムが形作る世界」 | Video on TED.com

 

何はともあれ、5月3〜5日に開催される第23回 世界コンピュータ将棋選手権がますます楽しみになった。

  

References 

4.13.2013

Getting Started with R

R はじめました

オープンソースの統計解析用言語「R」が面白いらしい。
百聞は一見に如かずということで、とりあえずインストールだけはしておく。

環境は OS X 10.7。 

インストール

ちょうど今月にバージョン 3.0.0 がリリースされた様子。

公式サイト
The R Project for Statistical Computing

「CRAN mirror」から 適当なサイトを選んでOSに合ったパッケージをインストール。
特筆すべきは何もなく、ただYesマンになるだけ。

Install R 3 0 0 for Mac OS X 10 6 or higher  Snow Leopard build Continue
Install R 3 0 0 for Mac OS X 10 6 or higher  Snow Leopard build Continue
Install R 3 0 0 for Mac OS X 10 6 or higher  Snow Leopard build Continue
Screenshot 4 13 13 24 05

License を読んで Agree

Install R 3 0 0 for Mac OS X 10 6 or higher  Snow Leopard build

Install

その後、OSユーザのパスワードを聞かれたら入力

Install R 3 0 0 for Mac OS X 10 6 or higher  Snow Leopard build 2 Close

 

起動

プログラムを立ち上げると、R Console という GUI が実行される。

まずは手習いとして、カリフォルニア大学アーバイン校(UCI Machine Learning Repository)の
アイリス(植物のアヤメ)のデータ(UCI Machine Learning Repository: Iris Data Set)を表示させてみよう。

こちらのデータを iris.csv としてホームディレクトリに保存する。
http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

データはカンマ区切りとなっており、自然界にあるアヤメの
ガクの長さ、ガクの幅、花弁の長さ、花弁の幅、学名
が150セット記述されている。 

そして、ファイルの先頭行に次のような見出しを追加しておく。

sepal_length,sepal_width,petal_length,petal_width,class
R Console 初期画面
R Console 2

iris <- read.csv('iris.csv') で
データをオブジェクトに格納。

iris と打てば全データが表示される。

R Console

str(iris) でオブジェクトの構造を表示

R Console summary(iris) で基礎統計量を表示
Quartz 2 plot(iris$sepal_length, iris$sepal_width) でガクの長さと幅の関係を散布図にプロット
Quartz 2 hist(iris$sepal_length) でガクの長さのヒストグラムを表示

  

References 

RjpWiki - RjpWiki

4.05.2013

Question for Ten Million Yen Annual Income

年俸1000万の会社の試験問題 (二番煎じ)

少し前に話題になっていた、年収1000万の会社の試験問題をScalaで解く、の二番煎じ。

 

問題

Recruit - cgios technologies Inc.

4種類のアルファベット "A,C,G,T" から成るn文字の文字列のうち、
"AAG"という並びが含まれる文字列を全て列挙するプログラムを書きなさい。
ただし、nは3以上の整数とし、文字列内に同じアルファベットが出現しても構わないものとし、
出力順序は問わないものとします。

 

コード
  • 整数の累乗

これは自前で行った。
オーダーは悪い Θ(n) だが、n > 6 だとそもそも列挙する気が起きないのでコードの短さを優先。

import scala.math.BigInt

def pow(x: BigInt, y: Int): BigInt = if (y <= 0) 1 else x * pow(x, y - 1)
  • カウント
漸化式 + 無限Stream でカウント。
一度も "AAG" が出現しないパターンの場合の数を考える。 
def count(n: Int): BigInt = {
  lazy val a: Stream[BigInt] = (0 to 2).map(pow(4, _)).toStream #:::
    (a zip a.drop(2) map { case (x, y) => 4 * y - x })
  pow(4, n) - a(n)
} 

2013-04-05追記: n が小さいので、単純な再帰でも十分計算可能。

def count(n: Int): BigInt = if (n < 3) 0 else count(n - 1) * 4 - count(n - 3) + pow(4, n - 3)
  • 列挙
1文字を2ビットに圧縮し、ビット演算で列挙してみた。
def getList(n: Int): List[String] = {
  def check(x: BigInt): Boolean = x match {
    case _ if x == 0 => false
    case _ if (x % 64) == 0x3e => true
    case _ => check(x / 4)
  }
  def decode(n: Int)(x: BigInt): String = {
    (n - 1 to 0 by -1).toList.map(i => "CTGA"(((x / pow(4, i)) & 3).toInt)).mkString("")
  }
  (BigInt(1) until pow(4, n)).toList.filter(check).map(decode(n))
}
  • 実行例
// Count
(3 to 20) map count foreach println

// Enumerate
(3 to 6) map getList foreach println

 

実行結果
1
8
48
255
1268
6048
28033
127248
568480
2508031
10953452
47439632
204027713
872266264
3710060880
15709957631
66262531556
278519934528
List(AAG)
List(CAAG, TAAG, GAAG, AAGC, AAGT, AAGG, AAGA, AAAG)
List(CCAAG, CTAAG, CGAAG, CAAGC, CAAGT, CAAGG, CAAGA, CAAAG, TCAAG, TTAAG, TGAAG, TAAGC, TAAGT, TAAGG, TAAGA, TAAAG, GCAAG, GTAAG, GGAAG, GAAGC, GAAGT, GAAGG, GAAGA, GAAAG, ACAAG, ATAAG, AGAAG, AAGCC, AAGCT, AAGCG, AAGCA, AAGTC, AAGTT, AAGTG, AAGTA, AAGGC, AAGGT, AAGGG, AAGGA, AAGAC, AAGAT, AAGAG, AAGAA, AAAGC, AAAGT, AAAGG, AAAGA, AAAAG)
List(CCCAAG, CCTAAG, CCGAAG, CCAAGC, CCAAGT, CCAAGG, CCAAGA, CCAAAG, CTCAAG, CTTAAG, CTGAAG, CTAAGC, CTAAGT, CTAAGG, CTAAGA, CTAAAG, CGCAAG, CGTAAG, CGGAAG, CGAAGC, CGAAGT, CGAAGG, CGAAGA, CGAAAG, CACAAG, CATAAG, CAGAAG, CAAGCC, CAAGCT, CAAGCG, CAAGCA, CAAGTC, CAAGTT, CAAGTG, CAAGTA, CAAGGC, CAAGGT, CAAGGG, CAAGGA, CAAGAC, CAAGAT, CAAGAG, CAAGAA, CAAAGC, CAAAGT, CAAAGG, CAAAGA, CAAAAG, TCCAAG, TCTAAG, TCGAAG, TCAAGC, TCAAGT, TCAAGG, TCAAGA, TCAAAG, TTCAAG, TTTAAG, TTGAAG, TTAAGC, TTAAGT, TTAAGG, TTAAGA, TTAAAG, TGCAAG, TGTAAG, TGGAAG, TGAAGC, TGAAGT, TGAAGG, TGAAGA, TGAAAG, TACAAG, TATAAG, TAGAAG, TAAGCC, TAAGCT, TAAGCG, TAAGCA, TAAGTC, TAAGTT, TAAGTG, TAAGTA, TAAGGC, TAAGGT, TAAGGG, TAAGGA, TAAGAC, TAAGAT, TAAGAG, TAAGAA, TAAAGC, TAAAGT, TAAAGG, TAAAGA, TAAAAG, GCCAAG, GCTAAG, GCGAAG, GCAAGC, GCAAGT, GCAAGG, GCAAGA, GCAAAG, GTCAAG, GTTAAG, GTGAAG, GTAAGC, GTAAGT, GTAAGG, GTAAGA, GTAAAG, GGCAAG, GGTAAG, GGGAAG, GGAAGC, GGAAGT, GGAAGG, GGAAGA, GGAAAG, GACAAG, GATAAG, GAGAAG, GAAGCC, GAAGCT, GAAGCG, GAAGCA, GAAGTC, GAAGTT, GAAGTG, GAAGTA, GAAGGC, GAAGGT, GAAGGG, GAAGGA, GAAGAC, GAAGAT, GAAGAG, GAAGAA, GAAAGC, GAAAGT, GAAAGG, GAAAGA, GAAAAG, ACCAAG, ACTAAG, ACGAAG, ACAAGC, ACAAGT, ACAAGG, ACAAGA, ACAAAG, ATCAAG, ATTAAG, ATGAAG, ATAAGC, ATAAGT, ATAAGG, ATAAGA, ATAAAG, AGCAAG, AGTAAG, AGGAAG, AGAAGC, AGAAGT, AGAAGG, AGAAGA, AGAAAG, AACAAG, AATAAG, AAGCCC, AAGCCT, AAGCCG, AAGCCA, AAGCTC, AAGCTT, AAGCTG, AAGCTA, AAGCGC, AAGCGT, AAGCGG, AAGCGA, AAGCAC, AAGCAT, AAGCAG, AAGCAA, AAGTCC, AAGTCT, AAGTCG, AAGTCA, AAGTTC, AAGTTT, AAGTTG, AAGTTA, AAGTGC, AAGTGT, AAGTGG, AAGTGA, AAGTAC, AAGTAT, AAGTAG, AAGTAA, AAGGCC, AAGGCT, AAGGCG, AAGGCA, AAGGTC, AAGGTT, AAGGTG, AAGGTA, AAGGGC, AAGGGT, AAGGGG, AAGGGA, AAGGAC, AAGGAT, AAGGAG, AAGGAA, AAGACC, AAGACT, AAGACG, AAGACA, AAGATC, AAGATT, AAGATG, AAGATA, AAGAGC, AAGAGT, AAGAGG, AAGAGA, AAGAAC, AAGAAT, AAGAAG, AAGAAA, AAAGCC, AAAGCT, AAAGCG, AAAGCA, AAAGTC, AAAGTT, AAAGTG, AAAGTA, AAAGGC, AAAGGT, AAAGGG, AAAGGA, AAAGAC, AAAGAT, AAAGAG, AAAGAA, AAAAGC, AAAAGT, AAAAGG, AAAAGA, AAAAAG)

 

References

年俸1000万の会社の試験問題 - kencobaの日記