<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Luke Chadwick | vertis.github.com</title>
 <link href="http://vertis.github.com/atom.xml" rel="self"/>
 <link href="http://vertis.github.com/"/>
 <updated>2015-08-13T11:10:53+00:00</updated>
 <id>http://vertis.github.com/</id>
 <author>
   <name>Luke Chadwick</name>
   <email>luke.a.chadwick@gmail.com</email>
 </author>

 
 <entry>
   <title>Rails 3.2 Precompile error</title>
   <link href="http://vertis.github.com/2015/02/12/rails-precompile-error.html"/>
   <updated>2015-02-12T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2015/02/12/rails-precompile-error</id>
   <content type="html">&lt;p&gt;Every so often I come across an exception that doesn’t turn up good search results as a solution. This time it was:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;rake assets:precompile --trace
...
NoMethodError: undefined method &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;empty?&lt;span class=&quot;s1&quot;&gt;&amp;#39; for nil:NilClass&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;  (in &amp;lt;snip&amp;gt; /app/assets/stylesheets/application.css.scss)&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;&amp;lt;snip&amp;gt;/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/sass-3.1.16/lib/sass/tree/root_node.rb:23:in `render&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The hint to the problem is actually in the above error, but without context would be difficult to spot (I didn’t see it &lt;em&gt;with&lt;/em&gt; context)&lt;/p&gt;

&lt;p&gt;The app in question is now a rails 3.2 app. However it didn’t start it’s life that way, it was slowly upgraded from 2.x, and had it’s own asset handling. The error occurred during a migration to the standard asset pipeline.&lt;/p&gt;

&lt;p&gt;Sure enough I had &lt;code&gt;gem &#39;sass-rails&#39;, &#39;~&amp;gt; 3.2.0&#39;&lt;/code&gt; in one area of the Gemfile and &lt;code&gt;gem &#39;sass&#39;, &#39;3.1.16&#39;&lt;/code&gt; in another.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Things I Want To Do This Year (2015)</title>
   <link href="http://vertis.github.com/2015/01/01/things-i-want-to-do-this-year.html"/>
   <updated>2015-01-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2015/01/01/things-i-want-to-do-this-year</id>
   <content type="html">&lt;p&gt;This will be my second year &lt;a href=&quot;/2014/01/01/things-i-want-to-do-this-year.html&quot;&gt;documenting&lt;/a&gt; things that I want to do this year and giving myself a mark on the &lt;a href=&quot;/2015/01/01/scorecard-for-2014.html&quot;&gt;results&lt;/a&gt;. I found it to be a valuable exercise last year, though my priorities did shift over the course of the year.&lt;/p&gt;

&lt;h2 id=&quot;continued--extended-goals&quot;&gt;Continued / Extended goals&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Read 2 books a month at least 50% non-fiction (This is now based on my velocity from last year)&lt;/li&gt;
  &lt;li&gt;Collect another large dataset&lt;/li&gt;
  &lt;li&gt;Obtain a healthy BMI&lt;/li&gt;
  &lt;li&gt;3D print and build a 3D printer&lt;/li&gt;
  &lt;li&gt;Publish usable libraries in Elixir and Golang&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;new-goals&quot;&gt;New goals&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Speak publicly about technology at least twice&lt;/li&gt;
  &lt;li&gt;Write at least 12 blog posts for the year&lt;/li&gt;
  &lt;li&gt;Write a library for use in ML or AI&lt;/li&gt;
  &lt;li&gt;Write an automated trading system that uses AI&lt;/li&gt;
  &lt;li&gt;Fly a drone in an automated way&lt;/li&gt;
  &lt;li&gt;Create a full game using VR&lt;/li&gt;
  &lt;li&gt;Learn Italian&lt;/li&gt;
  &lt;li&gt;Learn how to make a quantum&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Scorecard for 2014</title>
   <link href="http://vertis.github.com/2015/01/01/scorecard-for-2014.html"/>
   <updated>2015-01-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2015/01/01/scorecard-for-2014</id>
   <content type="html">&lt;p&gt;Wow! 2015 already. 2014 certainly went by in a flash. At the start of the year I &lt;a href=&quot;/2014/01/01/things-i-want-to-do-this-year.html&quot;&gt;documented&lt;/a&gt; everything that I wanted to get done in 2014. Now I’d like to do a quick retrospective on those items.&lt;/p&gt;

