Rubyの魔神 このページをアンテナに追加 RSSフィード

   「Ruby」は宝石の魔神のイメージ(The Jinn of the Ruby)
[DMY] [VB] [VB6] [Python] [C#] [Android] [電子工作] [個人メモ] [仕事メモ] [アイデア] [TstLink] [CE] [LTSA]
[自動化] [Qt] [OCaml] [3Dプリンタ] [TOOLS] [RAA] [Forge]
  [機能別索引] [逆引きRuby] [マニュアル] [るびま] [標準ライブラリ] [るりまサーチ] [Try! Ruby] [PRaggerまとめ] [ピジョン・ブラッド]
   [Rubyコーディング規約] [プログラミングのオキテ] [Rubyist SNS] [TOOLBIS]
   [RubyネットワークProg] [druby] [コードなにがし] [RDocテンプレ] [Ruby/Tkサンプル]
   [WAVE] [Xperia] [github] [twitterなど] [EA] [マクロ]

2006-11-26

uploader

| 01:14 | uploader - Rubyの魔神 を含むブックマーク はてなブックマーク - uploader - Rubyの魔神 uploader - Rubyの魔神 のブックマークコメント

http://q.hatena.ne.jp/1164332804

#!/usr/bin/env ruby

require "cgi"

cgi = CGI.new("html4Tr")
if cgi.request_method == "POST"
  tmp = cgi.params['filename'][0]
  open("store/" + tmp.original_filename, "w") { |io|
    io.write(tmp.read)
  }
end

files = []
Dir.glob("store/*") do |file|
  files.push(cgi.a(file) {file})
end
file_list = files.join(cgi.br + "\n")

cgi.out do
  cgi.html("PRETTY" => "  ") do
    cgi.head do
      cgi.title do "upload"; end
    end + cgi.body do
      cgi.multipart_form(cgi.script_name) do
        cgi.file_field("filename", 50) + cgi.submit
      end + file_list.to_s
    end
  end
end

文字列中で指定したパターンにマッチする部分を置換する

| 文字列中で指定したパターンにマッチする部分を置換する - Rubyの魔神 を含むブックマーク はてなブックマーク - 文字列中で指定したパターンにマッチする部分を置換する - Rubyの魔神 文字列中で指定したパターンにマッチする部分を置換する - Rubyの魔神 のブックマークコメント

文字列中で指定したパターンマッチする部分を置換するにはString#sub、String#gsubメソッドを使用します。 String#subメソッドは文字列中で最初にマッチした部分だけを置換しますが、String#gsubメソッドはマッチする全ての部分を置換します。パターンには正規表現も指定できます。

s = "Apple Banana Apple Orange"

p s.sub("Apple", "Pine") #=> "Pine Banana Apple Orange"

p s.gsub("Apple", "Pine") #=> "Pine Banana Pine Orange"

String#sub、String#gsubメソッドにはそれぞれ破壊的メソッドString#sub!、String#gsub!が用意されています

Rubyで簡単なHTTPサーバ

| Rubyで簡単なHTTPサーバ - Rubyの魔神 を含むブックマーク はてなブックマーク - Rubyで簡単なHTTPサーバ - Rubyの魔神 Rubyで簡単なHTTPサーバ - Rubyの魔神 のブックマークコメント

Rubyで簡単なHTTPサーバを作ろうと思って調べてみました。

webrickを使えば、あっというまにできました。

#!ruby
require 'webrick'

srv = WEBrick::HTTPServer.new({
  :DocumentRoot => './',
  :BindAddress => '127.0.0.1',
  :Port => 10080})
srv.start
Rubyで簡易HTTPサーバ (山本隆の開発日誌)

http://www.hyuki.com/d/200511.html#i20051111184206

require 'socket'

header = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"
form = "<form action='/'><textarea name='m'></textarea><input type='submit'></form>"

server = TCPServer.open(8888)
while true
  socket = server.accept
  request = socket.readline
  socket.write "#{header}<html><pre>#{request}</pre>#{form}</html>"
  socket.close
end

GUI付

| GUI付 - Rubyの魔神 を含むブックマーク はてなブックマーク - GUI付 - Rubyの魔神 GUI付 - Rubyの魔神 のブックマークコメント

require 'socket'

system("start http://localhost:8888/")

header = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"
form = "<form action='/'><textarea name='m'></textarea><BR><input type='file' name='file'><input type='submit'></form>"

server = TCPServer.open(8888)
while true
  socket = server.accept
  request = socket.readline
  socket.write "#{header}<html><pre>#{request}</pre>#{form}</html>"
  socket.close
end

CSVファイル処理

| CSVファイル処理 - Rubyの魔神 を含むブックマーク はてなブックマーク - CSVファイル処理 - Rubyの魔神 CSVファイル処理 - Rubyの魔神 のブックマークコメント

#!ruby -Ks
require 'csv'

csv = CSV.open('test.csv', 'r')
csv.each_with_index {|line, i|
puts "#{i+1}行目の最初のフィールド: " + line[0]
}
Yahoo!知恵袋 - <<Ruby初心者なんですが。。。>> Excel...

MySQL

| MySQL - Rubyの魔神 を含むブックマーク はてなブックマーク - MySQL - Rubyの魔神 MySQL - Rubyの魔神 のブックマークコメント

require 'mysql'

#my = Mysql::new("localhost","ruby","")
#my.create_db("TEST_RUBY")
#my.close

object = Mysql::new("localhost","ruby","","TEST_RUBY")
#object.query('create table test_table (name char(32),price int)')

#object.query("insert into test_table values ('apple',300);")
#object.query("insert into test_table values ('orange',80);")
#object.query("insert into test_table values ('banana',150);")
#object.query("insert into test_table values ('apple',250);")
#object.query("insert into test_table values ('orange',3450);")
#object.query("insert into test_table values ('banana',450);")

f_name='apple'
res_price = object.query("select name,price from test_table where name='#{Mysql::quote f_name}'")

p res_price

p res_price.num_rows

res_price.each do |name,price|
p name,price
end

object.close

MySQL+CGI掲示板(自作)

| MySQL+CGI掲示板(自作) - Rubyの魔神 を含むブックマーク はてなブックマーク - MySQL+CGI掲示板(自作) - Rubyの魔神 MySQL+CGI掲示板(自作) - Rubyの魔神 のブックマークコメント

#!/usr/local/bin/ruby

require "cgi"
require "mysql"


print "Content-Type: text/html\n"
print "\n"
print <<EOF
<html>
<head></head>
<body>
EOF

day = Time.new

cgi = CGI.new

object = Mysql::new("localhost","ruby","","TEST_RUBY")
if cgi['test1']!="" and cgi['test2'] != "" then
  s = "insert into test_bbs values (\"#{day.to_s}\",\"#{cgi['test1']}\",\"#{cgi['test2']}\");"
  object.query(s)
end

print <<EOF
<form method=POST action="./db_bbs.rb">
URL<input type="text" name="test1" value="">
Message<input type="text" name="test2" value="">
<input type="submit" value="send"><input type="reset" value="RESET">
</form>
EOF

res = object.query("select * from test_bbs order by date desc")
res.each do |date,url,comment|
	puts date + 'URL <a href="' + url +'">'+ url +"</A>  message " + comment + "<BR>"
end
object.close

print <<EOF
</body>
</html>
EOF
#!/usr/local/bin/ruby

require 'mysql'

#object = Mysql::new("localhost","ruby","")
#object.create_db("TEST_RUBY")
#object.close

object = Mysql::new("localhost","ruby","","TEST_RUBY")
object.query('create table test_bbs (date text,url text,comment text)')
object.close

ワイルドカードにマッチしたファイル全てに処理を行う

| ワイルドカードにマッチしたファイル全てに処理を行う - Rubyの魔神 を含むブックマーク はてなブックマーク - ワイルドカードにマッチしたファイル全てに処理を行う - Rubyの魔神 ワイルドカードにマッチしたファイル全てに処理を行う - Rubyの魔神 のブックマークコメント

Dir.glob("**/*.txt") do |file|
  puts file
end
 ワイルドカードにマッチしたファイル全てに処理を行う

Dir::globメソッドにより指定したワイルドカードを展開し、マッチしたファイルの一覧を取得することができます。以下のようにするとマッチした全てのファイルに対して順番に処理を行うことができます。

Dir::glob("/home/take/public_html/*.html").each {|f|
  # ここにマッチしたファイルに対して行う処理を記述する
  # この例ではファイル名とファイルのサイズを標準出力へ出力している
  puts "#{f}: #{File::stat(f).size} bytes"
}

ワイルドカードに**/を指定するとサブディレクトリ配下のファイルもマッチします。以下の例では/home/take/public_html配下にある*.htmlのファイル名とファイルサイズを標準出力へ出力します。

Dir::glob("/home/take/public_html/**/*.html").each {|f|
  # ここにマッチしたファイルに対して行う処理を記述する
s  # この例ではファイル名とファイルのサイズを標準出力へ出力している
  puts "#{f}: #{File::stat(f).size} bytes"
}

ワイルドカードには以下のものがあります。

*p2*
    空文字列を含む任意の文字列と一致します。 
?
    任意の一文字と一致します。
[ ]
    []内のいずれかの文字と一致します。A-Zのように指定すると範囲を表します。[] が ^の場合、そこに含まれない文字と一致します。
{ }
    {}内で,で区切られた文字列の組合せに展開します。例えばfoo{a,b,c}はfooa, foob, foocに展開されます。他のワイルドカードと異なり、展開結果のファイルが存在している必要はありません。 ]
