<?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>infotexture</title>
	<atom:link href="http://blog.infotexture.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.infotexture.net</link>
	<description>Technical Communication &#38; Information Design</description>
	<lastBuildDate>Tue, 08 Jun 2010 12:36:02 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Accessible Documentation</title>
		<link>http://blog.infotexture.net/2010/06/03/accessible-documentation/</link>
		<comments>http://blog.infotexture.net/2010/06/03/accessible-documentation/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 21:22:46 +0000</pubDate>
		<dc:creator>roger</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Standards]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[S5]]></category>

		<guid isPermaLink="false">http://blog.infotexture.net/?p=321</guid>
		<description><![CDATA[I was recently asked to give a presentation on the relationship between technical documentation and accessibility for an event held at the University of Applied Sciences here in Potsdam.

The event was organized by the Institute for Information and Documentation (IID) in the Faculty of Information Science and supported by the German-Austrian office of the World [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently asked to give a presentation on the relationship between technical documentation and accessibility for an event held at the <em>University of Applied Sciences</em> here in Potsdam.</p>

<p>The <a href="http://www.iid.fh-potsdam.de/4554.html">event</a> was organized by the <em>Institute for Information and Documentation</em> (IID) in the Faculty of Information Science and supported by the German-Austrian office of the <em>World Wide Web Consortium</em> (<a href="http://www.w3.org/">W3C</a>).</p>

<p>In the German words of the organizers:</p>

<blockquote>
  <p>Die Veranstaltung gibt einen Überblick über die Grundlagen der Barrierefreiheit in der technischen Dokumentation. Dabei stellt das Seminar auch die speziellen Anforderungen an zugängliche Dokumente aus der Sicht der Betroffenen als entscheidende Experten in eigener Sache dar.</p>
</blockquote>

<p>My role was to describe the environment in which technical documentation is created and provide an overview of current “best practices” in technical documentation that provide a foundation for accessible documents.</p>

<p>My main point was that accessibility need not be viewed as an expensive afterthought tacked on for the benefit of a minority, but rather as a natural byproduct of documentation done well. This borrows from the concept of “<a href="http://en.wikipedia.org/wiki/Universal_design">universal design</a>” in that the same best practices used to produce good documentation also provide a solid foundation for accessibility – built-in for the benefit of all users.</p>

<p>In keeping with one of the most important principles in information design – the separation of content and presentation – I prepared my slides using a plain text file in <a href="http://daringfireball.net/projects/markdown/">Markdown</a> format and converted to XHTML for presentation via the <em>Simple Standards-based Slide Show System</em> (<a href="http://meyerweb.com/eric/tools/s5/">S5</a>).</p>

<p>If you&#8217;d like to see the slides <em>(in German)</em>, an archive of the source file and XHTML output is available <a href="http://blog.infotexture.net/wp-content/uploads/2010/06/accessible-documentation.zip">here</a>. The S5 file is the plain text version that can be opened in any text editor. The HTML version contains the slides as they were presented <em>(requires a standards-compliant browser such as Chrome, Firefox or Safari, with JavaScript enabled)</em>.</p>

<h2>Recommended Reading</h2>

<p>For more information on universal design, PDF accessibility, and issues with the latest version of the <em>Web Content Accessibility Guidelines</em>, the following articles on <em>A List Apart</em> are a good place to start:</p>

<ul>
<li><a href="http://www.alistapart.com/articles/the-inclusion-principle/">The Inclusion Principle</a></li>
<li><a href="http://www.alistapart.com/articles/pdf_accessibility/">Facts and Opinions About PDF Accessibility</a></li>
<li><a href="http://www.alistapart.com/articles/tohellwithwcag2/">To Hell with WCAG 2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.infotexture.net/2010/06/03/accessible-documentation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Roundtripping Versions: How to Git to SVN (and Back Again)</title>
		<link>http://blog.infotexture.net/2010/02/10/roundtripping-versions-how-to-git-to-svn-and-back-again/</link>
		<comments>http://blog.infotexture.net/2010/02/10/roundtripping-versions-how-to-git-to-svn-and-back-again/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 19:10:20 +0000</pubDate>
		<dc:creator>roger</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Cornerstone]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[versioning]]></category>

		<guid isPermaLink="false">http://blog.infotexture.net/?p=308</guid>
		<description><![CDATA[&#8230; An Edge Case Tutorial for the Obsessed

This post proposes an arcane Goldbergian solution to a problem you may not have. It’s about version control software and a way to use a single folder on your computer as both a Git repository and a Subversion working copy.

If that confuses you, chances are you’ve got something [...]]]></description>
			<content:encoded><![CDATA[<p><em>&#8230; An Edge Case Tutorial for the Obsessed</em></p>

<p>This post proposes an arcane Goldbergian solution to a problem you may not have. It’s about version control software and a way to use a single folder on your computer as both a Git repository and a Subversion working copy.</p>

<p>If that confuses you, chances are you’ve got something better to do with your time. <em>Honestly.</em> If Google brought you here while you were planning your vacation, you’ll need to tweak your search query and try again.</p>

<p>If you’re still with me, you probably came here looking for trouble, so grab a cup of your favorite beverage and read on to see how <em>(and why)</em> you might want to consider this hybrid hyper-versioning setup.</p>

<h2>Background</h2>

<p><img src="http://blog.infotexture.net/wp-content/uploads/2010/02/GitLogo.png" alt="GitLogo.png" border="0" width="73" height="282" align="left" />Many high-profile software projects have begun to switch from centralized version control systems (VCSs) to distributed solutions such as <a href="http://git-scm.com/">Git</a>. There are many good <a href="http://whygitisbetterthanx.com/">reasons</a>  which are beyond the scope of this post, but offline access is one of the most compelling motivations. With Git you can work offline while traveling, for example, or stay productive when your client’s flaky VPN goes AWOL again&#8211;<em>sound familiar, anyone?</em> </p>

<p>You can develop away in the seclusion of a remote mountain getaway and push your changes upstream when you <em>(or the servers)</em> return to the grid. Once you get used to this workflow, it’s pretty hard to go back to the centralized approach.</p>

<p>Many distributed VCSs such as <a href="http://bazaar.canonical.com/">Bazaar</a> or <a href="http://mercurial.selenic.com/">Mercurial</a> can import existing Subversion repositories and provide offline access to project history and other version-control goodies, but it’s usually a one-way street&#8211;there’s no way back. In many cases, however, switching to another VCS is simply not an option&#8211;especially if you don’t own the repository you’re contributing to <em>(hello, freelancers)</em>.</p>

<p>This is one of Git’s greatest strengths: you can actively participate in ongoing development hosted on a remote Subversion repository using the git-svn bridge as a Subversion client. You can push any local changes you’ve made in Git back to Subversion, and pull in updates from the SVN server to your local Git repository, ready for your next weekend workfest at the cottage. Your teammates continue on in Subversion, blissfully unaware of your extra-subversive affair.</p>

<blockquote>
  <p>“OK, so I get the Git thing, but why combine the two?”</p>
</blockquote>

<p>If git-svn is the <a href="http://progit.org/book/ch8-1.html">gateway drug</a> that gets you hooked on Git, think of this approach as a sort of methadone &#8212; a substitute drug for recovering Subversion addicts.</p>

<p>Maybe you’ve gotten attached to one of those slick Subversion frontends like <a href="http://www.versionsapp.com/">Versions</a> or <a href="http://www.zennaware.com/cornerstone/">Cornerstone</a> or an uglier, practical cross-platform cousin such as <a href="http://www.syntevo.com/smartsvn/">SmartSVN</a> or the <a href="http://www.syncrosvnclient.com/">Syncro SVN Client</a> included in <a href="http://www.oxygenxml.com/">&lt;oXygen/&gt;</a>. Maybe you just really like to rename files in a GUI &amp; commit without hunting for a cheat sheet of command-line syntax. Maybe you find it really annoying that Git leaves empty folders strewn around your disk when you remove their children.</p>

<p>Whatever the reason, if you’re working [in|for] a Subversion shop, you might want to keep an SVN working copy around just in case you need it.</p>

<blockquote>
  <p>“But do I really want two sets of project files on my computer?”</p>
</blockquote>

<p>No.</p>

<blockquote>
  <p>“Wasn’t version control supposed to prevent this kind of insanity?”</p>
</blockquote>

<p>Yes.</p>

<h2>A Word of Caution</h2>

<p>The solution I’m suggesting here is not for the faint of heart. Purists from both the Git and Subversion camps would surely consider the following folly at best, and perhaps even a <strong>Really-Bad-Idea<sup>®</sup></strong>.</p>

<p><em>(If you do decide to try this at home, please remember to wash your hands afterwards&#8230;)</em></p>

<h2>The Proposal</h2>

<p>The basic idea is to create a new local Git repository by importing the contents of the remote Subversion repository and then move Git’s tracking data to an existing SVN working copy on your computer: “<a href="http://xentek.net/articles/513/one-working-copy-to-rule-them-all-git-svn/">one working copy to rule them all</a>.”</p>

<p>We&#8217;ll throw in a few extra hooks for convenience, but more on that later. Here&#8217;s how we start:</p>

<ol>
<li><a href="http://learn.github.com/p/git-svn.html">Clone the remote Subversion repository</a> to a new folder on your computer with a command such as:
<code>$ git svn clone --prefix svn/ -s &lt;svnrepo&gt; --authors-file=users.txt</code>    </li>
<li>Copy the <code>.git/</code> subfolder with the tracking metadata from your new Git repository to your SVN working copy.</li>
<li>In Subversion, add <code>.git</code> to the <code>svn:ignore</code> properties (or global ignore).</li>
<li>Tell Git to exclude <code>.svn/</code> folders with <code>.gitignore</code>, or set the <code>core.excludesfile</code> property in your global Git config.</li>
</ol>

<p>Now Git treats the project folder as a local repository with a remote tracking branch that syncs with the Subversion server and SVN still sees that very same folder as a working copy. Each is delightfully unaware of the other’s presence.</p>

<p><em>At least in theory&#8230;</em></p>

<h2>And Here There be Dragons</h2>

<p>Because neither Git nor Subversion expect anyone else to be mucking about with their pristine files, any time you commit with either Git or Subversion, the other will complain that the fileset in your working folder has been modified <em>(until you pat them on the head and tell them that everything is OK)</em>. </p>

<p>For example, if you make changes, commit them in Git and push the revised content upstream via <code>git svn dcommit</code>, the tracked files in the working copy are current, but SVN looks at the last committed state of each file in the <code>.svn/text-base/</code> area and thinks they’re dirty, since it doesn’t yet know that the files have since been updated in the remote repository.</p>

<p>Likewise, Git views files as dirty after any SVN commits. Both systems are purposely careful about clobbering any locally modified files with stuff from the server <em>(and rightly so, but in our case, we know it&#8217;s OK)</em>.</p>

<p><em>So what to do?</em></p>

<p>Essentially, we have to tell each VCS to disregard any files in the working copy that it thinks are modified, and get the latest changes from the remote Subversion repository anyway.</p>

<p>In Git’s case, that’s:</p>

<pre><code>$ git checkout HEAD --force
$ git svn rebase 
</code></pre>

<p>If your last commit was in Git, and you want Subversion to catch up, use:</p>

<pre><code>$ svn revert
$ svn update
</code></pre>

<p>But all this manual bunnystomping gets tedious quickly, so we need a way to automate it.</p>

<p><em>Enter hooks.</em></p>

<h2>The Solution</h2>

<p>Both Subversion and Git support so-called “hook” scripts. These scripts can be set to run whenever certain events take place, such as right before a commit (<code>pre-commit</code> hook) or right afterwards (<code>post-commit</code>).</p>

<p>We can take advantage of these and similar mechanisms to automatically update the status information of one VCS when we commit with the other.</p>

<h3>SVN Hooks vs. Client-Side Actions</h3>

<p>In Subversion, hooks are associated with the repository, which means any hooks defined there affect all users of the repository. Normally, that&#8217;s a good thing, but we don&#8217;t want that now.</p>

<p><img src="http://blog.infotexture.net/wp-content/uploads/2008/07/cornerstone-app.png" alt="cornerstone-app.png" border="0" width="128" height="128" align="right" />Instead, we want a script that will run locally any time we commit to this particular Subversion repository, but that won&#8217;t affect any other users. This is one area where <a href="http://www.zennaware.com/cornerstone/">Cornerstone</a> shines: <strong>“Client-Side Post-Commit Actions”</strong>. This Cornerstone feature allows us to call a shell script to automatically perform operations after committing changes to the repository <em>(just select a script file in the commit view and it will run when the commit completes)</em>.</p>

<p>So we could set up a script to force a checkout of <code>HEAD</code> and then rebase from SVN as suggested above. </p>

<p>But there&#8217;s actually a more elegant <em>(and safer)</em> way to deal with the modified files in the working copy before rebasing. Just in case any of the changes were important, we can use <code>git stash</code> to save any modified tracked files and staged changes to a temporary branch, so we can restore them later if necessary.</p>

<pre><code>git stash save "Changes stashed before rebase by SVN post-commit script"
git svn rebase
</code></pre>

<p>Actually, in a post-commit script you&#8217;ll need to specify the absolute path to your Git binaries, but that path might not be the same on your system as on mine. You can copy my script and adjust the paths for your system &#8212; <a href="http://gist.github.com/300214">get the gist of it here</a>. </p>

<h3>Git Hooks vs. Aliases</h3>

<p>In Git, we could use the standard hook mechanism, since the local repository is our own and any hooks we define there won&#8217;t affect anyone else. (Even if the repository is later cloned, hooks aren&#8217;t replicated this way, so we&#8217;re safe.)</p>

<p>But as of this writing (Git v1.6.6.1), there isn&#8217;t a dedicated <code>post-dcommit</code> hook, and in fact no hooks are currently run directly by <code>git svn</code>. However,  <code>dcommit</code> uses git-rebase internally, so git-rebase can run the pre-rebase hook. But that would affect any rebase operation in our repository, which might have unintended side effects.</p>

<p>In general, Git proponents recommend treating hooks as a last resort to be used only if there is no other way to accomplish the task. But in our case, there is.</p>

<p>Since all we want to do is run two simple Subversion commands whenever we run a certain Git command, we can set up a shell alias (in <code>~/.bash_profile</code>) to customize Git&#8217;s behavior and use that instead of the standard Git command.</p>

<p>Enter this all on one line <em>(I&#8217;ve broken it up here for readability):</em></p>

<pre><code>alias svnpush="git svn dcommit;
               /usr/local/bin/svn revert --recursive .;
               /usr/local/bin/svn update --force"
</code></pre>

<p class=note><strong>Note: </strong>In the alias example above, I&#8217;ve hardcoded the absolute path to my preferred SVN package. Subversion may be installed elsewhere on your system. You can find out where by entering <tt>which svn</tt> at the command line prompt.</p>

<p>This alias creates a “virtual” command called <code>svnpush</code> <em>(you could call it anything)</em>, which will run the git command <code>svn dcommit</code> followed by the subversion commands <code>revert</code> and <code>update</code>. (The <code>--recursive</code> and <code>--force</code> options ensure that all files are updated from the server, regardless of what&#8217;s in the way.)</p>

<p>Now we can use the new command <code>svnpush</code> to run all three commands at once. Any time we use this alias, our latest Git commits are sent to the upstream Subversion server and the contents of the <code>.svn</code> subdirectories in the working copy are updated to reflect the newer state in the remote repository.</p>

<p><em>That&#8217;s it!</em> </p>

<p>Now we get all the Git goodness and can still fall back on our Subversion habits if we feel so inclined.</p>

<p>Certainly one day graphical frontends will arise to make Git versioning more accessible to newcomers and provide better usability for users of all levels. A few are available today, but they have a long way to go before they provide full coverage of the command-line operations and mature to the level we&#8217;re used to in the Subversion ecosystem.</p>

<p>At the moment, the field is still wide open for a well-crafted interface that&#8217;s polished enough to bring the power of Git to the masses. Any takers? <em>Panic? Sofa? Zennaware?</em> Until then, with this setup we can continue using the fine Subversion tools we have now and get acquainted with the raw power of Git&#8217;s command line when necessary. </p>

<p>If you&#8217;d like to learn more about Git, I highly recommend <a href="http://github.com/tswicegood/">Travis Swicegood</a>&#8217;s excellent book entitled <em>“<a href="http://www.pragprog.com/titles/tsgit/pragmatic-version-control-using-git">Pragmatic Version Control Using Git</a>.”</em></p>

<p>If you have any questions or comments about this technique, feel free to leave a comment below.</p>

<hr />
]]></content:encoded>
			<wfw:commentRss>http://blog.infotexture.net/2010/02/10/roundtripping-versions-how-to-git-to-svn-and-back-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snow Leopard Services: Set ZIP File Date</title>
		<link>http://blog.infotexture.net/2009/11/22/snow-leopard-services-set-zip-file-date/</link>
		<comments>http://blog.infotexture.net/2009/11/22/snow-leopard-services-set-zip-file-date/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 20:05:15 +0000</pubDate>
		<dc:creator>roger</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Automator]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[zip]]></category>

		<guid isPermaLink="false">http://blog.infotexture.net/?p=305</guid>
		<description><![CDATA[One of the more popular posts on this site is an entry from October of 2007 on creating a ZIP archive and setting the modification date via an Automator workflow. 

As I wrote then:


  “&#8230;when you’re archiving older data, it’s much more useful for the ZIP file date to reflect the date of its [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.infotexture.net/wp-content/uploads/2009/11/advanced-preferences-icon.png" alt="advanced-preferences-icon.png" border="0" width="32" height="32" align="right" />One of the more popular posts on this site is an entry from October of 2007 on <a href="http://blog.infotexture.net/2007/10/18/automator-workflow-set-zip-file-date/">creating a ZIP archive and setting the modification date</a> via an <a href="http://www.macosxautomation.com/automator/">Automator</a> workflow. </p>

<p>As I wrote then:</p>

<blockquote>
  <p>“&#8230;when you’re archiving older data, it’s much more useful for the ZIP file date to reflect the date of its contents, since a few years from now you probably won’t care when you compressed the stuff, but rather how old the files inside are.”</p>
</blockquote>

<p>With Mac OS 10.6 <em>Snow Leopard,</em> this same workflow can be set up to run as a service, accessible from the context menu in any Finder window. The process is essentially the same as described in the <a href="http://blog.infotexture.net/2007/10/18/automator-workflow-set-zip-file-date/">original post</a>, with the following adjustments:</p>

<p>To create the workflow,</p>

<ol>
<li>Open <code>/Applications/Automator.app</code>, select the <strong>Service</strong> template and click <strong>Choose</strong>.</li>
<li>At the top of the workflow area on the right side of the window, change the first list option to <strong>files or folders</strong>.</li>
<li>From the <strong>Finder</strong> library, drag the <strong>Create Archive</strong> action to the workflow area. In the action settings, specify the default name and location for the archive file. <em>(I prefer the same name &amp; folder as the input, but you can set the <strong>Options</strong> to prompt for this information when the workflow runs.)</em></li>
<li>From the <strong>Automator</strong> library, add the <strong>Run Shell Script</strong> action.
Leave the <strong>Shell</strong> set to <code>/bin/bash</code>, set <strong>Pass input</strong> to <code>as arguments</code>, and replace the default script in the text box with <code>zip -o "$@"</code>.</li>
</ol>

<p>Save the workflow as a service, and you can run it on files &amp; folders in the Finder by Control-clicking and choosing your new command from the <strong>Services</strong> submenu in the shortcut menu.</p>

<p class="note"><strong>Note:</strong> To create a service that will set the date for existing ZIP files, skip Step 3 above.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.infotexture.net/2009/11/22/snow-leopard-services-set-zip-file-date/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Think Twice Before Firing Editors</title>
		<link>http://blog.infotexture.net/2009/11/11/think-twice-before-firing-editors/</link>
		<comments>http://blog.infotexture.net/2009/11/11/think-twice-before-firing-editors/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:23:53 +0000</pubDate>
		<dc:creator>roger</dc:creator>
				<category><![CDATA[Miscellanea]]></category>
		<category><![CDATA[editing]]></category>

		<guid isPermaLink="false">http://blog.infotexture.net/?p=292</guid>
		<description><![CDATA[ In a move that seems to epitomize the recent decline of the newspaper industry, last week the Toronto Star decided to let go of a hundred members of its pre-publishing and editorial divisions.

One of the scorned staffers channeled the energy set free by the mass layoff into a vengeant act of copy editing that [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.infotexture.net/wp-content/uploads/2009/11/firing-editors-memo-300.png" alt="firing-editors-memo-300.png" border="0" width="300" height="392" align="left" /> In a move that seems to epitomize the recent decline of the newspaper industry, last week the <em>Toronto Star</em> decided to let go of a hundred members of its pre-publishing and editorial divisions.</p>

<p>One of the scorned staffers channeled the energy set free by the mass layoff into a <a href="http://torontoist.com/2009/11/disgruntled_star_editor_takes_revenge.php">vengeant act of copy editing</a> that very literally underscores just how desperately the paper needs the editors it plans to fire. <strong>Brilliant!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.infotexture.net/2009/11/11/think-twice-before-firing-editors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