&lt;p&gt;I’ll start by going through each of the items listed and giving myself a mark out of 10 and then I’ll document why I gave myself that mark.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Mark&lt;/th&gt;
      &lt;th&gt;Item&lt;/th&gt;
      &lt;th&gt;Comments&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;5/10&lt;/td&gt;
      &lt;td&gt;Create a computer game of some type (mobile or desktop)&lt;/td&gt;
      &lt;td&gt;While I did a bunch of work in Unity (and for Oculus Rift), I did not launch a game to market&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5/10&lt;/td&gt;
      &lt;td&gt;Commit code to an open source project every day. If you forget, just begin again (my streak so far is 50 days)&lt;/td&gt;
      &lt;td&gt;My streak was about 170 days by the time I got sick of it.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0/10&lt;/td&gt;
      &lt;td&gt;Take those rollerblades you’ve had in the cupboard for 6 years and actually use them&lt;/td&gt;
      &lt;td&gt;They’re still in the cupboard&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0/10&lt;/td&gt;
      &lt;td&gt;Finish the personal training app you were working on last year&lt;/td&gt;
      &lt;td&gt;This has been shelved indefinitely&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10/10&lt;/td&gt;
      &lt;td&gt;Read at least 1 book per month&lt;/td&gt;
      &lt;td&gt;In total I finished 25 books in 2014. There was a good mix of novels and non-fiction&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7/10&lt;/td&gt;
      &lt;td&gt;Learn another programming language till you can use it proficiently (I’m working on learning golang)&lt;/td&gt;
      &lt;td&gt;I have dabbled with both Golang and Elixir this year, but have not produced anything substantial in either&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0/10&lt;/td&gt;
      &lt;td&gt;Get the RHoK project FGIS out into some fire trucks for testing&lt;/td&gt;
      &lt;td&gt;Perhaps one of the saddest of my non-completes for 2014, this failed to progress both from lack of interest on the problem owners side and also lack of pushing on my part&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10/10&lt;/td&gt;
      &lt;td&gt;Design something from scratch and 3d print it&lt;/td&gt;
      &lt;td&gt;I have designed several items from scratch and 3d printed them this year&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Silly&lt;/td&gt;
      &lt;td&gt;Walk 100km in one go (as of last year I can comfortably walk about 20km in one day, I want to improve on this&lt;/td&gt;
      &lt;td&gt;I walked consistently for most of the year, but I’m ruling this a silly goal and not scoring it&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0/10&lt;/td&gt;
      &lt;td&gt;Build muscle (Last year I lost about 15km, going from 97kg-83kg)&lt;/td&gt;
      &lt;td&gt;Weight is back, and I haven’t put on any muscle&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7/10&lt;/td&gt;
      &lt;td&gt;Collect and publish a large dataset under creative commons&lt;/td&gt;
      &lt;td&gt;I have collected the dataset but have not yet published it&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10*/10&lt;/td&gt;
      &lt;td&gt;Build a quadcopter (carried over from last year)&lt;/td&gt;
      &lt;td&gt;Ended being smart and buying an almost completed quadcopter. I have been flying it a lot and introducing other people to it. Have managed to get the ball rolling on my employer investing in the technology as well&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10/10&lt;/td&gt;
      &lt;td&gt;Visit a country you haven’t been too before&lt;/td&gt;
      &lt;td&gt;Visited Italy for work, and went for a day trip to Switzerland while there. Also spent a bunch of time in San Francisco and LA, which while I’d been to the US before (NY) were both new as well&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10/10&lt;/td&gt;
      &lt;td&gt;Meet/befriend 100 new people (more than just friending on twitter)&lt;/td&gt;
      &lt;td&gt;Can’t say that I collected 100 business cards and that I’ll stay in touch with them all, but I have met and got to know a LOT of people this year&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;Final Score:&lt;/strong&gt; 74 / 130&lt;/p&gt;

&lt;h2 id=&quot;thoughts&quot;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;A passing grade but not as good as it could have been if we count the things I intended to do at the start of the year and didn’t end up doing.&lt;/p&gt;

&lt;p&gt;On the other hand there are many many things that I accomplished this year that are not on the list.&lt;/p&gt;

&lt;p&gt;The only one that I’m particularly unhappy about is my lack of progress on the fitness side. This is truly and area where I need to do better.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Convert an AWS Route53 Resource Record Set to point to an Alias Target</title>
   <link href="http://vertis.github.com/2014/06/19/convert-a-route53-rrset-to-be-an-alias-target.html"/>
   <updated>2014-06-19T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2014/06/19/convert-a-route53-rrset-to-be-an-alias-target</id>
   <content type="html">&lt;p&gt;Occasionally, you’ll want to change a Route53 Resource Record Set from one type to another. In the case of going from a traditonal ‘&lt;strong&gt;A&lt;/strong&gt;’ record to an &lt;a href=&quot;http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingAliasRRSets.html&quot;&gt;Alias Target&lt;/a&gt; the following code (with the aws-sdk rubygem) should do the trick.&lt;/p&gt;

&lt;p&gt;The gotcha with this process is the need to unset ttl and resource_records as a part of the update.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;AWS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Route53&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hosted_zones&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;example.com.&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# find zone by name&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rrsets&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;jedi.example.com.&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:ttl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:resource_records&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Now lets update it to be an alias target&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;AWS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;CloudFormation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stacks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;jedi-stack&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# assuming the stack exists&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;lb_resources&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;AWS::ElasticLoadBalancing::LoadBalancer&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lb_resource&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb_resources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;AWS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ELB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;load_balancers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lb_resource&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;physical_resource_id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alias_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;dns_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;canonical_hosted_zone_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;hosted_zone_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lb&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;canonical_hosted_zone_name_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;evaluate_target_health&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ttl&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ttl&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_records&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_records&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rrset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You should now have a RRSet pointed at your ELB.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mount an S3 bucket using IAM roles</title>
   <link href="http://vertis.github.com/2014/06/17/mount-an-s3-bucket-using-iam-roles.html"/>
   <updated>2014-06-17T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2014/06/17/mount-an-s3-bucket-using-iam-roles</id>
   <content type="html">&lt;p&gt;After much searching around I discovered that newer versions of s3fs support IAM roles (I’m using 1.77). Unfortunately, this functionality is barely documented.&lt;/p&gt;

&lt;p&gt;I ended up using the following line to mount my directory:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;s3fs bucketname /mnt/bucket -o &lt;span class=&quot;nv&quot;&gt;use_cache&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/tmp,allow_other,iam_role&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;curl http://169.254.169.254/latest/meta-data/iam/security-credentials/&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;NB: s3fs does not need s3://&lt;/p&gt;

&lt;p&gt;If the role you’re trying to use does not have access you’ll get something like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;ls /mnt
total 20
drwxr-xr-x &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt; root root &lt;span class=&quot;m&quot;&gt;4096&lt;/span&gt; Jun &lt;span class=&quot;m&quot;&gt;16&lt;/span&gt; 23:39 .
drwxr-xr-x &lt;span class=&quot;m&quot;&gt;7&lt;/span&gt; root root &lt;span class=&quot;m&quot;&gt;4096&lt;/span&gt; Jun &lt;span class=&quot;m&quot;&gt;16&lt;/span&gt; 23:39 ..
d????????? ? ?   ?       ?            ? bucket&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The other error message I’ve seen is:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;touch: cannot touch ‘/mnt/bucket/test.txt’: Transport endpoint is not connected&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This happened when I specified the role incorrectly (it does not need to be the full arn).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #10</title>
   <link href="http://vertis.github.com/2014/01/31/awesome-links-10.html"/>
   <updated>2014-01-31T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2014/01/31/awesome-links-10</id>
   <content type="html">&lt;p&gt;I’ve promised myself that I’m going to do a lot of reading this year. To date I’ve done quite well, and the books have been amazing.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/How-Create-Mind-Thought-Revealed-ebook/dp/B007V65UUG&quot;&gt;“How to Create a Mind” by Ray Kurzweil&lt;/a&gt; was an excellent read. It seemed a great idea to follow up with more AI books, I read two William Hertling novels, &lt;a href=&quot;http://www.amazon.com/Avogadro-Corp-Singularity-Closer-Appears-ebook/dp/B006ACIMQQ&quot;&gt;Avogadro Corp&lt;/a&gt; and &lt;a href=&quot;http://www.amazon.com/I-Apocalypse-Singularity-William-Hertling-ebook/dp/B007FZVI2M&quot;&gt;A.I. Apocalypse&lt;/a&gt;. They were both great, but I enjoyed the second more.&lt;/p&gt;

&lt;p&gt;Not that I have a heap of time for it, but reading &lt;a href=&quot;http://www.amazon.com/How-Create-Mind-Thought-Revealed-ebook/dp/B007V65UUG&quot;&gt;“How to Create a Mind” by Ray Kurzweil&lt;/a&gt; got me thinking about Machine Learning again. Today I stumbled upon (Machine Learning in Javascript)[http://burakkanber.com/blog/machine-learning-in-other-languages-introduction/], which is an interesting series of posts.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Things I Want To Do This Year</title>
   <link href="http://vertis.github.com/2014/01/01/things-i-want-to-do-this-year.html"/>
   <updated>2014-01-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2014/01/01/things-i-want-to-do-this-year</id>
   <content type="html">&lt;p&gt;While I was on my flight back from visting family in Sydney for Xmas, I started writing a list of everything I want to get done this year.&lt;/p&gt;

&lt;p&gt;It’s quite a long list, and it will be a very full year if I manage to do half of it. But it’s worth writing down:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Create a computer game of some type (mobile or desktop)&lt;/li&gt;
  &lt;li&gt;Commit code to an open source project every day. If you forget, just begin again (my streak so far is 50 days)&lt;/li&gt;
  &lt;li&gt;Take those rollerblades you’ve had in the cupboard for 6 years and actually use them.&lt;/li&gt;
  &lt;li&gt;Finish the personal training app you were working on last year&lt;/li&gt;
  &lt;li&gt;Read at least 1 book per month&lt;/li&gt;
  &lt;li&gt;Learn another programming language till you can use it proficiently (I’m working on learning golang)&lt;/li&gt;
  &lt;li&gt;Get the RHoK project FGIS out into some fire trucks for testing&lt;/li&gt;
  &lt;li&gt;Design something from scratch and 3d print it&lt;/li&gt;
  &lt;li&gt;Walk 100km in one go (as of last year I can comfortably walk about 20km in one day, I want to improve on this)&lt;/li&gt;
  &lt;li&gt;Build muscle (Last year I lost about 15kgm, going from 97kg-83kg)&lt;/li&gt;
  &lt;li&gt;Collect and publish a large dataset under creative commons&lt;/li&gt;
  &lt;li&gt;Build a quadcopter (carried over from last year)&lt;/li&gt;
  &lt;li&gt;Build a &lt;redacted&gt; for the REA hackday in Feb&lt;/redacted&gt;&lt;/li&gt;
  &lt;li&gt;Visit a country you haven’t been too before&lt;/li&gt;
  &lt;li&gt;Meet/befriend 100 new people (more than just friending on twitter)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see. I have my work cut out.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Awesome Links #9</title>
   <link href="http://vertis.github.com/2013/12/23/awesome-links-9.html"/>
   <updated>2013-12-23T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/12/23/awesome-links-9</id>
   <content type="html">&lt;p&gt;Now that the end of year is upon us, it seems like an opportunity to get some reading done &amp;amp; work on a few small projects.&lt;/p&gt;

&lt;p&gt;I just finished &lt;a href=&quot;http://www.amazon.com/The-Last-Firewall-William-Hertling-ebook/dp/B00EEIGHDI&quot;&gt;The Last Firewall by William Hertling&lt;/a&gt;, which was a very good read. I haven’t read his previous two books, but I’ll have to pick them up now. I partically liked the (brief) reference to a Puppen (half dog, half cat).&lt;/p&gt;

&lt;p&gt;I’ve been dabbling a bit with &lt;a href=&quot;http://golang.org/&quot;&gt;Golang&lt;/a&gt;. It’s a fantastic language and I’ll be spending more time learning it over the break.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>An update on my AWS bill</title>
   <link href="http://vertis.github.com/2013/12/17/an-update-on-my-aws-bill.html"/>
   <updated>2013-12-17T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/12/17/an-update-on-my-aws-bill</id>
   <content type="html">&lt;p&gt;The last 48 hours have been surreal. When I typed up the &lt;a href=&quot;http://vertis.io/2013/12/16/unauthorised-litecoin-mining.html&quot;&gt;experience&lt;/a&gt; up yesterday morning, I was not expecting it to get more than a handful of votes on Hacker News. &lt;/p&gt;

&lt;p&gt;As I watched the discussion yesterday I was warmed that people both cared about my plight and found it useful to have a reminder. &lt;/p&gt;

&lt;p&gt;All that while, the case with Amazon slowly progressed. They first answered and asked me terminate the stopped instances. They indicated that once this was done they would put in a request to waive the fees (subject to approval).&lt;/p&gt;

&lt;p&gt;Overnight (I’m in Australia), this has been approved. I still can’t see it from the Billing Console, which I’m told is normal, but I’ve been informed in the support case that Amazon will be crediting the entire bill. Yay!&lt;/p&gt;

&lt;p&gt;There was part of me, when I saw this bill, that knew what Amazon’s response would be. I don’t deserve that kind of relief after leaking my key, but Amazon has always been a cut above.&lt;/p&gt;

&lt;p&gt;In my interactions with Amazon Account Managers and Architects (work account), Amazon has consistently cared about people being efficient in their instance usage. They have gone so far as to suggest changes that would wipe thousands off a monthly bill.&lt;/p&gt;

&lt;p&gt;With this experience they have reinforced, to me a least, that they value me as a customer for the long term. I will one day be paying Amazon $3000 dollars a month, but I hope that it will be the bill for, an as yet non-existent, startup that is skyrocketing to success :D&lt;/p&gt;

&lt;p&gt;This is all without mentioning that Werner Vogels stopped by the Hacker News thread (The ticket was already on it’s way to being dealt with by that point, but it was amazing).&lt;/p&gt;

&lt;p&gt;Finally, thanks again to all the supportive people over the last 2 days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discuss it on &lt;a href=&quot;https://news.ycombinator.com/item?id=6917618&quot;&gt;Hacker News&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My run in with Unauthorised Litecoin mining on AWS</title>
   <link href="http://vertis.github.com/2013/12/16/unauthorised-litecoin-mining.html"/>
   <updated>2013-12-16T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/12/16/unauthorised-litecoin-mining</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Update: You can read an update to this story &lt;a href=&quot;http://vertis.io/2013/12/17/an-update-on-my-aws-bill.html&quot;&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Normally I’m a big advocate of open sourcing projects both current (and old) on GitHub. Today though, I wish that I wasn’t.&lt;/p&gt;

&lt;p&gt;On sunday night I received an email from Amazon saying that they’d detected my Amazon key on one of my repositories. This was a little bit of a surprise, because I’m usually so diligent about not saving credentials into repositories.&lt;/p&gt;

&lt;p&gt;After a brief search I found the key buried in an old project that I’d just decided didn’t need to be private.&lt;/p&gt;

&lt;p&gt;That wasn’t the end of the matter, I was in for a rude shock when I logged into my Amazon account to check for unauthorised usage. $3000+ in pending charges. Woah!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/aws-billing-dashboard.png&quot; alt=&quot;Billing Dashboard&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It didn’t take long to find the source of the billing. Twenty cc2.8xlarge instances humming along in the us-east region for the last two days.&lt;/p&gt;

&lt;p&gt;By this stage I’d already revoked the key (as suggested in the email). So I quickly shut the instances down, while I would have liked to preserve them for forensics, I just couldn’t afford to leave them running while waiting for Amazon support (I do not pay for support, since this is just my private account that I dabble with).&lt;/p&gt;

&lt;p&gt;After taking stock for a few moments, I detached one of the volumes and attached it to another instance. Having a poke around confirmed what I had already guessed. The unauthorised user had been mining litecoin with the mining pool &lt;a href=&quot;http://pool-x.eu&quot;&gt;pool-x.eu&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve emailed &lt;a href=&quot;http://pool-x.eu&quot;&gt;pool-x.eu&lt;/a&gt; asking them to suspend the account, but I’ve yet to receive a reply.&lt;/p&gt;

&lt;p&gt;What have I learned from this experience?&lt;/p&gt;

&lt;h2 id=&quot;enable-billing-alerts&quot;&gt;Enable billing alerts&lt;/h2&gt;
&lt;p&gt;Given I spend about $60-80 a month with Amazon usually, I could have been warned MUCH earlier. Needless to say, now that the horse has bolted I’ve enabled the horse bolting detector.&lt;/p&gt;

&lt;h2 id=&quot;check-github&quot;&gt;Check GitHub&lt;/h2&gt;
&lt;p&gt;It’s not really that hard to do a regular search of GitHub for keys and passwords in your repositories. Check your friends repositories as well…many eyes.&lt;/p&gt;

&lt;h2 id=&quot;audit-code-before-open-sourcing&quot;&gt;Audit code before open sourcing&lt;/h2&gt;
&lt;p&gt;Always a good rule, but be especially careful flicking the switch on repositories that you’ve had as private for a long time.&lt;/p&gt;

&lt;p&gt;Update: &lt;a href=&quot;http://twitter.com/joneaves&quot;&gt;@joneaves&lt;/a&gt; suggested either using something like &lt;a href=&quot;http://checkstyle.sourceforge.net/&quot;&gt;checkstyle&lt;/a&gt; (java) and/or a pre-commit hook. Good advice.&lt;/p&gt;

&lt;h2 id=&quot;use-iam-keys&quot;&gt;Use IAM Keys&lt;/h2&gt;
&lt;p&gt;Quite a few people have pointed out on twitter and hacker news that the other thing you should be doing is using restricted IAM keys.&lt;/p&gt;

&lt;h2 id=&quot;more-tips-on-amazon&quot;&gt;More tips on Amazon&lt;/h2&gt;
&lt;p&gt;A friend pointed out that Amazon has a good security &lt;a href=&quot;http://blogs.aws.amazon.com/security/post/Tx1XG3FX6VMU6O5/A-safer-way-to-distribute-AWS-credentials-to-EC2&quot;&gt;blog post&lt;/a&gt; that deals with this and other risks to your account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discuss it on &lt;a href=&quot;https://news.ycombinator.com/item?id=6911908&quot;&gt;Hacker News&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Christmas Gifts 2013</title>
   <link href="http://vertis.github.com/2013/12/05/awesome-christmas-gifts.html"/>
   <updated>2013-12-05T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/12/05/awesome-christmas-gifts</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://d3rrgxxoyz0alr.cloudfront.net/assets/bg/pebble-arms-trim-1800-f158d80f05766cb945762957d88d4217.jpg&quot; alt=&quot;Pebble Smartwatch&quot; /&gt;&lt;br /&gt;
&amp;gt;  Pebble Smartwatch&lt;/p&gt;

&lt;p&gt;In a special edition of ‘Awesome Links’ I share what you should be buying your geeky friends for Christmas (assuming they haven’t already bought it for themselves)&lt;/p&gt;

&lt;p&gt;We may all use smartphones for everything now, but if you asked the futurists of the 1980s what we would be using now, they probably have described something like &lt;a href=&quot;https://getpebble.com/&quot;&gt;Pebble&lt;/a&gt;. This Smartwatch took Kickstarter by storm, and continues to impress. At USD$150 it may fit into your budget for a loved one.&lt;/p&gt;

&lt;p&gt;For all those geeks with kids, the &lt;a href=&quot;https://www.leapmotion.com/&quot;&gt;Leap Motion&lt;/a&gt; is the perfect gift. There is nothing quite like watching a kid discover magic. And at USD$79 it has a much better time to entertainment ration than the movie gift voucher you were thinking of giving them.&lt;/p&gt;

&lt;p&gt;If you’re looking for something with a smaller budget the &lt;a href=&quot;http://www.raspberrypi.org/&quot;&gt;Raspberry Pi&lt;/a&gt; ($35) or &lt;a href=&quot;http://beagleboard.org/products/beaglebone%20black&quot;&gt;Beaglebone Black&lt;/a&gt; ($45) may fit the bill. One of the benefits to giving one of these as a gift, is even if they already have one, a second or third is always useful (they tend to get used in projects). The Raspberry Pi tends to be a bit friendlier for getting started, and the Beaglebone Black fits into the slightly more advanced category.&lt;/p&gt;

&lt;p&gt;Need more ideas? &lt;a href=&quot;http://hackerthings.com/&quot;&gt;Hacker Things&lt;/a&gt; has an impressive list of awesome gadgets. Also browsing &lt;a href=&quot;http://adafruit.com&quot;&gt;Adafruit&lt;/a&gt;, &lt;a href=&quot;http://sparkfun.com&quot;&gt;Sparkfun&lt;/a&gt; and &lt;a href=&quot;http://tindie.com&quot;&gt;Tindie&lt;/a&gt; should help you find that perfect geek gift.&lt;/p&gt;

&lt;p&gt;Update: &lt;a href=&quot;http://opensource.com/life/13/11/open-source-2013-holiday-gift-guide&quot;&gt;opensource.com&lt;/a&gt; also has an awesome gift guide.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Reading: Open Companies</title>
   <link href="http://vertis.github.com/2013/11/22/open-companies.html"/>
   <updated>2013-11-22T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/11/22/open-companies</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://farm6.staticflickr.com/5503/9994096423_a4e728a437_c.jpg&quot; alt=&quot;A rare archaeological find&quot; /&gt;&lt;br /&gt;
&amp;gt;  A rare archaeological find at GitHub by fumi (http://www.flickr.com/photos/fumi/9994096423/)&lt;/p&gt;

&lt;p&gt;I’ve been reading about a couple of open companies, &lt;a href=&quot;http://www.gittip.com&quot;&gt;GitTip&lt;/a&gt; and &lt;a href=&quot;http://balancedpayments.com&quot;&gt;Balanced Payments&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both of these companies have taken what might be considered extreme approaches. Open sourcing just about everything required to run their companies. But it’s more than that. All the issues and discussions about running the companies take place in public as well. That gives an amazing level of transparency, and encourages so much community participation.&lt;/p&gt;

&lt;p&gt;I found about about &lt;a href=&quot;http://balancedpayments.com&quot;&gt;Balanced Payments&lt;/a&gt; through Steve Klabnik’s &lt;a href=&quot;http://words.steveklabnik.com/why-im-partnering-with-balanced&quot;&gt;announcement&lt;/a&gt; that he would be partnering (employed by) &lt;a href=&quot;http://balancedpayments.com&quot;&gt;Balanced Payments&lt;/a&gt;. This led to a bunch of other urls.&lt;/p&gt;

&lt;p&gt;The first, was a &lt;a href=&quot;https://github.com/gittip/www.gittip.com/pull/137/commits&quot;&gt;pull request&lt;/a&gt; that &lt;a href=&quot;http://balancedpayments.com&quot;&gt;Balanced Payments&lt;/a&gt; made on &lt;a href=&quot;http://www.gittip.com&quot;&gt;GitTip&lt;/a&gt;. Solving their problem regarding the need for a new payment provider. This is a powerful action to promote both &lt;a href=&quot;http://balancedpayments.com&quot;&gt;Balanced Payments&lt;/a&gt;, but also a statement about how well being open is working for &lt;a href=&quot;http://www.gittip.com&quot;&gt;GitTip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Moving on from there, I decided to look into the how and why of &lt;a href=&quot;http://balancedpayments.com&quot;&gt;Balanced Payments&lt;/a&gt; decision to be open. The CEO,  Matin Tamizi, has shared a lot of his reasoning in a article on &lt;a href=&quot;http://www.fastcolabs.com/3008944/open-company/why-i-made-my-payments-startup-an-open-company&quot;&gt;Fast Company: Labs&lt;/a&gt; and also in the &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; produced &lt;a href=&quot;https://www.youtube.com/watch?v=ukKd8W3Bvo0&quot;&gt;OctoTales&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is more information in the &lt;a href=&quot;http://blog.balancedpayments.com/benefits-open-company-balanced/&quot;&gt;blog post&lt;/a&gt; announcing the decision, and also a page dedicated to explaining the &lt;a href=&quot;http://www.balancedpayments.com/open&quot;&gt;‘Open Company’ philosophy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Of course, a lot of the thinking that has gone into making Balanced an open company comes from interacting with Chad Whitacre, the founder of &lt;a href=&quot;http://www.gittip.com&quot;&gt;GitTip&lt;/a&gt;, so it’s worth delving into his thinking on the subject. Which you can do by reading his excellent posts &lt;a href=&quot;http://blog.gittip.com/post/26350459746/the-first-open-company&quot;&gt;“The First Open Company”&lt;/a&gt; and &lt;a href=&quot;https://medium.com/building-gittip/4cbab7ca1a47&quot;&gt;“The Second Open Company”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m not sure about the assertion that GitTip is the first(or second) ‘Open Company’, but it’s certainly and interesting concept to explore further.&lt;/p&gt;

&lt;p&gt;Of course you couldn’t finish a blog post like this without talking about &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; itself and the influence it has had on the community. Both by being very transparent (if not entirely open), and in the building of tools that allows this kind of openness and collaboration.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Links for Good</title>
   <link href="http://vertis.github.com/2013/11/11/links-no-8.html"/>
   <updated>2013-11-11T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/11/11/links-no-8</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://farm8.staticflickr.com/7446/10755140965_7cb3a792af_b.jpg&quot; alt=&quot;Typhoon Haiyan&quot; /&gt;&lt;br /&gt;
&amp;gt; Typhoon Haiyan as seend from the ISS&lt;/p&gt;

&lt;p&gt;It’s easy to get caught up in making money, but there are things that you can do that will help the social good as well:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.rhok.org/http://www.rhokmelbourne.org/&quot;&gt;Random Hacks of Kindness&lt;/a&gt; - The next global hackathon is the 7th - 8th of December. I will be attending   &lt;a href=&quot;http://www.rhok.org/http://www.rhokmelbourne.org/&quot;&gt;RHoK Melbourne&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://crisiscommons.org/&quot;&gt;CrisisCamp&lt;/a&gt; - A global organization dedicated to helping after Earthquakes, Floods, and major storms. This is timely given the recent Typhoon in the Philippines&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #7</title>
   <link href="http://vertis.github.com/2013/10/14/awesome-links-no-7.html"/>
   <updated>2013-10-14T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/10/14/awesome-links-no-7</id>
   <content type="html">&lt;p&gt;Awesome links for the 14th of October 2013:&lt;br /&gt;
&lt;img src=&quot;http://static.guim.co.uk/sys-images/Guardian/Pix/pictures/2013/6/23/1372015020195/Edward-Snowden-008.jpg&quot; alt=&quot;Edward Snowden&quot; /&gt;&lt;br /&gt;
&amp;gt; Edward Snowden courtesy of The Guardian&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://adi.is/s/cpunk20&quot;&gt;Cypherpunks 2.0&lt;/a&gt; - Interesting talk by Andy Isaacson from Noisebridge. Videos are split into a bunch of sections &lt;a href=&quot;http://www.ustream.tv/recorded/39791560/highlight/423948&quot;&gt;Part 1&lt;/a&gt;, &lt;a href=&quot;http://www.ustream.tv/recorded/39791773/highlight/423949&quot;&gt;Part 2&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://www.ustream.tv/recorded/39791773/highlight/423954&quot;&gt;Q &amp;amp; A&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.spark.io/&quot;&gt;Spark Core&lt;/a&gt; - This tiny embedded board looks very promising. Originally a &lt;a href=&quot;http://www.kickstarter.com/projects/sparkdevices/spark-core-wi-fi-for-everything-arduino-compatible&quot;&gt;Kickstarter&lt;/a&gt; campaign. Delivery is currently behind schedule. Most importantly though, it’s an open hardware project.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://redecentralize.org/&quot;&gt;redecentralize.org&lt;/a&gt; - The site seems to be just getting started, but already contains some excellent interviews from people working on projects to “take back control of the internet”. Well worth the time to watch.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #6</title>
   <link href="http://vertis.github.com/2013/10/08/awesome-links-no-6.html"/>
   <updated>2013-10-08T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/10/08/awesome-links-no-6</id>
   <content type="html">&lt;p&gt;Awesome links for the 8th of October 2013:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://shopify.github.io/dashing/&quot;&gt;Dashing (by Shopify)&lt;/a&gt; - Easy to use dashboard building goodness&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://code.shutterstock.com/rickshaw/&quot;&gt;Rickshaw Graphs&lt;/a&gt; - I wasn’t aware that shutterstock contributed to open source, until I stumbled across this graphing library in &lt;a href=&quot;http://shopify.github.io/dashing/&quot;&gt;Dashing (by Shopify)&lt;/a&gt;. It uses D3 under the hood, but provides a simple interface for the more common graphs (with bells and whistles).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://christopheviau.com/d3list/gallery.html&quot;&gt;Big list of D3 examples&lt;/a&gt; - Speaking of D3, this popped up on Hacker News this morning. I find when making graphs, having a wealth of examples is the easiest way to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://polymaps.org/&quot;&gt;Polymaps&lt;/a&gt; - I’m sure that I’ve seen Polymap before, but I ran across it again this morning. Will have to have a play with it one evening.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #5</title>
   <link href="http://vertis.github.com/2013/10/03/awesome-links-no-5.html"/>
   <updated>2013-10-03T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/10/03/awesome-links-no-5</id>
   <content type="html">&lt;p&gt;Awesome links for the 3rd of October 2013:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://customerdevlabs.com/2013/09/24/google-news-api-mturk-press/&quot;&gt;Getting Press for your product launch&lt;/a&gt; - An interesting use of the Google News API and Mechanical Turk. Not exactly scalable though.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.jenniferdewalt.com/post/62998082815/after-180-websites-im-ready-to-start-the-rest-of-my&quot;&gt;180 sites in 180 days&lt;/a&gt; - 3 months to form a solid base to continue learning development.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://news.ycombinator.com/item?id=6488822&quot;&gt;Launch day promotion&lt;/a&gt; - Hacker News list of sites to tell on launch day.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #4</title>
   <link href="http://vertis.github.com/2013/09/30/awesome-links-no-4.html"/>
   <updated>2013-09-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/09/30/awesome-links-no-4</id>
   <content type="html">&lt;p&gt;Python flavoured awesome links for the 30th of September 2013:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://gettingstartedwithdjango.com/&quot;&gt;Getting started with Django&lt;/a&gt; - Clear and helpful videos/text for getting started with Django. Helped me gain at least a little bit of an understanding of django over the weekend.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://learnpythonthehardway.org/&quot;&gt;Learn Python the Hard Way&lt;/a&gt; - Great way of learning (or brushing up, like me) on your python skills.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/maraujop/django-crispy-forms&quot;&gt;Crispy Forms&lt;/a&gt; - Crispy Forms is to Django, what Simple Forms is to Rails.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #3</title>
   <link href="http://vertis.github.com/2013/09/25/awesome-links-no-3.html"/>
   <updated>2013-09-25T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/09/25/awesome-links-no-3</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://i1.ytimg.com/vi/-ld1iFwhIAE/maxresdefault.jpg&quot; alt=&quot;Nathan Gould - Crysis 2&quot; /&gt;&lt;br /&gt;
&amp;gt; Nathan Gould - Crysis 2&lt;/p&gt;

&lt;p&gt;Awesome links for the 25th of September 2013:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.disqus.com/post/62187806135/scaling-django-to-8-billion-page-views&quot;&gt;Disqus&lt;/a&gt; - Scaling Django to 8 billion page views. Good reminder on the importance of mastering caching.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/fesplugas/rbenv-installer&quot;&gt;fesplugas/rbenv-installer&lt;/a&gt; - Nice automated way of installing rbenv and getting Ruby up and running.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://camlistore.org/&quot;&gt;camlistore&lt;/a&gt; - a new content management system written in &lt;a href=&quot;http://golang.org/&quot;&gt;go-lang&lt;/a&gt;. I’ve been playing with this for a few weeks now, and even though it’s still very raw, you can see the potential.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/adamwiggins/7d0e0805e0e44870f17f&quot;&gt;Heroku Roadmap (circa 2010)&lt;/a&gt; - Interesting look back at all of the things that Adam Wiggins and Heroku was thinking about back in 2010. They’ve built an amazing platform. Doing some archeology on how they went about it is a great idea (Might follow up on this further).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #2</title>
   <link href="http://vertis.github.com/2013/09/24/awesome-links-no-2.html"/>
   <updated>2013-09-24T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/09/24/awesome-links-no-2</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/ksr/assets/000/917/441/cbd6c7f62f52e4d815b30a2dd9117476_large.jpg?1379087816&quot; alt=&quot;Microduino&quot; /&gt;&lt;br /&gt;
&amp;gt; Microduino:  Arduino in your pocket, small, stackable, smart&lt;/p&gt;

&lt;p&gt;Awesome links for the 24th of September 2013:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://popanyform.com/?v&quot;&gt;Pop!&lt;/a&gt; - An awesome way to securely fill forms (Disclaimer: I’ve just started at Pop!)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://aphyr.com/posts/292-call-me-maybe-nuodb&quot;&gt;Analysis of NuoDB&lt;/a&gt; - Don’t claim to have solved/refuted the CAP Theorem, you probably haven’t&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.kickstarter.com/projects/microduino/microduino-arduino-in-your-pocket-small-stackable&quot;&gt;Microduino&lt;/a&gt; - Lots of potential applications for this Kickstarter project. Good collection of ‘shields’ as a starting point as well. I like my lazy electronics.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Awesome Links #1</title>
   <link href="http://vertis.github.com/2013/09/23/awesome-links-no-1.html"/>
   <updated>2013-09-23T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/09/23/awesome-links-no-1</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;https://a.desktopprassets.com/wallpapers/ba83238e88f62762658e5fe624c5c33f507955f8/preview_big_085907e590bc7f0940870a2909498e0a394d3491.jpg&quot; alt=&quot;UNSC Infinity&quot; /&gt;&lt;br /&gt;
&amp;gt; The UNSC Infinity (From Halo 4)&lt;/p&gt;

&lt;p&gt;Awesome links for the 23rd of September 2013:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/boxen/our-boxen&quot;&gt;Boxen&lt;/a&gt; - GitHub’s new machine provisioning framework gets your new Mac off to a flying start. Heaps of libraries to install things you’d usually have ot install by hand.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/lwndev/bamboo-vagrant-install&quot;&gt;bamboo-vagrant-install&lt;/a&gt; - Automates the installation of &lt;a href=&quot;http://atlassian.com/software/bamboo&quot;&gt;Atlassian Bamboo&lt;/a&gt; on a Ubuntu Vagrant box so you can get on with the business of delivering your software. You will still need to sign up for a trial or pay for a license and enter it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/skwp/dotfiles&quot;&gt;yadr&lt;/a&gt; - Yet another dotfile repo, this one continues to be my favourite way of getting an awesome set of aliases and defaults for my shell. I’ve yet to work out how it interacts with &lt;a href=&quot;http://github.com/boxen/our-boxen&quot;&gt;Boxen&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How to build an RPM using Mock</title>
   <link href="http://vertis.github.com/2013/09/19/how-to-build-an-rpm-using-mock.html"/>
   <updated>2013-09-19T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/09/19/how-to-build-an-rpm-using-mock</id>
   <content type="html">&lt;p&gt;Building an RPM can be a somewhat annoying, painful experience. There are plenty of pitfalls, but the most annoying, for me at least, is building a package and then trying to install it and realising that it doesn’t work because of some incompatibility in the packages that just happened to be on your build box.&lt;/p&gt;

&lt;p&gt;One solution to this problem is to use &lt;a href=&quot;http://fedoraproject.org/wiki/Projects/Mock&quot; title=&quot;The Mock Project&quot;&gt;Mock&lt;/a&gt;. Mock does a great job of building up an standalone environment, so that you can ‘Fail early’, if you haven’t written your spec file correctly.&lt;/p&gt;

&lt;p&gt;Start by installing &lt;a href=&quot;http://fedoraproject.org/wiki/Projects/Mock&quot; title=&quot;The Mock Project&quot;&gt;Mock&lt;/a&gt; and other required packages. For example:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo yum install mock autoconf automake bison bzip2 createrepo &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                   gcc gcc-c++ iconv-devel libcurl-devel libffi-devel &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                   libtool libxml2 libxml2-devel libxslt libxslt-devel &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                   libyaml-devel make openssl-devel patch readline &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                   readline-devel rpm-build zlib zlib-devel rpmdevtools&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mock won’t allow users other than root by default. This is easily fixed by adding your build user to the mock group:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo usermod -G mock bamboo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;From there I usually create an &lt;code&gt;rpmify&lt;/code&gt; script. This example comes from packaging a rails application:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; -x

&lt;span class=&quot;c&quot;&gt;# Remove previous results in case of build environment not being clean&lt;/span&gt;
rm -rf result

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt; &amp;gt; /tmp/build_number

bundle package

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;example-rails
rm -rf /tmp/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
mkdir -p /tmp/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
cp -rf ./* /tmp/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/
mkdir -p ~/rpmbuild/SOURCES
tar zcvf ~/rpmbuild/SOURCES/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.tar.gz -C /tmp/ &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

rpmbuild -bs &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.spec

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MOCK_CONFIG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;epel-6-x86_64
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;MOCK_CONFIG_ROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/mock/&lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$PACKAGE_NAME&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt;

/usr/bin/mock -r &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG&lt;/span&gt; --uniqueext&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PACKAGE_NAME&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt; --init
/usr/bin/mock -r &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG&lt;/span&gt; --uniqueext&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PACKAGE_NAME&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt; --copyin /tmp/build_number /tmp/build_number

/usr/bin/mock -r &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG&lt;/span&gt; --uniqueext&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PACKAGE_NAME&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt; --installdeps ~/rpmbuild/SRPMS/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BUILD_NUMBER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-1.el6.src.rpm
/usr/bin/mock -r &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG&lt;/span&gt;  --uniqueext&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PACKAGE_NAME&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt; --no-clean ~/rpmbuild/SRPMS/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BUILD_NUMBER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-1.el6.src.rpm

&lt;span class=&quot;c&quot;&gt;# Artifacts&lt;/span&gt;
rm -rf result
mkdir -p result
cp &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG_ROOT&lt;/span&gt;/result/*.log result/

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[[&lt;/span&gt; -f &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG_ROOT&lt;/span&gt;/result/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt;-1.el6.x86_64.rpm &lt;span class=&quot;o&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  cp &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG_ROOT&lt;/span&gt;/result/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt;-1.el6.x86_64.rpm  result/
  cp &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG_ROOT&lt;/span&gt;/result/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PACKAGE_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt;-1.el6.src.rpm result/
  &lt;span class=&quot;nv&quot;&gt;exitstatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;exitstatus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;128
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
/usr/bin/mock -r &lt;span class=&quot;nv&quot;&gt;$MOCK_CONFIG&lt;/span&gt; --uniqueext&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PACKAGE_NAME&lt;/span&gt;-&lt;span class=&quot;nv&quot;&gt;$BUILD_NUMBER&lt;/span&gt; --clean
&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$exitstatus&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The script is designed to be used within bamboo, so it does some handling around the artifacts that it produces&lt;/p&gt;

&lt;p&gt;Mock looks in /etc/mock for the config that you specify, in this case &lt;code&gt;/etc/mock/epel-6-x86_64.cfg&lt;/code&gt;. It is from here that it finds information on how to deploy the dependecies. If you have custom repositories, you’ll want to create your own file.&lt;/p&gt;

&lt;p&gt;And voila, your very own professionally built RPM.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My Post-PRISM checklist</title>
   <link href="http://vertis.github.com/2013/06/11/post-prism-checklist.html"/>
   <updated>2013-06-11T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/06/11/post-prism-checklist</id>
   <content type="html">&lt;p&gt;As an Australian, i.e. Non-US-Resident Non-US-Citizen, I&#39;ve decided to take certain actions to change my online behaviours after recent events. While I have nothing of particular interest in my site usage/cloud/servers, I feel like the behaviour of the US government should not be ignored, and since US companies must to comply with US laws, they cannot be deemed safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHY: Edward Snowden via The Guardian leaked numerous documents, including information about the PRISM program which suggests there is extensive surveillance and interception of foreign citizens&#39; data without a court order.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NB: This is a work in progress. Suggestions welcome. If nothing else this is an indication of how annoying this is going to be, and how many US based services I currently rely on.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;% Complete&lt;/th&gt;
      &lt;th&gt;Company&lt;/th&gt;
      &lt;th&gt;Service&lt;/th&gt;
      &lt;th&gt;Actions &amp; Comments&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;10%&lt;/td&gt;
      &lt;td&gt;Facebook&lt;/td&gt;
      &lt;td&gt;Social Media&lt;/td&gt;
      &lt;td&gt;Backup and close facebook account. I don&#39;t really use this anyway.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10%&lt;/td&gt;
      &lt;td&gt;LinkedIn&lt;/td&gt;
      &lt;td&gt;Social Media&lt;/td&gt;
      &lt;td&gt;Backup and close LinkedIn account. Make details available using website with some form of Authentication.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10%&lt;/td&gt;
      &lt;td&gt;Twitter&lt;/td&gt;
      &lt;td&gt;Social Media&lt;/td&gt;
      &lt;td&gt;Backup and close twitter account. Self host a stream?&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;80%&lt;/td&gt;
      &lt;td&gt;Google&lt;/td&gt;
      &lt;td&gt;Gmail&lt;/td&gt;
      &lt;td&gt;Redirect domains and migrate email off the service.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1%&lt;/td&gt;
      &lt;td&gt;Google&lt;/td&gt;
      &lt;td&gt;Analytics&lt;/td&gt;
      &lt;td&gt;Search for a non-US replacement.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5%&lt;/td&gt;
      &lt;td&gt;Linode&lt;/td&gt;
      &lt;td&gt;Servers&lt;/td&gt;
      &lt;td&gt;Find another provider and migrate applications/data to new provider&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10%&lt;/td&gt;
      &lt;td&gt;Amazon&lt;/td&gt;
      &lt;td&gt;EC2&lt;/td&gt;
      &lt;td&gt;Investigate data sovereignty for ap-southeast-2 region, and either move instances there, or completely off Amazon&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10%&lt;/td&gt;
      &lt;td&gt;Amazon&lt;/td&gt;
      &lt;td&gt;S3&lt;/td&gt;
      &lt;td&gt;Investigate data sovereignty for ap-southeast-2 region, and either move data there, or completely off Amazon&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1%&lt;/td&gt;
      &lt;td&gt;Heroku&lt;/td&gt;
      &lt;td&gt;Web Apps&lt;/td&gt;
      &lt;td&gt;All the little apps need to be migrated. Probably to a VPS (see above)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1%&lt;/td&gt;
      &lt;td&gt;GitHub&lt;/td&gt;
      &lt;td&gt;Repositories&lt;/td&gt;
      &lt;td&gt;Find another provider (or self host) and migrate repositories&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1%&lt;/td&gt;
      &lt;td&gt;Dropbox&lt;/td&gt;
      &lt;td&gt;File Storage&lt;/td&gt;
      &lt;td&gt;Probably just self-host, and do without the functionality. Move data out of Dropbox, close account.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1%&lt;/td&gt;
      &lt;td&gt;iPhone&lt;/td&gt;
      &lt;td&gt;Mobile Device&lt;/td&gt;
      &lt;td&gt;Move back to Android, install ParanoidAndroid&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1%&lt;/td&gt;
      &lt;td&gt;MacBook&lt;/td&gt;
      &lt;td&gt;Laptop&lt;/td&gt;
      &lt;td&gt;Switch to Linux instead of MacOS X&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;br/&gt;&lt;br/&gt;</content>
 </entry>
 
 <entry>
   <title>This is Bullshit!</title>
   <link href="http://vertis.github.com/2013/05/08/this-is-bullshit.html"/>
   <updated>2013-05-08T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/05/08/this-is-bullshit</id>
   <content type="html">&lt;h2 id=&quot;tldr&quot;&gt;tl;dr&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;My colleagues made a funny &lt;a href=&quot;http://youtu.be/DmC4eaaGmTw&quot;&gt;video&lt;/a&gt; when there was an incident &lt;/li&gt;
  &lt;li&gt;Cake makes everything better&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;upgrading-github-enterprise&quot;&gt;Upgrading Github Enterprise&lt;/h2&gt;
&lt;p&gt;Yesterday, there was a new release for our &lt;a href=&quot;http://enterprise.github.com&quot;&gt;Github Enterprise&lt;/a&gt; installation that mitigated a fairly serious vulnerability. This was announced quite late in our work day, but given the severity of the issue I decided to upgrade the appliance before heading home.&lt;/p&gt;

&lt;p&gt;The upgrade took a little longer than expected, but it eventually finished &lt;em&gt;successfully&lt;/em&gt; and I headed out the door.&lt;/p&gt;

&lt;p&gt;I didn’t realise it at the time, but due to a mandatory password change my email wasn’t coming through to phone. When I finally sat down at my computer after dinner a few hours later, I discovered that all was not right in the world. Our &lt;a href=&quot;http://enterprise.github.com&quot;&gt;Github Enterprise&lt;/a&gt; hadn’t been able to accept pushes for the last two hours.&lt;/p&gt;

&lt;h2 id=&quot;this-is-bullshit&quot;&gt;This is bullshit!&lt;/h2&gt;
&lt;p&gt;In fact the entire Xi’an office had gone to the trouble of making me (and &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt;) a youtube video.&lt;br /&gt;
&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/DmC4eaaGmTw&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;

&lt;p&gt;Thankfully, the issue didn’t take too long to fix. The team at &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; had already created a new package that fixed the issue.&lt;/p&gt;

&lt;h2 id=&quot;some-context-on-bullshit&quot;&gt;Some context on ‘bullshit’&lt;/h2&gt;
&lt;p&gt;Our team in Xi’an put up with all kinds of frustrating problems. The internet and VPN(s) have been known to be unreliable. They occasionally bear the brunt of being a satellite office (getting forgotten when changes are made). There was at least one incident where the team in Xi’an waited through an entire standup without telling the team here in Australia that the sound wasn’t working. &lt;/p&gt;

&lt;p&gt;They bear all these frustrations as professionals and with a happy attitude.&lt;/p&gt;

&lt;p&gt;A little while ago our CIO Nigel Dalton went across to the Xi’an office. One of the sessions he held was how to express their displeasure in an “Australian” way. Which was basically a lesson in saying “This is bullshit”&lt;/p&gt;

&lt;p&gt;While I would have preferred not to be the source of their frustration, I am so very happy that they have learned to express their displeasure.&lt;/p&gt;

&lt;h2 id=&quot;sorry-cake&quot;&gt;Sorry cake&lt;/h2&gt;
&lt;p&gt;Now, hopefully it’s time for me to share something I have learned over many years. &lt;strong&gt;Cake makes everything better&lt;/strong&gt;. If you take nothing else from the blog post it should be this. &lt;/p&gt;

&lt;p&gt;I’m trying to work out how I can have cake delivered to a team on the other side of the world. Hopefully when I do they will film themselves eating the ‘sorry cake’.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I’ve successfully had two huge cakes delivered. The team in Xi’an made me a nice video to say thank you.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/k7qLsDFu39E&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rails3 Asset Pipeline On Heroku</title>
   <link href="http://vertis.github.com/2013/03/03/rails3-asset-pipeline-on-heroku.html"/>
   <updated>2013-03-03T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2013/03/03/rails3-asset-pipeline-on-heroku</id>
   <content type="html">&lt;h1 id=&quot;asset-compilation-doesnt-run-on-heroku-when-deploying-a-rails-3x-application&quot;&gt;Asset compilation doesn’t run on heroku when deploying a Rails 3.x application&lt;/h1&gt;

&lt;p&gt;Another of my ‘I just wasted a bunch of time trying to work out why something was broken’ blog posts.&lt;/p&gt;

&lt;p&gt;This morning I was having a problem where the rails asset compilation wasn’t triggering when deploying an application to heroku. Googling for the problem resulted in a lot of people that were having errors, but no information about a complete lack of running.&lt;/p&gt;

&lt;p&gt;Thankfully the code that does the setup is all open source, so I spent some time digging through &lt;a href=&quot;https://github.com/heroku/heroku-buildpack-ruby&quot;&gt;heroku-buildpack-ruby&lt;/a&gt; on &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; to work out what was going wrong.&lt;/p&gt;

&lt;p&gt;It didn’t take too much digging til I realised that the task was being wrapped in a check:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if rake_task_defined?(&quot;assets:precompile&quot;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This results in a &lt;code&gt;--dry-run&lt;/code&gt; call. As seen below:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# detects if a rake task is defined in the app
# @param [String] the task in question
# @return [Boolean] true if the rake task is defined in the app
def rake_task_defined?(task)
  run(&quot;env PATH=$PATH bundle exec rake #{task} --dry-run&quot;) &amp;amp;&amp;amp; $?.success?
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Unfortunately, this also fails silently if there is a problem.&lt;/p&gt;

&lt;p&gt;Heroku provides a &lt;code&gt;run&lt;/code&gt; command. So we can check directly what is wrong:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;heroku run env PATH=\$PATH bundle exec rake assets:precompile --dry-run
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In my case it was complaining about a lack of nokogiri during the compilation (even though it was a dry run).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Creating a Vagrant base box from an existing Vmdk</title>
   <link href="http://vertis.github.com/2012/11/02/creating-a-vagrant-base-box-from-an-existing-vmdk.html"/>
   <updated>2012-11-02T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2012/11/02/creating-a-vagrant-base-box-from-an-existing-vmdk</id>
   <content type="html">&lt;p&gt;Some background.&lt;/p&gt;

&lt;p&gt;The work I’ve been doing recently involves creating a standard platform for our applications. Part of the process of creating this platform involves spinning a a machine image for use within our production, staging and development environments.There is ample material in our current build pipeline for a dozen blog posts. Maybe I’ll get around to writing about it at some point.&lt;/p&gt;

&lt;p&gt;Our “machine image pipeline” begins by using &lt;a href=&quot;https://fedoraproject.org/wiki/Koji&quot;&gt;Koji&lt;/a&gt; to create a CentOS image. The image is then transformed for use in EC2 and VMWare.&lt;/p&gt;

&lt;p&gt;In addition to using the machines within Amazon EC2, many devs would like to be able to use the machine image locally. Since &lt;a href=&quot;http://vagrantup.com&quot;&gt;Vagrant&lt;/a&gt; is a popular option for running machines locally, it’s an ideal choice to add to the pipeline.&lt;/p&gt;

&lt;p&gt;There doesn’t seem to be a lot of information about the process of converting an existing machine image to work with Vagrant (in an automated fashion). I’ve compiled the steps I had to take and provided links back to where I sourced the information.&lt;/p&gt;

&lt;h2 id=&quot;caveats-and-disclaimers&quot;&gt;Caveats and disclaimers&lt;/h2&gt;
&lt;ol&gt;
  &lt;li&gt;I don’t pretend to be an expert at VirtualBox (I may be doing things the hard way)&lt;/li&gt;
  &lt;li&gt;The code is very “brute force”, it doesn’t check very much between each step&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;step-1---importcreate-the-vm&quot;&gt;Step 1 - Import/Create the VM&lt;/h2&gt;
&lt;p&gt;After lots of searching I came across some VirtualBox &lt;a href=&quot;http://www.halfdog.net/Misc/TipsAndTricks/VirtualBox.html&quot;&gt;tips and tricks&lt;/a&gt; including how to create a machine from scratch. It wasn’t the only blog post I found with these commands, but it was a good complete script from which to hack.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part1.sh&quot;&gt;&lt;/script&gt;

&lt;p&gt;The VBoxManage command will create a directory under the base folder and store a &lt;code&gt;.vbox&lt;/code&gt; file of the same name inside.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;--ostype&lt;/code&gt; will vary depending on the distro you’re trying to use. You can get a complete list with &lt;code&gt;VBoxManage list ostypes&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;step-2---create-a-storage-controller--copyattach-the-vmdk&quot;&gt;Step 2 - Create a storage controller &amp;amp; copy/attach the VMDK&lt;/h2&gt;

&lt;p&gt;From there on in, I departed (slightly) from the script I’d found, and copied my existing &lt;code&gt;.vmdk&lt;/code&gt; into the same directory as the &lt;code&gt;.vbox&lt;/code&gt;.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part2.sh&quot;&gt;&lt;/script&gt;

&lt;p&gt;I have an additional problem. The VMDK only has a 1GB of space. After a bit of searching I found a &lt;a href=&quot;http://stackoverflow.com/questions/11659005/how-to-resize-a-virtualbox-vmdk-file/11659046#11659046&quot;&gt;stackoverflow question&lt;/a&gt; that helped me resize the disk. The above code changes to:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part2-alt.sh&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;h2 id=&quot;step-3---provide-a-nat-port-mapping&quot;&gt;Step 3 - Provide a NAT Port Mapping&lt;/h2&gt;

&lt;p&gt;To setup the items required for Vagrant, we need to ssh into the machine. The first part of that is creating an NAT Port Mapping. Another &lt;a href=&quot;http://timelordz.com/wiki/Virtualbox_Tips&quot;&gt;post&lt;/a&gt; provided the commands necessary to map the ssh port.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part3.sh&quot;&gt;&lt;/script&gt;

&lt;p&gt;I initially thought to make the port mapping &lt;code&gt;222&lt;/code&gt; because vagrant defaults to &lt;code&gt;2222&lt;/code&gt;. Annoyingly this failed silently. Though the reason should be familiar to anyone with basic Linux administration knowledge – using ports less than 1024 requires root access.&lt;/p&gt;

&lt;h2 id=&quot;step-3a---stuff-that-didnt-belong-anywhere-else&quot;&gt;Step 3a - Stuff that didn’t belong anywhere else&lt;/h2&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part3a.sh&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;step-4---booting-and-waiting-for-ssh&quot;&gt;Step 4 - Booting and waiting for SSH&lt;/h2&gt;

&lt;p&gt;With that done, the next step is to setup the user/access that vagrant expects. To do that we need to SSH into the box.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part4.sh&quot;&gt;&lt;/script&gt;

&lt;p&gt;I experimented with a few ways of watching for ssh, but in the end none of them worked very well. So instead, just sleep for a while.&lt;/p&gt;

&lt;h2 id=&quot;step-5---setting-up-the-vagrant-user&quot;&gt;Step 5 - Setting up the vagrant user&lt;/h2&gt;
&lt;p&gt;Creating the user is fairly trivial, editing the /etc/sudoers file not so much. I downloaded a copy and then made the modifications.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part5.sh&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;step-6---shutting-down-and-packaging&quot;&gt;Step 6 - Shutting down and packaging&lt;/h2&gt;
&lt;p&gt;The final step, is to shutdown and package the box for distribution&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-part6.sh&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;finally-the-complete-script&quot;&gt;Finally the complete script&lt;/h2&gt;
&lt;p&gt;For ease of use, here is the complete script.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4005946.js?file=createbox-complete.sh&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>An awesome collection of ruby tricks from JEG2</title>
   <link href="http://vertis.github.com/2012/10/23/jeg2-speaker-deck.html"/>
   <updated>2012-10-23T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2012/10/23/jeg2-speaker-deck</id>
   <content type="html">&lt;p&gt;I very much enjoyed this awesome slide deck from JEG2 from his talk at the Aloha Ruby Conference, in Honolulu, HI in October of 2012.&lt;/p&gt;

&lt;p&gt;It’s covers a large collection of tricks you can do with Ruby.&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;5074b325f8a4020002016573&quot; data-ratio=&quot;1.3333333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>const_defined? wrong constant name Yum.Key (NameError)</title>
   <link href="http://vertis.github.com/2012/01/29/const_defined-wrong-constant-name-yumkey-nameerror.html"/>
   <updated>2012-01-29T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2012/01/29/const_defined-wrong-constant-name-yumkey-nameerror</id>
   <content type="html">&lt;p&gt;I hate obscure errors. Google wasn’t the least bit of help.&lt;/p&gt;

&lt;p&gt;The chef solo run was breaking with:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:15 -0500] INFO: *** Chef 0.10.8 ***&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Setting the run_list to [&amp;quot;recipe[java::openjdk]&amp;quot;, &amp;quot;recipe[mysql::server]&amp;quot;, &amp;quot;recipe[jenkins::default]&amp;quot;] from JSON&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Run List is [recipe[java::openjdk], recipe[mysql::server], recipe[jenkins::default]]&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Run List expands to [java::openjdk, mysql::server, jenkins::default]&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Starting Chef Run for li231-195.members.linode.com&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Running start handlers&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Start handlers complete.&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] INFO: Missing gem &amp;#39;mysql&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] ERROR: Running exception handlers&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] ERROR: Exception handlers complete&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] FATAL: Stacktrace dumped to /var/chef/chef-stacktrace.out&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;[Sun, 29 Jan 2012 07:22:18 -0500] FATAL: NameError: wrong constant name Yum.Key&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bizarre. Looking at the stack trace provided no more clarity. Why was it looking for a constant called ‘Yum.Key’ in the first place?&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;Generated at 2012-01-29 07:22:18 -0500&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;NameError: wrong constant name Yum.Key&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/provider.rb:89:in `const_defined?&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/provider.rb:89:in `build_from_file&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:89:in `block in load_lwrp_providers&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:120:in `call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:120:in `block (2 levels) in foreach_cookbook_load_segment&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:119:in `each&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:119:in `block in foreach_cookbook_load_segment&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:117:in `each&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:117:in `foreach_cookbook_load_segment&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:87:in `load_lwrp_providers&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/run_context.rb:58:in `load&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/client.rb:195:in `setup_run_context&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/client.rb:159:in `run&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/application/solo.rb:192:in `block in run_application&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/application/solo.rb:183:in `loop&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/application/solo.rb:183:in `run_application&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/lib/chef/application.rb:67:in `run&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/gems/chef-0.10.8/bin/chef-solo:25:in `&amp;lt;top (required)&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/bin/chef-solo:19:in `load&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;/usr/local/rvm/gems/ruby-1.9.2-p290@global/bin/chef-solo:19:in `&amp;lt;main&amp;gt;&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I started digging around in the source (as you do when debugging these type of issues):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;build_from_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cookbook_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;pname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename_to_qualified_string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cookbook_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        
        &lt;span class=&quot;c1&quot;&gt;# Add log entry if we override an existing light-weight provider.&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;class_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;convert_to_class_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;overriding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Chef&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Provider&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;const_defined?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Having a look into the &lt;code&gt;convert_to_class_name&lt;/code&gt; and &lt;code&gt;filename_to_qualified_string&lt;/code&gt; methods was a dead end, they seemed to be working alright.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;convert_to_class_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;rname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;regexp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;%r{^(.+?)(_(.+))?$}&lt;/span&gt;
        
  &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;capitalize&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;regexp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;          
      &lt;span class=&quot;n&quot;&gt;rname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;capitalize&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mn&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;n&quot;&gt;rname&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;filename_to_qualified_string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;file_base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;basename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;.rb&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file_base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;default&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;_&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file_base&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I then decided to see what values were being provided to &lt;code&gt;build_from_file&lt;/code&gt;. Finally, a breakthrough. The &lt;code&gt;file_name&lt;/code&gt; being provided looked strange &lt;code&gt;/var/chef/cookbooks/yum/providers/._key.rb&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where on earth was that coming from!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The culprit turned out to be the code I was using to copy the cookbooks to the server. Which was picking up the invisible ‘._’ file that Mac OS X uses: &lt;a href=&quot;http://support.apple.com/kb/TA20578&quot;&gt;http://support.apple.com/kb/TA20578&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;tar cj . | ssh -o &amp;#39;StrictHostKeyChecking no&amp;#39; &amp;quot;$host&amp;quot; &amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;rm -rf /var/chef &amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;mkdir /var/chef &amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;cd /var/chef &amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;tar xj &amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;bash ./provision.sh&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I worked around the issue by removing those files at the destination with:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;rm `find ./  -name &amp;quot;\._*&amp;quot;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Not an ideal solution, but it fixed the immediate problem and allowed me to get my Jenkins server installed.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>git: fatal: index file smaller than expected</title>
   <link href="http://vertis.github.com/2012/01/24/git-fatal-index-file-smaller-than-expected.html"/>
   <updated>2012-01-24T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2012/01/24/git-fatal-index-file-smaller-than-expected</id>
   <content type="html">&lt;p&gt;NB: You should back up your working directory before trying anything in this post.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git status 
&lt;span class=&quot;go&quot;&gt;fatal: index file smaller than expected&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git reset --hard
&lt;span class=&quot;go&quot;&gt;fatal: index file smaller than expected&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Uh-Oh-Spaghetti-O’s. Not a nice error message to get first thing in the morning. &lt;/p&gt;

&lt;p&gt;After much googling I realized that the .git/index is only used to track staged and unstaged changes. So the simplest way&lt;br /&gt;
out of this mess is to move the broken index out of the way.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mv .git/index .git/index.backup
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git status&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You should now be presented with a rather confused view of the working tree, where it thinks things have been deleted and there is a whole raft of untracked files…&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git add .&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And we’re back to where we should be.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Renaming a Rails 3 app</title>
   <link href="http://vertis.github.com/2012/01/15/renaming-a-rails3-app.html"/>
   <updated>2012-01-15T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2012/01/15/renaming-a-rails3-app</id>
   <content type="html">&lt;p&gt;Annoyingly Rails 3 spreads whatever name you give it when running ‘rails new’ over 10 or so files. This makes it hard to setup a base app. The following&lt;br /&gt;
shell commands will change the name of the app to the new name:&lt;/p&gt;

&lt;strike&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;find . -type f -print0 | xargs -0 perl -pi -e &amp;#39;s/Oldapp/Newapp/g&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;find . -type f -print0 | xargs -0 perl -pi -e &amp;#39;s/oldapp/newapp/g&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


I&#39;m a little ashamed that the snippet uses perl instead of ruby. When I was trying to get the equivalent to work in ruby 1.9 it keep complaining about encoding.

For anyone that is interested the ruby version I was attempting to use was:
  

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;find . -type f -print0 |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;  xargs -0 ruby -pi -e &amp;#39;$_.gsub(/Oldapp/, &amp;quot;Newapp&amp;quot;)&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


Which gets an error:

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;-e:1:in `gsub&amp;#39;: invalid byte sequence in UTF-8 (ArgumentError)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;	from -e:1:in `&amp;lt;main&amp;gt;&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


Even trying to force an encoding didn&#39;t seem to solve the problem.


&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;find . -type f -print0 |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;  xargs -0 ruby -pi -e &amp;#39;$_.force_encoding(&amp;quot;UTF-8&amp;quot;).gsub(/Oldapp/, &amp;quot;Newapp&amp;quot;)&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


It is likely this wouldn&#39;t occur if used from Ruby 1.8&lt;/strike&gt;

&lt;p&gt;Update:&lt;/p&gt;

&lt;p&gt;While it’s nice to have a one liner that will accomplish the renaming. I’ve seen the above one liner corrupt the .git/index&lt;/p&gt;

&lt;p&gt;I’ve written a simple ruby script that is more limited in how it selects the files:&lt;/p&gt;

&lt;script src=&quot;http://gist.github.com/1672812.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>TinyTds::Error: Unable to open socket (Sequel::DatabaseConnectionError)</title>
   <link href="http://vertis.github.com/2011/06/16/tiny-tds-unable-to-open-socket.html"/>
   <updated>2011-06-16T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/06/16/tiny-tds-unable-to-open-socket</id>
   <content type="html">&lt;p&gt;While working on one of our rails apps at work, I got the following error. Since we only recently switched to using TinyTds, I wasn’t quite sure what the cause was.&lt;br /&gt;
It turns out that in my case I’d switched the VM I run SQL Server on from ‘Host only’ to ‘Bridged’. So the driver couldn’t connect to the port.&lt;/p&gt;

&lt;p&gt;When in doubt:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;telnet hostname 1433&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Getting the root directory of your gem</title>
   <link href="http://vertis.github.com/2011/06/03/getting-the-root-directory-of-your-gem.html"/>
   <updated>2011-06-03T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/06/03/getting-the-root-directory-of-your-gem</id>
   <content type="html">&lt;p&gt;I’ve been writing a few gems recently. One thing that you inevitably need to be able to do is find the root directory of your gem.&lt;/p&gt;

&lt;p&gt;Assuming that you place this in ‘lib/your_gem.rb’, the following code will return the path to the root of your gem:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;YourGem&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;root&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expand_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;../..&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;__FILE__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>An inefficient MongoDB query</title>
   <link href="http://vertis.github.com/2011/05/25/an-inefficient-mongodb-query.html"/>
   <updated>2011-05-25T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/05/25/an-inefficient-mongodb-query</id>
   <content type="html">&lt;h3 id=&quot;short-version&quot;&gt;Short Version&lt;/h3&gt;
&lt;p&gt;MongoDB doesn’t support queries using case insensitive regular expressions  against indexes (e.g /blah/i).&lt;/p&gt;

&lt;h3 id=&quot;long-version&quot;&gt;Long Version&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Firstly: A big thank you goes to Jason McCay from &lt;a href=&quot;http://mongohq.com&quot;&gt;MongoHQ&lt;/a&gt; for his help on this issue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yesterday morning I received an urgent email from &lt;a href=&quot;http://mongohq.com&quot;&gt;MongoHQ&lt;/a&gt; regarding one of my databases. According to the email, one of my queries was missing the index. The scale at which these queries were occurring was putting significant load on their server.&lt;/p&gt;

&lt;p&gt;The specific query:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;Mon May 23 22:47:38 [conn707] query mydb.profiles reslen:441 nscanned:1979415 \&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;{ address: /^123 Fake Rd, Sydney, NSW 2000$/i }  nreturned:1 44740ms&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And the offending ruby code:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;/^&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;$/i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:lat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lat&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:lng&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lng&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save!&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The reasoning behind my code was to find profiles that had the same address, and update them with the latitude and longitude. I considered preventing another request to the geocoding service to be beneficial due to the restrictive limits.&lt;/p&gt;

&lt;p&gt;Since I couldn’t guarantee that the addresses had been entered with the same case sensitivity, I’d chosen to make the regex insensitive. Sadly, I wasn’t aware that MongoDB doesn’t support queries using case insensitive regular expressions against indexes (at this time).&lt;/p&gt;

&lt;p&gt;A quick fix was to create another column that had an all lower case copy of the address and remove the ‘i’ from the query. I ran the following script (not necessarily the most efficient way of creating the copy):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ne&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:lowercase_address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save!&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And changed my code to the following:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:lowercase_address&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;/^&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;downcase&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;$/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:lat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lat&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:lng&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lng&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save!&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It may have caused the ruby code to be a little bit more intensive, but it sped up the processing considerably.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>List of Rackspace flavors and images</title>
   <link href="http://vertis.github.com/2011/04/02/list-of-rackspace-flavors-and-images.html"/>
   <updated>2011-04-02T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/04/02/list-of-rackspace-flavors-and-images</id>
   <content type="html">&lt;p&gt;I was recently trying to use the chef command line tool ‘knife’ to provision a new rackspace server. The tool requires&lt;br /&gt;
that you specify the flavor (size) and image(distro version), unfortunately I couldn’t find an easily searchable source of this information.&lt;/p&gt;

&lt;p&gt;Here is the list of flavors:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;1    256 server&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;2    512 server&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;3    1GB server&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;4    2GB server&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;5    4GB server&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;6    8GB server&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;7    15.5GB server&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And here is the list of images:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;4        Debian 5.0 (lenny)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;10      Ubuntu 8.04.2 LTS (hardy)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;14      Red Hat Enterprise Linux 5.4&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;19      Gentoo 10.1&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;23      Windows Server 2003 R2 SP2 x64&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;24      Windows Server 2008 SP2 x64&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;28      Windows Server 2008 R2 x64&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;29      Windows Server 2003 R2 SP2 x86&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;31      Windows Server 2008 SP2 x86&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;40      Oracle EL Server Release 5 Update 4&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;41      Oracle EL JeOS Release 5 Update 3&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;49      Ubuntu 10.04 LTS (lucid)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;51      CentOS 5.5&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;53      Fedora 13&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;55      Arch 2010.05&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;56      Windows Server 2008 SP2 x86 - MSSQL2K8R2&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;57      Windows Server 2008 SP2 x64 - MSSQL2K8R2&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;58      Windows Server 2008 R2 x64 - MSSQL2K8R2&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;62      Red Hat Enterprise Linux 5.5&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;69      Ubuntu 10.10 (maverick)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;71      Fedora 14&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;14362    Ubuntu 9.10 (karmic)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;187811  CentOS 5.4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While this information may go out of date here is the current (1st of April 2011) list. Hopefully it’s useful&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Removing a collaborator from all GitHub repos</title>
   <link href="http://vertis.github.com/2011/03/30/removing-a-collaborator-from-all-github-repos.html"/>
   <updated>2011-03-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/03/30/removing-a-collaborator-from-all-github-repos</id>
   <content type="html">&lt;p&gt;I help manage the &lt;a href=&quot;http://www.github.com&quot;&gt;GitHub&lt;/a&gt; account for the company I work for. Recently, I’ve been in a situation where I needed to remove a former colleague from about 25 &lt;a href=&quot;http://www.github.com&quot;&gt;GitHub&lt;/a&gt; repositories. Admittedly this is only painful because the account we’re using is an individual account. Frustratingly, &lt;a href=&quot;https://github.com/blog/675-organizations-for-small-businesses&quot;&gt;“Organizations”&lt;/a&gt; an account type introduced to deal with this exact issue, is difficult to justify to management because of the additional cost.&lt;/p&gt;

&lt;p&gt;In the meantime I’ve written a quick script using the &lt;a href=&quot;http://develop.github.com/&quot;&gt;GitHub Api&lt;/a&gt; that iterates through the repositories and removes a given collaborator. You can find the source code below:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;#Gemfile&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://rubygems.org&amp;quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;httparty&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A library to package up some functionality:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;#lib/github.rb&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;bundler/setup&amp;#39;&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;Bundler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Github&lt;/span&gt;
  &lt;span class=&quot;kp&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;HTTParty&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;base_uri&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;http://github.com/api/v2/json&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;vi&quot;&gt;@username&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;basic_auth&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pass&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;repositories&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/repos/show/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parsed_response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;repositories&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;collaborators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/repos/show/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/collaborators&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parsed_response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;collaborators&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;remove_collaborator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;respository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;no&quot;&gt;Github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;post&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;/repos/collaborators/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;vi&quot;&gt;@username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/remove/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And the actual script:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# remove_user.rb&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;lib/github&amp;#39;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ARGV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty?&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Usage: remove_user &amp;lt;username&amp;gt;&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ARGV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;github&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;vertis&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;xxxx&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repositories&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;private&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]==&lt;/span&gt;&lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Checking: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;collaborators&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;collaborators&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;collaborators&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;include?&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Removing &amp;#39;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;#39; from collaborators list of &amp;#39;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;#39;&amp;quot;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;github&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_collaborator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It’s certainly not a &lt;em&gt;polished&lt;/em&gt; script, but it does the job. Hopefully, I’ll eventually be able to convince my manager to upgrade :)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Review: Data Source Handbook by Peter Warden (O'Reilly)</title>
   <link href="http://vertis.github.com/2011/02/01/review-data-source-handbook-by-peter-warden-o-reilly.html"/>
   <updated>2011-02-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/02/01/review-data-source-handbook-by-peter-warden-o-reilly</id>
   <content type="html">&lt;p&gt;When a post about the &lt;a href=&quot;http://oreilly.com/catalog/0636920018254/&quot;&gt;Data Source Handbook&lt;/a&gt; came through my RSS reader today I was excited. I’ve used quite a few webservices, and follow &lt;a href=&quot;http://programmableweb.com&quot;&gt;programmableweb&lt;/a&gt; closely, so a book about APIs is exactly what I was interested in reading. Later in the evening I caved and bought the ebook version - I should have looked more closely.&lt;/p&gt;

&lt;p&gt;At 39 pages I would consider the $7.50 I paid (thanks retailmenot) to be more than the &lt;em&gt;book&lt;/em&gt; is worth.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://oreilly.com/catalog/0636920018254/&quot;&gt;Data Source Handbook&lt;/a&gt; is not substantive, and shares little more than a single request to each of the services it covers, and where to signup for an api key. While Peter Warden has obviously spent quite a bit of time using the different services, as evidenced by &lt;a href=&quot;https://github.com/petewarden/findbyemail&quot;&gt;https://github.com/petewarden/findbyemail&lt;/a&gt;, the level of detail just didn’t impress me.&lt;/p&gt;

&lt;p&gt;The book is organised by the categories of the different webservices; Websites, People by Email, People by Name, People by Account, Search Terms, Locations, Companies, IP Addresses, and Products(Books, Films, Music, etc).&lt;/p&gt;

&lt;p&gt;Of the 54 APIs covered, I’d used about half already. Which wouldn’t be a problem if the coverage of these APIs had any depth.&lt;/p&gt;

&lt;p&gt;All in all, if you’re looking for an advanced and substantive book on APIs…this isn’t it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Quick Reminder: ssh-copy-id on Mac OS X</title>
   <link href="http://vertis.github.com/2011/01/19/quick-reminder-ssh-copy-id-on-mac-os-x.html"/>
   <updated>2011-01-19T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2011/01/19/quick-reminder-ssh-copy-id-on-mac-os-x</id>
   <content type="html">&lt;p&gt;Mac OS X for some reason lacks the ssh-copy-id shell script. You can install ssh-copy-id on Mac OS X using either &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;‘homebrew’&lt;/a&gt; or &lt;a href=&quot;http://www.macports.org&quot;&gt;‘macports’&lt;/a&gt;. Since it is a fairly trivial script you could also choose to copy it from various sources manually.&lt;/p&gt;

&lt;p&gt;e.g:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;curl https://github.com/beautifulcode/ssh-copy-id-for-OSX/ssh-copy-id.sh &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
      -o /usr/local/bin/ssh-copy-id chmod +x /usr/local/bin/ssh-copy-id&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Switching to RVM+REE+NGINX+Passenger</title>
   <link href="http://vertis.github.com/2010/09/30/switching-to-rvm-ree-nginx-passenger.html"/>
   <updated>2010-09-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/09/30/switching-to-rvm-ree-nginx-passenger</id>
   <content type="html">&lt;p&gt;We’re increasing the push toward the release, and I’m now spending precious time looking into the why our Rails Stack is &lt;em&gt;leaking&lt;/em&gt; workers. My initial research suggested that these workers could be sent a SIGABRT to get them to throw a stacktrace and exit - this hasn’t worked however.&lt;/p&gt;

&lt;p&gt;I’ve been planning to change from the current stack UbuntuProvidedRuby1.8.7+Apache+Passenger to RVM+REE+NGINX+Passenger for a while. With the prerequisite testing done that our app works with the new stack. I’ve decided that rather than attack this problem head-on I’ll use this opportunity to switch and then tackle the problem again if it shows up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; After changing the stack it appears to have stopped &lt;em&gt;leaking&lt;/em&gt; workers - that’s a positive outcome to a problem I can’t afford the time to look into in more detail. Additionally the before and after performance tests are in:&lt;/p&gt;

&lt;p&gt;Apache:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;Server Software:        Apache/2.2.14
Server Port:            80

Document Path:          /
Document Length:        &lt;span class=&quot;m&quot;&gt;20266&lt;/span&gt; bytes

Concurrency Level:      5
Time taken &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; tests:   344.008 seconds
Complete requests:      1000
Failed requests:        47
   &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Connect: 0, Receive: 0, Length: 47, Exceptions: 0&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Write errors:           0
Total transferred:      &lt;span class=&quot;m&quot;&gt;20788903&lt;/span&gt; bytes
HTML transferred:       &lt;span class=&quot;m&quot;&gt;20254908&lt;/span&gt; bytes
Requests per second:    2.91 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#/sec] (mean)&lt;/span&gt;
Time per request:       1720.039 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;mean&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Time per request:       344.008 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;mean, across all concurrent requests&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Transfer rate:          59.02 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Kbytes/sec&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; received

Connection Times &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
              min  mean&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;+/-sd&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; median   max
Connect:        &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;    &lt;span class=&quot;m&quot;&gt;6&lt;/span&gt;   2.5      &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;      37
Processing:   &lt;span class=&quot;m&quot;&gt;750&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1714&lt;/span&gt; 267.2   &lt;span class=&quot;m&quot;&gt;1668&lt;/span&gt;    2922
Waiting:      &lt;span class=&quot;m&quot;&gt;732&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1690&lt;/span&gt; 265.8   &lt;span class=&quot;m&quot;&gt;1645&lt;/span&gt;    2900
Total:        &lt;span class=&quot;m&quot;&gt;755&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1720&lt;/span&gt; 267.3   &lt;span class=&quot;m&quot;&gt;1673&lt;/span&gt;    2927

Percentage of the requests served within a certain &lt;span class=&quot;nb&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  50%   1673
  66%   1778
  75%   1876
  80%   1886
  90%   2071
  95%   2238
  98%   2389
  99%   2546
 100%   &lt;span class=&quot;m&quot;&gt;2927&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;longest request&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;NGINX:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;Server Software:        nginx/0.7.67
Server Port:            80

Document Path:          /
Document Length:        &lt;span class=&quot;m&quot;&gt;20266&lt;/span&gt; bytes

Concurrency Level:      5
Time taken &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; tests:   304.670 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      &lt;span class=&quot;m&quot;&gt;20798421&lt;/span&gt; bytes
HTML transferred:       &lt;span class=&quot;m&quot;&gt;20276909&lt;/span&gt; bytes
Requests per second:    3.28 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#/sec] (mean)&lt;/span&gt;
Time per request:       1523.352 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;mean&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Time per request:       304.670 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;mean, across all concurrent requests&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Transfer rate:          66.67 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;Kbytes/sec&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; received

Connection Times &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
              min  mean&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;+/-sd&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; median   max
Connect:        &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;    &lt;span class=&quot;m&quot;&gt;7&lt;/span&gt;   3.8      &lt;span class=&quot;m&quot;&gt;6&lt;/span&gt;      43
Processing:   &lt;span class=&quot;m&quot;&gt;866&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1513&lt;/span&gt; 266.3   &lt;span class=&quot;m&quot;&gt;1460&lt;/span&gt;    3900
Waiting:      &lt;span class=&quot;m&quot;&gt;848&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1490&lt;/span&gt; 264.3   &lt;span class=&quot;m&quot;&gt;1439&lt;/span&gt;    3869
Total:        &lt;span class=&quot;m&quot;&gt;871&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1521&lt;/span&gt; 266.6   &lt;span class=&quot;m&quot;&gt;1468&lt;/span&gt;    3905

Percentage of the requests served within a certain &lt;span class=&quot;nb&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  50%   1468
  66%   1562
  75%   1651
  80%   1672
  90%   1779
  95%   1901
  98%   2104
  99%   2373
 100%   &lt;span class=&quot;m&quot;&gt;3905&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;longest request&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Daily Stand Up #1</title>
   <link href="http://vertis.github.com/2010/09/28/daily-stand-up-1.html"/>
   <updated>2010-09-28T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/09/28/daily-stand-up-1</id>
   <content type="html">&lt;p&gt;I’ve made a commitment with myself that I’m going to write blog posts regardless of whether I feel like it or not. I’m going to start by writing the same kind of content that comes up at “Stand Ups” every morning.&lt;/p&gt;

&lt;p&gt;For a start my day is currently sliced into working on taking sliced HTML and working it into the Rails app, that our team in currently working on, as themes. It’s giving me an opportunity to exercise my, somewhat rusted, CSS/HTML/JS skills.&lt;/p&gt;

&lt;p&gt;I’ve also been spending some time with my operations/admin hat on. Working through the process of making sure that the actual ops team delivers what we need to launch the product. It’s all pretty run-of-the-mill stuff, a more interesting problem is the reliability of using the legacy SQL Server database over a long period of time.&lt;/p&gt;

&lt;p&gt;We’ve been seeing errors like ‘ActiveRecord::StatementInvalid: ODBC::Error: 08S01 (20020) [unixODBC][FreeTDS][SQL Server]Bad token from the server: Datastream processing out of sync’ and ‘ActiveRecord::StatementInvalid: ODBC::Error: S1008 (0) [unixODBC][FreeTDS][SQL Server]Operation was cancelled’&lt;/p&gt;

&lt;p&gt;Testing so far has led us to believe that it has something to do with old/invalid connections not being dropped and replaced with new connections. This may or may not have to do with the fact that the connection the SQL Server is done directly on the model(s) rather than through ActiveRecord::Base…which is in turn because we’re storing everything that we can in a MySQL database.&lt;/p&gt;

&lt;p&gt;We’ve started working with an already customised version of the activerecord-sqlserver-adapter to improve the way that it handles these errors - by including the error messages in the array of messages that result in a reconnect. Whether this turns out to be an effective solution or not remains to be seen.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Rails security resources</title>
   <link href="http://vertis.github.com/2010/08/30/rails-security-resources.html"/>
   <updated>2010-08-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/08/30/rails-security-resources</id>
   <content type="html">&lt;p&gt;As we make the push toward releasing the platform that I’m working on we’ve installed &lt;a href=&quot;http://github.com/rails/exception_notification&quot;&gt;exception_notification&lt;/a&gt; in our Rails app. With the increased visibility of all the exceptions it became apparent quite quickly that there were numerous hits against the server from automated vulnerability scanners. These attempts were causing routing errors as they looked for paths like ‘/user/soapCaller.bs’ - thankfully not targeting Rails applications.&lt;/p&gt;

&lt;p&gt;The arrival of this sort of scan was not particularly surprising to me as I’ve seen similar scans in the past. I’ve even actively dabbled in some security research by running a few honeypot projects.&lt;/p&gt;

&lt;p&gt;Even though these scans usually go after large installations such as Wordpress, Drupal, Joomla and phpMyAdmin, it isn’t stupid to take it as a reminder to keep up to date on security vulnerabilities. In the case of Ruby on Rails the starting point would be the &lt;a href=&quot;http://groups.google.com/group/rubyonrails-security&quot;&gt;rubyonrails-security&lt;/a&gt; google group and the Ruby on Rails &lt;a href=&quot;http://weblog.rubyonrails.org&quot;&gt;blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another great resource is &lt;a href=&quot;http://www.railsinside.com/?s=security&quot;&gt;Rails Inside&lt;/a&gt;. Rails Inside usually picks up any serious flaws and relays them to the community. In addition to this, they follow new releases of popular plugins/gems that may form part of your app. The site provides an important service because keeping up-to-date is a good way of reducing the risk of being caught by a vulnerability that has been dutifully patched by the maintainer.&lt;/p&gt;

&lt;p&gt;The above is certainly not a complete list, so I’d like to hear if there are any other rails/ruby security resources that you find useful.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>This week I learned - that bundler needs work</title>
   <link href="http://vertis.github.com/2010/08/01/this-week-i-learned-that-bundler-needs-work.html"/>
   <updated>2010-08-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/08/01/this-week-i-learned-that-bundler-needs-work</id>
   <content type="html">&lt;p&gt;One of the challenges over the last few weeks has been switching development environments to phase in the new Macbook Pros (sweet!). One of the problems has been the fact that both our rails projects use bundler.&lt;/p&gt;

&lt;p&gt;Before I go on I should point out that &lt;a href=&quot;http://www.twitter.com/wycats&quot;&gt;@wycats&lt;/a&gt; was very helpful in sorting this problem out.&lt;/p&gt;

&lt;p&gt;It ‘s not that bundler is bad directly, but when you’re using bundler on Mac but deploying to Ubuntu there are a few eccentricities - particularly with native gems.&lt;/p&gt;

&lt;p&gt;If you’ve run  ‘bundle package’ at any point in the past then bundler will have started keeping a copy of all the gems in vendor/cache. When you’re using a gem that needs certain compile flags on Ubuntu but not MacOS X that poses a problem.&lt;/p&gt;

&lt;p&gt;The way to do this with bundler pre 1.0 is/was to install the gem to the system using the requisite build flags, and then when bundler installs the gem it takes the already installed gem. If the gem is already in vendor/cache however that doesn’t work.&lt;/p&gt;

&lt;p&gt;Suffice it to say that after some confusion and removal of the gem from BOTH caches (vendor/cache and ~/.bundle) and then running bundle install will fixed the problem.&lt;/p&gt;

&lt;p&gt;Incidentally bundler 1.0.0rc2 takes care of this problem by introducing the ability to add build flags to the .bundle/config file.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ruby non-greedy matching (OR how interro saved the day)</title>
   <link href="http://vertis.github.com/2010/03/24/ruby-non-greedy-matching-or-how-interro-saved-the-day.html"/>
   <updated>2010-03-24T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/03/24/ruby-non-greedy-matching-or-how-interro-saved-the-day</id>
   <content type="html">&lt;p&gt;I’ve spend most of the afternoon working on a complex regex in order to parse command line argument forms (for lack of a better term). If you’ve ever run the man command you’ll know what I’m talking about. Take the tar command as an example:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-man&quot; data-lang=&quot;man&quot;&gt;tar  [ - ] A --catenate --concatenate | c --create | d --diff --compare
       | --delete | r --append | t --list | u --update | x --extract  --get  [
       options ] pathname [ pathname ... ]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you’re already familiar with regular expressions you’ll know that doing something like:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;[\[].*[\]]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;trying to match:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;[ - ]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;won’t accomplish what you think. Instead of getting just the first set of braces you’ll end up with the whole remainder of the string. This is because of a feature, we’ll give it that title, called greedy matching. Greedy matching means that it takes the largest possible chunk that your regex will match, which in this case is the ‘]’ on the end of pathname.&lt;/p&gt;

&lt;p&gt;I was aware of what was going on, but not being a particular master of regular expressions, I wasn’t sure how to get it to stop being greedy. As it turns out its quite easy.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;.*   - Greedy matching&lt;/li&gt;
  &lt;li&gt;.+   - Greedy matching&lt;/li&gt;
  &lt;li&gt;.*?  - Non-greedy matching&lt;/li&gt;
  &lt;li&gt;.+?  - Non-greedy matching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It could not be easier, once you know about it of course.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Why "Mad Libs" style signup forms are just a gimmick</title>
   <link href="http://vertis.github.com/2010/03/07/why-mad-libs-style-signup-forms-are-just-a-gimmick.html"/>
   <updated>2010-03-07T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/03/07/why-mad-libs-style-signup-forms-are-just-a-gimmick</id>
   <content type="html">&lt;p&gt;The last few days I’ve been seeing a few references to &lt;a href=&quot;http://en.wikipedia.org/wiki/Mad_Libs&quot;&gt;“Mad Libs”&lt;/a&gt;. Confused, I quickly punched the term into Google and discovered that it was a reference to something we’ve all done at school, filling in the blanks in a sentence. A couple of sites, like &lt;a href=&quot;http://konigi.com/notebook/mad-libs-style-form-increases-conversion-25-40&quot;&gt;konigi&lt;/a&gt; and &lt;a href=&quot;http://www.webmonkey.com/2010/02/using-mad-libs-to-make-web-forms-more-fun/&quot;&gt;webmonkey&lt;/a&gt; had posts about &lt;a href=&quot;http://huffduffer.com/&quot;&gt;HuffDuffer&lt;/a&gt; using a &lt;a href=&quot;http://en.wikipedia.org/wiki/Mad_Libs&quot;&gt;“Mad Libs”&lt;/a&gt; style form as their sign up form. The question was raised by a few people as to whether this was good design.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.lukew.com/ff/entry.asp?1007&quot;&gt;Luke Wroblewski&lt;/a&gt; (in collaboration with &lt;a href=&quot;http://vast.com&quot;&gt;Vast.com&lt;/a&gt;) did some research and came up with astounding results that the conversion ratio rose some &lt;strong&gt;25-40%&lt;/strong&gt; when a Mad Libs style form was used. That’s an impressive, but &lt;strong&gt;meaningless&lt;/strong&gt; number. Don’t get me wrong, I’m very happy that &lt;a href=&quot;http://huffduffer.com/&quot;&gt;HuffDuffer&lt;/a&gt; has found something that works for them. But lets step back for a second and analyse why the results that &lt;a href=&quot;http://vast.com&quot;&gt;Vast.com&lt;/a&gt; got might be this way.&lt;/p&gt;

&lt;p&gt;Here’s a thought; maybe it’s just because its a completely novel approach to a signup form. But can you really see this becoming the standard way to do signup forms? How long do you think it will be before this becomes more annoying than amusing? So quit jibber jabbering about how good it is and take a look at the long term picture. Mad Libs style forms are not something you can take and apply elsewhere with guaranteed results.&lt;/p&gt;

&lt;p&gt;To be fair, I’m biased against filling in the blanks. I hated the premise at school and I will probably continue to hate the practice until it, or I, ceases to exist.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Security wake up call</title>
   <link href="http://vertis.github.com/2010/03/05/security-wake-up-call.html"/>
   <updated>2010-03-05T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/03/05/security-wake-up-call</id>
   <content type="html">&lt;p&gt;I don’t think that I’ve had this much adrenalin pumping through my system on a Saturday morning in quite a while. My girlfriend signed into her email (as she does most mornings), to discover an email from eBay Live Support asking for a code. She called me over and a few seconds later the email vanished. What happened after that point is a blur of password resets, both her and the would be hacker trying to gain control of the hotmail and through it the eBay account.&lt;/p&gt;

&lt;p&gt;There were paranoid moments when passwords wouldn’t work, but in the end she’s still in control of the accounts. Just about every account she owns has now had the password and details changed to help protect it.&lt;/p&gt;

&lt;p&gt;It’s intrusive though. How exactly did the attacker break into the account? Not phishing, Cherie is well aware of those type of malicious emails. Guessing the security questions? Maybe.&lt;/p&gt;

&lt;p&gt;That raises other concerns though, email addresses become repositories of knowledge for our online lives. Just about every account you sign up for online has to have an email account linked to it, that means many details about your online life are there in fragments. We’ll never know exactly what the hacker had access to (albeit briefly).&lt;/p&gt;

&lt;p&gt;I’m personally going to be reviewing all my accounts to make sure that they’re secure, and I’d advise you to do the same.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Sinatra on Java</title>
   <link href="http://vertis.github.com/2010/02/21/sinatra-on-java.html"/>
   <updated>2010-02-21T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/02/21/sinatra-on-java</id>
   <content type="html">&lt;p&gt;With &lt;a href=&quot;http://www.jruby.org/&quot;&gt;JRuby&lt;/a&gt; and Warbler it’s possible to get &lt;a href=&quot;http://www.sinatrarb.org&quot;&gt;Sinatra&lt;/a&gt;, or any WebApp based on Rack, running on a myriad of different Java application servers. There are of course gotchas when it comes to using Warbler with the many different app servers, so this is a definitive guide to everything you have to do to get a simple &lt;a href=&quot;http://www.sinatrarb.org&quot;&gt;Sinatra&lt;/a&gt; app running on the various application servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why &lt;a href=&quot;http://www.sinatrarb.org&quot;&gt;Sinatra&lt;/a&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are examples of how to get Rails running on Tomcat and Websphere floating around the web, but I find Rails overkill for small projects. With that in mind, it’s worth looking at how to get Sinatra running on java application servers. Besides the weight of rails, Sinatra is a nice, easy to learn framework.&lt;/p&gt;

&lt;p&gt;Start by installing &lt;a href=&quot;http://www.sinatrarb.org&quot;&gt;Sinatra&lt;/a&gt; and Warbler. You don’t have to be using JRuby to install Warbler, the install will download a gem of the jruby jars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Sinatra and Warbler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lets start by installing the required gems.&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ sudo gem install sinatra warbler haml&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Haml isn’t strictly required, but the template I’m going to use has views generated in haml, so if you’re following the tutorial closely you’ll want to install it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;
Create a project folder (and structure)
&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt; &lt;/strong&gt;I usually keep a sinatra project template handy. So I’m going to clone my existing template off github. You can create a more minimal example than the one I’ll download, this will get the job done though.&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ git clone git://github.com/vertis/sinatra-example.git deploy_test&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;TODO: Details about the project&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;
Check that our page is displayed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ rackup&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Go to http://localhost:9292/ and you should see our default page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate the warble config&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ mkdir config &amp;amp;&amp;amp; warble config&lt;/span&gt;&lt;strong&gt;
&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lets look at the config file that was generated:&lt;/p&gt;

&lt;!-- [gist id=250634] --&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# Disable automatic framework detection by uncommenting/setting to false&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Warbler.framework_detection = false&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Warbler web application assembly configuration file&lt;/span&gt;
&lt;span class=&quot;no&quot;&gt;Warbler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# Temporary directory where the application is staged&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.staging_dir = &amp;quot;tmp/war&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Application directories to be included in the webapp.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dirs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;%w(app config lib log vendor tmp)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Additional files/directories to include, above those in config.dirs&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.includes = FileList[&amp;quot;db&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Additional files/directories to exclude&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.excludes = FileList[&amp;quot;lib/tasks/*&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Additional Java .jar files to include.  Note that if .jar files are placed&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# in lib (and not otherwise excluded) then they need not be mentioned here.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# JRuby and JRuby-Rack are pre-loaded in this list.  Be sure to include your&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# own versions if you directly set the value&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.java_libs += FileList[&amp;quot;lib/java/*.jar&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Loose Java classes and miscellaneous files to be placed in WEB-INF/classes.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.java_classes = FileList[&amp;quot;target/classes/**.*&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# One or more pathmaps defining how the java classes should be copied into&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# WEB-INF/classes. The example pathmap below accompanies the java_classes&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# configuration above. See http://rake.rubyforge.org/classes/String.html#M000017&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# for details of how to specify a pathmap.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.pathmaps.java_classes &amp;lt;&amp;lt; &amp;quot;%{target/classes/,}p&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Gems to be included. You need to tell Warbler which gems your application needs&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# so that they can be packaged in the war file.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# The Rails gems are included by default unless the vendor/rails directory is present.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.gems += [&amp;quot;activerecord-jdbcmysql-adapter&amp;quot;, &amp;quot;jruby-openssl&amp;quot;]&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.gems &amp;lt;&amp;lt; &amp;quot;tzinfo&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Uncomment this if you don&amp;#39;t want to package rails gem.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.gems -= [&amp;quot;rails&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# The most recent versions of gems are used.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# You can specify versions of gems by using a hash assignment:&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.gems[&amp;quot;rails&amp;quot;] = &amp;quot;2.0.2&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# You can also use regexps or Gem::Dependency objects for flexibility or&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# fine-grained control.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.gems &amp;lt;&amp;lt; /^merb-/&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.gems &amp;lt;&amp;lt; Gem::Dependency.new(&amp;quot;merb-core&amp;quot;, &amp;quot;= 0.9.3&amp;quot;)&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Include gem dependencies not mentioned specifically&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gem_dependencies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Files to be included in the root of the webapp.  Note that files in public&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# will have the leading &amp;#39;public/&amp;#39; part of the path stripped during staging.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.public_html = FileList[&amp;quot;public/**/*&amp;quot;, &amp;quot;doc/**/*&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Pathmaps for controlling how public HTML files are copied into the .war&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.pathmaps.public_html = [&amp;quot;%{public/,}p&amp;quot;]&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Name of the war file (without the .war) -- defaults to the basename&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# of RAILS_ROOT&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.war_name = &amp;quot;mywar&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Name of the MANIFEST.MF template for the war file. Defaults to the&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# MANIFEST.MF normally generated by `jar cf`.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.manifest_file = &amp;quot;config/MANIFEST.MF&amp;quot;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Value of RAILS_ENV for the webapp -- default as shown below&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.rails.env = ENV[&amp;#39;RAILS_ENV&amp;#39;] || &amp;#39;production&amp;#39;&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Application booter to use, one of :rack, :rails, or :merb. (Default :rails)&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.booter = :rails&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# When using the :rack booter, &amp;quot;Rackup&amp;quot; script to use.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# The script is evaluated in a Rack::Builder to load the application.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# Examples:&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.rackup = %{require &amp;#39;./lib/demo&amp;#39;; run Rack::Adapter::Camping.new(Demo)}&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.rackup = require &amp;#39;cgi&amp;#39; &amp;amp;&amp;amp; CGI::escapeHTML(File.read(&amp;quot;config.ru&amp;quot;))&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Control the pool of Rails runtimes. Leaving unspecified means&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# the pool will grow as needed to service requests. It is recommended&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# that you fix these values when running a production server!&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.jruby.min.runtimes = 2&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.jruby.max.runtimes = 4&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# JNDI data source name&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# config.webxml.jndi = &amp;#39;jdbc/rails&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you tried packaging and installing this now, it would fail miserably because, the ‘init.rb’ file would not be included. The generated warble.rb only includes the following&lt;/p&gt;

&lt;p&gt;config.dirs = %w(app config lib log vendor tmp)&lt;/p&gt;

&lt;p&gt;In addition to this the gems that we installed above would not be install. Here is same config with the lines we need (and the other cruft removed).&lt;br /&gt;
&lt;!-- [gist id=250647] --&gt;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;no&quot;&gt;Warbler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dirs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;%w(app config tmp)&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;includes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;FileList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;init.rb&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gems&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;sinatra&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;haml&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gems&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;rails&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gem_dependencies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Package up the War file&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ warble&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;From here on in we’ll be looking at any gotchas, when deploying to the different Application Servers.&lt;/p&gt;

&lt;h2 id=&quot;deploy-to-glassfish-and-test-effort-moderate---working-yes&quot;&gt;Deploy to Glassfish and test (effort: moderate - working: yes)&lt;/h2&gt;

&lt;p&gt;You can get Suns open source application server from http://glassfish.org. The current stable version of Glassfish 2.1.1, though Glassfish 3 is in active development. The installer comes packaged as a jar file. You can run the installer with&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ java -Xmx256m -jar glassfish-installer-v2.1.1-b31g-linux.jar&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;After accepting the license it should put all the files in a folder called ‘glassfish’ in the current directory.&lt;/p&gt;

&lt;p&gt;$ cd glassfish&lt;br /&gt;
You need to run the following commands to finish the setup:&lt;/p&gt;

&lt;p&gt;$ chmod -R +x lib/ant/bin&lt;br /&gt;
$ lib/ant/bin/ant -f setup.xml&lt;/p&gt;

&lt;p&gt;Once the software is installed you can start the domain with:&lt;/p&gt;

&lt;p&gt;$ bin/asaadmin start-domain domain1&lt;/p&gt;

&lt;p&gt;And use either the admin console or the autodeploy directory to deploy the war file.&lt;/p&gt;

&lt;p&gt;Glassfish now has a working copy of our application.&lt;/p&gt;

&lt;h2 id=&quot;deploy-to-jboss-and-test-effort-na---working-no&quot;&gt;Deploy to JBoss and test (effort: n/a - working: no)&lt;/h2&gt;

&lt;p&gt;JBoss has a community and an enterprise edition. For the purposes of this test we’ll be using the community edition. The current stable version of JBoss AS is 5.1.0 GA. You can get a copy of JBoss from &lt;a href=&quot;http://www.jboss.org&quot;&gt;http://www.jboss.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Getting started is as simple as unzipping the archive and running:&lt;/p&gt;

&lt;p&gt;$ cd jboss-5.1.0.GA&lt;/p&gt;

&lt;p&gt;$ bin/run.sh&lt;/p&gt;

&lt;p&gt;You can then use the admin console to deploy the application. One gotcha here, the first time I deployed the application using the console I got the following nasty message:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;Application initialization failed: no such file to load -- rack
from /opt/application_servers/jboss-5.1.0.GA/server/default/deploy/deploy_test.war/WEB-INF/lib/jruby-rack-0.9.5.jar/vendor/rack.rb:1
from /opt/application_servers/jboss-5.1.0.GA/server/default/deploy/deploy_test.war/WEB-INF/lib/jruby-rack-0.9.5.jar/vendor/rack.rb:22:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;require&lt;span class=&quot;s1&quot;&gt;&amp;#39;&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;from /opt/application_servers/jboss-5.1.0.GA/server/default/deploy/deploy_test.war/WEB-INF/lib/jruby-rack-0.9.5.jar/jruby/rack/booter.rb:22:in `boot!&amp;#39;&lt;/span&gt;
from /opt/application_servers/jboss-5.1.0.GA/server/default/deploy/deploy_test.war/WEB-INF/lib/jruby-rack-0.9.5.jar/jruby/rack/boot/rack.rb:9
from /opt/application_servers/jboss-5.1.0.GA/server/default/deploy/deploy_test.war/WEB-INF/lib/jruby-rack-0.9.5.jar/jruby/rack/boot/rack.rb:1:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;load&lt;span class=&quot;err&quot;&gt;&amp;#39;&lt;/span&gt;
from &lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;lt&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;script&lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;gt&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;:1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Turns out that after some digging there is an open jruby bug about the issue - 63&lt;br /&gt;
&lt;a href=&quot;http://jira.codehaus.org/browse/JRUBY-3935&quot;&gt;http://jira.codehaus.org/browse/JRUBY-3935&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also did a bit of digging through the logs and found:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;16:27:50,703 ERROR &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;STDERR&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; Warning: JRuby home &lt;span class=&quot;s2&quot;&gt;&amp;quot;/opt/application_servers/jboss-5.1.0.GA/server/default/deploy/deploy_test.war/WEB-INF/lib/jruby-stdlib-1.4.0.jar/META-INF/jruby.home&amp;quot;&lt;/span&gt; does not exist, using /tmp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I’ve not managed to find a solution to this problem. I will revisit this at some point in the future. After googling a little it may be possible to just revert to a few older versions that seemed to work.&lt;/p&gt;

&lt;h2 id=&quot;deploy-to-jetty-and-test-effort-easy---working-yes&quot;&gt;Deploy to Jetty and test (effort: easy - working: yes)&lt;/h2&gt;

&lt;p&gt;The current version of Jetty is 7.0.1.v20091125, though the version that comes as part of your Linux distro may not be so up to date. You can either install it using your favorite package manager, or if you’re on Windows get it from the homepage at &lt;a href=&quot;http://www.mortbay.org&quot;&gt;http://www.mortbay.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve installed Jetty copy the generated war file to the webapps folder, and run:&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ bin/jetty.sh&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;You should be able to go to http://localhost:8080/deploy_test&lt;/p&gt;

&lt;p&gt;Congratulations you now have a working copy of your sinatra app on Jetty.&lt;/p&gt;

&lt;h2 id=&quot;deploy-to-tomcat-and-test-effort-easy---working-yes&quot;&gt;Deploy to Tomcat and test (effort: easy - working: yes)&lt;/h2&gt;

&lt;p&gt;The current stable version of Tomcat is 6.0.20. You can either install it using your favorite package manager, or if you’re on Windows get it from the homepage at &lt;a href=&quot;http://tomcat.apache.org&quot;&gt;http://tomcat.apache.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You shouldn’t have to make any changes to get our web app to work on Tomcat. Once you’ve installed Tomcat copy the generated war file to the webapps folder, and run:&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #339966;&quot;&gt;$ bin/startup.sh&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;You should be able to go to http://localhost:8080/deploy_test&lt;/p&gt;

&lt;p&gt;Tomcat really is the bread and butter of Java Application Servers, especially outside the Enterprise.&lt;/p&gt;

&lt;h2 id=&quot;deploy-to-websphere-and-test-effort-hard---working-yes&quot;&gt;Deploy to Websphere and test (effort: hard - working: yes)&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;NB: Websphere 6.1.0.11 was the first application server I ever deployed Sinatra too, it failed miserably. I spent a long time debugging and playing with it to make it work properly. The biggest problem stems from the fact that the default way of using rack as configured by warbler doesn’t work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Start by logging into the administration console, it should be something like - http://localhost:9043/ibm/console&lt;/p&gt;

&lt;p&gt;Click on ‘Servers’ and when it expands select ‘Application Servers’. From here you can setup a new server instance that we can use for our testing. Call the instance something like ‘deploy01’. You can follow the default creation steps all the way through.&lt;/p&gt;

&lt;p&gt;Once you have a server instance to test on, you can deploy a new application. The big gotcha as mentioned above is that you can’t use filters, the good news is that it’s quite easy to switch out the rack filters for a rack servlet. Rather than duplicate information that already exists, I’ll link to the place I learned to deploy warbler to websphere, &lt;a href=&quot;http://clint-hill.com/2008/11/26/jruby-on-rails-and-websphere/&quot;&gt;http://clint-hill.com/2008/11/26/jruby-on-rails-and-websphere/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Websphere is not the easiest application server to setup in general, but once you get it all configured it is fairly robust. Worth the effort if you want an application server you won’t have to restart constantly (as can be the case with Documentum on Tomcat).&lt;/p&gt;

&lt;h2 id=&quot;deploy-to-weblogic-and-test-effort-na---working-no&quot;&gt;Deploy to Weblogic and test (effort: n/a - working: no)&lt;/h2&gt;

&lt;p&gt;Setting up Oracle Weblogic 10.3.2 was nothing short of awesome. The install process is intuitive and speedy, though the size is quite large, at ~600Mb,  compared to smaller cousins such as Tomcat. There is a wizard that walks you through the process of setting up your first domain, what Tomcat would call an instance and Websphere would call a profile, once the software is installed. I chose the default options for everything and had a running Weblogic server in about 20mins (including download).&lt;/p&gt;

&lt;p&gt;My previous experience with Weblogic, was the version bundled with Documentum D6SP1. I’ve found both that version and the current fully fledged Oracle version to be a joy to work with.&lt;/p&gt;

&lt;p&gt;Once the installation process is finished you can find the administration console at http://localhost:7001/console, you can then login using the username/password you picked during installation.&lt;/p&gt;

&lt;p&gt;From the admin console it is a simple matter of clicking on ‘Deployments’ on the left and then when the screen loads clicking ‘install’, browse to the directory with the deploy_test.war file in it and start the install.&lt;/p&gt;

&lt;p&gt;You should now be able to access the deployed application at http://localhost:7001/deploy_test…&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;Application initialization failed: no such file to load -- rack
from C:/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/deploy_test/qwtgi/war/WEB-INF/lib/jruby-rack-0.9.5.jar!/vendor/rack.rb:1 from
C:/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/deploy_test/qwtgi/war/WEB-INF/lib/jruby-rack-0.9.5.jar!/vendor/rack.rb:22:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;require&lt;span class=&quot;s1&quot;&gt;&amp;#39; from&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;C:/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/deploy_test/qwtgi/war/WEB-INF/lib/jruby-rack-0.9.5.jar!/jruby/rack/booter.rb:22:in `boot!&amp;#39;&lt;/span&gt; from
C:/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/deploy_test/qwtgi/war/WEB-INF/lib/jruby-rack-0.9.5.jar!/jruby/rack/boot/rack.rb:9 from
C:/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/deploy_test/qwtgi/war/WEB-INF/lib/jruby-rack-0.9.5.jar!/jruby/rack/boot/rack.rb:1:in &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;load&lt;span class=&quot;err&quot;&gt;&amp;#39;&lt;/span&gt; from&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Clearly thats not going to be the case though. This issue is very similar to the error message received for JBoss.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Not a bad scorecard really. Of all the Java application servers that I tested, only JBoss and Weblogic proved to be a problem. I’ll be retesting these two periodically to see if support has been improved (there are open tickets with JRuby). Until then I hope that this has been useful.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Exploring Documentum RESTful Services - Part 2</title>
   <link href="http://vertis.github.com/2010/02/19/exploring-documentum-restful-services-part-2.html"/>
   <updated>2010-02-19T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/02/19/exploring-documentum-restful-services-part-2</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;I originally published this post to the Early Access Area for Documentum RESTful Services.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the second part of my exploration of Documentum RESTful Services I  promised that we’d delve into browsing around the docbase. Rather do  that with ruby I thought I’d grab a copy of &lt;a href=&quot;http://www.jquery.com&quot;&gt;JQuery&lt;/a&gt; and have a look at what it takes to access the services using what is an increasingly popular javascript library. The  most important part of delivering on this is the JQuery call:&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;$.getJSON(path, ...);&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;The  important thing here is that because of concerns about cross-site  scripting we can only call local paths. While getJSON allows remote  paths now with the help of JSONP style callbacks, those require server  side cooperation to work. I don’t know that they’re not implemented in  Documentum RESTful Services, but flipping through the documentation I  couldn’t find anything of that nature.&lt;/p&gt;

&lt;p&gt;Rather than  creating a War for one html file, I decided to show off nginx. Nginx is a  superb webserver, and more importantly in this case, a reverse proxy.  It has gotten a lot of attention in the Ruby on Rails community, which  is where I fell in love with it. After grabbing a copy of nginx it’s  simply a matter of doing a minor adjustment to the nginx.conf file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;location /resources {
  proxy_pass   http://127.0.0.1:8080/resources;
}
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;This  will mean that anything below the /resources directory on our webserver  is passed off to the tomcat instance on 8080. We can start nginx, and  discover it works perfectly. Now that we can use just a path to  reference the services, lets get started. We start with a fairly blank  html file:&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre&gt; &amp;lt;html&amp;gt;                                                                 
 &amp;lt;head&amp;gt;                                                                 
 &amp;lt;script type=&quot;text/javascript&quot; src=&quot;jquery-1.3.2.js&quot;&amp;gt;&amp;lt;/script&amp;gt;         
 &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;                                        
   // we will add our javascript code here
   $(document).ready(function() {
        // do stuff when DOM is ready
   });  
 &amp;lt;/script&amp;gt;                                                              
 &amp;lt;/head&amp;gt;                                                                
 &amp;lt;body&amp;gt;                                                                 
   &amp;lt;div id=&quot;results&quot;&amp;gt;&amp;lt;/div&amp;gt;                                         
 &amp;lt;/body&amp;gt;                                                                
 &amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Notice  the included jquery.js, the call the $(document).ready, and the results  div. We’re going to use the call I mentioned earlier ‘getJSON’ to  populate the results div with the results of calling the ‘folders’  resource with no arguments. Lets look at the code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
$.getJSON(&quot;/resources/core/repositories/test_repo/folders.json&quot;,
       function(data){
       $.each(data.dataPackage.dataObject, function(i,item){
           $(&quot;#results&quot;).append(item.properties.object_name+&quot;&amp;lt;br/&amp;gt;&quot;);
       });
});
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;If  you put the above html file in the right place and run the example  you’ll be prompted for the password, just like you would if you actually  went to the resource endpoint itself, then you’ll see a nice list of  the root cabinets. Suppose we want to more than just display the root  cabinets though, that we want to use the returned results to allow us to  click around the docbase. Here is an example that does just that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre&gt;
  &amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;jquery-1.3.2.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
      function getItems(path) {
           $.getJSON(path,
                function(data){
                  $.each(data.dataPackage.dataObject, function(i,item){
                     $(&amp;quot;#results&amp;quot;).append(&amp;quot;&amp;lt;a href=\&amp;quot;#\&amp;quot; onclick=&amp;#x27;link(\&amp;quot;&amp;quot;+item.relationshipsUri+&amp;quot;\&amp;quot;);&amp;#x27;&amp;gt;&amp;quot;+item.properties.object_name+&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;)
                  });
                });
      }

      function getRelationships(path) {
           $.getJSON(path,
                function(data){
                  $.each(data.relationship, function(i,item){
                     $(&amp;quot;#results&amp;quot;).append(&amp;quot;&amp;lt;a href=\&amp;quot;#\&amp;quot; onclick=&amp;#x27;link(\&amp;quot;&amp;quot;+item.target.relationshipsUri+&amp;quot;\&amp;quot;);&amp;#x27;&amp;gt;&amp;quot;+item.target.properties.object_name+&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;quot;)
                  });
                });
      }

      function link(url) {
           //Needs to be a local path...this is a hack
           //http://127.0.0.1:8080
           var path = url.substring(21, url.length);
           alert(path);
           $(&amp;quot;#results&amp;quot;).html(&amp;quot;&amp;quot;);
           getRelationships(path);
      }

      $(document).ready(function() {
           getItems(&amp;quot;/resources/core/repositories/test_repo/folders.json&amp;quot;);
      });
  &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
      &amp;lt;div id=&amp;quot;results&amp;quot;&amp;gt;
      &amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s  very rough, and doesn’t take into account many variables, such as  relationships that are returned aren’t necessarily folders. But it does illustrate the ability to access Documentum using libraries like jQuery now.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Copy the structure but not the data.</title>
   <link href="http://vertis.github.com/2010/02/09/copy-the-structure-but-not-the-data.html"/>
   <updated>2010-02-09T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/02/09/copy-the-structure-but-not-the-data</id>
   <content type="html">&lt;p&gt;I’m working on a prototype at the moment that requires me to insert data into offline tables (offline as far as Documentum is concerned). The examples that I’ve found all resort to specifying the exact structure of the table.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;create&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;table&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DMI_OBJECT_TYPEx&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;R_OBJECT_ID&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VARCHAR2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;I_TYPE&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NUMBER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;I_PARTITION&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NUMBER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The example above is smaller than most of the tables I have to create. The weakness with this is that you have to look up the table structure. The writers probably chose this method because the much simpler syntax shown below also brings any data that is in the table.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DMI_OBJECT_TYPEx&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DMI_OBJECT_TYPE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;My initial thought was why not copy the table and then just truncate it, but after a bit of searching I stumbled upon the &lt;a href=&quot;http://www.vbrad.com/article.aspx?id=14&quot;&gt;solution&lt;/a&gt;. Essentially adding a WHERE clause to the end of the query that never evaluates to TRUE enables us to take the structure without the data.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DMI_OBJECT_TYPEx&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;AS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DMI_OBJECT_TYPE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
</content>
 </entry>
 
 <entry>
   <title>Lighter weight deployment with git-deploy</title>
   <link href="http://vertis.github.com/2010/02/01/lighter-weight-deployment-with-git-deploy.html"/>
   <updated>2010-02-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2010/02/01/lighter-weight-deployment-with-git-deploy</id>
   <content type="html">&lt;p&gt;Up until now I’ve been using a fairly standard capistrano deploy.rb. The problem is that as we speak I’m trying to deploy a patch from my Windows work machine and it’s not working. The ethics of fixing one of my project from home aside, this is a problem. When I try and deploy the following error  comes up&lt;/p&gt;
&lt;blockquote&gt;can&#39;t convert Net::SSH::Authentication::Pageant::Socket into IO (TypeError)&lt;/blockquote&gt;
&lt;p&gt;The change I was trying to deploy stops in its tracks. After quite a bit of searching I found a &lt;a href=&quot;http://thread.gmane.org/gmane.comp.lang.ruby.capistrano.general/5804/focus=5807&quot;&gt;thread&lt;/a&gt; about the error that dates back to Capistrano 2.5.3… from 2008. What a shining example of open source.&lt;/p&gt;

&lt;p&gt;To be fair the error isn’t necessarily in Capistrano, it may in fact be in Net::SSH. The sad thing is that we’re over a year later, and nothing has been done to fix the problem. Is the number of people that use Ruby from Windows machines so low that no-one has managed to fix it in a year?&lt;/p&gt;

&lt;p&gt;I’m not expecting Jamis to fix it. I get that he has too much to do, and doesn’t have time to give out a bunch of freebie support, but I’m now faced with the choice of either trying to fix the problem, a task I don’t currently have time for, or ditching capistrano.&lt;/p&gt;

&lt;p&gt;I’ve considered switching to heroku in the past and just never made the leap. For a start the app in question has to many moving parts for heroku. One thing I did like though was the notion that to deploy all I had to do was ‘git push target master’  and the app would be updated and deployed.&lt;/p&gt;

&lt;p&gt;After toying around with rolling my own solution, I stumbled upon &lt;a href=&quot;http://www.github.com/mislav/git-deploy&quot;&gt;mislav’s gem&lt;/a&gt;. It lacks some of the features that I’m looking for, but its a good deal closer to the level that I need. It lacks the bloat of capistrano, which is important, because the biggest barrier to me getting in and fixing capistrano would be the size of the library and knowing where to start.&lt;/p&gt;

&lt;p&gt;I very quickly migrated my existing application to use git-deploy. It’s not perfect for every problem, particularly if you’re doing multi stage deployments, etc, but at least I’ll be able to do a deployment everywhere I can get access to git now.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>RockYou gets rocked by hackers</title>
   <link href="http://vertis.github.com/2009/12/17/rockyou-gets-rocked-by-hackers.html"/>
   <updated>2009-12-17T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/12/17/rockyou-gets-rocked-by-hackers</id>
   <content type="html">&lt;p&gt;(And I’m hilarious)&lt;/p&gt;

&lt;p&gt;Seems that simple lessons don’t get learned. Don’t get get me wrong, its very hard to protect every aspect against hackers who try to pry they’re way into your site. Storing passwords in plain-text is just dumb though. Even if the passwords for your own site are hashed, the proliferation of storing third party login details (which you could still encrypt with a symmetrical key) is a time bomb.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://igigi.baywords.com/rockyou-com-exposed-more-than-32-millions-of-passwords-in-plaintext&quot;&gt;RockYou&lt;/a&gt; is just the latest site on the internet to learn this hard lesson. Supposedly the hacker is one of the good guys, but there is no guarantee that someone else didn’t get the information as well. It’s an argument for doing away with passwords altogether, how long will it be until we can use public/private key authentication with websites. It is now accepted best practice with SSH, since the advent of widespread SSH bruteforcing.&lt;/p&gt;

&lt;p&gt;Private key authentication solves a lot of the problems with websites storing password information, the hacker would have gained nothing besides the ability to verify users were who they claimed to be.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ActiveDocumentum</title>
   <link href="http://vertis.github.com/2009/11/30/activedocumentum.html"/>
   <updated>2009-11-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/11/30/activedocumentum</id>
   <content type="html">&lt;p&gt;I’ve finally decided to release ActiveDocumentum.  ActiveDocumentum is a Ruby Gem that I created to bring some of the goodness, learned by pulling apart ActiveRecord, to accessing &lt;a href=&quot;http://www.emc.com/products/family/documentum-family.htm&quot;&gt;Documentum&lt;/a&gt;. Its nowhere near as mature, but I has been doing the job pretty well so far for the scripts and sites I’ve been using it for. It has a dependency on JRuby because it hooks into the DFS client libraries to facilitate connecting to Documentum. I’m going to post some further examples, but for the time being, here it is.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.github.com/vertis/active_documentum&quot;&gt;http://www.github.com/vertis/active_documentum&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll need a Documentum repository, JRuby and a copy of the DFS sdk to play with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I’ve also done up a quick sample which you can find on my github (right next door to the actual library).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.github.com/vertis/active_documentum_sample&quot;&gt;http://www.github.com/vertis/active_documentum_sample&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Kilroy was here</title>
   <link href="http://vertis.github.com/2009/10/28/kilroy-was-here.html"/>
   <updated>2009-10-28T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/10/28/kilroy-was-here</id>
   <content type="html">&lt;p&gt;Myth has it that ‘Kilroy was here’ was the mark of a shipbuilder before/during WWII, and that it was picked up by Servicemen who found it amusing that the mark was made in supposedly unreachable places. They then spread the mark elsewhere, as locations around the world were liberated.  I love this concept, because I’m not a fan of limitations – I’m an avid gamer, but I rail against games that don’t let you stray from the path. There is no variety, or replay value because each time you have exactly the same sequence of events.&lt;/p&gt;

&lt;p&gt;Many hopeful web developers fall into this pitfall as well. I was reading &lt;a href=&quot;http://www.adaptivepath.com/blog/2009/10/27/desire-lines-the-metaphor-that-keeps-on-giving/&quot;&gt;http://www.adaptivepath.com/blog/2009/10/27/desire-lines-the-metaphor-that-keeps-on-giving/&lt;/a&gt;, a(nother) look at a metaphor called ‘desire lines’, that has similarly important lessons for the web2.0 community. You can’t force people to do what you want. The lesson is simple and played out all around us, you can set down a path, but you can’t make people want to use that route. A good designer will probably preempt a lot of what people will want, but not everything, and the overnight success that all of us are searching for is a bit hit and miss. Plenty of good ideas are out there, but finding something that people actually want, and then getting the word out there that you’re product is there is tough.&lt;/p&gt;

&lt;p&gt;Or something like that.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Getting started with Google Maps</title>
   <link href="http://vertis.github.com/2009/10/25/getting-started-with-google-maps.html"/>
   <updated>2009-10-25T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/10/25/getting-started-with-google-maps</id>
   <content type="html">&lt;p&gt;My first few searches turned up some fairly unpolished methods of accessing Google Maps from Ruby. I’m definitely using Ruby as a starting point in this challenge, its the language I’m most comfortable with. That’s not to say that I’m not going to do any other languages. I do want to do a Python/Django project at some point, just to get it out of the way.&lt;/p&gt;

&lt;p&gt;After bit of digging around I discovered the &lt;a href=&quot;http://www.gemcutter.org/gems/ym4r&quot;&gt;YM4R&lt;/a&gt; gem. YM4R provides access to the &lt;a href=&quot;http://www.google.com/apis/maps/documentation/&quot;&gt;Google Maps&lt;/a&gt; and the &lt;a href=&quot;http://developer.yahoo.com/maps/index.html&quot;&gt;Yahoo! Maps Building Block&lt;/a&gt; API’s. Before we go any further lets just get a Google Map on the page and point it at a location. The gem also comes as a plugin for rails, which I’m about to find out has some different capabilities (more on that later).&lt;/p&gt;

&lt;p&gt;To do that we need to get an API key &lt;a href=&quot;http://www.google.com/apis/maps/signup.html&quot;&gt;here&lt;/a&gt;. Making sure to put in whatever url you will be using to access your application, in my case, at least for the example application, that’s http://localhost:4567. If you’re familar with the port number then you know that I’m using Sinatra rather than Rails, this means, is that I can’t use the YM4R/GM rails plugin (at least without hacking it up) &amp;amp; unlike the plugin the gem doesn’t contain the code to actually generate the map code. So I’m back to the drawing board.&lt;/p&gt;

&lt;p&gt;Taking a step back I have a look at how difficult it is to just get it onto the page without a helper, which as it turns out is ‘not very’. Lets look at the code to get a minimal example happening:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# app.rb&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;sinatra&amp;#39;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;haml&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:index&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And the view:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-haml&quot; data-lang=&quot;haml&quot;&gt;&lt;span class=&quot;cp&quot;&gt;-#views/index.haml&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;%html&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;%head&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;%script&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:charset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:src&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://www.google.com/jsapi?key=ABQIAAAAR21mr2vnfC9-sjIojad2WhSmbtbI58sJnUq1AueY0BvTVoVv3BSw-I1OHpTaa0zZiaSEsDrZf9fGWQ&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;%script&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:type&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      google.load(&amp;quot;maps&amp;quot;, &amp;quot;2&amp;quot;);

      &lt;span class=&quot;c&quot;&gt;// Call this function when the page has been loaded&lt;/span&gt;
      function initialize() {
      var map = new google.maps.Map2(document.getElementById(&amp;quot;map&amp;quot;));
      map.setCenter(new google.maps.LatLng(37.4419, -122.1419), 13);
      }
      google.setOnLoadCallback(initialize);
  &lt;span class=&quot;nt&quot;&gt;%body&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;%h1&lt;/span&gt; Google Maps Example
    &lt;span class=&quot;nt&quot;&gt;%p&lt;/span&gt; Welcome to the the Google Maps API example application.
    &lt;span class=&quot;nf&quot;&gt;#map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:style&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;width: 794px; height: 491px&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It’s pretty simple to get a nice looking Google Map onto the page. In the next post I’ll go into the details of how to start manipulating the map for our purposes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Foursquare</title>
   <link href="http://vertis.github.com/2009/10/23/foursquare.html"/>
   <updated>2009-10-23T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/10/23/foursquare</id>
   <content type="html">&lt;p&gt;Apparently the idea for my Google Maps API part of my challenge has already been done by &lt;a href=&quot;http://foursquare.com/&quot;&gt;foursquare&lt;/a&gt;. Dammit, that was a good idea too. They’ve taken it to the next level as well, making it possible to complete badges (much like Stackoverflow and/or Kongregate). It’s a bit limited, in that you can’t have it in every city right now, but it should be fun to play with and might get a solid following from people with smartphones and people that love the whole geo-tagging phenomenon. Oh well, back to the drawing board, this was probably a bit complex for a week long project anyway.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The API Challenge</title>
   <link href="http://vertis.github.com/2009/10/22/the-api-challenge.html"/>
   <updated>2009-10-22T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/10/22/the-api-challenge</id>
   <content type="html">&lt;p&gt;One of my favorite finds this year is &lt;a href=&quot;http://www.programmableweb.com/&quot;&gt;Programmable Web&lt;/a&gt;, a site dedicated to APIs and Mashups that are the lifeblood of web 2.0. Having just watched the movie Julie &amp;amp; Julia, which I highly recommend, I think that its only appropriate that I set myself a similar challenge. Take the top 50 apis, and within the next year develop a non trivial application for each of them (in no particular order). I’ve set myself a couple of rules:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You are allowed to use any client libraries if they exist.&lt;/li&gt;
  &lt;li&gt;Using multiple APIs in the one application is allowed (yay for mashup&#39;s)&lt;/li&gt;
  &lt;li&gt;Any libraries/applications that are developed in the course of the challenge must have tests/specs and documentation.&lt;/li&gt;
  &lt;li&gt;And of course blog about each api.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First up:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt; API: Google Maps&lt;/li&gt;
  &lt;li&gt;Deadline: Thursday the 29th of October&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll be hearing from me soon. In the meantime I welcome anyone that wants to participate. Just leave a comment on this post, with your details. If it proves to be popular then I’ll get some kind of signup/participant website going.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Transport out has not been set</title>
   <link href="http://vertis.github.com/2009/09/17/transport-out-has-not-been-set.html"/>
   <updated>2009-09-17T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/09/17/transport-out-has-not-been-set</id>
   <content type="html">&lt;p&gt;I’ve was banging my head against the wall all yesterday evening trying to work out why Axis2 was erroring out with ‘Transport out has not been set’. All my searching for similiar problems was returning the same mailing list entries, replicated all across the internet, none of them having anything useful.&lt;/p&gt;

&lt;p&gt;For me at least (and some of the problem is that it can be caused by more than one thing), was that I’d commented one URL out when I went home and created my home one, without including ‘http://’ on the front of my URL.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rack - NoMethodError: undefined method `call' for nil:NilClass</title>
   <link href="http://vertis.github.com/2009/09/09/rack-nomethoderror-undefined-method-call-for-nil-nilclass.html"/>
   <updated>2009-09-09T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/09/09/rack-nomethoderror-undefined-method-call-for-nil-nilclass</id>
   <content type="html">&lt;p&gt;Turns out Rack doesn’t read minds. I just spent the better part of the morning troubleshooting a stupid error, convinced there was something wrong with JRuby/Rack/Sinatra. As it turns out the error was caused by having a blank config.ru file,  I was editing one that was in a different directory (and believing that it was the correct file). My own stupidity aside, the error message wasn’t helpful, mostly because google didn’t return any results related to the same error. So while this admits my mistake, hopefully the next person who comes across this error will spend less time scratching their heads.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;NoMethodError: undefined method `call&amp;#39; for nil:NilClass&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/lint.rb:35:in `call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/showexceptions.rb:24:in `call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/commonlogger.rb:20:in `_call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/commonlogger.rb:13:in `call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/content_length.rb:13:in `call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/chunked.rb:15:in `call&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/rack-1.0.0/lib/rack/handler/mongrel.rb:61:in `process&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/mongrel-1.1.5-java/lib/mongrel.rb:159:in `process_client&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/mongrel-1.1.5-java/lib/mongrel.rb:158:in `each&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/mongrel-1.1.5-java/lib/mongrel.rb:158:in `process_client&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/mongrel-1.1.5-java/lib/mongrel.rb:285:in `run&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;C:/development/langs/jruby-1.3.1/lib/ruby/gems/1.8/gems/mongrel-1.1.5-java/lib/mongrel.rb:285:in `initialize&amp;#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;127.0.0.1 - - [09/Sep/2009 11:24:45] &amp;quot;GET / HTTP/1.1&amp;quot; 500 40410 0.1720&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Lotus Notes 8 Development</title>
   <link href="http://vertis.github.com/2009/07/30/lotus-notes-8-development.html"/>
   <updated>2009-07-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/07/30/lotus-notes-8-development</id>
   <content type="html">&lt;p&gt;I’m finally finished beating my head against the wall trying to get drag and drop to work in Lotus Notes 8. It turned out to be a good deal less friendly than I expected.&lt;/p&gt;

&lt;p&gt;The actual core of drag and drop listening is stock Eclipse RCP. That’ll trigger off the events as expected, but I found that it wasn’t passing anything across. After digging down as far as I could to see if it just wasn’t processing the transfer properly, I concluded that it was a dead end.&lt;/p&gt;

&lt;p&gt;The old way of dealing with this would have been to use NotesUIWorkspace to get the currently selected document. That was never implemented in Java (which is probably because it’s not needed). Because of the eclipse architecture, it is strictly possible to access whatever you want using the standard eclipse classes. Thankfully, we don’t even have to worry about going this deep, I stumbled across an open source plug-in called &lt;a href=&quot;http://www.jeffgilfelt.com/Formul8/&quot;&gt;Formul8&lt;/a&gt; by &lt;a href=&quot;http://www.jeffgilfelt.com/&quot;&gt;Jeff Gilfelt&lt;/a&gt;. Jeff’s plug-in allows you to execute formulas in the context of the currently selected Document(s), which is similar to what I needed.&lt;/p&gt;

&lt;p&gt;Under the hood Formul8 is powered by ‘com.ibm.lotuslabs.context’. Armed with that discovery, I headed back to google, finding &lt;a href=&quot;https://www.ibm.com/developerworks/lotus/library/notes8-context/&quot;&gt;this&lt;/a&gt; post  about how to use ‘lotuslab.context’, in addition, it also links to a copy of the source code (yippee!).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Exploring Documentum RESTful Services - Part 1</title>
   <link href="http://vertis.github.com/2009/07/08/exploring-documentum-restful-services-part-1.html"/>
   <updated>2009-07-08T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/07/08/exploring-documentum-restful-services-part-1</id>
   <content type="html">&lt;p&gt;I was chatting to &lt;a href=&quot;http://www.craigrandall.net&quot;&gt;Craig Randall&lt;/a&gt; on &lt;a href=&quot;http://www.twitter.com/craigsmusings&quot;&gt;twitter&lt;/a&gt; a little while back and he let me know that they were just about ready to go into Early Access for their new web service platform -  Documentum RESTful Services. I was excited then, and I’m even more excited now that I’ve had my first taste.&lt;/p&gt;

&lt;p&gt;RESTful web services are hard to explain to people. I usually fall back on explaining them by linking them to Ajax, which is a Web2.0 technology that people are more familiar with. If you wanted to use Ajax to make your Documentum webapps more friendly before Documentum RESTful Services, then you’d be out of luck (short of creating a custom server side component).&lt;/p&gt;

&lt;p&gt;RESTful web services are easily accessible because you don’t need any funky client library to access them. Pop open any web browser and type in:&lt;/p&gt;

&lt;p&gt;http://localhost:8080/dctm_rest/resources/core/repositories/&amp;lt;RepoName&amp;gt;/folders&lt;/p&gt;

&lt;p&gt;And you’ll get back an XML representation of all the root folders (after you’re prompted for a username/password). RESTful web services use only standard HTTP, which means that you’re cutting out the middleman of having to encode requests/responses in Soap (or some other container).&lt;/p&gt;

&lt;p&gt;They’re automagically more language agnostic. Gone is the need for a complex client side library. For example, while it should strictly be possible to access DFS in any language, this doesn’t translate into a reality. So Documentum RESTful Services will allow us to step away from relying on Java/.Net and expand into using high level dynamic languages (python, ruby, javascript).&lt;/p&gt;

&lt;p&gt;Let’s do a simple example in Ruby to demonstrate:&lt;br /&gt;
&amp;lt;pre class=&quot;ruby&quot;&amp;gt;require ‘rubygems’&lt;br /&gt;
require ‘httparty’&lt;/p&gt;

&lt;p&gt;class DctmRest&lt;br /&gt;
  include HTTParty&lt;br /&gt;
  base_uri ‘http://localhost:8080/dctm_rest’&lt;br /&gt;
  def initialize(username, password)&lt;br /&gt;
    @auth = {:username =&amp;gt; username, :password =&amp;gt; password}&lt;br /&gt;
  end&lt;/p&gt;

&lt;p&gt;def repositories&lt;br /&gt;
    options = { :basic_auth =&amp;gt; @auth }&lt;br /&gt;
    repository = “test_repo”&lt;br /&gt;
    self.class.get(“/resources/core/repositories.json”, options)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
d = DctmRest.new(‘username’, ‘password’)&lt;br /&gt;
puts d.repositories.inspect&amp;lt;/pre&amp;gt;&lt;br /&gt;
The example is probably more complex than it even needs to be. If I look at the output:&lt;br /&gt;
&amp;lt;pre class=&quot;js&quot;&amp;gt;{“repository”=&amp;gt;[{“queriesUri”=&amp;gt;“http://localhost:8080/dctm_rest/resources/core/repositories/test_repo/queries.json”, “repositoryType”=&amp;gt;“managed”, “typesUri”=&amp;gt;“http://localhost:8080/dctm_rest/resources/core/repositories/test_repo/types.json”, “foldersUri”=&amp;gt;“http://localhost:8080/dctm_rest/resources/core/repositories/test_repo/folders.json”, “checkedoutUri”=&amp;gt;“http://localhost:8080/dctm_rest/resources/core/repositories/test_repo/objects/checkedout.json”, “uri”=&amp;gt;“http://localhost:8080/dctm_rest/resources/core/repositories/test_repo.json”, “name”=&amp;gt;“test_repo”, “objectsUri”=&amp;gt;“http://localhost:8080/dctm_rest/resources/core/repositories/test_repo/objects.json”}]}&amp;lt;/pre&amp;gt;&lt;br /&gt;
I can see a very succinct set of other URIs that I can use to get other information. In the next post I’ll go through how to browse around a Docbase using Documentum RESTful Services. For now, take the time to &lt;a href=&quot;https://community.emc.com/community/labs/dctm_rest&quot;&gt;sign up&lt;/a&gt; for the early access program, so you can help give feedback on what is a giant leap forward for Documentum in the web2.0 world.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rails Rumble 2009</title>
   <link href="http://vertis.github.com/2009/07/07/rails-rumble-2009.html"/>
   <updated>2009-07-07T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/07/07/rails-rumble-2009</id>
   <content type="html">&lt;p&gt;Unlike last year where I registered at the last minute and went it alone, I’ve been hanging out for this years dates to be announced. Now I’ve got a few days to put together a team and decide on an idea. You can find more information at the  &lt;a href=&quot;http://r09.railsrumble.com&quot;&gt;Rails Rumble 2009&lt;/a&gt; website.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Installing Documentum Administrator 6SP1 (Patch Release) on IBM Websphere 6.1.0.23</title>
   <link href="http://vertis.github.com/2009/06/12/installing-documentum-administrator-6sp1-patch-release-on-ibm-websphere-6-1-0-23.html"/>
   <updated>2009-06-12T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/06/12/installing-documentum-administrator-6sp1-patch-release-on-ibm-websphere-6-1-0-23</id>
   <content type="html">&lt;p&gt;I’ve spent the majority of the last 2 days trying to get DA 6SP1 Patch Release to install properly on IBM Websphere 6.1.0.23. It had been a while since I’d last done the install, and I fell into the same traps as last time, forgetting where to set the class loader and so forth. After getting past these I was left with the application unhelpfully still showing a white screen and error messages that revealed (looking back) very little about the true nature of the problem. Having finally conquered the problem, I thought I would provide the steps necessary so that anyone else trying to get a WDK application working on Websphere as at least one more thing to try.&lt;/p&gt;

&lt;p&gt;Grab a copy of da.war from the EMC Powerlink Download site.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Unpack da.war and add the following files to a directory&lt;/li&gt;
  &lt;li&gt;Put dfc.properties into WEB-INF/classes (As described in the deployment guide)&lt;/li&gt;
  &lt;li&gt;ibm-web-ext.xmi &amp;amp; ibm-web-ext.xmi goes into WEB-INF - &lt;a href=&quot;https://solutions.emc.com/emcsolutionview.asp?id=esg91105&quot;&gt;https://solutions.emc.com/emcsolutionview.asp?id=esg91105&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Find a copy of xml.jar on the Websphere App Server in &#39;Websphere\AppServer\java\jre&#39; and put in &#39;WEB-INF\lib&#39; &lt;a href=&quot;https://solutions.emc.com/emcsolutionview.asp?id=esg93106&quot;&gt;- https://solutions.emc.com/emcsolutionview.asp?id=esg93106&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Install the application using the IBM Administration Console.&lt;/li&gt;
  &lt;li&gt;Change the order the classes are loaded in by expanding the Applications node and click the Enterprise Applications node. Select the application called da_war (or equivalent wdk app). Click the Manage Modules link. Click the da.war link. In the Class loader order drop-down list, select the option &#39;Classes loaded with application class loader first&#39; - &lt;a href=&quot;https://solutions.emc.com/emcsolutionview.asp?id=esg93177&quot;&gt;https://solutions.emc.com/emcsolutionview.asp?id=esg93177&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;You can then save and start the application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The xml.jar file is appropriate for D6SP1 only, previous D6 versions have a slightly different set of instructions (see linked support note). Any feedback, corrections, suggestions greatly appreciated.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>ActiveDocumentum teaser #1</title>
   <link href="http://vertis.github.com/2009/05/07/activedocumentum-teaser-1.html"/>
   <updated>2009-05-07T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/05/07/activedocumentum-teaser-1</id>
   <content type="html">&lt;p&gt;Having stepped away from trying to get Documentum running on linux, I’ve been working on bringing the permissions through into our custom Lotus Notes/Documentum client. At the moment when a user imports a document to a given folder it does no permission checking before the fact, just errors nastily when it can’t write the document. A short stop by &lt;a href=&quot;http://askprasad.wordpress.com/documentum/some-useful-dql-tips/&quot;&gt;Prasad’s blog&lt;/a&gt; gave me a query to start from.&lt;/p&gt;

&lt;pre class=&quot;sql&quot; name=&quot;code&quot;&gt;SELECT i_all_users_names as users FROM dm_group
WHERE group_name IN (SELECT r_accessor_name FROM dm_acl
WHERE object_name IN (SELECT acl_name FROM dm_sysobject
                       WHERE r_object_id = &#39;0c0xxxxx80009e16&#39;))
ORDER BY i_all_users_names&lt;/pre&gt;

&lt;p&gt;This is superb, but it doesn’t actually go far enough. If I was to attach it to my application and tell it not to let me import anything into the folder if my name wasn’t on the list I wouldn’t be able to copy anything into my home cabinet. It enumerates the members of any group within the ACL but doesn’t deal with named users &amp;amp; also the owner.&lt;/p&gt;

&lt;p&gt;This will give me a chance to show off what you can do with my ActiveDocumentum project. ActiveDocumentum is a working name for a JRuby gem written to provide functionality similar to what can be found in &lt;a href=&quot;http://api.rubyonrails.org/files/vendor/rails/activerecord/README.html&quot;&gt;ActiveRecord&lt;/a&gt;, with the addition of repeating attributes and other DQL specific items. While the final code for the below function may end up being in Java or .Net. Doing it using ruby allowed me to very quickly scope out the logic of what would need to be done to get the permission that a user had on an object (NB: If there is a way to do this simply with DQL I’m not aware of it):&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;
require &#39;config/environment&#39;

def get_effective_permission(r_object_id, user = nil)
  return 0 if user.nil?
  folder = DmFolder.find(:first, :columns =&amp;gt; &quot;owner_name, owner_permit, acl_name&quot;, :conditions =&amp;gt; {:r_object_id =&amp;gt; r_object_id})
  current_level = 0
  if folder.owner_name.eql? user
    current_level = folder.owner_permit
  end
    acls = DmAcl.find(:all, :columns =&amp;gt; &quot;r_accessor_name, r_accessor_permit, r_is_group&quot;, :conditions =&amp;gt; &quot;object_name = &#39;#{folder.acl_name}&#39; ENABLE(ROW_BASED)&quot;)
    acls.each do |acl|
      if acl.r_accessor_name.eql? user
        current_level = acl.r_accessor_permit if acl.r_accessor_permit &amp;gt; current_level
      elsif acl.r_is_group.to_s.eql?(&#39;1&#39;) and not acl.r_accessor_permit.nil?
        group = DmGroup.find(:first, :columns =&amp;gt; &#39;r_object_id, i_all_users_names&#39;, :conditions =&amp;gt; {:group_name =&amp;gt; acl.r_accessor_name})
        current_level = acl.r_accessor_permit if acl.r_accessor_permit &amp;gt; current_level and group.i_all_users_names.include?(user)
      end
    end
  end
  return current_level
end

r_object_id = &#39;0c0xxxxx80009e16&#39;

user = &#39;John Doe&#39;

puts get_effective_permission(r_object_id, user)
&lt;/pre&gt;

&lt;p&gt;As you can see the above function takes a user and returns the highest permission that they have, by checking if they’re either directly listed on the ACL or in one of the groups on the ACL. The bottom line is that with ActiveDocumentum I can write less lines of code for one off scripts that I have to create, and include complicated logic that is lacking in straight DQL scripts. I will be posting more details on this in the near future.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>My ongoing battle to get Oracle working on CentOS 5.3</title>
   <link href="http://vertis.github.com/2009/05/04/my-ongoing-battle-to-get-oracle-working-on-centos-5-3.html"/>
   <updated>2009-05-04T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/05/04/my-ongoing-battle-to-get-oracle-working-on-centos-5-3</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.oracle-base.com&quot;&gt;Oracle Base&lt;/a&gt; has a fantastic &lt;a href=&quot;http://www.oracle-base.com/articles/11g/OracleDB11gR1InstallationOnEnterpriseLinux4and5.php&quot;&gt;article&lt;/a&gt; on how to get Oracle 11g Release 1 working on &lt;a href=&quot;http://www.redhat.com/rhel/&quot;&gt;Red Hat Enterprise Linux&lt;/a&gt;. The fact that CentOS is a stripped version of RHEL is a good reason to be using it, because if there is one Linux that’s likely to be used in enterprise situations then it would be RHEL. All up I’m less than happy with Oracle and Documentum’s Linux installers. I know that they’re ports of what are essentially Windows products, but the fact is that if you’ve going to bother writing something in Java(Documentum) then you should at least make sure that it really is portable,  otherwise why not just use C/C++ and be done with it.&lt;/p&gt;

&lt;p&gt;The main Oracle install I struggle to understand, since the Oracle XE install was so painless, zero to database in no time. It clearly doesn’t fit well into the Linux way of doing things though:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt; It doesn&#39;t install services/scripts  to /etc/init.d (or equiv).&lt;/li&gt;
  &lt;li&gt;It doesn&#39;t setup users for you, i.e. install as root, run as oracle (yet it requires root privileges to do two tasks).&lt;/li&gt;
  &lt;li&gt;Requires SELINUX to be disabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Delving into changing memory limits and such is another matter, I think it may be better to leave those to the user,  just because they can fundamentally change/break the system. Ah, to go back to PostgreSQL, which I once thought difficult compared to MySQL.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>D6.5 Experiments (Part 2)</title>
   <link href="http://vertis.github.com/2009/05/04/d6-5-experiments-part-2.html"/>
   <updated>2009-05-04T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/05/04/d6-5-experiments-part-2</id>
   <content type="html">&lt;p&gt;I’ve been trying to do an install of Documentum using the Linux/Oracle downloads without much success. This may well be more on the Oracle side of the fence, but this started when I put Oracle XE(10.2.0.1-1) on a newly installed CentOS 5.3 virtual machine, and then tried to get Documentum (6.5SP1) installed and configured, only to get the majority of the way through and be told that the minimum is Oracle 10.2.0.3,  &lt;strong&gt;despite what the release notes say&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Since 10.2.0.1-1 is the latest Oracle XE, I concluded that it must not be supported and moved on to trying 11.1 (Standard One). The biggest downside to this is that this Oracle installer is far less friendly than the XE installer, and at the end of it, I am not left with a TNSNAMES.ORA which Documentum needs. I am not an Oracle expert by any means, I would prefer to use PostgreSQL or MySQL, but they’re not a supported configuration. Even ignoring ‘supportability’, since this project is only experimental anyway, there is no information on whether it is even possible to get it running using these databases. Since there is a large amount of mapping/optimization between DQL and the underlying SQL I would tend towards it not being possible.&lt;/p&gt;

&lt;p&gt;Does anyone have any advice or instructions for getting D6.5SP1 installed from scratch on linux? Failing that I will persist with my attempts, and let you know how it turns out.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Zillow(?) vs. Social Media</title>
   <link href="http://vertis.github.com/2009/05/01/zillow-vs-social-media.html"/>
   <updated>2009-05-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/05/01/zillow-vs-social-media</id>
   <content type="html">&lt;p&gt;If you’d said the word &lt;a href=&quot;http://zillow.com&quot;&gt;Zillow&lt;/a&gt; before lunch today I would have looked at you strangely. At lunch my iGoogle home page revealed a travesty taking place. A user of &lt;a href=&quot;http://news.ycombinator.com/&quot;&gt;Hacker News&lt;/a&gt; was asking for &lt;a href=&quot;http://news.ycombinator.com/item?id=587881&quot;&gt;advice&lt;/a&gt; regarding Zillow offering $250 for the his domain (and threatening to cut off API access).  It would seem from reading the thread, that Zillow (a real estate site),  had decided that Auston Brunson (and his domain &lt;a href=&quot;http://iZillow.net&quot;&gt;iZillow.net&lt;/a&gt;) had out lived their usefulness.&lt;/p&gt;

&lt;p&gt;iZillow has an iPhone app up on the app store that suddenly became a competitor to Zillow’s own newly released &lt;a href=&quot;http://www.zillow.com/blog/zillow-iphone-app-1-real-estate-app-in-first-day/2009/04/30/&quot;&gt;iPhone app&lt;/a&gt;. To make things worse there is clearly trademark issues, not to mention that Auston’s app relies on a public API supplied by Zillow. The advice from Hacker News users ranges from “time to play hardball” to “lets start a negative PR campaign on twitter (#zillowfail)”.&lt;/p&gt;

&lt;p&gt;Why shouldn’t Zillow shutdown someone that is infringing on their trademark? After all, what right does iZillow.net have to use the name? If it was a clear cut case of trademark infringement, then I wouldn’t be posting this, I’ve had these kind of discussions with &lt;a href=&quot;http://www.etsy.com&quot;&gt;Etsy&lt;/a&gt; about my former site &lt;a href=&quot;http://www.etsytools.com&quot;&gt;EtsyTools&lt;/a&gt; (the death of which had nothing to do with trademarks). Without going into to much detail, Etsy was outstandingly reasonable in the protection of their trademark, since it’s a case of protect their trademark or risk losing it (so fair enough).&lt;/p&gt;

&lt;p&gt;It seems like from Zillow’s perspective at least it is a clear cut issue. A &lt;a href=&quot;http://www.zillow.com/blog/zillow-iphone-app-1-real-estate-app-in-first-day/2009/04/30/#comment-62332&quot;&gt;comment&lt;/a&gt; from Drew Meyers (representing Zillow) has suggested that this is indeed what the communication is about.&lt;/p&gt;
&lt;blockquote&gt;&lt;a rel=&quot;external&quot; href=&quot;http://www.zillow.com/profile/Drew&quot;&gt;Drew Meyers&lt;/a&gt; on         April 30, 2009        11:34 pm

I&#39;ve been in contact with Mr Bunson about the issue being discussed on Hacker News. I don&#39;t think it&#39;s appropriate to discuss our conversation in public, however, I will say that what is described here is not a complete representation of the conversation. Mr Bunson is welcome to continue to use the API as long as he doesn&#39;t infringe upon our trademark and use our brand name &quot;Zillow&quot; on his website.&lt;/blockquote&gt;
&lt;p&gt;I would agree with this except its taken them a whole year to get around to ‘protecting’  their trademark, and it comes suspiciously around when their releasing their own iPhone app. There is nothing stopping Zillow from using trademark and API access to effectively shutdown their competitor, that doesn’t make it right. Whether he’s right or wrong in his actions, Auston has built up a user base, and invested a large amount of effort into the site.&lt;/p&gt;

&lt;p&gt;I can’t help but wonder if going to Hacker News will help or hinder. Certainly the wrath of an incensed mob is nothing to be ignored, but by bringing it out Auston Brunson may have aggravated Zillow. I certainly hope that Zillow will reconsider it’s initial position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;David and Drew (from Zillow) have been very agressive in maintaining that this is just a trademark issue. They also maintain (this has been confirmed by Auston) that the $250 figure was Auston’s number. According to Auston they offered “a couple of hundred bucks”.&lt;/p&gt;

&lt;p&gt;It’s not, and it never will be just a trademark issue, not to Auston anyway. He’s been running iZillow.net since May last year (and all the sweat and blood that comes with that). Has built up a user base &amp;amp; links from the rest of the internet (NYTimes, blogs, etc). Claiming it’s just a trademark issue, will give little comfort to anyone else using Zillows API. The timing is just too close to the release of their own product.&lt;/p&gt;

&lt;p&gt;Regardless of who put the figure on the table, I would like to see Zillow rise above and put a large figure on the table. They need to think about the impact that they’re having on an individual.&lt;/p&gt;

&lt;dl id=&quot;comment_list&quot;&gt; &lt;dd class=&quot;comment&quot;&gt; &lt;/dd&gt; &lt;/dl&gt;
</content>
 </entry>
 
 <entry>
   <title>RE: Rails is not a ghetto, it's a train station.</title>
   <link href="http://vertis.github.com/2009/04/29/re-rails-is-not-a-ghetto-it-s-a-train-station.html"/>
   <updated>2009-04-29T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/04/29/re-rails-is-not-a-ghetto-it-s-a-train-station</id>
   <content type="html">&lt;p&gt;I accept planetmcd’s criticism of my previous post. I’m aware that I’m less than eloquent and my arguments less than logical at times.&lt;/p&gt;

&lt;p&gt;I can’t say for sure whether anyone has ever done a presentation like that here. I do know that something like that wouldn’t be accepted not just because of the images (sexual or not), but because it doesn’t conform to corporate standards. Ruby/Rails/Web2.0 has no such standards, more, the culture is one of being risky, on the edge, and of pushing the limits.&lt;/p&gt;

&lt;p&gt;There are probably many ways that it could have been done better, but it wasn’t. The problem stems from not going to Matt, and expressing that they didn’t like the presentation. They could have suggested using ‘Fragstar’ next time (via Renae Bair). Instead choosing to drag Rails through the mud publicly, “Here is a professional community that doesn’t respect women”.&lt;/p&gt;

&lt;p&gt;I’m aware that Matt has defend his position, and the DHH may have made it worse, but I don’t condone the method this was approached in the first place. It’s sensationalist and unnecessary. Do people actually think they’ve improved the community by acting in this manner?&lt;/p&gt;

&lt;p&gt;The dress code is only one facet of what I was trying (albeit poorly) to express. If you asked a programmer whether he would prefer to wear jeans and t-shirt or suit and tie to work which would he pick? What is the dress code at the Web2.0 development houses (not having worked at one I don’t know)? If it is jeans and t-shirts then that workplace is different to mine. My current employers wouldn’t consider them very professional either - This is where it goes to the heart of the community. You can do development the traditional, non agile way, any time you want to put on a suit and tie and forget you know techniques like metaprogramming/bdd/tdd (and don’t forget how to use windows, because that’s what corporate professionals use).&lt;/p&gt;

&lt;p&gt;I have worked for a few industrial clients where staff had nudes as desktop wallpapers (we’re not talking partial nudity either), and pinups scattered around the sheds. There were certainly females around, though how they felt about it never came up. They would consider themselves professional, in that they provide top notch solutions to their clients. Warranties &amp;amp; quality assurance, etc. I doubt my current employer would find them very professional either, sweaty, greasy, and not very formal.&lt;/p&gt;

&lt;p&gt;One of the things that I’ve heard raised when Australian corporate entities deal with overseas counterparts, is that we’re a good deal less formal and respectful than they are. Socially and culturally Australians are more laid back, some might say unprofessional. Different people are always going to have differing opinions on professionalism, I find it unlikely that Matt felt he was being unprofessional in using the pictures and analogy that he did. I would hazard he still doesn’t feel he was unprofessional, though he undoubtedly realizes that it was a mistake.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rails is not a ghetto, it's a train station.</title>
   <link href="http://vertis.github.com/2009/04/28/rails-is-not-a-ghetto-it-s-a-train-station.html"/>
   <updated>2009-04-28T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/04/28/rails-is-not-a-ghetto-it-s-a-train-station</id>
   <content type="html">&lt;p&gt;Before I launch into my response to &lt;a title=&quot;Rails is still a Ghetto&quot; href=&quot;http://www.rubyrailways.com/rails-is-still-a-ghetto/&quot;&gt;Peter Szinek&lt;/a&gt;, you need to know some background. &lt;a title=&quot;@merbist&quot; href=&quot;http://twitter.com/merbist&quot;&gt;Matt Aimonetti&lt;/a&gt; made a &lt;a href=&quot;http://www.slideshare.net/mattetti/couchdb-perform-like-a-pr0n-star&quot;&gt;presentation&lt;/a&gt; at &lt;a href=&quot;http://gogaruco.com/&quot;&gt;GoGaRuCa&lt;/a&gt; on CouchDB, which included sexual references and supposedly explicit images. I’ve looked over the presentation (which may or may not have the same content as the one at the event) and I have to say that I found it to be pretty tame considering the hype that had spread before it. When I first read the story (found &lt;a href=&quot;http://www.ultrasaurus.com/sarahblog/2009/04/gender-and-sex-at-gogaruco/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://dyepot-teapot.com/2009/04/25/dear-fellow-rubyists/&quot;&gt;here&lt;/a&gt;) it was framed in ‘how to scare women away from your development community’. &lt;a href=&quot;http://www.twitter.com/dhh&quot;&gt;DHH&lt;/a&gt; and probably many others&lt;a href=&quot;http://www.renaebair.com/2009/04/27/perform-like-a-frag-star/&quot;&gt;&lt;/a&gt;, &lt;a href=&quot;http://http://www.loudthinking.com/posts/39-im-an-r-rated-individual&quot;&gt;responded&lt;/a&gt; &lt;a href=&quot;http://www.loudthinking.com/posts/40-alpha-male-programmers-arent-keeping-women-out&quot;&gt;strongly&lt;/a&gt; to the controversy. I’m particularly fond of Renae Bair’s &lt;a href=&quot;http://www.renaebair.com/2009/04/27/perform-like-a-frag-star/&quot;&gt;post&lt;/a&gt;.&lt;a href=&quot;http://www.renaebair.com/2009/04/27/perform-like-a-frag-star/&quot;&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This morning when I got to work I was greeted by another story…about how rails is still a ghetto.  I have to disagree with the argument. Yes if you go to India and go to a Hindu temple you should take off your shoes, and you should be refined enough to KNOW to take off your shoes, either that or the shoes at the door should give you the heads up. This line of reasoning isn’t relevant for a rails conference, because there is no guideline anywhere that says, ‘should not show pictures of that nature’. It may well have been a bad decision, but there without precedent, how was he to know.&lt;/p&gt;

&lt;p&gt;This is where the argument that professionalism comes in. I certainly wouldn’t dare using a presentation like that at my work, because they’re card holding accountants and lawyers. The development community (in particular web 2.0) has a reputation for riding on the edge, this is not just rails (which has been pointed out by others), but many other frameworks/languages that consider themselves groundbreaking. Clearly there is a disconnect here, between being passionate and fun, and relaxing from corporate strictures. Professionalism should have had everybody there wearing a suit and tie, but I would bet they weren’t.&lt;/p&gt;

&lt;p&gt;There has been plenty of coverage about this less than newsworthy event, so I’ll not waste any more time on it. Another couple of days, and it will have disappeared from reddit, digg, etc &amp;amp; and will be forgotten. The majority of people that use Rails don’t care about posturing and hype that people are putting so much effort into…that’s just a way of big noting blogs and looking important. Rails isn’t a ghetto, if anything it’s a train station, with a lot of people getting on and going places and a few people that feel the need to hang around and cause trouble. I’m not saying you don’t have a right to dislike his presentation, but don’t include the rest of us. Don’t pretend like he did something wrong just because you don’t like it. If you don’t like the way he did the presentation put together a better presentation and you be the one standing on stage.&lt;/p&gt;

&lt;p&gt;On that note I’m going back to work.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>D6.5 Experiments (Part 1)</title>
   <link href="http://vertis.github.com/2009/04/28/d6-5-experiments-part-1.html"/>
   <updated>2009-04-28T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/04/28/d6-5-experiments-part-1</id>
   <content type="html">&lt;p&gt;Spent most of the night downloading Documentum 6.5 components for Linux &amp;amp; Oracle. While I would prefer to use an open source database like PostgreSQL as the backend, the actual database isn’t going to matter much once its installed (they don’t offer it as an alternative anyway). What I’m looking to do is have a D6.5 environment that I can tune to be as fast as possible. This includes doing things that you wouldn’t be able to do on a System that has to be supported, such as using Nginx as the front end instead of Apache Httpd  with Apache Tomcat.&lt;/p&gt;

&lt;p&gt;I’m still a bit up in the air as to which App Server I’m going to use. Tomcat is the obvious answer and the starting point for clients that don’t want to invest in IBM Websphere,  BEA(Oracle) Weblogic, or Jboss. I do think that Apache Geronimo and Jetty are worth investigating as alternatives. One of the complaints that I’ve heard against Tomcat in production environments is that it is ridiculously unstable when running Webtop. With the app servers needing to be restarted every week (or more frequently). IMO there is more likely an issue with Webtop itself rather than Tomcat. I haven’t heard of stability complaints when running other webapps.&lt;/p&gt;

&lt;p&gt;One of the big complaints against Apache Tomcat is that it isn’t a full stack App Server like IBM Websphere, for instance architecturally IBM Websphere has a lot more under the covers. I’ve not installed Apache Geronimo before but it’s supposed to be more of a complete App Server. I’ll let you know how my project goes anyway,  got to run off to work now.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>IS-t in an Economic Crisis</title>
   <link href="http://vertis.github.com/2009/04/09/is-t-in-an-economic-crisis.html"/>
   <updated>2009-04-09T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/04/09/is-t-in-an-economic-crisis</id>
   <content type="html">&lt;p&gt;Information Solutions - technology, is a simple way of expressing that the IT department is there to serve the needs of the client facing business. The current enterprise that I’m working at is the first massive global organisation that I’ve worked with. 130,000 odd employees throughout the world, with about a quarter of that in the APAC region.&lt;/p&gt;

&lt;p&gt;I’m proud to say that the IS-t teams that I work with on a daily basis are excellent people, as are the people from other departments that I’ve had dealings with. Honest hard working people, just trying to do the best they can at their jobs.&lt;/p&gt;

&lt;p&gt;Belief and evidence led me to believe enterprises move pretty slowly. Despite that things can change pretty rapidly up here, there is a level of adaptability that I’d not expected to find. A mission that IS-t should be an enabler for change, not an excuse that it is all too difficult. Things have been booming in the last ten or so years. A colleague has a graph on his wall showing the steady climb in the amount of employees that have been added to the ranks in Australia.&lt;/p&gt;

&lt;p&gt;There was money, and there probably still is, but something changed a little while back. The negligence of the US property market (and other factors I don’t try to fathom) has sent the world spiraling into a recession. All of a sudden the extravagance of the last decade is thing of the past.&lt;/p&gt;

&lt;p&gt;Business class flights are out the window for all but the highest of managers, and furthermore, travel itself only happens as an absolute necessity. Perhaps that’s the way it should have been all along. On Tuesday we had the largest video conference that the IS-t department has ever done.  People from the Infrastructure side of IS-t came together in a massive video conference that brought the whole APAC region into the one room. It wasn’t free but it was a damn sight cheaper than flying them here, or having them continue to work on their own and duplicate resources.&lt;/p&gt;

&lt;p&gt;After all the scene setting I’ve done above, this is the real meat. There are steps being taken to eliminate the duplicity that has been taking place. No longer will there be 5-10 efforts to manage the desktops and laptop images (the standard set of software installed on machines), and why should there be? Sure it means a lot more work for the people in the Desktop team, moving from managing the computers of 5000 people to 30000 people, but there is an economy of scale. One or two people are assigned to create the image (or fix the image), and the people from other regions that were duplicating this effort can do other things, which does not mean redundancy. There is &lt;em&gt;always&lt;/em&gt; too much work and too few people.&lt;/p&gt;

&lt;p&gt;Technology has long passed the point where it is possible to work effectively across countries. My own responsibility, the Document Management System, is a part of this. Tools that allow you to collaborate effectively on the creation of documents, and create workflow processes that allow the steps taken when dealing with content, to be distilled.&lt;/p&gt;

&lt;p&gt;The global economic crisis has changed a lot of things. Budgets that were a foregone conclusion have been reevaluated. This isn’t a bad thing, good economic times breed weakness. Rather than being smart about things, taking the easy way out because if you throw enough money at the problem will eventually go away.&lt;/p&gt;

&lt;p&gt;I say bring on the chance to be leaner. The chance to prune to weak.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Quick Update</title>
   <link href="http://vertis.github.com/2009/03/11/quick-update.html"/>
   <updated>2009-03-11T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/03/11/quick-update</id>
   <content type="html">&lt;p&gt;It’s been almost a month since my last post, disgraceful. While I have the will to maintain a blog, I certainly don’t have the time. We’re currently in the thick of a large Documentum deployment, which means that there are bucket loads of new users that each have their own issues with the system.&lt;/p&gt;

&lt;p&gt;I have learned SO much over the last few months, hopefully I’ll have a chance to sit down over the next week or so and distill some of that wisdom. Until then, keep safe.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Falling in with the wrong twrowd.</title>
   <link href="http://vertis.github.com/2009/02/04/falling-in-with-the-wrong-twrowd.html"/>
   <updated>2009-02-04T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/02/04/falling-in-with-the-wrong-twrowd</id>
   <content type="html">&lt;p&gt;There are several ways to use social networking and social media:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;To help you connect and interact with people that you know.&lt;/li&gt;
  &lt;li&gt;A catalyst to enhance your own thinking.&lt;/li&gt;
  &lt;li&gt;A way of broadcasting your products and brand to a captive audience.&lt;/li&gt;
  &lt;li&gt;There are probably other uses as well, but how long do you want this list to be?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll get to what is wrong with users pushing products through social networking in a moment, but there is another group of people that use social networking: self styled experts and consultants. People that claim to know how to utilize social networking and social media, people that would be otherwise unremarkable in their careers but have garnered a following of people.&lt;br /&gt;
I started following &lt;a href=&quot;http://www.twitter.com/keyinfluencer&quot;&gt;@keyinfluencer&lt;/a&gt; and &lt;a href=&quot;http://www.twitter.com/skydiver&quot;&gt;@skydiver&lt;/a&gt; after the former made a comment on &lt;a href=&quot;http://twitter.com&quot;&gt;twitter&lt;/a&gt; that blew up in his face, a horse which has been beaten to death on blogs/comments and twitter.  They haven’t had a great amount of interesting updates to read since, but &lt;a href=&quot;http://www.twitter.com/skydiver&quot;&gt;@skydiver&lt;/a&gt; aka &lt;a href=&quot;http://www.shankman.com&quot;&gt;Peter Shankman&lt;/a&gt; has some interesting projects, not the least of which is &lt;a href=&quot;http://www.helpareporter.com/&quot;&gt;HARO&lt;/a&gt;. So they both stayed on the list of people I was following, even after the drama died down.&lt;/p&gt;

&lt;p&gt;Around the same time, my official twitter honeymoon period ended. While people are initially interested in someone new, that doesn’t last long unless you are relevant , such as the work they do or the values they represent, there is very little connection that causes interaction. I was sitting at about 25 followers, none of whom actually interacted with my tweets for the most part. I wanted to be relevant and included, and I really really wasn’t. It’s enough to make you pull your hair out.&lt;/p&gt;

&lt;p&gt;Then I added &lt;a href=&quot;http://twitter.com/guykawasaki&quot;&gt;@guykawasaki&lt;/a&gt; after &lt;a href=&quot;http://twitter.com/keyinfluencer&quot;&gt;@keyinfluencer&lt;/a&gt; retweeted something from him. Over the next 15 to 20 minutes I picked up another 5 -10 followers, all of them matching the above stereotype. Lots of followers, about an equal number of people they were following…social media experts. People trying to use the medium to their benefit.&lt;/p&gt;

&lt;p&gt;I’ve been to a few presentations in the past that these people remind me of. The sales pitch, the angle:&lt;/p&gt;
&lt;blockquote&gt;&quot;You too can be *RICH*, if you do what I do.&quot;&lt;/blockquote&gt;
&lt;p&gt;With slicked down hair and a suit that they hope I’ll recognize is expensive, (which of course I don’t - I know absolutely nothing about suits), the presentation is a money making effort all on its own. The person up the front has no interest in making anyone else rich, or adding value to your life. And who can blame them, why should they care about you? But why should you respect them either? Aside from the fact that they’re doing well financially (assumedly) there is nothing else outstanding about them. They’re not making the world a better place, just trying to get ahead themselves.&lt;/p&gt;

&lt;p&gt;If any of the people above feel that this isn’t fair then speak up. I certainly don’t know everything about you. &lt;a href=&quot;http://www.shankman.com&quot;&gt;Peter Shankman&lt;/a&gt; certainly has something that helps out a lot of people, what about the rest?&lt;/p&gt;

&lt;p&gt;I was having a discussion about SEO and social media the other day with my dentist. We talked about a lot of things, not the least of which was the fact that businesses were increasingly trying to utilise this new platform to push their agenda. That may be effective to an extent - but it’s not real. The essence of social networking and social media is that we don’t want to be spoonfed and forcefed what we consume. Twitter is all about finding people to follow that are interesting and useful, but at what point does it become just another billboard that can be used to get your money?&lt;/p&gt;

&lt;p&gt;A perfect example of the corruption of social media is the spamming that goes on. Because of the explosion of available services (there are now several twitter clones for instance). It has become common for people to spam ALL the available services, in an attempt to get your name out as hard and fast as you can. A recent issue on &lt;a href=&quot;http://etsy.com&quot;&gt;Etsy.com&lt;/a&gt; highlights the problem that comes when you force an advertising campaign into a format that is designed for personalities, not products. &lt;a href=&quot;http://timothyadamdesigns.blogspot.com/2008/12/social-bookmarking-in-flash.html&quot;&gt;Timothy Adam Designs &lt;/a&gt;was recommending that people use a service called &lt;a href=&quot;http://socialmarker.com&quot;&gt;socialmarker.com&lt;/a&gt;. SocialMarker is a service which lets you post the same URL to up to 160 social bookmarking sites instantly. Timothy’s instructions were embraced by the Etsy community, and subsequently all linking to etsy from &lt;a href=&quot;http://propeller.com&quot;&gt;propeller.com&lt;/a&gt; was banned as it was considered a spam site.  He was at a point the social media expert on the Etsy forums. The kicker is, Timothy’s instructions were posted to the Etsy forums as his method of getting blog hits, which would increase his popularity, which would sell his product. His angle: “You too can be rich, if you do what I do.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social media is not designed for products&lt;/strong&gt;. If you are pushing your products by announcing them on twitter, or bookmarking them on the plethora of social bookmarking sites then you’re not doing the right thing. Another interesting &lt;a href=&quot;http://www.etsy.com/forums_thread.php?thread_id=6025057&quot;&gt;forum post&lt;/a&gt; on Etsy deals with the fact that a lot of these sites have rules in the Terms of Service against this very action.&lt;/p&gt;

&lt;p&gt;There is a place for /Social Products/,  but don’t misunderstand me. Social Products should not be mistaken for self promotion. Social products(or services) are when someone else recommends your product or service. Social products are more commonly known as word of mouth, someone buying your product or using your service and feeling so strongly about it that they have to share it with other people. There is only one way to get into that category; &lt;strong&gt;be outstanding in what you do&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Stop falling in with the wrong people. I’m still being ignored on twitter, but I’ve had this realisation that it doesn’t matter. On one level, I’d like to be relevant on twitter and have people read my blog, because that may help me get more consulting work long-term. But what I really have to do to get work is follow my own advice. Be outstanding.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CSS Design: Learning from scratch</title>
   <link href="http://vertis.github.com/2009/01/12/css-design-learning-from-scratch.html"/>
   <updated>2009-01-12T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/01/12/css-design-learning-from-scratch</id>
   <content type="html">&lt;p&gt;I’m not a graphic designer. But my use of &lt;a href=&quot;http://www.twitter.com/vertis&quot;&gt;Twitter&lt;/a&gt; has done exactly what I’d hoped and been a focus for my thoughts. As an individual if I want to pump out an impressive web site I have to be able to do every part of it. Unfortunately that means being able to implement a CSS design.&lt;/p&gt;

&lt;p&gt;Admittedly you can rely on sites like &lt;a href=&quot;http://www.oswd.org/&quot;&gt;OSWD&lt;/a&gt;, &lt;a href=&quot;http://opendesigns.org/&quot;&gt;OpenDesigns&lt;/a&gt; and &lt;a href=&quot;http://openwebdesign.org/&quot;&gt;OpenWebDesign&lt;/a&gt; for a while, or you could buy a commercial design. There is also some good &lt;em&gt;base&lt;/em&gt; templates around, but in the end though you’ll need to customise those designs at the very least, and at the very worst you won’t find something you need.&lt;/p&gt;

&lt;p&gt;With this in mind I decided that it was high time that I created some simple designs of my own, using the best techniques I can manage. They won’t be perfect, but they’ll be a starting point. I’ll post my first results in a couple of days. In the meantime I’m very interested to talk to people that do Web 2.0 designs and pick their brains as to the right way of doing things.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Getting started Twitter</title>
   <link href="http://vertis.github.com/2009/01/10/getting-started-twitter.html"/>
   <updated>2009-01-10T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/01/10/getting-started-twitter</id>
   <content type="html">&lt;p&gt;I’ve avoided using twitter for quite a while (for who knows what reason). But I finally relented and signed up for an account while I was looking for good ruby and rails blogs to follow and stumbled across a post that had a complete list of famous Ruby people (Rubyists). I have to say that so far I haven’t been disappointed with it.&lt;/p&gt;

&lt;p&gt;It reminds me a lot of IRC but without the having to join lots of channels and check all of them for discussions (when mostly their idle with spurts of discussion). I’ve wanted to be more involved with the ruby and rails social aspect since I took part in Rails Rumble 2008.&lt;/p&gt;

&lt;p&gt;I will be interesting to see how my usage of twitter evolves over time.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Boiler updated.</title>
   <link href="http://vertis.github.com/2009/01/10/boiler-updated.html"/>
   <updated>2009-01-10T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/01/10/boiler-updated</id>
   <content type="html">&lt;p&gt;A while ago (right after Rails Rumble) I decided to rework Bort to suit my own tastes. I renamed my Bort derived rails base app to Boiler. Yesterday I went through and reworked Boiler from a newer copy of Bort. I added a more inviting default theme and some of the other plugins and gems that I use regularly. You can check it out at &lt;a href=&quot;http://www.github.com/vertis/boiler&quot;&gt;www.github.com/vertis/boiler&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Back from melbourne and SSH Botnets</title>
   <link href="http://vertis.github.com/2009/01/01/back-from-melbourne-ssh-botnets.html"/>
   <updated>2009-01-01T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2009/01/01/back-from-melbourne-ssh-botnets</id>
   <content type="html">&lt;p&gt;I’ve been quiet over the Christmas/New Year period, that doesn’t mean that I’ve left my computer alone on the contrary I been working on some projects that have been waiting for quite a while. The most important of which is a tool to fight back against the hackers and bot networks that have been trying (unsucessfully) to bruteforce servers I own or manage for the last 2-3 years. I have seen other posts about the rise of bruteforcing attacks on ssh servers recently, and the added complexity of those attacks coming from multiple locations (botnet coordinated).&lt;/p&gt;

&lt;p&gt;Bruteforce attacks on SSH are nothing new, I remember seeing them as far back as 2005. At the time I was managing about 25 linux servers and the bruteforce attacks would cause accounts to get locked out (which I would then have to unlock). For the most part we dealt with the problem by having a strict hosts.allow/hosts.deny setup (and of course auditing passwords for complexity). Beyond that, I was somewhat powerless to do anything about the attempts.&lt;/p&gt;

&lt;p&gt;These days I run a dedicated server and a couple of virtual servers, and I was seeing the same kind of attempts in my logs. Unlike managing someone elses servers though I have the ability to actively fight back against the attacks. So I am.&lt;/p&gt;

&lt;p&gt;I started using ‘kojoney’, an SSH honeypot, but found that while it was fun watching the hackers login and try and compromise a sandbox, it was not what I wanted. So I modified kojoney to log the password used as well (in addition to the username) and setup a ruby on rails project that would record this information, along with the originating IP address, and attempt to login to the IP address with the username/password combo. I called the project mirror, a sort of if you bruteforce me it’ll bruteforce you kind of thing.&lt;/p&gt;

&lt;p&gt;Then I left it alone. I hadn’t expected to see any success. But when I checked the logs a few days later I’d successfully logged into a host in poland. It was a non priviledged account but I backed up everything that the people had uploaded, and changed the password on the account.&lt;/p&gt;

&lt;p&gt;A few days later I scored another server, this time a root account. I decided that rather than manually logging in and disabling their access I would go one step further and setup capistrano tasks to secure the box (as much as you can a box that has been compromised at a root level). Not only that but the ssh bruteforcer that had been running on this host had gotten 2 more vulnerable root accounts.&lt;/p&gt;

&lt;p&gt;There is typically 2 pieces of software installed on the box. A ssh bruteforcer, and a botnet client, at times there are multiple copies of both, if the host has been compromised multiple times.&lt;/p&gt;

&lt;p&gt;So far its ME 4 to Crackers 0. I know the battle isn’t over, and that what I’m doing is somewhat grey, but I don’t know of a more ‘white hat’ way of helping stop hackers. If those four servers are managed by people that a &lt;em&gt;clearly&lt;/em&gt; stupid, then someone has to step into the breach. Now if only I could find somewhere to send the invoice for my time.&lt;/p&gt;

&lt;p&gt;I will provide anyone that is a legitimate security researcher with more details (upon request), including copies of the botnet and ssh-scan software (which shouldn’t be to hard to get with a regular honeypot anyway).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Christmas cleanup</title>
   <link href="http://vertis.github.com/2008/12/13/the-christmas-cleanup.html"/>
   <updated>2008-12-13T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/12/13/the-christmas-cleanup</id>
   <content type="html">&lt;p&gt;Over the weekend I went to melbourne for a couple of christmas parties, the work one and the extended family one. I’m into my last week at work before the Christmas break and I must say that I am dying to put up my feet and enjoy the a nice sunny and warm christmas. I know there are people that think christmas should be all white and cold, more power to them, but I’m not one of those people. I like the fact that we can have our social occasions outside at the beach or in the sun.&lt;/p&gt;

&lt;p&gt;One of the things that has to happen this week is for me to make sure that the system is in the best possible condition. Create documentation about how to keep the system running for the on call person that will be responsible for dealing with any issues that arise and provide as much knowledge based material as possible. Not to much mind since I don’t want my job to disappear over the christmas break, but enough that when I come back on the 5th of january I don’t walk into a disaster zone.&lt;/p&gt;

&lt;p&gt;I’m secretly working on a tool that can be used to monitor each of the Documentum components and send me information when one or more of them breaks. It won’t be mature by christmas but it’ll be good if it notifies me of any irritating problems. I also need to finish up as many of the outstanding tasks as possible. All this should make for a hectic week.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>DQL stuff</title>
   <link href="http://vertis.github.com/2008/12/10/dql-stuff.html"/>
   <updated>2008-12-10T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/12/10/dql-stuff</id>
   <content type="html">&lt;p&gt;Prasad on his blog (you can find the link on the right), has a really really useful collection of dql that can be used for various admin tasks. I’m going to slowly build up my own list of DQL for much the same purposes. A note on convention: This is standard convention but as a refresher (or for those not aware of that convention) anything within &amp;lt; &amp;gt; is to be filled in at runtime. Remove the &amp;lt; &amp;gt; brackets and replace with appropriate value.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Updates the ACL on all content in a given folder...be aware it won&#39;t allow you to replace the ACL on a locked piece of content, so you&#39;ll either need to skip it like I have below or make sure that all the content is unlocked before trying to do this query, otherwise the error message is VERY VERY vague.
&lt;blockquote&gt;update dm_sysobject object set acl_name = &#39;&amp;lt;acl_name&amp;gt;&#39;, set acl_domain = &#39;&amp;lt;acl_owner&amp;gt;&#39; where folder (&#39;/&amp;lt;folder&amp;gt;&#39;, DESCEND) and r_lock_owner = &quot;&lt;/blockquote&gt;
&lt;/li&gt;
  &lt;li&gt; Replaces the ACL on all content in a given folder - this is an important change because it only overwrites a specific ACL rather than changing all the content to be under the new ACL, which could potentially be a security problem if the content has been locked down further. It&#39;s really only a simple change to the previous query.
&lt;blockquote&gt;update dm_sysobject object set acl_name = &#39;&amp;lt;new_acl_name&amp;gt;&#39;, set acl_domain = &#39;&amp;lt;acl_owner&amp;gt;&#39; where folder (&#39;/&amp;lt;folder&amp;gt;&#39;, DESCEND) and r_lock_owner = &quot; and acl_name = &#39;&amp;lt;old_acl_name&amp;gt;&#39;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 <entry>
   <title>Documentum, old world document management (or why to avoid Documentum 6.0SP1)</title>
   <link href="http://vertis.github.com/2008/12/10/documentum-old-world-document-management-or-why-to-avoid-documentum-6-0sp1.html"/>
   <updated>2008-12-10T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/12/10/documentum-old-world-document-management-or-why-to-avoid-documentum-6-0sp1</id>
   <content type="html">&lt;p&gt;I’m sick of raising support cases for things that should just work. I’m frustrated that a product as buggy and unstable as Documentum 6.0 SP1 can be proposed as a solution (by EMC). There are a lot of good things about Documentum, but there is a lot of bloat as well. This will be a growing list of stupid problems that I’ve found, I’ll start with one item and go from there.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Clicking on &#39;Save As&#39; on a permission set with a name over a certain length causes it to bomb out. Why? because it tries to give the permission set a temporary name that is longer than the allowed 32 characters. No chance to override this name, no graceful handling, just a fat error message and the chance to reload DA and try again.&lt;/li&gt;
  &lt;li&gt;When using LDAPSync (which you probably need to get hotfixed anyway what with it having so many bugs fixed) &#39;Groups and their member users&#39; does not update the content of mapped attributes even if they change (for instance during a rename).&lt;/li&gt;
  &lt;li&gt;My favorite of the last 2 weeks: BOCS and DTS are not supported in the same solution. This problem is related to DTS going looking for content that is still parked on the BOCS server. It&#39;s been fixed in 6.5...the problem is that it was EMC that built the solution that we&#39;re now using. There is some instability in the DTS services, which is something I have to follow up, but EMC/Documentum had better be hoping that the two are not related.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think part of the problem is that Documentum like a lot of old world enterprise applications has a very tenous hold on some of the techniques that allow for more error free development. I mean was the code even unit tested…&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Etsy Api repositories x2</title>
   <link href="http://vertis.github.com/2008/12/05/etsy-api-repositories-x2.html"/>
   <updated>2008-12-05T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/12/05/etsy-api-repositories-x2</id>
   <content type="html">&lt;p&gt;For those that are interested I’ve decided to release the work I did on accessing information from &lt;a href=&quot;http://www.etsy.com/&quot;&gt;etsy&lt;/a&gt;’s backend. I have two copies one that is a ruby gem and based on a custom hacked rubyamf implementation (since it doesn’t support being a client) and one written in PHP that relies on SabreAMF (the copy that I gave to juln and that runs the heartomatic), and put that up as well. The url you want for my new code is:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.github.com/vertis/etsy_api&quot;&gt;http://www.github.com/vertis/etsy_api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the one for my old (possibly broken) php code is:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.github.com/vertis/etsy_api-php&quot;&gt;http://www.github.com/vertis/etsy_api-php&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If people are interested in collaborating on these projects let me know (sign up for github) and I’ll see about adding you.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Internet Filtering: One ticket to...anywhere else.</title>
   <link href="http://vertis.github.com/2008/11/30/internet-filtering-one-ticket-to-anywhere-else.html"/>
   <updated>2008-11-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/11/30/internet-filtering-one-ticket-to-anywhere-else</id>
   <content type="html">&lt;p&gt;I’ve been fuming about the internet filtering that the Rudd government is trying to impose on us since I found out about it a couple of months ago. Its frustrating because I &lt;em&gt;KNOW&lt;/em&gt; its not practical. I had high hopes for Kevin Rudd’s government, I mean its not exactly the revolution that we’re seeing with the new president that the US has picked, but he was certainly a breath of fresh air after 12 long years of Howard government. But this half cocked internet filtering effort has shattered my belief in him.&lt;/p&gt;

&lt;p&gt;I’ve seriously considered just pulling up stake and moving elsewhere in the world, there is always room for one more technical person in most countries. This is not to say that I can’t get around the filter, anyone with half a clue can download Tor, and the rest of us with more technical knowledge can go a lot further than this; tunneling over SSH or creating a VPN to my dedicated server in the US (not that a virtual server wouldn’t work equally as well). But the fact remains that its another step down the road of losing personal choice, I say another and I mean it, this is not the first time that the government has stepped in and stopped something with a heavy hand that should fall under the responsibility of parents (what their children watch).&lt;/p&gt;

&lt;p&gt;I’ve been shocked to discover that Australia is a lot more prudish about a lot of things than you might believe. Christians would say that our society has not had its moral fabric eroded as much as say the US (even there the christians exert the same kinds of pressure). The problem is that fundamentally Christians believe that they have a right to shove their beliefs and concerns down everyone else’s throat. Enough about that though, this isn’t supposed to be an anti christian rant (and I’m not anti christian in general). It just frustrates me that people feel they have a right to destroy somebody else’s right to choose.&lt;/p&gt;

&lt;p&gt;The last thing that really gets me with this issue is the lies. To steal something from the abortion debate; “Don’t they know that you can be pro choice and still be against abortion”. They equate not wanting the filter with siding with child pornography, and it’s just patently false, I have no interest in EVER supporting child pornography (lock them up and throw away the key). That doesn’t mean that I agree that you should punish(remove the rights of) all Australians to decide what they look at, across a broad range of content, and claim that its all about the children. Hire more technically competent police to deal with cybercrime (an area I’d love to work in), and get a decent technology advisor.&lt;/p&gt;

&lt;p&gt;You can sign a petition at &lt;a href=&quot;http://www.getup.org.au/campaign/SaveTheNet/442&quot;&gt;http://www.getup.org.au/campaign/SaveTheNet/442&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Mongrel service tip</title>
   <link href="http://vertis.github.com/2008/11/12/mongrel-service-tip.html"/>
   <updated>2008-11-12T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/11/12/mongrel-service-tip</id>
   <content type="html">&lt;p&gt;If you’re running rails applications on Windows then you’ll be interested in or already use the mongrel_service gem. When I recently (today) tried to install it on a new computer I had trouble because it didn’t want to install the dependencies. Apparently it requires a version of the win32-service gem &amp;gt;= 0.5.2 but &amp;lt; 0.6.0&lt;br /&gt;
&amp;lt;div class=&quot;CodeRay&quot;&amp;gt;&lt;/p&gt;
&lt;pre&gt;Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator&amp;gt;gem install win32-service -v 0.5.2
C:\Documents and Settings\Administrator&amp;gt;gem install mongrel_service&lt;/pre&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
should do the trick&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;Apparently using w32-service causes problems whenever you have defined a class named service. Just be aware that its going to cause it to use w32-services service class rather than you’re own, regardless of whether you’re running mongrel as a service (it won’t happen if you don’t run mongrel).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Corkscrew to the Net</title>
   <link href="http://vertis.github.com/2008/11/12/corkscrew-to-the-net.html"/>
   <updated>2008-11-12T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/11/12/corkscrew-to-the-net</id>
   <content type="html">&lt;p&gt;I’m thrilled to announce I am no longer a prisoner of an oppressive firewall. I’m currently working at a clients site for the next &lt;em&gt;year&lt;/em&gt; give or take, which has been great, but one of the things that has really irked is the fact that their firewall is downright oppressive. Corporate policies prevent anything other than 80/443 out onto the net and stop webmail from working (to protect from viruses). This is a problem for me because I keep 2-3 dedictated linux servers for various reasons, obviously I can get to the hosted webapps just fine, but sshing in the change something on them is not possible due to the above mentioned firewall.&lt;/p&gt;

&lt;p&gt;Thats where corkscrew comes in. its a tool that allows you to change the clientside settings for OpenSSH to tunnel over the HTTP Proxy. Of course you still have to make sure that the SSH server is listening on either 80 or 443, however this is easy to accomplish if either one or both of those ports are spare or alternately you can assign and extra ip address and avoid apache/etc listening on */0.0.0.0&lt;/p&gt;

&lt;p&gt;I’ll leave it to the other &lt;a href=&quot;http://www.mtu.net/%7Eengstrom/ssh-proxy.php&quot;&gt;corkscrew guides&lt;/a&gt; as to the particular setup. And yes its probably possible for them to block this, which is why I won’t scream to loudly. Just remember if you’re one of those people trying to prevent people from using this that I’m not trying to do anything nefarious, i’m simply a geek who needs/loves port 22.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Are Linux users lemmings collectively jumping off of the cliff of reliable, well-engineered commercial software? -- Matt Welsh</title>
   <link href="http://vertis.github.com/2008/11/10/are-linux-users-lemmings-collectively-jumping-off-of-the-cliff-of-reliable-well-engineered-commercial-software-matt-welsh.html"/>
   <updated>2008-11-10T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/11/10/are-linux-users-lemmings-collectively-jumping-off-of-the-cliff-of-reliable-well-engineered-commercial-software-matt-welsh</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Update: There has been a bunch of traffic to this page over the last few days. Apparently this quote is showing down the bottom of slashdot pages again. I wrote this post a LONG time ago.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I’m slightly embarrassed that you’re all on this page, however I’ve decided to leave the post in it’s original form regardless. Please don’t judge me too harshly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There doesn’t appear to be any information available about where this quote came from, and more importantly the context in which it was said – though it would seem likely given other information about Matt Walsh, that I took the quote the wrong way.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I found this question as a quote on slashdot, and couldn’t resist responding.&lt;/p&gt;

&lt;p&gt;Lemmings? Lemmings as popularised by the game by the same name are supposedly creatures that follow each other and just keep going regardless of dangers en-route to their destination. Being a lemming is equated to being one of the Herd or not thinking for yourself. This is an unfair and baseless accusation. Linux users by their very minority are not followers, until recently there were no computers that came with linux installed by default. Clearly if you wanted to run Linux you had to leave the Herd.&lt;/p&gt;

&lt;p&gt;Well-engineered commercial software? That would be a stretch considering the issues that Microsoft has had over the decades since it started working with operating systems. I’m not saying that Linux has it all worked out, because it most assuredly doesn’t, but the difference is that if you’re not happy with something in Linux you have the power to do something about it. With all commercial software you are at the mercy of the company that owns the software to be diligent.&lt;/p&gt;

&lt;p&gt;Now I’m not saying that Windows doesn’t have good things, on the contrary there are features that I miss very much when using Linux, but the downsides are far outweighed by the benefits of an extremely stable OS. More importantly Linux is an OS that given enough time and dedication will run rings around anything Microsoft can field to compete with it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Turn on Authentication Tracing in Documentum Administrator</title>
   <link href="http://vertis.github.com/2008/11/06/turn-on-authentication-tracing-in-documentum-administrator.html"/>
   <updated>2008-11-06T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/11/06/turn-on-authentication-tracing-in-documentum-administrator</id>
   <content type="html">&lt;p&gt;The following comes in very hand when you’re trying to troubleshoot authentication problems. Go into DA and find the Administrative Methods; there should be one called ‘SET_OPTIONS’  which allows you to put in trace_authentication and set it to true. All authentication attempts will then be logged to the docbase log.&lt;/p&gt;

&lt;p&gt;A few notes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;If you have a clustered setup you&#39;ll need to make sure it gets turned on for both content servers (you can specify which you&#39;re connecting to when you login)&lt;/li&gt;
  &lt;li&gt;Make sure you turn it off when you&#39;re done troubleshooting, it adds a performance overhead not to mention chewing up log space.&lt;/li&gt;
  &lt;li&gt;Restarting the content server will cause it to turn off...to turn it off without restarting the content server just set it to false in the same place you turned it on.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>JRubyOnRails for the enterprise</title>
   <link href="http://vertis.github.com/2008/11/06/jrubyonrails-for-the-enterprise.html"/>
   <updated>2008-11-06T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/11/06/jrubyonrails-for-the-enterprise</id>
   <content type="html">&lt;p&gt;I believe that JRubyOnRails is paving the way for ruby and rails to be integrated into enterprise rather than being the sole domain of cutting edge developers. Perhaps its important that enterprise realises the power of rails or perhaps not (it might be better to keep it for ourselves). Regardless the ability to run ruby on rails applications on Java Application Servers is a big step towards acceptence in the enterprise.&lt;/p&gt;

&lt;p&gt;For those that aren’t familiar with this ability google ‘warbler’  and run through the tutorial. It is a little more complex to get a larger project to run on a Java Application Server but not so much that would deterr people. It will likely be a long path before its a mainstream technology but it’s a good first step.&lt;/p&gt;

&lt;p&gt;It’s also not necessarily a good thing to be tied to java, but when enterprise is so slow to embrace new technologies and better ways of doing things it is important to compensate to some degree. Not making them completely replace the Java application server that they paid to much for in the first place may make that admission and acceptence a little easier.&lt;/p&gt;

&lt;p&gt;UPDATE: I’ve since started following &lt;a href=&quot;http://www.twitter.com/headius&quot;&gt;@headius&lt;/a&gt; on twitter, the primary force behind JRuby. He is outstanding, and his belief in getting ruby accepted in the enterprise is inspirational.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Rails Rumble 2008</title>
   <link href="http://vertis.github.com/2008/10/15/rails-rumble-2008.html"/>
   <updated>2008-10-15T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/10/15/rails-rumble-2008</id>
   <content type="html">&lt;p&gt;I’m participating in &lt;a href=&quot;http://www.railsrumble.com/&quot;&gt;Rails Rumble 2008&lt;/a&gt; I got in a bit late because I only came across it the other day. I’m a bit of hermit when it comes to development so its a great idea participating in an event and getting to know some people. The project is currently top secret ;-) but once its finished I’ll open source it.&lt;/p&gt;

&lt;p&gt;The other thing I’m going to try and do is record really closely the steps that I take during development. So I can post the videos as podcasts (a la railscasts), but also so I can go back and evaluate my own processes. I haven’t done anything like this in the past but if it goes well then maybe I’ll make it a regular thing.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Word of the Day: Resource</title>
   <link href="http://vertis.github.com/2008/10/02/word-of-the-day-resource.html"/>
   <updated>2008-10-02T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/10/02/word-of-the-day-resource</id>
   <content type="html">&lt;p&gt;This word can mean a lot of things. The reason its currently in my headspace is ongoing discussions/actions to do with the amount of resources that are devoted to the project that I’m currently working on. My background is one of just getting things done, I do things as quickly as possible and then move onto the next item on the list. This occasionally gets me into trouble as I overtax MY resources. Not only this but pushing to hard also causes my colleagues issues.&lt;/p&gt;

&lt;p&gt;At the end of the day you can only get so much done, feeling stressed all the time because you’re pushing to hard doesn’t necessarily help you get things done faster it just burns you out. So yeah, make sure that there are sufficient resources allocated to a project if you have to meet a given deadline, and if there isn’t then its important to talk to the client and make sure more resources are allocated.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The pain that is VS 2008</title>
   <link href="http://vertis.github.com/2008/09/22/the-pain-that-is-vs-2008.html"/>
   <updated>2008-09-22T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/09/22/the-pain-that-is-vs-2008</id>
   <content type="html">&lt;p&gt;I’m very fond of Eclipse. Sadly the code I’m working on at the moment is mostly C# .net (with at tiny bit of VB), that means I have to adapt to working with Visual Studio. Visual Studio has come a long way since I last used it but I still miss the power that you take for granted when you use eclipse. So I was wondering whether anyone had experimented with the couple of C# plugins for eclipse with anything more than hello world applications.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>EtsyTools</title>
   <link href="http://vertis.github.com/2008/09/20/etsytools.html"/>
   <updated>2008-09-20T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/09/20/etsytools</id>
   <content type="html">&lt;p&gt;I’ve been doing quite a bit of work to get some tools for etsy back online. The original ‘etsytools’ was forced to close after my girlfriend recieved death threats, not that they could be taken seriously, but it still put a black cloud above an effort that was primarily designed to benefit etsyians. Enough time has passed that I now feel comfortable reviving the site. It won’t come back in the same form, if anything I’ve spent the last six months building tools that will be far more useful than anything I previouslyoffered. As soon as there is a moment to spare from my day job (which keeps me pretty damn busy), I’ll polish off the last of the tasks required to get it ready for use.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Apple iPhone Dev</title>
   <link href="http://vertis.github.com/2008/09/20/apple-iphone-dev.html"/>
   <updated>2008-09-20T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/09/20/apple-iphone-dev</id>
   <content type="html">&lt;p&gt;It&#39;s rather expensive to get into iPhone development. For a start you need Mac OS X 10.5 and therefore a Mac to do development. It doesn&#39;t surprise me that Apple on
ly offers the SDK for OS X, but it is a bit disappointing. Its for reasons like this that I can&#39;t wait to see the proliferation of open hardware.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Internet Limbo</title>
   <link href="http://vertis.github.com/2008/08/18/internet-limbo.html"/>
   <updated>2008-08-18T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/08/18/internet-limbo</id>
   <content type="html">&lt;p&gt;I&#39;ve been having a nasty time with my internet of late. To start things off my &lt;a href=&quot;http://www.unwired.com.au/get/&quot;&gt;Unwired&lt;/a&gt; Wireless Router decided to die a couple of months out of warranty. Unwired has been really useful when I didn&#39;t have a permanent address, I&#39;ve been in serviced apartments for the last year or so. However its relatively slow and has only a small download quota even on the top plan. Definately time to get a nice fast ADSL2+ connection now that I have a permanent address. I began drooling over &lt;a href=&quot;http://www.tpg.com.au/products_services/adsl2plus_pricing.php&quot;&gt;TPG&#39;s 150Gb&lt;/a&gt; download limit. I know a lot of its off-peak but thats fine by me, I&#39;m happy to schedule downloads for the wee hours of the morning.&lt;/p&gt;
&lt;p&gt;Obviously the first step to getting ADSL2+ would be getting the home phone connected. I know there are &lt;a href=&quot;http://en.wikipedia.org/wiki/Naked_DSL&quot;&gt;Naked DSL&lt;/a&gt; plans available, and if I&#39;d taken one of them instead of going after TPGs monster downloads for minimum cost option I wouldn&#39;t be writing this post. Naked DSL has it&#39;s benefits, but the plans are more expensive and they take longer to get connected. Picking fairly randomly I chose Optus, which as it turns out was a poor roll of the dice. They took 2 weeks or more to get the phone connected (it was finally done today), and afterwards I go to TPGs website and put in my shiny new phone number.&lt;/p&gt;
      &lt;p&gt;Incorrect.&lt;/p&gt;
      &lt;p&gt;&lt;b&gt;I&#39;m sorry?&lt;/b&gt;&lt;/p&gt;
      &lt;p&gt;Incompatible.&lt;/p&gt;
      &lt;p&gt;&lt;b&gt;Why?&lt;/b&gt;&lt;/p&gt;
      &lt;p&gt;Well because optus services that exchange itself and doesn&#39;t share its DSLAMs.&lt;/p&gt;
      &lt;p&gt;I hop on the phone to Optus. After getting through the friendly computer, I talk to a consultant. She transfers me to the right department. I explain the problem. She proceeds to test my line, not failing to mention that Optus has Internet plans (3 or 4 times), I explain to her that Optus doesn&#39;t have plans with enough quota. You can refer tomy naked DSL cost comment above at this time and realise that I made the mistake of assuming that I could have the best of both worlds, cost and quota. Realistically I don&#39;t care about the cost, if Optus offered the same level of quotas that most of the other broadband providers offered (50Gb - 150Gb) then I&#39;d just hack the extra cost and get on with my day.&lt;/p&gt;
      &lt;p&gt;They don&#39;t however. 30Gb is their biggest plan, and not only is it puny compared to &lt;a href=&quot;http://www.iinet.net.au/products/broadband/plans.html&quot;&gt;iiNet&lt;/a&gt;/&lt;a href=&quot;http://www.internode.on.net/residential/internet/home_adsl/extreme/pricing/&quot;&gt;Internode&lt;/a&gt;/&lt;a href=&quot;http://www.tpg.com.au/products_services/adsl2plus_pricing.php&quot;&gt;TPG&lt;/a&gt; (and i&#39;m not even talking Naked DSL), but it costs more. Additionally the consultant informs me that since the connection report hasn&#39;t been filed I should wait till tomorrow to disconnect the phone.&lt;/p&gt;
      &lt;p&gt;&lt;b&gt;*Sigh*&lt;/b&gt;&lt;/p&gt;
      &lt;p&gt;All this time I&#39;ve been in internet limbo, and its beginning to wear on me. Going down the road to check my email, etc. The solution for me at this point is to signup for a new naked DSL connection with Internode and just leave the Optus home phone as it is until I can confirm that I have the naked DSL. There is thankfully 2 lines going into my apartment though whether the second line works or not is another matter entirely.&lt;/p&gt;
      &lt;p&gt;I&#39;m still in internet limbo till the 9th of September, unless of course Internode can somehow fast track my installation. Top lesson of the day though, naked DSL is theway to go. No line rental. No incompatibilites. No phone contract to get out of.&lt;/p&gt;
      &lt;p&gt;Hopefully someone at Optus will read this. I&#39;m happy to use them as a broadband service provider &lt;b&gt;*if*&lt;/b&gt; they can compete, and &lt;b&gt;*if*&lt;/b&gt; they realise that people want massive download quotas.&lt;/p&gt;
      &lt;p&gt;24Mbps/150Gb Today, 100Mbps/1Tb tomorrow. I live in hope.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A little SQL injection to make the weekend more interesting.</title>
   <link href="http://vertis.github.com/2008/06/21/a-little-sql-injection-to-make-the-weekend-more-interesting.html"/>
   <updated>2008-06-21T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/06/21/a-little-sql-injection-to-make-the-weekend-more-interesting</id>
   <content type="html">&lt;p&gt;I’ve been going along mostly unaware of the fact that the internet is currently experiencing a nasty spate of SQL injection attacks. These attacks are being used to infect visitors to otherwise harmless and friendly websites. They’re advanced and complicated attacks that a few years ago the world had never really experienced, thats not the case any more. It is an increasing reality that viruses and worms are no longer the province of bored uni students, but rather done by what can only be described as a technologically aware organised crime. The site I happened to run across the problem at, finally took the site offline and cleaned the fields that had been ‘infected’, and I would hope that they’ve also taken steps to solve the problem.&lt;/p&gt;

&lt;p&gt;I’m going to build some more information up on the technical aspects of this attack. So for the moment this is a place holder. I’ll be building up some more information over the next few days.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Passenger, Typo and Sqlite</title>
   <link href="http://vertis.github.com/2008/06/19/passenger-typo-and-sqlite.html"/>
   <updated>2008-06-19T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2008/06/19/passenger-typo-and-sqlite</id>
   <content type="html">&lt;p&gt;I upgraded my rails sites to use &lt;a href=&quot;http://www.modrails.org&quot;&gt;Passenger aka Mod Rails&lt;/a&gt; this week. I’d like to say its been all roses, but the truth is that my Typo blog would swear under oath that its not the case. I was quite happy with the out of box Typo + Sqlite combination, and that worked fine under mongrel. Not so under passenger, the website will work perfectly, but I won’t be able to get into the admin section. As you can see I managed to get it working, I switched the database to mysql and its been working fine ever since. I’ll get around to working out WHY it doesn’t work with sqlite at some point (and get around to extracting my lost blog posts).&lt;/p&gt;

&lt;p&gt;Other than that small hiccup I’ve been extremely impressed with Passenger. Its certainly a step forward as far a simple rails production hosting. I’m not saying that its time to throw mongrel out the window. But when it comes to trouble free hosting, mongrel is just not there. I want a solution where you can do a simple config and forget about the site. Managing multiple clusters for each of the various sites is something that makes it harder to whip up simple sites.&lt;/p&gt;

&lt;p&gt;Passenger allows the user to to configure an apache virtual host with a couple of rails specific parameters (more if you want to take advantage of somecool feature, or do abnormal things), and restart apache and you’re all up and good. Restarting your rails app can be accomplished by running ‘touch tmp/restart.txt’ in your rails root. You’ve then got a very simple solution that will allow you to host multiple sites without doing clustering.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Native Java with GCJ and SWT</title>
   <link href="http://vertis.github.com/2007/06/24/native-java-with-gcj-and-swt.html"/>
   <updated>2007-06-24T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2007/06/24/native-java-with-gcj-and-swt</id>
   <content type="html">&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The ability to compile Java to native code has existed for a while in the form of GCJ, though for the most part it has been overlooked due in part to the incomplete Swing/AWT implementation. Knowledge about how to use GCJ for native compilation is a bit vague. When you first start using GCJ as a real alternative to the Sun JDK it&amp;rsquo;s difficult to get an idea of exactly what GCJ is capable of doing.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;Getting GCJ&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;If you are a linux user most distributions come with GCJ as either preinstall or one that you can easily install with your favorite package manager. If you are using Windows then your best bet is to use the packages found that &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.thisiscool.com/gcc_mingw.htm&quot;&gt;http://www.thisiscool.com/gcc_mingw.htm&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Mohan Embar, the author of the ThisIsCool website has created several builds of the MingW GCJ that can be easily installed. Additionally he has built in SWT and SwingWT support to some of the builds. Keep in mind that shared builds, and the creation of &amp;lsquo;dll&amp;rsquo; files is not supported under the 4.x series of GCJ found on this page.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;For the remainder of this build we will be using the latest GCJ found on this page, which includes the eclipse merge branch from the GCC SVN, the best thing about this is that it gives support for Java 5 features.&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;Basic Native Compilation&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The first step is to create a basic &amp;lsquo;Hello World!&amp;rsquo; application, to demonstrate compiling an application.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;public&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;class&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; HelloWorld {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f9fbf;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;@param&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;args&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;public&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;static&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f0055;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;void&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; main(String[] args) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;// &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #7f9fbf;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;strong&gt;TODO&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #3f7f5f;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; Auto-generated method stub&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;System.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000c0;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;em&gt;out&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;.println(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: Courier New,serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Assuming you&amp;rsquo;ve added the gcc-ecj\bin\ folder to your path, you can then compile the application using the following command:&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Gcj &amp;ndash;o Hello.exe &amp;ndash;main=HelloWorld HelloWorld.java&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;You can then run the resulting EXE just as you would any other application.&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;Basic Windows Application&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;If you tried running this application from windows (and not from the command line) you wouldn&amp;rsquo;t have seen much, just a black window flashing up and then closing again. Let&amp;rsquo;s do a basic Windows application so that you can begin making your masterpiece. This is accomplished using SWT. We will start by creating a &amp;lsquo;HelloWindows.java&amp;rsquo; file. You can view the source with Listing 1&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;[gist id=803916]&lt;/p&gt;
&lt;p&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;/p&gt;
&lt;pre style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Monaco, &#39;Courier New&#39;, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, monospace; &quot;&gt;&lt;/pre&gt;
&lt;div class=&quot;line&quot; id=&quot;LC1&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; &quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Monaco, &#39;Courier New&#39;, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, monospace; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 16px;&quot;&gt;import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class HelloWorld {
  public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);

    shell.setText(&amp;quot;Hello, world!&amp;quot;);

    shell.open();
    // Set up the event loop.
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        // If no more entries in the event queue
        display.sleep();
      }
    }
    display.dispose();
  }
}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;[/gist]&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;We will then compile the source in two steps.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;gcj --classpath .; lib\swt.jar -c -o HelloWindow.o&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;This creates a object file that can be used in the next step to create a working java application.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;gcj --main=HelloWindows -mwindows -o HelloWindows.exe HelloWindow.o lib\swt.a&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;You will still need the DLL files that came packaged with thisiscool gcj in order to run the application but it should create a small windows with &amp;lsquo;Hello Windows&amp;rsquo; in the title bar; not very exciting I will admit, but it demonstrates a working windows application.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Notes about this step:&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The &amp;lsquo;swt.jar&amp;rsquo;, &amp;lsquo;swt.a&amp;rsquo; and &amp;lsquo;swt*.dll&amp;rsquo; files can be found as a part of the thisiscool download, you either need to move them into the same directory as your project or provide a full directory in the adequate place. The dll files should be placed in the same directory as the build .exe file.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;More Complex Projects and Libraries&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;One of the things you may not know is that GCJ can not only work from source files, but also from class and jar files. This is particularly useful if you want to do more complex projects that use existing libraries such as the db4o-6.0-java5.jar file gotten from &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.db4o.com/&quot;&gt;http://www.db4o.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;First create the object file, using the command:&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;gcj -c db4o-6.1-java5.jar&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;This creates a file, db4o-6.0-java5.o; we then use &amp;lsquo;ar&amp;rsquo; tool to create a static library:&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;ar -r libdb4o.a db4o-6.1-java5.o&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;This library file can then be combined into our future projects much the same way as jar files are used in current java projects.&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;Using Our Shared Library&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Not to put the work to waste lets compile a project using the DB4o library that we created in the last part. The source code is too long to paste into the body of the article so I&amp;rsquo;ve included it in a zip folder so that you can try it later. Let&amp;rsquo;s start by compiling the source to object files as before:&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;gcj -classpath .;lib\db4o-6.1-java5.jar;lib/swt.jar -c HelloDb4o.java Account.java&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Then we take the library we created before and combine it with the main project (also adding the SWT library):&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;gcj -o hellodb4o.exe -mwindows --main=HelloDb4o HelloDb4o.o Account.o lib\libdb4o.a lib\libswt.a&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;You now have an application that will display the record from the database.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;Final Notes&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Size is often one of the pet complaints when people compile using GCJ, I would encourage people to check out UPX (&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://upx.sourceforge.net/&quot;&gt;http://upx.sourceforge.net/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;).&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The source listings here in were done quite hurriedly; particularly the last application would need a good deal of work before it was functional in a useful way. DB4o is a topic for several books, I strongly encourage you to take it out for a test drive.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;In order to catch bugs it is in the interest of the developer to remove the &amp;lsquo;-mwindows&amp;rsquo; option from the final build. This causes a command line window to be created behind the main screen to which printed exceptions are sent. Alternately and perhaps more correctly logging to file could be implemented.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Finally, it is possible to use Ant and other build tools to make building projects easier, you will find details in the resources on how to accomplish this. For the purposes of explanation I have chosen NOT to use these tools in this article.&lt;/p&gt;
&lt;h2 class=&quot;western&quot;&gt;Resources&lt;/h2&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The following were useful guides/tools as I was getting started with GCJ Native Development.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Create native, cross-platform GUI applications - &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/library/j-nativegui/&quot;&gt;http://www.ibm.com/developerworks/library/j-nativegui/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Create native, cross-platform GUI applications, revisited - &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/java/library/j-nativegui2/&quot;&gt;http://www.ibm.com/developerworks/java/library/j-nativegui2/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;How to compile Java application to native code, for example to Windows EXE file - &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://robohobby.s41.eatj.com/java_to_native_code_exe.jsp&quot;&gt;http://robohobby.s41.eatj.com/java_to_native_code_exe.jsp&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;DB4o Object Oriented Database - &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.db4o.com/&quot;&gt;http://www.db4o.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The Ultimate Packer for Executables - &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://upx.sourceforge.net/&quot;&gt;http://upx.sourceforge.net/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;ThisIsCool GCJ - &lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;span lang=&quot;zxx&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.thisiscool.com/gcc_mingw.htm&quot;&gt;http://www.thisiscool.com/gcc_mingw.htm&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Secure Your Java Source Code</title>
   <link href="http://vertis.github.com/2007/04/19/secure-your-java-source-code.html"/>
   <updated>2007-04-19T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2007/04/19/secure-your-java-source-code</id>
   <content type="html">&lt;!--       --&gt;

&lt;p&gt;I want to quickly run you through the pitfalls of using java as a programming language when it comes to the security of your proprietary source code. One of the problems with Java is the relative ease with which you can reverse engineer the source code. In fact there are numerous tools out there which will very simply and quickly take your project and turn it into a VERY readable document. For the purpose of instruction we will first decompile the example project, comparing the original source with what comes out the other end.&lt;/p&gt;

&lt;p&gt;We will repeat this process (if possible with the techniques that can be used to protect your source code).&lt;/p&gt;
&lt;h2&gt;The Jad Decompiler + Front End Plus&lt;/h2&gt;
&lt;p&gt;As mentioned above there are plenty of available decompilers, however JAD is a free and open source alternative that is perhaps the most popular option out there. Coupled with Front End Plus, a GUI that is designed to use JAD, you can very easily open and decompile the Java source.&lt;/p&gt;

&lt;p&gt;This is a decompile of my own Arms Conversion program, as you can see, while you may have to do a little work if you wished this code to recompile, the intent of can be seen very clearly.&lt;/p&gt;
&lt;h2&gt;&lt;em&gt;Obfuscation&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Obfuscating the source code is one method that is often used to protect Java code. It refers to deliberately making the code harder to read. Rather than a cracker getting back a function called &lt;em&gt;IDoSomethingCool (String name)&lt;/em&gt; … they instead might get something back like &lt;em&gt;dadaba3 (String adabc9989).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This doesn’t stop the cracker from reading the code, nor from it working if they chose to recompile it. However it does make it MUCH more difficult to determine the intent of the code. Are the naming conventions that programmers use to determine what information is being stored/parsed/manipulated&lt;/p&gt;

&lt;p&gt;I should be clear that this is far from a full proof solution. With time and dedication it is still possible to rebuild the original intent. However Obfuscation is a big step towards making it a waste of time (it may cost less to just write the application from scratch).&lt;/p&gt;

&lt;p&gt;There are plenty of tools available that can be used to obfuscate the code.&lt;/p&gt;
&lt;h2&gt;Native Compilation&lt;/h2&gt;
&lt;p&gt;By far the best option for protecting the source code is the ability to natively compile the application. While there are potential issues to be addressed in order to implement native compilation it has the benefit of making the reverse engineering infinitely more difficult.&lt;/p&gt;

&lt;p&gt;While NO application is truly immune to reverse engineering, going from compiled code back to useable source code requires a very specialized ability, and a depth of knowledge about computer programmers that is possessed by few.&lt;/p&gt;

&lt;p&gt;Native code compilation is discussed in more detail in another document, which deals with additional features that are available, and also the potential problems with natively compiling your applications.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The 0th law of security</title>
   <link href="http://vertis.github.com/2006/01/30/the-0th-law-of-security.html"/>
   <updated>2006-01-30T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2006/01/30/the-0th-law-of-security</id>
   <content type="html">&lt;p&gt;There are supposedly 10 laws of security. Laws that are a firm basis for understanding computer security. They’re obviously not the be all and end all of computing security, but for beginners and those that aren’t going to focus on security they’re an important start.&lt;/p&gt;
&lt;h3&gt;The Ten Immutable Laws of Security&lt;/h3&gt;
&lt;p&gt;Microsoft’s Security Response Center Manager, Scott Culp, as a part of his job produced a list He calls “The Ten Immutable Laws of Security.”&lt;/p&gt;

&lt;p&gt;They are:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;If   a bad guy can persuade you to run his program on your computer, it&#39;s   not your computer anymore.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;If   a bad guy can alter the operating system on your computer, it&#39;s   not your computer anymore.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;If   a bad guy has unrestricted physical access to your computer, it&#39;s   not your computer anymore.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;If   you allow a bad guy to upload programs to your Web site, it&#39;s not   your Web site any more.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Weak   passwords trump strong security.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A   machine is only as secure as the administrator is trustworthy.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Encrypted   data is only as secure as the decryption key.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;An   out-of-date virus scanner is only marginally better than no virus   scanner at all.&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Absolute   anonymity isn&#39;t practical, in real life or on the Web&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Technology   is not a panacea.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Even without further explanation (which is available from &lt;a href=&quot;http://www.microsoft.com/technet/columns/security/10imlaws.asp&quot;&gt;here&lt;/a&gt;) it is a fairly straight forward and common sense list of laws.&lt;/p&gt;
&lt;h3&gt;Law 0&lt;/h3&gt;
&lt;p&gt;The fact is that these laws don’t go far enough towards describing the problems that are faced by everyday users on the internet. Security people often forget that its not just big companies that are the target of attacks; they may indeed be the target of more personalized attacks&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;If   you can&#39;t read the source code for your operating system (and applications) then it&#39;s not your computer anymore.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I hate being the open source advocate, but the fact remains that if you and the community can’t get into the source code for auditing and patching purposes then its not your computer its Microsoft’s. You are essentially relying on their good will and the competency of their programmers to protect you against any flaws in the operating system that may let attackers in.&lt;/p&gt;

&lt;p&gt;Microsoft has in the recent past finally hopped on the security band wagon, they’re better than they used to be, but its still them against the world, and in practical terms this makes for an impossible situation. The odds are that one of the millions of hackers is going to find it before Microsoft does. Even with their ability to look at the source code they’re still vastly outnumbered.&lt;/p&gt;
&lt;h3&gt;Open Source&lt;/h3&gt;
&lt;p&gt;Open Source is not a complete solution to this problem, but its better. The millions of security researchers out there, the developer community and the general public all get the chance to look for flaws in the code. Immediately once it’s discovered a patch is written for it. Unlike a situation where you have to wait for a company to release a patch, you have the ability to patch the problem yourself, its not you against the world though. It’s you and every other technically competent person that uses that particular software against the world.&lt;br /&gt;
Yes, hackers have the same opportunity of finding the flaws. But the playing field is more level. Even if they do find a flaw, chances are that it’ll be patched much more quickly than if millions of eyes weren’t looking at the source code.&lt;/p&gt;
&lt;h3&gt;Open Source vs. the Other Ten&lt;/h3&gt;
&lt;p&gt;When you look at open source as a solution to the problem above; it puts them in a whole new light. Let’s start with No. 7, not because of the fact that it’s a good number, more the fact that it has long been the belief of the scientific community that closed encryption algorithms are useless.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Encrypted   data is only as secure as the decryption key.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While this deals with the key that is used to encrypt the data I would go further and say, that encrypted data is only as secure as the &lt;em&gt;&lt;strong&gt;Algorithm &lt;/strong&gt;&lt;/em&gt; and Key that is used to encrypt the data. It doesn’t take genius to work out that even if I encrypt my information using my own proprietary method that doesn’t mean that it’s safe. Unless someone else can test my encryption method, and try and break it, I have no way of knowing whether my information is protected by the encryption; because, I have no way of knowing whether my encryption algorithm is sound, or whether there are fatal flaws in my design.&lt;br /&gt;
History is littered with examples of this, and if you look closely at companies like RSA you will notice that they post challenges, trying to get people to break their encryption.More importantly if you can’t look at the encryption algorithm and analyse it for yourself, how are you to know that the creator hasn’t put in a backdoor for themselves, or governments to use.&lt;/p&gt;
&lt;h3&gt;Watching the Watchers &lt;strong&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;blockquote&gt;&lt;strong&gt;An   out-of-date virus scanner is only marginally better than no virus   scanner at all.&lt;/strong&gt;&lt;/blockquote&gt;
&lt;ol&gt;&lt;/ol&gt;
&lt;p&gt;Nearly everyone that I know, knows to use a virus scanner now, its slightly harder getting them to workout Spyware and AntiSpyware programs, but here’s the twist, if you can’t look at the internals of the anti virus, how do you know that its doing an adequate job of protecting you.&lt;br /&gt;
I’m not trying to say you should be using Linux because of the fact that it is less prone to viruses, the fact is that most viruses are written for windows, and if everyone switched to Linux, then those same people would target Linux. It remains to be seen how well Linux would respond to this kind of problem.&lt;br /&gt;
What I am saying is the applications that you pay good money for, you subscribe to a service by Symantec or McAfee, and you really have no idea how well you are being protected. The same goes for firewalls, and any other piece of security software that you use to protect your computer. If you can’t look at the internals then you have no idea what the application is really doing.&lt;br /&gt;
You can apply this same principal to at least some of the other laws, and in truth it serves to cement the 0&lt;sup&gt;th&lt;/sup&gt; law in place.&lt;/p&gt;
&lt;h3&gt;Regarding Patches&lt;/h3&gt;
&lt;p&gt;It is not often that I have the chance to talk about security, but one of the things that occurred to me in my day to day work is the fact that Microsoft’s move to allow only ‘Genuine’ users to download patches and applications, most notably SP2 and Microsoft AntiSpyware, was a foolish one.&lt;br /&gt;
Regardless, of the fact that most if not all of my clients have legal copies of Windows, it is rare that they keep them patched and up to date (I tend to fix this), but it leads me to believe that there is a large number of legal windows users out there that don’t patch their computers properly.&lt;br /&gt;
Now, it’s not overly smart of them, but the fact of the matter is that denying patches and other downloads to ‘non genuine’ users, ends up negatively affecting even those with legal copies in a round about way; look at it like this:&lt;br /&gt;
&lt;strong&gt;the greater the number of unpatched computers on a given network, the more chance that a bad guy/worm will get in.”&lt;/strong&gt;&lt;br /&gt;
This is easy to apply, but what is more important is that it takes into account not just small local networks, but the internet as well. The more unpatched computers that remain on the internet, the more chance that the bad guy will get control of them; and the more computers that are either part of botnets, or infected by viruses the easier it is for it to spread, or the attacker to use the given host as a base for another attack.&lt;/p&gt;
&lt;h3&gt;A Note on Piracy&lt;/h3&gt;
&lt;p&gt;I’m not in anyway condoning &amp;amp; supporting piracy, but there comes a point when you need to accept that a problem isn’t going to be solved and make smart moves. Becoming tight and vindictive about piracy only makes the given company &lt;em&gt;cough&lt;/em&gt;Sony&lt;em&gt;cough&lt;/em&gt; look bad.&lt;br /&gt;
Locking your legitimate users out is bad methodology, and putting so many ‘copy protection’ methods into a given technology that it negatively affects it is not healthy either. Security is important, but it needs to protect the interests of the user not the interests of the greedy Mega Corporation.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Why Open Source is fundamentally flawed...</title>
   <link href="http://vertis.github.com/2005/12/27/why-open-source-is-fundamentally-flawed.html"/>
   <updated>2005-12-27T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2005/12/27/why-open-source-is-fundamentally-flawed</id>
   <content type="html">&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I&#39;m a huge supporter of the open source movement. It&#39;s the best thing to come along since sliced bread. Many of the tools that I rely on to do my day to day work would not exist if it wasn&#39;t for the struggles of the open source movement. This doesn&#39;t change the fact that I feel the open source movement is flawed in more than one way; its battle is made more difficult by its very nature.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;Enforcing the GPL&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Regardless of the good intentions of the GPL there is really no way of forcing companies to abide by it. For example, Company A decides that they want to write a application, they first take a look at sourceforge.net and search for all the various applications that are available in the given category. Company A being lazy decides that its easier to extend Sourceforge Application B than write their own from scratch.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;You may well say that even if Company A does this it will be apparent to anyone with &#39;know how&#39; of decompiling/disassembling. This may well be true, but there are ways and means of getting around these particular problems as well. The same technologies that are used to protect compiled code against reverse engineers can be used to throw open source watchdogs off the trail.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Company A has just benefited from someone else&#39;s work, and proceeds to make a handsome profit selling their new product. The open source movement can rant and rave and even try and out market (unlikely without a budget), but at the end of the day they have no proof.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Handing out the source code, regardless of what license it is under is the equivalent of giving away the keys to the kingdom. Licenses have proven time and again that they don&#39;t work, and the p2p piracy that is so deeply dug into the internet now is the perfect example of license failure. Even more so the source code for an application, while it is possible to protect a compiled application using anti piracy technology, no such method can be employed to protect the source code of an application.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;Development Model&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The open source development model has its benefits; one of the biggest arguments that Open Source Movement will throw at you is the fact that allowing open contribution enables projects to evolve at a much quicker rate. What I see is a lot of half finished projects, frustratingly close to complete and treading water for lack of developers. The major projects that are going forward are being driven both by larger organizations, and even companies that have an interest in utilizing said open source project for their own purposes. This is compounded by the fact that rather than getting together with a previous project developer to create a truly powerful tool, quite often a developer will start their own project from scratch and duplicate work that has previously been done.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;To be fair the Open Source Movement has had some tremendous successes, that doesn&#39;t change the fact that it&#39;s flawed, it just means that some of the better developers are able to wade through the weaknesses and produce some world classes tools regardless.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;The Misunderstanding of Open Source&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Plenty of people flock to the open source movement under the mistaken impression that its free. Hell my first steps into the land of open source were made under this deep-seated misinterpretation, everybody is looking for something for nothing&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Thoughts on Java</title>
   <link href="http://vertis.github.com/2005/12/20/thoughts-on-java.html"/>
   <updated>2005-12-20T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2005/12/20/thoughts-on-java</id>
   <content type="html">&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Recently I&#39;ve been doing quite a bit of development in Java. Of the many languages that I&#39;ve played with and used I find Java to be one of the most functional programming languages out there. There are plenty of factors that have helped me choose Java as my primary programming language, and while I&#39;m not under the illusion that java is the &#39;monkey wrench&#39; of the programming world, its still an invaluable tool.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I&#39;ve been around programming languages for the last 6 - 7 years, in that time a lot has changed. The software industry has matured in its approach to programming, and the fundamental building blocks that make up the software industry have matured as well. Gone is the time when you needed a PhD to understand the complexities of computer programming. This is not an article about the many different languages; this is not even an article about how Java is better than &#39;x&#39; language. This is simply an article about the features of Java that slipped it into my toolkit.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;Native Graphics Support&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The first thing that usually pops into mind when you want to convince someone about the superiority of java, is the fact that it&#39;s a compile once run anywhere language. Honestly though I find this less useful than you might think. What I do find useful is the fact that with very little research you can write a graphical user interface for an application. I find the graphics support for Java to be logical, where so many other graphics libraries are not. While I&#39;m not overly fond of the layout managers that Java provides, I can appreciate the fact that they&#39;re there if I do ever find a use for them.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Excellent Database Support&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;This was one of my primary reasons for moving to java in the first place. If you&#39;ve ever tried to get MySQL working with (Visual) C# then you&#39;ll know what I&#39;m talking about. The JDBC makes connecting to whatever database a dream, if your program is well written you can even switch database backend without to much trouble.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Eclipse IDE&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;If you haven&#39;t tried Eclipse then you don&#39;t know what your missing out on. While its certainly not solely dedicated to Java it&#39;s a very flexible and well designed tool that will help you get your work done. In addition to being a useful portal to the Java language, it is also a driving force in making Java into more than just the pet project of Sun Microsystems. Take a look at SWT, which was originally developed by IBM and is distributed as a part of eclipse and you will begin to understand.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Lack of Deployment Options&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;This is one of the fundamental failings of a lot of programming languages. Running a java program relies on the operating system already having a copy of the Java Runtime Environment (JRE) installed. If its not then you won&#39;t be able to do squat, additionally there is no way of knowing whether the version of Java that you&#39;re programming in, and that has the features you want is installed on the client.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;You fall back into the same rut that the old VB programs had with missing DLL files. There is no simple way of installing both Java and the given Application in one easy step. Additionally you are held hostage by the fact that you require certain environment variables to be set correctly for the java program to run (JAVA_HOME, CLASSPATH). This is all well and good but it&#39;s just more overhead for the programmer to worry about when they need to do a large scale deployment of an application that they&#39;ve developed.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;GCJ bridging the gap&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;One of the baseline flaws with Java is the fact that it is interpreted (from bytecode) at runtime, and as such relies on the JVM. More importantly it means that it runs slower on CPU intensive processes like md5 hashing for example. GCJ is the GNU Toolkit&#39;s answer to the fact that Java is not open source. It is in effect a complete replacement for Sun Java. More importantly it provides support for compiling Java directly as an Executable freeing it from the reliance on the JVM.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The speeds generated when running is GREATLY improved, to close GCC/G++ levels, and more importantly the deployment is less of an issue. You do lose the fundamental portability that is gained with Java classes, but there is no reason you can&#39;t provide the class files and just install GCJ (rather than Java) to allow the class files to be converted into executables.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;THE only place where GCJ is still lacking is the area of AWT/Swing; the developers are still working on adding the support necessary to support the windowing toolkits. Incidentally they are looking for help in this area if any of you programming gurus want to give up your spare time.&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The bottom line with Java is that it is a functional and practical language. The fact that Sun is still holding the reins is regrettable because it&#39;s inhibiting a language with otherwise HUGE potential from maturing. The compile once, run anywhere is less useful than &#39;write once / compile (&amp;amp; run) anywhere&#39; this subtle difference is where Sun missed the boat. The matter of compiling different copies for different operating systems is trivial when you consider the fact that doing it the way they are cripples the speed of the language.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Other than that Java is a great choice because it&#39;s a language that&#39;s flexible enough to be used on plenty of different operating systems. You do lose a certain amount of control over the low level functions; however this particular beef has been adequately dealt with in the form of JNI.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>And Ubuntu changes the game.</title>
   <link href="http://vertis.github.com/2005/12/12/and-ubuntu-changes-the-game.html"/>
   <updated>2005-12-12T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2005/12/12/and-ubuntu-changes-the-game</id>
   <content type="html">&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I&#39;ve had problems with desktop Linux in the past. While I openly promote Linux in the use of servers and the like, my attempts to promote it as an alternative to Windows XP have gotten me burnt. Users who can barely grasp the fundamentals of computing are ill equipped to be thrown into the deep end.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Even I find it hard to commit to using linux as my primary operating system. The majority of my clients use Windows, and compatibility issues have killed me in the past. All this had bred in me a belief that Linux while it was a great tool for the computer geeks of the world, it was never going to cut it as an everyday tool for the masses. I could not have been more wrong.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Not long ago a friend suggested that I take a look at &#39;Ubuntu&#39;. I hadn&#39;t missed its appearance on the now glutted Distro scene, I&#39;d simply written it off as another wannabe. Ubuntu is forging new roads, making steps towards that holy grail of operating systemish glory; conquering the desktop. I didn&#39;t know this, so it took a while and a lot of kicking Fedora (and Debian) before I finally downloaded the ISO.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I&#39;ve found my laptop to be a very good tool for testing the various operating systems and distros. Even Fedora in all its hype fell short of the mark, it took me several recompiles and a couple of double back flips to get both my sound and wireless cards working.&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;The Installation&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Having downloaded the 5.10 (Breezy Badger) ISO, and burned it to CD, I slapped in one of the spare 20GB laptop hard drives I have sitting around and booted from the CD. The Installer is the first place you will recognize the similarity to Debian, I use the word loosely because while it is clearly derived from the Debian installer, it doesn&#39;t overload the user with options you may, or more likely, may not understand.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The installation is mostly automated, only stopping a couple of times to ask for vital details. The complexity of the install process falls very close to that of windows, and while Fedora may have a flashier interface, it also gives more options. In some respects, particularly when dealing with inexperienced users overwhelming options can be a bad thing.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;So far so good; the installation flies along at a nice pace and I&#39;m left looking at a VERY brown login screen.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;First Impressions&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Entering the username and password that I setup during the installation process presents me with a fairly standard Gnome interface. Perhaps my only beef with the distro is this standard interface. I&#39;ll make no secret that I don&#39;t like my menus up the top. I used a Mac for years when I was younger, and if there is one thing I like about Windows its the menu at the bottom.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;This is supposed to be be geared at newer users, people that have used Windows will expect the Menus and the like to be in a certain location. It is easily remedied (for someone who knows what their doing), but I would have liked to see this done better.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The applications menu, once I&#39;ve gotten over my distaste at having to move my mouse to the top left hand corner is a pleasant surprise. It is well organized and contains only a minimum of programs that form what I would consider the star performers of the open source movement. More importantly it includes a simple method of installing/uninstalling applications just in case.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;Hardware&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Now Linux is great on stock hardware; server hardware. But when I&#39;ve tried putting Linux, both Fedora and Debian, on my D800 Laptop, I had severe trouble getting the sound and wireless working. If I have to recompile the kernel that&#39;s an instant failing grade in the hardware department. I like recompiling the kernel, seeing if I can squeeze a little extra performance from my machine...my computer illiterate windows friends just look at me strangely when I say the word &#39;recompiling&#39; and lets not even talk about &#39;kernels&#39;.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;To my shock and amazement, my sheer delight. Both the sound and the wireless card (Intel 2915ABG) work by default. I can even press the volume buttons on my laptop and see the volume bar come up on the screen. VERY COOL.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I get instant support for my USB Hard Disk, although I can&#39;t write to it (NTFS). When I do manage to track down a disk with FAT32 I can write to it as well, BY DEFAULT from a non root account. If you haven&#39;t noticed I put a lot of stock in the &#39;by default&#39; ability.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;On the downside my internal dialup modem doesn&#39;t work, this would not be a problem usually in the day of broadband. However having just moved I find myself reduced to dial up. Slotting in a spare PCMCIA card solves the problem.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Another annoying factor during boot is the fact that it sits trying to DHCP the interface(s) even though one or both of them are not plugged in. It slows the boot down, which is a pity, perhaps in future releases they&#39;ll address this issue.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;

&lt;h3 style=&quot;margin-bottom: 0cm;&quot;&gt;Conclusions&lt;/h3&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Ubuntu  has two other flaws that I could pick; It doesn&#39;t install a MP3 Compatible music client by default, and the games installed by default lack consistency and are essentially, people really do play the stupid games provided, so WHERE is my Solitaire clone.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I am thrilled with the &#39;Out of Box&#39; experience that Ubuntu has shown. There are tools, and applications that I would probably use that have not been installed, but then again I&#39;m not your garden variety computer user either.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;While there are things that this distro could do better, partially this is taste over necessity (Brown). Overall I would give a 8/10 to Ubuntu as a Desktop Operating System. Of all the things I should thank Ubuntu for; it&#39;s  my restored  faith in Linux, and its ability to become a viable desktop alternative.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Great Debate: Windows vs. Linux</title>
   <link href="http://vertis.github.com/2005/10/31/the-great-debate-windows-vs-linux.html"/>
   <updated>2005-10-31T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2005/10/31/the-great-debate-windows-vs-linux</id>
   <content type="html">&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;strong&gt;Round 1&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Everybody seems to be going nuts over the &#39;Open Source Movement&#39; at the moment; it&#39;s become very hip to cheat programmers out of a living. Linux is maturing nicely and with it comes a wave of wannabe revolutionaries. Yet for all Linux and the open source movement&#39;s glory, I&#39;m still primarily using a Windows PC. Sure I&#39;ll be the first to admit that I chuck in a Linux HD every so often and tinker around, but for the most part at the end of the day I find myself using Microsoft Windows XP.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Where Linux doesn&#39;t measure up&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Serious tools, for serious users. The open source movement has scored a couple of really useful and widespread tools, Apache being a perfect example, it has some excellent documentation, but on loading it up on my laptop I still have to deal with a number of issues that I wouldn&#39;t have to deal with under Windows. Lets see,&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;To get a decent video resolution I have to install the NVIDIA driver, which I also have to do under windows, but under linux it doesn&#39;t just compile, no I have to download the kernel source for the kernel that I&#39;m currently running. Eventually the driver will compile, once done I go looking for the config file, so that I can change &#39;nv&#39; to &#39;nvidia&#39; why it can&#39;t do it itself is anyone&#39;s guess, my windows driver installs with a minimum of fuss why can&#39;t my Linux one do likewise.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;Enter my wireless adaptor. Linux does support it, and I did eventually get it to work, but only after I recompiled my kernel a couple of times, doing the &lt;em&gt;Chumpeka&lt;/em&gt; mating dance, and praying for divine help; although not necessarily in that order. Functionally this is unacceptable, I&#39;m an advanced user (if I do say so myself), while they have certainly made compiling kernels easier in recent times, there is no way a beginner is going to be technically adept enough to configure the (Intel 2915ABG) wireless card under linux.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Enough with the hardware&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;The level of configuration tools varies widely between the different distros, regardless of which one you use, the end-user tools you are provided with come nowhere near measuring up to the control panel and administrative tools that are provided (and for the most part taken for granted) by Windows Users. All the important configuration options can be found in one place, and while not perfect they are a damn sight better than the level of configuration that is provided by any of the various Linux desktop environments.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;I&#39;m not talking command line tools, nobody but nobody is going to argue which operating system has a superior command line, but the majority of plebs out there run into trouble remembering passwords, let alone a myriad of arcane commands and arguments.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;&lt;strong&gt;Slack Programmers&lt;/strong&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0cm;&quot;&gt;There is a fundamental problem with developing end-user applications &amp;amp; tools on your own time, and for little or no money. Where a traditional company has to maintain a level of professionalism, and develop programs that are well rounded, and well supported. The open source community has no such responsibility. While some of the bigger projects DO offer a level of professionalism, time and a again I find tools that are not quite polished enough to be considered &#39;good&#39;, the author has lost interest, and because of the fact that they didn&#39;t write the program well enough in the first place no one, will (or is stupid enough too) step into the breach.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Remote X11 Applications on Windows</title>
   <link href="http://vertis.github.com/2005/08/10/remote-x11-applications-on-windows.html"/>
   <updated>2005-08-10T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2005/08/10/remote-x11-applications-on-windows</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Update: There are now much better ways of installing an X Server on windows (for details start with the &lt;a href=&quot;http://xming.sourceforge.net&quot;&gt;XMing&lt;/a&gt; project&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;The primary focus of this document is setting up Cygwin on a given client computer so that it can see graphics as sent from the server. Most of the configuration is done at a client level, however there are minor modifications that also need to be made at a server level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing Cygwin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the uninitiated Cygwin is a free application, it can be installed on windows to simulate the Linux OS. Since our server runs on Linux this is a very good thing. You can start by getting the installer from &lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://www.cygwin.org/&quot;&gt;http://www.cygwin.org&lt;/a&gt;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Rather than duplicating an existing document, follow the install procedures found at this site:&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&lt;a href=&quot;http://x.cygwin.com/docs/ug/setup-cygwin-x-installing.html&quot;&gt;http://x.cygwin.com/docs/ug/setup-cygwin-x-installing.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuring Cygwin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The installation will take a while to download the packages depending on your connection speed and the server that you selected to download from. Once installed it is simply a matter of configuring Cygwin to take connections from remote hosts (it defaults to not allowing remote connections). This is file that you want to:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;C:\Cygwin\usr\X11R6\bin\startxwin.bat&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Right down the bottom of the file you will find the following lines:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;run XWin -multiwindow -clipboard -silent-dup-error&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;REM Startup an xterm, using bash as the shell.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;run xterm -e /usr/bin/bash -l&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Change it so that it looks like this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;run XWin -multiwindow -clipboard -silent-dup-error&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;run xhost +&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;REM Startup an xterm, using bash as the shell.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;REM run xterm -e /usr/bin/bash -l&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Adding the ‘run xhost +’ line tells it to allow any host to send graphics to your computer. Alternately you can specify an exact IP address after the plus to only allow that computer to send the graphics. Additionally you’ll want to put a ‘REM’ in front of the ‘run xterm’ line otherwise it will pop up a window every time you start it. Save the file and put a copy into your startup directory. If you double click it now you should see a little ‘X’ icon appear in the system tray at the bottom right of the screen. Your computer is now ready to receive images.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up the Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is possible that your server is already setup correctly, but we’ll need to check to make sure that it’s got the correct address when its trying to send the images out. You can check this from within Pinnacle, you should see in the top right hand corner an IP address, four numbers separated by dots(e.g. 192.168.0.25) if its there is a number there you can skip right on to testing the images from within pinnacle. If not I’ll need to edit some file. Give me a call&lt;/p&gt;

&lt;p&gt;That’s it. Hopefully you have been rewarded with some images. If not give us a call and we’ll work something out.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hackers: Don't Fear Them...Learn From Them</title>
   <link href="http://vertis.github.com/2004/06/08/hackers-don-t-fear-them-learn-from-them.html"/>
   <updated>2004-06-08T00:00:00+00:00</updated>
   <id>http://vertis.github.com/2004/06/08/hackers-don-t-fear-them-learn-from-them</id>
   <content type="html">&lt;p&gt;Without debating whether hackers are good, bad or simply a myth created by companies that need extra money, the common garden variety of hacker has a lot to share with those of us that are less computer literate. Hackers spend inordinate amounts of time delving into computers, and more to the point looking at computer security. Rather than fearing the hackers, we can take a page from their book, and focus a little on how to secure your computer.&lt;/p&gt;

&lt;h2 id=&quot;antivirus&quot;&gt;Antivirus&lt;/h2&gt;
&lt;p&gt;It sounds simple, and it is, but having a virus scanner on your computer is the first step towards securing it against intrusion. While not all viruses breach security,  there are plenty that do, sending documents from your computer to complete strangers, or simply reporting passwords. It’s a good enough reason to download an up-to-date virus scanner.&lt;/p&gt;

&lt;p&gt;Its important to note that for a virus scanner to be effective, it needs to be kept up to date.  If it hasn’t got the latest patterns/definitions then you might as well not have it at all. There are plenty of virus scanners out on the market, and the one you use is about preference, the URLs below should help you out:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.symantec.com&quot;&gt;http://www.symantec.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.trendmicro.com&quot;&gt;http://www.trendmicro.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.grisoft.com&quot;&gt;http://www.grisoft.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;spyware-removal-tools&quot;&gt;Spyware Removal Tools&lt;/h2&gt;
&lt;p&gt;One of the most annoying aspects of the internet today is Spyware/Adware. Not only do they cause the computer to stop functioning correctly, various types of spyware also funnily enough, spy on you computer usage. Removing them can be a stressful and time consuming effort, the links below are useful in removing spyware, and protecting your computer against further infection.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.safernetworking.com&quot;&gt;http://www.safernetworking.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.lavasoftusa.com&quot;&gt;http://www.lavasoftusa.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;firewalls&quot;&gt;Firewalls&lt;/h2&gt;
&lt;p&gt;Perhaps the most misunderstood piece of technology on the planet, the firewall is a piece of software that sits between you computer and the rest of the network, or in bigger setups, between the local network and internet. Firewalls work by stopping traffic coming into a given area, while still allowing traffic to go out.&lt;/p&gt;

&lt;p&gt;For the price of a cheap computer you can setup your very own linux firewall, around your network, customising it down to the finest details as to what you want to let in and out. It is an important step, but one that most people do not need.&lt;/p&gt;

&lt;p&gt;The links below are for firewall applications that can be installed on your computer and used to filter both incoming traffic, and outgoing traffic generated by applications. This will help prevent attackers from gaining access to your computer.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.agnitum.com&quot;&gt;http://www.agnitum.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.zonelabs.com&quot;&gt;http://www.zonelabs.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.tinysoftware.com&quot;&gt;http://www.tinysoftware.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.kerio.com/&quot;&gt;http://www.kerio.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.sygate.com&quot;&gt;http://www.sygate.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;encryption&quot;&gt;Encryption&lt;/h2&gt;
&lt;p&gt;Less used than even the firewall, encryption is where you encrpt files and text so you can securely pass it through the internet, without the risk of anyone snooping in on your information. There are many tools for encrypting information, perhaps the most well known is PGP or pretty good privacy, which can be used to encrypt both files on your computer and also emails that you send.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The above applications are not the end of your security efforts, to tell you the truth, they are only the beginning. Having a secure computer is about methodology, if you are consciously trying to secure your computer, then you will be aware when you do something that makes your computer less secure. There is not harm in being a little paranoid, and certainly no harm in protecting your assets against unwanted intrusion, on that issue, hackers have their stuff sorted out.&lt;/p&gt;
</content>
 </entry>
 

</feed>