argius note

プログラミング関連

Ruby

練習:樹木曲線

早速、お絵かきクラスで練習。 require "painter" include Math RATE = 6 TURN = 15 DECAY = 0.8 def to_radian(d) d * Math::PI / 180 end def tree(p, n, length, angle) x = length * sin(to_radian(angle)) * RATE y = length * cos(to_radian(angle)) *…

日本 Ruby カンファレンス 2006

こちらを参照。たまにはこういうのにも参加してみるかな。土日ってのがありがたいな。

練習:ユークリッドの互除法

最大公約数を求めるアルゴリズム。 def gcd x, y if y == 0 then x else gcd y, x % y end end def gcd2 x, y while y != 0 x, y = y, x % y end return x end puts gcd(50, 125) #=> 25 puts gcd2(50, 125) #=> 25 puts gcd(980, 1421) #=> 49 puts gcd2(98…

練習:クイックソート (実行状況付)

クイックソートも実行状況が出るようにしてみました。 def trace(a, f, t, i, j, x) print " " a.each_index do |p| s = if p == f then "[" else " " end s += if p == i || p == j then "T" else " " end s += if p == t then "]" else " " end printf "%-…

練習:挿入ソート

調子に乗って、今度は挿入ソートを。クイックソートで範囲が狭まってから使うと効果的。Javaで試したけど、ほぼ同じか気持ち速かったようでした。 クイックソートと同様に、モジュールとして定義。さらに、フラグを立てると実行状況が出力されるようにしてみ…

練習:クイックソート (続き)

頭の中の材料だけでやろうとしたんだけど...だめだ、理屈はわかっているんだけど、答えが合わない! というわけで、アルゴリズム事典に頼ってしまいました。ちょっと情けないですが、そこから自分流キレイ風にアレンジするのに頑張りました。 同時に、まだ使…

練習:クイックソート

クイックソートを書いてみる...が、思ったよりすっきり書けないなー。明日にしよう。

RAA

We retire raa.ruby-lang.org PerlのCPANのような存在。但しコマンドは無いか。どこから手をつけていいのか分かりませんが。時間があるときに潜ってみよう。

練習:フィボナッチ数列

各所で書かれていたので、そういえば自分で書いたこと無いな、と思いつつ、とりあえず見ないで書いてみよう。と数日前思ってたのを忘れてた。 class Fibonacci def initialize(n = 1) @array = [1, 1] and self[n] end def [](n) @array[n] ||= self[n - 2] …

lambdaで関数型っぽく

lambdaは関数型言語ではあたりまえの存在なわけですが、なぜなら、関数型言語では関数の定義がすべてラムダ式だからです。 以下はLispのサンプル*1。 (defun multiply(x y) (* x y)) (defun multiply5(x) (multiply x 5)) (message "%d" (multiply 3 5)) ; "…

λ

lambda関数は、Proc.new、proc関数と同じだが、よりλ式に指向している点で異なる、と思う。

lambdaキーワード

f = lambda do |x| x * x end puts f[5] #=> 25追記:proc関数をlambdaという「キーワード」にした、という意味。id:argius:20060420:1145533951

Date,DateTime,Time

ちょっとさぼったので。日付のようなものなら、好きな日付のカタチにできるはず。1.8ではまだ使えない。 # for ruby1.9 require 'date' a = [Date, DateTime, Time] a.each do |c| a.each do |m| puts c.new.send "to_" + m.to_s.downcase end end

Rubyはマイナー

なぜRailsがメインストリームにならないか() 誉め言葉ですよね。Rubyは、現実の嫌なシガラミから解放されているところが素敵だと思います。理想の体現。やりたくない仕事はやらなくて良い。何より、Rubyはかわいい。

Hex(16進文字列)

0から255までを16進で表示。 (0..255).each do |i| printf "%02X(%s) ", i, i.to_s(16) end

簡易HTMLパーサ

RubyにHTMLパーサは数有れど、どれが標準なのか良く分からない。調べるより作ったほうが楽そうなので、ちょっと作ってみました。 # htmlparser.rb class Tag attr_reader :token, :type, :name, :attr, :text def initialize token @token = token if token.…

キレイなコード (2)

