<?xml version="1.0"?>
<rss version="2.0"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/" >
<channel>
<title>tychoish</title>
<link>http://tychoish.com/</link>
<description>tychoish</description>
<item>
	
	<title>Allowable Complexity</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/allowable-complexity/</guid>
	
	<link>http://tychoish.com/rhizome/allowable-complexity/</link>
	
	
	<category>/tag/systems-administration</category>
	
	<category>/tag/technical-writing</category>
	
	
	<pubDate>Fri, 03 Feb 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-02-03T16:32:12Z</dcterms:modified>
	
	<description>&lt;p&gt;I&#39;m not sure I&#39;d fully realized it before, but the key problems in
systems administration--at least the kind that I interact with the
most--are really manifestations of a tension between complexity and
reliability.&lt;/p&gt;

&lt;p&gt;Complex systems are often more capable flexible, so goes the
theory. At the same time, complexity often leads to operational
failure, as a larger number of moving parts leads to more potential
points of failure. I think it&#39;s an age old engineering problem and I
doubt that there are good practical answers.&lt;/p&gt;

&lt;p&gt;I&#39;ve been working on this writing project where I&#39;ve been exploring a
number of fundamental systems administration problem domains, so this
kind of thing is on my mind. It seems, that the way to address the
hard questions often come back to &quot;what are the actual requirements,
and are you willing to pay the premiums to make the complex systems
reliable?&quot;&lt;/p&gt;

&lt;p&gt;Trade-offs around complexity also happen in software development
proper: I&#39;ve heard more than a few developers talk in the last few
months weigh the complexity of using dynamic languages like Python for
very large scale projects. While the quests and implications manifest
differently for code, it seems like this is part of the same problem.&lt;/p&gt;

&lt;p&gt;Rather than prattle on about various approaches, I&#39;m just going to
close out this post with a few open questions/thoughts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What&#39;s the process for determining requirements that accounts for
actual required complexity?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do things that had previously been complex, become less complex?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Perhaps someone just has write the code in C or C++ and let it
mature for a few years before administrators accept it as stable&lt;/em&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there an corresponding level of complexity threshold in software
development and within software itself? (Likely yes,) and is it
related to something intrinsic to particular design patterns, or to
tooling (i.e. programming language implementations, compilers, and
so forth.)&lt;/p&gt;

&lt;p&gt;Might better developer tooling allow us to programs of larger scope
in dynamic languages (perhaps?)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reader submitted questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Your questions here.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Answers, or attempts thereat &lt;span class=&quot;createlink&quot;&gt;&lt;a href=&quot;http://tychoish.com/ikiwiki.cgi?page=discourse&amp;amp;from=rhizome%2Fallowable-complexity&amp;amp;do=create&quot; rel=&quot;nofollow&quot;&gt;?&lt;/a&gt;on the discussion page&lt;/span&gt;.&lt;/p&gt;
</description>
	
	
</item>
<item>
	
	<title>Persistent Emacs Daemons</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/persistent-emacs-daemons/</guid>
	
	<link>http://tychoish.com/rhizome/persistent-emacs-daemons/</link>
	
	
	<category>/tag/emacs</category>
	
	
	<pubDate>Thu, 02 Feb 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-02-02T17:39:25Z</dcterms:modified>
	
	<description>&lt;p&gt;I&#39;ve been subject to a rather annoying emacs bug for
months. Basically, when you start emacs with the &lt;code&gt;--daemon&lt;/code&gt; switch,
and the X11 session exits, &lt;em&gt;and&lt;/em&gt; any emacs frames are open, then the
emacs process dies. No warning. The whole point, to my mind, of the
daemon mode is to allows emacs sessions to persist beyond the current
X11 session.&lt;/p&gt;

&lt;p&gt;This shouldn&#39;t happen. I think
&lt;a href=&quot;http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-04/msg00261.html&quot;&gt;this&lt;/a&gt;
is the relevant bug report, but I seem to remember that the issue has
something to do with the way that &lt;a href=&quot;http://www.gtk.org/&quot;&gt;GTK&lt;/a&gt; interacts
with the X11 session and emacs&#39;s frames. It&#39;s something of a deadlock:
the GTK has no real need to fix the bug (and/or it&#39;s a behavior that
they rely on for other uses,) and it might not really be possible or
feasible for emacs to work around this issue.&lt;a id=&quot;fnref:source&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also think that it&#39;s probably fair to say that daemon mode
represent a small minority all emacs usage.&lt;/p&gt;

&lt;p&gt;Regardless, I&#39;ve figured out the workaround:&lt;/p&gt;

&lt;p&gt;.. don&#39;t use GTK.&lt;/p&gt;

