<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>the evolving ultrasaurus</title>
	<atom:link href="http://www.ultrasaurus.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ultrasaurus.com</link>
	<description>Sarah Allen's reflections on internet software and other topics</description>
	<lastBuildDate>Sun, 21 Feb 2010 16:56:26 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>the truth about mobile development</title>
		<link>http://www.ultrasaurus.com/sarahblog/2010/02/the-truth-about-mobile-development/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2010/02/the-truth-about-mobile-development/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 16:56:26 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2411</guid>
		<description><![CDATA[For my talk at LA RubyConf, I decided to share some truths about mobile development, in general, rather than focusing only on how it is different with Ruby using the Rhomobile platform.
The truth is that mobile development sucks.  With Ruby, sometimes it sucks less.  The unavoidable problem is that at the end of [...]]]></description>
			<content:encoded><![CDATA[<p>For my talk at <a href="http://www.larubyconf.com/">LA RubyConf</a>, I decided to share some truths about mobile development, in general, rather than focusing only on how it is different with Ruby using the <a href="http://rhomobile.com/">Rhomobile</a> platform.</p>
<p>The truth is that mobile development sucks.  With Ruby, sometimes it sucks less.  The unavoidable problem is that at the end of the process you still need to get your app on the device using cruddy development tools reminiscent of the 1990s.  I likened mobile developers to people who like to get tattooed.  Perhaps some are thrilled by the painful process, but most endure it to achieve the end effect.  Mobile applications are compelling, wonderful expressions of some practical problem solved that you can carry around in your pocket.  Despite the often frustrating and stupid steps that I need to follow to get things done, I love what I can build as a mobile developer.  </p>
<p>Rhomobile is steadily normalizing some of the process to smooth out the cross-platform differences using tools and techniques from Ruby, which I discussed at the end.  My talk reviewed the development process backwards, starting with the user experience, reviewing what it takes to distribute the app and build it for distribution, then finally reviewing the code (<a href="http://github.com/blazingcloud/rhodes_rubyconf">posted on github</a>).  I posted links to the app for <a href="http://blazingcloud.net/mobile/">iPhone and BlackBerry</a>.  </p>
<p>The key point on the user experience is that mobile apps should be different on each device, but those differences should be superficial.  It is essential that your app use the common UI patterns that users of that device expect, but the core of your app has to do with the problem you are solving and that should be consistent across devices.  For the RubyConf app, those device-specific differences were the navigation.  On iPhone, there&#8217;s a tabbar across the bottom.  On Android, there is also a tabbar that has a slightly different look and is positioned across the top.  On BlackBerry, these navigation options appear in a menu.  The user of each device would find the navigation expected, since it is consistent with how other apps look and feel on that device.  Meanwhile, most of the screens are identical across the app.  I didn&#8217;t discuss the map implementation which is almost the same across devices &#8212; of course, it always looks like a map with markers, but the markers have a different visual representation and the pan/zoom controls are different.  </p>
<p>The other point about user experience, which is not expressed by the RubyConf app, since it is really a work-in-progress, is that your branding should be consistent across platforms.  Mobile apps have more in common with web applications than they do with desktop applications.  On the web, your brand is integrated into your application UI.  I expect that to be the common pattern for mobile applications as well.</p>
<p>The process of building, signing and distributing the app is quite different cross-platform.  It is really hard without actually doing it to get a feel for what it takes and how long it takes to do this on each platform.  The documentation is scattered and hard to follow even for a single vendor.  One of the goals of my <a href="http://apress.com/book/view/9781430228684">upcoming book</a> is to pull together this information and help people understand what is common across platforms and what is consistent. In this talk, I gave a lightning-speed overview of the process on iPhone, BlackBerry and Android.</p>
<p>The slides for the talk don&#8217;t really stand alone, but I am posting them here for reference:</p>
<div style="width:425px;text-align:left" id="__ss_3235188"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/sarah.allen/mobile-ruby-la-rubyconf" title="Mobile Ruby, LA RubyConf">Mobile Ruby, LA RubyConf</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=larubyconf-100220215827-phpapp02&#038;stripped_title=mobile-ruby-la-rubyconf" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=larubyconf-100220215827-phpapp02&#038;stripped_title=mobile-ruby-la-rubyconf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/sarah.allen">Sarah Allen</a>.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2010/02/the-truth-about-mobile-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>agile development in action</title>
		<link>http://www.ultrasaurus.com/sarahblog/2010/02/agile-development-in-action/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2010/02/agile-development-in-action/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 17:41:30 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2395</guid>
		<description><![CDATA[I don&#8217;t know who first said that if you aren&#8217;t embarrassed about your v1 product, you waited too long to ship.  At Mightyverse, we repeated that to ourselves as we struggled to release the first version of our iPhone app.  After 2 weeks, we hit 128 downloads and I enjoyed reading my co-founder, [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t know who first said that if you aren&#8217;t embarrassed about your v1 product, you waited too long to ship.  At <a href="http://www.mightyverse.com">Mightyverse</a>, we repeated that to ourselves as we struggled to release the first version of our <a href="http://itunes.apple.com/us/app/mightyverse/id345713026?mt=8">iPhone app</a>.  After 2 weeks, we hit 128 downloads and I enjoyed reading my co-founder, Paul Lundahl&#8217;s <a href="http://blog.mightyverse.com/2010/02/mightyverse-iphone-app-hits-128-downloads/">reflection on the process</a>.  Despite our misgivings, we continue to explore the painful edge of what may not yet be a minimally viable product.</p>
<p>Why do I persist in this belief that we are pursuing the right methodology when the release of this marginally useful app means that many early users may be frustrated and never come back?</p>
<ul>
<li>A mobile startup without a mobile app hasn&#8217;t reached the starting gate.  At least now, we have a demo that anyone can see.  No matter how many times I tell people that Mightyverse allows you to access native language video recordings, when I show the app half the people say &#8220;oh, so you are using video!&#8221;  When you are introducing a new concept, people only hear half of what you say.  Even when we speak the same native language, communication is hard.</li>
<li>We are learning a lot from the app and the process.  Now we know that we can get through the Apple App Store process.  We understand the limitations of the iPhone video APIs.  With a version of the iPhone app released we can consider whether another platform will allow us to create a better user experience, while still leveraging our early iPhone work to maintaining a presence on that platform.</li>
<li>This open approach allows us to move more quickly toward our goals than traditional methodologies. Even if we are a bit embarrassed, we are also very excited.  We are learning how to work together effectively to balance content and software development.  We know that our 23,721 video recordings represent just a droplet of language and our software does not yet provide features which support any use case particularly well.  Working in collaboration with language enthusiasts and other early adopters we have developed a process of continuous course corrections.</li>
<li>Having an audience leads us to make hard decisions quickly and perform crisply.  Since the audience is small, we are comfortable experimenting and allowing forward motion with a post-hoc review process.  Moving quickly unleashes creativity. The process is inexplicably fun.</li>
<li>Lastly, I expect that the people who will discover Mightyverse in the future will vastly outnumber the people who will use it now, so I am ok risking their displeasure.  In fact, if we actually manage to stumble upon some people who hate it, perhaps that is an <a href="http://500hats.typepad.com/500blogs/2010/02/with-apologies-to-kathy-sierra.html">opportunity</a>.</li>
<p>So, if you have an iPhone, download the app, join our experiment, and let us know what you think.  After all, where else can you learn to say &#8220;<a href="http://www.mightyverse.com/media/62d26c96-5955-46f5-89ab-18e98db7755c">I&#8217;m sorry.  I speak the Japanese of a pre-schooler</a>&#8221; ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2010/02/agile-development-in-action/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rails security review checklist</title>
		<link>http://www.ultrasaurus.com/sarahblog/2010/01/rails-security-review-checklist/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2010/01/rails-security-review-checklist/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 08:00:12 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2378</guid>
		<description><![CDATA[I&#8217;m reviewing the security of a web app built with Ruby on Rails, so I put together a checklist for a security audit.  This isn&#8217;t a bank or high security situation, but there were a number of engineers and quite a bit of open source code, so I thought a few checks were in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m reviewing the security of a web app built with Ruby on Rails, so I put together a checklist for a security audit.  This isn&#8217;t a bank or high security situation, but there were a number of engineers and quite a bit of open source code, so I thought a few checks were in order.</p>
<p>Here&#8217;s the list I came up with that I thought other folks might appreciate as a starting point (special thanks to the sfruby list, <a href="http://afreshcup.com/">Mike Gunderloy</a>, and Scott Bronson for feedback):</p>
<p>0) Make sure your Rails and gems are up to date for latest security patches (see <a href="http://groups.google.com/group/rubyonrails-security">rails security mailing list</a> for recent advisory notes)</p>
<p>1) Active Record audit:<br />
&nbsp;&nbsp;A) SQL injection:<br />
&nbsp;&nbsp;&nbsp;&nbsp;(i) whole word search for &#8220;find&#8221;, &#8220;first&#8221;, and &#8220;all&#8221; then visually inspect all instances of ActiveRecord find calls for potential SQL injection vulnerability (also search for &#8220;sql&#8221; not whole work search to find find_by_sql and &#8220;execute&#8221; to find cases where raw sql is executed.<br />
&nbsp;&nbsp;&nbsp;&nbsp;(ii) search your models for &#8220;named_scope&#8221; and check :conditions<br />
&nbsp;&nbsp;B) check for <a href="http://railspikes.com/2008/9/22/is-your-rails-application-safe-from-mass-assignment">mass assignment</a>  Either disable mass assignment as Eric suggests in his article, or audit its use.  If doing an audit, check every model to make sure it declares which attributes are settable with attr_accessible.  (While attr_protected may technically work, a white list approach is recommended by security experts and the <a href="http://groups.google.com/group/rubyonrails-security/browse_thread/thread/42c4d5d3b7354735">rails security advisory</a> on this topic)</p>
<p>2) Scripting attack: search all eRB files for &lt;%= and ensure that if dynamically generated text was originally entered by the user, it is HTML escaped. Consider <a href="http://github.com/nzkoz/rails_xss">rails_xss</a></p>
<p>3) Secure Access: If some of the site does not have public access, check controllers and ensure that public actions are specifically allowed and that protected access is the default</p>
<p>4) search for &#8220;eval&#8221; (whole word) and verify that  usages are safe (assume javascript eval is ok)</p>
<p>5) search for &#8220;forgery&#8221; (not whole word), make sure that<br />
config.action_controller.allow_forgery_protection    = false<br />
is only disabled in test config<br />
 protect_from_forgery should be in the ApplicationController, unless there is a good reason for it not to be</p>
