<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: Ciconia's Code Snippets</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sat, 26 Jul 2008 23:34:59 GMT</pubDate>
    <description>DZone Snippets: Ciconia's Code Snippets</description>
    <item>
      <title>Ruby password strength calculator</title>
      <link>http://snippets.dzone.com/posts/show/4698</link>
      <description>This method returns the password lifetime in years. Based on this:&lt;br /&gt;http://www.codeandcoffee.com/2007/06/27/how-to-make-a-password-strength-meter-like-google&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class String&lt;br /&gt;  PASSWORD_SETS = {&lt;br /&gt;    /[a-z]/ =&gt; 26,&lt;br /&gt;    /[A-Z]/ =&gt; 26,&lt;br /&gt;    /[0-9]/ =&gt; 10,&lt;br /&gt;    /[^\w]/ =&gt; 32&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  def password_strength&lt;br /&gt;    set_size = 0&lt;br /&gt;    PASSWORD_SETS.each_pair {|k,v| set_size += v if self =~ k}&lt;br /&gt;    &lt;br /&gt;    combinations = set_size ** length&lt;br /&gt;    &lt;br /&gt;    # assuming 1000 tries per second&lt;br /&gt;    days = combinations.to_f / 1000 / 86400&lt;br /&gt;    &lt;br /&gt;    days / 365&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 25 Oct 2007 14:35:45 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4698</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>Better than methodphitamine?</title>
      <link>http://snippets.dzone.com/posts/show/4419</link>
      <description>Original discussion here: http://jicksta.com/articles/2007/08/04/the-methodphitamine&lt;br /&gt;&lt;br /&gt;I think this one is prettier (but maybe not as sophisticated):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;module Enumerable&lt;br /&gt;  def method_missing(sym, *args)&lt;br /&gt;    if (sym.to_s =~ /^(.+)_with$/) &amp;&amp; (msg = args.shift)&lt;br /&gt;      send($1.to_sym) do |x|&lt;br /&gt;        x.send(msg, *args)&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;[1, 2, 3].map_with :to_s&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 14 Aug 2007 13:24:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4419</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>Check for primality with a regexp</title>
      <link>http://snippets.dzone.com/posts/show/3691</link>
      <description>Original perl code here:&lt;br /&gt;&lt;br /&gt;http://montreal.pm.org/tech/neil_kandalgaonkar.shtml&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Fixnum&lt;br /&gt;  def prime?&lt;br /&gt;    ('1' * self) !~ /^1?$|^(11+?)\1+$/&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 18 Mar 2007 14:48:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3691</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>Ruby Thread Pool</title>
      <link>http://snippets.dzone.com/posts/show/3276</link>
      <description>This is useful for a variety of scenarios. You create a thread pool, give it a maximum size, and pass a block to it everytime you need something processed. If all threads are busy, you block until a thread becomes free.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;pool = ThreadPool.new(10) # up to 10 threads&lt;br /&gt;email_addresses.each do |addr|&lt;br /&gt;  pool.process {send_mail_to addr}&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'thread'&lt;br /&gt;&lt;br /&gt;class ThreadPool&lt;br /&gt;  class Worker&lt;br /&gt;    def initialize&lt;br /&gt;      @mutex = Mutex.new&lt;br /&gt;      @thread = Thread.new do&lt;br /&gt;        while true&lt;br /&gt;          sleep 0.001&lt;br /&gt;          block = get_block&lt;br /&gt;          if block&lt;br /&gt;            block.call&lt;br /&gt;            reset_block&lt;br /&gt;          end&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def get_block&lt;br /&gt;      @mutex.synchronize {@block}&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def set_block(block)&lt;br /&gt;      @mutex.synchronize do&lt;br /&gt;        raise RuntimeError, "Thread already busy." if @block&lt;br /&gt;        @block = block&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def reset_block&lt;br /&gt;      @mutex.synchronize {@block = nil}&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    def busy?&lt;br /&gt;      @mutex.synchronize {!@block.nil?}&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  attr_accessor :max_size&lt;br /&gt;  attr_reader :workers&lt;br /&gt;&lt;br /&gt;  def initialize(max_size = 10)&lt;br /&gt;    @max_size = max_size&lt;br /&gt;    @workers = []&lt;br /&gt;    @mutex = Mutex.new&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def size&lt;br /&gt;    @mutex.synchronize {@workers.size}&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def busy?&lt;br /&gt;    @mutex.synchronize {@workers.any? {|w| w.busy?}}&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def join&lt;br /&gt;    sleep 0.01 while busy?&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def process(&amp;block)&lt;br /&gt;    wait_for_worker.set_block(block)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def wait_for_worker&lt;br /&gt;    while true&lt;br /&gt;      worker = find_available_worker&lt;br /&gt;      return worker if worker&lt;br /&gt;      sleep 0.01&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def find_available_worker&lt;br /&gt;    @mutex.synchronize {free_worker || create_worker}&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def free_worker&lt;br /&gt;    @workers.each {|w| return w unless w.busy?}; nil&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def create_worker&lt;br /&gt;    return nil if @workers.size &gt;= @max_size&lt;br /&gt;    worker = Worker.new&lt;br /&gt;    @workers &lt;&lt; worker&lt;br /&gt;    worker&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 12 Jan 2007 16:39:05 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3276</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>foldr and foldl in Ruby</title>
      <link>http://snippets.dzone.com/posts/show/3259</link>
      <description>&lt;code&gt;&lt;br /&gt;module Enumerable&lt;br /&gt;  def foldr(o, m = nil)&lt;br /&gt;    reverse.inject(m) {|m, i| m ? i.send(o, m) : i}&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def foldl(o, m = nil)&lt;br /&gt;    inject(m) {|m, i| m ? m.send(o, i) : i}&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;[1, 2, 3, 4, 5].foldl(:+) #=&gt; 15&lt;br /&gt;[1, 2, 3, 4, 5].foldl(:*) #=&gt; 120&lt;br /&gt;&lt;br /&gt;[1, 2, 3, 4, 5].foldr(:-, 0) #=&gt; 3&lt;br /&gt;[1, 2, 3, 4, 5].foldl(:-, 0) #=&gt; -15&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <pubDate>Tue, 09 Jan 2007 11:52:51 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3259</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>A Fast Ruby XML Builder</title>
      <link>http://snippets.dzone.com/posts/show/2528</link>
      <description>Here's something I wrote this evening. It's a simple and fast XML builder. Some benchmark I ran show it to be about 4 times faster than &lt;a&gt;Builder&lt;/a&gt;. Usage example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;items = ['abc', 'def', 'ghi']&lt;br /&gt;xml = XML.new do&lt;br /&gt;  instruct!&lt;br /&gt;  reality(:time =&gt; Time.now) do&lt;br /&gt;  event do&lt;br /&gt;    type 1&lt;br /&gt;    path "/sharon"&lt;br /&gt;    value "abcdefg"&lt;br /&gt;  end&lt;br /&gt;  list.each {|i| item i}&lt;br /&gt;end&lt;br /&gt;puts xml.to_s&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The XML class:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class XML&lt;br /&gt;  # blank slate&lt;br /&gt;  instance_methods.each { |m| undef_method m unless (m =~ /^__|instance_eval$/)}&lt;br /&gt;  &lt;br /&gt;  # Each item in @doc is an array containing three values: type, value, attributes&lt;br /&gt;  &lt;br /&gt;  def initialize(&amp;block)&lt;br /&gt;    @doc = []&lt;br /&gt;    instance_eval(&amp;block)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def method_missing(tag, *args, &amp;block)&lt;br /&gt;    value = block ? nil : args.pop&lt;br /&gt;    attributes = args.pop&lt;br /&gt;    @__to_s = nil # invalidate to_s cache&lt;br /&gt;    if value&lt;br /&gt;      @doc &lt;&lt; [:open, tag, attributes] &lt;&lt; [:value, value] &lt;&lt; [:close, tag]&lt;br /&gt;    else&lt;br /&gt;      @doc &lt;&lt; [:open, tag, attributes]&lt;br /&gt;      instance_eval(&amp;block)&lt;br /&gt;      @doc &lt;&lt; [:close, tag]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def instruct!(atts = nil)&lt;br /&gt;    @doc &lt;&lt; [:instruct, atts || {:version =&gt; "1.0", :encoding =&gt; "UTF-8"}]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def to_s&lt;br /&gt;    @__to_s ||= @doc.map{|i| _fmt_part i}.join&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  alias_method :inspect, :to_s&lt;br /&gt;  &lt;br /&gt;  def _fmt_part(part)&lt;br /&gt;    case part[0]&lt;br /&gt;    when :instruct&lt;br /&gt;      "&lt;?xml #{_fmt_atts(part[1])}?&gt;"&lt;br /&gt;    when :open&lt;br /&gt;      part[2] ? "&lt;#{part[1]} #{_fmt_atts(part[2])}&gt;" :&lt;br /&gt;        "&lt;#{part[1]}&gt;"&lt;br /&gt;    when :close&lt;br /&gt;      "&lt;/#{part[1]}&gt;"&lt;br /&gt;    when :value&lt;br /&gt;      part[1].to_s&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def _fmt_atts(atts)&lt;br /&gt;    atts.inject([]) {|m, i| m &lt;&lt; "#{i[0]}=#{i[1].to_s.inspect}"}.join(' ')&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 04 Sep 2006 22:30:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2528</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>A replacement for Ruby's File.join</title>
      <link>http://snippets.dzone.com/posts/show/2447</link>
      <description>File.join is ugly, there I've said it. So how about being able to replace this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require File.join(LOAD_PATH, 'foobar')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;With this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require LOAD_PATH/:foobar&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Trivial, really:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class String&lt;br /&gt;  def /(o)&lt;br /&gt;    File.join(self, o.to_s)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 20 Aug 2006 12:27:36 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2447</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>Full information for Ruby errors</title>
      <link>http://snippets.dzone.com/posts/show/2427</link>
      <description>Sometimes I want to be able to print out everything about an error: it's class, message and the stack trace. So how about this:&lt;br /&gt;&lt;br /&gt;Update: followed suggestion by onarap and changed the line breaks to $/. No syntax highlighting because &lt;b&gt;the code breaks the snippet parser&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class StandardError&lt;br /&gt;  def info&lt;br /&gt;    "#{self.class}: #{message}#$/#{backtrace.join($/)}"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;</description>
      <pubDate>Wed, 16 Aug 2006 10:51:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2427</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>High-performance Ruby: faster Symbol.to_s</title>
      <link>http://snippets.dzone.com/posts/show/2423</link>
      <description>Here's something that I found useful for shaving a few microseconds off. The performance gain ranges between 10% and 35%! YMMV.&lt;br /&gt;&lt;br /&gt;Note: updated with suggestion by trans.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Symbol&lt;br /&gt;  def to_s&lt;br /&gt;    @str_rep || (@str_rep = id2name.freeze)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 15 Aug 2006 11:22:50 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2423</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
    <item>
      <title>Easily get a single element with jQuery</title>
      <link>http://snippets.dzone.com/posts/show/2285</link>
      <description>While jQuery is a great help, a lot of times I just need to grab a single element. It's a real PITA to have to write $('#mydiv').get(0) all the time, so here's a solution:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$.first = function(a, b) {return $(a, b).get(0)};&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 18 Jul 2006 13:18:51 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2285</guid>
      <author>ciconia (Sharon Rosner)</author>
    </item>
  </channel>
</rss>
