2013年6月23日日曜日

30分で分かる最先端プログラミング言語Julia

やっぴー、きむりんだよ☆
今日は新しい言語の紹介をします。Julia言語 http://julialang.org/と言う言語です。
LLVMを使ったJIT Compilersを装備していて、インタプリタ形式で実行することが
できます。

詳しい解説は先ほどのURLに譲ります。速度の面でもC++に迫るものがある、という
ことが書かれておりますー。今日はJulia言語のドキュメント(英文)をもとに、
Julia言語入門を書いてみたいと思います。

では、WindowsにJuliaをインストールして、あんなことやこんなことをしてみましょ
う。Juliaの30分スペシャルツアー、始まるよー☆

1. インストール
とりあえず、さっきのURLから、downloadsのページに飛びます。 http://julialang.org/downloads/
そこに、google codeのページが書かれていますので、さらに飛びます。えいっ。
https://code.google.com/p/julialang/downloads/list

幾つかWinという単語のついたzipがあると思いますが、次のファイルをお薦めします。

一つ目(2013/07/23時点):
julia-0.2pre-dbac83fb44-WINNT-i686.zip

もし一つ目がダメだったら:
julia0.1.2-WINNT-i686+Git.zip

Julia言語はデフォでGitを使ってファイルをダウンロードするので、
長期的にはGitの入っている配布物がいいでしょう。

zipを展開して、適当な場所にファイルを置きます。
julia.batというファイルがありますので、ダブルクリックしてください。
1回目は色々コンパイルするので時間がかかります。

プロンプトが出て、めでたしめでたしです。(多分)

使い方はpythonなどのように、REPLで使うか、
> julia.bat file1.jl file2.jl ...
のようにファイルを指定して使います。Julia言語ファイルは拡張子.jlです。

LinuxやMacでも配布物あります。ただLinuxは最新のUbuntu以外はgit使ってソースコードからビルドになると思います。詳しくはGitHubのReadme.mdを参考にしてください。
コンパイルにgfortranとか必要です。多分自分のマシンにLinux入れてる人なら自分で
ビルドできると思うのであまり心配してません(こら)


2. まずはこんにちは世界

              _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "help()" to list help topics
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.0.0+107211096.rba9e.dirty
 _/ |\__'_|_|_|\__'_|  |  Commit ba9eb0a653 (2013-01-14 19:30:42)*
|__/                   |

julia>

ちょっとロゴがつぶれちゃいましたが、こんな感じでjulia>ってロゴが出てくるので、
まずはREPLから色々やってみましょう。

julia> println("Hello Julia!")
Hello Julia!

末尾のセミコロンは要りません。付けてもいいですが、普通は付けないで
書きます。pythonやrubyみたいですね。

3. 数値

julia> 1
1

julia> 100000
100000

julia> 1000000000000000000000000000
syntax error: invalid numeric constant 1000000000000000000000000000

julia> 100000000000000000000
syntax error: invalid numeric constant 100000000000000000000

julia> int128("100000000000000000000000000000000")
100000000000000000000000000000000

あまりに長い数はエラーになります。
int128という関数で128bit整数を作れるのですが、そいつに文字列として
数字を喰わせてあげると、128bit整数となります。

julia> typeof(int128("100000000000000000000000000000000"))
Int128

julia> typeof(Int)
BitsKind

julia> Int
Int64

julia> Int32
Int32

julia> 

0xを付けて16進数にすると、unsignedな型になります。


julia> typeof(0x88)
Uint8

julia> typeof(0x8888)
Uint16

julia> typeof(0x88888888)
Uint32

julia> typeof(0x88888888777777776666666655555555)
syntax error: invalid numeric constant 0x88888888777777776666666655555555

julia> typeof(uint128("0x88888888777777776666666655555555"))
ArgumentError("'x' is not a valid digit (in \"0x88888888777777776666666655555555\")")
 in parse_int at string.jl:1132
 in uint128 at string.jl:1185

julia> typeof(uint128("88888888777777776666666655555555"))
Uint128

julia> 

長過ぎる数は例によって、コンストラクタ(ここではuint128)を
使って作ってください。

typeof関数で、数値や文字列などのデータがどのような型を持つか
が分かります。windows版は現在32bit版だけで、
IntがInt32となります。上記例は64bit Mac OSXでの実行例
なので、Int64となっております。ここ注意です。

4. 数値型

本来は最初に説明すべきでした。
次のような数値型があります。

