2009年8月9日日曜日

[fedora11] rubyからmysqlを使う

なぜか

gem install mysql

でインストールできない、あらゆるオプションを試したが無理。

yum install ruby-mysql

でインストールできた。


なんだこれ、どういうことかわからなーい

[追記]

gccが入ってなかった(恥ずかしすぎる)

gccを入れた後

gem install mysql -- --with-mysql-config --with-mysql-lib=/usr/lib/myql --with-mysql-include=/usr/include/mysql

でOK!

2009年7月30日木曜日

ruby on rails インストール後のエラー達

railsのインストールは簡単

gem install rails --include-dependencies

でできる。

プロジェクトの作成は

rails [プロジェクト名]

でできる。ここでエラー

SSLEAY32.dllがありません。ウェブで調べてSSLEAY32.dllを持ってきてruby/binに入れればOK。

とりあえず作ったプロジェクトのwebサーバを起動

ruby script/server

OK。


コントローラを作成。

ruby script/generate controller [コントローラ名]

OK。(ここではコントローラ名はDispとした、作成されるファイル名はdisp_controller.rb)

アクションを作成。

---------------------------------------------------------------------
def [アクション名]
end
---------------------------------------------------------------------

OK。(ここではアクション名はhelloRailsとした)


ビューを作成。

ファイル名はhelloRails.rhtml

内容は適当なhtml書けばいい

OK。


ブラウザから動作確認してみる

http://localhost:3000/disp/helloRails

ここでエラー。

500 internal server error

エラーログを見てみると

「sqlite3にアクセスできません」と書いてある。

あたりまえだw sqlite3入ってないしw

どうやらデフォルトでsqliteを使うことになってるらしい(Rails 2.0.2)

mysqlを使いたい人は、プロジェクト作成のときに

rails -d mysql [プロジェクト名]

でプロジェクトを作成すれば良いらしい。


もう一回動作確認。

また500 internal server error

エラーログ確認

access denied user root@localhost password:NO

あーパスワード設定しなきゃいけないのか

config/database.ymlをいじってパスワード設定。(見ればすぐ分かるはず)



もう一回動作確認

また500 internal server error

エラーログ確認

unknown database hello_development

そりゃそうだ、そんなデータベース作ってないし。

じゃあ作る。

----------------------------------------------------
mysql -u root -p
Enter password: **********

mysql> create database hello_development;
----------------------------------------------------


もう一回動作確認。



出来たーーーーーーーーーーーーーーーーー(感動)

てな感じで。でてきたエラーこんなもん。

2009年7月16日木曜日

mysqlのアンインストール

MySQLのアンインストール・・・、やっかいだぜ


MySQLを「プログラムの追加と削除」からアンインストールするとゴミが残るらしい。


そのゴミのせいで新しくMySQLをインストールしても動かない。


Could not start the service MySQL.Error:0


このエラーが出る。


いろいろ調べた結果解決方法を見つけました。


アイビースター[Windows MySQLのアンインストール]


ふぅ、助かった。。。

2009年7月7日火曜日

rubyのちょっとしたメモ2 [例外処理]

何度調べてもすぐ忘れる(にわとり、いや、ひよこか)からメモする

[例外処理]

begin
# 例外が発生する可能性のある処理
rescue => e
# 例外が発生したときに行う処理、eには捕捉した例外が入る
else
# 例外が発生しなかったときに行う処理
ensure
# 例外が発生したかどうかに関わらず、必ず行う処理
end

<ソース>
------------------------------------------------------------
begin
 open('non-exist.txt')
rescue => error
 puts error
else
 puts 'ok'
ensure
 puts 'end'
end

begin
 open('exist.txt')
rescue => error
 puts error
else
 puts 'ok'
ensure
 puts 'end'
end
------------------------------------------------------------

<実行結果>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
No such file or directory - non-exist.txt
end
ok
end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


こんなことも覚えられない(笑)

rubyのちょっとしたメモ [each]

