クイックソート

9月 29th, 2007 admin

並んだ数のうち最初のものをとりあえずできるだけ奥のほうに移す、最後のほうをわかる限り左に移す。といった感じのクイックソート
一気に実行時間が短縮されました・・・
Rubyには++とか–はないらしい。10分ぐらいはまりました。

require 'pp'
before = Time.now
t = Time.now
srand(t.sec ^ t.usec ^ Process.pid)

Num = 10000

def quickSort(bottom, top, sort)
	if bottom >= top then
		return false
	end

	#先頭の値を「適当な値」とする
	div = sort[bottom]

	lower = bottom
	upper = top

	while lower<upper
		while(lower <= upper and sort[lower] <= div)
			lower+=1
		end
		while(lower<=upper and sort[upper] > div)
			upper-=1
		end
		if lower < upper then
			temp = sort[lower]
			sort[lower] = sort[upper]
			sort[upper] = temp
		end
	end

	#最初に選択した値を中央にする
	temp = sort[bottom]
	sort[bottom] = sort[upper]
	sort[upper] = temp

	quickSort(bottom,upper -1,sort)
	quickSort(upper+1,top,sort)

	return sort
end

#ランダムな値の入った配列を作成
sort = Array.new
Num.times{
	sort.push rand(10000)
}

#ソート前の出力
pp sort

sort = quickSort(0,Num-1,sort);

#ソート後の出力
pp sort

#処理時間
p Time.now - before

N=10000の時の実行速度は5.672秒でした。

バブルソート

9月 29th, 2007 admin

1,2,5,3,4,6
とデータが並んでいた場合に、
「1番目と2番目の数を比べる、比べて2番目の数が大きかったら数字を入れ替える」
「2番目と3番目の数を比べる、比べて3番目の数が大きかったら数字を入れ替える」
「N番目とN+1番目の数を比べる、比べてN+1番目の数が大きかったら数字を入れ替える」
というのを繰り返すのがバブルソートですね。
単純なのと引き換えに、最大でN^2回数字の比較をする必要があるのが難点です。

require 'pp'
t = Time.now
srand(t.sec ^ t.usec ^ Process.pid)

Num = 10

def bubbleSort(sort)
	flag = true
	while flag
		flag = false
		(Num - 1).times{|m|
			if sort[m] > sort[m+1] then
				flag = true
				i = sort[m]
				sort[m] = sort[m+1]
				sort[m+1] = i
			end
		}
	end

	return sort
end

#ランダムな値の入った配列を作成
sort = Array.new
Num.times{
	sort.push rand(100)
}

#ソート前の出力
pp sort

sort = bubbleSort(sort);

#ソート後の出力
pp sort

N=10000の時 188.157秒かかりました。

ちなみにRubyで普通にやるなら

pp [1,3,2,4,2,5].sort

が正解だと思います。
こちらはN=10000の時 5.266秒かかりました。

さすが速い!というか僕のバブルが遅すぎる

Rubyでアルゴリズムとデータ構造

9月 29th, 2007 admin

「どうせバブルソートしか知らないでしょ?」
え?なんて失礼なことを!・・・というわけで

プログラミングの宝箱 アルゴリズムとデータ構造 (C magazine)
紀平 拓男 春日 伸弥
ソフトバンククリエイティブ
売り上げランキング: 11265

を買いましたので、原文のC言語らしさとRubyの便利さの間で絶妙に妥協しながらやっていきたいとおもいます。
「とりあえずソートならRubyのArray.sortのソース嫁」
という考えも浮かびましたが・・・それはまた別のブログで・・・別の誰かが・・・

第1章 ソート

第2章 サーチ

第3章 リスト

第4章 スタック&キュー

第5章 再帰呼び出し

第6章 ツリー構造

第7章 ハッシュとマップ

第8章 浮動小数点数と数値計算

第9章 文字列探索

第10章 バックトラック法と幅優先探索

HTMLしか知らなかった僕がPHPを覚えるまで

9月 28th, 2007 admin

PHPって難しいでしょ?どうやって覚えたの?と聞かれたのでアマゾンアソシエイトを使いながらPHPを覚えた順番を紹介してみようと思う。
PHPはプログラミング言語じゃねぇとかいう意見もあるけどプログラミングの入門にはとても適していると思う。(file_get_contentsとか最高)

間違えてXMLの本を買った

最初僕がどれぐらいわかっていなかったかというと、かばん屋のホームページをプログラムで管理したいと思って最初にXMLの本を買ったぐらい理解していませんでした。本を読破してからXML単体ではどうしようもないと知り非常にショックを受けので今でもXMLは嫌いだったりします。

