<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ramblings &#187; Macs</title>
	<atom:link href="http://ramblings.gibberishcode.net/archives/category/systems/macs/feed" rel="self" type="application/rss+xml" />
	<link>http://ramblings.gibberishcode.net</link>
	<description>about fetching, interpreting, and executing.</description>
	<lastBuildDate>Sat, 01 May 2010 19:19:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>macports is not darwinports</title>
		<link>http://ramblings.gibberishcode.net/archives/macports-is-not-darwinports/35</link>
		<comments>http://ramblings.gibberishcode.net/archives/macports-is-not-darwinports/35#comments</comments>
		<pubDate>Tue, 23 Jun 2009 00:36:06 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Macs]]></category>
		<category><![CDATA[Setups]]></category>
		<category><![CDATA[Systems]]></category>
		<category><![CDATA[darwinports]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[macports]]></category>

		<guid isPermaLink="false">http://ramblings.gibberishcode.net/?p=35</guid>
		<description><![CDATA[For those of you who don&#8217;t keep a close eye on the macports system that provides you with convenient builds of popular open source software, let me put you on guard:  macports supplanted darwinports a few years back to avoid continued confusion over the name.
I was having a good bit of trouble getting ports [...]]]></description>
			<content:encoded><![CDATA[<p>For those of you who don&#8217;t keep a close eye on the macports system that provides you with convenient builds of popular open source software, let me put you on guard:  macports supplanted darwinports a few years back to <a href="http://trac.macports.org/wiki/DarwinPorts">avoid continued confusion</a> over the name.</p>
<p>I was having a good bit of trouble getting ports to install ImageMagick and have had trouble many other times getting ports to install things.  As such, I often fell back on fink or compiling and installing from source rather than figuring out the root causes of my macports problems.  </p>
<p>Macports was surprisingly easy to fix up and get fully operational again, and this was on a fairly old machine that I am pretty certain I started with &#8220;Darwin Ports&#8221; roughly 3.5 years ago.  </p>
<h2>First Thing&#8217;s First</h2>
<p>First, know that the official macports website is: <a href="http://macports.org">trac.macports.org</a>.  Be wary of anything &#8220;darwinports&#8221; as name is officially retired in favor of &#8220;macports.&#8221;
</p>
<h2>Trouble a-brewing</h2>
<p>It all started innocently enough.  I wanted to install ImageMagick on my mac.  I&#8217;ve been through installing ImageMagick on Linux and knew it was not going to be a cakewalk to install from source.  ImageMagick simply has too many dependencies to relish the thought of an install from source route.  So I googled and found <a href="">instructions for ports</a> and began:
</p>
<pre class="twilight">sudo port install tiff -macosx imagemagick +q8 +gs +wmf
Warning: Group file could not be located.
---<span class="Keyword">&gt;</span>  Activating tiff 3.8.2_3
Error: Target org.macports.activate returned: Image error: Another version of this port (tiff @3.8.2_2+darwin_9+macosx) is already active.
</pre>
<p>Oh, ok, lets remove the old one&#8230;</p>
<pre class="twilight">
sudo port uninstall tiff -macosx imagemagick +q8 +gs +wmf
---<span class="Keyword">&gt;</span>  The following versions of tiff are currently installed:
---<span class="Keyword">&gt;</span>  	tiff @3.8.2_2+darwin_9+macosx (active)
---<span class="Keyword">&gt;</span>  	tiff @3.8.2_3
Error: port uninstall failed: Registry error: Please specify the full version as recorded <span class="Keyword">in</span> the port registry.
[mwlang@macdoze shared] sudo port uninstall tiff @3.8.2_2+darwin_9+macosx
---<span class="Keyword">&gt;</span>  Unable to uninstall tiff 3.8.2_2+darwin_9+macosx, the following ports depend on it:
---<span class="Keyword">&gt;</span>  	gtk2
---<span class="Keyword">&gt;</span>  	lcms
---<span class="Keyword">&gt;</span>  	sane-backends
---<span class="Keyword">&gt;</span>  	xsane
Error: port uninstall failed: Please uninstall the ports that depend on tiff first.
[mwlang@macdoze shared] sudo port uninstall tiff @3.8.2_2+darwin_9+macosx gtk2 lcms sane-backends xsane
---<span class="Keyword">&gt;</span>  Unable to uninstall tiff 3.8.2_2+darwin_9+macosx, the following ports depend on it:
---<span class="Keyword">&gt;</span>  	gtk2
---<span class="Keyword">&gt;</span>  	lcms
---<span class="Keyword">&gt;</span>  	sane-backends
---<span class="Keyword">&gt;</span>  	xsane
Error: port uninstall failed: Please uninstall the ports that depend on tiff first.
[mwlang@macdoze shared] sudo port uninstall gtk2 lcms sane-backends xsane
---<span class="Keyword">&gt;</span>  Unable to uninstall gtk2 2.12.9_0+x11, the following ports depend on it:
---<span class="Keyword">&gt;</span>  	gconf
---<span class="Keyword">&gt;</span>  	gnome-keyring
---<span class="Keyword">&gt;</span>  	libglade2
---<span class="Keyword">&gt;</span>  	gail
---<span class="Keyword">&gt;</span>  	libgnomecanvas
---<span class="Keyword">&gt;</span>  	libbonoboui
---<span class="Keyword">&gt;</span>  	poppler
---<span class="Keyword">&gt;</span>  	py25-gtk
---<span class="Keyword">&gt;</span>  	gtk-nodoka-engine
---<span class="Keyword">&gt;</span>  	xsane
Error: port uninstall failed: Please uninstall the ports that depend on gtk2 first.
</pre>
<p>Not a very auspicious start, is it?  Time to step back and think about this one and dig into the macports facility to learn how to properly manage things.  New strategy: Get an education.</p>
<h2>Discovering Deactivate/Activate</h2>
<p>So, looking at the above problem, I realized that there was almost certainly an easier route out of this dependency nightmare and I needed to learn how to upgrade those old, stale packages.  Going through the docs reveals activate and deactivate commands.  Sounds perfect, lets try:</p>
<pre class="twilight">sudo port activate tiff @3.8.2_3
---<span class="Keyword">&gt;</span>  Activating tiff @3.8.2_3
Error: port activate failed: Image error: Another version of this port (tiff @3.8.2_2+darwin_9+macosx) is already active.
[mwlang@macdoze shared] sudo port deactivate tiff @3.8.2_2+darwin_9+macosx
---<span class="Keyword">&gt;</span>  Deactivating tiff @3.8.2_2+darwin_9+macosx
[mwlang@macdoze shared] sudo port activate tiff @3.8.2_3
---<span class="Keyword">&gt;</span>  Activating tiff @3.8.2_3
</pre>
<p>So there&#8217;s the kicker.  First, deactivate the old version, <i>then</i> activate the new version.</p>
<h2>So Macports itself is out of date, you say?</h2>
<pre class="twilight">sudo port install tiff -macosx imagemagick +q8 +gs +wmf
Error: Unable to execute port: invalid command name <span class="String"><span class="String">&quot;</span>use_autoreconf<span class="String">&quot;</span></span>
</pre>
<p>I had no clue what this was.  Googling around was turning up precious little.  So I hopped over into the IRC #macports channel.  Right off the bat, Toby tells me to selfupdate.  I had made the mistake of thinking that &#8220;sudo port sync&#8221; was keeping macports packages all up to date in one fell swoop.  But the two are two distinct activities.  So remember to keep ports itself updated with this:</p>
<pre class="twilight">sudo port selfupdate
</pre>
<p>With that, port was upgraded from a very old version to a bright and shiny new version.  Time to try to install ImageMagick again.  And I&#8217;m happy to report that I got much further along this time.  But still hit a roadblock&#8230;</p>
<h2>Mysterious failure demystified</h2>
<p>A little down the chain of installing various xorg packages, I hit upon this one with the xorg-libx11 package:</p>
<pre class="twilight">checking <span class="Keyword">for</span> XPROTO... configure: error: Package requirements (xproto <span class="Keyword">&gt;</span>= 7.0.13) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable <span class="Keyword">if</span> you
installed software <span class="Keyword">in</span> a non-standard prefix.

Alternatively you may set the XPROTO_CFLAGS and XPROTO_LIBS environment variables
to avoid the need to call pkg-config.  See the pkg-config man page <span class="Keyword">for</span>
more details.

Error: The following dependencies failed to build: ghostscript xorg-libXext xorg-libX11 xorg-libXt xorg-libsm xorg-libice
Error: Status 1 encountered during processing.
[mwlang@macdoze shared] sudo port install ImageMagick
Error: Requested variants <span class="Keyword">do</span> not match original selection.
Please perform <span class="String"><span class="String">'</span>port clean ImageMagick<span class="String">'</span></span> or specify the force option.
Error: Status 1 encountered during processing.
</pre>
<p>Strange, what&#8217;s that <b>xproto >= 7.0.13</b>?  How odd that a dependency would fail!  I tried a <b>sudo port install xproto</b>, but that was a no-go (so don&#8217;t bother trying, it&#8217;ll fail for you, too).  but then I noticed the dependency list (which oddly is missing <b>xorg-xproto</b>) and most of the packages are prefixed with &#8220;xorg-&#8221;, and tried <b>sudo port install xorg-xproto</b> and thus, was on my way again.</p>
<p>I lie! <i>I lie!</i>  I had no clue.  I googled &#8220;xproto port install&#8221; and learned the truth for the real package name that way.  However, as it happens, I found the answer on darwinports dot com in a dependency list for xorg-libx11.  I casually mentioned this site in the IRC channel and the #macports tenants were very quick to point out was an imposter site, so be wary of anything you read and learn there.  Information is liable to be stale while the site owner attempts to lighten your wallet a bit for no good cause.  Little did I know!</p>
<h2>Final tidbit</h2>
<p>Once I got the ports system updated and the xproto package installed, it was a fair breeze to finish with the ImageMagick installation.  One last command I learned from the good folks in #macports is to run the following on a frequent basis to keep your macports installation in fair good shape:</p>
<pre class="twilight">sudo port selfupdate <span class="Keyword">&amp;&amp;</span> sudo port upgrade outdated
</pre>
<h2>Conclusion</h2>
<p>For years,  I struggled with ports, and for no good reason.  Once I took the time to learn the package management&#8217;s commands (along with the help of those in #macports, for which I&#8217;m very grateful to them for saving me a few hours of head-scratching), I am finding I&#8217;m able to install packages painlessly on the mac and have even tried a couple of others I had problems with in the past and they&#8217;re all installing without a hitch.  The lesson for me:  take the time to learn your tools.  It may be slow-going at first, but the rewards always seem to pay back big dividends down the road.</p>
]]></content:encoded>
			<wfw:commentRss>http://ramblings.gibberishcode.net/archives/macports-is-not-darwinports/35/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Converting Oddmuse Wiki to Edgewall Trac</title>
		<link>http://ramblings.gibberishcode.net/archives/converting-oddmuse-wiki-to-edgewall-trac/13</link>
		<comments>http://ramblings.gibberishcode.net/archives/converting-oddmuse-wiki-to-edgewall-trac/13#comments</comments>
		<pubDate>Thu, 02 Oct 2008 16:30:38 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Macs]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python Language]]></category>
		<category><![CDATA[Ruby Language]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[oddmuse]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://ramblings.gibberishcode.net/?p=13</guid>
		<description><![CDATA[Our company began long ago with wiki&#8217;s, but we chose the Oddmuse wiki way back when.  These days, we&#8217;re heavy users of Trac wiki because of its integrated ticket support system.  So what to do with all those old wiki&#8217;s that folks have stopped using and reading.  The Oddmuse wikis still hold [...]]]></description>
			<content:encoded><![CDATA[<p>Our company began long ago with wiki&#8217;s, but we chose the Oddmuse wiki way back when.  These days, we&#8217;re heavy users of Trac wiki because of its integrated ticket support system.  So what to do with all those old wiki&#8217;s that folks have stopped using and reading.  The Oddmuse wikis still hold valuable data, but they have since become an administrative overhead to keep around, so I decided to convert them all to Edgewall&#8217;s Trac. </p>
<p>To get started, I needed to know how to get the data into Trac.  The following links gave me an API I could utilize to create trac pages and content:</p>
<p><a href="http://trac.edgewall.org/wiki/TracDev/DataModels">Trac Data Models</a><br />
<a href="http://trac.edgewall.org/browser/trunk/trac/wiki/model.py">The Data model Python code</a></p>
<p>Great!  Except there&#8217;s one small problem.  I don&#8217;t really know python all that well, even though I did do a bit of Zope development, oh, five years ago.  These days, my language of choice is Ruby, so I needed to figure out how to parse the Oddmuse syntax and turn it into Trac syntax.  The strategy:  Parse with Ruby, load cleaned page files with Python.  </p>
<p>This script will take a filename at command line and convert it and save back to file, but different extension (I chose *.om for &#8220;oddmuse&#8221;).  In the script below, I made the command-line optional as I discovered I didn&#8217;t handle every case as I worked on developing this script, so I simply changed the line that pulls the command-line argument to point to a specific file and output such to terminal and this allowed me to debug and fix as I went:</p>
<pre  name="code" class="ruby:nocontrols">
#!/opt/local/bin/ruby
# $FS  = "\xb3";      # The FS character is the RECORD SEPARATOR control char in ASCII
# $FS0 = "\xb3";      # The old FS character is a superscript "3" in Latin-1
# $FS1 = $FS . '1';   # The FS values are used to separate fields
# $FS2 = $FS . '2';   # in stored hashtables and other data structures.
# $FS3 = $FS . '3';   # The FS character is not allowed in user data.

FS = 179.chr

SITE_NAME = "corporate_wiki"
ATTACHMENT_URL_BASE = "https://intranet.example.com/#{SITE_NAME}/attachment/wiki/ConvertedAttachments/"

require 'find'
require 'ftools'

def safe_page_name(pagename)
  result = pagename.gsub("'","")
  result = result.slice(/(\w+)/).first
end

def get_section(page, section)
  page.each_with_index {|e,i| return page[i+1] if e == section}
  return ''
end

def asterick_prefixed(text)
  t = text.match(/(\*+)([^\b]*)/)
  return text if t.nil?

  tokens = t.to_a
  return ('  ' * tokens[1].size) + '* ' + tokens[2]
end

def colon_prefixed(text)
  return "  #{colon_prefixed(text.slice(1,text.size))}" if text[0] == ":"[0]
  return text
end

def pound_prefixed(text)
  return "  1. #{text.slice(1,text.size)}" if text[0] == "#"[0]
  return text
end

def fix_headers(text)
  t = text.match(/(=+)([^=]+)(=+)/)
  return text if t.nil?

  tokens = t.to_a
  return "#{tokens[1]} #{tokens[2].strip} #{tokens[1]}"
end

def replace_a_url(url, text)
  text.gsub!("http://#{url}", ATTACHMENT_URL_BASE)
  text.gsub!("https://#{url}", ATTACHMENT_URL_BASE)
  text.gsub!("http:/#{url}", ATTACHMENT_URL_BASE)
  text.gsub!("https:/#{url}", ATTACHMENT_URL_BASE)
  return text
end

def replace_wiki_urls(text)
  matches = text.match(/\[http(.)*\]/)
  result = text
  if matches
    result = replace_a_url("wiki.example.com/#{SITE_NAME}/wikifiles/", result)
    result = replace_a_url("pdfreviewfiles/", result)
    result = replace_a_url("cgi-bin/", result)
  end
  result
end

def convert_formats(text)
  result = text.gsub(/\[\[(\w+)\]\]/,"[wiki:" + '\1' + "]")
  result = asterick_prefixed(result)
  result = colon_prefixed(result)
  result = pound_prefixed(result)
  result = replace_wiki_urls(result)
  result = fix_headers(result)
  result
end

def oddmuse_to_trac(text)
  result = ''
  in_pre = false
  text.split("\n").each do |line|

    # Detect indented lines as these are rendered as PRE html blocks
    trimmed = line.lstrip
    is_prefixed = ((trimmed.size < line.size) and (trimmed[0] != '*'[0]))
    result << "{{{\n" if (is_prefixed and !in_pre)

    result << "}}}\n" if (!is_prefixed and in_pre)
    in_pre = is_prefixed

    # Don't process special characters when in PRE block
    if in_pre
      result << line << "\n"
    else
      result << convert_formats(line) << "\n"
    end
  end
  result += "}}}\n" if in_pre
  result
end

path = ARGV[0] || "page/U/UsingThePhones.db"
raw_page = File.new(path).read
page2 = raw_page.split(FS + '2')
page3 = raw_page.split(FS + '3')

text = get_section(page3, 'text')

pagename = File.basename(path).split('.').first
author = get_section(page2, 'username')
address = get_section(page2, 'ip')
body = oddmuse_to_trac(text)

puts "writing: #{pagename}.om"
outfile = File.new(path.gsub('.db','.om'),'w')
outfile.puts 'pagename:' + pagename
outfile.puts 'author:' + author
outfile.puts 'address:' + address
outfile.puts body
outfile.close

puts body if ARGV[0].nil?
</pre>
<p>Below, comes the Python side of the equation.  Once I did the heavy lifting in Ruby, I needed to generate all the pages.  As you can see, there's some parsing happening, but its very simple parsing and I was able to apply what simple Python knowledge I still retained pretty effectively:</p>
<pre  name="code" class="python:nocontrols">
import sys
from trac.env import Environment
from trac.wiki.model import WikiPage

print sys.argv[1]
file = open(sys.argv[1], 'r')
pagename = file.readline().split(':')[1].split('\n')[0]
author_name = file.readline().split(':')[1].split('\n')[0]
address = file.readline().split(':')[1].split('\n')[0]

text = file.read()

env = Environment('/srv/www/trac/corporate_wiki')

# Read an existing or new WikiPage:
page = WikiPage(env, pagename)
if page.text != text:
        page.text = text
        page.save(author=author_name, comment='imported from oddmuse wiki', remote_addr=address)
</pre>
<p>As you can see, this file simply takes the command line argument, open the file for reading, pull the various variables out with the remainder of the file going to the page content.</p>
<p>During the conversion, I noticed some pages were failing to convert at all, like "Michael'sTodoList"  The culprit, the tick in the page name and thus the filename.  The scripts themselves weren't the problem, it was the xargs parameter passing that was the issue (getting to that below).  So I ran the below script to rename all the troublesome filenames and then added similar tick to underscore substitution in the main Ruby script above.  </p>
<pre  name="code" class="ruby:nocontrols">
require 'find'
require 'ftools'

total_size = 0

Find.find('./page') do |path|
  if FileTest.directory?(path)
    if File.basename(path)[0] == ?.
      Find.prune       # Don't look any further into this directory.
    else
      next
    end
  else
    if path.match(/[\']/)
      safe_path = path.gsub("'", "_")
      puts path + ' to ' + safe_path
      File.move(path, safe_path)
    end
    end
  end
</pre>
<p>A simple up-front execution of the script was all that was needed to now be able to pick up the missing pages:</p>
<pre  name="code" class="ruby:nocontrols">
ruby fix_unsafe_files.rb
</pre>
<p>Finally, to bring it all together, I utilized find to locate all the *.db Oddmuse files which I had located into the various wiki subfolders where these scripts sat, passing the filename to the script via the xargs utility:</p>
<pre  name="code" class="ruby:nocontrols">
find . -name *.db -print0 | xargs -0 -L 1 ruby rdpage.rb
</pre>
<p>I then essentially repeated the above, but for the generated *.om files, passing to the Python mkpage.py script:</p>
<pre  name="code" class="ruby:nocontrols">
find . -name *.om -print0 | xargs -0 -L 1 python mkpage.py
</pre>
<p>One last thing, before we're done.  Each wiki had attachments.  So I had to think how to get those attachments referenced and linked to the Trac wiki.  A little investigation revealed that each attachment got a database entry in the attachment table.  My task was a bit complicated by the fact that the users over the years in the Oddmuse environment scattered their attachments everywhere and also used varying syntax to refer to them, hence, if you review the main Ruby parsing script, you'll see the "replace_a_url" method above that cleans all those funky URLs up.  So the script I used below simply scans through all the directories where we had files stored and attached them to one "ConvertedAttachments" page.  Probably not the ideal solution, but again, got the job done quickly.</p>
<pre  name="code" class="ruby:nocontrols">
#  type |          id          |  filename  |  size  |    time    | description | author |      ipnr
# ------+----------------------+------------+--------+------------+-------------+--------+----------------
#  wiki | ConvertedAttachments | gotapi.png | 200272 | 1218381947 |             | michael | 192.168.16.100

path = ARGV[0] || 'generate_attachments.rb'
filename = File.basename(path)

puts "insert into attachment values ('wiki', 'ConvertedAttachments', '#{filename}', #{FileTest.size(path)}, null, null, 'oddmuse','192.168.1.246');"
</pre>
<p>So, running the above needs to be piped to a SQL fisle and then executed against your Trac database.  In my case, Postgresql.  Since I had many directories to snatch up, I ran it for each folder as appropriate and simply kept appending until I had all the attachment directories represented.</p>
<pre  name="code" class="ruby:nocontrols">
ls | xargs -0 -L 1 >> attachments.sql
psql trac_db < attachments.sql
</pre>
<p>All in all, not too bad of a conversion for a few hour's work.  Its about 95% correct.  Some of the page names didn't translate to Trac, and could probably do with some regexp search and replace on the page names themselves.  The biggest gain is that we have preserved the information in the old systems by porting it to the new systems we all know and use on a daily basis, so WikiGardening is more likely to keep the content fresher and its one less system for our end-users to figure out how to use.  </p>
<p>I can now retire the server running Oddmuse, stop doing backups and keeping up with documentation and training new system administrators on how to manage Oddmuse AND Trac.  </p>
]]></content:encoded>
			<wfw:commentRss>http://ramblings.gibberishcode.net/archives/converting-oddmuse-wiki-to-edgewall-trac/13/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Macs?</title>
		<link>http://ramblings.gibberishcode.net/archives/why-macs/3</link>
		<comments>http://ramblings.gibberishcode.net/archives/why-macs/3#comments</comments>
		<pubDate>Thu, 08 May 2008 15:42:29 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Macs]]></category>
		<category><![CDATA[Systems]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[laptops]]></category>

		<guid isPermaLink="false">http://ramblings.gibberishcode.net/?p=3</guid>
		<description><![CDATA[For Years, I have used nothing but Microsoft Windows desktops and my development effort was 100% Windows based systems.  Long story, short, lets just say I knew way more about the inner bowels of Windows and its various API&#8217;s than I will ever care to recall nowadays.  Around 2001, I realized &#8220;The Web&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>For Years, I have used nothing but Microsoft Windows desktops and my development effort was 100% Windows based systems.  Long story, short, lets just say I knew way more about the inner bowels of Windows and its various API&#8217;s than I will ever care to recall nowadays.  Around 2001, I realized &#8220;The Web&#8221; was where the future lies and took nine months off from doing paid contract work to rediscover UNIX, or more specifically Linux where I set up DSL and my first server at home and ran various websites off Zope (python-based CMS).  But I still used Windows as my main desktop.  Then around late 2005 or early 2006, our company, which does Ruby on Rails development, decided to buy a couple of the first Intel MacBook Pros and give them a whirl.</p>
<p>It all started as our quest to find a reliable laptop that would be powerful enough to do development work and not spend half its time in the shop.  We had everything from Dell Laptops, Sony Viaos, to Asus and Acer, not to mention the behemoth Xtreme &#8220;desktop replacement&#8221; laptops that were weighing in at some 14lbs.  </p>
<p>As the company&#8217;s network manager, the first thing I noticed about the Macs was that their users rarely said another word to me after that first day receiving them.  Silent workers aren&#8217;t usually attention getters, but when all you&#8217;re doing is constantly repairing or shipping off hardware that has failed, the absence of doing so, even for a small group of users, does tend to grab your attention.</p>
<p>A few months later with still no chatter from the &#8220;mac guys,&#8221; I decided to check up on how the macs were doing.  The developers loved them!  Ok, so now I have to get one for myself and find out firsthand.  So we bought another wave of Macs and passed out to more developers and I collected one of the older slower ones to give a test drive of my own.</p>
<p>Well, to be perfectly honest, I stumbled greatly in the beginning trying to understand the Mac interface and essentially brute forced my way to productivity by living in Windows running on Parallels and the console when on the Mac side.  Little by little, I began to learn &#8220;the mac way&#8221; and utilize their silly one button mouse and Desktop GUI.  I&#8217;m sorry, but in this day and age, you need two buttons!  </p>
<p>As I left Windows behind, I began to notice something.  I wasn&#8217;t constantly updating and rebooting the system.  Nearly daily service patching.  Gone!  Anti-virus protection.  Gone!  Dealing with Firewall messages.  Gone!  Insane &#8220;are you sure you want to do that?&#8221; followed by &#8220;are you really sure?&#8221; prompts.  Gone!  System slowing down to a crawl with each new software installed.  Gone!  Cleaning the registry to get rid of all those auto-start components after new installs.  Gone!  Answering &#8220;No!&#8221; to &#8220;you have unused icons on your desktop&#8230;&#8221;  Gone!  Genuine Advantage Assurances?  Yup, gone!</p>
<p>Good gosh.  Was I really that numb to how much maintaining a working Windows systems had encroached on my life?  Not only as a user, but as a systems support person for our entire company.  No wonder those Mac adopters were so quiet. </p>
<p>All these little things make a huge difference.  Since I&#8217;ve started using a mac, my own productivity is a lot higher.  I&#8217;m able to do Ruby development in the best supported environment (Mac OS X) for development&#8230;which is a bonus of being UNIX based, which suits me well.  I&#8217;m able to run Windows XP in Parallels Virtual Machine in order to run SQL Server 2005.  I&#8217;m also able to VPN to all the various clients using the same Parallels setup, which is great because VPN&#8217;ing usually quarantines the machine altogether (meaning I can&#8217;t reach local LAN resources (printer, common drive, etc.) nor check emails and use IM).</p>
<p>I constantly see new PC based laptops that look promising and at a very affordable price, but I worry about getting into yet another laptop hardware platform (we already have Xtreme, Sony Viaos, Macs, Acers, Asus, and recently IBM Thinkpad) and figuring out where that machine&#8217;s gonna get shipped to and what kind of service we&#8217;re going to get when we inevitably have to send it off for repairs.   </p>
<p>In the ensuing two and half years as I count how many Macs have been sent back for repairs and warranty work, thus putting developers out of commission, I come up with a grand total of 3!  And that&#8217;s for nearly 50 laptops in active duty, of which approximately 30 are macs.  To my knowledge, virtually every PC based laptop but two or three have been returned for repair work.  That is HUGE drain on our productivity.  Macs are faster to set up and get working.  They are easy to back up and fully restore (and clone, too).  I changed out my Mac when I upgraded in under 3 hours total.   When I was done, there was no difference other than a boost in speed.  You can&#8217;t touch that with a PC based system.</p>
<p>Most of the developers coming on board these days want a Linux system, so we hand them macs now.  Instead of spending untold hours configuring The display and wireless (the two trickiest items left with Linux installs), and involving me and numerous other developers in their effort to get the hardware to fully function with the OS, the new developer quickly adapts to Mac&#8217;s BSD-derived OS and are usually done with major configuring within first couple of days.  </p>
<p>Macs are also not so prone to virus attacks nor are they loaded down with a whole bunch of crapware.    What&#8217;s more, when you install applications, they get added to the Application folder and you can easily add them to the dock.  Its rare application indeed that also ties itself into the auto-launch to fire up along with the system&#8217;s reboot.  So what does this mean?  Your system doesn&#8217;t constantly degrade in performance just by merely installing software!</p>
<p>While Macs are costing a little more upfront, they are showing very solid ROI over the long-term.  As a systems administrator, I spend very little time servicing these machines.  I&#8217;m not a Mac zealot.  There&#8217;s plenty about Macs that can be improved, but right now, its got the best of breed status all around and definitely worth having in your company&#8217;s hardware portfolio.</p>
]]></content:encoded>
			<wfw:commentRss>http://ramblings.gibberishcode.net/archives/why-macs/3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
