今日はクッキーとクリプトとリンク部分
str.gsub(/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/,"\\1\\2")
の$1を\\1にしなきゃいけないのはググって発見したけど理由は分かりませんでした。

#-------------------------------------------------
#  クッキー発行
#-------------------------------------------------
def set_cookie(nam,eml,url,pwd)
  t = Time.now + 60*24*60*60
  m = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
  w = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
  gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", w[t.wday], t.day, m[t.month - 1], t.year, t.hour, t.min, t.sec)
  cook = "#{nam}<>#{eml}<>#{url}<>#{pwd}"
  cook = cook.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
    '%' + $1.unpack('H2' * $1.size).join('%').upcase
  end.tr(' ', '+')
  print "Set-Cookie: ASKA_BBS=#{cook}; expires=#{gmt}\n";
end

#-------------------------------------------------
#  クッキー取得
#-------------------------------------------------
def get_cookie
  cook = ENV['HTTP_COOKIE']
  ck = Hash.new
  cook.split(/;/).each {|l|
    (key,val) = l.split(/=/)
    key.gsub!(/\s/,'')
    ck[key] = val
  }
  ck['ASKA_BBS'] = ck['ASKA_BBS'].tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
    [$1.delete('%')].pack('H*')
  end
  return ck['ASKA_BBS'].split(/<>/)
end

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

#-------------------------------------------------
#  crypt照合
#-------------------------------------------------
def decrypt(inp, pwd)
  if inp.crypt(pwd) == pwd
    return 1
  else
    return 0
  end
end

#-------------------------------------------------
#  自動リンク
#-------------------------------------------------
def auto_link(str)
  str.gsub(/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/,"\\1<a href=\"\\2\" target=\"_blank\">\\2</a>")
end

変更

def get_cookie
cook = ENV['HTTP_COOKIE']
cook = ';' unless cook
ck = Hash.new("")

クッキー部分は上記のようにしないと
初めてアクセスしてクッキーが記録されてないとエラーになります。
Perlだとエラーが出ないのにRubyではnilという概念でエラーが出る場面が多いです。
これって不便に感じるんですが何か役に立つのかな?

とりあえず動くようになったのでリンク
http://apollorec.main.jp/aska/aska.cgi
http://apollorec.main.jp/aska/aska.txt
さて、これをRubyらしくしてみせますw
(といってもどうすりゃいいのかわからないので、助言をお願いします。)

投稿受付部分

def regist
  # 投稿チェック
  error("不正なアクセスです") if $postonly == 1 && $post_flag == 0
  refCheck if $baseUrl != ''

  # チェック
  no_wd if $no_wd != ''
  jp_wd if $jp_wd == 1
  urlnum if $urlnum > 0

  # フォーム内容をチェック
  err = ''
  err = err + "名前が入力されていません<br>"  if $in['name'] == ""
  err = err + "コメントが入力されていません<br>"  if $in['comment'] == ""
  err = err + "Eメールの入力内容が不正です<br>"  if $in['email'] != '' && $in['email'] !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/
  error(err) if err != ''

  $in['url'] = '' if $in['url'] == "http://"
  $in['sub'] = '無題' if $in['sub'] == ""

  # 記事読み取り
  io = open($logfile, "r+")
  log = io.readlines

  # 重複投稿チェック
  (no,dat,nam,eml,sub,com,url,hos,pw,tim) = log[0].split(/<>/)
  if $in['name'] == nam && $in['comment'] == com
    io.close
    error("二重投稿は禁止です");
  end

  # 連続投稿チェック
  t = Time.now
  time = t.to_i
  flg = 0
  if $regCtl == 1
    flg = 1 if $host == hos && time - tim.to_i < $wait
  elsif $regCtl == 2
    flg = 1 if time - tim.to_i < $wait
  end
  if flg == 1
    io.close
    error("現在投稿制限中です。もうしばらくたってから投稿をお願いします");
  end

  # 記事No採番
  no = no.to_i + 1

  # 時間取得
  wk = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
  date = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d", t.year, t.month, t.day, wk[t.wday], t.hour, t.min, t.sec)

  # 記事数調整
  log.pop while log.size >= $max

  # 更新
  io.rewind
  io.print "#{no}<>#{date}<>#{$in['name']}<>#{$in['email']}<>#{$in['sub']}<>#{$in['comment']}<>#{$in['url']}<>#{$host}<>#{$pwd}<>#{time}<>\n"
  io.print log
  io.truncate(io.pos)
  io.close
end

#-------------------------------------------------
#  REFチェック
#-------------------------------------------------
def refCheck
  ref = ENV['HTTP_REFERER']
  ref = ref.gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
      [$1.delete('%')].pack('H*')
  end