**/
    ディレクトリを再帰的に辿りマッチを行います。例えば、foo/**/ はfoo/bar/、foo/bar/hogeなど、配下の全サブディレクトリとマッチします。 

インスタンス変数へアクセスするメソッドを簡単に定義する

| インスタンス変数へアクセスするメソッドを簡単に定義する - Rubyの魔神 を含むブックマーク はてなブックマーク - インスタンス変数へアクセスするメソッドを簡単に定義する - Rubyの魔神 インスタンス変数へアクセスするメソッドを簡単に定義する - Rubyの魔神 のブックマークコメント

attr_readerメソッド、attr_writerメソッド、attr_accessorメソッドを使うとインスタンス変数へアクセスするためのメソッドが自動的に定義されます。メソッド名はそのインスタンス変数と同一の名称で定義されます。attr_readerメソッドは読み出しメソッドのみ、attr_writerメソッドは代入メソッドのみ、attr_accessorメソッドは両方のメソッドが定義されます。

class SampleClass
  def iniitilize
    @a = 0
    @b = 0
    @c = 0
  end

  attr_accessor :a, :b, :c
end

o = SampleClass.new
o.a = 10
o.b = 20
o.c = 30

p o.a #=> 10
p o.b #=> 20
p o.c #=> 30

足し算プログラム

