昨日からRubyをいじってます。新しい言語を勉強するのはおもしろいなあ。
ただマニュアルだけ読んでるのもアレなので、今日はアスキー文字で棒グラフを生成するプログラムを書いてみました。作り終わって気づいたのですが、かなり使い道なさそうです。
記念すべき初Rubyプログラムなのになぜこんな題材にしたのかは我ながらさっぱり不明ですが、作っちゃったのもんはしょうがないので、とりあえず直近2週間の出費具合を表示してみました。
「おやおや、まったくなってないですよ」とかあったら添削していただきたく。
require "Graph"
require "Bar"
graph = Graph.new
graph.title = "+++++ Dairy Expenses +++++"
graph.barLength = 50 # いちばん長い棒の文字数
graph.barUnit = "$" # グラフに使う文字(お金っぽく)
graph.add(Bar.new("9/15(Thu)", 810))
graph.add(Bar.new("9/16(Fri)", 7850))
graph.add(Bar.new("9/17(Sat)", 3900))
graph.add(Bar.new("9/18(Sun)", 0))
graph.add(Bar.new("9/19(Mon)", 1200))
graph.add(Bar.new("9/20(Tue)", 530))
graph.add(Bar.new("9/21(Wed)", 520))
graph.add(Bar.new("9/22(Thu)", 870))
graph.add(Bar.new("9/23(Fri)", 10650))
graph.add(Bar.new("9/24(Sat)", 6910))
graph.add(Bar.new("9/25(Sun)", 7650))
graph.add(Bar.new("9/26(Mon)", 1980))
graph.add(Bar.new("9/27(Tue)", 530))
graph.add(Bar.new("9/28(Wed)", 18400))
graph.printGraph
class Graph
attr_accessor :title,
:barLength,
:barUnit
def initialize
@bars = []
@title = ""
@barLength = 50
@barUnit = "*"
end
def add(bar)
@bars.push(bar)
end
def printGraph
printTitle
@bars.each {|b|
b.entryColumnLength = getMaxEntryLength()
b.ratio = getRatio()
b.unit = @barUnit
b.printBar
}
end
def printTitle
if @title != "" then
puts "\n", @title, "\n"
end
end
private :printTitle
def getRatio
return @barLength.to_f / getMaxBarLength().to_f
end
private :getRatio
def getMaxEntryLength
entryLengthList = []
@bars.each {|b| entryLengthList.push(b.name.length)}
entryLengthList.sort!.last
entryLengthList.last
end
private :getMaxEntryLength
def getMaxBarLength
barLengthList = []
@bars.each {|b| barLengthList.push(b.value)}
barLengthList.sort!
barLengthList.last
end
private :getMaxBarLength
end
class Bar
attr_accessor :name,
:value,
:unit,
:ratio,
:entryColumnLength
def initialize(name, val)
@name = name
@value = val
@unit = "*"
@ratio = 1.0
@entryColumnLength = 0
end
def printBar
puts @name.ljust(@entryColumnLength) +
" | " +
(@unit * (@value * @ratio)) +
"(" + @value.to_s + ")"
end
end
で、出力結果。
colinux:/home/kenicca/dev/ruby/ascii_graph# ruby Client.rb +++++ Dairy Expenses +++++ 9/15(Thu) | $$(810) 9/16(Fri) | $$$$$$$$$$$$$$$$$$$$$(7850) 9/17(Sat) | $$$$$$$$$$(3900) 9/18(Sun) | (0) 9/19(Mon) | $$$(1200) 9/20(Tue) | $(530) 9/21(Wed) | $(520) 9/22(Thu) | $$(870) 9/23(Fri) | $$$$$$$$$$$$$$$$$$$$$$$$$$$$(10650) 9/24(Sat) | $$$$$$$$$$$$$$$$$$(6910) 9/25(Sun) | $$$$$$$$$$$$$$$$$$$$(7650) 9/26(Mon) | $$$$$(1980) 9/27(Tue) | $(530) 9/28(Wed) | $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$(18400)
以下、Rubyってみて気がついた点とか教訓とか。
- かなりなじみやすいので続けられそう
- でも、今の書き方だとかなり冗長な気がする → 早くいろんなプログラムを読もう
- APIドキュメントに慣れない
- 名前空間とかどうなってるんだろう
- 無駄に抽象化しようとする癖がついてた(BarGraph < GraphとかBar < Componentとかやりかけた)ので気をつける → これはエンタープライズでも一緒
- ちょっとお金使いすぎ(特に今日) → 週末の本屋は一回にする
どうでもいい感想ばっかり。
コメント