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

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

気に入ったらシェアお願いします!

この記事を書いた人

こんにちは!カノといいます👓
インターネットやテクノロジー、ビジネスモデルや歴史(世界史・日本史)、美術などが好きです。メガネのせいか真面目っぽく見えるらしいですが、基本的には昔からいい加減な性格です。
このブログは昔からずっと個人的な日記みたいな感じで書いてきていて、基本的には個人的なログになりますが、興味のあるところだけ読んでいただけるとうれしいです。コメントやTwitterのフォローなどは大歓迎です。

コメント

コメントする

目次