2013-05-20
■[Ruby][Rails]第32回Rails勉強会@東北のお知らせ

参加したい方は、このfacebookページの中にある
イベントで参加表明をお願いします。
https://www.facebook.com/events/539554369416094/
何やるかは未定です。
個人的には、Authority あたりをやりたいです。
Rails勉強会@東北とは!
好き勝手に勉強したいこと、
取り上げたいネタを調べたり披露したりしています。
2007年から開催してしており、
途中おやすみしている期間もありましたが、
最も古い勉強会だと思います。
勉強会の雰囲気はこんな感じです。
講師がいて、講義してくれる型式ではやっていません。
講習会とかではなく、ほんとに勉強会です。
好き勝手にやっているので、
メンバーは大分固定化してあまり流動的ではありません。
おそらく、初心者向けのセッションとかなくて、
かなりギークだからだと思います。
全く悪いこととは思っておらず、
好きな人がたまに新しく入ってくれればいいや程度にしか
思っておらず、たとえ2人でも最新のRuby情報や
Rails技術を披露しあっていると予測しております。
さて、数ヶ月に一度開催する飲み会になると、
仕事のはなしをしながら飲んでます。
積極的に募集しているわけではありませんが、
俺はそうなりたい!っていう人がいたら
食らいつくのも人生の肥やしになるかもしれません。
(でも、ならないかもしれません。)
2013-05-05
■[Ruby] CGIで128MBよりもデカイファイルをアップロードするには(定数の変更)

gmailで困ったというメールが来たのでチケット化してみました。
https://bugs.ruby-lang.org/issues/8370
cgi.rbでは、一度にアップロードできるファイルサイズの上限を
定数で決めています。
CGI::MAX_MULTIPART_LENGTH = 128 * 1024 * 1024
件のメールでは、どうも、定数で上限が
決まっているから困ったと言っているようです。
しかし、Rubyは恐ろしいことに、定数は上書きラクショーです。
そのつもりで定数化しているのでした。
require 'cgi' CGI.class_eval{remove_const(:MAX_MULTIPART_LENGTH)} CGI::MAX_MULTIPART_LENGTH = 512 * 1024 * 1024
いきなり代入すると、warningが出て、気分が悪いので、
一旦remove_constしてから代入するとよろしいです。
Rubyってすごいですよね。
通常は定数で定義されていたら諦めるんだと思います。
なんでチケット化したかというと、仕様に取り込むかどうかを
決めたかったからですね。
2013-05-03
■[Ruby] lib/cgi/util.rb の中身丸ごとmoduleになった

Stringに生やすのは反対が多かったため、
関数として使えることになりました。
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=40571&view=revision
require 'cgi/util' include CGI::Util
すると、
puts escapeHTML("<>&") <>&
となります。
puts h("<>&")
もできるようになりました。
cgi.rbはスモールユースのためにもっと
よくして行きたいと思ったので、
地味にやっていきます。
2013-05-02
■[Ruby] Stringに生やすのがやめたほうがいい感じなので、エスケープ関数定義にするか