| 足し算プログラム - Rubyの魔神 を含むブックマーク はてなブックマーク - 足し算プログラム - Rubyの魔神 足し算プログラム - Rubyの魔神 のブックマークコメント

#!/usr/local/bin/ruby

require "cgi"

print "Content-Type: text/html\n"
print "\n"

day = Time.new

cgi = CGI.new
f=File.open("log.txt","a")
f.puts(day.to_s + " " + cgi['test1']+"+"+cgi['test2']+"="+(cgi['test1'].to_i+cgi['test2'].to_i).to_s)
f.close

print <<EOF
<html>
<head></head>
<body>
<form method=POST action="./add.rb">
<input type="text" name="test1" value="">
<input type="text" name="test2" value="">
<input type="submit" value="send"><input type="reset" value="RESET">
</form>
EOF
f = File.open("log.txt","r")

f.each do |line|
  puts line,"<BR>"
end

print <<EOF
</body>
</html>
EOF

引数はARGV配列に入る

| 引数はARGV配列に入る - Rubyの魔神 を含むブックマーク はてなブックマーク - 引数はARGV配列に入る - Rubyの魔神 引数はARGV配列に入る - Rubyの魔神 のブックマークコメント

http://homepage1.nifty.com/~tetsu/ruby/learn/echo.html#argv

#! /usr/local/bin/ruby

ARGV.each do |i|
  print i, ' '
end

print "\n"

ハッシュでクロス集計

| ハッシュでクロス集計 - Rubyの魔神 を含むブックマーク はてなブックマーク - ハッシュでクロス集計 - Rubyの魔神 ハッシュでクロス集計 - Rubyの魔神 のブックマークコメント

f = File.open("all.csv")

b=[]
judge={}
dt={}
cross={}
c=[]

while line = f.gets
  v = line.split(",")
  puts v[0]
  b << v
  c<< Data.new(v)
  if judge[v[2]] == nil then
    judge[v[2]] = 1
  else
    judge[v[2]] = judge[v[2]] + 1
  end

  if dt[v[0]] == nil then
    dt[v[0]] = 1
  else
    dt[v[0]] = dt[v[0]] + 1
  end

  if cross[v[0] + " " + v[2]] == nil then
    cross[v[0] +  " " + v[2]] = 1
  else
    cross[v[0] +  " " + v[2]] = cross[v[0] +  " " + v[2]] + 1
  end
end

judge.each do |i|
  p i
end

dt.each do |i|
  p i
end

cross.each do |i|
  p i
end

文字列を整数に変換する (to_i)

| 文字列を整数に変換する (to_i) - Rubyの魔神 を含むブックマーク はてなブックマーク - 文字列を整数に変換する (to_i) - Rubyの魔神 文字列を整数に変換する (to_i) - Rubyの魔神 のブックマークコメント