&lt;p&gt;Turns out, it&#39;s totally possible to build
&lt;a href=&quot;http://gnu.org/s/emacs&quot;&gt;GNU emacs&lt;/a&gt; without GTK, by using the &quot;Lucid&quot;
build. Which is to say, use the windowing system kit built for Lucid
Emacs (i.e. XEmacs,) rather than GTK. I was able, using the code
below, to get an emacs experience with the new build that seems
identical&lt;a id=&quot;fnref:exception&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt; to the one I used to get with GTK, except
without the frustrating crashes every time that X11 spazzed when I
decided to unplug a monitor or some such. A welcome improvement,
indeed.&lt;/p&gt;

&lt;p&gt;The following emacs-lisp covers all of the relevant configuration of
the &quot;look and feel&quot; of my emacs session. Install the
&lt;a href=&quot;http://levien.com/type/myfonts/inconsolata.html&quot;&gt;Inconsolata&lt;/a&gt; font if
you haven&#39;t already, you&#39;ll be glad you did.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; (setq-default inhibit-startup-message &#39;t
               initial-scratch-message &#39;nil
               save-place t
               scroll-bar-mode nil
               tool-bar-mode nil
               menu-bar-mode nil
               scroll-margin 0
               indent-tabs-mode nil
               flyspell-issue-message-flag &#39;nil
               size-indication-mode t
               scroll-conservatively 25
               scroll-preserve-screen-position 1
               cursor-in-non-selected-windows nil)

 (setq default-frame-alist &#39;((font-backend . &quot;xft&quot;)
                             (font . &quot;Inconsolata-14&quot;)
                             (vertical-scroll-bars . 0)
                             (menu-bar-lines . 0)
                             (tool-bar-lines . 0)
                             (alpha 86 84)))

 (tool-bar-mode -1)
 (scroll-bar-mode -1)
 (menu-bar-mode -1)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Hope this helps you and/or anyone else that might have run into this
problem.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;

&lt;li id=&quot;fn:source&quot;&gt;&lt;p&gt;I&#39;d like to add the citation and more information here, but
can&#39;t find it.&lt;a class=&quot;reversefootnote&quot;&gt;&amp;#160;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li id=&quot;fn:exception&quot;&gt;&lt;p&gt;To be fair, I mostly don&#39;t use the GUI elements in
emacs, though having emacs instances outside of the terminal is nice
for displaying images when using emacs-w3m, and for having a little
bit of additional display flexibility for some more rich modes.&lt;a class=&quot;reversefootnote&quot;&gt;&amp;#160;&amp;#8617;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;
</description>
	
	
</item>
<item>
	
	<title>The Laptop Riser that Changed My Life</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/the-laptop-riser-that-changed-my-life/</guid>
	
	<link>http://tychoish.com/rhizome/the-laptop-riser-that-changed-my-life/</link>
	
	
	<category>/tag/productivity</category>
	
	<category>/tag/technology</category>
	
	
	<pubDate>Wed, 01 Feb 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-02-01T20:43:17Z</dcterms:modified>
	
	<description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;tl;Dr&amp;gt;&lt;/em&gt;&lt;/strong&gt; I got one of those nifty laptop risers that puts your
laptop up closer to eye level, and it has pretty much improved all of
my interactions with computers a thousand fold &lt;em&gt;and&lt;/em&gt; it&#39;s made it
possible for me to effectively use two screens. This post explores
this.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;One of my coworkers had a laptop stand she wasn&#39;t using and I asked to
borrow it for an afternoon, and my neck stopped hurting. I never
thought my neck hurt before, but apparently it does.&lt;/p&gt;

&lt;p&gt;Or did.&lt;/p&gt;

&lt;p&gt;But there&#39;s more: for years now I&#39;ve kept an extra monitor around (and
had one at work) but the truth is that I have never really felt like
I&#39;ve been able to get the most out of an external monitor.&lt;/p&gt;

&lt;p&gt;Somehow, putting my laptop 4 inches in the air was the little change
that made everything better. The laptop is generally on the left of
the external monitor, and I have task lists, notes buffers, the chat
window, and my status logging window on the laptop, and then three
windows on the external (emacs buffer, terminal, emacs buffer) on the
right. My primary focus centers between the monitors, but probably
edges slightly toward the external, most of the time.&lt;/p&gt;

&lt;p&gt;Also, I discovered that I--apparently--have a slight
processing/attention defect whereby I find it painful and difficult to
focus on things that are happening on the right side of the screen for
any amount of time. Which is weird because my right eye has always
been noticeably stronger. I&#39;ll ponder this more later.&lt;/p&gt;

&lt;p&gt;My virtual desktops for email and web browsing are a bit less rigid,
but the same basic idea. Somehow it seems to work. I&#39;ve done a little
bit of work recently to get the layouts right, to minimize the impact
of the window management of most context switching (scripting various
transitions, saving layouts, etc.) In all things are going great.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;It strikes me that I&#39;ve not posted here even a little about my setup
in a while. The truth is that it&#39;s not terribly surprising and I&#39;ve
not changed very much recently. I&#39;m back to one laptop, and as anxious
as having one laptop makes me sometimes (I fear the lack of
redundancy,) not having to keep it synced makes life easier. I&#39;ve put
some time into doing a little bit of polish on all of little bits of
configuration/code that I have that makes my computing world go
around, but mostly it&#39;s pretty good.&lt;/p&gt;

