Showing posts with label ruby. Show all posts
Showing posts with label ruby. Show all posts

3/10/2011

memo

#!/usr/bin/env ruby

module PARS_CONF

  def get_conf(conf_file)

    if File::ftype(conf_file) == "file"

      return Array[*open(conf_file).read.split(/(\n|\r)/).map{|f|

          f.split(/\r/)

        }.flatten]

    end

  end


  def ldif_conf(conf_file)

    if File::ftype(conf_file) == "file"

      return get_conf(conf_file).select{|b| 

        b =~ /(^uid\:[[:blank:]]|^mail\:[[:blank:]])/

      }.each{|x| 

        x.gsub!(/(^uid\:[[:blank:]]|^mail\:[[:blank:]])/,"")

      }

    end

  end

  

  def running_conf(conf_file)

    if File::ftype(conf_file) == "file"

      return get_conf(conf_file).select{|b| 

        b =~ /(^user[[:blank:]]|^[[:blank:]]*description[[:blank:]].*@.*)/}.each{|x| 

        x.gsub!(/(^user[[:blank:]]|^[[:blank:]]*description[[:blank:]])/,"")

      }

    end

  end



  def aliases_get(conf_file)

    if File::ftype(conf_file) == "file"

      return Array[*open(conf_file).read.split(/((^\s*)(:|,)(\s*)$)/).map{|f| 

          f.gsub!(/(^\#.*$\n)|(\\$\n)|([[:blank:]]*)/,"") ;f.split(/\n/)}.flatten]

    end

  end



  protected :get_conf

  protected :ldif_conf

  protected :running_conf

  protected :aliases_get


  def get_ac(conf_file)

    if File::ftype(conf_file) == "file"

      case File::extname(conf_file)

      when /(ldif|LDIF|ldap|LDAP)/

        return ldif_conf(conf_file).sort

      when /(cli|CLI)/ 

        return running_conf(conf_file).sort

      when /ali/

        return aliases_get(conf_file).sort

      else

        return get_conf(conf_file).sort

      end

    end

  end

end


class COMP_AC

  include PARS_CONF

  def initialize(file1, file2)

    @A1 = get_ac(file1)

    @A2 = get_ac(file2)

  end


  def show_comp()

    printf("%s only,\t%s only\n" ,ARGV[0],ARGV[1])

    a = [(@A1 - @A2).sort, (@A2 - @A1).sort]

    if a[0].length > a[1].length

      count = a[0].length

      a[1].fill(a[1].length ,count) { nil }

    elsif a[0].length < a[1].length

      count = a[1].length

      a[0].fill(a[0].length , count) { nil }

    else

      count = a[0].length

    end

    i = 0

    while i < count

      printf("\"%s\",\"%s\"\n",a[0][i],a[1][i])

      i += 1

    end



  end

end


if ARGV[0].nil? or ARGV[1].nil? then

  print < out.csv

EOS

elsif ARGV.size > 0 then

  COMP_AC.new(ARGV[0], ARGV[1]).show_comp

end


2/08/2011

rubyの勉強続き

コンパクトにしてみた

ruby楽しいよ

個人の感想です


むか~し開発の仕事をしていて
C/C++やらJavaやらPerlを使っていたのだけれど
正直、好きじゃなかった

趣味でやってる分には楽しかったんだけど
途中で作るのが面倒になる

「ああもうシェルスクリプトでいいや」

充分にテストされてコンパクトで早いcoreutilsやら
枯れた実装かつノウハウ(悪いものも含めて)が充分にあるawkやらsedやら
bashやらzshの固有拡張機能があれば、いちいちPerlやら何やら持ち出すのが
バカバカしい。
(もちろんスクリプトで作りにくい、または現実的には困難なものもあるけど)

仕事じゃなくなってから、仰々しいものを作ったりしなくなったのも
「シェルスクリプトでいいや」を助長させてたと思う


なんで、シェルスクリプトでいいかというと
使い慣れたツールとの連携が可能、かつ楽
なによりも手軽に試せる。デバッグは面倒だけどテストは楽。
殆どのLinuxならzsh以外ならデフォルトで入ってるから
Linux間では可搬性も高い(違ったとしてもパスくらいだし)。


で、Rubyの勉強として過去作ったスクリプトの移植を試みてるんだけど
楽しいね。ほんと、純粋に楽しい。
awkやsed、grepレベルの文字列操作なら特に何も意識しなくても普通にできるし
「ちょっとやってみようかな」と思ったらすぐ試せる。シェルスクリプトばりに手軽。

PerlもJavaも構文が嫌いだった。Perlは後付臭いOOも嫌い。
あくまで”嫌い”なだけです。機能や性能や思想的な価値がRubyより劣るとか言ってるわけではありません。
ただ、私はPerlやJavaは大嫌いです。くそったれだと思います(個人の感想です)。
「ちょっとした小間使い的なツール作成」だと絶対に使いたくない。
(規模によってはJavaがいいかな、と思うこともある。ただしPerlはイヤだ)

RubyのALGOLみたいな構文はアレな気はしてたんだけど、書いてみてナルホドという感じ
こうじゃないといけなかったんだなぁと。

OOネイティブな感じもすばらしい。



思想的なものには一切興味はないんだけど
(例えばRubyのどこそこはどう美しい、それはなぜか とか)
規模問わず、お手軽にはじめられるのはいい。

とりあえずRubyで実装して、思考を整理したり実装する機能を選別したり検証してから
ほかの言語に移植(要件とか運用で使う言語変わるし)とかしてもいいかなと思えるくらい、良い。

2/07/2011

rubyでtapを覚えたかも

そのうち綺麗にします
とりあえずtapを覚えた
ファイルのhash取り込みも

snapshot.rb


勉強メモ

引き続きRuby中

メモを残す

#!/usr/bin/env ruby


require 'date'






def parse_dir(conf)
 snap = Hash::new

# hoge.tap{|h| hoge.each_pair{|src, dst| h[src] = "a"} }


 conf.each_pair {|src, dst| 
  _src = src.sub(/$\//,"").split(/\s*\/\s*/)
 if _src.size == 0
  snap[src] = "#{dst}/rootfs_#{Time.now.strftime("%Y%m%d").to_s}"
 else
  snap[src] = "#{dst}/#{_src[_src.size - 1].strip}_#{Time.now.strftime("%Y%m%d").to_s}"
 end
 }
 return snap
end


def get_conf(conf_file)
 conf = Hash[*open(conf_file).read.split(/\n/).map{|f| f.split}.flatten]
 return conf
end

class Snapshot
 def initialize(conf = "/etc/snap.conf")
 @snap = parse_dir(get_conf(conf))
 end
 def do_snap
 @snap.each_pair {|src, dst|
  system("btrfs","sub","snap",src,dst)
 }
 end
end


if ARGV[0] == nil
 snap = Snapshot.new
else
 if File::ftype(ARGV[0]) == "file"
  snap = Snapshot.new(ARGV[0])
 else
  p "no such file"
 end
end

if snap != nil
 snap.do_snap
end

rubyの勉強


やろう やろう と思いながら
結局3年くらい勉強しないままにしてたruby
せっかく参考書まで買ったのに一度も目を通してない
というわけで、仕事の空き時間に練習してみた
(参考書がないのでGoogle先生のお世話になりました)
構文からの勉強だから非常に時間がかかった(働け)

先日のbtrfsのスナップショット用スクリプトのruby移植+α版
ハッシュが使えるお陰で設定ファイルがシンプルになりました。
/path/src /path/dst の形式で1行ずつ書いてくだけ。
以前の階層に関連する制約がなくなりました。
データ構造をもう少し考えて
1つのでdstにつき、複数のsrcという形式で記述できるように
したほうがよかったかなと思ってます(今後の課題)
#!/usr/bin/env ruby

require 'date'


def parse_dir(conf)
snap = Hash::new
conf.each_pair {|src, dst|
_src = src.sub(/$\//,"").split(/\s*\/\s*/)
if _src.size == 0
snap[src] = "#{dst}/rootfs_#{Time.now.strftime("%Y%m%d").to_s}"
else
snap[src] = "#{dst}/#{_src[_src.size - 1].strip}_#{Time.now.strftime("%Y%m%d").to_s}"
end
}
return snap
end

def get_conf(conf_file)
conf = Hash::new
open(conf_file) {|file|
while i = file.gets
_line = i.split
conf[_line[0]] = _line[1]
end
}
return conf
end
class Snapshot
def initialize(conf = "/etc/snap.conf")
@snap = parse_dir(get_conf(conf))
end
def do_snap
@snap.each_pair {|src, dst|
system("btrfs","sub","snap",src,dst)
}
end
end

if ARGV[0] == nil
snap = Snapshot.new
else
if File::ftype(ARGV[0]) == "file"
snap = Snapshot.new(ARGV[0])
else
p "no such file"
end
end
if snap != nil
snap.do_snap
end

WSKY Bluetooth 5.0 トランスミッター レシーバー買いました

安くレシーバーモードでapt-x HDが使えるものというと非常に限られますが そのなかで高音質と評判のよかったものをということで購入しました。 音質は安いなりですね、apt-x HDで接続されている状態でも元がなんであれ痩せた音になります。 SBSにしか対応していない...