Ruby

Ruby 第3回目 csv⇒xml

ココログのアクセス解析で日ごとにCSVファイルが作れるので、これを利用してCSVファイルを読み込み、XML形式の文書ファイルをRubyで作ってみることに挑戦しました。

csv2xml.rb

require "kconv"
require "csv"

print "<?xml version='1.0' encoding='UTF-8' ?>\n"
print "<?xml-stylesheet type='text/xsl' href='./cocolog.xsl'?>\n"
print "<item>\n"

youso=["date","uniqaccess","pagetitle","remotehost",
       "useragent","from","display","language" ,"id"]
filename="logcsv/"+ARGV[0]+".csv"
CSV.open(filename,'r'){ |i| m=-1
  print "<row>\n"
  i.each {|j| m+=1
    j=j.gsub!(/あっちゃんずちのさとちゃん: /,"").toutf8 if m==2
    if m==5 && j
      j.gsub!(/%[a-fA-F0-9][a-fA-F0-9]/){|k| k.tr!("%","").to_a.pack("H*")}
      j=j.toutf8.tr('&+','_ ').gsub(/</,"&lt;").gsub(/>/,"&gt;")
    end
    print "  <",youso[m],">",j,"</",youso[m],">\n" if j
  }
  print "</row>\n"
}
print "</item>"

CSVファイルを読み込むために、"csv"をrequire
漢字コードの変換を行うために、"kconv"をrequire。これで、Stringクラスに対してメソッドとして、toutf8やtosjis等が使えるようになりますね。

今回勉強になったこと
(1)'r'指定でcsvをopenすると、イテレータで1行ごとの処理が行える
(2)packは配列を変換するため、文字から配列に直して使用した
 (他に方法はないのかな?現時点では不明)
(3)csvの要素がないものはnilが入っているので、そのまま条件式で使用した

とりあえず、文字コードはutf-8を使用することにして、作られたファイルをいろいろ眺めながら今後どう利用していけるかを考えてみます。

| | コメント (0) | トラックバック (1)

円の座標点の値をrubyで検証

C#で作成した円を描くロジックの数値を具体的に確認してみたかったので、rubyで似たようなロジックを作成して出力してみました。

paintcircle.rb
---------------------- O ----------------
x = 0
y = 0
r = 100

ix=r*1.0
iy=0.0
E=1.0/r

print "E=",E,"\n"
i=0
begin
    ix -= E * iy
    iy += E * ix
    i+=1
#    print "i=",i," ix=",ix," iy=",iy,"\n"
    puts sprintf "i=%3d ix=%11.6f iy=%11.6f <ix-r>=%11.6f\n",i,ix,iy,ix-r
    #break if i == 5
end while (ix - r).abs > 0.5 || iy.abs > 0.5
---------------------- O ----------------

結果(抜粋)は下記の通りとなりました。
E=0.01
i=  1 ix= 100.000000 iy=   1.000000 <ix-r>=   0.000000
i=  2 ix=  99.990000 iy=   1.999900 <ix-r>=  -0.010000
i=  3 ix=  99.970001 iy=   2.999600 <ix-r>=  -0.029999
    *
         *
i=155 ix=   2.578735 iy=  99.979640 <ix-r>= -97.421265
i=156 ix=   1.578939 iy=  99.995429 <ix-r>= -98.421061
i=157 ix=   0.578985 iy= 100.001219 <ix-r>= -99.421015
i=158 ix=  -0.421028 iy=  99.997009 <ix-r>=-100.421028
i=159 ix=  -1.420998 iy=  99.982799 <ix-r>=-101.420998
i=160 ix=  -2.420826 iy=  99.958590 <ix-r>=-102.420826
    *
         *
i=312 ix= -99.965928 iy=   2.157825 <ix-r>=-199.965928
i=313 ix= -99.987506 iy=   1.157950 <ix-r>=-199.987506
i=314 ix= -99.999085 iy=   0.157959 <ix-r>=-199.999085
i=315 ix=-100.000665 iy=  -0.842048 <ix-r>=-200.000665
i=316 ix= -99.992245 iy=  -1.841970 <ix-r>=-199.992245
i=317 ix= -99.973825 iy=  -2.841708 <ix-r>=-199.973825
i=318 ix= -99.945408 iy=  -3.841163 <ix-r>=-199.945408
    *
         *