&lt;p&gt;It&#39;s nice, and I&#39;d write more about it, but I want to get back to
getting things done around here. Exporting and exploring some of this
stuff in greater depth is definitely on my list, so hang in there, and
if there&#39;s something you particularly want to see, &lt;span class=&quot;createlink&quot;&gt;&lt;a href=&quot;http://tychoish.com/ikiwiki.cgi?page=discourse&amp;amp;from=rhizome%2Fthe-laptop-riser-that-changed-my-life&amp;amp;do=create&quot; rel=&quot;nofollow&quot;&gt;?&lt;/a&gt;be in touch&lt;/span&gt;.&lt;/p&gt;
</description>
	
	
</item>
<item>
	
	<title>Retrospectives in 2011 Work Spacetime</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/retrospectives-in-2011-work-spacetime/</guid>
	
	<link>http://tychoish.com/rhizome/retrospectives-in-2011-work-spacetime/</link>
	
	
	<category>/tag/meta</category>
	
	<category>/tag/update</category>
	
	
	<pubDate>Thu, 26 Jan 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-01-26T22:01:37Z</dcterms:modified>
	
	<description>&lt;p&gt;For the most part, I&#39;m quite happy with everything that I was able to
accomplish last year. I&#39;ve moved cities (for the second year in a row)
and last year I changed jobs &lt;em&gt;twice&lt;/em&gt;: in both cases, I think the
current will stick for a while. And I&#39;m working on other projects,
with some impressive speed. Last year wasn&#39;t been great for finishing
things, but I guess there&#39;s room for improvement this year.&lt;/p&gt;

&lt;p&gt;After a fair amount of professional angst I&#39;m finally doing pretty
much exactly what I want to be doing: I&#39;m writing a substantial/total
revision of a software manual for a company developing an open source
database system. I&#39;ll leave you to figure out the details, but it&#39;s
great.&lt;/p&gt;

&lt;p&gt;A couple years ago, I said to myself, that I wanted to be a &quot;real
technical writer,&quot; which is to say, work with engineering teams, write
documentation and tutorials for a single product or group of products,
and operate on a regular release schedule. I&#39;ve done a great deal of
writing for technology companies: from project proposals and
journalism, to tutorials and content for distributors, to white
papers, marketing, and sales materials. Delightfully, I&#39;ve managed to
get there, and in retrospect it&#39;s both somewhat amazing, and
incredibly delightful.&lt;/p&gt;

&lt;p&gt;A while back, I had dinner with a friend who&#39;s been doing the same
thing I do for a long time (we know each other through folk dance and
singing,) and by comparing our experiences it was great to learn that
my experience is quite typical, both in terms of the work I&#39;m doing
and the procedural engineering practice frustrations (e.g. &quot;&lt;em&gt;What do
you mean you changed the interface without telling me?!?!&lt;/em&gt;&quot;)&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;At work we have this thing where we send in an account of what we did
during the day so that other people know what we&#39;re working on, and so
that we can keep our team on the same page. After all, when you&#39;re all
looking at computer screens all day, and in a few different time
zones, it&#39;s easy to loose track of what people are working on.&lt;/p&gt;

&lt;p&gt;At the bottom of these emails, we&#39;re prompted to ask &quot;what are your
blockers and impediments.&quot; Often I say something clever like &quot;Compiler
issue with Spacetime interface or Library.&quot; Or something to that
effect. It feels like a good description of the last year.&lt;/p&gt;

&lt;p&gt;Onward and Upward!&lt;/p&gt;
</description>
	
	
</item>
<item>
	
	<title>Aeron Woes</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/aeron-woes/</guid>
	
	<link>http://tychoish.com/rhizome/aeron-woes/</link>
	
	
	<category>/tag/productivity</category>
	
	<category>/tag/technology</category>
	
	
	<pubDate>Tue, 24 Jan 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-01-24T15:38:54Z</dcterms:modified>
	
	<description>&lt;p&gt;I have an Aeron chair at my desk at home. Confession.&lt;/p&gt;

&lt;p&gt;I got it in April when I moved to New York City. The only piece of
furniture that I had that I couldn&#39;t move in my (now former) car was
my desk chair. I found a good deal on an Aeron chair and I
rationalized to myself that the cost of the chair was actually about
the cost of movers. Savings right?&lt;/p&gt;

