RubyでCGIスクリプトを作る下準備・URLを自動リンクする正規表現

$KCODEに"EUC"を代入すれば、\wが2バイト文字にマッチするので
↓はhttp://hogehoge/hoge?a=ほげほげ にもマッチする。

def autolink str
  $KCODE = "EUC" # 文字コードEUC
  str.gsub!(/((https?|ftp):\/\/(=([\x21-\x7e]|\w)+|[\x21-\x7e])+)/) { |s|
    s = "<a href=\"#{$1}\" target=_blank>#{$1}</a>"
  }
end

RubyでCGIスクリプトを作る下準備・Rubyからsendmailを使う

CGIスクリプトからメールを送信出来ると便利そうなので作る。
sendmailのオプションに-tを付けるとTo:、Cc:、Bcc:を解釈するようになる。

#!/usr/local/bin/ruby

#
# Rubyからsendmailを使うデモ
#

SENDMAIL = "/usr/libexec/sendmail/sendmail" # sendmailのパス

def sendmail sm_from, sm_to, sm_cc, sm_bcc, sm_sub, sm_com
  require "kconv"

  sm_sub = sm_sub.tojis
  sm_com = sm_com.tojis

  IO.popen("#{SENDMAIL} -t", "r+") { |io|
    io.print "From: #{sm_from}\n"
    io.print "To: #{sm_to}\n"
    io.print "Cc: #{sm_cc}\n" if sm_cc != nil
    io.print "Bcc: #{sm_bcc}\n" if sm_bcc != nil
    io.print "Subject: #{sm_sub}\n"
    io.print "MIME-Version: 1.0\n"
    io.print "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"
    io.print "Content-Transfer-Encoding: 7bit\n"
    io.print "\n"
    io.print "#{sm_com}\n"
  }
end

# from@hoge:差出人、to@hoge:宛先
sendmail("from@hoge", "to@hoge", nil, nil, "テストメール", "テスト")

RubyでCGIスクリプトを作る下準備・cryptを使う

掲示スクリプト等で使いそうなパスワード人証を作っておく。
saltはランダムで選ぶ仕様。
一般的なDESとMD5に対応。

参照)
Rubyリファレンスマニュアル -String- http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=String

#!/usr/local/bin/ruby

#
# Cryptテスト
#

def encrypt(pwd)
  salt = [rand(64), rand(64)].pack("C*").tr("\x00-\x3f", "A-Za-z0-9./")
  return pwd.crypt(salt)
end

def checkpwd(chk, pwd)
  if pwd =~ /^\$[0-9]\$([A-Za-z0-9\.\/]+)\$([A-Za-z0-9\.\/]+)$/ # MD5
    salt = $1
  else
    pwd =~ /^([A-Za-z0-9\.\/]{2})/ # MD5以外は一般的なDESとしてみる
    salt = $1
  end

  if pwd == chk.crypt(salt)
    return true
  else
    return false
  end
end

pass = "hoge"
pass = encrypt(pass)
print pass + "\n"

if checkpwd("hoge", pass)
  print "hoge\n" # 実行される
end

if checkpwd("hogehoge", pass)
  print "hogehoge\n" # 実行されない
end

RubyでCGIスクリプトを作る下準備・ファイルの読み書き

典型的なファイルの読み書きのデモ。
多分、windowsではflockは使えない。

ftest.rb

#!/usr/local/bin/ruby

#
# ファイルの読み書きデモ
#

file1 = "ftest.rb" # このスクリプトのファイル名
file2 = "test.txt" # 書き込みテスト用の空ファイル
lock  = "YES"      # YESならflockを使う

##### ファイルの各行を配列に割り当てて表示

print "■ファイルの各行を配列に割り当てて表示\n"

File.open(file1) { |f|
  $lines = f.readlines
} # 括弧が閉じれば自動的にファイルがクローズされる

$lines.each { |l|
  print l
}

print "\n"

##### ファイルから一行ずつ読み込んで表示

print "■ファイルから一行ずつ読み込んで表示\n"

File.open(file1) { |f|
  while f.gets
    print $_
  end
}

print "\n"

##### ファイルから数字を読みとり1足して書き込む

print "■ファイルから数字を読みとり1足して書き込む\n"

File.open(file2, "r+") { |f|
  if (lock == "YES")
    f.flock(File::LOCK_SH) # ファイルが閉じれば自動的にロック解除
  end

  count = f.read.to_i
  count = count + 1
  f.pos = 0 # ファイルポインタを先頭にする
  f.print "#{count}"
  print "count = #{count}\n"
}

FreeBSDメモ・スワップファイルの作り方

  1. カーネルコンフィギュレーションに「pseudo-device vn 1 # Vnode driver」を確認。
  2. スワップファイルを作成「# dd if=/dev/zero of=/usr/SWAPFILE bs=1024k count=10」(10kbの例)
  3. /etc/rc.confに「/usr/SWAPFILE」を記述。
  4. リブートしてスワップファイルを確認。「# swapinfo」

参照)
http://www.jp.freebsd.org/QandA/HTML/2441.html

Ruby/GDライブラリのメモ

GD::Image.new(width, height)
新規のイメージ。 width:幅 height:高さ

GD::Image.new_from_png(filename)
ファイルから新規のPNGイメージ。 filename:ファイル名

GD::Image#copy(dest_img, dest_X, dest_Y, self_X, self_Y, width, height)
イメージのコピー。dest_imgの(dest_X, dest_Y)に(self_X, self_Y)から幅width、高さheightで。

GD::Image#png(file)
fileにPNG画像を出力。

RubyでCGIスクリプトを作る下準備・アクセスカウンターもどきのCGI

GDライブラリを使ってPNG画像の表示。

#!/usr/local/bin/ruby

#
# アクセスカウンターもどき・デモ
#
# 0.png, 1.png ... 9.png を自分で用意する
#

require "GD"

W = 8  # 0.png 〜 9.png の画像の幅
H = 16 # 0.png 〜 9.png の画像の高さ
N = 3  # 表示する桁数

def printpng(count)
  im = GD::Image.new(W * N, H)

  count = count % (10 ** N)

  n = 0
  sprintf("%0#{N}d", count).split("").each { |num|
    numimg = GD::Image.new_from_png(num + ".png")
    numimg.copy(im, W * n, 0, 0, 0, W, H)
    n = n + 1
  }

  print "Content-Type: image/png\n\n"
  im.png STDOUT
end

cnt = rand(10000)
printpng(cnt)