<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Twistedmind</title>
	
	<link>http://twistedmind.com</link>
	<description>Ruby on Rails Web Development</description>
	<lastBuildDate>Sat, 09 Apr 2011 23:31:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/twisted-mind" /><feedburner:info uri="twisted-mind" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Recent Developments on Genius Pool</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/l3TQZFncrIo/recent-developments-on-genius-pool</link>
		<comments>http://twistedmind.com/recent-developments-on-genius-pool#comments</comments>
		<pubDate>Fri, 12 Nov 2010 20:49:28 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Genius Pool]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[resque]]></category>

		<guid isPermaLink="false">http://twistedmind.com/?p=628</guid>
		<description><![CDATA[New Logo! Genius Pool has a swanky new logo courtesy of David Browning of two guys. David does amazing work and has recently worked with thoughtbot on the new Hoptoad notifier. Definitely give them a ring if you&#8217;re in need of some design or development. General Improvements There&#8217;s a new &#34;Job Posted&#34; screen that more [...]]]></description>
			<content:encoded><![CDATA[<h2>New Logo!</h2>
<p><a href="http://geniuspool.com"><img src="http://twistedmind.com/assets/2010/11/logo-square-150.png" alt="Genius Pool New Logo" border="0" style="float:right; border: none; background: #fff;" /></a></p>
<p></a><a href="http://geniuspool.com">Genius Pool</a> has a swanky new logo courtesy of <a href="http://twitter.com/djbrowning">David Browning</a> of <a href="http://twoguys.us/">two guys</a>. David does amazing work and has recently worked with thoughtbot on the new <a href="http://hoptoadapp.com/pages/ios-notifier">Hoptoad notifier</a>. Definitely give them a ring if you&#8217;re in need of some design or development.</p>
<h2>General Improvements</h2>
<p>There&#8217;s a new &quot;Job Posted&quot; screen that more accurately reflects some information about how to access jobs from your account once they&#8217;re posted and when the job listing expires. An email is now sent out a few days before the job posting expires  to remind you to extend your job posting for another 30 days if you choose.</p>
<h3>Renewals</h3>
<p>This is a long overdue feature but jobs can now be renewed on the site. Renewals are free. If you&#8217;d like to have your job read again on any podcasts, that option can be selected at renewal time. This is all accessed from the &quot;My Account&quot; section of the site. Click the gear and hit &quot;Renew&quot; on the dropdown at any time to renew a job. This will place it back on the live site. It looks like this:</p>
<p><img style="display:block; margin-left:auto; margin-right:auto;" src="http://twistedmind.com/assets/2010/11/Renew-Job-Listing-Genius-Pool.png" alt="Renew Job Listing | Genius Pool.png" border="0" width="600" height="559" /></p>
<h3>Behind The Scenes</h3>
<p>Job renewal emails are handled behind the scenes using <a href="https://github.com/defunkt/resque">resque</a> and <a href="https://github.com/bvandenbos/resque-scheduler">resque-scheduler</a> for scheduling the tasks. Resque-scheduler is a wonderfully reliable and simple tool for scheduling jobs to be run on a site. It does require resque and redis but if you&#8217;re hosting yourself it&#8217;s quite easy to set up.</p>
<p>When a job is renewed or activated for the first time (on purchase), two resque jobs are run behind the scenes. One sends out an email with a receipt to the purchaser and one posts the job to twitter. The benefit of putting these items in a background job is that the actions stay out of the request/response cycle which results in a better user experience.</p>
<p>Resque-scheduler runs as its own daemon and it&#8217;s configured just like the unix cron utility. The process is to create a <code>config/resque_schedule.yml</code> that  has a cron listing of your jobs. The renewal job runs once a day and checks to see if there are any jobs expiring in 3 days. If there are, it sends out a renewal reminder:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ReminderJob
  <span style="color:#0066ff; font-weight:bold;">@queue</span> = <span style="color:#ff3333; font-weight:bold;">:email</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">perform</span>
    <span style="color:#0066ff; font-weight:bold;">@jobs</span> = Job.<span style="color:#9900CC;">live</span>.<span style="color:#9900CC;">where</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'end_date = ?'</span>, <span style="color:#006666;">3</span>.<span style="color:#9900CC;">days</span>.<span style="color:#9900CC;">from_now</span>.<span style="color:#9900CC;">to_date</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#0066ff; font-weight:bold;">@jobs</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>job<span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> job.<span style="color:#9900CC;">can_send_renewal_reminder</span>? <span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">today</span>
        Notifier.<span style="color:#9900CC;">renewal_reminder</span><span style="color:#006600; font-weight:bold;">&#40;</span>job<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">deliver</span>
        job.<span style="color:#9900CC;">update_renewal_reminder</span>!
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

</p>
<p>This wouldn&#8217;t be complete without some cucumber steps. Jobs are created in the Background step, and the time is set to the appropriate day using <code>Timecop</code>:</p>
<pre>
  Scenario: A reminder email is sent
    Given the resque schedule queue is loaded
     Then the "email" queue should have 2 queued jobs
     When all jobs are processed
     Then there should be 1 emails with a subject containing "Your job listing is about to expire"
</pre>
<p><br class="clear" /></p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/l3TQZFncrIo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/recent-developments-on-genius-pool/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://twistedmind.com/recent-developments-on-genius-pool</feedburner:origLink></item>
		<item>
		<title>bundle exec bash shortcut</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/CptNOD2_mP0/bundle-exec-bash-shortcut</link>
		<comments>http://twistedmind.com/bundle-exec-bash-shortcut#comments</comments>
		<pubDate>Fri, 17 Sep 2010 15:34:06 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[bundler]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://twistedmind.com/?p=623</guid>
		<description><![CDATA[Now that Rails 3 is out and everyone has switched to it, there&#8217;s a new bit of fun to get used to also: Bundler. If you want to run a command with your gems loaded, you&#8217;ll need to run bundle exec to get it to run. This can become quite repetitive Like most programmers, I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>Now that <a href="http://rubyonrails.org">Rails 3</a> is out and everyone has switched to it, there&#8217;s a new bit of fun to get used to also: <a href="http://gembundler.com/">Bundler</a>. If you want to run a command with your gems loaded, you&#8217;ll need to run <code>bundle exec</code> to get it to run. This can become quite repetitive</p>
<p>Like most programmers, I&#8217;m lazy. So lazy, in fact, I just couldn&#8217;t bear the thought of typing <code>bundle exec</code> (or <code>be</code> which I aliased to) so many times. Here&#8217;s a bash shortcut I came up with:</p>
<p></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">bundle_commands</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span> spec rspec cucumber cap watchr rails rackup <span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> run_bundler_cmd <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> .<span style="color: #000000; font-weight: bold;">/</span>Gemfile <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;bundle exec $@&quot;</span>
        bundle <span style="color: #7a0874; font-weight: bold;">exec</span> $<span style="color: #000000; font-weight: bold;">@</span>
    <span style="color: #000000; font-weight: bold;">else</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;$@&quot;</span>
        $<span style="color: #000000; font-weight: bold;">@</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> cmd <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$bundle_commands</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">$cmd</span>=<span style="color: #ff0000;">&quot;run_bundler_cmd <span style="color: #007800;">$cmd</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>It looks for a Gemfile in the current working directory. If present, when you run one of the commands on in the <code>bundle_commands</code> variable then it will echo the command and then run it with bundle exec. It&#8217;s worked pretty well for me.</p>
<p><strong>Update:</strong> As noted by Peter Wagenet in the comments, you can do <code>bundle install --binstubs</code> which will create a bin directory in the project root that does the same thing. Adding <code>./bin</code> to your <code>$PATH</code> should accomplish the same thing.</p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/CptNOD2_mP0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/bundle-exec-bash-shortcut/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://twistedmind.com/bundle-exec-bash-shortcut</feedburner:origLink></item>
		<item>
		<title>The Changelog Joins The Genius Pool Network</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/ieKpTsHWdGw/the-changelog-joins-geniuspool</link>
		<comments>http://twistedmind.com/the-changelog-joins-geniuspool#comments</comments>
		<pubDate>Tue, 14 Sep 2010 19:56:30 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Genius Pool]]></category>
		<category><![CDATA[awesome]]></category>
		<category><![CDATA[changelog]]></category>

		<guid isPermaLink="false">http://blog.twistedmind.com/?p=604</guid>
		<description><![CDATA[I&#8217;m very pleased to announce that The Changelog is now a part of the Genius Pool Network. The Changelog is one of the best developer podcasts out there today and it&#8217;s inspiring to have such a high quality addition to the site. Publishers take note: now you can reach an even larger audience by electing [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://thechangelog.com"><img src="http://blog.twistedmind.com/assets/2010/09/changelog.jpg" alt="changelog" border="0" width="170" height="170" class="right"/></a></p>
<p>
I&#8217;m very pleased to announce that <a href="http://thechangelog.com">The Changelog</a> is now a part of the <a href="http://geniuspool.com/pages/network">Genius Pool Network</a>. The Changelog is one of the <em>best</em> developer podcasts out there today and it&#8217;s inspiring to have such a high quality addition to the site. Publishers take note: now you can reach an even larger audience by electing to have your job posting read on an episode of The Changelog!.
</p>
<p><strong><a href="http://thechangelog.com">Check out The Changelog</a> or <a href="https://geniuspool.com/jobs/new">post a job now</a>.</p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/ieKpTsHWdGw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/the-changelog-joins-geniuspool/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://twistedmind.com/the-changelog-joins-geniuspool</feedburner:origLink></item>
		<item>
		<title>Genius Pool Supports Twitter Integration</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/zXuj8sXmao0/geniuspool-twitter-integration</link>
		<comments>http://twistedmind.com/geniuspool-twitter-integration#comments</comments>
		<pubDate>Tue, 20 Jul 2010 16:11:20 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Genius Pool]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[geniuspool]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=509</guid>
		<description><![CDATA[This has been around for a little while now, but Genius Pool now has Twitter integration when a new job is posted. Check it out and post a job.]]></description>
			<content:encoded><![CDATA[<p><a href="http://geniuspool.com"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://blog.twistedmind.com/assets/2010/07/geniuspooltwitter.jpg" alt="Genius Pool on Twitter" border="0" width="512" height="152" /></a></p>
<p>This has been around for a little while now, but <a href="http://geniuspool.com">Genius Pool</a> now has Twitter integration when a new job is posted. <a href="http://geniuspool.com">Check it out</a> and post a job.</p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/zXuj8sXmao0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/geniuspool-twitter-integration/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://twistedmind.com/geniuspool-twitter-integration</feedburner:origLink></item>
		<item>
		<title>Friends Around Me</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/IBfr7Jva7n0/friends-around-me</link>
		<comments>http://twistedmind.com/friends-around-me#comments</comments>
		<pubDate>Fri, 09 Apr 2010 19:55:40 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Clients]]></category>
		<category><![CDATA[launch]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=449</guid>
		<description><![CDATA[I&#8217;d like to congratulate Friends Around Me with their official launch today. I was involved with doing some back-end development for this project. It&#8217;s mainly an iPhone (and iPad!) app with a Rails back-end. It&#8217;s a great idea from a very talented group of people whom I was lucky to work with. Check out the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://friendsaround.me"><img class="alignright" src="http://twistedmind.com/assets/2010/09/fam.jpg" alt="Friends Around Me" /></a></p>
<p>I&#8217;d like to congratulate <a href="http://www.friendsaround.me/">Friends Around Me</a> with their official launch today. I was involved with doing some back-end development for this project. It&#8217;s mainly an iPhone (and iPad!) app with a Rails back-end. It&#8217;s a great idea from a very talented group of people whom I was lucky to work with. Check out <a href="http://www.friendsaround.me/">the site</a> or <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=342291920&#038;mt=8">grab the app from iTunes</a>.</p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/IBfr7Jva7n0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/friends-around-me/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://twistedmind.com/friends-around-me</feedburner:origLink></item>
		<item>
		<title>Developer Job Board</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/BiKj-MvpD4c/developer-job-board</link>
		<comments>http://twistedmind.com/developer-job-board#comments</comments>
		<pubDate>Mon, 29 Mar 2010 14:51:07 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Genius Pool]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=391</guid>
		<description><![CDATA[I&#8217;m pleased to announce the Genius Pool job board. This is a new job board for connecting companies to job seekers. With the connection to the 5by5 podcast network, making sure your job opportunity is in the ears of qualified applicants has never been easier. Why&#8217;s that? If you&#8217;re looking for a Ruby or Rails [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://geniuspool.com/?s=tm"><img class="alignright" src="http://twistedmind.com/assets/2010/09/gpthumb.jpg" alt="Genius Pool" border="0" width="243" height="64" /></a>I&#8217;m pleased to announce the <a href="http://geniuspool.com/?s=tm">Genius Pool</a> job board. This is a new job board for connecting companies to job seekers. With the connection to the <a href="http://5by5.tv">5by5 podcast network</a>, making sure your job opportunity is in the ears of qualified applicants has never been easier. Why&#8217;s that? If you&#8217;re looking for a Ruby or Rails developer, what better spot is there than <a href="http://5by5.tv/rubyshow">The Ruby Show</a>? The same applies to <a href="http://5by5.tv/devshow">The Dev Show</a>. You can also be assured that whomever is applying has an <em>impeccable</em> sense of humor and taste. </p>
<p>So <a href="http://geniuspool.com/?s=tm">check it out</a> if you get a moment or <a href="http://twitter.com/geniuspool">follow Genius Pool on Twitter</a> for new job postings as they get posted. I&#8217;ll be doing some blog posts in the coming weeks about the process of launching your own project as well.</p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/BiKj-MvpD4c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/developer-job-board/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://twistedmind.com/developer-job-board</feedburner:origLink></item>
		<item>
		<title>Unobtrusive Javascript</title>
		<link>http://feedproxy.google.com/~r/twisted-mind/~3/x_Qd0usdMYo/unobtrusive-javascript</link>
		<comments>http://twistedmind.com/unobtrusive-javascript#comments</comments>
		<pubDate>Thu, 13 Mar 2008 06:56:23 +0000</pubDate>
		<dc:creator>jason</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/blog/unobtrusive-javascript</guid>
		<description><![CDATA[In January, I gave a presentation at the Orlando Ruby Users Group about unobtrusive javascript. I figured that I&#8217;d reproduce it here for anyone who wanted to watch it. Some topics covered in the video include semantic markup, benefits of coding unobtrusively, examples, and guidelines. Special thanks to Gregg Pollack for editing the video, and [...]]]></description>
			<content:encoded><![CDATA[<p>In January, I gave a presentation at the <a href="http://www.orug.org">Orlando Ruby Users Group</a> about <a href="http://en.wikipedia.org/wiki/Unobtrusive_Javascript">unobtrusive javascript</a>.  I figured that I&#8217;d reproduce it here for anyone who wanted to watch it.  Some topics covered in the video include semantic markup, benefits of coding unobtrusively, examples, and guidelines.  Special thanks to Gregg Pollack for editing the video, and an extra special thanks to Jason Hawkins from <a href="http://www.makefilmwork.com" title="Make Film Work">Make Film Work</a> for filming.</p>
<p><center><br />
<object type="application/x-shockwave-flash" data="http://www.vimeo.com/moogaloop.swf?clip_id=779892&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ffffff" width="720" height="480"><param name="quality" value="best"></param><param name="allowfullscreen" value="true"></param><param name="scale" value="showAll"></param><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=779892&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ffffff"></param></object><br />
<a href="http://www.vimeo.com/779892/l:embed_779892"><br />Unobtrusive Javascript Presentation</a> from <a href="http://www.vimeo.com/jseifer/l:embed_779892">Jason Seifer</a> on <a href="http://vimeo.com/l:embed_779892">Vimeo</a>.</center><br /></p>
<img src="http://feeds.feedburner.com/~r/twisted-mind/~4/x_Qd0usdMYo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://twistedmind.com/unobtrusive-javascript/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://twistedmind.com/unobtrusive-javascript</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.287 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-22 02:42:00 -->