&lt;p&gt;It also helped, that I was leaving a job where I had an Aeron chair in
my office, and I knew that in the short term I would be working from
home. While my old desk chair was (and is) quite nice, &lt;em&gt;it&#39;s not quite
the same&lt;/em&gt;. Sit in an Aeron chair for a couple of two years, and it&#39;s
hard to go back. I&#39;ve sat in other chairs since then, and it&#39;s never
quite the same.&lt;/p&gt;

&lt;p&gt;Having said that, after a cleaning incident today, I would like to
collect a few gripes about the Aeron chair for your consideration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The assembly right beneath the chair collects dust and dirt in a
proportion that doesn&#39;t seem quite possible. It&#39;s clearly an
artifact of the mesh, and likely a commentary on the air circulation
of my apartment.&lt;/p&gt;

&lt;p&gt;Regardless, dusting nightmare.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The arms scuff and scratch on desks, if the bottom of the desk isn&#39;t
completely smooth. This isn&#39;t an actual problem: the chair still
works fine and is as comfortable as ever, but it&#39;s a annoying.&lt;/p&gt;

&lt;p&gt;I&#39;ve never looked at the underside of a desk before seriously. With
every other chair I&#39;ve either ordered a variant sans arms, or I&#39;ve
take then arms off as soon as possible.&lt;/p&gt;

&lt;p&gt;The Aeron arms are low enough that they&#39;ve never bothered me, so I
thought &quot;might as well.&quot; But it&#39;s still annoying.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That&#39;s all.&lt;/p&gt;
</description>
	
	
</item>
<item>
	
	<title>Documentation Emergence</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/documentation-emergence/</guid>
	
	<link>http://tychoish.com/rhizome/documentation-emergence/</link>
	
	
	<category>/tag/free-software</category>
	
	<category>/tag/open-source</category>
	
	<category>/tag/technical-writing</category>
	
	
	<pubDate>Tue, 17 Jan 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-01-17T20:43:53Z</dcterms:modified>
	
	<description>&lt;p&gt;I stumbled across a link somewhere along the way to a thread about the
&lt;a href=&quot;http://www.pylonsproject.org/&quot;&gt;Pyramid&lt;/a&gt; project&#39;s
&lt;a href=&quot;http://docs.pylonsproject.org/en/latest/index.html&quot;&gt;documentation&lt;/a&gt;
planning process. It&#39;s neat to see a community coming to what I think
is the best possible technical outcome. In the course of this
conversation Iain Duncan, said something that I think is worth
exploring in a bit more depth. The following is directly from the
list, edited only slightly:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I wonder whether some very high level tutorials on getting into
  Pyramid that look at the different ways you can use it would be
  useful? I sympathize with Chris and the other documenters because
  just thinking about this problem is hard: How do you introduce
  someone to Pyramid easily without putting blinders on them for
  Pyramid&#39;s flexibility? I almost feel like there need to 2 new kinds
  of docs:&lt;/p&gt;
  
  &lt;ul&gt;
  &lt;li&gt;&lt;p&gt;easy to follow beginner docs for whatever the most common full
  stack scaffold is turning out to be (no idea what this is!)&lt;/p&gt;&lt;/li&gt;
  &lt;li&gt;&lt;p&gt;some mile high docs on how you can lay out pyramid apps
  differently and why you want to be able to do that. For example,
  I feel like hardly anyone coming to Pyramid from the new docs
  groks why the zca under the hood is so powerful and how you can
  tap into it.&lt;/p&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;Different sets of users have different needs from documentation. I
think my &quot;&lt;a href=&quot;http://tychoish.com/./rhizome/multiaudience-documentation/&quot;&gt;Multi-Audience Documentation&lt;/a&gt;&quot;
post also addresses this issue.&lt;/p&gt;

&lt;p&gt;I don&#39;t think there are good answers and good processes that &lt;em&gt;always&lt;/em&gt;
work for documentation projects. Targeted users and audience changes a
lot depending on the kind of technology at play. The needs of users
(and thus the documentation) varies in response to the technical
complexity and nature every project/product varies. I think, as the
above example demonstrates, there&#39;s additional complexity for software
whose primary users are very technical adept (i.e. systems
administrators) or even software developers themselves.&lt;/p&gt;

