<?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>RANDOMTYPE Inc. » Blog</title>
	
	<link>http://randomtype.ca</link>
	<description>STRATEGY • DESIGN • DEVELOPMENT</description>
	<lastBuildDate>Fri, 27 Jan 2012 00:24:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rti-blog" /><feedburner:info uri="rti-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>How to Sign Out of the iTunes Store</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/rhM38xW9sIQ/</link>
		<comments>http://randomtype.ca/blog/how-to-sign-out-of-the-itunes-store/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 16:19:21 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[picture-guide]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=911</guid>
		<description><![CDATA[Below are the steps to sign out of the iTunes Store on your iOS device. Choose the Setting Application Touch &#8230; <a href="http://randomtype.ca/blog/how-to-sign-out-of-the-itunes-store/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
Below are the steps to sign out of the iTunes Store on your iOS device.
</p>


<h2>Choose the Setting Application</h2>

<p>
<br /><img src="http://randomtype.ca/cms/assets/settings-app.jpg" alt="Settings app on iOS Device" title="Settings app on iOS Device" width="320" height="480" class="aligncenter size-full wp-image-912" />
</p>

<h2>Touch the Store Icon</h2>
<p>
<br /><img src="http://randomtype.ca/cms/assets/store-button.jpg" alt="Arrow pointing to Store button" title="Arrow pointing to Store button" width="320" height="480" class="aligncenter size-full wp-image-915" />
</p>

<h2>Touch your Apple ID</h2>

<p>
<br /><img src="http://randomtype.ca/cms/assets/apple-account.jpg" alt="Arrow pointing to apple id button" title="Arrow pointing to apple id button" width="320" height="480" class="aligncenter size-full wp-image-913" />
</p>

<h2>Touch Sign Out</h2>

<p>
<br /><img src="http://randomtype.ca/cms/assets/sign-out.jpg" alt="Arrow pointing to sign out button" title="Arrow pointing to sign out button" width="320" height="480" class="aligncenter size-full wp-image-914" />
</p>


<p>
<strong>Important</strong>: if you&#8217;re doing this to <strong>test in-app purchases</strong> do not sign in with your test account. You will instead be prompted to sign in during the in-app purchase test.
</p><img src="http://feeds.feedburner.com/~r/rti-blog/~4/rhM38xW9sIQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/how-to-sign-out-of-the-itunes-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/how-to-sign-out-of-the-itunes-store/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-sign-out-of-the-itunes-store</feedburner:origLink></item>
		<item>
		<title>How to Create a Purposeful Blog Plan</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/Sa7Ng0wBP-I/</link>
		<comments>http://randomtype.ca/blog/create-purposeful-blog-plan/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 00:33:58 +0000</pubDate>
		<dc:creator>Kevin Dubienski</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blog Plan]]></category>
		<category><![CDATA[Blog Plan Template]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=890</guid>
		<description><![CDATA[Many of our clients have been asking for help in starting up their blog plans so what better way to &#8230; <a href="http://randomtype.ca/blog/create-purposeful-blog-plan/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
Many of our clients have been asking for help in starting up their blog plans so what better way to go about this than blogging a response.  I’ve formed strategies for short &amp; long term blog campaigns and let me tell you, every blog is and should be different.  Duplicate content is not well received by the Internet major search engines, so why not keep things fresh when posting?Before jumping into how to start a blog plan I’d like to share a source of inspiration for my blogging efforts.  I recently attended a meetup with Howard Lindzon, the founder of StockTwits where he shared some if his ideas around effective use of social media.  His company concept was great but it was some subtle advise that really kicked me in the face.
</p>
<p dir="ltr"><cite>“A corporate blog is for your corporate story”</cite></p>
<p>
This advice not only inspired me to start blogging for our company, but started to bring light to the benefits of blogging with a purpose.  The following list is what convinced me to restart blogging&#8230;
</p>
<ul>
	<li>It will help me and our company stay current in our industry,</li>
	<li>It will help our clients understand and optimize their systems,</li>
	<li>It create more information leading to exposure/promotion,</li>
	<li>It will help us understand our clients,</li>
	<li>It will help our client understand what technologies to invest in for greater returns,</li>
	<li>It will communicate our mission &amp; vision,</li>
	<li>It will demonstrate our work process,</li>
</ul>
<p>
&#8230;I quickly started to realize the true value of our blog and was uber excited to start building a stronger presence.  Before jumping the gun, lets walk through the blog plan I like to follow these days.
</p>
<h2>Blog Plan Template</h2>
<p>
Open an excel spread sheet and create space for 7 columns and as many rows as you’d like (feel free to <a href="http://dl.dropbox.com/u/28940720/RANDOMTYPE%20Blog%20Plan%20Template.numbers">download our template</a> to save a minute or two).  Label these columns Goals, Audience, Tools, Research, Messages, Timeline, Resources.  And that’s my super fancy template.  I work with this template for a few reasons:
</p>
<ul>
	<li>Excel/Numbers provides a simple way to lay things out with complex functions,</li>
	<li>I can export this data into several formats for reuse,</li>
	<li>I can simply create presentations rich with tables and charts to rally support for my blogging efforts to be.</li>
</ul>
<p>
From time to time I add different variables to this template such as Competition, Services, Networks, etc. to account for more specific needs.  Now you’ve got a blank blog plan sitting on your computer, lets start filling that sucker out.
</p>
<h2>1. The 3 Goals of Blogging</h2>
<p>
It’s time to choose the overall goal of your blog.  The three core reasons for creating a blog are generating revenue, building a following and, hobby writing.  Take a moment to ask yourself the following questions:
</p>
  <ul>
	<li>Are you going to be advertising on your blog?</li>
	<li>If so, are you promoting your company products/services or are you promoting external products/services?</li>
	<li>What outcome do you need to have a successful blog campaign?</li>
  </ul>
<p>
If it’s money your after then chase it hard and setup plenty of sales funnels.  If it’s people you’re after then listen to what they want and cater to their needs.  If you’re the hobby writer, you really won’t need much of a plan unless your a neat freak.  Deciding the goal of your blog will determine how to measure your blogs return on investment.
</p>
<strong></strong><strong></strong>
<h2>2. Audience</h2>
<p>
This is the first column to be filled in and it should be the most simple.  If you don’t exactly know who it is that you’re writing for why not ask your company owner, or your companies marketing team for some advice.  If you’re a sole proprietor or just blogging for the heck of it, I’ve crafted the following questions to ask yourself to help identify your target audience:
</p>
  <ul>
	<li>Where does our target audience congregate online?</li>
	<li>What is your target audience looking for? What are their interests?</li>
	<li>What is your target audience talking about?</li>
	<li>What are your target audiences largest problems?</li>
	<li>What are your target audiences biggest success stories?</li>
  </ul>
<p>
Answer these questions and record them in your blog plan and start drawing high-level conclusions about what posts will satisfy your readers hunger.  If you’re proper stumped, why don’t you search for blogs in your industry and learn from what they do well, and where they fall short.  Be sure to make note of blog post topics, keywords being used, blog comments, blog features, etc.
</p>
<p>
Once you understand your market, it’s time to plan the tools you’ll be using to produce blog posts.
</p>
<h2>3. Tools</h2>
<p>
This is more a work-flow symantic however the goal here is to build a benchmark sheet for everyone contributing blog posts.  This benchmark should include (but never limit yourself):
</p>
  <ul>
	<li>How updates are to be made,</li>
	<li>How to work with your blogging platform,</li>
	<li>What functionality does your blog require?</li>
	<li>Will you be collaborating the development blog posts or will a single person be in-charge?</li>
	<li>Who is responsible for what blog posts?</li>
  </ul>
<p>
Again it’s time to list your answers within your blog plan.  Do this with your company in mind so everyone (young and old) can understands how your blog platform works, and how everyone is expected to help.  When it comes to our company, my team is my most valuable asset so we chose that each of us would blog about our interests and area of expertise.  The content (copy) for blog posts are created in <a href="https://docs.google.com/">Google Docs</a> where any of us can contribute, sharing the load of writing/editing posts.  Speaking features, we’re looking to create a mobile optimized version of our blog, easier navigation for accessing different blog posts, and integrate sales funnels for linking our blog posts directly to services/products RANDOMTYPE offers.   We’re happy with our side-bar offerings such as Last Ten Articles and, Popular Tags but it’s time to listen to our users.
</p>
<p>
Enough about me&#8230; If you’re cozy with the tools you’ll be blogging with, it’s time to figure out how you’ll be preforming research.
</p>
<h2>4. Research</h2>
<p>
Solid research makes all the different in properly crafting a blog posts.  To get an idea of what you’ll need to research its time to address the following questions:
</p>
  <ul>
	<li>How do your competitors blog?</li>
	<li>What is your target audience hungry for?</li>
	<li>Where does your target audience rely on information from?</li>
	<li>What information does your target audience not receive well?</li>
	<li>What is the source(s) of credible information within your industry?</li>
  </ul>
<p>
I like to brainstorm ideas on my own then bringing them to our team, ask for their input.  Be sure to hear out all criticism offered and try to check your ego at the door.  My purpose here isn’t selling my team that I’m coming up with great ways to research information, it’s to show them what makes the most sense to me while seeing if they have anything to further evolve my thoughts.  After talking with my team, I’ll then make any tweaks to the research column within my blog plan and move onto crafting messages.
</p>
<h2>5. Message</h2>
<p>
This is going to be the meat and potatoes of your blog.  There is no golden ticket for the messages you communicate in blog posts though there is a strategy behind any great blogger.  When planning blog campaigns I follow a very fluid model where I map out each of the messages I plan to craft throughout a few months (and up to a year) and connect each post with synergies.  Just imagine a huge connect the dot mind map of my posts to come.
</p>
<p>
For example lets assume I’ll be blogging the following messages:
</p>
  <ol>
	<li>Best blogging platforms,</li>
	<li>Setting up new features on your blog,</li>
	<li>How to start a blog plan,</li>
	<li>Top ten features for blogs.</li>
  </ol>
<p>
I’ll take a look at all these blog posts to be and decide what the most logical flow for crafting and releasing these posts would be.  The order I would blog these posts would look as followed:
</p>
  <ol>
	<li>How to start a blog plan,</li>
	<li>Best blogging platforms,</li>
	<li>Top ten features for blogs,</li>
	<li>How to setup new features within your blog.</li>
  </ol>
<p>
I chose this order because my readers will first see how to plan, followed with how to start blogging, moving onto popular features, and summed up with how to integrate these features.  If information flows well, and your posts are of quality, you’ll receive well deserved subscribers to your blog.  If your information is scattered, expect varying levels of traffic and varying time spent on your site from users.
</p>
<p>
Speaking of time, you’re now ready to start putting deadlines to each of your posts.
</p>
<h2>6. Timeline</h2>
<p>
In order to meet your blog goals it’s important to tie each of your posts to a timeline.  This is done for a few reasons:
</p>
  <ol>
	<li>To allow your users to understand when they can expect a new post,</li>
	<li>To keep you accountable for producing new posts and,</li>
	<li>To keep your blog promoters in sync with when a new post is ready to receive traffic.</li>
  </ol>
<p>
At RANDOMTYPE we use Google Calendar to share our timeline for publishing blog articles.  This keeps everyone on the same page while spacing our posts to keep a balance of information flow.
</p>
<p>
With a timeline for publishing new blog posts you’re ready to lay out the resources at your disposal for blogging.
</p>
<h2>7. Resources</h2>
<p>
This is a fairly broad column within your blog plan yet crucial for understanding your approach in creating, publishing and sharing blog posts.  Take a moment to explore the following questions:
</p>
 <ol>
	<li>What section of your blog are you able to post to?</li>
	<li>What social networking sites will you use to promote your post?</li>
	<li>Do you have any staff to help you create blog posts?</li>
	<li>Do you have staff to help market your blog posts?</li>
	<li>Do you have a budget for out-sourcing the writing for blogs?</li>
 </ol>
<p>
Though you don’t need to answer all of these questions, it’s good to know the resources you have at your disposal.  Continually planning, writing and marketing blog posts can be a time consuming job which is why it’s a great practice to leverage all resources to accomplish your goal.
</p>
<h2>Great Success</h2>
<p>
You’ll now have a more or less complete plan for blogging.  Let this plan be your road map for building your blog and be sure to update it as you start to learn about your users.  A plan like this should be great ammunition to bring to executives in your company to convince them to adopt new, low cost initiatives for communicating with your clients, users and the rest of the world.  As you start blogging remember to keep up with user comments, constantly review your blogs usage metrics and, start talking with the people visiting your blog.
</p>
<h2>I don’t have time for this!</h2>
<p>
If you’re too busy around the office, feel free <a href="http://randomtype.ca/contact-us/">contact us</a> by email or phone to explore how RANDOMTYPE can help you plan and execute your blog campaign.  We don’t mind if you’re experienced or brand new to blogging, we’re friendly folk passionate about most things online!
</p>
<h2>Feedback</h2>
<p>
I would love to hear what you have to say about forming blog plans.  Leave a comment, and I’ll get back to you however needed.
</p><img src="http://feeds.feedburner.com/~r/rti-blog/~4/Sa7Ng0wBP-I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/create-purposeful-blog-plan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/create-purposeful-blog-plan/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=create-purposeful-blog-plan</feedburner:origLink></item>
		<item>
		<title>Response to Recovering From a Computer Science Education</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/6g5DFE5Twbw/</link>
		<comments>http://randomtype.ca/blog/response-to-recovering-from-a-computer-science-education/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 15:52:16 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=884</guid>
		<description><![CDATA[James Hague writes some great observations in his post Recovering From a Computer Science Education. Many of which I&#8217;ve had &#8230; <a href="http://randomtype.ca/blog/response-to-recovering-from-a-computer-science-education/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
James Hague writes some great observations in his post <a href="http://prog21.dadgum.com/123.html">Recovering From a Computer Science Education</a>. Many of which I&#8217;ve had to undo myself.
</p>

<blockquote>
<strong>If you find yourself repeatedly putting down a technology, then take some time to actually learn and use it.</strong> All the jokes and snide remarks aside, Perl is tremendously useful. Ditto for PHP and Java and C++. Who wins, the person who has been slamming Java online for ten years or the author of Minecraft who just used the language and made tens of millions of dollars? 
</blockquote>

<p>
The latter part of this quote strikes close to home. As a partner at RANDOMTYPE I&#8217;ve really had to focus on creating value for our company and not just chasing the shiny. As well, the quote also exemplifies a sub-category of <a href="http://en.wikipedia.org/wiki/Cargo_cult_programming">cargo-culting</a>. That is, programmers picking on a language because they&#8217;ve heard/seen others do it.
</p><img src="http://feeds.feedburner.com/~r/rti-blog/~4/6g5DFE5Twbw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/response-to-recovering-from-a-computer-science-education/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/response-to-recovering-from-a-computer-science-education/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=response-to-recovering-from-a-computer-science-education</feedburner:origLink></item>
		<item>
		<title>Why it’s Important to Monitor Google Webmaster Tools</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/S_UEM0Ya5Ao/</link>
		<comments>http://randomtype.ca/blog/why-it-is-important-to-monitor-google-webmaster-tools/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 23:50:23 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=879</guid>
		<description><![CDATA[You can&#8217;t control what you can&#8217;t measure. That quote is a solid gold nugget. And is also one of the &#8230; <a href="http://randomtype.ca/blog/why-it-is-important-to-monitor-google-webmaster-tools/">Continued</a>]]></description>
			<content:encoded><![CDATA[
<blockquote>
You can&#8217;t control what you can&#8217;t measure.
</blockquote>

<p>
That quote is a solid gold nugget. And is also one of the reasons I keep close tabs on Google Webmaster Tools (GWT) for randomtype.ca. So when the site started generating the following results in GWT I started to take notice:
</p>

<pre>
URL               Detail	    Detected
================================================
/blog/listify/    Redirect error    Nov 16, 2011
/tag/html/        Redirect error    Nov 16, 2011
/tag/net/         Redirect error    Nov 16, 2011
/tag/book/        Redirect error    Nov 16, 2011
...
</pre>

<p>
My first thought was that we had made a huge mistake and the site was down. Panic! randomtype.ca was typed manically into the browser&#8230; and&#8230; and&#8230; the page loaded. Phew!
</p>

<img src="http://randomtype.ca/cms/assets/homepage-500x329.png" alt="RANDOMTYPE home page successfully loaded" title="RANDOMTYPE home page" width="500" height="329" class="aligncenter size-medium wp-image-880" />

<p>
&#8220;That&#8217;s weird,&#8221; I thought &#8220;must be an error with Google.&#8221; As I&#8217;ve proven before, <i>&lt;sarcasm&gt;<a href="http://randomtype.ca/blog/premature-optimization-is-the-root-of-all-evil/">I&#8217;m smarter than Apple</a>&lt;/sarcasm&gt;</i>, so I must be smarter than Google! So I left it for a day. But when I came back to check again, I was getting the same results with fresher dates. That concerned me. GWT has a feature called &#8220;Fetch as Google Bot&#8221; so I tried that. Same results, randomtype.ca was in an infinite loop (redirect error) when fetching via Google Bot.
</p>

<p>
My next thought was to use <code>curl</code> to see what happened. So I executed the code <code>curl -L http://randomtype.ca</code> the <code>-L</code> switch tells curl to follow redirects. Sure enough it returned the following results:
</p>

<pre>
Running :: curl -L http://randomtype.ca
Results :: curl: (47) Maximum (50) redirects followed
</pre>

<p>
So now I&#8217;ve got two sources reporting that there&#8217;s an infinite loop of redirects happening. This invalidates the first assumption that something is screwing up at Google and leads me to believe that I&#8217;ve made a mistake somewhere. The next step is to look at the headers that curl is returning and compare them to a browser&#8217;s headers since the browser is successfully loading the page.
</p>

<p>
<code>curl -I http://randomtype.ca</code> returns the following:
</p>

<pre>
HTTP/1.1 302 Found
Server: Apache/2.2
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Date: Fri, 18 Nov 2011 16:56:38 GMT
Location: /
Transfer-Encoding: chunked
Connection: Keep-Alive
Set-Cookie: wptheme8850c883ba7bf80cad64b51b5d039df9=RANDOMTYPE+Inc.; expires=Sun, 19-Feb-2012 16:56:38 GMT; path=/
Set-Cookie: X-Mapping-cffoajmn=B07F1917A2C28FA3759FA175EBC10612; path=/
</pre>

<p>
And firebug:
</p>

<pre>
HTTP/1.1 200 OK
Server: Apache/2.2
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Date: Fri, 18 Nov 2011 16:53:47 GMT
X-Pingback: http://randomtype.ca/cms/xmlrpc.php
Connection: Keep-Alive
Content-Length: 7565
</pre>

<p>
Hmmm&#8230; those are two very different headers. During that time I had been working on our site&#8217;s .htaccess file so maybe reducing to the <a href="http://randomtype.ca/blog/the-wordpress-htaccess-file-explained/">default WordPress .htaccess</a> might fix the issue&#8230; But it didn&#8217;t, still had the same result, including that cookie line. That started to peak my interest, so I ran another curl query to include saving the cookie.
</p>

<p>
<code>curl -LIc cookie.tmp http://randomtype.ca</code> which returned:
</p>

<pre>
HTTP/1.1 302 Found
Server: Apache/2.2
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Date: Fri, 18 Nov 2011 17:10:55 GMT
Location: /
Transfer-Encoding: chunked
Connection: Keep-Alive
Set-Cookie: wptheme8850c883ba7bf80cad64b51b5d039df9=RANDOMTYPE+Inc.; expires=Sun, 19-Feb-2012 17:10:57 GMT; path=/
Set-Cookie: X-Mapping-cffoajmn=451B32BFF54A8789442A5D320937FD91; path=/

HTTP/1.1 200 OK
Server: Apache/2.2
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8
Date: Fri, 18 Nov 2011 17:10:57 GMT
X-Pingback: http://randomtype.ca/cms/xmlrpc.php
Transfer-Encoding: chunked
Connection: Keep-Alive
</pre>

<p>
Ahhha! That was it! My investigation into the cookie showed that some of our code for detecting mobile browsers was buggy. And since Google Bot didn&#8217;t set the cookie it created an infinite redirect loop. A quick code change and a retest with &#8220;Fetch as Google Bot&#8221; in GWT confirmed that our code was working. 
</p>

<p>
While it took almost an entire month for those redirect errors to clear out of GWT, we knew that the issue had been solved. Had we not dealt with the issue as swiftly as we did, our entire site may have disappeared off of Google. Clearly not something we&#8217;re aiming for!
</p><img src="http://feeds.feedburner.com/~r/rti-blog/~4/S_UEM0Ya5Ao" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/why-it-is-important-to-monitor-google-webmaster-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/why-it-is-important-to-monitor-google-webmaster-tools/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=why-it-is-important-to-monitor-google-webmaster-tools</feedburner:origLink></item>
		<item>
		<title>SR&amp;ED Tax Incentive Program</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/4AhEsIV86e4/</link>
		<comments>http://randomtype.ca/blog/sred-tax-incentive-program/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 15:30:55 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=847</guid>
		<description><![CDATA[On December 7th, I had the pleasure of attending a presentation on the Scientific Research and Experimental Development Tax Incentive &#8230; <a href="http://randomtype.ca/blog/sred-tax-incentive-program/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
On December 7th, I had the pleasure of attending a presentation on the Scientific Research and Experimental Development Tax Incentive Program &#8211; or SR&#038;ED for short! The awesome group at <a href="http://www.acceleratoryyc.com/">AcceleratorYYC</a> hosted and Justin Friesen &#038; Jason Fitzgerald from <a href="http://www.bdo.ca/">BDO Calgary</a> did the presentation.
</p>

<h2>What is SR&#038;ED</h2>

<p>
The SR&#038;ED program was created by the Federal Government to bring money to Canadian businesses and entrepreneurs who are pushing the bounds of their industry. Obviously such &#8220;thinking outside the box&#8221; requires large monetary investments. SR&#038;ED helps companies take those risks by softening the cost via tax credits.
</p>

<p>
Last year alone the Federal Government gave away <strong>$4 billion dollars in tax credits through the SR&#038;ED program</strong>. A typical tax credit for a tech startup can see 35 cents on the dollar &#8211; which is HUGE! Moreover any size business can apply for SR&ED; there is a cap on how much can be claimed, which is $3 million dollars IIRC. So if you spend $10,000 or $2 million on R&#038;D you can apply for credits. The other great part of the program is that the Federal Government doesn&#8217;t cap what they are willing to give away, so like some grants or incentives there&#8217;s no money to run out &#8211; meaning that if you apply and qualify for the credits you&#8217;re going to get them.
</p>

<p>
In addition to the Federal SR&#038;ED credits there&#8217;s also a provincial side of things. Those of us in Alberta are lucky since the Province contributes approximately 10 cents on the dollar. Jason didn&#8217;t dive too much into the details here, other than mentioning the credit varies from province to province with some provinces not even providing one.
</p>

<p>
Finally, IT/Technology/Computer Science all falls under the science section of SR&#038;ED so tech companies can apply to receive the credits.
</p>

<h2>
Who is Eligible?
</h2>

<p>There are 3 major eligibility criteria that must be met:</p>

<ol>
  <li>Have to have a scientific achievement
    <ul>
      <li>The idea here is to have some type of measurable or metrics that can prove that an achievement was made. For example: We developed an algorithm to sort an array in O(n) which beats the current best <a href="http://en.wikipedia.org/wiki/Sorting_algorithm#Classification">O(n log n) algorithm</a>.</li>
    </ul>
  </li>
  <li>Have to have an obstacle
    <ul>
      <li>For this criterion a basic litmus test would be: can I get a company to build this for me easily? Keeping with the sorting algorithm example, you&#8217;d be hard pressed to find someone that you could pay to achieve an O(n) sort (except on eLance :P) The nice thing about the obstacle portion of the criteria is that you don&#8217;t have to actually overcome the obstacle to claim SR&#038;ED you just have to prove that there was an obstacle for what you were trying to accomplish.</li>
    </ul>
  </li>
  <li>Has to have systematic investigation
    <ul>
      <li>Simply put show that you&#8217;ve actually done the work.</li>
    </ul>
  </li>
</ol>

<p>
To be eligible all 3 criteria must be met and application should be very data heavy with these points. Jason overstated that the adjudicators are looking for intimate details here vs. features. Your customers care about the features, market to them, the government cares about how you achieved the feature.
</p>

<h2>
Eligibility Threshold
</h2>

<p>
Obviously the above begs the question of how is eligibility determined? Jason provided a good rule of thumb: If it takes less than a month to develop &#8211; you&#8217;re likely not eligible for credits. That gives a pretty good idea of the scope of work being undertaken. Further to this it&#8217;s important to know that internal products are less desirable than something that is for sale externally, whether that&#8217;s a SaaS, SaaP or product doesn&#8217;t matter.
</p>

<p>
One thing that was hugely interesting was that to qualify for SR&#038;ED tax credits the advancement doesn&#8217;t have to be a success. That is, there is no criterion for a successful discovery, which is one of the reasons why failed scientific advancement is still eligible for the credit. I think that&#8217;s an awesome part of this policy because <strong>the only way you can disqualify yourself is if you don&#8217;t try!</strong> Whether you&#8217;re successful or not doesn&#8217;t matter. 
</p>

<h2>
Other Tidbits
</h2>

<p>A couple of other points that don&#8217;t fit above:</p>

<ul>
  <li>Historical documentation is super valuable because it helps you prove the work was done and how long it took to complete.</li>
  <li>Journals, source control commits, emails, basecamp discussions, etc. all fit under the category of historical documentation. Effectively anything with a date or ability to place it within a time frame is game here.</li>
  <li>Obstacles are your friend; iterations are your friend. Doubly so if it&#8217;s documentably provable.</li>
  <li>Smoke em if you got em! If you don’t file for your SR&#038;ED credits within 18 months after the company’s yearend you will lose the credits forever.</li>
</ul>

<h2>
Take Aways
</h2>

<p>
Overall Jason did a great job of distilling SR&#038;ED into easily digestible information. It was a great presentation, and my take away was that I now know RANDOMTYPE isn&#8217;t doing the type of work that would qualify us for a SR&#038;ED tax credit. 
</p>

<p>
With that said, now that I know such a credit exists, our company will certainly be game for tackling harder projects knowing that we could have some of our costs (and thus risk) associated with such an undertaking paid for. Win!
</p>

<p>
If you&#8217;re thinking about tackling an SR&#038;ED proposal definitely give Jason at BDO a call or <a href="mailto:jfitzgerald@bdo.ca">email</a>. He knew what he was talking about, and he had a technical background to boot, which would certainly make the process easier to undertake.
</p>


<img src="http://feeds.feedburner.com/~r/rti-blog/~4/4AhEsIV86e4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/sred-tax-incentive-program/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/sred-tax-incentive-program/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sred-tax-incentive-program</feedburner:origLink></item>
		<item>
		<title>Ruby Constant Pre-Processing</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/wu-peg2tYbA/</link>
		<comments>http://randomtype.ca/blog/ruby-constant-pre-processing/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 18:56:10 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=831</guid>
		<description><![CDATA[Phone numbers in Twilio&#8217;s API need to be formatted like this: +xxxxxxxxxx In code this can be difficult to read &#8230; <a href="http://randomtype.ca/blog/ruby-constant-pre-processing/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
Phone numbers in Twilio&#8217;s API need to be formatted like this: <code>+xxxxxxxxxx</code>
</p>

<p>
In code this can be difficult to read and easy to make a mistake with. With Ruby you can run code against a constant string before it gets constantized (&#8220;pre-processing&#8221;):
</p>

<pre class="brush: ruby; title: ; notranslate">
NUMBER = '+1 (777) 239-3636'.gsub(/[^0-9+]/, '')
puts NUMBER  #=&gt; +17772393636
</pre>


Now you can read a value in code, and clean it of extra characters before using it.
<img src="http://feeds.feedburner.com/~r/rti-blog/~4/wu-peg2tYbA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/ruby-constant-pre-processing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/ruby-constant-pre-processing/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ruby-constant-pre-processing</feedburner:origLink></item>
		<item>
		<title>Hook, Line, and Sinker – Getting Caught by Phishing Attacks</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/hkFMYrNQFoc/</link>
		<comments>http://randomtype.ca/blog/hook-line-and-sinker-getting-caught-by-phishing-attacks/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 23:48:26 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=815</guid>
		<description><![CDATA[At RANDOMTYPE we run our clients through Rackspace for our hosting services. Rackspace has great support and a variety of &#8230; <a href="http://randomtype.ca/blog/hook-line-and-sinker-getting-caught-by-phishing-attacks/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
At RANDOMTYPE we run our clients through Rackspace for our hosting services. Rackspace has great support and a variety of services. One such service we use them for is email. One benefit of Rackspace email, is that it&#8217;s setup to not accept bulk email sending which prevents spam on compromised email accounts and the like.
</p>

<p>
This morning we received a notification from Rackspace that one of our clients had exceed the send limit and that their email account had been temporarily disabled. Obviously a problem for our client, so it was time to put on the investigator cap and dig in.
</p>

<p>
The shutoff notification contained a copy of the email that was being sent out. Written in the email was the following:
</p>

<blockquote>
Helen Stevens commented on your Wall post.<br />
Helen wrote: &#8220;you are full of shit!&#8221; 
</blockquote>

<p>
Those are hurt words! The email looked like this:
</p>

<p>
<img src="http://randomtype.ca/cms/assets/donna-example-email.png" alt="Example phishing email" title="Example phishing email" width="655" height="349" class="aligncenter size-full wp-image-816" />
</p>

<p>
<strong>Yikes!</strong> That is a really authentic looking email. Which is what our client was going to send out to some 400+ recipients, which thankfully Rackspace blocked. Now I can&#8217;t know for sure, but likely our client received that same email and followed one of the 3 links that appeared on that page. So where do those links go?
</p>

<p>
Digging into the html behind the email, turns out all the links go to a malicious site that isn&#8217;t Facebook (go figure) at the address: <code>http://cefalo.de/neu/neu.html</code>. Here&#8217;s the screenshot of that website:
</p>

<p>
<img src="http://randomtype.ca/cms/assets/login-screen-500x287.png" alt="Facebook Phishing Login Screen" title="Facebook Phishing Login Screen" width="500" height="287" class="aligncenter size-medium wp-image-817" />
</p>

<p>
Other than a bad url in the title bar, that website looks like Facebook and there is no fault to be placed on someone that unknowingly enters their email and password into that site. Doing a check on the root of that domain (<code>http://cefalo.de</code>) reveals the following page:
</p>

<p>
<img src="http://randomtype.ca/cms/assets/root-domain-500x283.png" alt="Root domain of phishing website" title="Root domain of phishing website" width="500" height="283" class="aligncenter size-medium wp-image-820" />
</p>

<p>
So it&#8217;s easy to conclude that the website owner doesn&#8217;t know their website has been compromised and is being used to launch phishing attacks (albeit they do now since I sent them an email informing them as much.) The sad thing is that it doesn&#8217;t look like this could have been prevented automatically for our client. Doing a check using McAfee&#8217;s SiteAdvisor turned up the following sunny report:
</p>

<p>
<img src="http://randomtype.ca/cms/assets/mcafee-certified-safe.png" alt="McAfee logo certifying the site as safe" title="McAfee logo certifying the site as safe" width="384" height="215" class="aligncenter size-full wp-image-818" />
</p>

<p>
This really got me to thinking. Are the tools to detect phishing only re-active? Namely do they require enough potential victims to declare a webpage as unsafe before they&#8217;re flagged as such? Or are there any tools out there that are preventative? A couple of ideas come to mind on how that could be accomplished&#8230; but that seems like a hard problem &#8211; much like spam was back in the day&#8230;
</p>

<img src="http://feeds.feedburner.com/~r/rti-blog/~4/hkFMYrNQFoc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/hook-line-and-sinker-getting-caught-by-phishing-attacks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/hook-line-and-sinker-getting-caught-by-phishing-attacks/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=hook-line-and-sinker-getting-caught-by-phishing-attacks</feedburner:origLink></item>
		<item>
		<title>How to Make Gem Patches with Gem Edit</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/mx_c7OWcMGE/</link>
		<comments>http://randomtype.ca/blog/how-to-make-gem-patches-with-gem-edit/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 20:37:15 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=789</guid>
		<description><![CDATA[Here at RANDOMTYPE we use gollum as an internal wiki for keeping track of important things like server setup steps, &#8230; <a href="http://randomtype.ca/blog/how-to-make-gem-patches-with-gem-edit/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>
Here at RANDOMTYPE we use <a href="https://github.com/github/gollum">gollum</a> as an internal wiki for keeping track of important things like server setup steps, solutions to problems we&#8217;ve solved, unix tips and tricks we&#8217;ve found, and the like. So when I got this friendly error from gollum I was a bit concerned:</p>

<p>
<img src="http://randomtype.ca/cms/assets/loose-object-error.png" alt="Sinatra throwing a Loose Object Error originating in Grit" title="Sinatra throwing a Loose Object Error originating in Grit" width="550" height="200" class="aligncenter size-full wp-image-791" />
</p>

<p>The full stack trace was big and ugly:</p>

<pre class="brush: bash; title: ; notranslate">
Grit::GitRuby::Internal::LooseObjectError - size mismatch:
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/internal/loose.rb:59:in `get_raw_object'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/internal/loose.rb:32:in `[]'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/repository.rb:84:in `block in get_raw_object_by_sha1'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/repository.rb:83:in `each'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/repository.rb:83:in `get_raw_object_by_sha1'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/repository.rb:105:in `get_object_by_sha1'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby/repository.rb:155:in `cat_file'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby.rb:27:in `block in cat_file'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby.rb:224:in `block in try_run'
/.rbenv/lib/ruby/1.9.1/timeout.rb:58:in `timeout'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby.rb:223:in `try_run'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/git-ruby.rb:27:in `cat_file'
/.rbenv/lib/ruby/gems/1.9.1/gems/grit-2.4.1/lib/grit/blob.rb:43:in `data'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/page.rb:151:in `raw_data'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/page.rb:160:in `text_data'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/markup.rb:15:in `initialize'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/page.rb:171:in `new'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/page.rb:171:in `formatted_data'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/frontend/app.rb:190:in `show_page_or_file'
/.rbenv/lib/ruby/gems/1.9.1/gems/gollum-1.3.1/lib/gollum/frontend/app.rb:182:in `block in &lt;class:App&gt;'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1152:in `call'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1152:in `block in compile!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:724:in `instance_eval'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:724:in `route_eval'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:708:in `block (2 levels) in route!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:758:in `block in process_route'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:755:in `catch'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:755:in `process_route'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:707:in `block in route!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:706:in `each'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:706:in `route!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:843:in `dispatch!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:644:in `block in call!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:808:in `instance_eval'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:808:in `block in invoke'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:808:in `catch'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:808:in `invoke'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:644:in `call!'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:629:in `call'
/.rbenv/lib/ruby/gems/1.9.1/gems/rack-1.3.3/lib/rack/head.rb:9:in `call'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/showexceptions.rb:21:in `call'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1272:in `block in call'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1303:in `synchronize'
/.rbenv/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1272:in `call'
/.rbenv/lib/ruby/gems/1.9.1/gems/rack-1.3.3/lib/rack/handler/webrick.rb:59:in `service'
/.rbenv/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
/.rbenv/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
/.rbenv/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'
</pre>

<p>Because we have a ton of important information in that repository, if it became corrupt that would be a bad thing! Not being able to rely on an internal system of documentation is a big deal, so I needed to get to the bottom of the issue.</p>

<h2>Step 1 &#8211; The Googles!</h2>

<p>Obviously finding a solution to the problem is much easier, and faster than trying to track it down myself. The first search result on the string <code>Grit::GitRuby::Internal::LooseObjectError - size mismatch</code> turned up the following page: <a href="https://github.com/mojombo/grit/issues/65">https://github.com/mojombo/grit/issues/65</a> and the <a href="https://github.com/mojombo/grit/issues/65#issuecomment-1113730">first comment</a> on the issue looked similar to my issue:</p>

<blockquote>
This is already fixed in master, installing the current master branch fixes the issue:<br />
https://github.com/mojombo/grit/commit/593f6cae465aa6d4b089cede8dc0cd8c4b5fe6cc<br />
<br />
I also opened a ticket for gollum: https://github.com/github/gollum/issues/147
</blockquote>

<p>
Following that link to the <a href="https://github.com/github/gollum/issues/147">gollum</a> repository I got a bug report about Umlaut (UTF-8) characters causing the issue. That certainly wasn&#8217;t my issue since the string that was breaking my repository was this:
</p>

<blockquote>
    * [[Meta-programming in Ruby: It’s All About the Self|http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/]]
</blockquote>

<p>
So what I had was a potential solution for the problem I was experiencing.
</p>

<h2>Step 2 &#8211; Applying the Fix</h2>

<p>
Now this was a really small fix, and I would prefer not to update Grit until the gollum team pulled the changes into the gollum repository and I also don&#8217;t know for sure if this patch was going to solve my issue. So instead I opened up the gem and added the patch myself. You can rake me over the coals later for this unsafe practice if you like.
</p>

<p>
This last year I took Marc-André Cournoyer&#8217;s awesome <a href="http://owningrails.com/">Owning Rails Course</a> where he taught me about the useful <a href="https://github.com/lmarlow/gemedit">gemedit</a> gem. With gemedit you can open up gem code quickly and easily into your favorite text editor. It&#8217;s really a brilliant piece of work for quickly diving into gem code, and allows you to explore, poke, and prod at the code on your box.
</p>

<p>
So if you don&#8217;t have it <code>gem install gemedit</code> will get it installed on your machine. Then you could run the command:
</p>

<pre class="brush: bash; title: ; notranslate">
gem edit grit
</pre>

<p>
Whichever editor you have setup in your GEMEDITOR, BUNDLER_EDITOR, VISUAL or EDITOR environment variable will load with a tree of the grit source. I use vim and have nerdtree installed so this works nicely &#8211; not sure if it works without nerdtree.
</p>

<p>
I navigated to <code>lib/grit/git-ruby/internal/loose.rb</code>, and made the 5 changes from <code>length</code> to <code>bytesize</code> which was in the <a href="https://github.com/mojombo/grit/commit/593f6cae465aa6d4b089cede8dc0cd8c4b5fe6cc">patch</a> referenced earlier. Super easy. Save the document, and the gem has been modified.
</p>

<p>
At this point I restarted the gollum server so that it could pick up the gem changes. I then pasted in my offending reference to Yehuda Katz, and saved the wiki post. No Error!
</p>

<p>
And there you have it, a quick and easy application of <code>gemedit</code>, and how it can be used to patch a gem.
</p><img src="http://feeds.feedburner.com/~r/rti-blog/~4/mx_c7OWcMGE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/how-to-make-gem-patches-with-gem-edit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/how-to-make-gem-patches-with-gem-edit/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-make-gem-patches-with-gem-edit</feedburner:origLink></item>
		<item>
		<title>Listify</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/4czlVhKEHvk/</link>
		<comments>http://randomtype.ca/blog/listify/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 19:42:53 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=738</guid>
		<description><![CDATA[Working on our latest Sinatra project, I came across the need to turn an array of words into a list &#8230; <a href="http://randomtype.ca/blog/listify/">Continued</a>]]></description>
			<content:encoded><![CDATA[Working on our latest Sinatra project, I came across the need to turn an array of words into a list to plug into a sentence. I like to crib Rails code whenever possible, because the project has a ton of <a href="http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html">useful extensions</a> for this type of task, however I couldn&#8217;t find anything that exists for turning arrays into an English style list. So for that I came up with <strong>listify</strong>!

<pre class="brush: ruby; title: ; notranslate">
class Array
  def listify
    length &lt; 2 ? first.to_s : &quot;#{self[0..-2] * ', '} and #{last}&quot;
  end
end
</pre>

<strong>Listify</strong> is an extension to Ruby&#8217;s Array class, and it will take an array of words, and turn them into a human readable list, along with the proper grammatical conventions as put forth by <a href="http://www.bartleby.com/141/">William Strunk</a>. Usage is thusly:

<pre class="brush: ruby; title: ; notranslate">
[&quot;dave&quot;].listify
#=&gt; &quot;dave&quot;

[&quot;dave&quot;, &quot;bill&quot;].listify
#=&gt; &quot;dave and bill&quot;

[&quot;dave&quot;, &quot;bill&quot;, &quot;murray&quot;].listify
#=&gt; &quot;dave, bill, and murray&quot;
</pre>

<p>
<strong>Update</strong> &#8211; Turns out that I didn&#8217;t look hard enough in Rails. Rails has a method called <a href="https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/array/conversions.rb#L11">to_sentence</a> which accomplishes the same end as noted above. The Rails version is great if you&#8217;re working in a Rails environment, or if you want to bring ActiveSupport into your project as a dependency.
</p>

<p>
<strong>Update 2</strong> &#8211; Peter Cooper pointed out that my Stunk usage was incorrect for two commas, and added a nice little golf solution. I&#8217;ve updated the post to reflect this feedback. Thanks everyone for the constructive criticism!
</p>
<img src="http://feeds.feedburner.com/~r/rti-blog/~4/4czlVhKEHvk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/listify/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/listify/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=listify</feedburner:origLink></item>
		<item>
		<title>The WordPress .htaccess File Explained</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/ZVQcRnNQNwk/</link>
		<comments>http://randomtype.ca/blog/the-wordpress-htaccess-file-explained/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 16:33:17 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=711</guid>
		<description><![CDATA[As of WordPress 3.0 to create pretty permalinks you need to use the following .htaccess file: It&#8217;s easy to cargo &#8230; <a href="http://randomtype.ca/blog/the-wordpress-htaccess-file-explained/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>As of WordPress 3.0 to create pretty permalinks you need to use the following <code>.htaccess</code> file:</p>

<pre class="brush: bash; gutter: true; title: ; notranslate">
# BEGIN WordPress
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
&lt;/IfModule&gt;
# END WordPress
</pre>

<p>It&#8217;s easy to <a href="http://en.wikipedia.org/wiki/Cargo_cult_programming">cargo cult</a> this change, and simply paste the code into your own <code>.htaccess</code> file. And I want to make it easy for you to paste that code into your <code>.htaccess</code>. The goal of this post is to examine what the <code>.htaccess</code> rules are doing, and why they&#8217;re doing it. With information like that, you can make better decisions around your site. So let&#8217;s break this down line by line.</p>

<h2>Line 1:</h2>

<pre class="brush: bash; title: ; notranslate">
# BEGIN WordPress
</pre>

<p>It&#8217;s a comment. Easy.</p>

<p>And that wraps up this post. Thanks everyone, click the links below to see Part 2, 3, 4, 5, 6 of the series so that we can get more page views and sell more ads!</p> 

<p>No wait, that would be a dumb thing to do&#8230; so let&#8217;s continue instead.</p>

<h2>Line 2:</h2>

<pre class="brush: bash; title: ; notranslate">
&lt;IfModule mod_rewrite.c&gt;
</pre>

<p>
<a href="http://httpd.apache.org/docs/2.0/mod/core.html#ifmodule"><code>IfModule</code></a> is a test that occurs within Apache, and it tests whether the <code>mod_rewrite.c</code> module is included in Apache. If <code>mod_rewrite.c</code> is included the code between <code>&lt;IfModule&gt;</code> and <code>&lt;/IfModule&gt;</code> is run. If <code>mod_rewrite.c</code> isn&#8217;t included the code within the if statements doesn&#8217;t get run.
</p>

<h2>Line 3:</h2>

<pre class="brush: bash; title: ; notranslate">
RewriteEngine On
</pre>

<p>
<a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteengine"><code>RewriteEngine On</code></a> tells Apache to turn on its Rewrite Rules. That&#8217;s all there is to this rule. Also, if you want to turn off all of your rules at once set the value to <code>off</code>.
</p>

<h2>Line 4:</h2>

<pre class="brush: bash; title: ; notranslate">
RewriteBase /
</pre>

<p>
<a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase"><code>RewriteBase</code></a> is a bit trickier because it affects how your other rules work, and it&#8217;s not immediately intuitive how it works.
</p>

<p>
When a url comes into Apache it looks something like this:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>randomtype.ca/blog/wordpress-htaccess-explained</code>
</p>

<p>
Before the url hits the rewrite rules, the domain name, and leading slash are stripped from the url:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>blog/wordpress-htaccess-explained</code>
</p>

<p>
At this point, the url is run through all of the rewrite rules that you&#8217;ve specified, and changed accordingly.
</p>

<p>
Once those steps have been completed, the <code>RewriteBase</code> rule is applied. In the case of WordPress that line is <code>RewriteBase /</code>, so the leading slash is added to the url:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<code>/blog/wordpress-htaccess-explained</code>
</p>

<p>
Because the WordPress <code>RewriteBase</code> uses just a forward slash, it doesn&#8217;t look like <code>RewriteBase</code> does a whole lot. So let&#8217;s expand with an example. Here&#8217;s an <code>.htaccess</code> file that has had it&#8217;s <code>RewriteBase</code> changed:
</p>

<pre class="brush: bash; title: ; notranslate">
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /blog

RewriteRule ^blog/wordpress-htaccess-explained$ post-12.html
&lt;/IfModule&gt;
</pre>

<p>
Now if you were to access the url <code>randomtype.ca/blog/wordpress-htaccess-explained</code>, Apache would perform the following steps:
</p>

<ol>
  <li>Strip the domain, and leading slash and pass the following path to the rewrite rules: <code>blog/wordpress-htaccess-explained</code></li>
  <li>Apply the rewrite rules
    <ul>
      <li>In the example, the single rule matches, and the path becomes <code>post-12.html</code></li>
    </ul>
  </li>
  <li>Apply the RewriteBase rule to the path to create a path of: <code>/blog/post-12.html</code>
    <ul>
      <li>Apache adds in the forward slash between <code>blog</code> and <code>post-12.html</code></li>
      <li>Alternatively, you could write <code>RewriteBase /blog</code> as <code>RewriteBase /blog/</code> which would accomplish the same thing.</li>
    </ul>
  </li>
  <li>Apache then looks for the content at <code>/blog/post-12.html</code> on the file system.</li>
  <li>Assuming the content is found the url <code>randomtype.ca/blog/wordpress-htaccess-explained</code> serves up the physical file from <code>/blog/post-12.html</code></li>
</ol>

<p>
It took me awhile to get my head around how <code>RewriteBase</code> works, especially because the apache documentation isn&#8217;t crystal clear on that point. You&#8217;ll not use it very frequently, but at least now you have an idea of what it does.
</p>

<h2>Line 5:</h2>

<p>
Empty &#8211; it does nothing &#8211; So easy!
</p>

<h2>Line 6:</h2>

<pre class="brush: bash; title: ; notranslate">
RewriteRule ^index\.php$ - [L]
</pre>

<p>
Now we can get to the meat of the <code>.htaccess</code> file &#8211; the RewriteRules. This particular rule is easy to understand: if the path is <code>index.php</code> then perform no replacement (that&#8217;s what the dash means), and exit out of the apache rewrite loop. 
</p>

<p>
The final part of the rule <code>[L]</code> tells Apache to stop processing any remaining rules.
</p>

<p>
While this rule may seem silly, hang on to it in the back of your mind, because we&#8217;ll come back around to it.
</p>

<h2>Line 7:</h2>

<pre class="brush: bash; title: ; notranslate">
RewriteCond %{REQUEST_FILENAME} !-f
</pre>

<p>
This rewrite conditional uses a couple of special values, <code>%{REQUEST_FILENAME}</code> is a variable based upon the url you request, and <code>!-f</code> is an apache specific extension added to the regular expression language.
</p>

<p>
Let&#8217;s use an example for what the output of <code>%{REQUEST_FILENAME}</code> might look like. Let&#8217;s hit the webpage <code>randomtype.ca/test_page.html</code>. Within apache the value of <code>%{REQUEST_FILENAME}</code> gets set to reflect the physical filepath for our request. When I tested this on our servers the value came out like this: <code>/mnt/stor0-wc0-dfw0/123456/randomtype.ca/test_page.html</code>.
</p>

<p>
The second part of the <code>RewriteCond</code> would typically be a regular expression, however Apache provides some extensions that are being used. The first character &#8211; the exclamation mark (!) &#8211; is a negation. The second part <code>-f</code> asks whether the test string (in this case <code>%{REQUEST_FILENAME}</code>) exists or not on the file system.
</p>

<p>
Taken together this <code>RewriteCond</code> makes the following check:
</p>

<blockquote>
  If a file, taken from the variable %{REQUEST_FILENAME} does not exist on the file system, then return true.
</blockquote>

<p>
Now <code>RewriteCond</code> is a cumulative rule. That is, you can&#8217;t just have a <code>RewriteCond</code>, you also have to have a <code>RewriteRule</code>. In this case the next line (Line 8) is another <code>RewriteCond</code>, so what happens then? 
</p>

<p>
What happens is that the two conditions are combined together with a logical <code>AND</code>, and then the <code>RewriteRule</code> is applied when the two conditions are met.
</p>

<h2>Line 8:</h2>

<pre class="brush: bash; title: ; notranslate">
RewriteCond %{REQUEST_FILENAME} !-d
</pre>

<p>
Line 8 is almost identical to Line 7. But instead uses the <code>-d</code> special case, instead of the <code>-f</code>. The <code>-d</code> asks whether the path it is given is a directory or not.
</p>

<p>
So in plain english:
</p>

<blockquote>
  If a directory, taken from the variable %{REQUEST_FILENAME} does not exist on the file system, then return true.
</blockquote>

<h2>Line 9:</h2>

<pre class="brush: bash; title: ; notranslate">
RewriteRule . /index.php [L]
</pre>

<p>
This rewrite rule says that every request that goes to your website should be rewritten to instead go to <code>/index.php</code>. A little bit greedy huh!? Now of course Line 7 and Line 8 come into play here, and if the conditions aren&#8217;t met, then <code>/index.php</code> isn&#8217;t used.
</p>

<p>
Overall, the 3 lines combine to make the plain english statement:
</p>

<blockquote>
  If the variable %{REQUEST_FILENAME} does not exist as a file on the file system <strong>and</strong>
  if the variable %{REQUEST_FILENAME} does not exist as a directory on the file system,
  <strong>then</strong> send the request to /index.php
</blockquote>

<p>
So what happens if <code>%{REQUEST_FILENAME}</code> exists on the file system as a directory or file? Well then this rule isn&#8217;t applied, and the file is served. 
</p>

<p>
For example when you make a request to the RANDOMTYPE website, the html also tells you to download our favicon with the path: <code>http://randomtype.ca/cms/img/rti-favicon.png</code>. If those two conditionals didn&#8217;t exist, then the request would instead be sent to <code>/index.php</code> and you wouldn&#8217;t get our favicon.
</p>

<p>
The cool thing about the WordPress <code>/index.php</code> file is that it picks up what the original url was, and displays a dynamic page for your website. Which is why pretty permalinks work in the first place.
</p>

<p>
Once again the <code>[L]</code> rule tells apache to stop processing rules.
</p>

<p>
Now let&#8217;s back up the boat a little bit and return to Line 6. What&#8217;s the point in having a such a simple rule. Well it turns out that <strong><code>[L]</code> does not stop rule processing</strong>, instead Apache skips the remaining rules on its current pass. Then Apache starts another pass from the top of the <code>.htaccess</code> file, and starts reapplying rules. Line 6 exists to pop apache out of that loop, and prevent Line 9 from being re-ran. The exact details can be found <a href="http://digwp.com/2011/01/new-htaccess-permalink-rules/#comment-15831">here</a>.
</p>

<h2>Line 10:</h2>

<p><code>&lt;/IfModule&gt;</code> simply closes the if statement that was started on Line 2.</p>

<h2>Line 11:</h2>

<p>Another comment!</p>

<p>
And that&#8217;s it. A full explanation of the WordPress htaccess file.
</p><img src="http://feeds.feedburner.com/~r/rti-blog/~4/ZVQcRnNQNwk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/the-wordpress-htaccess-file-explained/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/the-wordpress-htaccess-file-explained/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-wordpress-htaccess-file-explained</feedburner:origLink></item>
		<item>
		<title>Installing rbenv Outside the $HOME Directory</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/BeHl0p1pWqE/</link>
		<comments>http://randomtype.ca/blog/installing-rbenv-outside-the-home-directory/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 15:29:16 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[rbenv]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=631</guid>
		<description><![CDATA[Recently, I went through the process of installing rbenv outside of my user directory (on a server to be specific.) &#8230; <a href="http://randomtype.ca/blog/installing-rbenv-outside-the-home-directory/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>Recently, I went through the process of installing <a href="https://github.com/sstephenson/rbenv">rbenv</a> outside of my user directory (on a server to be specific.) It wasn&#8217;t a difficult task, but I hit a snag or two trying to figure it out. Since I won&#8217;t be the first or last person to do this, I&#8217;ve put together these instructions to <strong>install rbenv outside of your user directory</strong>. I&#8217;ve chosen to use root as the installation location, but <code>/ruby-directory-of-awesome/sstephenson-makes-great-code</code> would also suffice, if you so desired.</p>

<p>And before we get started, if you&#8217;re unfamiliar with rbenv, be sure to have a read through the <a href="https://github.com/sstephenson/rbenv#section_1">documentation</a>.</p>

<h2>Step 1: Install rbenv &#8211; Part A</h2>

<ol>
  <li>From your terminal clone rbenv into <code>/.rbenv</code>
<pre class="brush: bash; title: ; notranslate">
$ cd /
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
</pre>
  </li>
  <li>Add <code>/.rbenv/bin</code> to your <code>$PATH</code> for access to the rbenv command-line utility.
<pre class="brush: bash; title: ; notranslate">
$ cd ~
$ echo 'export PATH=&quot;/.rbenv/bin:$PATH&quot;' &gt;&gt; .bash_profile
</pre>
  </li>
  <li>Redefine the rbenv installation path &#8211; this is the meat and potatoes here:
<pre class="brush: bash; title: ; notranslate">
$ echo 'export RBENV_ROOT=&quot;/.rbenv&quot;' &gt;&gt; .bash_profile
</pre>
  </li>
  <li>Setup rbenv to manage the <strong>shims</strong> directory addition into your <code>$PATH</code>.
<pre class="brush: bash; title: ; notranslate">
$ echo 'eval &quot;$(rbenv init -)&quot;' &gt;&gt; .bash_profile
</pre>

  <em>=> In the case of a server, steps 2-4 would need to be done for any users that need access to the Ruby install.</em>
  </li>
  <li>Restart your shell by logging out, and back into the ssh session.<br />
    <strong>NOTE: rbenv isn&#8217;t completely installed yet, we first need to install a version of Ruby using ruby-build.</strong>
  </li>
</ol>

<h2>Step 2: Install ruby-build</h2>

<ol>
  <li>Run the following commands in terminal:
<pre class="brush: bash; title: ; notranslate">
$ cd ~
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ ./install.sh
</pre>
  </li>
  <li>Remove ruby-build files:
<pre class="brush: bash; title: ; notranslate">
$ cd ~
$ rm -r ruby-build/
</pre>
  </li>
  <li>Install Ruby 1.9.2:
<pre class="brush: bash; title: ; notranslate">
$ ruby-build 1.9.2-p290 /.rbenv/versions/1.9.2-p290
</pre>
  </li>
</ol>

<h2>Step 3: Install rbenv &#8211; Part B</h2>

<strong>Do not start this step unless you have installed a version of Ruby.</strong>

<ol>
  <li>Rebuild your shims. You should do this any time you install a new Ruby binary (for example, when installing a new Ruby version, or when installing a gem that provides a binary).
<pre class="brush: bash; title: ; notranslate">
$ rbenv rehash
</pre>
  </li>
  <li>Set a global Ruby version
<pre class="brush: bash; title: ; notranslate">
$ rbenv global 1.9.2-p290
</pre>
  </li>
  <li>Verify successful Ruby/rbenv installation:
<pre class="brush: bash; title: ; notranslate">
$ ruby --version 
</pre>
If you&#8217;ve done everything correctly, this will return 1.9.2
  </li>
</ol>

And that&#8217;s it &#8211; you&#8217;ve got a complete install of rbenv outside of the $HOME directory.<img src="http://feeds.feedburner.com/~r/rti-blog/~4/BeHl0p1pWqE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/installing-rbenv-outside-the-home-directory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/installing-rbenv-outside-the-home-directory/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=installing-rbenv-outside-the-home-directory</feedburner:origLink></item>
		<item>
		<title>Other Blogs We Write On</title>
		<link>http://feedproxy.google.com/~r/rti-blog/~3/oU2-_RltF1Q/</link>
		<comments>http://randomtype.ca/blog/other-blogs-we-write-on/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 16:34:22 +0000</pubDate>
		<dc:creator>Gavin Miller</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://randomtype.ca/?p=545</guid>
		<description><![CDATA[In addition to the writing here on the RANDOMTYPE blog, I&#8217;ve been doing writing for a couple of other websites, &#8230; <a href="http://randomtype.ca/blog/other-blogs-we-write-on/">Continued</a>]]></description>
			<content:encoded><![CDATA[<p>In addition to the writing here on the RANDOMTYPE blog, I&#8217;ve been doing writing for a couple of other websites, namely <a href="http://rubysource.com/">RubySource</a> and <a href="http://www.yycapps.com/">yycApps</a>. Both sites are fantastic and you should check them out! </p>
<p>For RubySource I did a 5 part series on switching from .NET to Ruby:</p>
<ul>
<li><a href="http://rubysource.com/net-to-ruby-the-ruby-environment/">.NET to Ruby: The Ruby Environment</a></li>
<li><a href="http://rubysource.com/net-to-ruby-classes/">.NET to Ruby: Classes</a></li>
<li><a href="http://rubysource.com/net-to-ruby-methods-and-variables/">.NET to Ruby: Methods and Variables</a></li>
<li><a href="http://rubysource.com/net-to-ruby-namespacing-naming-conventions-comments-documentation/">.NET to Ruby: Namespacing, Naming Conventions, Comments &#038; Documentation</a></li>
<li><a href="http://rubysource.com/net-to-ruby-types/">.NET to Ruby: Types</a></li>
</ul>
<p>For yycApps I&#8217;ve written the following articles:</p>
<ul>
<li><a href="http://www.yycapps.com/2011/07/creating-a-keyboard-show-hide-button/">Creating a Keyboard Show Hide Button</a></li>
<li><a href="http://www.yycapps.com/2011/06/a-review-of-broken-kings-dirt/">A Review of Broken Kings’ Dirt</a></li>
<li><a href="http://www.yycapps.com/2011/04/testing-to-touch-success/">Testing to Touch Success</a></li>
<li><a href="http://www.yycapps.com/2011/03/making-the-iphone-responsive-to-a-users-touch/">Making the iPhone Responsive to a User’s Touch</a></li>
<li><a href="http://www.yycapps.com/2011/01/how-to-build-a-2x2-uitableview-grid/">How to Build a 2×2 UITableView Grid</a></li>
</ul>
<p>As I write more articles elsewhere on the web I&#8217;ll link to them from this page. As well, I will continue to write on this blog, so sign up for our <a href="http://feeds.feedburner.com/blog-randomtype">RSS feed</a>, or follow <a href="http://twitter.com/randomtype">@randomtype</a> for tweets on when our articles are posted. </p>
<img src="http://feeds.feedburner.com/~r/rti-blog/~4/oU2-_RltF1Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://randomtype.ca/blog/other-blogs-we-write-on/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://randomtype.ca/blog/other-blogs-we-write-on/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=other-blogs-we-write-on</feedburner:origLink></item>
	</channel>
</rss>

