QLOOK ANALYTICS

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

XserverでRubyGemsを使う

Xserverのrubyで色々やろうと思ったけどgemたたけなかったのでたたけるようにした。

Xserverはデフォルトではrubyインタプリタのパスしか通っておらず、
かつgemをインストールしようとすると当然パーミッションエラーで怒られるのでユーザーローカルにgemをインストールする必要がある。
ここではruby2.0.0を使用することを前提とする

まずはgemを簡単にたたけるようにする
mkdir ~/opt
mkdir ~/opt/bin
cd ~/opt/bin
ln -s /opt/ruby-2.0.0-p0/bin/gem gem
export PATH=~/opt/bin:$PATH


つぎにRubyGemsのインストール先(GEM_HOME)を設定する。
実はXserverではユーザーローカルのディレクトリからgemを読み込むように設定されている。
gem environment

↓出力
(略)
- GEM PATHS:
- /opt/ruby-2.0.0-p0/lib/ruby/gems/2.0.0
- /home/ユーザー名/.gem/ruby/2.0.0 ←これ
(略)

なんでここにインストールされるようにする。
export GEM_HOME=$HOME/.gem/ruby/2.0.0


以上。
あとはgem installでgemをインストールして普通にrequireできます。
スポンサーサイト

tag : Ruby Xserver

重力で落ちるゲーム

重力で落ちるゲームといえば?

そうです,ぷよぷよです.(?)

私はぷよぷよのことを重力で落ちるゲームと呼んでいます.
まあそんなことはどうでも良いのですが,

今回のBlueRedZoneの更新はなんと初の「ソフトウェア」カテゴリです.

内容は
Rubyぷよぷよを作ってみよう!のコーナー」
です.

その昔,ぷよぷよを作ろうと思ってチャレンジしたことがあるのですが,
くっつき判定のアルゴリズムしか書いていなかったりしていまいちよくわからなかった記憶がありました.
(無理やりフィーバーモードすら実装して完成させましたが,重い)

そこでRubyとゲームライブラリStarRubyを使ってぷよぷよを作ってみよう!となったわけです.
とはいっても現在完成には程遠いのですが,基本的な要素はすべて入っていると思います.
連鎖とか相殺とかね.

あくまでぷよぷよみたいなゲームを作るときのプログラムの設計のサンプルの役割ですかね.
gentlawkだったらこう作る!的なノリでやっているのでおそらく最適なプログラムとは程遠いと思いますが,
何かしらの参考になれば.

BlueRedZoneソフトウェアページ

また,そういった意味合いのものなので制作過程のソースコードがすべて見られるようにgithubにリポジトリがあります.
https://github.com/gentlawk/PuyoPuyo
ここからソースコードをダウンロードするか
git clone https://github.com/gentlawk/PuyoPuyo.git
でcloneしてください.
だいたいチャプターごとにリビジョンが分かれています.

tag : Ruby StarRuby ぷよぷよ

Ruby技術者認定試験

Ruby技術者認定試験Silver を受けてきました.
96/100点で無事合格
というかなんで2問間違えたしっていうレベルで簡単でした.

というのも



この本で勉強をしていったのですが,
相当似通った問題(もしくは同じ問題)ばかり出題されたので
(゜゜;)って感じでした.

Rubyは記述しやすく柔軟なぶん挙動のパターンを覚えておかないと
予期せぬ結果を招くことがあるので,
こういった試験を通してメソッドなどの挙動を確認しておくと,
今後の開発に役立つと思います.
というより少なくともSilverレベルに関しては
そういったことを覚えているかの確認問題のような内容でした.

次はGoldに挑戦したいですが,
受験料高いし,参考書ないしどうしようかなって思ってます.

テーマ : プログラミング
ジャンル : コンピュータ

tag : Ruby

最小二乗法

一個前のガウスの消去法をつかって最小二乗法も求められるようにしよう・・。


実験などで例えば理論値f=x+6に対して以下の実験結果が得られたとする


x , f
-4 , 2.15
-3 , 3.32
-2 , 3.78
-1 , 4.99
0 , 6.23
1 , 6.89
2 , 7.12
3 , 9.18
4 , 9.73


これの数値部分がdata.txtに保存されているとして、これを読み込んで実行すれば

lsm = LeastSquaresMethod.new
lsm.input_data("data.txt",",")
p lsm.polynomial(1) #=>[0.941333333333333, 5.93222222222222]

と、近似直線はf=0.94x+5.93と求まり、確かに近似直線として良さそうである。