&lt;p&gt;The impulse to have &quot;beginner documentation,&quot; and &quot;functional
documentation,&quot; is a very common solution for many products and
reflects two main user needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;to understand how to use something. In other words, &quot;getting
started,&quot; documentation and tutorials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to understand how something works. In other words the &quot;real&quot;
documentation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think it&#39;s feasible to do both kinds of documentation within a
single resource, but the struggle then revolves around making sure
that the right kind of users find the content they need. That&#39;s a
problem of &lt;span class=&quot;createlink&quot;&gt;&lt;a href=&quot;http://tychoish.com/ikiwiki.cgi?page=technical-writing%2Fusability&amp;amp;from=rhizome%2Fdocumentation-emergence&amp;amp;do=create&quot; rel=&quot;nofollow&quot;&gt;?&lt;/a&gt;documentation usability&lt;/span&gt; and
structure. But it&#39;s not without challenges, lets think about those in
the &lt;span class=&quot;createlink&quot;&gt;&lt;a href=&quot;http://tychoish.com/ikiwiki.cgi?page=discourse&amp;amp;from=rhizome%2Fdocumentation-emergence&amp;amp;do=create&quot; rel=&quot;nofollow&quot;&gt;?&lt;/a&gt;discussion&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;I also find myself thinking a bit about the differences between
web-based documentation resources and conventional manuals in PDF or
dead-tree editions. (See, &lt;span class=&quot;createlink&quot;&gt;&lt;a href=&quot;http://tychoish.com/ikiwiki.cgi?page=technical-writing%2Fweb-based-documentation&amp;amp;from=rhizome%2Fdocumentation-emergence&amp;amp;do=create&quot; rel=&quot;nofollow&quot;&gt;?&lt;/a&gt;web-based-documentation&lt;/span&gt;
eventually.) I&#39;m not sure how to resolve these challenges, or even
what the right answers are, but I think the questions are very much
open.&lt;/p&gt;
</description>
	
	
</item>
<item>
	
	<title>9 Awesome Git Tricks</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/9-awesome-git-tricks/</guid>
	
	<link>http://tychoish.com/rhizome/9-awesome-git-tricks/</link>
	
	
	<category>/tag/cyborg</category>
	
	<category>/tag/git</category>
	
	<category>/tag/software</category>
	
	
	<pubDate>Fri, 06 Jan 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-01-07T12:47:41Z</dcterms:modified>
	
	<description>&lt;p&gt;I&#39;m sure that most &quot;hacker bloggers&quot; have probably done their own &quot;N
Git Tricks,&quot; post at this point. But &lt;code&gt;git&lt;/code&gt; is one of those programs
that has so much functionality and everyone uses it differently that
there is a never ending supply of fresh posts on this topic. My use of
git changes enough that I could probably write this post annaully and
come up with a different 9 things. That said here&#39;s the best list
right now.&lt;/p&gt;

&lt;h2 id=&quot;seestageddifferences&quot;&gt;See Staged Differences&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;git diff&lt;/code&gt; command shows you the difference between the last
commit and the state of the current working directory. That&#39;s really
useful and you might not use it as much as you should. The &lt;code&gt;--cached&lt;/code&gt;
option shows you &lt;em&gt;just&lt;/em&gt; the differences that you&#39;ve staged.&lt;/p&gt;

&lt;p&gt;This provides a way to preview your own patch, to make sure everything
is in order. Crazy useful. See below for the example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; git diff --cached
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;eliminatemergecommits&quot;&gt;Eliminate Merge Commits&lt;/h2&gt;

&lt;p&gt;In most cases, if two or more people publish commits to a shard
repository, and everyone commits to remote repositories more
frequently then they publish changes, when they &lt;em&gt;pull&lt;/em&gt;, git has to
make &quot;meta commits&quot; that make it possible to view a branching
(i.e. &quot;tree-like&quot;) commit history in a linear form. This is good for
making sure that the tool works, but it&#39;s kind of messy, and you get
histories with these artificial events in them that you really ought
to remove (but no one does.) The &quot;&lt;code&gt;--rebase&lt;/code&gt;&quot; option to &quot;&lt;code&gt;git pull&lt;/code&gt;&quot;
does this automatically and subtally rewrites your own history in such
a way as to remove the need for merge commits. It&#39;s way clever and it
works. Use the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; git pull --rebase
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are caveats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can&#39;t have uncommitted changes in your working copy when you run
this command or else it will refuse to run. Make sure everything&#39;s
committed, or use &quot;&lt;code&gt;git stash&lt;/code&gt;&quot;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sometimes the output isn&#39;t as clear as you&#39;d want it to be,
particularly when things don&#39;t go right. If you &lt;strong&gt;don&#39;t&lt;/strong&gt; feel
comfortable rescuing yourself in a hairy git rebase, you might want
to avoid this one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the merge isn&#39;t clean, there has to be a merge commit anyway I
believe.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;amendthelastcommit&quot;&gt;Amend the Last Commit&lt;/h2&gt;

&lt;p&gt;This is a recent one for me..&lt;/p&gt;

&lt;p&gt;If you commit something, but realized that you forgot to save one
file, use the &quot;&lt;code&gt;--amend&lt;/code&gt;&quot; switch (as below) and you get to add
whatever changes you have staged to the previous commit.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; git commit --amend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; if you amend a commit that you&#39;ve published, you might have
to do a forced update (i.e. &lt;code&gt;git push -f&lt;/code&gt;) which can mess with the
state of your collaborators and your remote repository.&lt;/p&gt;

&lt;h2 id=&quot;stageallofcurrentstate&quot;&gt;Stage all of Current State&lt;/h2&gt;