erb大好きな皆さんが使っていると思われるh関数、
実体はCGI::escapeHTMLになっています。
erbでは、include ERB::Util すると、
h関数が使えるようになります。
cgiでも同じように使えたほうがいいと思いまして、
実装してみました。
インデントを付け直していないのですが、
テストは通ります。
--- a/lib/cgi/util.rb +++ b/lib/cgi/util.rb @@ -1,9 +1,10 @@ class CGI + module Util @@accept_charset="UTF-8" unless defined?(@@accept_charset) # URL-encode a string. # url_encoded_string = CGI::escape("'Stop!' said Fred") # # => "%27Stop%21%27+said+Fred" - def CGI::escape(string) + def escape(string) encoding = string.encoding string.dup.force_encoding('ASCII-8BIT').gsub(/([^ a-zA-Z0-9_.-]+)/) do '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase @@ -13,7 +14,7 @@ class CGI # URL-decode a string with encoding(optional). # string = CGI::unescape("%27Stop%21%27+said+Fred") # # => "'Stop!' said Fred" - def CGI::unescape(string,encoding=@@accept_charset) + def unescape(string,encoding=@@accept_charset) str=string.tr('+', ' ').force_encoding(Encoding::ASCII_8BIT).gsub(/((?:%[0-9a-fA-F]{2})+)/) do [$1.delete('%')].pack('H*') end.force_encoding(encoding) @@ -32,14 +33,14 @@ class CGI # Escape special characters in HTML, namely &\"<> # CGI::escapeHTML('Usage: foo "bar" <baz>') # # => "Usage: foo "bar" <baz>" - def CGI::escapeHTML(string) + def escapeHTML(string) string.gsub(/['&\"<>]/, TABLE_FOR_ESCAPE_HTML__) end # Unescape a string that has been HTML-escaped # CGI::unescapeHTML("Usage: foo "bar" <baz>") # # => "Usage: foo \"bar\" <baz>" - def CGI::unescapeHTML(string) + def unescapeHTML(string) enc = string.encoding if [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE].include?(enc) return string.gsub(Regexp.new('&(apos|amp|quot|gt|lt|#[0-9]+|#x[0-9A-Fa-f]+);'.encode(enc))) do @@ -88,12 +89,12 @@ class CGI end # Synonym for CGI::escapeHTML(str) - def CGI::escape_html(str) + def escape_html(str) escapeHTML(str) end # Synonym for CGI::unescapeHTML(str) - def CGI::unescape_html(str) + def unescape_html(str) unescapeHTML(str) end @@ -110,7 +111,7 @@ class CGI # # print CGI::escapeElement('<BR><A HREF="url"></A>', ["A", "IMG"]) # # "<BR><A HREF="url"></A>" - def CGI::escapeElement(string, *elements) + def escapeElement(string, *elements) elements = elements[0] if elements[0].kind_of?(Array) unless elements.empty? string.gsub(/<\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?>/i) do @@ -130,11 +131,11 @@ class CGI # print CGI::unescapeElement( # CGI::escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"]) # # "<BR><A HREF="url"></A>" - def CGI::unescapeElement(string, *elements) + def unescapeElement(string, *elements) elements = elements[0] if elements[0].kind_of?(Array) unless elements.empty? string.gsub(/<\/?(?:#{elements.join("|")})(?!\w)(?:.|\n)*?>/i) do - CGI::unescapeHTML($&) + unescapeHTML($&) end else string @@ -142,12 +143,12 @@ class CGI end # Synonym for CGI::escapeElement(str) - def CGI::escape_element(str) + def escape_element(str) escapeElement(str) end # Synonym for CGI::unescapeElement(str) - def CGI::unescape_element(str) + def unescape_element(str) unescapeElement(str) end @@ -161,7 +162,7 @@ class CGI # # CGI::rfc1123_date(Time.now) # # Sat, 01 Jan 2000 00:00:00 GMT - def CGI::rfc1123_date(time) + def rfc1123_date(time) t = time.clone.gmtime return format("%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT", RFC822_DAYS[t.wday], t.day, RFC822_MONTHS[t.month-1], t.year, @@ -185,7 +186,7 @@ class CGI # # </BODY> # # </HTML> # - def CGI::pretty(string, shift = " ") + def pretty(string, shift = " ") lines = string.gsub(/(?!\A)<.*?>/m, "\n\\0").gsub(/<.*?>(?!\n)/m, "\\0\n") end_pos = 0 while end_pos = lines.index(/^<\/(\w+)/, end_pos) @@ -195,4 +196,7 @@ class CGI end lines.gsub(/^((?:#{Regexp::quote(shift)})*)__(?=<\/?\w)/, '\1') end + + alias h escapeHTML + end + extend Util end
これだと、
% ruby -rcgi/util -e "include CGI::Util;puts unescape('%E7%99%BD%E3%81%A0%E3%81%97')" 白だし % ruby -rcgi/util -e "include CGI::Util;puts h('<>&')" <>&
とまあ、関数のように使えます。
私はcgiアプリを使うときはerbを使っていないので、
エスケープの短縮メソッドが欲しいと思っていたのでした。
hだけ使えればいいだろっていう意見も聞こえてきそうではあるが。
2013-05-01
■[Ruby] (続)String#{escape_html, unescape_html, escape_uri, unescape_uri} をつけたい

反応だったのでちょっと修正してみました。
--- a/lib/cgi/util.rb +++ b/lib/cgi/util.rb @@ -195,4 +195,29 @@ class CGI end lines.gsub(/^((?:#{Regexp::quote(shift)})*)__(?=<\/?\w)/, '\1') end + + class ::String + def escapeHTML + CGI::escapeHTML(self) + end + + def unescapeHTML + CGI::unescapeHTML(self) + end + + alias escape_html escapeHTML + alias unescape_html unescapeHTML + + def escape_uri + CGI::escape(self) + end + + def unescape_uri(charset=nil) + charset ? CGI::unescape(self, charset) : CGI::unescape(self) + end + + alias escape_url escape_uri + alias unescape_url unescape_uri + + end end
実行結果がこんな感じ。
% ruby -rcgi/util -e "puts '%E7%99%BD%E3%81%A0%E3%81%97'.unescape_uri" 白だし
Cで実装しろという話もありましたが、
そんなのすぐには完成しないので、また今度。