id:argius:20060403:1144077441で、 > と < は「びみょうな記号」と書いたけど、複合の場合はちょっと変わる。 # 好き. << >> == # 配列のときとか、意味無く使いまくる。 a = [] << 1 << 2 << 3 << 4 << 5 # うーん... #{} *(単項) =~同じのが2つ並ぶと、好…

Enumerable使いこなしたい

Rubyリファレンスによると、Enumerableは「繰り返しを行なうクラスのための Mix-in。」とある。Arrayクラスなんかが代表的だが、Enumerableのメソッドはたくさんあって覚えるのがたいへんそう。実際、まだいくつか良く分からないものがある。 よく使うのは、…

winner is RDE

Rubyを書くのと実行するのに、Cygwin+Meadow、RDE、RDTを使っているのですが、私はもうコードアシストがないとダメな身体になってしまったので、アシストもできて起動も軽いRDEが優勝しました、自分の中で。

PrettyPrinter

オブジェクトをpで出力したときに、長いと見づらい。 PrettyPrinterを使うと、改行やインデントを施して、きれいに整形してくれる。 require 'pp' class Something def initialize @a = "aaaaaaaaaaaaaaaaaaaaaaaaaa" @b = "bbbbbbbbbbbbbbbbbbbbbbbbbb" @c …

演算子の再定義.....?

演算子オーバーライド。(キケンです!絶対に真似しないでください!) class String def -(s) gsub(s, "") end def /(i) self[0, length / 2] end def **(i) s = self and i.times do s *= i end and s end end s = "squeak" puts s + "y" puts s - "ak" + …

1行ずつ処理する-知らなかったこと

テキストデータを1行ずつ処理する場合。 # Perl while (<>) { print if /end/i; } これを使うとき、こうやって実行していた。 $ cat file.txt | perl grep.pl しかし、これで動くことを今日知った。 $ perl grep.pl file.txt それと言うのも、Rubyでは # rub…

環境変数PATHやCLASSPATHの値をチェックする

sardineさんの日記(id:sardine:20060331)で、「パスのリスト」が含まれる任意の環境変数の値をチェックするツールをD言語で書いてらっしゃいます。 私はこれをPerlとRubyで書いてみました。ちょうどRubyのファイル関連を調べていたので、良いお題かと思い…

キレイなコード

私的キレイなコードの定義。 かわいい記号 . + - * = / [ ] ? ! : | ふつうな記号 , " # @ ` ( ) % びみょうな記号 ' ~ ^ $ ` & かわいくない記号 ; { } _ ¥ だから、 ['abc', 'def', 'ghi'].each{ |o| puts o.to_s.reverse } はキレイじゃないので、 class…

Ruby@ぱるま

20060401-Legwork - Perlish Magazine(ドメイン名に注目) (経路:) どっちなんだw。

ファイル関連のクラス&モジュール

ファイルを扱うクラスやモジュールには、FileとかFileTestとかFile::StatとかPathnameがある。FileTestはモジュール。Pathnameは添付ライブラリのクラス。Pathname以外は組み込み。以下のように、同じような操作を持っている。 File.directory?(s) FileTest.…

ブロック引数のスコープ

現行の言語仕様の中で、最もよろしくないものと各地で言われているもので、ブロック外のスコープの変数がブロック内で書き換えられてしまうというもの。 i = 'a' (1..9).each do |i| print i end p i #=> 9

暗黙の文字列変換

暗黙に文字列への変換をさせるには、to_strメソッドを定義する。 class Name def initialize name @name = name end def to_str return "name is " + @name end end o = Name.new "A.T" p o p "My " + o puts o puts "My " + o 実行するとこうなる。 # "My n…

keyword 'proc' will be obsolete

前回(id:argius:20060321:1142967272)でProcオブジェクトを'proc'キーワードで作っていましたが、るびまを読んでいたら、まつもとさんが「将来なくなる」と仰ってました。というわけで、また書き直し。 p = Proc.new do |o| print "/*", o, "*/" end [1, 3…

るびま(Rubyist Magazine)

http://jp.rubyist.net/magazine/ Rubyの技術情報は初心者向けから上級者向けまで、そのほかインタビューとかRubyを取り巻く背景に関する情報などが掲載されています。これによって、Rubyの言語仕様以外の情報をそれなりに知ることができます。オンライン文…