&lt;p&gt;I&#39;ve been using a versing of this function for years now as part of my
&lt;a href=&quot;http://tychoish.com/./code/download-mail/&quot;&gt;git-mail&lt;/a&gt; scheme. For some reason in my head,
it&#39;s called &quot;readd.&quot; In any case, the effect of this is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If a file is deleted from the working copy of the repository, remove
it (&lt;code&gt;git rm&lt;/code&gt;) from the next commit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add all changes in the working copy to the next commit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;
       git-stage-all(){
            if [ &quot;`git ls-files -d | wc -l`&quot; -gt &quot;0&quot; ]; then; git rm --quiet `git ls-files -d`; fi
            git add .
       }
&lt;/pre&gt;

&lt;p&gt;So the truth of the matter is that you probably don&#39;t want to be this
blasé about commits, but it&#39;s a great time saver if you use the
&lt;code&gt;rm&lt;/code&gt;/&lt;code&gt;mv&lt;/code&gt;/&lt;code&gt;cp&lt;/code&gt; commands on a git repo, and want to commit those
changes, or a have a lot of small files that you want to process in
one way and then snapshot the tree with git.&lt;/p&gt;

&lt;h2 id=&quot;editorintegration&quot;&gt;Editor Integration&lt;/h2&gt;

&lt;p&gt;The chances are that your text editor has some kind of git
integration that makes it possible to interact with git without
needing to drop into a shell.&lt;/p&gt;

&lt;p&gt;If you use something other than emacs I leave this as an exercise for
the reader. If you use emacs, get &quot;magit,&quot; possibly from your
distribution&#39;s repository, or from the &lt;a href=&quot;http://philjackson.github.com/magit/&quot;&gt;upstream&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As an aside you probably want to add the following to your &lt;code&gt;.emacs&lt;/code&gt;
somewhere.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(setq magit-save-some-buffers nil)
(add-hook &#39;before-save-hook &#39;delete-trailing-whitespace)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;customgitcommandaliases&quot;&gt;Custom Git Command Aliases&lt;/h2&gt;

&lt;p&gt;In your user account&#39;s &quot;&lt;code&gt;~/.gitconfig&lt;/code&gt;&quot; file or in a per-repository
&quot;&lt;code&gt;.git/config&lt;/code&gt;&quot; file, it&#39;s possible to define aliases that add bits
of functionality to your git command. This is useful defining
shortcuts, combinations, and for triggering arbitrary
scripts. Consider the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; [alias]
         all-push  = &quot;!git push origin master; git push secondary master&quot;
         secondary = &quot;!git push secondary master&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then from the command line, you can use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  git secondary
  git all-push
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;gitstash&quot;&gt;Git Stash&lt;/h2&gt;

&lt;p&gt;&quot;&lt;code&gt;git stash&lt;/code&gt;&quot; takes all of the staged changes and stores them away
somewhere. This is useful if you want to break apart a number of
changes into several commits, or have changes that you don&#39;t want to
get rid of (i.e. &quot;&lt;code&gt;git reset&lt;/code&gt;&quot;) but also don&#39;t want to commit. &quot;&lt;code&gt;git
stash&lt;/code&gt;&quot; puts staged changes onto the stash and &quot;&lt;code&gt;git stash pop&lt;/code&gt;&quot;
applies the changes to the current working copy. It operates as a FILO
stack (e.g. &quot;First In, Last Out&quot;) stack in the default operation.&lt;/p&gt;

&lt;p&gt;To be honest, I&#39;m not a git stash power user. For me it&#39;s just a stack
that I put patches on and pull them off later. Apparently it&#39;s
possible to pop things off the stash in any order you like, and I&#39;m
sure I&#39;m missing other subtlety.&lt;/p&gt;

&lt;p&gt;Everyone has room for growth.&lt;/p&gt;

&lt;h2 id=&quot;ignorefiles&quot;&gt;Ignore Files&lt;/h2&gt;

&lt;p&gt;You can add files and directories to a &lt;code&gt;.gitignore&lt;/code&gt; file in the top
level of your repository, and git will automatically ignore these
files. One &quot;ignore pattern&quot; per line, and it&#39;s possible to use
shell-style globing.&lt;/p&gt;

&lt;p&gt;This is great to avoid accidentally committing temporary files, but I
also sometimes put entire sub-directories if I need to nest git
repositories within git-repositories. Technically, you ought to use
git&#39;s submodule support for this, but this is easier. Here&#39;s the list
of temporary files that I use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; .DS_Store
 *.swp
 *~
 \#*#
 .#*
 \#*
 *fasl
 *aux
 *log
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;hostyourownremotes&quot;&gt;Host Your Own Remotes&lt;/h2&gt;

&lt;p&gt;I&#39;ve only once accidentally said &quot;git&quot; when I meant &quot;github&quot; (or vice
versa) once or twice. With github providing public git-hosting
services and a great compliment of additional tooling, it&#39;s easy
forget how easy it is to host your own git repositories.&lt;/p&gt;