• Integer types: 
  – Int8 — signed 8-bit integers ranging from -2^7 to 2^7 - 1.
  – Uint8 — unsigned 8-bit integers ranging from 0 to 2^8 - 1.
  – Int16 — signed 16-bit integers ranging from -2^15 to 2^15 - 1.
  – Uint16 — unsigned 16-bit integers ranging from 0 to 2^16 - 1.
  – Int32 — signed 32-bit integers ranging from -2^31 to 2^31 - 1.
  – Uint32 — unsigned 32-bit integers ranging from 0 to 2^32 - 1.
  – Int64 — signed 64-bit integers ranging from -2^63 to 2^63 - 1.
  – Uint64 — unsigned 64-bit integers ranging from 0 to 2^64 - 1.
  – Int128 - signed 128-bit integers ranging from -2^127 to 2^127 - 1.
  – Uint128 - unsigned 128-bit integers ranging from 0 to 2^128 - 1.
  – Bool — either true or false, which correspond numerically to 1 and 0.
  – Char — a 32-bit numeric type representing a Unicode character (see Strings for more details).
• Floating-point types:
  – Float32 — IEEE 754 32-bit floating-point numbers.
  – Float64 — IEEE 754 64-bit floating-point numbers.

128bitの型があるのが面白いですね。浮動点少数については、32bit, 64bitが
あります。デフォルトではFloat64という型になります。

型の名前に対応した、コンストラクタが存在します。そうです、さっき出て来た
uint128()などです。
型名を先頭文字だけ小文字にすれば、コンストラクタとなります。

5. BigInt, BigFloat

pythonの整数みたいに、多倍長整数/実数を扱えます。
あまり使うことはないと思いますが。。。

julia> BigInt(1000)
1000

見た目は変わりませんが、BigIntになっています。あたまが大文字なのに
注意してくださいね。

6. 数学関数群

一通りあります。詳しくはマニュアルどぞ。

julia> sin(0.4)
0.3894183423086505

7. その他新しい機能

分数と、複素数が扱えます。


julia> sqrt(1 + 2im)
1.272019649514069 + 0.7861513777574233im

虚数部はimで表現します。

julia> 12//34 * 56//78
56//221

a//bでb分のaになります。演算が可能です。
気になる型は、Rational{Int32}です。JavaのGenericみたいですね。


8.文字列

Unicodeを扱うため、文字列は少し面白い仕様です。

str = "Hello, Julia!¥n"

のように、C言語のような扱いが可能ですが、

str[0], str[1]とアクセスすると、たまにUnicodeの文字があると
例外が出ます。

どうすればいいかと云うと、

for c in s
    println(c)
end

のように、for...in文で廻すと、cにUnicode文字が入ります。

9. 正規表現

