2009年03月13日 ruby(1.8.x)儂(わし)的解釈によるメモ
_ ruby(1.8.x)儂(わし)的解釈によるメモ(基本編)
使われている用語等は基本的にテキトーなもの。あまり真に受けないように。あくまで儂(わし)的なrubyプログラミングで困らない程度のTipsの蓄積。
#! /usr/bin/ruby #
引数
#
p ARGV
puts "1個目の引数 = #{ARGV[0]}"
puts "2個目の引数 = #{ARGV[1]}"
puts "3個目の引数 = #{ARGV[2]}"
puts "引数の個数 = #{ARGV.size}"
["aaa", "bbb"] 1個目の引数 = aaa 2個目の引数 = bbb 3個目の引数 = 引数の個数 = 2
ワーク(文字列, 数値)
#
work = "abcdef"
puts "work = #{work}"
puts "work[2] = #{work[2]}"
puts "work[2].chr = #{work[2].chr}"
puts "work[2..3] = #{work[2..3]}"
puts "work[2,3] = #{work[2,3]}"
work = 12345
puts "work = #{work}"
puts "== work is #{work} =="
puts '== work is #{work} =='
work = abcdef
work[2] = 99
work[2].chr = c
work[2..3] = cd
work[2,3] = cde
work = 12345
== work is 12345 ==
== work is #{work} ==
配列
#
work = []
work = ["aaa", 12345, "ccc", 23456, "eee", 34567]
work2 = ["AAA", 54321, "ccc", 23456, "EEE", 76543]
p work
p work2
puts "work[0] = #{work[0]}"
puts "work[1] = #{work[1]}"
puts "work[2] = #{work[2]}"
puts "work[3] = #{work[3]}"
puts "work[4] = #{work[4]}"
puts "work[5] = #{work[5]}"
puts "work.size = #{work.size}"
puts "work[2..3] = #{work[2..3]}"
puts "work[2,3] = #{work[2,3]}"
puts "work & work2 = #{work & work2}"
puts "work | work2 = #{work | work2}"
puts "work + work2 = #{work + work2}"
puts "work - work2 = #{work - work2}"
["aaa", 12345, "ccc", 23456, "eee", 34567] ["AAA", 54321, "ccc", 23456, "EEE", 76543] work[0] = aaa work[1] = 12345 work[2] = ccc work[3] = 23456 work[4] = eee work[5] = 34567 work.size = 6 work[2..3] = ccc23456 work[2,3] = ccc23456eee work & work2 = ccc23456 work | work2 = aaa12345ccc23456eee34567AAA54321EEE76543 work + work2 = aaa12345ccc23456eee34567AAA54321ccc23456EEE76543 work - work2 = aaa12345eee34567
ハッシュ
#
work = {}
work['apple'] = "red"
work['lemon'] = "yellow"
work['melon'] = "green"
p work
puts "work['apple'] = #{work['apple']}"
puts "work['lemon'] = #{work['lemon']}"
puts "work['melon'] = #{work['melon']}"
work2 = {"apple", "red", "lemon", "yellow", "melon", "green"}
p work2
puts "work2['apple'] = #{work2['apple']}"
puts "work2['lemon'] = #{work2['lemon']}"
puts "work2['melon'] = #{work2['melon']}"
work3 = {"apple" => "red", "lemon" => "yellow", "melon" => "green"}
p work3
puts "work3['apple'] = #{work3['apple']}"
puts "work3['lemon'] = #{work3['lemon']}"
puts "work3['melon'] = #{work3['melon']}"
{"apple"=>"red", "melon"=>"green", "lemon"=>"yellow"}
work['apple'] = red
work['lemon'] = yellow
work['melon'] = green
{"apple"=>"red", "melon"=>"green", "lemon"=>"yellow"}
work2['apple'] = red
work2['lemon'] = yellow
work2['melon'] = green
{"apple"=>"red", "melon"=>"green", "lemon"=>"yellow"}
work3['apple'] = red
work3['lemon'] = yellow
work3['melon'] = green
if文
#
work = {"apple" => "red", "lemon" => "yellow", "melon" => "green"}
#if (work['lemon'] == "red")
#if (work['lemon'] != "red")
#if (work['lemon'] > "red")
#if (work['lemon'] <"red")
#if (work['lemon'] >= "red")
#if (work['lemon'] <= "red")
if (work['lemon'] == "red")
puts "lemon is red"
elsif (work['lemon'] == "yellow")
puts "lemon is yellow"
else
puts "lemon is not red and yellow"
end
lemon is yellow
if文(パターンマッチング)
#
work = {"apple" => "red", "lemon" => "yellow", "melon" => "green"}
if (/^y.*w$/ =~ work['lemon'])
puts "lemon is y.*w"
else
puts "lemon is not y.*w"
end
lemon is y.*w
case文
#
work = {"apple" => "red", "lemon" => "yellow", "melon" => "green"}
case work['lemon']
when "red"
puts "lemon is red"
when "yellow"
puts "lemon is yellow"
else
puts "lemon is not red and yellow"
end
lemon is yellow
while文
#
work = ["melon", "lemon", "apple"]
i = 0
while (i < 3)
if (work[i] == "apple")
# next
# redo
break
end
puts work[i]
i += 1
end
melon lemon
for文
#
work = ["melon", "lemon", "apple"]
#for i in work
for i in work.sort
puts i
end
apple lemon melon
for文(2)
#
work = ["melon", "lemon", "apple"]
for i in 0..2
puts work[i]
end
melon lemon apple
each文
#
work = ["melon", "lemon", "apple"]
work.each do |i|
puts i
end
melon lemon apple
for文(ハッシュの添字でループ)
#
work = {"melon", "green", "lemon", "yellow", "apple", "red"}
#for i in work.keys
for i in work.keys.sort
puts work[i]
end
red yellow green
each文(ハッシュ)
#
work = {"melon" => "green", "lemon" => "yellow", "apple" => "red"}
work.each do |key, val|
puts key + "=" + val
end
apple=red lemon=yellow melon=green
tr文(文字置換)
#
work = "ABCDEFG"
puts "work = #{work}"
puts "work.tr('C-E', 'c-e') = #{work.tr('C-E', 'c-e')}"
work = ABCDEFG
work.tr('C-E', 'c-e') = ABcdeFG
gsub文(文字列置換)
#
work = "ABCDEFG"
puts "work = #{work}"
puts "work.gsub(/C.*E/, 'cde') = #{work.gsub(/C.*E/, 'cde')}"
work = ABCDEFG work.gsub(/C.*E/, 'cde') = ABcdeFG
gsub文(文字列置換)(2)
#
work = "ABCDEFG"
puts "work = #{work}"
puts "work.gsub(/(C.*E)/){'==' + $1 + '=='} = #{work.gsub(/(C.*E)/){'==' + $1 + '=='}}"
work = ABCDEFG
work.gsub(/(C.*E)/){'==' + $1 + '=='} = AB==CDE==FG
gsub文(文字列置換)(3)
#
work = "%41%42%43+%44%45%46"
puts "work(URL encoded) = #{work}"
work = work.tr("+", " ")
work = work.gsub(/%([0-9a-zA-Z][0-9a-zA-Z])/){$1.hex.chr}
puts "work(URL decoded) = #{work}"
work(URL encoded) = %41%42%43+%44%45%46 work(URL decoded) = ABC DEF
gsub文に関して追記 2009.04.07
(a, b) = "aaa=".split("=")
b.gsub("bbb", "")
上記を実行すると、
./test.rb:?: private method `gsub' called for nil:NilClass (NoMethodError)
のようなエラーが発生する。bが空文字列なのがいけないらしい。これを回避するには、
(a, b) = "aaa=".split("=")
b.to_s.gsub("bbb", "")
の様に明示的にbを文字列クラスに変換してやるとよい。
split文(文字列分割)
#
work = "apple-=-lemon-=-melon-=-orange"
puts "work = #{work}"
work2 = work.split('-=-')
puts "work2 = work.split('-=-')"
puts "work2[0] = #{work2[0]}"
puts "work2[1] = #{work2[1]}"
puts "work2[2] = #{work2[2]}"
puts "work2[3] = #{work2[3]}"
work = apple-=-lemon-=-melon-=-orange
work2 = work.split('-=-')
work2[0] = apple
work2[1] = lemon
work2[2] = melon
work2[3] = orange
split文(文字列分割:分割制限有り)
#
work = "apple-=-lemon-=-melon-=-orange"
puts "work = #{work}"
(var1, var2, var3) = work.split("-=-", 3)
puts "(var1, var2, var3) = work.split('-=-', 3)"
puts "var1 = #{var1}"
puts "var2 = #{var2}"
puts "var3 = #{var3}"
work = apple-=-lemon-=-melon-=-orange
(var1, var2, var3) = work.split('-=-', 3)
var1 = apple
var2 = lemon
var3 = melon-=-orange
length, index, rindex文(文字列長、位置取得)
#
work = "apple apple apple"
puts "work = #{work}"
puts "work.length = #{work.length}"
puts "work.index('apple') = #{work.index('apple')}"
puts "work.rindex('apple') = #{work.rindex('apple')}"
work = apple apple apple
work.length = 17
work.index('apple') = 0
work.rindex('apple') = 12
to_?文(整数化、実数化、文字列化)
#
works = "123"
puts "works = #{works}(is string)"
puts "works.to_i * 10 = #{works.to_i * 10}"
puts "works.to_f * 10 = #{works.to_f * 10}"
puts "works.to_f.to_s + works.to_f.to_s = #{works.to_f.to_s + works.to_f.to_s}"
works = 123(is string) works.to_i * 10 = 1230 works.to_f * 10 = 1230.0 works.to_f.to_s + works.to_f.to_s = 123.0123.0
ファイル(書き込み:puts)
#
f = open("junk.txt", "w")
f.puts("line1")
f.puts("line2\n")
f.puts("line3\n\n")
f.close
ファイル(書き込み:write)
#
f = open("junk2.txt", "w")
f.write("line1")
f.write("line2\n")
f.write("line3\n\n")
f.close
ファイル(行読み込み:gets from puts)
#
f = open("junk.txt", "r")
while (r = f.gets)
p r
p r.chomp
r.chomp!
p r
end
f.close
"line1\n" "line1" "line1" "line2\n" "line2" "line2" "line3\n" "line3" "line3" "\n" "" ""
ファイル(行読み込み:gets from write)
#
f = open("junk2.txt", "r")
while (r = f.gets)
p r
p r.chomp
r.chomp!
p r
end
f.close
"line1line2\n" "line1line2" "line1line2" "line3\n" "line3" "line3" "\n" "" ""
ファイル(ランダム読み:read)
#
f = open("junk.txt", "r")
#f.seek(6)
f.pos = 6
r = f.read(12)
p r
f.close
"line2\nline3\n"
ファイル(書き込み:putc)
#
work = "line1\nline2\nline3\n"
f = open("junk.txt", "w")
for i in 0..(work.length-1)
f.putc(work[i])
end
f.close
ファイル(行読み込み:getc from putc)
#
f = open("junk.txt", "r")
while (ch = f.getc)
print " #{ch.chr}"
end
f.close
l i n e 1 l i n e 2 l i n e 3
【追記】標準入力、標準出力、エラー出力
標準入力、標準出力、エラー出力に対しては、それぞれSTDIN、STDOUT、STDERRが自動的にオープンされているので、いきなり
STDOUT.puts("ほげほげ")
とか、
r = STDIN.gets
みたいに書ける。
ファイル(外部コマンド実行)
#
f = open("|ls -al|head -5", "r")
while (r = f.gets)
puts "==" + r.chomp + "=="
end
f.close
==合計 40== ==drwxr-xr-x 2 m-ito m-ito 4096 2009-03-13 19:45 .== ==drwxr-xr-x 3 m-ito m-ito 4096 2009-03-13 18:24 ..== ==-rw-r--r-- 1 m-ito m-ito 2896 2009-03-13 19:45 junk== ==-rw-r--r-- 1 m-ito m-ito 18 2009-03-13 19:45 junk.txt==
外部コマンド実行
#
for i in `ls -al|head -5`
puts "==" + i.chomp + "=="
end
==合計 40== ==drwxr-xr-x 2 m-ito m-ito 4096 2009-03-13 19:45 .== ==drwxr-xr-x 3 m-ito m-ito 4096 2009-03-13 18:24 ..== ==-rw-r--r-- 1 m-ito m-ito 2896 2009-03-13 19:45 junk== ==-rw-r--r-- 1 m-ito m-ito 18 2009-03-13 19:45 junk.txt==
追記(2011/07/04) : ruby-1.9.xだと(Stringクラスからeachメソッドが削除されたので?)上記の書き方はできない。以下のようにする。
#
`ls -al|head -5`.each_line do |i|
puts "==" + i.chomp + "=="
end
popen文(外部コマンド実行)
#! /usr/bin/ruby
io = IO.popen("cat -n", "r+")
io.puts("line1")
io.puts("line2")
io.puts("line3")
##io.flush # flushをするのが確実。
io.close_write # ただし、起動プログラムの作りによるとclose_writeする必要がある。
r = io.gets
puts r
r = io.gets
puts r
r = io.gets
puts r
io.close
1 line1
2 line2
3 line3
system文(外部コマンド実行)
#
system("ls -al|head -5")
合計 40 drwxr-xr-x 2 m-ito m-ito 4096 2009-03-13 19:45 . drwxr-xr-x 3 m-ito m-ito 4096 2009-03-13 18:24 .. -rw-r--r-- 1 m-ito m-ito 3657 2009-03-13 19:45 junk -rw-r--r-- 1 m-ito m-ito 18 2009-03-13 19:45 junk.txt
print文各種
#
work = "ABCDEFG"
p work
puts work
print work + "\n"
printf("%s %d %f\n", work, 123, 123.456)
"ABCDEFG" ABCDEFG ABCDEFG ABCDEFG 123 123.456000
例外処理
全てのエラーをトラップする場合
begin
エラーを検出したい処理
rescue => e
エラー検出時のトラップ処理
put e
else
エラー未検出時の処理
ensure
エラーの検出のいかんにかかわらず行う処理
end
特定のエラーをトラップする場合
begin
エラーを検出したい処理
rescue Errno::EEXIST => e
エラー検出時のトラップ処理
put e
else
エラー未検出時の処理
ensure
エラーの検出のいかんにかかわらず行う処理
end
「=>e」は省略可能。
ファイル操作
#
File.umask(022)
File.chmod(0777, "junk.txt")
File.rename("junk.txt", "junk3.txt")
File.unlink("junk2.txt")
File.unlink("junk3.txt")
mkdir, rmdir(ディレクトリ操作)
#
retry_max = 3
retry_cnt = 0
begin
Dir.mkdir("lock.dir", 0755)
rescue Errno::EEXIST
puts "lock NG"
retry_cnt += 1
if (retry_cnt < retry_max)
retry
else
puts "lock give up!"
end
else
puts "lock OK"
ensure
Dir.rmdir("lock.dir")
end
lock OK
関数定義
#
def myfunc(v1="defval1", v2="defval2")
local_work = "initialized in myfunc"
puts "$Global_work = #{$Global_work}"
puts v1
puts v2
return "ok"
end
$Global_work = "initialized in main"
local_work = "initialized in main"
puts myfunc()
puts myfunc("poipoi", "hogehoge")
puts "local_work = #{local_work}"
$Global_work = initialized in main defval1 defval2 ok $Global_work = initialized in main poipoi hogehoge ok local_work = initialized in main
クラス定義
#
class Enzan
attr_accessor :x, :y
attr_reader :x_readonly, :y_readonly
attr_writer :x_writeonly, :y_writeonly
def initialize(i=100, j=200)
@x = i
@y = j
end
def tasu
@@global_in_class_work = @x + @y
return @x + @y
end
def hiku
@@global_in_class_work = @x - @y
return @x - @y
end
def compute(i)
case i
when "+"
@@global_in_class_work = @x + @y
return @x + @y
when "-"
@@global_in_class_work = @x - @y
return @x - @y
else
return 0
end
end
def global_in_class_work
return @@global_in_class_work
end
end
e = Enzan.new
puts e.tasu
puts e.hiku
puts e.compute("+")
f = Enzan.new(10, 20)
puts f.tasu
puts f.hiku
puts f.compute("+")
f.x = 1000.0
f.y = 2000.0
puts f.tasu
puts f.hiku
puts f.compute("-")
puts e.global_in_class_work
300 -100 300 30 -10 30 3000.0 -1000.0 -1000.0 -1000.0
クラス定義(継承有り)
#
class Oya
def msg1(arg = "Oya.msg1")
puts arg + " from Oya.msg1"
end
def msg2(arg = "Oya.msg2")
puts arg + " from Oya.msg2"
end
end
class Kodomo < Oya
def msg2(arg = "Kodomo.msg2")
super(arg)
puts arg + " from Kodomo.msg2"
end
def msg3(arg = "Kodomo.msg3")
puts arg + " from Kodomo.msg3"
end
end
msg = Kodomo.new
msg.msg1("message 1")
msg.msg2("message 2")
msg.msg3("message 3")
message 1 from Oya.msg1 message 2 from Oya.msg2 message 2 from Kodomo.msg2 message 3 from Kodomo.msg3
環境変数取得
# puts ENV['PATH']
/home/m-ito/bin:/home/m-ito/etc:/home/m-ito/prov/bin:/usr/local/bin:/usr/local/etc:/usr/local/sbin:/usr/bin:/usr/etc:/bin:/etc:/usr/sbin:/sbin:/usr/X11R6/bin:/opt/gnome/bin:/opt/kde/bin:/usr/local/jvim2.0/bin:/usr/local/canna/bin:/usr/local/lib/w3m:/usr/local/ssl/bin:/usr/local/mrtg/bin:/usr/local/Adobe/Reader8/bin
日時時刻取得
# day = Time.now puts day puts day.year puts day.month puts day.day puts day.hour puts day.min puts day.sec puts day.wday
Fri Mar 13 19:45:44 +0900 2009 2009 3 13 19 45 44 5
kill文(シグナル送信)
#
begin
Process.kill("TERM", 1234)
rescue Errno::ESRCH
puts "no such process"
else
puts "signal send ok"
ensure
end
my_pid = $$
begin
Process.kill(0, my_pid)
rescue Errno::ESRCH
puts "pid(#{my_pid}) is dead"
else
puts "pid(#{my_pid}) is alive"
ensure
end
no such process pid(3544) is alive
nkf文(文字コード変換)
#
require "nkf"
puts NKF.nkf("-S -X -e", "\x8a\xbf\x8e\x9a\x82\xc5\x82\xb7")
漢字です
timeout文
#
require "timeout"
begin
timeout(3){
sleep 10
}
rescue Timeout::Error
puts "timeout happened!"
else
puts "10sec sleepd"
ensure
end
timeout happened!
yield(イテレータ作成)
#
def hoge(arg1, arg2)
puts "arg1=#{arg1}, arg2=#{arg2}"
yield(arg1, arg2, arg1 * arg2)
end
hoge(12,13) do |v1, v2, v3|
puts "v1=#{v1}, v2=#{v2}, v3=#{v3}"
end
arg1=12, arg2=13 v1=12, v2=13, v3=156
_ ruby(1.8.x)儂(わし)的解釈によるメモ(クライアント編)
#! /usr/bin/ruby
require "socket"
s = TCPSocket.new("localhost", 12345)
s.sync = true
s.puts "#{ARGV[0]}"
print s.gets
s.puts "Q"
_ ruby(1.8.x)儂(わし)的解釈によるメモ(サーバ編)
#! /usr/bin/ruby
require 'socket'
def daemon
#
# バックグラウンドに移行する
# プロセスグループリーダ(、セッションリーダ)でなくなる -> 次のsetsidが成功する条件
# 制御端末はまだ持っている
if (pid = fork)
exit 0
end
#
# 新しいセッションのリーダとなり制御端末を持たなくなる
# 新しいプロセスグループのリーダとなる
Process.setsid
#
# セッションリーダ、プロセスグループリーダでなくなる
# よって、再び制御端末を持つ事ができなくなる
if (pid = fork)
exit 0
end
#
Dir.chdir("/")
File.umask(0000)
STDIN.close
STDOUT.close
STDERR.close
Signal.trap("SIGTERM"){
exit 0
}
Signal.trap("SIGHUP"){
exit 0
}
Signal.trap("SIGINT"){
exit 0
}
end
daemon
port = 12345
gs = TCPServer.open(port)
while true
ns = gs.accept
# p ns.peeraddr
Thread.start(ns) do |s|
s.sync = true
while l = s.gets
break if /^q/i =~ l
l.chomp!
s.puts "#{l.swapcase}"
end
s.close
end
end
_ ruby(1.8.x)儂(わし)的解釈によるメモ(基本編の追加編)
times文
3.times do |i| puts i end
0 1 2
step文
1.step(10, 3) do |i| puts i end
1 4 7 10
loop文
i = 0 loop do puts i i += 1 if (i > 3) break end end
0 1 2 3
module文
module Mymodule
def msg(i)
puts "#{i} is hogehoge"
end
def msg2(i)
puts "#{i} is poipoi"
end
module_function :msg, :msg2
end
class Myclass
include Mymodule
def initialize(i)
@msg = i
end
def hoge
msg(@msg)
end
def poi
msg2(@msg)
end
end
mc = Myclass.new("hogepoi")
mc.hoge
mc.poi
hogepoi is hogehoge hogepoi is poipoi
演算式(余り:%, べき乗:**)
puts 12 % 5 puts 2 ** 8
2 256
ビット演算式
a = 0
printf("%d\n", ~a)
a = 0x77
b = 0xee
printf("%x\n", a & b)
a = 0x77
b = 0xee
printf("%x\n", a | b)
a = 0x77
b = 0xee
printf("%x\n", a ^ b)
a = 0x77
printf("%x\n", a << 1)
a = 0xee
printf("%x\n", a >> 1)
-1 66 ff 99 ee 77
条件文(結合)
a = 10 b = 20 if (a < 15 && b > 15) puts "true" else puts "false" end if (a < 15 || b < 15) puts "true" else puts "false" end
true true
配列操作
a = ["w", "x", "y", "z"] a[1, 2] = ["a", "b"] p a
["w", "a", "b", "z"]
a = ["w", "x", "y", "z"] a[1, 0] = ["a", "b"] p a
["w", "a", "b", "x", "y", "z"]
a = ["w", "x", "y", "z"]
a.push("a")
p a
["w", "x", "y", "z", "a"]
p a.pop p a
"a" ["w", "x", "y", "z"]
p a.shift p a
"w" ["x", "y", "z"]
a = ["a", "x", "b", "x", "c"]
a.delete("x")
p a
["a", "b", "c"]
a = ["a", "x", "b", "x", "c"] a.delete_at(2) p a
["a", "x", "x", "c"]
a = ["a", "x", "b", "x", "c"] p a.uniq
["a", "x", "b", "c"]
p "aaa" <=> "bbb" p "bbb" <=> "aaa" p "aaa" <=> "aaa" p a.sort do |a, b| a <=> b end
-1 1 0 ["a", "b", "c", "x", "x"]
文字列の囲み
s = "aaaaa"
puts %Q{" ' #{s} ' "}
puts %q{" ' #{s} ' "}
" ' aaaaa ' "
" ' #{s} ' "
ヒアドキュメント
s = <<EOD
this is line1
this is line2
this is line3
EOD
puts s
this is line1
this is line2
this is line3
文字列操作
a = " ABcdefgabcdeFG "
puts a.delete("cde")
puts a.strip
puts a.upcase
puts a.downcase
puts a.swapcase
ABfgabFG ABcdefgabcdeFG ABCDEFGABCDEFG abcdefgabcdefg abCDEFGABCDEfg
ハッシュ操作
h = {"apple"=>"red", "lemon"=>"yellow", "melon"=>"green"}
p h.has_key?("lemon")
p h.has_value?("yellow")
p h.empty?
true true false
ハッシュ初期化
h = {"apple"=>"red", "lemon"=>"yellow", "melon"=>"green"}
i = h
h.clear
p h
p i
{}
{}
h = {"apple"=>"red", "lemon"=>"yellow", "melon"=>"green"}
i = h
h = {}
p h
p i
{}
{"melon"=>"green", "apple"=>"red", "lemon"=>"yellow"}
正規表現
a = "abcde\nfghijk\nlmnop" p /^f.*k$/ =~ a p /\Af.*k\Z/ =~ a p /^a.*p$/ =~ a p /\Aa.*p\Z/m =~ a
6 nil nil 0
繰り返し(文字列scan)
a = "axxxb...ayyyb...azzzb" a.scan(/a...b/) do |i| puts i end
axxxb ayyyb azzzb
同期出力
STDOUT.puts "aaa" STDOUT.flush STDOUT.sync = true STDOUT.puts "bbb"
aaa bbb
ディレクトリ操作
puts cd = Dir.pwd
Dir.chdir("/tmp")
puts Dir.pwd
Dir.chdir(cd)
puts Dir.pwd
/home/zaurus/tmp /tmp /home/zaurus/tmp
ディレクトリ操作(2)
dir = Dir.open("/")
while (name = dir.read)
puts name
end
dir.close
. .. bin dev etc lib mnt opt tmp var usr boot home proc sbin root
ファイル属性取得
printf("%o\n", File.stat("/etc/fstab").mode)
puts File.stat("/etc/fstab").uid
puts File.stat("/etc/fstab").gid
puts File.stat("/etc/fstab").size
puts File.stat("/etc/fstab").atime
puts File.stat("/etc/fstab").mtime
puts File.stat("/etc/fstab").ctime
100644 0 0 222 Sun Nov 11 23:30:54 +0900 2007 Sun Nov 11 23:30:54 +0900 2007 Sun Nov 11 23:30:54 +0900 2007
ファイル属性変更
f = open("junk.txt", "w")
f.close
puts atime = File.stat("junk.txt").atime
puts mtime = File.stat("junk.txt").mtime
File.utime(atime + 60, mtime + 60, "junk.txt")
puts atime = File.stat("junk.txt").atime
puts mtime = File.stat("junk.txt").mtime
File.unlink("junk.txt")
Sat Mar 14 18:53:35 +0900 2009 Sat Mar 14 18:53:35 +0900 2009 Sat Mar 14 18:54:35 +0900 2009 Sat Mar 14 18:54:35 +0900 2009
ファイル属性変更(2)
#f = open("junk.txt", "w")
#f.close
#File.chown(0, 0, "junk.txt")
#File.unlink("junk.txt")
ファイルテスト
puts File.exist?("/etc/fstab")
puts File.file?("/etc/fstab")
puts File.directory?("/etc/fstab")
puts File.readable?("/etc/fstab")
puts File.writable?("/etc/fstab")
puts File.executable?("/etc/fstab")
puts File.zero?("/etc/fstab")
puts File.size("/etc/fstab")
true true false true false false false 222
ファイル名操作
puts File.basename("/usr/local/doc/ruby.doc", ".doc")
puts File.dirname("/usr/local/doc/ruby.doc")
puts File.expand_path("./junk.txt")
ruby /usr/local/doc /home/root/usr/local/home/zaurus/tmp/junk.txt
eval文
#! /usr/bin/ruby
def func_print(str)
print str
end
eval_str = ARGV[0] + '("hello world\n")'
eval eval_str
$ ./evaltest.rb func_print hello world
取り扱いに注意しないと、いろんな物を注入(Injection)されちゃう。
_ ruby(1.8.x)儂(わし)的解釈によるメモ(CGI編)
#! /usr/bin/ruby
#
# 産まれて初めてのrubyによるCGIプログラム...
#
require "cgi"
require "nkf"
cgi = CGI.new("html3")
in1 = NKF.nkf("-X -e", cgi['in1'])
cgi.out({"type" => "text/html",
"charset" => "euc-jp"}){
cgi.html("PRETTY" => true){
cgi.head(){
cgi.title(){"rubytest1"}
}
cgi.body(){
cgi.div({"align" => "center"}){
"rubytest1"
} +
CGI.escapeHTML("Input is #{in1}") +
cgi.br() +
cgi.form({"action" => "rubytest1.cgi",
"method" => "post"}){
cgi.input({"type" => "text",
"name" => "in1",
"id" => "in1"}) +
cgi.input({"type" => "submit",
"value" => "ok"})
}
}
}
}
exit 0
_ ruby(1.8.x)儂(わし)的解釈によるメモ(未検証)
pack, unpack
arry = [0x41, 0x42, 0x43] # A,B,C
buf = arry.pack("C3")
p buf
buf = sock.read(4)
arry = buf.unpack("N") # Network byte order Integer(BIG ENDIAN)
p arry[0]
[ツッコミを入れる]