end

#-------------------------------------------------
#  禁止ワードチェック
#-------------------------------------------------
def no_wd
  flg = 0
  $no_wd.split(/,/).each {|l|
   flg = 1 if $in['name'].index(l)
   flg = 1 if $in['comment'].index(l)
  }
  error("禁止ワードが含まれています") if flg == 1
end

#-------------------------------------------------
#  日本語チェック
#-------------------------------------------------
def jp_wd
  if $in['comment'] !~ /[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/
    error("コメントに日本語が含まれていません")
  end
end

#-------------------------------------------------
#  URL個数チェック
#-------------------------------------------------
def urlnum 
  if $urlnum < $in['comment'].scan("http").length
    error("コメント中のURLアドレスは最大#{$urlnum}個までです")
  end
end

昨日に引き続き
axscheck,error,headderと
頑張りました。
しかし、KENTさんの掲示板って、もっとシンプルで分かりやすかったと思ってたけど
結構、複雑です。

#!/usr/local/bin/ruby

$host = ''
$addr = ''
$deny_addr = ''
$deny_host = ''
$headflag = nil
$title = '掲示板のテスト'
$body = '<body>'

def axscheck
# IP&ホスト取得
  $host = ENV['REMOTE_HOST']
  $addr = ENV['REMOTE_ADDR']

#  if $gethostbyaddr && ($host == "" || $host == $addr)
#    a = Socket.gethostbyname($addr)
#    $host = Socket.gethostbyaddr(a[3], a[2])
#  end ちょっとエラーがでますワラ

# IPチェック
  flg = nil
  $deny_addr.split(/\s+/).each {|l|
    l = l.gsub(/\./,"\\\.")
    l = l.gsub(/\*/,"\.\*")
    if /^#{l}/i =~ $addr
      flg = 1
    end
  }
  if flg
    error("アクセスを許可されていません")
  end
# ホストチェック
  $deny_host.split(/\s+/).each {|l|
    l = l.gsub(/\./,"\\\.")
    l = l.gsub(/\*/,"\.\*")
    if /^#{l}/i =~ $host
      flg = 1
    end
  }
  if flg
    error("アクセスを許可されていません")
  end
  $host = $addr if $host == ''
end

def error(msg)
  header
  print <<EOM;
<div align="center">
<hr width="400">
<h3>ERROR !</h3>
<font color="#dd0000">#{msg}</font>
<br>
<form>
<input type="button" value="前画面に戻る" onclick="history.back()">
</form>
<hr width="400">
</div>
</body>
</html>
EOM
  exit
end

def header
  return if $headflag
  print "Content-type: text/html\n\n"
  print <<"EOM"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<meta http-equiv="content-style-type" content="text/css">
<style type="text/css">
<!--
body,td,th { font-size:$bSize; font-family:$bFace }
.tbl { background-color:#ffffff; color:#000000; }
-->
</style>
<title>#{$title}</title>
</head>
#{$body}
EOM
  $headflag = 1
end

axscheck

header

print <<END_HTML
<H1>BBS test</H1>
<P>REMOTE_HOST= #{$host}</P>
<P>REMOTE_ADDR= #{$addr}</P>
</BODY>
</HTML>
END_HTML

Rubyの勉強したいんですが、レベルが高すぎて理解不能
とりあえず、KENTさんのASKA BBSをできるだけそのまま移植してみます。
今日はdecodeのところを。。。
質問するレベルにも達してなくて途方に暮れてます。
公開すれば親切な人が教えてくれるかと期待してます。
おかしいところや直したらいいところ教えてください。
ぼちぼちやりますんで、よろしくお願いします。

#!/usr/local/bin/ruby

$maxData = 51200
$post_flag = 0

def decode
  buf = ""
  if ENV['REQUEST_METHOD'] == "POST"
    $post_flag = 1
      if ENV['CONTENT_LENGTH'].to_i > $maxData
        error("投稿量が大きすぎます")
      end
      buf = gets
#      read(STDIN, buf, ENV['CONTENT_LENGTH']) 元はこれ。。。上だけでOKなの??
  else
    $post_flag = 0
    buf = ENV['QUERY_STRING']
  end

  buf.split(/&/).each {|l|
    (key,val) = l.split(/=/)
    val = "" unless val

    key = key.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
      [$1.delete('%')].pack('H*')
    end
    val = val.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
      [$1.delete('%')].pack('H*')
    end.gsub(/&/, '&amp;').gsub(/"/, '&quot;').gsub(/>/, '&gt;').gsub(/</, '&lt;'
    ).gsub(/\r\n/,'<br>').gsub(/\r/,'<br>').gsub(/\n/,'<br>')

		# S-JISコード変換
#		&jcode::convert(\$val, "sjis", "", "z"); これって必要??

    if $in[key]
      $in[key] = $in[key] + "\0" + $in[key]
    else
      $in[key] = val
    end
  }
end

def error
end

$in = Hash.new
decode

print <<END_HTML
Content-Type: text/html

<HTML>
<HEAD><TITLE>BBS test</TITLE></HEAD>
<BODY>
<H1>BBS test</H1>
<form method="POST">
名前:<input name="name" size="20"><br>
本文:<textarea name="comment" cols="40" rows="4"></textarea>
<input type="submit" value="送信">
</form>
<hr>
<P>名前= #{$in['name']}</P>
<P>本文= #{$in['comment']}</P>
</BODY>
</HTML>
END_HTML

編集中

LAMY

  • 2000 4色BP
  • 4pen(3+1)
  • tripen(2+1)
  • twinpen(1+1)
  • ステュディオツイン(1+1)
  • スピリット(1)

ROTRING

  • エグゼクティブ(3+1)
  • エクステンション(3+1)
  • フォーインワン(3+1)
  • トリオペン(2+1)
  • ニュートン(2+1)
  • エスプリムーブ(1)

STAEDTLER

Pelikan

  • マルチペン(2)
  • スーベレーン K300(1)

Waldmann

  • エポック1958(2)
  • クリスタ(1)

PARKER

  • インシグニア マルチファンクション(2+1)
  • ベクター3in1
  • エスプリ(2,1)

CROSS

  • テックスリー(2+1)
  • クロスドライバー(1)
  • オートクロスペン(1)


トンボ

  • ZOOM414(2+1)
  • XPA(1)

909 :_ねん_くみ なまえ_____:2007/11/03(土) 00:26:56 ID:???
  >>906
  >>907
  今更感があるけれども、試しに手前のノギスで径を測ったら

  LAMY M21(LAMY2000初期装填.) 頭2.30mm 尻2.30mm
  JSB-0.5(ゼブラのジェル )     頭2.25mm 尻2.35mm

  なるほど工夫しないとカタカタのスルスルスル〜♪になるわけだ。
  JIS規格について、ココに
  http://www.moji.gr.jp/bib/jis.html#hikkigu
  ゲルインキボールペン及びレフィル、というのがあるけど有料情報らしい('A`)


951 :_ねん_くみ なまえ_____:2007/11/04(日) 18:15:27 ID:???
  ノギス買って手持ちの4C互換芯を測ってみた。
  >>910 の表はあてにならないわけじゃないけど、ちょっと違うところも。

  >>909のいうようにLAMY M21とゼブラは頭と尻のサイズが違う。
  LAMYの手元のは>>909とサイズが違ってた。

  ゼブラ ジェル  頭2.25mm 尻2.35mm
  ゼブラ 油性  頭2.20mm 尻2.35mm
  LAMY M21   頭2.40mm 尻2.30mm

  LAMYのはトンボのP-FITなんかだと頭がつかえる。
  あと、トンボ・ロットリングはともに頭も尻も2.30mm

  他者のリフィルが使える使えないはメーカー云々より、ペンごとの個体差が大きそう。
  たとえば上記のP-FITはゼブラ芯がキツキツだけれど、zoom707はゼブラジェルが余裕あり。



2 :_ねん_くみ なまえ_____:2007/11/06(火) 22:12:33 ID:???
  ■主なメーカーサイト
  ゼブラ   http://www.zebra.co.jp/pro/listball_tashokutakinou.html
  パイロット http://www.pilot.co.jp/products/pen/multi_func/index.html
  トンボ   http://www.tombow.com/pen/
  ぺんてる http://www.pentel.co.jp/
  三菱鉛筆 http://www.mpuni.co.jp/product/category/ball_pen/index.html
  プラチナ  http://platinum-pen.co.jp/products/multi/multi1.html
  セーラー  http://www.sailor.co.jp/BUNGU/lineup_04.html
  オート   http://www.ohto.co.jp/html/products_list.html
  無印良品 http://www.muji.net/store/cmdty/section/S01306
  Lamy    http://www.lamy.jp/

3 :_ねん_くみ なまえ_____:2007/11/06(火) 22:13:56 ID:???
  ■参考
  ・4C(D型)リフィルの規格サイズ、各社一覧など
  http://www.sideriver.com/stationery/special/bung_clm070219bp.html
  http://www.rakuten.co.jp/buneido/450956/812041/

  ・ゼブラ4Cについて
  やや太めなので一度挿すとLAMY2000 4色ボールペンなどはリフィル受けが広がってしまう
  →他リフィルを使おうとすると固定力が弱くなる ※ペンチで軽く潰せば修正可能
  また、シャーボX用のゲル4Cは筆記距離がかなり短いので注意
  http://zebra.zebra.co.jp/other1.html

  ・シャープペンシル(MP)の芯が折れやすい
  構造上しかたない面がある、0.7mmなら少しはマシかと。
  MPユニットは各社間での互換性不明なので聞く前に自分で試せ。


7 :_ねん_くみ なまえ_____:2007/11/07(水) 00:06:26 ID:???
  前スレよりコピペ

  4C規格の各社のリフィル一覧
  【国産4C】
  Zebra 4C 0.4黒 0.5黒 0.7黒青赤緑
  Zebra 4C-N 0.7 エバーグリーン、セピア、ボルドー、ブルーブラック
  Zebra ジェル JSB-0.5 黒、青、赤、緑、
             エバーグリーン、セピア、ボルドー、ブルーブラック
  Zebra ジェル JSB-0.7 蛍光マゼンダ
  Pilot BRF-8 0.5黒 0.7黒青赤緑 1.0黒
  Pilot LHRF-20 ゲル0.3黒青赤・ゲル0.4黒青赤
  Pentel KFS 0.5黒 0.7黒青赤
  Mitsubishi SE 0.38黒赤 0.5黒 0.7黒青赤
  Ohto R-4C 0.5黒・0.7黒赤ピンク
  Tombow BR-VS 0.7黒赤
  Tombow BR-VMP 加圧1.0黒
  Platinum BSP-100S 0.7黒青赤
  Sailor 18-0103 0.7黒青赤
  Shachihata TK-RF 0.7黒赤


8 :_ねん_くみ なまえ_____:2007/11/07(水) 00:07:13 ID:???
  コピペ2

  舶来4C−1
  Aurora ミニ・オプティマ用黒M・青M
  Caran DA'che エクリドールXS用 黒M・青M
  Cross マイクロペン/テック3用 黒F・赤F
  Conway Stewert ミニ 黒M・青M
  Delta ドルチェヴィータミニ用 黒M
  Fabar-Castell トゥワイス/ポケットペン用 黒M・青M
  Givency マルチカラー 黒M・青M
  Lamy LM21/LM55/LM70 黒M・青M・赤M・緑M・蛍光オレンジ・スタイラス
  Larex ミニ 黒M・青M

9 :_ねん_くみ なまえ_____:2007/11/07(水) 00:08:47 ID:???
  コピペ3

  舶来4C-2
  Montblanc 116用黒M
  Montegrappa ミニ黒M・青M
  Monteverde ディーバ用 黒M
  Pelikan 38M 黒M・赤M
  Parker インシグニアマルチ/ベクター3in1用 黒F/M・赤F/M
  Staedtler アバンギャルド用 黒M・赤M・蛍光オレンジ・スタイラス
  S.T.Dupont ミニ・オランピオ/レディ用 黒F・赤F
  Rotring ショートタイプメタル芯 黒F/M・赤F/M・青F/M・蛍光オレンジ・スタイラス
  Recife シャキン用 黒M
  Waterman ミニ 黒M
  Waldman エポック/クリスタ用 黒M・青M・赤M・スタイラス
  Visconti スリム黒M・青M


12 :_ねん_くみ なまえ_____:2007/11/07(水) 00:58:26 ID:???
>>1-3、>>7-10乙です。
>>7
一つ修正事項を。Ohto R-4C 0.5黒は今は廃盤になってます。

LAMY ラミー tripen トライペン

[rakuten:drawers:10006108:detail]









ストレート。シンプル。ヘアライン。ステンレス。
はっきり言えることは、それだけ。
古臭いんだか、高級感があるんだか、よく分からない。
とにかくヘアライン加工のステンレスが美しくて存在感がある。
2000のペン先の美しさが全身を包んでて、それだけで幸せ。
重心高めですが、重心高いペンの中では使い難いほどでは無い部類。
それより、中間部のプラスチックのオレンジ、黒、灰色の部品が安っぽい。
気にしなければ、気にならないかもですが。
マットステンレスだと目立つので、その点ブラックの方がいいかもしれません。
で、ステンレスのツインペンを買う。
と、気になる点ではあるのですが、見た目で色を選べるのは機能的にはとても使いやすく、
シャーボやZOOM414のように色を探してくるくる回す事はない。
それから、リフィルを受ける部品がプラスチックなので、
ゼブラもいけるのかな?

[rakuten:drawers:10006107:detail]