<p>6) check user auth and review that controller actions are limited to expected use</p>
<p>7) passwords: not saved as clear-text in the db, not logged</p>
<p>8) check that private data is not stored in cookies </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2010/01/rails-security-review-checklist/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>must we be arrogant jerks?</title>
		<link>http://www.ultrasaurus.com/sarahblog/2010/01/must-we-be-arrogant-jerks/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2010/01/must-we-be-arrogant-jerks/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 04:13:03 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2356</guid>
		<description><![CDATA[Much of Clay Shirky&#8217;s recent rant about women rang true to me.  However, it took me much of the day, including talking with my friend Val Liberty to figure out what felt off about his rant.  Over a whole day of dog walking, chatting over coffee and monopoly with the kids, we spent [...]]]></description>
			<content:encoded><![CDATA[<p>Much of Clay Shirky&#8217;s <a href="http://www.shirky.com/weblog/2010/01/a-rant-about-women/">recent rant about women</a> rang true to me.  However, it took me much of the day, including talking with my friend <a href="http://twitter.com/balsamiqval">Val Liberty</a> to figure out what felt off about his rant.  Over a whole day of dog walking, chatting over coffee and monopoly with the kids, we spent about 5 minutes talking about Clay&#8217;s post, but our talk colored my thinking about it.  We covered gender issues, success, humility, and diversity, along with tech talk and business plans. </p>
<p>I know there are many paths to success.  I routinely meet and do business with successful people who value integrity and honest communication.  <a href="http://twitter.com/balsamiq">Peldi Guilizzoni</a>, founder and CEO of Balsamiq, has recently modeled how to become a huge success while being a genuinely nice guy (and perhaps partly because of it).  I know many other folks who have taken similar paths to success, though I don&#8217;t know anyone else who has documented it as thoroughly. </p>
<p>You don&#8217;t need to be an arrogant jerk to be confident.  It is not lying to state what you believe you can do, instead of merely what you have done in the past.  Clay Shirky clearly states the issue in the middle of his rant:</p>
<blockquote><p>&#8230;people who don’t raise their hands don’t get called on, and people who raise their hands timidly get called on less. Some of this is because assertive people get noticed more easily, but some of it is because raising your hand is itself a high-cost signal that you are willing to risk public failure in order to try something.</p></blockquote>
<p>However, he follows that by saying that it is a false hope &#8220;to imagine that women could be forceful and self-confident without being arrogant or jerky.&#8221;  I disagree.  Sure we have to <em>risk</em> being <em>perceived</em> as arrogant jerks (or some less pretty name).  Perception is seldom reality, and the reality we live rarely matches that of our male peers. We have to put up with being criticized as emotional when our colleagues are admired for their passion.  Nevertheless, we share the world and we need to figure this out.  We have to work together with our non-sexist peers to change what is acceptable&#8230; both by changing what people are used to seeing and hearing from women AND by modeling other ways to become successful.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2010/01/must-we-be-arrogant-jerks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>how to look for a job</title>
		<link>http://www.ultrasaurus.com/sarahblog/2010/01/how-to-look-for-a-job/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2010/01/how-to-look-for-a-job/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 23:47:16 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2343</guid>
		<description><![CDATA[I recently gave the following advice about looking for a job.  I thought maybe other folks would find it useful.  It&#8217;s kind of a next generation job search, it&#8217;s an expansion of what Ted Leung called Job Search 2.0.  

Write down your ideal job, then take a serious look at yourself and [...]]]></description>
			<content:encoded><![CDATA[<p>I recently gave the following advice about looking for a job.  I thought maybe other folks would find it useful.  It&#8217;s kind of a next generation job search, it&#8217;s an expansion of what Ted Leung called <a href="http://www.sauria.com/blog/2008/03/02/job-search-20/">Job Search 2.0</a>.  </p>
<ol>
<li>Write down your ideal job, then take a serious look at yourself and think whether you would hire yourself for it.  If not, what skills do you need to develop that would make you the ideal candidate for that job?</li>
<li>Write down a list of 5-10 companies you would love to work at.  I would argue that you don&#8217;t know if you would love to work there until you have had a genuine conversation with someone who works there or who has worked there recently.  If you don&#8217;t know 5 companies where you would love to work, then find them.</li>
<li>Write in your blog<a href="#start_a_blog">*</a> at least once a week about something in your field that would be interesting to a potential colleague at your dream company.</li>
<li>Figure out what are the relevant conference, local meetups or whatever for your target job.  Start attending those.  Consider whether you could propose giving a talk. If you don&#8217;t feel qualified, what can you do to while unemployed that would qualify you to give such a talk? Do it.</li>
<li>Tweet each blog post and about web articles you read in your field that are interesting.</li>
<li>Consider volunteering doing something altruistic that hones the skills required for your dream job.</li>
</ol>
<p>Be active in your field even if you don&#8217;t have a job.  If you keep honing your skills and your ability to communicate about them, two things will happen:</p>
<ol>
<li> You will know better what you want to do and who you want to do it with</li>
<li> Yur job will find you</li>
</ol>
<h2><a name="start_a_blog">If you don&#8217;t have a blog, start one</a></h2>
<p>You have something to say that no one else is saying.  Even if there is some repetition with what other people have said, that is ok.  I&#8217;m sure my blog is mediocre at times, but it is often excellent, and sometimes I don&#8217;t know when I write something whether it is old hat or new insight&#8230; sometimes it seems old to me since the idea has been rattling around my head for a while, but everyone else thinks it is amazing&#8230;. sometimes I think it is amazing, and everyone else ignores it.  Writing a blog has helped me figure out what I am passionate about.</p>
<p>In any case, your blog tells a public story about you and when you are seeking a job that is really important.  Also, there are less experienced people in your field who might really find what you have to say helpful.  It is both marketing and a public service.  Over time, google will find your resume more often on the front page of searches, and over time people reading your blog will think&#8230;. maybe this person is a fit for this position that has just gotten approved, maybe I should call him or her before I post the job.</p>
<p>Start by just writing a little bit about interesting stuff you&#8217;ve read.  Linking to other people&#8217;s writing on the Web invites them to read what you write (if they are following their referrers as most people do).  Some of those people will like your blog and come back or tell their friends or tweet about it. Eventually you will have a small following of people in your field who are interested in the same things you are. That is unique, compelling and powerful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2010/01/how-to-look-for-a-job/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>markdown to textile with vim regex</title>
		<link>http://www.ultrasaurus.com/sarahblog/2009/12/markdown-to-textile-with-vim-regex/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2009/12/markdown-to-textile-with-vim-regex/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 08:36:20 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2331</guid>
		<description><![CDATA[So, I needed to change markdown to textile and google didn&#8217;t yield any handy scripts, so I sharpened my vim fu with Rubular, my favorite regular expression tester and came up with a few substitutions that took care of everything but lists and code blocks.
In vi, type ESC to go into command mode, then :%s/one/two/g [...]]]></description>
			<content:encoded><![CDATA[<p>So, I needed to change markdown to textile and google didn&#8217;t yield any handy scripts, so I sharpened my vim fu with <a href="http://www.rubular.com/">Rubular</a>, my favorite regular expression tester and came up with a few substitutions that took care of everything but lists and code blocks.</p>
<p>In vi, type ESC to go into command mode, then :%s/one/two/g will find every instance of &#8220;one&#8221; and replace it with &#8220;two&#8221;</p>
<p>First the easy stuff, headers.  ^ finds the beginning of the line.</p>
<pre>
:%s/^# /h1. /g
:%s/^## /h2. /g
:%s/^### /h3. /g
</pre>
<p>To replace images, I needed to replace ![alt-text](link) with !link! so I needed to capture text.  I suppose I didn&#8217;t really need the first capture, but I was working on the replace expression for a regular link when I realized it would be easier to do the images first.  To understand the expression below, you need to know that \(stuff\) captures some text which can be inserted in the replacement text with \1 and \2, etc.  So to get everything between square brackets, I use [\(.*\)] </p>
<pre>
:%s/!\[\(.*\)](\(.*\))/!\2!/g
</pre>
<p>All of my images appeared on a single line, so I didn&#8217;t catch a potential issue in the above expression until I got to replacing text links.  I needed to use a non &#8220;greedy&#8221; capture so that I wouldn&#8217;t pull in text after the link that happened to include a parenthetical comment.  Normally, in reg ex I would use (.*?) but in vim I needed to write \(.\{-}\) &#8230;wtf?</p>
<pre>
:%s/\[\(.*\)](\(.\{-}\))/"\1":\2/g
</pre>
<p>Special thanks to Adam Wolf&#8217;s tip via <a href="http://www.sharegrove.com">ShareGrove</a> which helped me document these steps.</p>
<blockquote><p>you can put VIM in a mode where the <a href="http://vimdoc.sourceforge.net/htmldoc/cmdline.html#Command-line">command history</a> is just like another buffer. Not in insert mode, try q: </p></blockquote>
<blockquote><p>You should get a new buffer that you can edit with the command history in it, so &#8220;*yy would yank the current line into the system clipboard, etc.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2009/12/markdown-to-textile-with-vim-regex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ruby and rails classes in january</title>
		<link>http://www.ultrasaurus.com/sarahblog/2009/12/ruby-and-rails-classes-in-january/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2009/12/ruby-and-rails-classes-in-january/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 06:43:42 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2310</guid>
		<description><![CDATA[I&#8217;ve gotten a number of requests for follow-on training in San Francisco for Rails and the Ruby language, so here are some classes coming up in January.
Ruby on Rails class
Another Ruby on Rails training at Marakana is coming up January 19-22 &#8212; the deadline for early bird discount is Dec 29.  I was pleased to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve gotten a number of requests for follow-on training in San Francisco for Rails and the Ruby language, so here are some classes coming up in January.</p>
<h2>Ruby on Rails class</h2>
<p>Another <a href="http://marakana.com/training/ruby/ruby_on_rails.html?a=sarah">Ruby on Rails training at Marakana</a> is coming up January 19-22 &#8212; the deadline for early bird discount is Dec 29.  I was pleased to hear positive feedback from the test-first teaching approach:</p>
<blockquote><p>I really love the emphasis on test driven development and the use of tests as a way to move students along in exercises. This is definitely the way to teach. I highly commend you folks for doing it. It provided instant feedback on how successful my coding was, and provided a good guideline for successful coding in my profession. &#8212; Reed College</p></blockquote>
<blockquote><p>One thing Marakana did extremely well was provide unit tests with labs. This one technique alone will now represent the standard I hold all future training courses to. It made training more than learning, it made it about problem solving. It made learning fun. &#8212; Near Infinity</p></blockquote>
<p><strong>Scholarship</strong>. Marakana will again be offering a scholarship spot (deadline Jan 12). If you feel that your presence will increase diversity in the Ruby on Rails community and that taking this class could have a positive impact on your life and you would not otherwise be able to afford the class, please fill out <a onclick="javascript:pageTracker._trackPageview('/outbound/article/spreadsheets.google.com');" href="http://spreadsheets.google.com/viewform?formkey=dEdpay16SEJ0dWF4UUhFYUdvc1NDemc6MA">this short form</a>. Our decision on the candidate will balance your need, how much taking this course will have a beneficial effect and your potential impact on the community. Bonus points for bloggers and twitterers or people who otherwise spread their know-how.</p>
<h2>Ruby language class</h2>
<p>Liah Hansen and I will be teaching a new <a href="http://www.meetup.com/sfruby/calendar/12086083/">Ruby language class</a> which will be 6 weekly evening classes with homework assignments in between.  I didn&#8217;t set up a scholarship form for the Ruby language class, since it is less expensive, but would consider an application for this class as well &#8212; just add a note to the first field in the <a onclick="javascript:pageTracker._trackPageview('/outbound/article/spreadsheets.google.com');" href="http://spreadsheets.google.com/viewform?formkey=dEdpay16SEJ0dWF4UUhFYUdvc1NDemc6MA">form</a>.</p>
<p>If you sign up for both classes, we&#8217;ll give you a $200 discount on the Marakana class.</p>
<h2>Advanced Rails class</h2>
<p>Wolfram Arnold will be teaching an <a href="http://marakana.com/training/ruby/advanced_rails.html?a=sarah">advanced Rails class</a> on Jan 25-28, the week after my introductory class.  This will be a good companion to the first class or a way to sharpen your skills if you are already working with Rails.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2009/12/ruby-and-rails-classes-in-january/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fear stays silent while passion speaks</title>
		<link>http://www.ultrasaurus.com/sarahblog/2009/12/fear-stays-silent-while-passion-speaks/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2009/12/fear-stays-silent-while-passion-speaks/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 07:43:12 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2301</guid>
		<description><![CDATA[Cisco CTO, Padmasree Warrior, gave a thoughtful keynote speech for the Women of Vision event.  I watched part 1 in May.  Reminded by Anita Borg Institute&#8217;s Year in Review, I enjoyed watching part 2 and part 3.
She titled her talk: &#8220;fear stays silent while passion speaks,&#8221; which struck me as an important way [...]]]></description>
			<content:encoded><![CDATA[<p>Cisco CTO, Padmasree Warrior, gave a thoughtful keynote speech for the Women of Vision event.  I watched <a href="http://www.youtube.com/watch?v=EEfZSad_2J8&amp;feature=PlayList&amp;p=879E5215179979AF&amp;index=3">part 1</a> in May.  Reminded by <a href="http://www.fastcompany.com/blog/caroline-simard/advancing-women-technology/anita-borg-institute-year-review-telle-whitney-ceo">Anita Borg Institute&#8217;s Year in Review</a>, I enjoyed watching <a href="http://www.youtube.com/watch?v=9sED8zw4SGw&amp;feature=PlayList&amp;p=879E5215179979AF&amp;index=4">part 2</a> and <a href="http://www.youtube.com/watch?v=7y0J0a_N8S0&amp;feature=PlayList&amp;p=879E5215179979AF&amp;index=5">part 3</a>.</p>
<p>She titled her talk: &#8220;fear stays silent while passion speaks,&#8221; which struck me as an important way to talk about vision and about women in tech.  Although I do think a certain amount of fear coupled with the courage to overcome it can sharpen an edge, too often women (and men) hold themselves back without even realizing their own power and creative force.</p>
<p>She also notes that work and life are always at odds.  It isn&#8217;t about balance.  It is about integration.</p>
<p>Here are five life lessons she shared:</p>
<ol>
<li>Every<strong> transition brings a growth opportunity</strong><br />
an opportunity to add new skills</li>
<li>You can <strong>gain speed at a turn</strong><br />
applies to companies as well as individuals, a downturn or upturn allows us to focus</li>
<li><strong>Leaders blur boundaries</strong><br />
You need to be able to work across functional boundaries, as well as across countries and with different kinds of people.  Influencing across an industry is more important than leading a large number of people.</li>
<li>The best way to <strong>gain recognition is to give it away</strong><br />
People are often afraid of losing credit.  Ideas are stronger when you share them.  If you give someone credit for an idea, it is amazing how quickly they will run with it.</li>
<li><strong>Opportunity is a mold waiting to be re-shaped</strong><br />
There is never a perfect fit for a job.  We are always in a mold and it is up to us to break out of that mold.  The fit doesn&#8217;t come to you, you need to work hard to make a fit.</li>
</ol>
<p>&#8220;The CTO&#8217;s job is not to know all the answers, but to ask the right questions&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2009/12/fear-stays-silent-while-passion-speaks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Japanese geek speak</title>
		<link>http://www.ultrasaurus.com/sarahblog/2009/12/japanese-geek-speak/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2009/12/japanese-geek-speak/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 21:34:20 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[general]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2258</guid>
		<description><![CDATA[ It was inspiring to meet Matz, the creator of the Ruby language, and other Japanese Rubyists at last month&#8217;s RubyConf.  Matz kindly recorded various phrases about Ruby in Japanese. Since then I&#8217;ve been working on learning katakana as an easy intro (perhaps) to the Japanese language.
For those who are unfamiliar with Japanese, katakana [...]]]></description>
			<content:encoded><![CDATA[<p> It was inspiring to meet Matz, the creator of the Ruby language, and other Japanese Rubyists at last month&#8217;s RubyConf.  <a href="http://blog.mightyverse.com/2009/12/ruby-language/">Matz kindly recorded various phrases about Ruby in Japanese<a href="http://blog.mightyverse.com/2009/12/ruby-language/">.<img align="right" src="http://img.skitch.com/20091226-p9yyjr7wj5uq3kbdnt3swd2iib.jpg"/></a> Since then I&#8217;ve been working on learning katakana as an easy intro (perhaps) to the Japanese language.</p>
<p>For those who are unfamiliar with Japanese, <a href="http://en.wikipedia.org/wiki/Katakana">katakana</a> is one of two phonetic scripts used in Japanese writing, along with Kanji which is the pictographic script used for the majority of Japanese words.  Katakana is used mostly for words which have their roots in foreign languages, so it is naturally used for many words having to do with software development.  I asked a Japanese Rubyist why is the word for &#8220;Ruby&#8221; (the programming language) not a Japanese word &#8212; even when speaking and writing Japanese the word for Ruby is &#8220;Ruby.&#8221;  She replied that if they used the Japanese word, it would be indistinguishable from the word for the jewel.  They can easily google for &#8220;Ruby&#8221; and  find Ruby language references in Japanese text.  The Japanese effectively extend their language by adopting foreign-language words for new concepts and inventions, and end up making the language more expressive by creating a larger vocabulary.</p>
<p>Despite the fact that many things that I might want to say as a software developer find their origins in English words, without hearing them first in isolation I would probably not understand them if I heard them.  So, in addition to learning from the excellent book <a href="http://www.amazon.com/gp/product/4770016964?ie=UTF8&#038;tag=ultrasaurus-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=4770016964">All About Katakana</a>, I am also developing a list of geek words that are written in Katakana.</p>
<p>I&#8217;ve noticed that most of the tweets I see from Japanese Rubyists are in katakana and I wonder if I learn to read this phonetic text whether I might actually understand them now and then or perhaps the twitter stream is yet another dialect.</p>
<p>Below is my short list of geek vocabulary words that I am learning now (with some mightyverse links if you want to hear them).  Once I get a little farther along in my studies, I hope to get my Japanese friend Iku to record more words for me, so please comment with your favorite katakana words (or ones you would like to know if you are an English speaker and I&#8217;ll add them to my translate wish list).</p>
<table>
<tr>
<td>
テスト<br />
te su to&nbsp;&nbsp;&nbsp;&nbsp;<br />
test
</td>
<td>
フレーム<br />
fu rei mu&nbsp;&nbsp;&nbsp;&nbsp;<br />
frame-
</td>
<td>
ワーク<br />
wa ku<br />
work
</td>
</tr>
</table>
<p>&nbsp;</p>
<table>
<tr>
<td>
オ  ブ  ジェ ク ト　　<br />
 o bu je ku to&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;
</td>
<td>
ドット<br />
do  tsu  to  &nbsp;&nbsp;<br />
(dotto)
</td>
<td>
メ   ソ ッ ド<br />
me    so   tsu  do<br />
(mesoddo)
</td>
</tr>
</table>
<p><a href="http://www.mightyverse.com/media/6d18e1d9-c647-4960-9bdd-793936cf8404">object.method</a></p>
<p>&nbsp;</p>
<table>
<tr>
<td>
 ハ ッ シュ<br />
ha   shu
</td>
<td>
ロ ケット<br />
ro ke tto<br />
</tr>
</table>
<p><a href="http://www.mightyverse.com/media/820781e1-739b-4fdc-8187-95fd95d9c0ff">hashrocket</a></p>
<p>&nbsp;</p>
<p>テレビ<br />
te re bi<br />
television<br />
(<a href="http://www.mightyverse.com/media/ed509326-44b1-4a21-bdae-d8469665d2fa">it&#8217;s for television</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2009/12/japanese-geek-speak/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>creating a custom rake task</title>
		<link>http://www.ultrasaurus.com/sarahblog/2009/12/creating-a-custom-rake-task/</link>
		<comments>http://www.ultrasaurus.com/sarahblog/2009/12/creating-a-custom-rake-task/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 17:30:51 +0000</pubDate>
		<dc:creator>Sarah</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://www.ultrasaurus.com/?p=2236</guid>
		<description><![CDATA[There&#8217;s a nice Railscast introduction to rake for Rails, which goes into a number of other important details that aren&#8217;t covered in this post.  Below is a little tutorial of creating a Rails rake task and getting it to run remotely on heroku.
Introduction to Rake
In lib/tasks, create a file called greet.rake

task :greet do
  [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a nice <a href="http://railscasts.com/episodes/66-custom-rake-tasks">Railscast introduction to rake</a> for Rails, which goes into a number of other important details that aren&#8217;t covered in this post.  Below is a little tutorial of creating a Rails rake task and getting it to run remotely on heroku.</p>
<h2>Introduction to Rake</h2>
<p>In lib/tasks, create a file called greet.rake</p>
<pre>
task :greet do
   puts "Hello world"
end
</pre>
<p>By naming the task .rake and putting it in this special place rails will automatically pick it up and make it available to you.  You can see it listed if you type: rake -T on the command line.  To run it:</p>
<pre>
rake greet
</pre>
<p>which will print &#8220;Hello world&#8221;</p>
<p>to run one task before another, specify a dependency like this (multiple tasks may be specified in the same file):</p>
<pre>
task :ask => :greet do
   puts "How are you?"
end
</pre>
<h2>Writing a Practical Rake Task</h2>
<p>Now for the task at hand, I&#8217;m going to create a rake task which creates a bunch of fake data for me to test with.  First I&#8217;ll create a little experimental app:</p>
<pre>
rails rake_example
cd rake example
script/generate scaffold person first_name:string last_name:string
rake db:migrate
</pre>
<p>Here&#8217;s the rake task (lib/tasks/fake_people.rake):</p>
<pre>
require 'faker'

namespace :admin  do
  desc "create some fake data"
  task :fake_people => :environment do
    print "How many fake people do you want?"
    num_people = $stdin.gets.to_i
    num_people.times do
      Person.create(:first_name => Faker::Name.first_name,
                    :last_name => Faker::Name.last_name)
    end
    print "#{num_people} created.\n"
  end
end
</pre>
<p>Note that I&#8217;m using the faker gem (<a href="http://faker.rubyforge.org/rdoc/">docs here</a>) and I created a task dependency on loading the rails environment so I could access my Person model.</p>
<p>Now I can run</p>
<pre>
rake admin:fake_people
</pre>
<p>and it will prompt me to ask how many I want and then it will create them.  Cool goodness, yes?</p>
<h2>Running Remotely on Heroku</h2>
<p>We&#8217;re not done yet.  I want to deploy this on heroku and be able to run the task remotely.  For this, there are two gotchas, first I can&#8217;t run an interactive script remotely; also I need to tell heroku that I am using the fake gem and make sure it is installed.</p>
<h3>1) removing interactivity</h3>
<p>Instead of an interactive script, we can set an environment variable or command line argument (thanks to a <a href="http://groups.google.com/group/heroku/browse_thread/thread/775f445e5b11e498/">tip by Adam Wiggins</a>).  </p>
<p>My modified task looks like this:</p>
<pre>
require 'faker'

namespace :admin  do
  desc "create some fake data"
  task :fake_people => :environment do
    num_people = ENV['NUM_RECORDS'].to_i
    num_people.times do
      Person.create(:first_name => Faker::Name.first_name,
                    :last_name => Faker::Name.last_name)
    end
    print "#{num_people} created.\n"
  end
end
</pre>
<p>which I can call locally from the command line like this:</p>
<pre>
rake admin:fake_people NUM_RECORDS=1
</pre>
<h3>2) adding gem to heroku</h3>
<p>I need to create a <a href="http://blog.heroku.com/archives/2009/3/10/gem_manifests/">gems manifest</a>, which sounds fancy, but is simply creating a .gems file at the root of my app with contents similar to what I would put in my config environment.rb to specify that my app requires a gem:</p>
<pre>
faker --version ">=0.3.1"
</pre>
<h3>3) Deploy and Run</h3>
<p>So I can deploy my app to heroku with the usual steps</p>
<pre>
git init
git add .
git commit -m "example app for rake script testing"
heroku create
git push heroku master
heroku rake db:migrate
</pre>
<p>and run the task remotely:</p>
<pre>
heroku rake admin:fake_people NUM_RECORDS=1
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ultrasaurus.com/sarahblog/2009/12/creating-a-custom-rake-task/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
