■
今日はクッキーとクリプトとリンク部分
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(/&/, '&').gsub(/"/, '"').gsub(/>/, '>').gsub(/</, '<' ).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
Pelikan
- マルチペン(2)
- スーベレーン K300(1)
Waldmann
- エポック1958(2)
- クリスタ(1)
PARKER
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のように色を探してくるくる回す事はない。
それから、リフィルを受ける部品がプラスチックなので、
ゼブラもいけるのかな?