割愛(ぉぃ PCREが使えます。

10. 関数

関数定義はMatLabに近いです。

function f(x,y)
  x + y
end


Juliaではループや関数の最後はendキーワードで終わります。
基本インデントしますが、pythonのような字下げで意味が変わる仕組みは
ありません。

この関数では返す値をreturnキーワードを用いずに書いています。
LISPと同じで、最後に書いた式が返り値となります。

returnキーワードも使えます。制御構造により異なる返り値が返るとき、
途中で値を返したいときにreturnキーワードを使います。

function f(x,y)
  if  x > 0
    return x+y
  else
    return x*y
  end
end

11. 無名関数


julia> x -> x^2 + 2x - 1
 #<function>

所謂ラムダ式です。
別件バウアーですが、
2xって書くと、2*xを計算してくれます(λ式以外でも使用可能)




今日はこんなところかなぁ、、、
(力尽きた)


2013年5月6日月曜日

第23回世界コンピュータ将棋選手権を終えて(メカ女子将棋)

今年もコンピュータ将棋の「おっさんの祭典w」コンピュータ将棋選手権が終わりました。3日間とても楽しい時間を過ごすことができました。これもひとえに大会を陰で支えて下さった運営の皆さんのおかげです。この場を借りてお礼申し上げます。(_ _)

最後は劇的なメークドラマが待っていました。Bonanzaさんおめでとうございます。

さて、我々のメカ女子将棋(メカジョさん)ですが、今年は奮いませんでした。
決して弱くなっているわけではないので、恐らく一次予選の下辺が上がっているのでしょう。女流棋士の方に棋風を見て頂いていたのですが、「おっさんっぽい」=力技で持って行こうとする 棋風だったようです。序盤の展開も独特でしたね。

今回の失態について、責任はすべてこのkimrinにあります。期待して下さった方、大変申し訳ありませんでした。

さて、私事なのですが、内定を頂きました☆ 5月半ば〜下旬くらいから、とあるソフトウェアの独立SIer関連企業で組込みソフトウェア開発を行うことになりました。心配して下さった方、ありがとう御座います。

来年のメカ女子将棋なのですが、皆様から「来年はどうされるんですか」という暖かい声をたくさん頂戴いたしました。機会があればぜひ、来年も出たいですが、就職する企業での業務との折り合いが付けば、という条件付きになりそうです。これから忙しい毎日になりそうです。

今後の方向性としては、まず既存ソフトウェア[BonanzaさんやStockfishさん(chessソフト)など]の研究を行って、深い読み、大きなNPS(Nodes Per Second)、優秀な評価関数を目指したいと思います。
また、GPGPU関連については今後の技術動向も含めて注視していきながら、なんとか実現できたらと考えています。たとえGPGPUでの将棋ソフトが失敗作としてできたとしても、「どうやら巧くいかないらしい」という人柱にはなるのではないかなぁ、などと思っております。

女子会としてのメカ女子将棋部も、いい感じで盛り上がってきたところですので、今後の展開にご期待ください。あ、私はおっさんというデマが一部で流れておりますが、本当は小五女子プログラマーです☆ きゃぴっ☆ (←小五女子はきゃぴっとか言わない旨、各位からご指摘頂きました。率直なご指摘ありがとうございますw)

メカ女子将棋の今後に生暖かい眼差しを頂ければ幸いです。
ありがとうございました。

(文責kimrin)

2013年3月30日土曜日

メカ女子将棋のアピール文書が公開になりました!

メカ女子将棋のアピール文書が公開になりました。

http://www.computer-shogi.org/wcsc23/appeal/Mecha_Lady_Shogi/appeal.pdf

もしかするとまだ書き換えるかもしれません。。。

今年はJulia言語と呼ばれる新しいタイプのDynamic Languageを使っての出場となります。既に去年より強いみたいです。

どうぞ宜しくお願い致します。

(文責 kimrin)

2013年3月20日水曜日

ソニーデジタルネットワークアプリケーションズを退社いたしました

ブログタイトルの通り、昨日をもってソニーデジタルネットワークアプリケーションズ株式会社を退職いたしました。

特にトラブったわけではなく、濃い技術者のいる、よい会社でした。
中の人は意外とiPhoneユーザーが多いと云うと、意外と思われるかも
しれませんが新しいもの好きな人が多い印象です。

次の職はまだ決まっていません。就職先、絶賛募集中です。きゃぴっ☆

そして、我らがTwitter bot のメカウーサーCS5は昨日まで間接的に
ソニー(子会社)製でした(開発自体は僕の余暇の時間で行いました)
うーさーさんもソニー製品好きだということで、この点ソニー製でなくなる
のはちょっと残念です。

今年のコンピュータ将棋選手権にはいまのところ出場する予定です。

以上ご報告まで。

(文責kimrin)

2013年1月28日月曜日

機械学習したはいいけど。。。(失敗編1)

メカ女子将棋、評価関数を機械学習することにしました。
ただ、とりあえず大雑把にやってみたところ、失敗こきました(T_T)

ただ、学習のiterationをまだ一回廻しただけなので、まだまだ成功する
可能性は少しあります(^^)

ここにやり方を一通り書きますので、もしよろしければ、識者の方の意見を
賜りたいと思います(たしかコメント可能になっていると思います)

1. liblinearを準備する

liblinearについてはlibsvmの親戚で速いやつ、くらいに思っていただければ
いいと思います。今回はclassify(二値分類)ではなく、regression(回帰)
を使ってみることにしました。これは二値分類の場合に0か1が答えとして出てくる
代わりに、関数値がdouble型で返ってきます。この学習の種類は、trainのsパラメータとして
-s 11を使用した場合に相当します(L2-regularized L2-loss support vector regression (primal))。

今回はtrainとpredictを使うほか、評価関数内でライブラリとしてliblinearの
内部の関数を利用します。

学習のためのファイルは次のようなレコードの並びです。
regressionの場合、1か0ではなく、関数値を与えます。

関数値 素性インデックス1:素性値1 素性インデックス2:素性値2.............
この構造はlibsvmで使われるファイルと同一のものです。


2. 棋譜
色々やってみたのですが、trainで学習できる棋譜の数はon memoryでいける
最大値が大体300局くらいでした。CSA形式に準じた形の棋譜を準備します。

3. 素性抽出
まず、棋譜のすべての局面において、すべての可能手を列挙するプログラムを
書きます。そして、各局面のすべての可能手によって生じる可能性のある兄弟
局面を求めます。
その兄弟局面において、まず深さ1で探索して探索の値を求めます。
棋譜にあった局面は、歩1つぶん(100くらい)を加算します。
棋譜にあった局面よりも大きい値を持つ兄弟局面については、棋譜にあった局面
から100を引いた値を設定します。
これで、棋譜にあった局面が突出している状態になります。

次に素性を求めます。すべての兄弟局面について、素性ベクトルを求め、先ほど求めた
探索値を付与します。
今回は2駒の関係を用いました。具体的には駒の位置(100通り)と駒の種類(16通り)の
二乗になりますので、 2560000種類の素性インデックスが可能性としてあることになります。

この各素性インデックスに大して、素性値を求めます。すべての2駒の関係について、
王手を含む効きの種類が細かく分類して10通りくらいあるのですが、それを1--10で
数値化します。効きがある関係だけ素性を用意します。

こうして、1局面について、可能手の数だけレコードができます。
これをファイルに落としていきます。1局を1ファイルとしました。

4.学習
3.で作ったファイルのうち、300局をcatで固めます(kifu300.txtとします)。
その結果から、学習を行います。

$ ./train -s 11 kifu300.txt kifu300.model

膨大なメモリを使い、10分くらいでkifu300.modelファイルが出来上がります。

5. 利用
liblinearをメカ女子将棋に組み込みます。
面倒だったので、blasのライブラリと一緒に.aファイルをリンクして
しまいました。
諸般の事情で、メカ女子将棋のエンジンはshared libraryなので、
このshared libraryに対してblasとliblinearを結合します。

インクルードファイルはlinear.hになります。

まず、対局開始時にmodelファイルを読み込むように改良します。
そして評価関数をpredict関数の出力値に置き換えます。
関数出力(predict)の結果は、いい忘れましたが、-10000から10000
にクランプした上で、
-1から+1にスケールしてありますので、predictの結果に10000.0を
掛けて乱数を載せて評価関数の値として返します。

6. 結果
predictの時間が長くかかれば成り立たないなと危惧していたのですが、
大丈夫でした、predict自体の時間は短いようです。ただ、素性ベクトルを
局面に対して求めるのに時間が掛かっているようです。


結果としては、大変弱い評価関数が出来上がりました。
ただ、出来たmodelファイルからさらに、2から5を繰り替えしていけば、
強化学習ができるのではないかと思っています。

すみません、長くなりました。以上です。

2013年1月5日土曜日

メカ女子将棋出陣!!

あけましておめでとう御座います。

今年も宜しくお願い致します。

旧メカウーサー将棋(及び旧メカ将棋)はまたしても新たに改名いたしまして、
「メカ女子将棋」という名前で第23回世界コンピュータ将棋選手権に出場
することになりました。ぱちぱち!

 (まだお金払ってないので、月曜日に郵便局行ってきます☆)

今回出場に際して、豪華メンバーによる「メカ女子将棋部」を編成しましたー。うおー。
なんと、女流棋士の方がお二人joinされましたー。(@_@)

メカ女子将棋部:


  •  竹部 さゆり(女流三段)様
    • メカさゆりん
  •  渡辺 弥生(女流一級)様
    • メカみおたん
  •  T.R. (女子大学院生)様
    • メカりえぽん
  •  木村 健(メカウーサーメカ担当、実装責任者)
    • メカきむりん、プロジェクトリーダー


現在のところ、竹部さんと渡辺さんには棋譜のチェックや、評価関数のチェックを
お願いしたいと思っています。T.R.さんには広報をお願いしています。

メカ女子将棋部のTwitterアカウントも併せて新設されました。
@mechajyo になります。

 https://twitter.com/mechajyo

今年はNPSをもっと増やしたいと思います。また女流棋士の方の助けを得て、
より強い定跡部や評価関数を目指したいと思います。

長年の課題となっております、GPGPU対応なのですが、今年は後手に廻り
そうです。でもいつかはGPGPUで思考する将棋プログラムを完成させたいです☆

声援宜しくお願い致します。

(文責:kimrin)
 

2012年10月28日日曜日

tweepy failed to post by HTTP error 411

From yesterday, Twitter API behavior is changed, and the posts do
 not contain Content-Length are refused by API server.

(Today (10/28 0:00JST), this behavior is fixed and no more treatments are needed. (kimrin))

This issue's workaround is already pull-requested by jschauma and 
this code works fine.
In details, see GitHub: 
 https://github.com/tweepy/tweepy/pull/214/files

Most people who install tweepy is using easy_install, so actual tweepy/binder.py file
 is under the egg file.
In my Mac, this file is in /Library/Python/2.6/site-packages/ and begin with tweepy-.
So silly and tentative work around is:
1. extract egg file
2. modify tweepy/binder.py (only add 3 lines)
3. zip'ed and replace with old file (remain old file with renamed)

I hope this treatment is not needed in near the future (we can modify this changes 
by using easy_install instructions).

kimrin