試しにRubyで棒グラフ生成アプリを作ってみた(使い道なし)

昨日から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とかやりかけた)ので気をつける → これはエンタープライズでも一緒
  • ちょっとお金使いすぎ(特に今日) → 週末の本屋は一回にする

どうでもいい感想ばっかり。

コメント

コメントする

目次