ここで、input_dataの第二引数markはデータの区切り文字列で、
空白とかタブとかでxとfを区切ってあるファイルでも大丈夫なようにしてある。
ploynomialは読み込んだデータ点から近似多項式を求めるメソッドで、
引数mは多項式の次数である。
引数mを2にすれば二次関数の多項式の近似を出力する。



ソースファイル least_squared_method.zip



require 'gaussian_elimination'
class LeastSquaresMethod
def initialize
@data = []
end

def input_data(filename, mark = ",")
@data = []
open(filename,"r") do |file|
file.each_line do |line|
@data.push(line.split(mark).map{|v| v.to_f})
end
end
end

def polynomial(m = 1)
return "Dimension Error" if m < 1
return "No Data" if @data.empty?
invs_x,invs_f = involutions(m)
equations = Array.new(m + 1){[]}
equations.each_with_index do |eqation, n|
(m+2).times do |k|
if k == m + 1
p = m - n
eqation.push(invs_f[p])
else
p = 2*m - n - k
eqation.push(invs_x[p])
end
end
end
return GaussianElimination.new.solve(*equations)
end

def involutions(m)
data_x, data_f = @data.transpose
invs_x = [data_x.size]
invs_f = [data_f.inject(:+)]
1.upto(2*m) do |n|
invs_x.push(data_x.inject(0){|sum,x| sum + x**n})
invs_f.push(@data.inject(0){|sum,d| sum + d[1]*(d[0]**n)}) if n <= m
end
return invs_x,invs_f
end
end

lsm = LeastSquaresMethod.new
lsm.input_data("data.txt",",")
p lsm.polynomial(1)

tag : Ruby ガウスの消去法 最小二乗法

ガウスの消去法(Gaussian Elimination)

連立方程式の解を求めるガウスの消去法です。



5x1+2x2+0x3=9
1x1+4x2+2x3=15
6x1+1x2+4x3=20


例えばこんな連立方程式を解きたければ
それぞれの方程式の係数を(定数項も)配列にします。



r1 = [5,2,0,9]
r2 = [1,4,2,15]
r3 = [6,1,4,20]

んでもってあとはそれらを引数にくれてやれば解の配列をはき出します。
ただし、解なしの場合や不定解の場合はエラーをはくだけです。
他はなんもしません。


ge = GaussianElimination.new
p ge.solve(r1,r2,r3) #=>[1.0, 2.0, 3.0]


上の例だと
x1=1、x2=2、x3=3
が解みたいですね。


ソースコードの構造は至って簡単です。
前進消去、後退代入、ピボット選択それぞれメソッドがありますので、
それをうまいこと実行してやるだけです。



ソースファイル gaussian_elimination.zip



class GaussianElimination
def initialize
@mat = nil
@dimension = 0
@solve = nil
end

def solve(*arrays)
@mat = arrays
@dimension = @mat.size
return "Dimension Error" if @dimension != @mat[0].size - 1
@solve = Array.new(@dimension)
return "Solve Error" unless forward_elimination
backward_substitution
return @solve
end

def forward_elimination
0.upto(@dimension-1) do |i|
nextto = true
@mat[i+1..-1].each{|line| if line[i] != 0 then nextto = false; break end}
if nextto
return false if @mat[i][i] == 0.0
next
end
select_pivot(i)
a = @mat[i][i]
@mat[i+1..-1].each do |line|
s = line[i] / a.to_f
line[i] = 0.0
(i+1).upto(@dimension) do |j|
line[j] -= s * @mat[i][j]
end
end
end
return true
end

def backward_substitution
(@dimension - 1).downto(0) do |i|
@solve[i] = @mat[i][-1]
(@dimension - 1).downto(i+1) do |j|
@solve[i] -= @mat[i][j] * @solve[j]
end
@solve[i] /= @mat[i][i].to_f
end
end

def select_pivot(i)
index = @mat.index(@mat[i..-1].max{|line1, line2| line1[i] <=> line2[i]})
return if i == index
@mat[i],@mat[index] = @mat[index],@mat[i]
end
end

ge = GaussianElimination.new
r1 = [5,2,0,9]
r2 = [1,4,2,15]
r3 = [6,1,4,20]
p ge.solve(r1,r2,r3)

tag : Ruby ガウスの消去法

プロフィール

gentlawk

Author:gentlawk
「BlueRedZone」を運営
Rubyが大好き
主にゲームプログラミングに取り組む
拍手がつくと地味に喜ぶ

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
Twitter
QRコード
QR
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。