何度調べてもすぐ忘れる(にわとりだ//)からメモする

[each]

each_indexでインデックスによるイテレーションができる。

<ソース>
---------------------------------------------------------
char = ['a', 'b', 'c']

char.each_index do |i|
 puts i
end
---------------------------------------------------------

<実行結果>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
0
1
2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


each_with_indexでバリューとインデックスによるイテレーションができる

---------------------------------------------------------
char = ['a', 'b', 'c']

char.each_with_index do |c, i|
 puts i
 puts c
end
---------------------------------------------------------

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
0
a
1
b
2
c
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


eachにはこんな使い方もある

---------------------------------------------------------
a = ['taro', 18, 80]
b = ['jiro', 16, 70]
c = ['tagosaku', 15, 100]

array = [a, b, c]

array.each do |name, age, score|
 puts name
 puts age
 puts score
end
---------------------------------------------------------

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
taro
18
80
jiro
16
70
tagosaku
16
100
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



なるほど・・・、rubyおそるべし・・・。

2009年6月27日土曜日

[Ruby]シングルクォートをエスケープ

Rubyで正規表現を使ってシングルクォートをエスケープしようとした。

------------------------------
str = "I'm lovin' it"

str.gsub!(/'/, "\\'")

puts str
------------------------------

そしたらなぜかこうなった
(実行結果)
^^^^^^^^^^^^^^^^^^^^^
Im lovin' itm lovin it it
^^^^^^^^^^^^^^^^^^^^^


なぜだ・・・。意味が分からなすぎる。

いろいろ調べたけどどうしてそうなるのか分からなかった(笑)

で、結局違うやり方で

--------------------------------
str = "I'm lovin' it"

str.gsub!(/'/) do |m|
'\\' + m
end

puts str
--------------------------------

こうやったら

^^^^^^^^^^^^^^^^^^^^^^^
I\'m lovin\' it
^^^^^^^^^^^^^^^^^^^^^^^

ちゃんとできた。これで出来るならまぁいいか(妥協)




ちなみになぜシングルクォートをエスケープしたいかというと

RubyからMySQLにデータを入れるときにテキストでシングルクォートを入れたいから。

2009年6月24日水曜日

RubyでMySQLにアクセス

いやぁ大変だった。何も知らない状態から調べつつやるのって大変ね


無駄な手順があるかと思うけど踏んだ手順を全部書く


1, Ruby-1.9じゃだめと言われたからRuby-1.8を入れなおす

2, MySQL4.1を入れる

3, gem install mysqlでMySQL/Rubyを入れる

4, zlib.dllがないと言われるのでとって来たzlib.dllをruby/binに入れる

5, 以下のコードを動かしてみる

-------------------------------------------------------------------------------------
require 'rubygems'
require "mysql"

host = 'localhost'
user = 'root'
pass = 'rootpass'
dbname = 'test_ruby'

db = Mysql::connect(host, user, pass, dbname)

rs = db.query('select * from test_table')

rs.each do |item|
puts item[0]
end
--------------------------------------------------------------------------------------

6, 動いた!感涙・・・。





これ読んでも何も分からんね、また後で書き直そう

2009年6月20日土曜日

Twitter crawler with ruby 3

ライブラリを使わないでTwitter APIを使ってみた。

(JSONパーサは使ってるけど)

--------------------------------------------------------------------------------
require 'net/http'
require 'json'

request = Net::HTTP::Get.new('/search.json?q=hoge&rpp=2')
http = Net::HTTP.start('search.twitter.com')
response = http.request(request)
puts JSON.parse(response.body)
---------------------------------------------------------------------------------

>request = Net::HTTP::Get.new('/search.json?q=hoge&rpp=2')
はjson形式で結果を取得、文字列hogeを含む最新の発言を最大2件取得するという意味。


>response = http.request(request)
で、responseにはjson形式の文字列が返される


>puts JSON.parse(response.body)
response.bodyは、responseから#<net::httpok:0xc5f9e0>部分を取ったもの。
それをパースしてHash型で返す。


json形式の文字列がどんなものかは

http://apiwiki.twitter.com/Twitter-Search-API-Method%3A-search

のJSON exampleを見ればOK!

2009年6月19日金曜日

Twitter crawler with ruby 2

前回悩んでたサンプルコードが動く動かないの違いが分かった。

単純すぎて恥ずかしいけど(笑)。

どうやら使ってるライブラリが違うらしい。

twitter apiをrubyで使えるライブラリは3つくらいあるらしく、自分が使ってたのは

john nunemakerによるライブラリ http://twitter.rubyforge.org だった。



これからはこれとは違うライブラリ、twitter4r http://twitter4r.rubyforge.org/ を使っていこうと思う。

インストールの仕方は例のごとくちゃちゃっとググレで(笑)。



研究の関係で検索機能を実装したいんだけど、twitter4rのドキュメント http://twitter4r.rubyforge.org/rdoc/ を読んでもsearch系のメソッドがない・・・。

んで、探しに探してようやく見つけたsearch。

-------------------------------------------------------------------------------------
require 'rubygems'
require 'twitter'

client = Twitter::Client.new
puts client.search(:q => 'hogehoge', :rpp => 10)
-------------------------------------------------------------------------------------

このコードで文字列hogehogeを含む最新のつぶやきを最大10件取得できる。

また

-------------------------------------------------------------------------------------
require 'rubygems'
require 'twitter'

client = Twitter::Client.new
puts client.search(:from => 'yuto_ymgc', :rpp => 10)
-------------------------------------------------------------------------------------

で、yuto_ymgcが発した最新のつぶやきを最大10件取得できる。



ここで問題発生

yuto_ymgcが発したつぶやきの中で、文字列hogeを含むものを取得したいとき

--------------------------------------------------
client.search(:from => 'yuto_ymgc', :q => 'hoge')
--------------------------------------------------

としても何も返ってこない。

対応してないのかな。不便!

2009年6月17日水曜日

Twitter crawler with ruby

まずはRubyGemsのインストールとtwitterライブラリのインストール。

(やり方はちゃちゃっとググってください)

まぁたぶんここまでは簡単にできるんだけど

そこら辺に落ちてるサンプルコードを動かそうと思って

----------------------------------------------
require 'rubygems'
require 'twitter'

twit = Twitter::Base.new("mail", "pass")
twit.update('hooooo')
----------------------------------------------

ってやっても動かない。

なにやらBaseのinitializeは引数を二つじゃなく一つだけとるらしい。

でもこのタイプのコードでみんな動いてるらしいんだよなぁ・・・。なんでだろ


そんでいろいろ探してたら別のタイプのサンプルコード発見

----------------------------------------------------------------------------------------
require 'rubygems'
require 'twitter'

httpauth = Twitter::HTTPAuth.new('mail', 'pass')
twit = Twitter::Base.new(httpauth)

twit.update('hoooooo')
----------------------------------------------------------------------------------------

これだと動く(やったね)

理由はおいおい確認していくとして、とりあえず今回はAPIつかってtwitterに投稿できたってことでOK!

2009年6月12日金曜日

tf-idf

tf-idfについて頭に入れたから一度アウトプットしてみる。


tf-idfとは、文書中から特徴語を抽出するためのアルゴリズムである。

文書dに含まれるある語tに対応するtf-idf値が大きければ大きいほど、tはdの特徴をより表している語である。

tf-idfは、tf(term frequency)とidf(inverse document frequency)によって構成される。

tfは、文書中の単語の出現頻度を表す。当然、文書中によく現れる単語は文書の特徴を表すと言える。

idfは、その語がどれだけ多くの文書に含まれているかを表す。これは、多くの文書中に表れる単語はある一つの文書の特徴語にはなりえないと言う事を表す(a, the等)。

文書d中によく出現し、なおかつその他の文書にはあまり出現しない単語tは、tf-idfによってdの特徴語として抽出される。



具体的な計算法などは他のページを参照してほしい。

http://ja.wikipedia.org/wiki/Tf-idf
http://d.hatena.ne.jp/deepfolte/20080421/1208786699
http://chalow.net/2005-10-12-1.html

2009年6月4日木曜日

[cakephp]findメモ

findAllは非推奨になったため、find('all')を使う。

(古)
$this->model->findAll($conditions);
(新)
$this->model->find('all', array('conditions' => $conditions));


conditionsに複数条件を指定するとデフォルトではAND検索になる。

$conditions = array('title' => 'hoge', 'author' => 'piyo');
以下のようになる。
(title = 'hoge')AND(author = 'piyo')

OR検索をするときは次のように指定する。
$conditions = array('or' => array('title' => 'hoge', 'author' => 'piyo'));
以下のようになる。
(title = 'hoge')OR(author = 'piyo')

IN検索
$conditions = array('model.id' => array(1, 3, 5, 6));
$this->model->find('all', array('conditions' => $conditions));

こうするとmodel.idが1か3か5か6であるデータが取れる
*idは属性名が重複するのでmodel.idのようにテーブル名を付ける。

2009年6月3日水曜日

[オセロプログラム]一応完成

研究室の課題で作ってたオセロを一応完成とした。というかこれ以上の改善は自分には無理(笑)。


-実装した機能

--探索
コンピュータが次の手を捜すとき、まずは登録してある定石集から探す。具体的には現在の局面をキーとして定石集を線形探索、見つけた手の中から評価値がもっとも大きいものを次の手とする。

定石が見つからなかった場合、現在の手数によって中盤探索か終盤探索を行う。

---中盤探索
あらかじめ決めた深さnによって、n手読みをする。リーフノードの近くでは単純なアルファ・ベータ探索(実際にはネガアルファ探索)を行う。それ以外では、move orderingをし、置換表を用いたネガスカウト探索を行う。

----move ordering(中盤)
中盤探索では、一手読みをし、その評価値によって手をソートする。

----置換表を用いたネガスカウト探索
まず置換表を参照し、現在の局面が登録されているか探す。発見した場合は次の手、評価値を返す(一意に決まらない場合もある)。
発見できなかった場合は、ネガスカウト探索を行う。最探索をする場合も置換表があることによって、探索にかかる時間を短縮できる。

---終盤探索
手数があらかじめ決めた値に達したら終盤探索を行う。最後まで読みきり、石差を評価値として返す。中盤探索と同様にリーフノードの近くでは単純なアルファ・ベータ探索(ネガアルファ探索)を行う。それ以外ではmove orderingをし、置換表を用いたネガスカウト探索を行う。

----move ordering(終盤)
開放度によってソートする。開放度が等しい場合は一手読みをし、その評価値によってソートする。


--学習
強化学習(教師なし学習)を行う。プログラムが自分自身と対局し、その勝敗によって対局中に現れた局面を評価する。評価値はパターンによる評価値を用いる。局面を評価するとは、正確には全てのパターンの重みを学習するということ。
ちなみに定石は手動登録。



とまぁこんな感じで完成。本当はMPCとか実装したかったけど、自分には難しすぎて理解できませんでした。

研究室内オセロ大会に向けて目下強化学習中!!










-関連語句

アルファ・ベータ(α-β)探索
ネガアルファ探索
null window search
move ordering
開放度(mobility)
強化学習

2009年5月8日金曜日

[CakePHP]規約メモ

●モデル

 モデルのクラス名は単数形でキャメル記法です。Person、BigPerson、ReallyBigPerson などは規約に合ったモデル名です。
 CakePHP のモデルに対応するテーブル名は、複数形でアンダースコア記法です。上記の例で言えば、テーブル名はそれぞれ、people、big_people、really_big_peopleとなります。


●コントローラ

 コントローラのクラス名は複数形でキャメル記法です。最後にControllerが付きます。PeopleController、BigPeopleController、ReallyBigPeopleControllerなどは規約に合ったコントローラ名です。
 コントローラ内のメソッドにアクセスするためのURL は、小文字とアンダースコアを用いるというのが規約であり、RedApplesController::go_pick アクションにアクセスするための正しい形式は /red_apples/go_pick となります。


●ビュー

 ビューのテンプレートファイルは、それを表示するコントローラの関数に合わせた、アンダースコア記法で名前が付きます。 例えば、PeopleControllerクラスのgetReady()関数は、ビューテンプレートとして、/app/views/people /get_ready.ctpを探すことになります。
 基本パターンは、 /app/views/コントローラ名/アンダースコア記法_関数名.ctpです。



例:
・データベースのテーブル: "people"
・モデルクラス: "Person"、 場所は /app/models/person.php
・コントローラクラス: "PeopleController"、 場所は /app/controllers/people_controller.php
・ビューのテンプレート、場所は /app/views/people/index.ctp





http://book.cakephp.org/ja/view/22/CakePHP-Conventions

javaでunsigned(符号なし整数)

javaにはunsignedがなくて不便!


●javaでunsignedの数値データを扱う方法
http://d.hatena.ne.jp/fujioka0729/20071220/1198121245

符号なしbyteをintのキャストする方法


●自分でunsignedintクラスを作る。






Integerクラスに符号なし整数とみなして比較するメソッドがあればいいのに。なんでないんだろ?

[オセロプログラム]定石実装

やっと定石実装できた。。。


http://www.es-cube.net/es-cube/reversi/sample/index.html


いつも通り上のページを参考にして作ったけど、cからjavaに移植するの結構つらい(自分の能力だと)。


unsignedがないし、メモリ管理がどうなってるかとかいまいち理解してないし。


だめだめですねぇ


まぁそれはそうと、定石があると思考時間が一気に削減できるからなんか快感(笑)


手動で定石を登録していくんだけど、オセロの定石なんかわからん。どこから持ってこようか。








・マルチスレッド化
・相手の探索中(入力待ち時間)に探索

2009年5月5日火曜日

オセロプログラムの作成

大学の研究室の課題としてオセロプログラムの作成があるから作ってみた。

http://www.es-cube.net/es-cube/reversi/sample/index.html

上のページを参考にしてjavaで実装した。

すごく丁寧な解説があって、よくまとまっていて、とても参考になります。



minMax探索やらnegaMax探索やらα-β探索といった定番の探索アルゴリズムで実装したけどそれなりに強い。

強化学習恐るべし・・・

プログラム作成の期日までにあと定石ぐらいは実装しよう。

当然だけど既に自分で作ったプログラムに自分で勝てない(笑)








・定石の実装
・マルチスレッド化
・相手が思考している間に探索

2009年4月28日火曜日

ブログ

メモ帳がてらブログ作成

いままで続いたこと無いけど続くかな