i=469 ix=  -2.736638 iy= -99.976231 <ix-r>=-102.736638
i=470 ix=  -1.736876 iy= -99.993600 <ix-r>=-101.736876
i=471 ix=  -0.736940 iy=-100.000969 <ix-r>=-100.736940
i=472 ix=   0.263070 iy= -99.998339 <ix-r>= -99.736930
i=473 ix=   1.263053 iy= -99.985708 <ix-r>= -98.736947
i=474 ix=   2.262910 iy= -99.963079 <ix-r>= -97.737090
    *
         *
i=625 ix=  99.928451 iy=  -3.315360 <ix-r>=  -0.071549
i=626 ix=  99.961605 iy=  -2.315744 <ix-r>=  -0.038395
i=627 ix=  99.984762 iy=  -1.315897 <ix-r>=  -0.015238
i=628 ix=  99.997921 iy=  -0.315917 <ix-r>=  -0.002079

| | コメント (0) | トラックバック (0)

Ruby 第二回目 カレンダー

Rubyでカレンダークラスを作ってみました。
前回、年月を与えて月末日を返すクラスを作ってみたけど、Rubyでは-1を与えれば月末日を返してくれるものがちゃんと用意されていました。今回はこれを使ってみることに。

koyomi.rb

require "date"

class Calendar
    def initialize ( yy , mm )
        @yy = yy
        @mm = mm
        @ymd = Date.new(yy,mm,1)
    end
    def show
        dai  = @ymd.strftime("%B %Y年")
        yobi = "日 月 火 水 木 金 土"
        daispc = (yobi.length - dai.length) / 2

        print " " * daispc, dai,"\n"
        print yobi,"\n"

        hiduke = "   " * @ymd.wday
        (@ymd.day..Date.new(@yy,@mm,-1).day).each { |d|
            hiduke += sprintf("%2s ",d)
        }

        len = (hiduke.length / 21.0).ceil
        moji = hiduke.scan(/.{1,21}/m);
        moji.each { |m|
            print m.chop,"\n"
        }
    end
end

#ロジックの検証用
Calendar.new(2008,1).show
Calendar.new(2008,2).show
Calendar.new(2008,5).show
Calendar.new(2008,6).show
Calendar.new(2009,2).show

出力結果は以下のようになりました。

Photo

とりあえず、出力されたのでまずは一安心。ロジック的にはしっくりきていない部分もあるけど、まだまだRubyの組み方がよく分かっていないのでこんなものでしょう。

| | コメント (0) | トラックバック (0)

ruby 第一回

今日は初めてRubyのプログラムを作ってみました。
どうも作ってみないと実感がわかないのでとりあえず訳も分からないまま取り組んでみました。まだまだよく分からないことだらけなので頭の中が混乱状態です。

hiduke.rb
class Yyyymm
    Nissu = 30
    Heinen = 28
    Urudoshi = 29
    def initialize ( yy , mm )
        @yy = yy
        @mm = mm
    end
    def eomonth
        if  2 == @mm
            return  Heinen                    unless 0 == ( @yy % 4 )
            return  Urudoshi                  if     0 == ( @yy % 400 )
            return  Heinen                    if     0 == ( @yy % 100 )
            return  Urudoshi
        else
            return  Nissu  +  @mm % 2         if     8 > @mm
            return  Nissu  +  ( @mm + 1 ) % 2 unless 8 > @mm
        end
    end
end

#ロジックの検証用
yy = [  844 , 1900 , 2000 , 2007 , 2008 , 2008 , 2008 , 2008 ,
       2008 , 2008 , 2008 , 2008 , 2008 , 2008 , 2008 , 2008 ]
mm = [    2 ,    2 ,    2 ,    2 ,    1 ,    2 ,    3 ,    4 ,
          5 ,    6 ,    7 ,    8 ,    9 ,   10 ,   11 ,   12 ]

yy.length.times { | n |
    printf("%4d/%02d/%d\n",
           yy[n],mm[n],Yyyymm.new(yy[n],mm[n]).eomonth)
}

| | コメント (0) | トラックバック (0)