2008/01/21

Ruby 1.9.0

.DS_Store ファイルを削除する&Rubyの練習目的で作ってみたもの(osx-dsstore.rb)を書き換えつつ..1.9.0 の String の練習しつつ。
Struct.new を使った場合と使わないで def initiailize @path end のようにした場合の2バージョンつくって time で計ったり profile を試してみたり...

% ruby -r profile osx-dsstore.rb
1.9.0 では 1.8.6 とはソート順が逆順になったようだ。。。

osx-dsstore.rb をもとに早さを計ってみた。
現在、Apple 提供の Ruby と、自分でインストールした Ruby とのバージョンは一致している。にもかかわらず自分でmakeインストールした1.8.6が早いのはなぜなんだろ。もっとも、ちゃんと計ったとは言えない。
指定したディレクトリにあるファイル数が多ければ多いほど如実に差が出る?と思ったらそうでもなかった。

% time /usr/bin/ruby osx-dsstore.rb # 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
...
real 0m3.813s
user 0m0.788s
sys 0m2.166s

% time /usr/local/bin/ruby osx-dsstore.rb # 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.1.0]
...
real 0m3.606s
user 0m0.754s
sys 0m2.068s

% time /usr/local/d/bin/ruby osx-dsstore.rb # 1.9.0 (2007-12-25 revision 14709) [i686-darwin9.1.0]
...
real 0m3.096s
user 0m0.780s
sys 0m2.093s

osx-dsstore.rb

=begin
Purpose: Remove '.DS_Store' for OS X 10.5.x

# Search .DS_Store file (% find ./ -name .DS_Store)
% ruby rmDS-Store.rb ~/Desktop/foo
=>
ls /Users/home/Desktop/foo/.DS_Store

# Remove .DS_Store file
% rmDS-Store.rb ~/Desktop/foo/ rmf
=>
Removed: /Users/home/Desktop/foo/.DS_Store
Removed: /Users/home/Desktop/foo/bar/.DS_Store

# Not support
path error like this..
ls: /Volumes/foo/bar : No such file or directory #  path include 'space character'
=end

require 'find'

class DSStore < Struct.new(:path, :option)

  def list
    return nil unless exist?
    return nil unless FileTest.directory?(self.path)
    list = Array.new
    #ごみ箱のなかはみにいきません。
    Find.find(self.path){|path| list << path if File.basename(path) =~ /^.DS_Store$/}
    return list
  end

   def exist?
     File.exist?(self.path)
   end
   
   def sys_ls(f)
     system("ls -la #{f}")
   end

   def sys_rm(f)
     system("rm #{f}")
     print "Removed: #{f}\n"
   end

   def command
     begin
     unless exist?
       print "not found directory"
       exit
     end
     list.each{|f|
       sys_ls(f) if self.option == 'ls'
       sys_rm(f) if self.option == 'rmf'
     }
     rescue
     end
   end

end

ds = DSStore.new
ds.path = Dir.pwd
ds.option = 'ls'
## option ##
ds.path = ARGV[0] unless ARGV[0].nil?
ds.option = ARGV[1] unless ARGV[1].nil?
ds.command


+++ memo +++

http://mono.kmc.gr.jp/~yhara/d/?date=20071215#p03

1.9では、明示的にいずれかを選んでもらうようにした
str.lines.each (or each_line)
str.chars.each (or each_char)
str.bytes.each (or each_byte)
str.each とかしてるプログラムはほとんどないので影響は少ないと思う


str.each とかしてるプログラムはほとんどないらしい... ほとんどない....そーなんだっ。知らなかった。

--imported_from
http://www.midore.net/daybook/2008/01/1200841265.html


+++ 追記 +++
2010-02-06

関連する記事
2009-10-03
Remove DS_Store file

0 件のコメント: