<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: web code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Tue, 20 May 2008 16:35:40 GMT</pubDate>
    <description>DZone Snippets: web code</description>
    <item>
      <title>One-line web server in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/5424</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# From: http://www.ntecs.de/blog/articles/2008/02/09/the-worlds-smallest-webserver&lt;br /&gt;# Author: Michael Neumann&lt;br /&gt;# ... point your browser to http://localhost:3125/etc/motd&lt;br /&gt;&lt;br /&gt;ruby -rsocket -e 's=TCPServer.new(5**5);loop{_=s.accept;_&lt;&lt;"HTTP/1.0 200 OK\r\n\r\n#{File.read(_.gets.split[1])rescue nil}";_.close}'&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 23 Apr 2008 13:22:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5424</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Run TCPServer as a simple Web server</title>
      <link>http://snippets.dzone.com/posts/show/5345</link>
      <description>A TCPServer accepts incoming TCP connections. Here is a Web server that listens on a given port and returns the time.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'socket'&lt;br /&gt;port = (ARGV[0] || 80).to_i&lt;br /&gt;server = TCPServer.new('localhost', port)&lt;br /&gt;while (session = server.accept)&lt;br /&gt;  puts "Request: #{session.gets}"&lt;br /&gt;  session.print "HTTP/1.1 200/OK\r\nContent-type: text/html\r\n\r\n"&lt;br /&gt;  session.print "&lt;html&gt;&lt;body&gt;&lt;h1&gt;#{Time.now}&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;\r\n"&lt;br /&gt;  session.close&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;This code was copied from &lt;a href="http://www.rubycentral.com/pickaxe/lib_network.html"&gt;Programming Ruby: The Pragmatic Programmer's Guide&lt;/a&gt; [rubycentral.com] while looking for information on Ruby CGI global variables.</description>
      <pubDate>Thu, 10 Apr 2008 14:05:56 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5345</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Upload a file using Ruby</title>
      <link>http://snippets.dzone.com/posts/show/5165</link>
      <description>The following code was used to upload an image file to the web server. Source code origin: &lt;a href="http://www.zytrax.com/tech/lang/ruby/#upload"&gt;Ruby Language Stuff | mod_ruby File upload scripts&lt;/a&gt; [zytrax.com]&lt;br /&gt;&lt;br /&gt;file: file_upload.cgi&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;# ruby script fragment&lt;br /&gt;require 'cgi'&lt;br /&gt;require 'stringio'&lt;br /&gt;&lt;br /&gt;cgi = CGI.new()  # New CGI object&lt;br /&gt;puts "Content-Type: text/plain"&lt;br /&gt;puts&lt;br /&gt;print '&lt;result&gt;'&lt;br /&gt;&lt;br /&gt;# get uri of tx'd file (in tmp normally)&lt;br /&gt;tmpfile = cgi.params['myfile'].first.path&lt;br /&gt;&lt;br /&gt;# OR (functionally the same)&lt;br /&gt;tmpfile = cgi.params['myfile'][0].path&lt;br /&gt;&lt;br /&gt;# create a Tempfile reference&lt;br /&gt;fromfile = cgi.params['myfile'].first&lt;br /&gt;&lt;br /&gt;#displays the original file name as supplied in the form&lt;br /&gt;puts fromfile.original_filename&lt;br /&gt;&lt;br /&gt;# displays the content (mime) type e.g. text/html&lt;br /&gt;puts fromfile.content_type&lt;br /&gt;&lt;br /&gt;# create output file reference as original filename in our chosen directory&lt;br /&gt;tofile = '/var/www/yourdomain.com/htdocs/r/'+fromfile.original_filename&lt;br /&gt;&lt;br /&gt;# copy the file&lt;br /&gt;# note the untaint prevents a security error&lt;br /&gt;# cgi sets up an StringIO object if file &lt; 10240&lt;br /&gt;# or a Tempfile object following works for both&lt;br /&gt;File.open(tofile.untaint, 'w') { |file| file &lt;&lt; fromfile.read}&lt;br /&gt;# when the page finishes the Tempfile/StringIO!) thing is deleted automatically&lt;br /&gt;&lt;br /&gt;print '&lt;/result&gt;'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;file: file_upload.html&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;&lt;br /&gt;  &lt;head&gt;&lt;br /&gt;    &lt;title&gt;File upload&lt;/title&gt;&lt;br /&gt;    &lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"/&gt;&lt;br /&gt;  &lt;/head&gt;&lt;br /&gt;  &lt;body&gt;&lt;br /&gt;    &lt;form name='fileupload' enctype="multipart/form-data" &lt;br /&gt;    action='/p/file_upload.cgi' method='post'&gt;&lt;br /&gt;    &lt;input type='file' name='myfile' size="40" /&gt;&lt;br /&gt;    &lt;input type='submit' value"Send it"/&gt;&lt;br /&gt;    &lt;/form&gt;&lt;br /&gt;  &lt;/body&gt;&lt;br /&gt;&lt;/html&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 23 Feb 2008 13:26:00 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5165</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>Getting Started With WWW::Mechanize</title>
      <link>http://snippets.dzone.com/posts/show/5134</link>
      <description>This Ruby code uses WWW:mechanize to act like a web browser.  &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; require 'rubygems'&lt;br /&gt; require 'mechanize'&lt;br /&gt;&lt;br /&gt; agent = WWW::Mechanize.new&lt;br /&gt; page = agent.get('http://google.com/')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Refer to the documentation at http://mechanize.rubyforge.org/mechanize/. Then gem install mechanize, and try running the code in an irb session.&lt;br /&gt;&lt;br /&gt;output (extract):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;=&gt; #&lt;WWW::Mechanize::Page&lt;br /&gt; {url #&lt;URI::HTTP:0xfdbbbb286 URL:http://www.google.com/&gt;}&lt;br /&gt; {meta}&lt;br /&gt; {title "Google"}&lt;br /&gt; {iframes}&lt;br /&gt; {frames}&lt;br /&gt; {links&lt;br /&gt;  #&lt;WWW::Mechanize::Page::Link&lt;br /&gt;   "Images"&lt;br /&gt;   "http://images.google.com/imghp?hl=en&amp;tab=wi"&gt;&lt;br /&gt;  #&lt;WWW::Mechanize::Page::Link&lt;br /&gt;   "Maps"&lt;br /&gt;   "http://maps.google.com/maps?hl=en&amp;tab=wl"&gt;&lt;br /&gt;  #&lt;WWW::Mechanize::Page::Link&lt;br /&gt;   "News"&lt;br /&gt;   "http://news.google.com/nwshp?hl=en&amp;tab=wn"&gt;&lt;br /&gt;  #&lt;WWW::Mechanize::Page::Link&lt;br /&gt;   "Shopping"&lt;br /&gt;   "http://www.google.com/prdhp?hl=en&amp;tab=wf"&gt;&lt;br /&gt;  #&lt;WWW::Mechanize::Page::Link&lt;br /&gt;   "Gmail"&lt;br /&gt;   "http://mail.google.com/mail/?hl=en&amp;tab=wm"&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 12 Feb 2008 17:53:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5134</guid>
      <author>jrobertson (James Robertson)</author>
    </item>
    <item>
      <title>bScan - Simple Web Aplications Scanner</title>
      <link>http://snippets.dzone.com/posts/show/5094</link>
      <description>// Web application scanner (ex: phpBB, myCMS, myBlog, mySite etc..) - Only in PHP !&lt;br /&gt;// Find XSS, sql injection, remote file inclusion&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#####################################################################################&lt;br /&gt;#	Black_H  / Nooz -- 30:01:07 &lt;br /&gt;#	Bl4ck.H&lt;&gt;gmail&lt;&gt;com&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;class BScan&lt;br /&gt;&lt;br /&gt;#####################################################################################&lt;br /&gt;#	Regex&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;@@space    = '([[:space:]]*)'&lt;br /&gt;&lt;br /&gt;@@userdat  = '('&lt;br /&gt;@@userdat += '(\$_SERVER\[([\'\"]*)HTTP_)|'&lt;br /&gt;@@userdat += '(\$_GET)|'&lt;br /&gt;@@userdat += '(\$_POST)|'&lt;br /&gt;@@userdat += '(\$_COOKIE)|'&lt;br /&gt;@@userdat += '(\$_REQUEST)|'&lt;br /&gt;@@userdat += '(\$_FILES)|'&lt;br /&gt;@@userdat += '(\$_ENV)|'&lt;br /&gt;@@userdat += '(\$_HTTP_COOKIE_VARS)|'&lt;br /&gt;@@userdat += '(\$_HTTP_ENV_VARS)|'&lt;br /&gt;@@userdat += '(\$_HTTP_GET_VARS)|'&lt;br /&gt;@@userdat += '(\$_HTTP_POST_FILES)|'&lt;br /&gt;@@userdat += '(\$_HTTP_POST_VARS)|'&lt;br /&gt;@@userdat += '(\$_HTTP_SERVER_VARS\[([\'\"]*)HTTP_)'&lt;br /&gt;@@userdat += ')'&lt;br /&gt;&lt;br /&gt;@@regex = Hash.new&lt;br /&gt;@@regex = &lt;br /&gt;	{'TYPE' =&gt; 'vars overwrite','LEVEL' =&gt; '2','REGEX' =&gt; /extract#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'vars overwrite','LEVEL' =&gt; '2','REGEX' =&gt; /import_request_variables#{@@space}\((.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'fopen vuln','LEVEL' =&gt; '3','REGEX' =&gt; /fopen#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'copy vuln','LEVEL' =&gt; '3','REGEX' =&gt; /copy#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'fwrite vuln','LEVEL' =&gt; '3','REGEX' =&gt; /fwrite#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'sql injection','LEVEL' =&gt; '2','REGEX' =&gt; /(mysql_query|mssql_query|mysqli_query)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'crlf injection','LEVEL' =&gt; '1','REGEX' =&gt; /mail#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'cross site scripting','LEVEL' =&gt; '1','REGEX' =&gt; /\&lt;\?\=#{@@space}(.*)#{@@userdat}/i},&lt;br /&gt;	{'TYPE' =&gt; 'cross site scripting','LEVEL' =&gt; '1','REGEX' =&gt; /(print|echo|print_r|var_dump)#{@@space}(|\(|\")(.*)#{@@userdat}/i},&lt;br /&gt;	{'TYPE' =&gt; 'php code execution','LEVEL' =&gt; '3','REGEX' =&gt; /eval#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'php code execution','LEVEL' =&gt; '3','REGEX' =&gt; /file_put_contents#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'variable attribution', 'LEVEL' =&gt; '2','REGEX' =&gt; /(.*)\$#{@@userdat}(.*)/i},&lt;br /&gt;	{'TYPE' =&gt; 'chmod affectation','LEVEL' =&gt; '1','REGEX' =&gt; /chmod#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'file disclosure','LEVEL' =&gt; '2','REGEX' =&gt; /(readfile|file_get_contents|file)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'file disclosure','LEVEL' =&gt; '2','REGEX' =&gt; /(show_source|highlight_file)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'bzopen vuln','LEVEL' =&gt; '2','REGEX' =&gt; /bzopen#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'file deletion','LEVEL' =&gt; '2','REGEX' =&gt; /(rmdir|unlink|delete)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'command execution','LEVEL' =&gt; '3','REGEX' =&gt; /(exec|system|passthru|shell_exec|proc_open|pcntl_exec)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'buffer overflow','LEVEL' =&gt; '3','REGEX' =&gt; /(confirm_phpdoc_compiled|mssql_pconnect|mssql_connect|crack_opendict|snmpget|ibase_connect)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'ip falsification','LEVEL' =&gt; '1','REGEX' =&gt; /(.*)(HTTP_CLIENT_IP|HTTP_X_FORWARDED_FOR|HTTP_PC_REMOTE_ADDR)(.*)/i},&lt;br /&gt;	{'TYPE' =&gt; 'putenv vuln','LEVEL' =&gt; '2','REGEX' =&gt; /putenv#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'full path disclosure','LEVEL' =&gt; '1','REGEX' =&gt; /(htmlentities|htmlspecialchars)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'magic_quotes_gpc bypass','LEVEL' =&gt; '1','REGEX' =&gt; /(stripslashes|urldecode)#{@@space}\((.*)#{@@userdat}(.*)\)/i},&lt;br /&gt;	{'TYPE' =&gt; 'file inclusion','LEVEL' =&gt; '3','REGEX' =&gt; /(include|include_once|require|require_once)#{@@space}(|\(|\")(.*)#{@@userdat}/i}&lt;br /&gt;&lt;br /&gt;#####################################################################################&lt;br /&gt;#	Main&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;  def initialize()&lt;br /&gt;&lt;br /&gt;	################&lt;br /&gt;	#	Usage&lt;br /&gt;&lt;br /&gt;if (ARGV.length &lt; 4)&lt;br /&gt;puts  '&lt;br /&gt; ---------------------------------------------------------------------&lt;br /&gt;|             Credits: Black_H &lt;bl4ck.h@gmail.com&gt;                    |&lt;br /&gt;|                 URL: Lemon-Inside.sup.fr                            |&lt;br /&gt;|                Note: Premier code Ruby                              |&lt;br /&gt; ---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt; ---------------------------------------------------------------------&lt;br /&gt;|   Usage:  scan.rb -d &lt;Dossier&gt; -i &lt;Save.html&gt;                       |&lt;br /&gt;|   Ex:  scan.rb -d ./ -i output.html                                 |&lt;br /&gt; ---------------------------------------------------------------------		&lt;br /&gt; '&lt;br /&gt; end&lt;br /&gt; &lt;br /&gt;	################&lt;br /&gt;	#	Options &amp; Vars&lt;br /&gt;	&lt;br /&gt;	@@scan_alldir =  self.options('d')&lt;br /&gt;	@@out_file =  self.options('i')&lt;br /&gt;	&lt;br /&gt;	@@ban = [".", "..", "scan.rb", @@out_file.to_s]&lt;br /&gt;&lt;br /&gt;	@@scan_buffer = Array.new&lt;br /&gt;	&lt;br /&gt;	################&lt;br /&gt;	#	Options Error ?&lt;br /&gt;	&lt;br /&gt;	if (@@scan_alldir != false and @@scan_alldir.empty? == false)&lt;br /&gt;	self.dscan(@@scan_alldir)&lt;br /&gt;	self.output(@@scan_buffer)&lt;br /&gt;	@@scan_buffer = ''&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;#####################################################################################&lt;br /&gt;#	Dir Scan &lt;br /&gt;#&lt;br /&gt;  &lt;br /&gt;  def dscan(dir)&lt;br /&gt;      &lt;br /&gt;	d = Dir.open(dir.to_s)&lt;br /&gt;	d = d.sort - @@ban&lt;br /&gt;	&lt;br /&gt;      d.each { |fichier|&lt;br /&gt;&lt;br /&gt;      case File.ftype(dir+fichier)&lt;br /&gt;        when "directory"&lt;br /&gt;          self.dscan(dir + fichier + "/")&lt;br /&gt;        when "file"&lt;br /&gt;		  puts  'Scan =&gt; ' + dir + fichier &lt;br /&gt;          self.fscan(dir + fichier)&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;	  }&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;#####################################################################################&lt;br /&gt;#	File Scan &lt;br /&gt;#&lt;br /&gt;  &lt;br /&gt;  def fscan(file)&lt;br /&gt;&lt;br /&gt;	fichier = File.readlines(file)&lt;br /&gt;	i = 1&lt;br /&gt;&lt;br /&gt;	fichier.each { |line|&lt;br /&gt;						&lt;br /&gt;		@@regex.each  { |info|&lt;br /&gt;			&lt;br /&gt;			test = (line  =~ info['REGEX']) &lt;br /&gt;		&lt;br /&gt;				if (test) &lt;br /&gt;			&lt;br /&gt;				@@scan_buffer += ['FILE' =&gt; file, 'LINE' =&gt; i.to_s, 'MATCH' =&gt; line, 'LEVEL' =&gt; info['LEVEL'], 'TYPE' =&gt; info['TYPE']]&lt;br /&gt;				#	5 , 1 , 3 , 4 , 2&lt;br /&gt;				next @@scan_buffer&lt;br /&gt;				end&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	i += 1&lt;br /&gt;  	} &lt;br /&gt;	&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;#####################################################################################&lt;br /&gt;#	Output buffer&lt;br /&gt;#&lt;br /&gt;  &lt;br /&gt;  def output(buffer)&lt;br /&gt;  &lt;br /&gt;	@html_hmodel = '&lt;html&gt;'&lt;br /&gt;	@html_hmodel += '&lt;style type="text/css"&gt;'&lt;br /&gt;	@html_hmodel += '&lt;!--'&lt;br /&gt;	@html_hmodel += '.level0 {background-color: #CCCCCC;}'&lt;br /&gt;	@html_hmodel += '.level1 {background-color: #33FF66;}'&lt;br /&gt;	@html_hmodel += '.level2 {background-color: #FFFF33;}'&lt;br /&gt;	@html_hmodel += '.level3 {background-color: #FF0000;}'&lt;br /&gt;	@html_hmodel += '--&gt;&lt;/style&gt;&lt;body&gt;&lt;h1&gt;BScan v1.0&lt;/h1&gt;&lt;pre&gt;'&lt;br /&gt;&lt;br /&gt;	code = @html_hmodel&lt;br /&gt;	&lt;br /&gt;	buffer.each { |infos|&lt;br /&gt;	&lt;br /&gt;	keys = infos.keys&lt;br /&gt;	code += "&lt;span class='level" + infos["LEVEL"] + "'&gt;" + keys[1].to_s + ' : ' + infos["TYPE"] + '&lt;/span&gt;&lt;br /&gt;'&lt;br /&gt;	code += "&lt;span class='" + infos["LEVEL"] + "'&gt;" + keys[3].to_s + ' : ' + infos["LEVEL"] + '&lt;/span&gt;&lt;br /&gt;'&lt;br /&gt;	code += "&lt;span class='" + infos["LEVEL"] + "'&gt;" + keys[4].to_s + ' : ' + infos["FILE"] + '&lt;/span&gt;&lt;br /&gt;'&lt;br /&gt;	code += "&lt;span class='" + infos["LEVEL"] + "'&gt;" + keys[0].to_s + ' : ' + infos["LINE"] + '&lt;/span&gt;&lt;br /&gt;'&lt;br /&gt;	code += "&lt;span class='" + infos["LEVEL"] + "'&gt;" + keys[2].to_s + ' : ' + infos["MATCH"] + '&lt;/span&gt;&lt;br /&gt;'&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;		code += "&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;"&lt;br /&gt;		fhtml = File.open(@@out_file.to_s, "w")&lt;br /&gt;		fhtml.write code&lt;br /&gt;		code = ''&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;  end&lt;br /&gt;#####################################################################################&lt;br /&gt;#	Parse &amp; Get Options&lt;br /&gt;#&lt;br /&gt; &lt;br /&gt;  def options(param)&lt;br /&gt;  &lt;br /&gt;	i = 0&lt;br /&gt;		ARGV.each  { |valeur|&lt;br /&gt;		&lt;br /&gt;    		if (valeur == '-' + param.to_s)&lt;br /&gt;				return ARGV[i+1]&lt;br /&gt;			elseif (valeur != '-' + param.to_s)&lt;br /&gt;				return false&lt;br /&gt;			end&lt;br /&gt;		i += 1&lt;br /&gt;		}&lt;br /&gt;		&lt;br /&gt;	end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;scan = BScan.new&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 03 Feb 2008 11:51:05 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5094</guid>
      <author>Black_H (Black_H)</author>
    </item>
    <item>
      <title>Runt.rb</title>
      <link>http://snippets.dzone.com/posts/show/5009</link>
      <description>// A tiny Ruby web server.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;require "webrick"&lt;br /&gt;&lt;br /&gt;s=WEBrick::HTTPServer.new(&lt;br /&gt;        :BindAddress =&gt; "localhost",&lt;br /&gt;        :Port =&gt; 8080,&lt;br /&gt;        :DocumentRoot =&gt; File.dirname($0)+"/"+"www/"&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;trap("INT") { s.shutdown }&lt;br /&gt;&lt;br /&gt;s.start&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 19 Jan 2008 06:46:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5009</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>How to detect a browser iPhone ?</title>
      <link>http://snippets.dzone.com/posts/show/4826</link>
      <description>The browser is :&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;Mozilla/5.0 (iPhone; U; CPU like Mac OS X; fr) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ab-d.fr/"&gt;Source: ab-d.fr&lt;br /&gt;Internet with iPhone&lt;br /&gt;&lt;/a&gt;</description>
      <pubDate>Thu, 29 Nov 2007 10:34:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4826</guid>
      <author>ki4ngel (Benoit Asselin)</author>
    </item>
    <item>
      <title>I can't be bothered going downstairs to watch the daily show</title>
      <link>http://snippets.dzone.com/posts/show/4794</link>
      <description>scraper.rb - scrapes metadata from thedailyshow.com.&lt;br /&gt;Just run it - creates videos/index.yml&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'leecher'&lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'hpricot'&lt;br /&gt;&lt;br /&gt;class Scraper&lt;br /&gt;	SEARCH_PAGE="http://www.thedailyshow.com/tds_files/includes/search/search_results.jhtml"&lt;br /&gt;	def scrape_day(site, date, force=false)&lt;br /&gt;		return if site.skip.include?(date) and not force&lt;br /&gt;		url = sprintf("#{SEARCH_PAGE}?searchterm=%02d-%02d-%04d",date.month,date.day,date.year)&lt;br /&gt;		puts "Fetching #{url}" if $DEBUG&lt;br /&gt;&lt;br /&gt;		data = open(url) {|f| f.read }&lt;br /&gt;		h = Hpricot(data)&lt;br /&gt;&lt;br /&gt;		# can't use a real xpath - they all use an _id_ istead of a class&lt;br /&gt;		results = (h/"div").find_all {|x| x['id'] == "videoListItem_1" }&lt;br /&gt;		results.each {|result|&lt;br /&gt;			url = result.at("a[1]")['href']&lt;br /&gt;			vid = if url =~ /videoId=(\d+)/&lt;br /&gt;				$1.to_i&lt;br /&gt;			else&lt;br /&gt;				raise "Failed to parse link #{url}"&lt;br /&gt;			end&lt;br /&gt;&lt;br /&gt;			title = ((result/"a")[1]/"text()").to_s&lt;br /&gt;			date = Date.parse((result/"a[@onclick][1]/text()").to_s)&lt;br /&gt;&lt;br /&gt;			descr = result/"div.video_description"&lt;br /&gt;			description = (descr/"div[1]/text()").to_s&lt;br /&gt;			tags = (descr/".tags/a/text()").map {|x| unescape(x.to_s) }&lt;br /&gt;			&lt;br /&gt;			vid = Video.new(site, vid, date, unescape(title), unescape(description), tags)&lt;br /&gt;			puts vid&lt;br /&gt;		}&lt;br /&gt;	&lt;br /&gt;		results.length&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def unescape(t)&lt;br /&gt;		t.gsub(/&amp;([^;]{1,5});/) {|ent|&lt;br /&gt;			case $1&lt;br /&gt;				when /^#(\d+)$/&lt;br /&gt;					[$1.to_i].pack('C')&lt;br /&gt;				when /^#x([0-9a-zA-Z]+)$/&lt;br /&gt;					[$1].pack('H2')&lt;br /&gt;				when 'amp'&lt;br /&gt;					'&amp;'&lt;br /&gt;				when 'gt'&lt;br /&gt;					'&gt;'&lt;br /&gt;				when 'quot'&lt;br /&gt;					'"'&lt;br /&gt;				when 'apos'&lt;br /&gt;					"'"&lt;br /&gt;				when 'lt'&lt;br /&gt;					'&lt;'&lt;br /&gt;				else&lt;br /&gt;					$stderr.puts "Unknown entity #{$1.inspect}"&lt;br /&gt;					'?'&lt;br /&gt;			end&lt;br /&gt;		}&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt;	Site.load&lt;br /&gt;	tds = Site.sites.find {|s| s.short_name == "tds" }&lt;br /&gt;	tds ||= Site.new("The Daily Show","tds")&lt;br /&gt;&lt;br /&gt;	day = Date.today&lt;br /&gt;	start = Date.new(1999)&lt;br /&gt;&lt;br /&gt;	counter=0&lt;br /&gt;&lt;br /&gt;	s = Scraper.new&lt;br /&gt;	while day &gt;= start&lt;br /&gt;		results = s.scrape_day(tds, day)&lt;br /&gt;		puts "#{results} results for #{day}" if results # else skipped&lt;br /&gt;&lt;br /&gt;		# Mark days as done once we've scraped them a month after air&lt;br /&gt;		if (Date.today - day) &gt; 30 and not results.nil?&lt;br /&gt;			tds.skip!(day)&lt;br /&gt;		end&lt;br /&gt;&lt;br /&gt;		day -= 1&lt;br /&gt;		unless results.nil? or results.zero?&lt;br /&gt;			Site.save if (counter += 1)%10 == 0&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;	Site.save&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;leecher.rb - downloads/searches/plays videos&lt;br /&gt;./leecher.rb [download/list/play] [searchterm ... ]&lt;br /&gt;Search terms can be &lt;br /&gt;  date: 2007 or 2007-10 or 2007-10-01&lt;br /&gt;  tag: interview&lt;br /&gt;  id: 31723&lt;br /&gt;  already downloaded?: downloaded or !downloaded&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;MEDIA_PLAYER = %w{mplayer -fs}&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'rexml/document'&lt;br /&gt;require 'rexml/xpath'&lt;br /&gt;require 'fileutils'&lt;br /&gt;require 'yaml'&lt;br /&gt;require 'rio'&lt;br /&gt;require 'set'&lt;br /&gt;&lt;br /&gt;class Site&lt;br /&gt;	class &lt;&lt; self&lt;br /&gt;		attr_reader :base&lt;br /&gt;		attr_reader :alternates&lt;br /&gt;		attr_reader :sites&lt;br /&gt;		&lt;br /&gt;		def init&lt;br /&gt;			unless self.base or self.sites&lt;br /&gt;				@base = "./videos"&lt;br /&gt;				@alternates = []&lt;br /&gt;				@sites = []&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;&lt;br /&gt;		def load(stream=nil)&lt;br /&gt;			if stream&lt;br /&gt;				stuff = YAML::load(stream)&lt;br /&gt;				@base = stuff['base'] || "./videos"&lt;br /&gt;				@sites = stuff['sites'] || []&lt;br /&gt;				@alternates = stuff['alternates'] || []&lt;br /&gt;			else&lt;br /&gt;				init&lt;br /&gt;				begin&lt;br /&gt;					File.open(File.join(base,'index.yml')) {|f|&lt;br /&gt;						load(f)&lt;br /&gt;					}&lt;br /&gt;				rescue Errno::ENOENT&lt;br /&gt;					$stderr.puts "Warning, no database found, starting a new one"&lt;br /&gt;				end&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;		&lt;br /&gt;		def save(stream=nil)&lt;br /&gt;			if stream&lt;br /&gt;				YAML::dump({'base' =&gt; base, 'sites' =&gt; sites, 'alternates' =&gt; 'alternates'},stream)&lt;br /&gt;			else&lt;br /&gt;				File.open(File.join(base,'index.yml_'),'w') {|f|&lt;br /&gt;					save(f)&lt;br /&gt;				}&lt;br /&gt;				FileUtils.mv(File.join(base,'index.yml_'),File.join(base,'index.yml'))&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;&lt;br /&gt;		def each(&amp;block)&lt;br /&gt;			sites.each(&amp;block)&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def initialize(name, short_name=name)&lt;br /&gt;		Site.init&lt;br /&gt;		@videos = {}&lt;br /&gt;		@name, @short_name = name, short_name&lt;br /&gt;		@skip = Set.new&lt;br /&gt;		Site.sites &lt;&lt; self&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	attr_reader :videos&lt;br /&gt;	attr_reader :name&lt;br /&gt;	attr_reader :short_name&lt;br /&gt;	attr_reader :skip&lt;br /&gt;&lt;br /&gt;	def directory&lt;br /&gt;		File.join(Site.base, short_name)&lt;br /&gt;	end&lt;br /&gt;	def directory_alternates&lt;br /&gt;		Site.alternates.map {|d| File.join(d, short_name) }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def ensure_dir_exists!&lt;br /&gt;		FileUtils.mkpath(directory)&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def &lt;&lt;(vid)&lt;br /&gt;		self.videos[vid.id] = vid&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def skip!(date)&lt;br /&gt;		self.skip &lt;&lt; date&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def [](id)&lt;br /&gt;		self.videos[id]&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def to_s&lt;br /&gt;		name&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def each &lt;br /&gt;		self.videos.each {|k,v| yield v }	&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Video&lt;br /&gt;	attr_reader :tags&lt;br /&gt;	attr_reader :site&lt;br /&gt;	attr_reader :id&lt;br /&gt;	attr_reader :date&lt;br /&gt;	attr_reader :title&lt;br /&gt;	attr_reader :description&lt;br /&gt;&lt;br /&gt;	def initialize(site, id, date=nil, title = nil, description=nil, tags=[]) &lt;br /&gt; 		@site = site&lt;br /&gt;		@id = id&lt;br /&gt;		@title = title&lt;br /&gt;		@tags = tags&lt;br /&gt;		@date = date&lt;br /&gt;		@description = description&lt;br /&gt;&lt;br /&gt;		site &lt;&lt; self&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def filename&lt;br /&gt;		site.directory_alternates.map{|x| &lt;br /&gt;			File.join(x,"#{id}.flv")&lt;br /&gt;		}.find {|f| &lt;br /&gt;			File.exists?(f) &lt;br /&gt;		} || File.join(site.directory, "#{id}.flv")&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def downloaded?&lt;br /&gt;		File.exists?(filename)&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def download&lt;br /&gt;		download! unless downloaded?&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	SHARED_DATA = "http://www.comedycentral.com/sitewide/video_player/shared/data"&lt;br /&gt;	def download!&lt;br /&gt;		site.ensure_dir_exists!&lt;br /&gt;		url = download_url()&lt;br /&gt;		begin&lt;br /&gt;			rio(url) &gt; rio(filename)&lt;br /&gt;			File.size(filename)&lt;br /&gt;		rescue Exception =&gt; x&lt;br /&gt;			begin&lt;br /&gt;				File.delete(filename)&lt;br /&gt;			rescue Exception&lt;br /&gt;			end&lt;br /&gt;			raise x&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def to_s &lt;br /&gt;		sprintf("[%1s %7d - %s - %s - %20s]",(downloaded?? 'D' : ' '), id, date, site, title) &lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def download_url&lt;br /&gt;		manifest = open("#{SHARED_DATA}/flv_xml_gen.jhtml?ml_video=#{id}&amp;hiLoPref=hi") {|f| f.read }&lt;br /&gt;		doc = REXML::Document.new(manifest)&lt;br /&gt;		REXML::XPath.first(doc, "/package/video/item/src/text()").to_s&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Filter&lt;br /&gt;	class &lt;&lt; self&lt;br /&gt;		def method_missing(sym,*args,&amp;block)&lt;br /&gt;			if sym.to_s =~ /^by/&lt;br /&gt;				new.send(sym,*args,&amp;block)&lt;br /&gt;			else&lt;br /&gt;				super&lt;br /&gt;			end&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def initialize(parent=nil,&amp;block)&lt;br /&gt;		@parent = parent&lt;br /&gt;		@test = block&lt;br /&gt;	end&lt;br /&gt;	&lt;br /&gt;	def [](video)&lt;br /&gt;		case video&lt;br /&gt;			when Video&lt;br /&gt;				video if (@test.nil? or @test[video]) and (@parent.nil? or @parent[video])&lt;br /&gt;			when Site&lt;br /&gt;				if block_given?&lt;br /&gt;					video.each {|v| yield v if self[v] }&lt;br /&gt;				else&lt;br /&gt;					video.find_all {|v| self[v] }&lt;br /&gt;				end&lt;br /&gt;			else&lt;br /&gt;				raise ArgumentError&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def each(&amp;block)&lt;br /&gt;		Site.each {|show| self.send(:[], show, &amp;block) }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def filter(&amp;block)&lt;br /&gt;		Filter.new(self,&amp;block)&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_downloaded(dl=true)&lt;br /&gt;		filter {|v| v.downloaded? == !!dl }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_date(y, m=nil, d=nil)&lt;br /&gt;		if m.nil? and d.nil?&lt;br /&gt;			filter {|v| v.date and v.date.year == y }&lt;br /&gt;		elsif d.nil?&lt;br /&gt;			filter {|v| v.date and v.date.year == y and v.date.month == m }&lt;br /&gt;		else&lt;br /&gt;			filter {|v| v.date and v.date.year == y and v.date.month == m and v.date.day == d }&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_id(vid)&lt;br /&gt;		filter {|v| v.id == vid }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_tag(tag)&lt;br /&gt;		filter {|v| v.tags.include? tag }&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by_text(text) &lt;br /&gt;		filter {|v| &lt;br /&gt;			v.title &amp;&amp; v.title.downcase.include?(text.downcase) or &lt;br /&gt;			v.description &amp;&amp; v.description.downcase.include?(text.downcase) or&lt;br /&gt;			v.tags.include? text&lt;br /&gt;		}&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	def by(arg)&lt;br /&gt;		arg = arg.to_s&lt;br /&gt;		case arg&lt;br /&gt;			when 'downloaded'&lt;br /&gt;				by_downloaded(true)&lt;br /&gt;			when '!downloaded'&lt;br /&gt;				by_downloaded(false)&lt;br /&gt;			when /^(\d{4})$/&lt;br /&gt;				by_date($1.to_i)&lt;br /&gt;			when /^(\d{4})-(\d{1,2})$/&lt;br /&gt;				by_date($1.to_i, $2.to_i)&lt;br /&gt;			when /^(\d{4})-(\d{1,2})-(\d{1,2})$/&lt;br /&gt;				by_date($1.to_i, $2.to_i, $3.to_i)&lt;br /&gt;			when /^\d{5,}$/&lt;br /&gt;				by_id(arg.to_i)&lt;br /&gt;			else&lt;br /&gt;				by_text(arg)&lt;br /&gt;		end&lt;br /&gt;	end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;if __FILE__ == $0&lt;br /&gt;	command = ARGV.shift or raise "Usage: leecher &lt;download/list&gt; [filters...]"&lt;br /&gt;	action = case command.downcase&lt;br /&gt;		when 'download'&lt;br /&gt;			proc {|v| &lt;br /&gt;				puts "Fetching #{v}" unless v.downloaded?&lt;br /&gt;				begin&lt;br /&gt;					v.download&lt;br /&gt;				rescue OpenURI::HTTPError =&gt; x&lt;br /&gt;					$stderr.puts "Download failed, skipping: #{x}"&lt;br /&gt;				rescue Errno::ENOENT =&gt; xm&lt;br /&gt;					$stderr.puts "Download failed, skipping: #{x}"&lt;br /&gt;				end&lt;br /&gt;			}&lt;br /&gt;		when 'list'&lt;br /&gt;			proc {|v|&lt;br /&gt;				puts "#{v} #{v.tags.join(', ')}"&lt;br /&gt;			}&lt;br /&gt;		when 'play'&lt;br /&gt;			proc {|v|&lt;br /&gt;				puts v&lt;br /&gt;				system(*MEDIA_PLAYER, v.filename)&lt;br /&gt;			}&lt;br /&gt;		else&lt;br /&gt;			raise "Unknown command #{command}"&lt;br /&gt;	end&lt;br /&gt;&lt;br /&gt;	filter = ARGV.inject(Filter.new) {|f, arg| f.by(arg)}&lt;br /&gt;&lt;br /&gt;	Site.load&lt;br /&gt;	filter.each(&amp;action)&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <pubDate>Sun, 18 Nov 2007 06:44:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4794</guid>
      <author>tunah (Sam McCall)</author>
    </item>
    <item>
      <title>Punycoded URLs in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/4575</link>
      <description>This is just a proof-of-concept snippet for how to internationalize domain names using &lt;a href="http://raa.ruby-lang.org/project/punycode4r/"&gt;punycode4r&lt;/a&gt; (sudo gem install punycode4r).&lt;br /&gt;&lt;br /&gt;For more information please see:&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/Punycode"&gt;Punycode&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://en.wikipedia.org/wiki/Internationalizing_Domain_Names_in_Applications"&gt;Internationalized domain name&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;#!/usr/local/bin/ruby -Ku&lt;br /&gt;&lt;br /&gt;# NOTE: The following is not the complete source code by Kazuhiro NISHIYAMA.&lt;br /&gt;#       For the full source code with more features, comments &amp; test cases please see: &lt;br /&gt;#       open -e `gem environment gemdir`/gems/punycode4r-0.2.0/lib/punycode.rb&lt;br /&gt;#&lt;br /&gt;# This is pure Ruby implementing Punycode (RFC 3492).&lt;br /&gt;# (original ANSI C code (C89) implementing Punycode is in RFC 3492)&lt;br /&gt;#&lt;br /&gt;# copyright (c) 2005 Kazuhiro NISHIYAMA&lt;br /&gt;# You can redistribute it and/or modify it under the same terms as Ruby.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;require "unicode"     # sudo gem install unicode&lt;br /&gt;&lt;br /&gt;module Punycode&lt;br /&gt;&lt;br /&gt;  module Status&lt;br /&gt;    class Error &lt; StandardError; end&lt;br /&gt;    class PunycodeSuccess; end&lt;br /&gt;    # Input is invalid.&lt;br /&gt;    class PunycodeBadInput &lt; Error; end&lt;br /&gt;    # Output would exceed the space provided.&lt;br /&gt;    class PunycodeBigOutput&lt; Error; end&lt;br /&gt;    # Input needs wider integers to process.&lt;br /&gt;    class PunycodeOverflow &lt; Error; end&lt;br /&gt;  end&lt;br /&gt;  include Status&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  BASE = 36; TMIN = 1; TMAX = 26; SKEW = 38; DAMP = 700&lt;br /&gt;  INITIAL_BIAS = 72; INITIAL_N = 0x80; DELIMITER = 0x2D&lt;br /&gt;&lt;br /&gt;  module_function&lt;br /&gt;&lt;br /&gt;  def basic(cp)&lt;br /&gt;    cp &lt; 0x80&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def delim(cp)&lt;br /&gt;    cp == DELIMITER&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def decode_digit(cp)&lt;br /&gt;    cp - 48 &lt; 10 ? cp - 22 :  cp - 65 &lt; 26 ? cp - 65 :&lt;br /&gt;      cp - 97 &lt; 26 ? cp - 97 : BASE&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def encode_digit(d, flag)&lt;br /&gt;    return d + 22 + 75 * ((d &lt; 26) ? 1 : 0) - ((flag ? 1 : 0) &lt;&lt; 5)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def flagged(bcp)&lt;br /&gt;    (0...26) === (bcp - 65)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def encode_basic(bcp, flag)&lt;br /&gt;    # bcp -= (bcp - 97 &lt; 26) &lt;&lt; 5;&lt;br /&gt;    if (0...26) === (bcp - 97)&lt;br /&gt;      bcp -= 1 &lt;&lt; 5&lt;br /&gt;    end&lt;br /&gt;    # return bcp + ((!flag &amp;&amp; (bcp - 65 &lt; 26)) &lt;&lt; 5);&lt;br /&gt;    if !flag and (0...26) === (bcp - 65)&lt;br /&gt;      bcp += 1 &lt;&lt; 5&lt;br /&gt;    end&lt;br /&gt;    bcp&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  MAXINT = 1 &lt;&lt; 64&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  def adapt(delta, numpoints, firsttime)&lt;br /&gt;    delta = firsttime ? delta / DAMP : delta &gt;&gt; 1&lt;br /&gt;    delta += delta / numpoints&lt;br /&gt;&lt;br /&gt;    k = 0&lt;br /&gt;    while delta &gt; ((BASE - TMIN) * TMAX) / 2&lt;br /&gt;      delta /= BASE - TMIN&lt;br /&gt;      k += BASE&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    k + (BASE - TMIN + 1) * delta / (delta + SKEW)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def punycode_encode(input_length, input, case_flags, output_length, output)&lt;br /&gt;&lt;br /&gt;    n = INITIAL_N&lt;br /&gt;    delta = out = 0&lt;br /&gt;    max_out = output_length[0]&lt;br /&gt;    bias = INITIAL_BIAS&lt;br /&gt;&lt;br /&gt;    input_length.times do |j|&lt;br /&gt;      if basic(input[j])&lt;br /&gt;        raise PunycodeBigOutput if max_out - out &lt; 2&lt;br /&gt;        output[out] =&lt;br /&gt;          if case_flags&lt;br /&gt;            encode_basic(input[j], case_flags[j])&lt;br /&gt;          else&lt;br /&gt;            input[j]&lt;br /&gt;          end&lt;br /&gt;        out+=1&lt;br /&gt;      # elsif (input[j] &lt; n)&lt;br /&gt;      #   raise PunycodeBadInput&lt;br /&gt;      # (not needed for Punycode with unsigned code points)&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    h = b = out&lt;br /&gt;&lt;br /&gt;    if b &gt; 0&lt;br /&gt;      output[out] = DELIMITER&lt;br /&gt;      out+=1&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;   while h &lt; input_length&lt;br /&gt;&lt;br /&gt;      m = MAXINT&lt;br /&gt;      input_length.times do |j|&lt;br /&gt;        # next if basic(input[j])&lt;br /&gt;        # (not needed for Punycode)&lt;br /&gt;        m = input[j] if (n...m) === input[j]&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      raise PunycodeOverflow if m - n &gt; (MAXINT - delta) / (h + 1)&lt;br /&gt;      delta += (m - n) * (h + 1)&lt;br /&gt;      n = m&lt;br /&gt;&lt;br /&gt;      input_length.times do |j|&lt;br /&gt;        # Punycode does not need to check whether input[j] is basic:&lt;br /&gt;        if input[j] &lt; n # || basic(input[j])&lt;br /&gt;          delta+=1&lt;br /&gt;          raise PunycodeOverflow if delta == 0&lt;br /&gt;        end&lt;br /&gt;&lt;br /&gt;        if input[j] == n&lt;br /&gt;&lt;br /&gt;          q = delta; k = BASE&lt;br /&gt;          while true&lt;br /&gt;            raise PunycodeBigOutput if out &gt;= max_out&lt;br /&gt;            t = if k &lt;= bias # + TMIN # +TMIN not needed&lt;br /&gt;                  TMIN&lt;br /&gt;                elsif k &gt;= bias + TMAX&lt;br /&gt;                  TMAX&lt;br /&gt;                else&lt;br /&gt;                  k - bias&lt;br /&gt;                end&lt;br /&gt;            break if q &lt; t&lt;br /&gt;            output[out] = encode_digit(t + (q - t) % (BASE - t), false)&lt;br /&gt;            out+=1&lt;br /&gt;            q = (q - t) / (BASE - t)&lt;br /&gt;            k += BASE&lt;br /&gt;          end&lt;br /&gt;&lt;br /&gt;          output[out] = encode_digit(q, case_flags &amp;&amp; case_flags[j])&lt;br /&gt;          out+=1&lt;br /&gt;          bias = adapt(delta, h + 1, h == b)&lt;br /&gt;          delta = 0&lt;br /&gt;          h+=1&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      delta+=1; n+=1&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    output_length[0] = out&lt;br /&gt;    return PunycodeSuccess&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def punycode_decode(input_length, input, output_length, output, case_flags)&lt;br /&gt;&lt;br /&gt;    n = INITIAL_N&lt;br /&gt;&lt;br /&gt;    out = i = 0&lt;br /&gt;    max_out = output_length[0]&lt;br /&gt;    bias = INITIAL_BIAS&lt;br /&gt;&lt;br /&gt;    b = 0&lt;br /&gt;    input_length.times do |j|&lt;br /&gt;      b = j if delim(input[j])&lt;br /&gt;    end&lt;br /&gt;    raise PunycodeBigOutput if b &gt; max_out&lt;br /&gt;&lt;br /&gt;    b.times do |j|&lt;br /&gt;      case_flags[out] = flagged(input[j]) if case_flags&lt;br /&gt;      raise PunycodeBadInput unless basic(input[j])&lt;br /&gt;      output[out] = input[j]&lt;br /&gt;      out+=1&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    in_ = b &gt; 0 ? b + 1 : 0&lt;br /&gt;    while in_ &lt; input_length&lt;br /&gt;&lt;br /&gt;      oldi = i; w = 1; k = BASE&lt;br /&gt;      while true&lt;br /&gt;        raise PunycodeBadInput if in_ &gt;= input_length&lt;br /&gt;        digit = decode_digit(input[in_])&lt;br /&gt;        in_+=1&lt;br /&gt;        raise PunycodeBadInput if digit &gt;= BASE&lt;br /&gt;        raise PunycodeOverflow if digit &gt; (MAXINT - i) / w&lt;br /&gt;        i += digit * w&lt;br /&gt;        t = if k &lt;= bias # + TMIN # +TMIN not needed&lt;br /&gt;              TMIN&lt;br /&gt;            elsif k &gt;= bias + TMAX&lt;br /&gt;              TMAX&lt;br /&gt;            else&lt;br /&gt;              k - bias&lt;br /&gt;            end&lt;br /&gt;        break if digit &lt; t&lt;br /&gt;        raise PunycodeOverflow if w &gt; MAXINT / (BASE - t)&lt;br /&gt;        w *= BASE - t&lt;br /&gt;        k += BASE&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      bias = adapt(i - oldi, out + 1, oldi == 0)&lt;br /&gt;&lt;br /&gt;      raise PunycodeOverflow if i / (out + 1) &gt; MAXINT - n&lt;br /&gt;      n += i / (out + 1)&lt;br /&gt;      i %= out + 1&lt;br /&gt;&lt;br /&gt;      # not needed for Punycode:&lt;br /&gt;      # raise PUNYCODE_INVALID_INPUT if decode_digit(n) &lt;= base&lt;br /&gt;      raise PunycodeBigOutput if out &gt;= max_out&lt;br /&gt;&lt;br /&gt;      if case_flags&lt;br /&gt;        #memmove(case_flags + i + 1, case_flags + i, out - i)&lt;br /&gt;        case_flags[i + 1, out - i] = case_flags[i, out - i]&lt;br /&gt;&lt;br /&gt;        # Case of last character determines uppercase flag:&lt;br /&gt;        case_flags[i] = flagged(input[in_ - 1])&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;      #memmove(output + i + 1, output + i, (out - i) * sizeof *output)&lt;br /&gt;      output[i + 1, out - i] = output[i, out - i]&lt;br /&gt;      output[i] = n&lt;br /&gt;      i+=1&lt;br /&gt;&lt;br /&gt;      out+=1&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    output_length[0] = out&lt;br /&gt;    return PunycodeSuccess&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def encode(unicode_string, case_flags=nil, print_ascii_only=false)&lt;br /&gt;    input = unicode_string.unpack('U*')&lt;br /&gt;    output = [0] * (ACE_MAX_LENGTH+1)&lt;br /&gt;    output_length = [ACE_MAX_LENGTH]&lt;br /&gt;&lt;br /&gt;    punycode_encode(input.size, input, case_flags, output_length, output)&lt;br /&gt;&lt;br /&gt;    outlen = output_length[0]&lt;br /&gt;    outlen.times do |j|&lt;br /&gt;      c = output[j]&lt;br /&gt;      unless c &gt;= 0 &amp;&amp; c &lt;= 127&lt;br /&gt;        raise Error, "assertion error: invalid output char"&lt;br /&gt;      end&lt;br /&gt;      unless PRINT_ASCII[c]&lt;br /&gt;        raise PunycodeBadInput&lt;br /&gt;      end&lt;br /&gt;      output[j] = PRINT_ASCII[c] if print_ascii_only&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    output[0..outlen].map{|x|x.chr}.join('').sub(/\0+\z/, '')&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def decode(punycode, case_flags=[])&lt;br /&gt;    input = []&lt;br /&gt;    output = []&lt;br /&gt;&lt;br /&gt;    if ACE_MAX_LENGTH*2 &lt; punycode.size&lt;br /&gt;      raise PunycodeBigOutput&lt;br /&gt;    end&lt;br /&gt;    punycode.each_byte do |c|&lt;br /&gt;      unless c &gt;= 0 &amp;&amp; c &lt;= 127&lt;br /&gt;        raise PunycodeBadInput&lt;br /&gt;      end&lt;br /&gt;      input.push(c)&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    output_length = [UNICODE_MAX_LENGTH]&lt;br /&gt;    Punycode.punycode_decode(input.length, input, output_length,&lt;br /&gt;                             output, case_flags)&lt;br /&gt;    output.pack('U*')&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  UNICODE_MAX_LENGTH = 256&lt;br /&gt;  ACE_MAX_LENGTH = 256&lt;br /&gt;&lt;br /&gt;  # The following string is used to convert printable&lt;br /&gt;  # characters between ASCII and the native charset:&lt;br /&gt;&lt;br /&gt;  PRINT_ASCII =&lt;br /&gt;    "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" \&lt;br /&gt;    "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" \&lt;br /&gt;    " !\"\#$%&amp;'()*+,-./" \&lt;br /&gt;    "0123456789:;&lt;=&gt;?" \&lt;br /&gt;    "@ABCDEFGHIJKLMNO" \&lt;br /&gt;    "PQRSTUVWXYZ[\\]^_" \&lt;br /&gt;    "`abcdefghijklmno" \&lt;br /&gt;    "pqrstuvwxyz{|}~\n"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# cf. http://snippets.dzone.com/posts/show/4527&lt;br /&gt;&lt;br /&gt;UTF8REGEX = /\A(?:                                                            &lt;br /&gt;              [\x09\x0A\x0D\x20-\x7E]            # ASCII&lt;br /&gt;            | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte&lt;br /&gt;            |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs&lt;br /&gt;            | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte&lt;br /&gt;            |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates&lt;br /&gt;            |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3&lt;br /&gt;            | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15&lt;br /&gt;            |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16&lt;br /&gt;            )*\z/mnx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UTF8_REGEX_MBYTE = /(?:                                 &lt;br /&gt;                 [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte&lt;br /&gt;               |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs&lt;br /&gt;               | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte&lt;br /&gt;               |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates&lt;br /&gt;               |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3&lt;br /&gt;               | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15&lt;br /&gt;               |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16&lt;br /&gt;               )/mnx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# cf. http://demo.icu-project.org/icu-bin/idnbrowser (samples)&lt;br /&gt;# on Mac OS X you can check the Ruby conversions with the GUI app PunyCode, http://software.dibomedia.de/products/show/2&lt;br /&gt;&lt;br /&gt;str = "http://www.&#65201;&#65202;&#65207;.com/"&lt;br /&gt;str = "www.&#1089;&#1076;&#1077;&#1083;&#1072;&#1090; &#1082;&#1072;&#1088;&#1090;&#1080;&#1085;&#1082;&#1080;.com"&lt;br /&gt;str = "http://www.&#1089;&#1076;&#1077;&#1083;&#1072;&#1090;&#1082;&#1072;&#1088;&#1090;&#1080;&#1085;&#1082;&#1080;.com/"&lt;br /&gt;str = "http://t&#363;dali&#326;.lv/"&lt;br /&gt;str = "http://www.z&#252;rich.com/"&lt;br /&gt;str = "http://www.h&#246;ren.at/"&lt;br /&gt;str = "http://www.&#382;lut&#253; k&#367;&#328;.com/"&lt;br /&gt;str = "www.f&#228;rgbolaget.nu"&lt;br /&gt;str = "www.br&#230;ndendek&#230;rlighed.com"&lt;br /&gt;str = "www.m&#228;kitorppa.com"&lt;br /&gt;str = "www.f&#228;rjestadsbk.net"&lt;br /&gt;str = "&#12354;&#12540;&#12427;&#12356;&#12435;.com"&lt;br /&gt;str = "www.&#50696;&#48708;&#44368;&#49324;.com"&lt;br /&gt;str = "www.&#12495;&#12531;&#12489;&#12508;&#12540;&#12523;&#12469;&#12512;&#12474;.com"&lt;br /&gt;str = "www.&#26085;&#26412;&#24179;.jp"&lt;br /&gt;str = "www.r&#228;ksm&#246;rg&#229;s.se"&lt;br /&gt;str = "www.r&#243;&#380;yczka.pl/"&lt;br /&gt;str = "&#29702;&#23481;&#12490;&#12459;&#12512;&#12521;.com"&lt;br /&gt;str = "http://B&#252;cher.ch/"&lt;br /&gt;str = "t&#363;dali&#326;.lv"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if str =~ UTF8REGEX &amp;&amp; str =~ UTF8_REGEX_MBYTE&lt;br /&gt;&lt;br /&gt;   s1 = str.gsub(/^(http:\/\/www\.|http:\/\/|).*?\.[^\.\/]+\/?$/n, '\1')&lt;br /&gt;   s2 = str.gsub(/^(?:http:\/\/www\.|http:\/\/|)(www\.|).*?\.[^\.\/]+\/?$/n, '\1')&lt;br /&gt;   s3 = str.gsub(/^(?:http:\/\/www\.|http:\/\/|www\.|)(.*?)\.[^\.\/]+\/?$/n, '\1')&lt;br /&gt;   s4 = str.gsub(/^(?:http:\/\/www\.|http:\/\/|www\.|).*?(\.[^\.\/]+\/?)$/n, '\1')&lt;br /&gt;&lt;br /&gt;   if s1.empty? then s1 = 'http://' end&lt;br /&gt;&lt;br /&gt;   s3 = Punycode.encode(Unicode::normalize_KC(Unicode::downcase(s3)))&lt;br /&gt;&lt;br /&gt;   punycoded_url = s1 &lt;&lt; s2 &lt;&lt; "xn--" &lt;&lt; s3 &lt;&lt; s4&lt;br /&gt;&lt;br /&gt;   puts punycoded_url&lt;br /&gt;&lt;br /&gt;   %x{ /usr/bin/open "#{punycoded_url}" }&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Wed, 26 Sep 2007 21:00:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4575</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>Storm ORM by Canonical in WSGI enabled applications</title>
      <link>http://snippets.dzone.com/posts/show/4408</link>
      <description>&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;# vim:ts=4:sw=4:et&lt;br /&gt;# (c) 2007 Vsevolod Balashov &lt;vsevolod@balashov.name&gt; under terms of LGPL 2.1&lt;br /&gt;# use Storm ORM &lt;https://storm.canonical.com&gt; in WSGI enabled applications&lt;br /&gt;&lt;br /&gt;"""WSGI middleware for Storm.&lt;br /&gt;&lt;br /&gt;This is the database access inteface for WSGI enabled (PEP 333) web applications.&lt;br /&gt;&lt;br /&gt;Pylons framework example:&lt;br /&gt;&lt;br /&gt;in wsgiapp.py&lt;br /&gt;&lt;br /&gt;from storm.database import create_database&lt;br /&gt;from middlestorm import MiddleStorm&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;# CUSTOM MIDDLEWARE HERE&lt;br /&gt;app = MiddleStorm(app, create_database(config['app_conf']['sqlalchemy.default.uri']))&lt;br /&gt;&lt;br /&gt;in controller:&lt;br /&gt;&lt;br /&gt;class DemoController(BaseController):&lt;br /&gt;    def index(self):&lt;br /&gt;        store = request.environ['storm.store']&lt;br /&gt;        ...&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;from storm.database import Database&lt;br /&gt;from storm.store import Store&lt;br /&gt;from threading import local&lt;br /&gt;&lt;br /&gt;__all__ = ["MiddleStorm"]&lt;br /&gt;__author__ = "Vsevolod Balashov &lt;http://vsevolod.balashov.name&gt;"&lt;br /&gt;__version__ = "0.1"&lt;br /&gt;&lt;br /&gt;class SingleConn(Database):&lt;br /&gt;    """Database proxy class.&lt;br /&gt;    Share single database connection between all Store object instances in threads.&lt;br /&gt;    If you have readonly database or not use transactions why not?&lt;br /&gt;    """&lt;br /&gt;    def __init__(self, database):&lt;br /&gt;        self._database = database&lt;br /&gt;        self._connection = database.connect()&lt;br /&gt;    def connect(self):&lt;br /&gt;        return self._connection&lt;br /&gt;&lt;br /&gt;class MiddleStorm(object):&lt;br /&gt;    """WSGI middleware.&lt;br /&gt;    Add Store object instance in environ['storm.store']. Each thread contains own instance.&lt;br /&gt;    """&lt;br /&gt;&lt;br /&gt;    def __init__(self, app, database, single = False):&lt;br /&gt;        """Create WSGI middleware.&lt;br /&gt;        @param app: up level application or middleware.&lt;br /&gt;        @param database: instance of Database returned create_database.&lt;br /&gt;        @param: single: use single database connection in all threads. &lt;br /&gt;        """&lt;br /&gt;        assert isinstance(database, Database), \&lt;br /&gt;            'database must be subclass of storm.database.Database'&lt;br /&gt;        if single:&lt;br /&gt;            self._database = SingleConn(database)&lt;br /&gt;        else:&lt;br /&gt;            self._database = database&lt;br /&gt;        self._app = app&lt;br /&gt;        self._local = local()&lt;br /&gt;&lt;br /&gt;    def __call__(self, environ, start_response):&lt;br /&gt;        try:&lt;br /&gt;            environ['storm.store']  = self._local.store&lt;br /&gt;        except AttributeError:&lt;br /&gt;            environ['storm.store']  = \&lt;br /&gt;                self._local.__dict__.setdefault('store', Store(self._database))&lt;br /&gt;        return self._app(environ, start_response)&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 10 Aug 2007 11:39:51 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4408</guid>
      <author>sevkin (Vsevolod Balashov)</author>
    </item>
  </channel>
</rss>