その後少し調べてPerlかPHPってのを使えばいいってことを知り、PerlよりPHPの方がキレイな装丁の本が多かったのでPHPにしました。(マンモス本とかがかっこよく見えた)
そこで買ったのが下記の2冊

オープンソース徹底活用 MySQL4/PHP5によるWebデータベース構築 (オープンソース徹底活用)
まずこれは、MySQL,Apache,PHPのインストールから丁寧。そしてMySQLの操作についてもPHPの本のくせに非常に丁寧に書いてあるのが良い。最終的に掲示板を作るチュートリアル、ブログを作るチュートリアルまであって学びやすい(掲示板がつくれればWebアプリは7割理解できたと思ってもいいとおもう)
PHP5の本なのでオブジェクト指向についても触れているが、使わなくても本は読み進めていけるのもオブジェクト指向が理解できていない僕にとってはとても良かった

PHPによるWebアプリケーションスーパーサンプル
一緒に買ったのがこの本。「ファイルに書き込みたい」などの目次から開ける逆引き本だ。この本に載っているサンプルを組み合わせれば大抵のスクリプトは作れると思う。非常にお世話になったが分厚すぎるので「PHPポケットリファレンス (POCKET REFERENCE SERIES)」に乗り換えた。こっちの本は今でもお世話になる。
ただし、こういう本は他にもいろいろあるけどセキュリティなどは考慮してくれていない場合が多いので単純に組み合わせるだけだと危ないということを覚えておきたい。

PHPのお仕事が来た

プログラムが組めるようになったと吹聴してまわっていたら在庫管理の仕事が来た。あわててセキュリティとかセッションとかの勉強をした。
その時にお世話になったのが

PHP5徹底攻略 エキスパート編
です。初期の頃によくはまっていた「セッション」「キャッシュ」「文字コード」などについて困ったときにいつも開いていた。
またこの本では当時流行していたテンプレートエンジン「Smarty」の使い方も載っており、Smartyを使い出した僕はすっかりPHP上級者になった気分になっていた。

セキュリティに関しては今は「PHPサイバーテロの技法―攻撃と防御の実際」というような専門の本が出ているので必ず読んでおいたほうが良いと思う。

フレームワーク漁り

ある程度自由にプログラムが作れるようになったのですがいつも

  • 毎回同じようなコードばかり書いている
  • サイトの規模が大きくなるとファイルが整理整頓できなくなる

ということで悩んでいました。特に自分1人で書いているのにも関わらず、コーディング規則やファイルの配置規則がバラバラになっていくのがすごくイヤでした(自分で決めればよかったんだけど)
そこで知り合いに教えてもらったのがフレームワークというやつでした。どうも他人の敷いたレールを走るようにプログラムが出来るらしいと・・・

最初に覚えたのはMaple(開発は中止されました)というやつでした。今思えば面白いフレームワークでしたが、OOPをろくに理解していない僕には非常に難易度の高いフレームワークでした。次にEthnaguessworkRuby on Railsと触って今は主にCakePHPで開発を行っています。

フレームワークが使えるようになったことでシステムが肥大化していくのが怖くなくなりました。フレームワークが規則を決めてくれているので僕がソースを汚くしようとしてもできないようになっています。また、半年後にソースを見直したり、人のコードを直すのもとても簡単になります。今ではフレームワークなしでは開発は行いたくないほどの依存症になりました。

最初にフレーワークを学ぶならEthnaが良かったかなと思います。今なら「Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)」などの専用の本もでていますしね。CakePHPはフレームワークを知らない人からすると話が飛びすぎている気がします。(mod_rewriteとかGETパラメータの取得とか、ORマッパとか)

その次は

他のLL(lightweight language)と呼ばれる言語を学ぶのが良いと思います。PerlとかRubyとかPythonとか
あとある程度PHPができるようになると「PHPしかできない」ってのがいかにプログラマ的に未熟な状態なのか気が付くので無限に勉強できて飽きないです。
(↑今ここ)

CakePHP::PeriSign認証を作りました。

9月 22nd, 2007 admin

154年の信頼と実績 日本ペリサイン
http://www.perisign.com/

征夷大将軍のホームページさんのペリサインシールを見て感動して、そのまま悪い乗りで作りました。ちょうどcakephp1.2の練習になるなと思いながらやったのですが、フォーム関係のヘルパーがかなり違っていて時間がかかりました。1.1よりスマートになった感じですかね。

本来の認証では、登録情報に基づく識別IDみたいなのとリファラーのホスト名をチェックしてるんだと思うんですが、ブログのユーザなどにも対応するため、このperisign認証ではIDと、登録時に申請してもらったURLで判別しています。

不具合などありましたら、こちらのコメント欄にお願いします。