<?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>baltimore_dad &#187; technology</title>
	<atom:link href="http://www.baltdad.com/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.baltdad.com</link>
	<description>random stuff, mostly technology related</description>
	<lastBuildDate>Wed, 31 Mar 2010 21:43:34 +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>HeyTell</title>
		<link>http://www.baltdad.com/2010/03/heytell/</link>
		<comments>http://www.baltdad.com/2010/03/heytell/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 17:39:01 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=407</guid>
		<description><![CDATA[<p>
HeyTell is a really neat (and free) app for the iPhone.  It&#8217;s a mix of the best things about text messages, and the Nextel walkie-talkie thing.  Everyone you talk to will need the app (iPhone only at this time).  You then need to add people out of your contacts list as &#8220;friends&#8221;.  This action will <p>Continue reading <a href="http://www.baltdad.com/2010/03/heytell/">HeyTell</a></p>]]></description>
			<content:encoded><![CDATA[<p><a rel="attachment wp-att-413"  href="http://www.baltdad.com/2010/03/heytell/img_0603/" ><img class="alignleft size-full wp-image-413"  title="HeyTell"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2010/03/IMG_0603.png"  alt=""  width="144"  height="216" /></a><a href="http://www.heytell.com/"  target="_blank" ><br/>
HeyTell</a> is a really neat (and free) app for the iPhone.  It&#8217;s a mix of the best things about text messages, and the Nextel walkie-talkie thing.  Everyone you talk to will need the app (iPhone only at this time).  You then need to add people out of your contacts list as &#8220;friends&#8221;.  This action will send the person a text message or an email with a link they need to click to accept your friend request.  You can then open the app, select a friend, and push the big orange button at the bottom to send a voice message to the selected contact.  Push notifications make the whole thing work much like text messaging.</p>
<p>I&#8217;ve been using it for a week or so now.  It&#8217;s pretty useful.  Those times when a phone call is too disruptive, and you don&#8217;t want to/can&#8217;t type a text message is the perfect use case for this app.  In fact, I can see it replacing text messages for several of my contacts.  It&#8217;s found it&#8217;s way on to the first page of apps.  The only real blemish with the app is how it handles your contacts.  There is no way to tell if you can send a message to a particular contact.  If you send a message to someone you haven&#8217;t friended, it sends them an invite to download the app along with a URL they can use to &#8220;friend&#8221; you.  There needs to be some way to tell who your friends are (i.e. show me the list of people I can talk with).  Overall, it&#8217;s been a useful tool  already and is worth checking out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2010/03/heytell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac-Mini as an HTPC</title>
		<link>http://www.baltdad.com/2010/03/mac-mini-as-an-htpc/</link>
		<comments>http://www.baltdad.com/2010/03/mac-mini-as-an-htpc/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 00:04:53 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[htpc]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=379</guid>
		<description><![CDATA[<p>For those of you who just want the links.</p>

mac-mini quiet, fast, flexible.
Plex Really nice XBMC fork to work as a media center.  Can launch other apps, comes with a server for iTunes/iPhoto from another box.
RemoteBuddy Software that makes the apple remote more useful.
RipIt DVD -&#62; Hard Disk
HandBrake Ripped DVD -&#62; Video

<p></p>
<p>I recently picked up a <p>Continue reading <a href="http://www.baltdad.com/2010/03/mac-mini-as-an-htpc/">Mac-Mini as an HTPC</a></p>]]></description>
			<content:encoded><![CDATA[<p>For those of you who just want the links.</p>
<ul>
<li><strong><a href="http://www.apple.com/"  target="_blank" >mac-mini</a></strong> quiet, fast, flexible.</li>
<li><strong><a href="http://www.plexapp.com/"  target="_blank" >Plex</a></strong> Really nice XBMC fork to work as a media center.  Can launch other apps, comes with a server for iTunes/iPhoto from another box.</li>
<li><strong><a href="http://www.iospirit.com/products/remotebuddy/"  target="_blank" >RemoteBuddy</a></strong> Software that makes the apple remote more useful.</li>
<li><strong><a href="http://thelittleappfactory.com/ripit/"  target="_blank" >RipIt</a></strong> DVD -&gt; Hard Disk</li>
<li><strong><a href="http://handbrake.fr/"  target="_blank" >HandBrake</a></strong> Ripped DVD -&gt; Video</li>
</ul>
<p><span id="more-379" ></span></p>
<p>I recently picked up a mac mini to plug into my television.  I&#8217;m a mac user in general, and the mini seemed like it would make a good htpc.  I hadn&#8217;t really done much research on it, but I figured I could make it work.  I have to report, yes, it works, and it works very well.  Getting things running smoothly took a little bit of work and a few dollars (beyond the cost of the mini).</p>
<p><strong>Hardware</strong><br/>
Not much was needed beyond the mac mini.  I picked up the late 2009 refresh of the mini (low end) which has been more than fine.  I needed to pickup a mini display port to VGA adapter, and the goofy 1/8th inch to toslink cable.  I also ended up getting the aluminum apple remote (to assist in doing the multi-code remote hack I&#8217;ll discuss later).  VGA to my TV, toslink to my receiver, power cable, and I was ready to go.  Since I&#8217;m running the mini wirelessly, I needed to pickup a dual band G/N router (I need G for my phone, old laptop etc).  I got the WRT610n V2 and promptly put dd-wrt on it.  Works great, simultaneous G and N.</p>
<p><strong>Software</strong></p>
<div id="attachment_384"  class="wp-caption alignright"  style="width: 196px" ><a href="http://www.plexapp.com/" ><img class="size-full wp-image-384  "  title="Plex"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2010/03/imgMov2001-w290.jpg"  alt=""  width="186"  height="104" /></a><p class="wp-caption-text" >Plex</p></div>
<p>The first piece of software is my main media center application.  For this I&#8217;m using <a href="http://www.plexapp.com/" >Plex</a>.  This is a really nice fork of the fantastic XBMC project.  It is tailored to OSX, as such it integrates nicely with iPhoto, iTunes, DVD Player, and other OSX media apps (including Hulu Desktop, Boxee, etc).  It has plugins that support Hulu, Netflix, last.fm, etc.  I&#8217;ve been underwhelmed by the netflix and hulu plugins.  I generally end up using netflix on my xbox, or running Hulu Desktop.  The ability to launch other applications from within Plex make it an ideal &#8220;hub&#8221; for all of my media applications.  Once nice feature is the built in Plex Media Server.  I have all of my content (Music, Movies, Pictures) sitting on my desktop machine.  The Plex Media Server allows me to serve my iTunes and iPhoto libraries from my desktop to Plex on my mini.  For movies I just have an AFP automount setup (seems to work well)</p>
<div id="attachment_383"  class="wp-caption alignright"  style="width: 204px" ><a href="http://www.iospirit.com/products/remotebuddy/" ><img class="size-full wp-image-383 "  title="RemoteBuddy"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2010/03/splashMenu.jpg"  alt="RemoteBuddy"  width="194"  height="122" /></a><p class="wp-caption-text" >Remote Buddy</p></div>
<p>The next piece of software, and the glue that really holds everything together is <a href="http://www.iospirit.com/products/remotebuddy/"  target="_blank" >Remote Buddy</a>.  This software basically presents a customizable menu that you can drive with your apple remote.  The menu allows you to launch applications, turn your remote into a mouse, and play movies/audio directly.  Remote Buddy calls each of these different contexts behaviors.  For example, when I switch to the Plex behavior, Plex is launched, and remote buddy knows that when I hit the pause button on my remote, that it needs to send the spacebar to Plex.  Remote Buddy  has built in configurations for Hulu, Boxee, Plex, iTunes, iPhoto, Finder, etc.  It really improves Apple&#8217;s pathetic remote handling (7 discreet codes, really apple?  is that the best you can do?).  The apple remote can only send 7 discreet codes (14 if you count holding down a button as a new code).  <a href="http://funwithcomputers.wordpress.com/2008/03/01/using-the-harmony-880-remote-with-your-macs-built-in-ir-port/"  target="_blank" >This hack</a> allows you to create limitless button mappings with a programable remote.  I think RemoteBuddy costs about 20 bucks, and is well worth it.  Makes my whole system work without having to break out a keyboard/mouse.</p>
<div id="attachment_387"  class="wp-caption alignright"  style="width: 130px" ><a href="http://thelittleappfactory.com/ripit/" ><img class="size-full wp-image-387"  title="RipIt"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2010/03/screen_3_small.png"  alt=""  width="120"  height="127" /></a><p class="wp-caption-text" >RipIt</p></div>
<p>The next piece of software is one of two things I&#8217;ve been using to slowly get my DVD collection onto my computer.  When I started I was using HandBrake to both rip and transcode.  This worked pretty well, but the ripping took forever, and was difficult to do in bulk.  Enter <a href="http://thelittleappfactory.com/ripit/"  target="_blank" >RipIt</a>.  I was introduced to RipIt by the most recent MacHeist.  It seemed interesting so I grabbed a demo.  All this application does is rip DVDs (there is a beta transcoding feature that doesn&#8217;t work very well).  The good people at The Little App Factory have started a DVD identification service so RipIt can accurately name the discs you rip with it.  The workflow becomes: insert disc, when disc ejects put a new one in.  This allows me to get the raw DVDs into a place where I can start to transcode them in bulk.  RipIt seems to be faster and more reliable than HandBrake&#8217;s DVD ripping feature.</p>
<p>Lastly comes the transcoding software.  For this task I am continuing to use <a href="http://handbrake.fr/"  target="_blank" >HandBrake</a>.  It threads nicely on my Mac Pro and has done everything I&#8217;ve asked of it (subtitles, multi language, etc).  I&#8217;m using the MKV container format because it seems a bit faster as it doesn&#8217;t have to touch AC3 audio.  I&#8217;m still mucking with settings, but the video quality is quite good.</p>
<p>Overall I&#8217;m really happy with the mini as an HTPC.  It&#8217;s quiet, and I can do more with it than just play movies/music.  My kid plays her games on it, and I&#8217;ve been using Google Earth to show her where various places are on the planet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2010/03/mac-mini-as-an-htpc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>broadband2go</title>
		<link>http://www.baltdad.com/2009/08/broadband2go/</link>
		<comments>http://www.baltdad.com/2009/08/broadband2go/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 03:54:24 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[OSX]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=366</guid>
		<description><![CDATA[<p>I&#8217;ve been wanting to pick up a 3G adapter for my laptop for quite some time.  It&#8217;s not something I need on a regular basis, but there are times when one would have been useful.  When I&#8217;m taking classes I often like to go to the bookstore and work on papers etc. while the rest <p>Continue reading <a href="http://www.baltdad.com/2009/08/broadband2go/">broadband2go</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-369"  title="MC760_ProductFamilyPage"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2009/08/MC760_ProductFamilyPage.png"  alt="MC760_ProductFamilyPage"  width="187"  height="87" />I&#8217;ve been wanting to pick up a 3G adapter for my laptop for quite some time.  It&#8217;s not something I need on a regular basis, but there are times when one would have been useful.  When I&#8217;m taking classes I often like to go to the bookstore and work on papers etc. while the rest of my family reads books/plays with trains/etc.<img src="file:///Users/andrew/Desktop/MC760_ProductFamilyPage.png"  alt="" />  The Starbucks in my local B&amp;N used to charge 4.00 for 2 hours of wifi.  A bit steep, but using it once every few weeks the cost was worth it to me.  Being able to get out of the house with the family and still get some work done is great.  Recently they decided to make the service free.  Now that it&#8217;s free it&#8217;s next to useless.  When I can manage to get connected it&#8217;s too slow to be useful.  While I like being able to get some work done while out, it&#8217;s not worth 60.00 a month to me.</p>
<p>Enter Virgin&#8217;s <a href="http://web.virginmobileusa.com/broadbandPlans"  target="_blank" >broadband2go</a> service.  The usb adapter costs ~145 and includes a micro SD card slot (lets you use the thing as a thumb drive).  The device is the<a href="http://www.novatelwireless.com/index.php?option=com_content&amp;view=article&amp;id=248:ovation-mc760-micro-usb-modem-evdo-reva-networks&amp;catid=3&amp;Itemid=10"  target="_blank" > Novatel MC760</a> (pictured). The pricing is decent for my needs as well (they&#8217;re steep for heavy use, but I&#8217;m not a heavy user).  The pricing ranges from 10.00 for 100mb to use in 10 days, up to 60.00 for 1G to use within 30 days.  In my mind, paying 10 bucks for a few days of light net usage occasionally isn&#8217;t too bad.  The speed is definately usable for browsing, and shell work.  I haven&#8217;t taken the time to run a bandwidth test on it.</p>
<p>One note, if you use a Mac you&#8217;ll need a windows box to get the device activated (I was able to use an XP vm in fusion).  Once activated it works great.  The device comes with drivers that will install the first time you plug it in.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/08/broadband2go/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Posterous</title>
		<link>http://www.baltdad.com/2009/06/posterous/</link>
		<comments>http://www.baltdad.com/2009/06/posterous/#comments</comments>
		<pubDate>Sat, 27 Jun 2009 18:18:21 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=362</guid>
		<description><![CDATA[<p>I recently picked up a new iPhone.  The 3gs is quite speedy and definitely an improvement from my 1st gen phone.  I wanted to be able to post videos to twitter (now that the phone takes video, why not?)  A few of the iPhone twitter apps are claiming they&#8217;ll support it in the future, but <p>Continue reading <a href="http://www.baltdad.com/2009/06/posterous/">Posterous</a></p>]]></description>
			<content:encoded><![CDATA[<p>I recently picked up a new iPhone.  The 3gs is quite speedy and definitely an improvement from my 1st gen phone.  I wanted to be able to post videos to twitter (now that the phone takes video, why not?)  A few of the iPhone twitter apps are claiming they&#8217;ll support it in the future, but none do now.  After a bit of digging I ran across <a href="http://www.posterous.com/"  target="_blank" >posterous</a>.  Posterous is fairly cool.  You email your media to post@posterous.com and it adds it to a web-page based on your email address.  When I send mail from my personal gmail account, a post is created on <a href="http://baltdad.posterous.com/"  target="_blank" >baltdad.posterous.com</a>.  I have configured that account to automatically post to my twitter feed when anything is posted.  So, from my phone, I mail video to post@posterous.com and stuff shows up on twitter.  Kinda cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/06/posterous/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bazaar Part 5: Permissions</title>
		<link>http://www.baltdad.com/2009/04/bazaar-part-5-permissions/</link>
		<comments>http://www.baltdad.com/2009/04/bazaar-part-5-permissions/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 03:44:17 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[bzr]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=242</guid>
		<description><![CDATA[<p>In my environment, it&#8217;s important to limit access to the vcs repository.  We need to limit general access to the code, commit access on different branches, as well as the ability to create branches in certain areas.  In this post I&#8217;m going to look at how to handle permissions to lock down/allow different operations.  Here <p>Continue reading <a href="http://www.baltdad.com/2009/04/bazaar-part-5-permissions/">Bazaar Part 5: Permissions</a></p>]]></description>
			<content:encoded><![CDATA[<p>In my environment, it&#8217;s important to limit access to the vcs repository.  We need to limit general access to the code, commit access on different branches, as well as the ability to create branches in certain areas.  In this post I&#8217;m going to look at how to handle permissions to lock down/allow different operations.  Here is the repository structure I&#8217;m working with:</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p><span style="color: #000000;" ><span style="color: #0000ff;" >[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt;</span> </span><span style="color: #3366ff;" ><strong><span style="color: #000000;" >tree repo</span></strong><br/>
</span> repo<br/>
`&#8211; myProject.trunk<br/>
1 directory, 0 files</p></blockquote>
<p>Just my trunk branch in the repository.  All of these files (the .bzr, the directories etc.) are owned by me.  I should be able to do anything I want in the repository.  Like creating a new branch.  So, I have my trunk branch, and my first release branch in the repository.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p><span style="color: #0000ff;" >[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt;</span> <span style="color: #000000;" ><strong>bzr branch repo/myProject.trunk repo/myProject.R1</strong></span><br/>
Branched 0 revision(s).</p>
<p><span style="color: #0000ff;" >[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt;</span><span style="color: #000000;" > <strong>tree repo</strong></span><br/>
repo<br/>
|&#8211; myProject.R1<br/>
`&#8211; myProject.trunk<br/>
2 directories, 0 files</p></blockquote>
<h4>Testing with various permissions</h4>
<p>Below is a table of various permission settings and the directory/files I applied the permissions to.  I chowned all of the files to root:wheel and messed with the global permissions.  In actual production you&#8217;d want to use some combination of group permissions/setuid bits/umasks to make sure everything works.  So, when I list the permissions below, I&#8217;m only referring to the permissions I had on  the specified directory/set of files.  x was only ever set on directories.</p>
<p><span id="more-242" ></span></p>
<table border="0" >
<tbody>
<tr>
<th>Location</th>
<th>rwx</th>
<th>Action</th>
<th>Worked?</th>
<th>Notes</th>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>&#8212;</td>
<td>commit</td>
<td><span style="color: #993300;" >No</span></td>
<td>As expected</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>r&#8211;</td>
<td>commit</td>
<td><span style="color: #993300;" >No</span></td>
<td>Just being able to read the top level branch dir isn&#8217;t enough.  Remember, I still have full perms on the .bzr directory.</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>r-x</td>
<td>commit</td>
<td><span style="color: #339966;" >Yes</span></td>
<td>Needed x on the top level dir.  This isn&#8217;t surprising since all of the action takes place in the .bzr directory.</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>&#8212;</td>
<td>checkout</td>
<td><span style="color: #993300;" >No</span></td>
<td>As expected</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>r&#8211;</td>
<td>checkout</td>
<td><span style="color: #993300;" >No</span></td>
<td>Same as commit</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>r-x</td>
<td>checkout</td>
<td><span style="color: #339966;" >Yes</span></td>
<td>Same as commit.  We need x on the branch directory</td>
</tr>
<tr>
<td style="padding: 15px;"  colspan="5" >If we have r_x on the branch dir that contains the .bzr dir, we can checkout/modify the branch.  Below, I&#8217;m going to<br/>
look at what happens when we mess with perms on .bzr.  The tests above did not show how to setup a read only<br/>
branch.  I&#8217;m anticipating that mucking with the .bzr permissions will let me do that.</td>
</tr>
<tr>
<td>repo/myProject.trunk/.bzr</td>
<td>&#8212;</td>
<td>commit</td>
<td><span style="color: #993300;" >No</span></td>
<td>As expected.  No perms on the .bzr directory means I can&#8217;t write.</td>
</tr>
<tr>
<td>repo/myProject.trunk/.bzr</td>
<td>r&#8211;</td>
<td>commit</td>
<td><span style="color: #993300;" >No</span></td>
<td>Read perms on the .bzr dir won&#8217;t let me commit</td>
</tr>
<tr>
<td>repo/myProject.trunk/.bzr</td>
<td>r-x</td>
<td>commit</td>
<td><span style="color: #339966;" >Yes</span></td>
<td>r-x on the .bzr directory lets me commit.</td>
</tr>
<tr>
<td style="padding: 15px;"  colspan="5" >At this point I suspect the checkout tests will be the same so I&#8217;m not going to run them.  Next step is to change perms<br/>
on all files within the .bzr directory.  I wasn&#8217;t anticipating the simple top level directory perms to get me anywhere, I just<br/>
wanted to see what the effects were.  Note, the x perms are only applied to directories in the perms list below.</td>
</tr>
<tr>
<td>repo/myProject.trunk/.bzr/*</td>
<td>r-x</td>
<td>checkout</td>
<td><span style="color: #339966;" >Yes</span></td>
<td>With full read access (and x on dirs) I can checkout the branch</td>
</tr>
<tr>
<td>repo/myProject.trunk/.bzr/*</td>
<td>r-x</td>
<td>commit</td>
<td><span style="color: #993300;" >No</span></td>
<td>With just r-[x] I can checkout, but I can&#8217;t commit. Good</td>
</tr>
<tr>
<td>repo/myProject.trunk/.bzr/*</td>
<td>rwx</td>
<td>commit</td>
<td><span style="color: #339966;" >Yes</span></td>
<td>As expected, with rw[x] I can commit to the branch.</td>
</tr>
<tr>
<td style="padding: 15px;"  colspan="5" >Now we know something about perms and how they relate to checkouts and committing.  I&#8217;m going to assume that branching, updates, and merging follow the same rules.  Now, lets take a quick look at creating branches within the repo.  This is not going to be anything shocking given the above, but it&#8217;s worth putting down for completeness.</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>r-x</td>
<td>branch</td>
<td><span style="color: #993300;" >No</span></td>
<td>trying to create a branch within myProject.trunk failed, no write perms on the directory</td>
</tr>
<tr>
<td>repo/myProject.trunk</td>
<td>rwx</td>
<td>branch</td>
<td><span style="color: #339966;" >Yes</span></td>
<td>using the branch command I was able to create myProject.feature1 within trunk.</td>
</tr>
</tbody>
</table>
<h4>Conclusion</h4>
<p>So, permissions in bzr work about as I expected.  The only time you really care about permissions on any directory other than the .bzr directory (and its contents) is when you want to create a branch.  Creating a branch requires rwx on the branch target.  To create a read only branch you need to give your users r-x permissions on all of the files in the .bzr directory.  To allow them to write, they&#8217;ll need rwx.  The next trick is to figure out how to manage these permissions.  There is a tool called sheila for CVS that handled doling out permissions as needed.  I&#8217;ll need something similar for bzr.  Another way to approach this issue is to look at the hooks provided in the bzr server.  I&#8217;d like to not have to mess with groups/file permissions if I don&#8217;t have to.  Having restrictions enforced by the software controlling the commits gives me a bit more flexibility.  Perhaps for my next post I&#8217;ll dig into that a bit.  As always, let me know if you liked this, or if you have any other comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/04/bazaar-part-5-permissions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Balsamiq Mockups</title>
		<link>http://www.baltdad.com/2009/04/balsamiq-mockups/</link>
		<comments>http://www.baltdad.com/2009/04/balsamiq-mockups/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 16:15:31 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=218</guid>
		<description><![CDATA[<p>I design user interfaces for a living, it is a strange blend of code, art, and guesswork.  I want my interfaces to be useful, visually appealing, and functional.  I&#8217;m writing software that people are using to do their job.  As such, I want to provide an interface that allows my users to do their jobs <p>Continue reading <a href="http://www.baltdad.com/2009/04/balsamiq-mockups/">Balsamiq Mockups</a></p>]]></description>
			<content:encoded><![CDATA[<p>I design user interfaces for a living, it is a strange blend of code, art, and guesswork.  I want my interfaces to be useful, visually appealing, and functional.  I&#8217;m writing software that people are using to do their job.  As such, I want to provide an interface that allows my users to do their jobs as easily as possible.  What may seem useful for one group of users may not be useful for another group of users.  Trying to guess what people want to do, how they want to do it, and what results they want can be very challenging.  While there are definitely wrong choices, I don&#8217;t believe it&#8217;s possible to satisfy everyone.  Some people prefer Gmail, others prefer Yahoo Mail.  I don&#8217;t think Google or Yahoo made mistakes that drove people away I just think that users have different preferences.  To develop effective interfaces, you have to figure out who your users are and provide them an interface they want to use.  Putting a good set of UI mockups in front of your users, or proxies for your users, can help determine which designs will work, and which designs won&#8217;t.</p>
<h4>Mockups</h4>
<p>I&#8217;ve used two basic strategies for developing UI mockups.  First is hand drawing/using some tool like visio.  Hand drawing is fairly inflexible, and the tools I&#8217;ve used have been fairly clumsy.  I&#8217;d love to use something that is as quick as hand drawing, that still has the flexibility of using software.   A second method of generating mockups is to write user interaction code to drive the mockups.  While this method is also time consuming, ideally you will end up with some usable code.  When you show the design to the user, you can actually demonstrate how things will work in a live environment, this too is a good thing.  If your initial design is too far away from what the user wants, you may end up having to throw away work you were hoping to use later.  I know we don&#8217;t have time for this in our organization, I doubt others do either.  I think it&#8217;s useful to develop a set of hand drawn/computer drawn mockups to help present different design options to your potential users.  Once you have an idea of what they like/dislike, you can start working on the coded interaction.  This way, you are helping to ensure that you are effectively using your time.<br/>
<span id="more-218" ></span><br/>
<h4>Balsamiq Mockups</h4>
<p>I have not spent a lot of time looking for other software in this space, so I don&#8217;t really have much to compare to, however, <a href="http://www.balsamiq.com/products/mockups"  target="_blank" >Balsamiq Mockups</a> seems to provide the speed of quickly sketching a mockup, with the flexibility of using software.  There is a video on their website that shows the tool being used to generate a mockup of a familiar music player.  This is done surprisingly quickly and accurately.<img class="size-thumbnail wp-image-220 alignleft"  title="balsamiqmain"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2009/04/balsamiqmain-150x125.png"  alt="balsamiqmain"  width="150"  height="125" /> To the left is a picture of the main screen.  The lower portion of the screen is your canvas, and the top contains the toolbar of widgets.  There are a ton of widgets to choose from, including iPhone specific UI elements, and some OSX specific elements, like coverflow.  To start creating a mockup, you can either drag widgets from the pallet, or use quick add to search for and add widgets.  One of the more interesting widgets is the data grid.  This  widget allows you to draw a table with your own data inside.  To enter the data you simply double click on the widget and start typing.<a href="http://www.baltdad.com/wordpress/wp-content/uploads/2009/04/balsamiqdatagrid.png" ><img class="alignright size-thumbnail wp-image-221"  title="balsamiqdatagrid"  src="http://www.baltdad.com/wordpress/wp-content/uploads/2009/04/balsamiqdatagrid-150x70.png"  alt="balsamiqdatagrid"  width="150"  height="70" /></a> Columns are separated by commas, the first row is your table header, and you can use special sequences like [x] to indicate things like a checked checkbox.  Being able to use your own data inside a mockup is a great feature of this tool.  Balsamiq handles things like scrollbars, window actions, and other common UI elements very well.  As you can see, the visual style of the mockups look hand drawn, which I actually like.  I haven&#8217;t spent that much time using Mockups yet, so there may be some quirks I&#8217;m not seeing, but it looks like a potentially useful tool.  I&#8217;m looking forward to trying it for my next design.  One thing that is missing, according to their website, is the ability to add custom widgets to the toolbar.  At my job we have some standardized UI components, like headers, that I would love to be built into the tool.  You can save and import your own templates, which addresses the issue, but putting them in the pallet would be great.  I&#8217;d like to be able to point the data grids at a text file rather than having to enter the data in the program (I only spent a minute looking, so this might exist).  This would make re-using the same data-set across multiple designs easier.  Overall, I&#8217;m very impressed by the software, and it seems reasonably priced at ~80.00 USD.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/04/balsamiq-mockups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Site Install</title>
		<link>http://www.baltdad.com/2009/04/site-install/</link>
		<comments>http://www.baltdad.com/2009/04/site-install/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 17:00:42 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=194</guid>
		<description><![CDATA[<p>I started my series about bzr as an excuse to teach myself something that may be useful at work, and as a way to see if I enjoyed writing content.  Which, for now, I do.  I was using blogger, and quickly got fed up with the lack of options, and a fairly frustrating editing experience.  <p>Continue reading <a href="http://www.baltdad.com/2009/04/site-install/">Site Install</a></p>]]></description>
			<content:encoded><![CDATA[<p>I started my series about bzr as an excuse to teach myself something that may be useful at work, and as a way to see if I enjoyed writing content.  Which, for now, I do.  I was using blogger, and quickly got fed up with the lack of options, and a fairly frustrating editing experience.  So, I started to look into other options.  I don&#8217;t think I&#8217;ve put a site online for personal use/work since 1998 or so.  This project also served as a way to see how things are done these days.  It&#8217;s been a fun experience.</p>
<h4>First Steps</h4>
<p>After doing some research I ran across <a href="http://www.linode.com/"  target="_blank" >Linode</a> for my hosting solution.  They were offering everything I wanted for not a ton of money.  I get a pretty fast box, with 36oMB of ram, 12G of disk an 200G a month of transfer.  This seemed like more than enough for me.  I get full control over the machine; I can reboot/reinstall/do whatever I want.  They even provide a remote console in case something goes wrong.  They give you 10+ common linux distributions to choose from for the base install.  The process was as easy as: pay them, pick your distro, click go.  30 second later I had my vanilla install.</p>
<p><span id="more-194" ></span></p>
<p>I needed a domain name so I went to <a href="http://godaddy.com"  target="_blank" >godaddy</a> and was underwhelmed by their site.  Their service was actually very good, but I really had to dig around to find what I was looking for.  They also really try to attach every possible service in the world to a simple domain.  In the end I just got the domain and privacy option (doesn&#8217;t expose stuff like my home address under whois).  As soon as possible I transferred DNS for the domain over to linode&#8217;s dns servers.  This process was quick and painless.</p>
<p>I think it took me about an hour from getting off my butt to get this setup to having a machine and working DNS.  All of this happened on a Sunday afternoon.  Things definitely seem to work better than they did when I had to wait for a few days for Network Solutions to turn around registrations for me &#8220;back in the day.&#8221;</p>
<h4>Wordpress</h4>
<p>Installing wordpress was fairly straight forward.  I followed the 5 minute install guide and was mostly running pretty quickly.  The one thing that they don&#8217;t mention clearly, that they probably should, is that you really don&#8217;t want to use the default wp_ prefix.  Leaving as default makes it a little easier for an attacker to get to your tables from vulns in wordpress.  Changing this isn&#8217;t a ton of protection, but it can&#8217;t hurt.  I did this after I was installed, so making the change was a bit of a pain, the instructions <a href="http://tdot-blog.com/wordpress/6-simple-steps-to-change-your-table-prefix-in-wordpress"  target="_blank" >here</a> worked fairly well.  I also followed several of the suggestions <a href="http://blogbuildingu.com/wordpress/hardening-existing-wordpress-installation"  target="_blank" >here</a> about securing wordpress.  I also took some additional steps at the OS level.  I&#8217;m sure if someone wanted to get in they could.</p>
<p>There were a number of other things I wanted to get working.  Google Analytics was pretty easy to get going.  Add the slug to my template footer and it just worked.  AdSense was pretty easy as well, just added the code to a text widget.  Feedburner was really the most frustrating part of the experience.   I really wanted the feed to be a one or two hundred word summary, but I just couldn&#8217;t make it work.  The feed summarize feature in feedburner just seemed to use the wordpress auto generated excerpts which are surprisingly inflexible.  I know there are plug-ins that will deal with that, but it really wasn&#8217;t a huge deal.  I got a plug-in that can inject css into the feed so I can get a little bit of styling on my feed.</p>
<h4>Other</h4>
<p>I wanted to make sure I had regular backups of my system.  So I wrote a [Download not found].   It&#8217;s not anything special, but it gets me backups.  I then got awstats setup using a pretty decent <a href="http://ubuntu-tutorials.com/2008/01/16/configuring-awstats-on-ubuntu-server/"  target="_blank" >reference</a> on how ubuntu wants awstats to work.  I&#8217;ve been going against my natural inclination to do everything by hand, and letting ubuntu&#8217;s package management stuff take care of things for me (for the most part, wordpress was still a hand install).</p>
<p>I used google&#8217;s tools for webmasters to get my site added to google, added a plugin to auto generate and submit site-maps, and added an appropriate robots.txt.  The site is actually getting indexed now.  I&#8217;m waiting for the flood of people who want to read about bazaar.  <img src="http://www.baltdad.com/wordpress/wp-includes/images/smilies/icon_smile.gif"  alt=":)"  class="wp-smiley" /> </p>
<h4>Closing</h4>
<p>This has been a really fun project.  It has been interesting to see how things are done now vs. when I was setting up medical journal sites.  The parts haven&#8217;t changed a whole lot, but what used to take a month can be done in a few days.  Kudos to Google for the amount of stuff they give away.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/04/site-install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bazaar Part 4: push &amp; pull</title>
		<link>http://www.baltdad.com/2009/04/bazaar-part-4-push-pull/</link>
		<comments>http://www.baltdad.com/2009/04/bazaar-part-4-push-pull/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 02:04:37 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[bzr]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=187</guid>
		<description><![CDATA[<p>Using push/pull with bazaar.  Before I started playing around with bazaar I spent a little bit of time with git.  Since my background has been entirely CVS I thought that push and pull were generally &#8220;special&#8221; operations in newer vcs systems.  It turns out, in bazaar push and pull do nothing other than manage mirrors <p>Continue reading <a href="http://www.baltdad.com/2009/04/bazaar-part-4-push-pull/">Bazaar Part 4: push &#038; pull</a></p>]]></description>
			<content:encoded><![CDATA[<p>Using push/pull with bazaar.  Before I started playing around with bazaar I spent a little bit of time with git.  Since my background has been entirely CVS I thought that push and pull were generally &#8220;special&#8221; operations in newer vcs systems.  It turns out, in bazaar push and pull do nothing other than manage mirrors of branches.  If I&#8217;m sitting in a branch and issue a bzr push command, I&#8217;ll end up with a mirror of the current branch in the push target, like so:</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myBranch<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr push ../myBranch.mirror<br/>
Created new branch.</p></blockquote>
<p>I now have a branch called myBranch.mirror in my BZR directory.  I&#8217;m going to take a look at it now.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; ls<br/>
total 0<br/>
0 myBranch/        0 myBranch.mirror/ 0 myRepository/</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myBranch.mirror<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr info<br/>
Standalone tree (format: pack-0.92)<br/>
Location:<br/>
branch root: .</p>
<p>Related branches:<br/>
parent branch: /Users/andrew/Development/BZR/myRepository/myProject/myBranch</p></blockquote>
<p>At this point, it appears that a pushed branch is really no different than a branch that you&#8217;ve made using the branch command.  You can use push and pull to keep the mirror in sync, as long as the branches have not diverged.  A branch is considered to be diverged if there is a check-in in the dest that is not in the source.  You can work around this by merging the dest onto the source prior to running the push, or by using &#8211;overwrite command that will overwrite the information in the target.</p>
<p>One thing I&#8217;m starting to notice is that there are many ways to get to the same place with bazaar.  bzr branch/bzr bind is identical to bzr checkout while bzr checkout/bzr unbind is identical to bzr branch.  I suspect that there are options to checkout/branch/bind/unbind that makes the operations a little more convenient but they really aren&#8217;t dramatically different commands.  I think that push/pull fall into this camp.  I don&#8217;t think they do much that you can&#8217;t accomplish with branch/commit/update, but they may let you think about what you&#8217;re trying to accomplish in a different way.</p>
<p>Below are a number of other commands that I&#8217;ve mentioned but haven&#8217;t really talked much about.  I&#8217;m not going to go through examples, just describe what they do.<br/>
<span id="more-187" ></span><br/>
<h4>bind/unbind</h4>
<p>Bind is used to make a branch behave like a checkout in CVS.  Commits made to the local branch will automatically update the parent branch.  In fact, the commit must succeed on the parent before the commit is allowed to happen locally.  Unbind is the reverse, switch to a mode where all commits are local.  I don&#8217;t know what all of the implications are of binding a diverged branch are.  Perhaps I&#8217;ll cover that later.</p>
<h4>export</h4>
<p>This is a neat command that allows you to &#8220;publish&#8221; your branch to somewhere.  The result is not under version control, it&#8217;s just a copy of your branch suitable for distribution.  The neat thing about this command is that it can export directly into a number of different formats.   For example:</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myBranch.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr export ../foo.tgz</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myBranch.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; cd ..</p>
<p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; ls<br/>
total 8<br/>
8 foo.tgz           0 myBranch/         0 myBranch.branch1/ 0 myBranch.mirror/  0 myRepository/</p>
<p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; tar ztvf foo.tgz<br/>
drwxr-xr-x user/group        0 2009-04-20 22:11:14 foo/myDir/<br/>
-rw-r&#8211;r&#8211; user/group        0 2009-04-20 22:11:14 foo/myDir/test4.txt<br/>
-rw-r&#8211;r&#8211; user/group      142 2009-04-20 22:11:14 foo/test1.txt<br/>
-rw-r&#8211;r&#8211; user/group       60 2009-04-20 22:11:14 foo/test2.txt<br/>
-rw-r&#8211;r&#8211; user/group       30 2009-04-20 22:11:14 foo/test3.txt<br/>
-rw-r&#8211;r&#8211; user/group       20 2009-04-20 22:11:14 foo/test5.txt</p></blockquote>
<p>This is a pretty neat way to package stuff up for deployment or download.  It appears that the export command understand bz2, tar, tgz, and regular directories.</p>
<h4>revno</h4>
<p>This command shows you what revision your branch is on.  Unlike CVS, bazaar seems to verion the entire branch rather than files within the branch.   This has been the strangest thing to get used to with bazaar, and it&#8217;s really not a huge deal.  When you revert a file to a particular revision, what you are saying is revert this file to it&#8217;s state as of version x of the branch.</p>
<h4>revert</h4>
<p>The revert command allows you to roll back changes in a file.  This command also lets you throw away locally made changes that you don&#8217;t want to commit.  bzr help revisionspec contains a ton of information about how to specify a revision in commands that use a full revisionspec (like revert).</p>
<p>I&#8217;ve figured out that push/pull really aren&#8217;t anything special, and added some information on other commands.  This wasn&#8217;t the most detailed post in the world, but I&#8217;m short on time, and wanted to get something posted.  Perhaps I&#8217;ll tackle repository permissions in my next post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/04/bazaar-part-4-push-pull/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bazaar Part 3: Repositories</title>
		<link>http://www.baltdad.com/2009/04/bzr-part3-repositories/</link>
		<comments>http://www.baltdad.com/2009/04/bzr-part3-repositories/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 20:30:41 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[bzr]]></category>

		<guid isPermaLink="false">http://www.baltdad.com/?p=160</guid>
		<description><![CDATA[<p>In the third part of this series on Bazaar I&#8217;m going to spend some time examining repositories.  The docs seem to indicate that these really facilitate sharing branches.  I was going to cover repositories and push/pull, but this seems like enough for now.</p>
Repositories
<p>According to the bzr documentation a repository is nothing more than the database <p>Continue reading <a href="http://www.baltdad.com/2009/04/bzr-part3-repositories/">Bazaar Part 3: Repositories</a></p>]]></description>
			<content:encoded><![CDATA[<p>In the third part of this series on <a href="http://bazaar-vcs.org/"  target="bzr" >Bazaar</a> I&#8217;m going to spend some time examining repositories.  The docs seem to indicate that these really facilitate sharing branches.  I was going to cover repositories and push/pull, but this seems like enough for now.</p>
<h4>Repositories</h4>
<p>According to the <a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#repositories"  target="bzr" >bzr documentation </a>a repository is nothing more than the database that holds all of the branch data.  When you run bzr init, you create a repository within your branch (the .bzr directory).  There is also what the manual calls a shared repository, these are created by the bzr init-repository command.  A shared repository allows multiple branches to share the same database.  This can yield some space savings, as well as keeping everything organized.  I suspect that this organization can aid in keeping a sane permissions model.  We&#8217;ll look at that in a later post though.  For now, let&#8217;s start playing around with repositories.  First I&#8217;ll create a repository.  Remember, myRepository can use any of the <a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-reference/bzr_man.html#url-identifiers"  target="bzr" >remote URI specifications </a>that Bazaar supports.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr init-repository &#8211;no-trees myRepository<br/>
Shared repository (format: pack-0.92)<br/>
Location:<br/>
shared repository: myRepository</p></blockquote>
<p>The &#8211;no-trees option tells init-repository to not create a working-tree of the branches within the repository.  Since we won&#8217;t be working in this directory, the &#8211;no-trees option makes a ton of sense.</p>
<p><span id="more-160" ></span></p>
<p>Looking at the repository directory shows us that it&#8217;s empty, aside form our repository database (the .bzr directory)</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; ls -al myRepository<br/>
total 0<br/>
0 drwxr-xr-x  3   andrew  102 Apr 19 15:54 ./<br/>
0 drwxr-xr-x  4   andrew 136 Apr 19 15:54 ../<br/>
0 drwxr-xr-x  6   andrew  204 Apr 19 15:54 .bzr/</p></blockquote>
<p>Now, lets add our new project to the repository.  First we need to initialize myProject.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr init myProject<br/>
Created a standalone tree (format: pack-0.92)</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr add<br/>
adding myDir<br/>
adding test1.txt<br/>
adding test2.txt<br/>
adding test3.txt<br/>
adding test5.txt<br/>
adding myDir/test4.txt</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr commit -m &#8220;Initial Commit&#8221;<br/>
Committing to: /Users/andrew/Development/BZR/myProject/<br/>
added myDir<br/>
added test1.txt<br/>
added test2.txt<br/>
added test3.txt<br/>
added test5.txt<br/>
added myDir/test4.txt<br/>
Committed revision 1.</p></blockquote>
<p>Now, lets put this branch into the repository.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr branch myProject myRepository/myProject<br/>
Branched 1 revision(s).</p>
<p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; ls -al myRepository<br/>
total 0<br/>
0 drwxr-xr-x  4 andrew   136 Apr 19 16:05 ./<br/>
0 drwxr-xr-x  4 andrew   136 Apr 19 16:04 ../<br/>
0 drwxr-xr-x  6 andrew   204 Apr 19 16:04 .bzr/<br/>
0 drwxr-xr-x  3 andrew   102 Apr 19 16:05 myProject/</p></blockquote>
<p>At this point myRepository/myProject behaves like a normal branch (see previous <a href="http://www.baltdad.com/2009/04/bzr-part-2-branching/"  target="_self" >post</a> about branching).  You can create a local branch from it, commit to it, checkout from it, etc.</p>
<p>The last thing I want to examine is creating branch hierarchies within the repository.  Let&#8217;s see if we can create a sub branch in the repository.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr branch myRepository/myProject myRepository/myProject/myBranch<br/>
Branched 1 revision(s).</p></blockquote>
<p>We&#8217;ve just added myBranch as a sub branch of myProject.  Let&#8217;s see what myRepository looks like.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; tree myRepository<br/>
myRepository<br/>
`&#8211; myProject<br/>
`&#8211; myBranch</p></blockquote>
<p>myBranch is a branch just like any other.  I would imagine that the shared repository is smart enough to merge some of the shared info together to cut down on size and possibly improve performance.  How you organize your repository appears to be a very arbitrary decision.  This is very unlike what I&#8217;m used to in CVS land.  The bzr documentation contains a <a href="http://doc.bazaar-vcs.org/bzr.dev/en/user-guide/index.html#advanced-shared-repository-layouts"  target="bzr" >great writeup</a> of some different repository organization schemes.  That&#8217;s it for now, in the next post I&#8217;ll look at push/pull.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/04/bzr-part3-repositories/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bazaar Part 2: Branching</title>
		<link>http://www.baltdad.com/2009/04/bzr-part-2-branching/</link>
		<comments>http://www.baltdad.com/2009/04/bzr-part-2-branching/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 02:09:00 +0000</pubDate>
		<dc:creator>andrew</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[bzr]]></category>

		<guid isPermaLink="false">http://dogma/wordpress/?p=20</guid>
		<description><![CDATA[<p>After part 1, we know how to create, checkout, and modify a single copy of code.  It&#8217;s almost no different from CVS from a normal user&#8217;s standpoint.  Add, checkout, commit, status, diff, etc. all do pretty much what they do in CVS.  When dealing with a team of developers this can be <p>Continue reading <a href="http://www.baltdad.com/2009/04/bzr-part-2-branching/">Bazaar Part 2: Branching</a></p>]]></description>
			<content:encoded><![CDATA[<p>After part 1, we know how to create, checkout, and modify a single copy of code.  It&#8217;s almost no different from CVS from a normal user&#8217;s standpoint.  Add, checkout, commit, status, diff, etc. all do pretty much what they do in CVS.  When dealing with a team of developers this can be a good thing, as the time spent learning the basics of the new VCS is minimized.  Anyway, on to the point of this post, branching.</p>
<p>As I said in part one I still like the idea of a central branch, a &#8220;HEAD&#8221; if you will.  I think there is also a need for &#8220;official&#8221; branches.  Things like maintenance branches for each release/patch should be managed.  However, I think users should be free to create their own branches for features as needed.  In this post I&#8217;m going to take a look at how bazaar handles branches.</p>
<p>Creating a branch is very simple, you just issue the bzr branch command</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr branch myProject myProject.branch1<br/>
Branched 2 revision(s).</p>
<p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; ls<br/>
total 0<br/>
0 myProject/         0 myProject.branch1/</p></blockquote>
<p>As you can see, the branch operation created a new directory, myProject.branch1.  Again, this would work with local files, remote files (via SFTP, or other protocol) as described in the documentation. Lets take a look at what myProject.branch1 is.</p>
<p><span id="more-21" ></span></p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR<br/>
&gt;&gt;&gt;&gt;&gt;&gt; cd myProject.branch1</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr info<br/>
Standalone tree (format: pack-0.92)<br/>
Location:<br/>
branch root: .</p>
<p>Related branches:<br/>
parent branch: /Users/andrew/Development/BZR/myProject</p></blockquote>
<p>We have a complete copy of myProject, and the info says that our parent branch is myProject.  Seems good.  Let&#8217;s play around with committing.</p>
<p>First, we&#8217;ll make a change in myProject.branch1, commit it, then check to see what happens in the branch and in the parent.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; echo &#8220;Change from myProject.branch1&#8243; &gt;&gt; test1.txt</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr commit -m &#8220;Committing from myProject.branch1&#8243;<br/>
Committing to: /Users/andrew/Development/BZR/myProject.branch1/<br/>
modified test1.txt<br/>
Committed revision 3.</p></blockquote>
<p>We&#8217;ve changed test1.txt and checked it into myProject.branch1.  The new text exists in the branch1 directory.  Let&#8217;s see what happens when we look at baes myProject directory.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr update<br/>
Tree is up to date at revision 2.</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr status</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr info<br/>
Standalone tree (format: pack-0.92)<br/>
Location:<br/>
branch root: .</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; cat test1.txt<br/>
Initial Content<br/>
Line added from a checkout</p></blockquote>
<p>Looks like the base tree doesn&#8217;t know anything about what&#8217;s going on in the branch.  This is what I pretty much expected.  Now, lets make a change in base myProject.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; echo &#8220;This is a change from the base myProject&#8221; &gt;&gt; test1.txt</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr commit -m &#8220;Change made in base myProject&#8221;<br/>
Committing to: /Users/andrew/Development/BZR/myProject/<br/>
modified test1.txt<br/>
Committed revision 3.</p></blockquote>
<p>Now, lets take a look at myProject.branch1</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr update<br/>
Tree is up to date at revision 3.</p></blockquote>
<p>Ok, changes made in myProject don&#8217;t make it to myProject.branch1 with just an update.  Lets try merging myProject down to myProject.branch1.  This is what users in a feature branch would do to get changes from their main branch to stay in sync.  Supposedly a simple bzr merge will merge the parent branch down into the current branch.  Here&#8217;s what happens.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr merge<br/>
Merging from remembered parent location<br/>
/Users/andrew/Development/BZR/myProject/<br/>
M  test1.txt</p>
<p>Text conflict in test1.txt<br/>
1 conflicts encountered.</p></blockquote>
<p>Ooh, we have a conflict.  test1.txt line3 is different between myProject.branch1 and myProject, bzr correctly, does not try to guess what I meant.  So, we have to resolve the conflict.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; ls -al test1*<br/>
8 -rw-r&#8211;r&#8211;      156 Apr  5 18:01 test1.txt<br/>
8 -rw-r&#8211;r&#8211;       43 Apr  5 18:01 test1.txt.BASE<br/>
8 -rw-r&#8211;r&#8211;       84 Apr  5 18:01 test1.txt.OTHER<br/>
8 -rw-r&#8211;r&#8211;       73 Apr  5 18:01 test1.txt.THIS</p></blockquote>
<p>You can find full details on how to deal with conflicts <a href="http://doc.bazaar-vcs.org/bzr.0.92/en/user-guide/conflicts.html" >here</a>. Bascially, test1.txt now looks like this:</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; cat test1.txt<br/>
Initial Content<br/>
Line added from a checkout<br/>
&lt;&lt;&lt;&lt;&lt;&lt;&lt; TREE<br/>
Change from myProject.branch1<br/>
=======<br/>
This is a change from the base myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; MERGE-SOURCE</p></blockquote>
<p>.BASE contains the previous  previous version, .THIS contains the current version in this branch, .OTHER contains the current version in the parent.  We just need to edit test1.txt and mark the conflict as resolved.  After test1.txt is edited, we have to tell bzr that the conflict has been resolved.  According to the documentation bzr is smart enough to know which files you&#8217;ve resolved conflicts in and which ones you haven&#8217;t.  So I&#8217;m going to go ahead and run bzr resolve</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr resolve<br/>
All conflicts resolved.</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr status<br/>
modified:<br/>
test1.txt<br/>
pending merge tips: (use -v to see all merge revisions)<br/>
Andrew 2009-04-05 Change made in base myProject</p></blockquote>
<p>bzr resolve has also removed all of the .BASE/.OTHER/.THIS files.  bzr status tells us that we have a pending merge.  I&#8217;m going to go ahead and commit.</p>
<p>Now, say we&#8217;ve made a bunch of changes on our branch that need to be put into our main repository myProject.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; echo &#8220;New file in branch1&#8243; &gt;&gt; test5.txt</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; echo &#8220;Change from branch1&#8243; &gt;&gt; test2.txt</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; echo &#8220;Another change from branch1&#8243; &gt;&gt; test1.txt</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject.branch1<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr add test5.txt<br/>
adding test5.txt</p></blockquote>
<p>We&#8217;ve added test5.txt and made some changes in test1.txt and test2.txt.  Lets get those changes up to myProject.</p>
<blockquote  style="background:#F4F4F4; font-family:'Lucida Console'background:#F4F4F4; font-family:'Lucida Console'CourierCouriermonospace; border: 1px solid black; padding-left: 10px;monospace; border: 1px solid black; padding-left: 10px;"><p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr merge ../myProject.branch1<br/>
+N  test5.txt<br/>
M  test1.txt<br/>
M  test2.txt<br/>
All changes applied successfully.</p>
<p>[andrew karma] /Users/andrew/Development/BZR/myProject<br/>
&gt;&gt;&gt;&gt;&gt;&gt; bzr status<br/>
added:<br/>
test5.txt<br/>
modified:<br/>
test1.txt<br/>
test2.txt<br/>
pending merge tips: (use -v to see all merge revisions)<br/>
Andrew 2009-04-05 Changes from branch1 for merge to myProject</p></blockquote>
<p>Since we don&#8217;t have a parent branch, we needed to tell merge where to merge from. bzr status tells us what&#8217;s changed. No conflicts this time, we&#8217;ll go ahead and commit.  At this point, both myProject and myProject.branch1 are identical.  Which is what we kind of wanted.</p>
<p>That&#8217;s it for branching.  I don&#8217;t know what I&#8217;ll do for the next post yet.  I&#8217;m thinking either showing how to handle remote stuff, delving into what repositories are, or looking at how to handle authentication and permissions.  Anyway, if you like this let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.baltdad.com/2009/04/bzr-part-2-branching/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