文字列を数値に変換するにはString#to_iメソッドを使います。

i = 1
s = "999"

i = i + s.to_i #=> 1000

現在の時刻を取得する

| 現在の時刻を取得する - Rubyの魔神 を含むブックマーク はてなブックマーク - 現在の時刻を取得する - Rubyの魔神 現在の時刻を取得する - Rubyの魔神 のブックマークコメント

Time#nowメソッドにより現在の時刻を取得することができます。Time#nowメソッドはTimeオブジェクトを返却します。

day = Time.now
p day #=> "Sun May 20 23:48:45 JST 2001"
p day.year #=> 2001
p day.month #=> 5
p day.day #=> 20
p day.hour #=> 23
p day.min #=> 48
p day.sec #=> 45
p day.wday #=> 0

時刻オブジェクトを文字列に変換する

| 時刻オブジェクトを文字列に変換する - Rubyの魔神 を含むブックマーク はてなブックマーク - 時刻オブジェクトを文字列に変換する - Rubyの魔神 時刻オブジェクトを文字列に変換する - Rubyの魔神 のブックマークコメント

Time#to_sメソッドにより時刻オブジェクトを文字列へ変換することができます。

day = Time.now
p day.to_s #=> "Now, Sunday May 20 23:33:37 JST 2001"

1行チャット

| 1行チャット - Rubyの魔神 を含むブックマーク はてなブックマーク - 1行チャット - Rubyの魔神 1行チャット - Rubyの魔神 のブックマークコメント

#!/usr/local/bin/ruby

require "cgi"

print "Content-Type: text/html\n"
print "\n"

day = Time.new

cgi = CGI.new
f=File.open("log.txt","a")
f.puts(day.to_s + " " + cgi['test'])
f.close

print <<EOF
<html>
<head></head>
<body>
<form method=POST action="./comment.rb">
<input type="text" name="test" value="">
</form>
EOF
f = File.open("log.txt","r")

f.each do |line|
  puts line,"<BR>"
end

print <<EOF
</body>
</html>
EOF

電話番号4分割ツール

| 電話番号4分割ツール - Rubyの魔神 を含むブックマーク はてなブックマーク - 電話番号4分割ツール - Rubyの魔神 電話番号4分割ツール - Rubyの魔神 のブックマークコメント

f1=File.open("telno1.txt","w")
f2=File.open("telno2.txt","w")
f3=File.open("telno3.txt","w")
f4=File.open("telno4.txt","w")

infile = open("telno.txt")
i=0
infile.each { |line|
	print line
	if i % 4 == 0 then
		f1.write line
	elsif i % 4 == 1 then
		f2.write line
	elsif i % 4 == 2 then
		f3.write line
	elsif i % 4 == 3 then
		f4.write line
	end
	i = i + 1
}

テキストファイルを配列に読み込む

| テキストファイルを配列に読み込む - Rubyの魔神 を含むブックマーク はてなブックマーク - テキストファイルを配列に読み込む - Rubyの魔神 テキストファイルを配列に読み込む - Rubyの魔神 のブックマークコメント

open("telno1.txt") {|file|
  print file.readlines[99]
}

ファイル読み込み

| ファイル読み込み - Rubyの魔神 を含むブックマーク はてなブックマーク - ファイル読み込み - Rubyの魔神 ファイル読み込み - Rubyの魔神 のブックマークコメント

Ruby:
infile = open("file")
while infile.each
  print $_
end

または
infile = open("file")
infile.each { |line|
  print line
}

または
foreach ("file") { |line|
  print line
}

コマンド実行

| コマンド実行 - Rubyの魔神 を含むブックマーク はてなブックマーク - コマンド実行 - Rubyの魔神 コマンド実行 - Rubyの魔神 のブックマークコメント

注意 引数は''で囲むこと ""で囲った場合パスの¥をエスケープコードとみなすため

system(command)

system(program[, arg1[, arg2[, ...])

command を実行して、成功した時(子プロセスが終了ステータス 0 で終了した時)には真を、失敗した時(コマンドが実行できなかった場合も含む)には偽を返します。終了ステータス変数 $? で参照できます

現在時刻表示

| 現在時刻表示 - Rubyの魔神 を含むブックマーク はてなブックマーク - 現在時刻表示 - Rubyの魔神 現在時刻表示 - Rubyの魔神 のブックマークコメント

#!/usr/local/bin/ruby

t=Time.now

printf("now %d/%d/%d %d:%d:%d \n",t.year,t.month,t.day,t.hour,t.min,t.sec)


トラックバック - http://ruby.g.hatena.ne.jp/garyo/20061126