&lt;p&gt;The problem is that, aside from making git dependent on one vendor,
this ignores the &quot;distributed&quot; parts of git and all of the
independence and flexibility that comes with that. If you&#39;re familiar
with how Linux/GNU/Unix works, git hosting is entirely paradigmatic.&lt;/p&gt;

&lt;p&gt;Issue the following commands to create a repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; mkdir -p /srv/git/repo.git
 cd /srv/git/repo.git
 git init --bare
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Edit the &lt;code&gt;.git/config&lt;/code&gt; file in your existing repository to include a
remote block that resembles the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; [remote &quot;origin&quot;]
         fetch = +refs/heads/*:refs/remotes/origin/*
         url = [username]@[hostname]:/srv/git/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you already have a remote named origin, change the occurrence
of the word remote in the above snippet with the name of your
remote. (In multi-remote situations, I prefer to use descriptive
identifier like &quot;public&quot; or machine&#39;s hostnames.)&lt;/p&gt;

&lt;p&gt;Then issue &quot;&lt;code&gt;git push origin master&lt;/code&gt;&quot; on the local machine, and you&#39;re
good. You can us a command in the following form to clone this
repository at any time.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; git clone [username]@[hostname]:/srv/git/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;

&lt;p&gt;Does anyone have &lt;a href=&quot;http://tychoish.com/./git-tricks/&quot;&gt;git-tricks&lt;/a&gt; that they&#39;d like to share with the
group?&lt;/p&gt;
</description>
	
	
</item>
<item>
	
	<title>6 Awesome Arch Linux Tricks</title>
	<dcterms:creator>tycho garen</dcterms:creator>
	
	
	  <guid>http://tychoish.com/rhizome/6-awesome-arch-linux-tricks/</guid>
	
	<link>http://tychoish.com/rhizome/6-awesome-arch-linux-tricks/</link>
	
	
	<category>/tag/linux</category>
	
	<category>/tag/lists</category>
	
	<category>/tag/software</category>
	
	
	<pubDate>Wed, 04 Jan 2012 00:00:00 -0500</pubDate>
	<dcterms:modified>2012-01-06T21:25:37Z</dcterms:modified>
	
	<description>&lt;p&gt;A couple of years ago I wrote &quot;&lt;a href=&quot;http://tychoish.com/./rhizome/why-arch-linux-rocks/&quot;&gt;Why Arch Linux Rocks&lt;/a&gt;&quot; and
&quot;&lt;a href=&quot;http://tychoish.com/./rhizome/getting-the-most-from-arch-linux/&quot;&gt;Getting the most from Arch Linux&lt;/a&gt;.&quot;
I&#39;ve made a number of attempts to get more involved in the Arch
project and community, but mostly I&#39;ve been too busy working and using
Arch to do actual work. Then a few weeks ago when  I needed to do something
minor with my system--I forget what--and I found myself thinking &quot;this Arch
thing is pretty swell, really.&quot;&lt;/p&gt;

&lt;p&gt;This post is a collection of the clever little things that make Arch
great.&lt;/p&gt;

&lt;h2 id=&quot;abs&quot;&gt;abs&lt;/h2&gt;

&lt;p&gt;I&#39;m using &lt;a href=&quot;https://wiki.archlinux.org/index.php/Arch_Build_System&quot;&gt;abs&lt;/a&gt;
as a macro for all of the things about the package build system that I
enjoy.&lt;/p&gt;

&lt;p&gt;Arch packages are easy to build for users: you download a few files
read a bash script in the &lt;code&gt;PKGBUILD&lt;/code&gt; file and run the &lt;code&gt;makepkg&lt;/code&gt;
command. Done. Arch packages are also easy to specify for developers:
just specify a &quot;&lt;code&gt;build()&lt;/code&gt;&quot; function and some variables int eh
&lt;code&gt;PKGBUILD&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Arch may not have as many packages as Debian, but I think it&#39;s clear
that you don&#39;t need comprehensive package coverage when making
packages is trivially easy.&lt;/p&gt;

&lt;p&gt;If you use Arch and you don&#39;t frequent that
&lt;a href=&quot;http://aur.archlinux.org&quot;&gt;AUR&lt;/a&gt;, or if you &lt;em&gt;ever&lt;/em&gt; find yourself doing
&quot;&lt;code&gt;./configure; make; make install&lt;/code&gt;&quot; then you&#39;re wasting your time or
jeopardizing the stability of your server.&lt;/p&gt;

&lt;h2 id=&quot;yaourt&quot;&gt;yaourt&lt;/h2&gt;

&lt;p&gt;The default package management tool for Arch Linux, &lt;code&gt;pacman&lt;/code&gt;, is a
completely sufficient utility. This puts &lt;code&gt;pacman&lt;/code&gt; ahead of a number of
other similar tools, but to be honest I&#39;m not terribly wild about
it. Having said that, I think that &lt;a href=&quot;https://wiki.archlinux.org/index.php/Yaourt&quot;&gt;yaourt&lt;/a&gt;
is a great thing. It provides a wrapper around all of &lt;code&gt;pacman&lt;/code&gt;&#39;s
functionality and adds support for AUR/ABS packages in a completely
idiomatic manner. The reduction in cost of installing this software is
quite welcome.&lt;/p&gt;

&lt;p&gt;It&#39;s not &quot;official&quot; or supported, because it&#39;s theoretically possible
to &lt;em&gt;really&lt;/em&gt; screw up your system with &lt;code&gt;yaourt&lt;/code&gt; &lt;em&gt;but&lt;/em&gt; if you&#39;re
cautious, you should be good.&lt;/p&gt;

&lt;h2 id=&quot;yaourt-g&quot;&gt;yaourt -G&lt;/h2&gt;

&lt;p&gt;The main &lt;code&gt;yaourt&lt;/code&gt; functions that I use regularly are the &quot;-Ss&quot; which
provides a search of the AUR, and the &lt;code&gt;-G&lt;/code&gt; option. &lt;code&gt;-G&lt;/code&gt; just downloads
the tarball with the package specification (e.g. the &lt;code&gt;PKGBUILD&lt;/code&gt; and
associated files) from the AUR and untars the archive into the current
directory.&lt;/p&gt;

&lt;p&gt;With that accomplished, it&#39;s trivial to build and install the package,
but you get to keep a record of the build files for future reference
and possible tweaking. So basically, you this is the way to take away
the tedium of getting packages from the AUR, while giving you more
control and oversight of package installation.&lt;/p&gt;

&lt;h2 id=&quot;rc.conf&quot;&gt;rc.conf&lt;/h2&gt;

&lt;p&gt;If you&#39;ve installed Arch, then you&#39;re already familiar with the
&lt;code&gt;rc.conf&lt;/code&gt; file. In case you didn&#39;t catch how it works, &lt;code&gt;rc.conf&lt;/code&gt; is
bash script that defines certain global configuration values, which in
turn controls certain aspects of the boot process and process
initialization.&lt;/p&gt;

&lt;p&gt;I like that it&#39;s centralized, that you can do all kinds of wild
network configuration in the script, and I like that everything is in
one place.&lt;/p&gt;

&lt;h2 id=&quot;netcfg&quot;&gt;netcfg&lt;/h2&gt;

&lt;p&gt;In point of fact, one of primary reasons I switched to Arch Linux full
time, was because of the network configuration tool, &lt;code&gt;netcfg&lt;/code&gt;. Like
the &lt;code&gt;rc.conf&lt;/code&gt; setup, &lt;code&gt;netcfg&lt;/code&gt; works by having a network configuration
files which define a number of variables which are sourced by
&lt;code&gt;netcfg&lt;/code&gt; when imitating a network connection.&lt;/p&gt;

&lt;p&gt;It&#39;s all in bash, of course, and it works &lt;em&gt;incredibly&lt;/em&gt; well. I like
having network management easy to configure, and setup in a way that
doesn&#39;t require a management daemon.&lt;/p&gt;

&lt;h2 id=&quot;initsystem&quot;&gt;Init System&lt;/h2&gt;

&lt;p&gt;Previous points have touched on this, but the &quot;BSD-style&quot; init system
is perfect. It works quickly, and boot ups are stunningly fast:
even without an SSD I got to a prompt in less than a minute, and
probably not much more than 30 seconds. With an SSD: it&#39;s even better
great. The points that you should know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Daemon control scripts, (i.e. init scripts) are located in
&lt;code&gt;/etc/rc.d&lt;/code&gt;. There&#39;s a pretty useful &quot;library&quot; of shell functions in
&lt;code&gt;/etc/rc.d/function`` and a good template file in&lt;/code&gt;/etc/rc.d/skel`
for use when building your own control scripts. The convention is to
have clear and useful output and easy to understand scripts, and
with the provided material this is pretty easy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code&gt;/etc/rc.conf&lt;/code&gt; there&#39;s a &lt;code&gt;DAEMON&lt;/code&gt; variable that holds an
array. Place names, corresponding to the &lt;code&gt;/etc/rc.d&lt;/code&gt; file name, of
daemons in this array to start them at boot time. Daemons are
started synchronously by default (i.e. order of items in this array
matters and the control script must exit before running the next
script.) However, if a daemon&#39;s name is prefixed by an &lt;code&gt;@&lt;/code&gt; sign, the
process is started in the background and the init process moves to
the next item in the array without waiting.&lt;/p&gt;

&lt;p&gt;Start-up dependency issues are yours to address, but using order and
background start-up this is trivial to implement. Background start
ups lead to fast boot times.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
	
	
</item>

</channel>
</rss>

