<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:admin="http://webns.net/mvcb/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
    <title>IMHO</title>
    <link>http://blog.interlinked.org</link>
    <description>The true delight is in the &lt;i&gt;finding out&lt;/i&gt; rather than in the &lt;i&gt;knowing&lt;/i&gt;.&lt;br/&gt;-- Isaac Asimov</description>
    <dc:language>en-us</dc:language>
    <dc:creator />
    <dc:date>2009-05-06T14:09:20+00:00</dc:date>
    <admin:generatorAgent rdf:resource="http://hobix.com/?v=0.5" />
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/IMHO" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Haskell Books and Tutorials</title><link>http://feedproxy.google.com/~r/IMHO/~3/GEr_k22FqNg/haskell_tutorials_and_books.html</link><guid isPermaLink="false">programming/haskell_tutorials_and_books@http://blog.interlinked.org</guid><dc:subject>programming</dc:subject><dc:subject>programming</dc:subject><dc:subject>haskell</dc:subject><dc:subject>books</dc:subject><dc:subject>tutorials</dc:subject><dc:creator>Michael</dc:creator><dc:date>2008-10-23T22:25:31+00:00</dc:date><description xml:space="preserve">&lt;p&gt;Haskell is really a language very worth knowing. It does many things so different
than most other languages which I really enjoy.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;d like to use this post to mention a few really good resources for learning Haskell:&lt;/p&gt;


	&lt;h2&gt;Learn you a Haskell&lt;/h2&gt;


	&lt;p&gt;&lt;a href="http://learnyouahaskell.com/"&gt;Learn you a Haskell&lt;/a&gt; is a very fun and entertaining tutorial for Haskell
very much in the spirit of &lt;a href="http://poignantguide.net/ruby/"&gt;Why&amp;#8217;s poignant guide to Ruby&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;It isn&amp;#8217;t finished yet, but it&amp;#8217;s really good to start with. (Via &lt;a href="http://wadler.blogspot.com/"&gt;Wadler&amp;#8217;s Blog&lt;/a&gt;)&lt;/p&gt;


	&lt;h2&gt;Real World Haskell&lt;/h2&gt;


	&lt;p&gt;&lt;a href="http://book.realworldhaskell.org/read/"&gt;Real World Haskell&lt;/a&gt; is a upcoming book I really
look forward to. It is freely available on its website, so check it out.&lt;/p&gt;


	&lt;h2&gt;Wikibook&lt;/h2&gt;


	&lt;p&gt;There is also a good collection of Haskell topics on &lt;a href="http://en.wikibooks.org/wiki/Programming:Haskell"&gt;Wikibooks &amp;#8211; Programming/Haskell&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Wikibook is more interesting if you already know a bit of Haskell and would like to understand it
more in depth.&lt;/p&gt;


	&lt;h2&gt;Others&lt;/h2&gt;


	&lt;p&gt;I liked &lt;a href="http://hal3.name/docs/daume02yaht.ps"&gt;Yet another Haskell Tutorial&lt;/a&gt; very much, this aims at
people with a bit of background, though.&lt;/p&gt;


	&lt;p&gt;Another more recent book on Haskell is &lt;a href="http://www.cs.nott.ac.uk/~gmh/book.html"&gt;Programming in Haskell&lt;/a&gt; which is
nice, but also quite basic &lt;span class="caps"&gt;IMO&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Of course there is always the &lt;a href="http://www.haskell.org/tutorial/"&gt;Gentle introduction to Haskell&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Enjoy.&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Haskell is doomed to succeed. &amp;#8212;Sir Tony Hoare&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/GEr_k22FqNg" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/programming/haskell_tutorials_and_books.html</feedburner:origLink></item><item><title>Browser-JavaScript Performance on Mac OS X</title><link>http://feedproxy.google.com/~r/IMHO/~3/v-uZIGOnNYY/javascript_performance.html</link><guid isPermaLink="false">misc/javascript_performance@http://blog.interlinked.org</guid><dc:subject>misc</dc:subject><dc:subject>misc</dc:subject><dc:subject>javascript</dc:subject><dc:subject>performance</dc:subject><dc:subject>browser</dc:subject><dc:creator>Michael</dc:creator><dc:date>2008-09-29T20:53:07+00:00</dc:date><description xml:space="preserve">&lt;p&gt;JavaScript performance is one of the most important things in recent
browser development.&lt;/p&gt;


	&lt;p&gt;Google did an awesome job with Chrome&amp;#8217;s V8, and Mozilla&amp;#8217;s Tracemonkey also
raises the bar.&lt;/p&gt;


	&lt;p&gt;I usually compare the performance on &lt;a href="http://wd-testnet.world-direct.at/mozilla/dhtml/funo/jsTimeTest.htm"&gt;this site&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The tests were done on a MacBook Pro (2007), here the results:&lt;/p&gt;


	&lt;h2&gt;&lt;a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/3.0.1-candidates/build1/"&gt;Firefox 3.0.1&lt;/a&gt; on Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/javascript/Firefox3.0.png" alt="" /&gt;&lt;/p&gt;


	&lt;h2&gt;&lt;a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/"&gt;Firefox 3.1 Alpha&lt;/a&gt; (2008-09-29 nightly) on Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/javascript/Firefox3.1.png" alt="" /&gt;&lt;/p&gt;


	&lt;h2&gt;&lt;a href="http://webkit.org/"&gt;Webkit&lt;/a&gt; (2008-09-29 nightly) on Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/javascript/Webkit.png" alt="" /&gt;&lt;/p&gt;


	&lt;h2&gt;&lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt; running on top of Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; in Parallels with Windows &lt;span class="caps"&gt;XP SP3&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/javascript/ChromeParallels.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Note how fast Chrome is &amp;#8211; even when running on top of two operating systems!&lt;/p&gt;


	&lt;h2&gt;&lt;a href="http://www.opera.com"&gt;Opera 9.5&lt;/a&gt; running on Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;&lt;/h2&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/javascript/Opera95.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
The key to performance is elegance, not battalions of special cases. &amp;#8212;Jon Bently and Doug McIlroy&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/v-uZIGOnNYY" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/misc/javascript_performance.html</feedburner:origLink></item><item><title>Git Overview</title><link>http://feedproxy.google.com/~r/IMHO/~3/LADr1GBkwoA/git.html</link><guid isPermaLink="false">tutorials/git@http://blog.interlinked.org</guid><dc:subject>tutorials</dc:subject><dc:subject>tutorials</dc:subject><dc:subject>git</dc:subject><dc:subject>mercurial</dc:subject><dc:subject>version control</dc:subject><dc:creator>Michael</dc:creator><dc:date>2008-08-24T15:42:12+00:00</dc:date><description xml:space="preserve">&lt;p style="float:right"&gt;&lt;img src="http://blog.interlinked.org/static/images/git/git-logo.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;My version control journey started with &lt;span class="caps"&gt;CVS&lt;/span&gt;, after that I looked at &lt;span class="caps"&gt;SVN&lt;/span&gt;, but
never really used it.  The shortcomings of centralized repositories were too
obvious and with my increasing interest in Haskell I jumped on the distributed
version control train with
&lt;a href="http://blog.interlinked.org/tutorials/darcs.html"&gt;Darcs&lt;/a&gt;.  I really, really
liked it, but it had some nasty things too. After a while I was looking for
something different and stumbled over
&lt;a href="http://blog.interlinked.org/reviews/mercurial.html"&gt;Mercurial&lt;/a&gt;, again I was
really happy with it but somehow my journey wasn&amp;#8217;t over yet.&lt;/p&gt;


	&lt;p&gt;Recently I was watching two &lt;a href="http://www.git.or.cz"&gt;Git&lt;/a&gt; techtalks on YouTube:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8"&gt;Linus Torvalds on Git&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=8dhZ9BXQgc4"&gt;Randal Schwartz on Git&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The two talks are very different. The first one is more about why there&amp;#8217;s place
for yet another source code management with the rare opportunity to see Linus
Torvalds giving a talk. The second one is about Git&amp;#8217;s technicalities (commands
etc.).&lt;/p&gt;


	&lt;h2&gt;Basic Terms&lt;/h2&gt;


	&lt;p&gt;Git distinguishes between the workspace, the index/staging area, the object
store and remote repositories.&lt;/p&gt;


	&lt;p&gt;The workspace is where you do your actual work. It contains tracked files,
untracked files and a special directory &amp;#8221;.git&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;The index (or staging area) is used for preparing commits. You can add files to
the next commit or even only &lt;strong&gt;parts&lt;/strong&gt; of files for the next commit. All the
changes you&amp;#8217;d like to commit get into the index first.  A commit takes
everything in the index and persists it in the object store.&lt;/p&gt;


	&lt;p&gt;The object store isn&amp;#8217;t really an issue here, and remote repositories are more
or less clear what they are.&lt;/p&gt;


	&lt;h2&gt;Quick Intro&lt;/h2&gt;


	&lt;p style="float:right"&gt;&lt;img src="http://blog.interlinked.org/static/images/git/high-level-commands.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;For a more complete introduction see the &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html"&gt;Git
tutorial&lt;/a&gt; (the
cool stuff is in the next section).&lt;/p&gt;


	&lt;p&gt;Somewhere on the &lt;span class="caps"&gt;KDE &lt;/span&gt;Project I found &lt;a href="http://ktown.kde.org/~zrusin/git/"&gt;a really nice
Cheat-Sheet&lt;/a&gt; for Git.&lt;/p&gt;


To create a new repository just issue
	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


To start tracking files (or content) issue
	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;git add &amp;lt;files&amp;gt;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


To commit the added changes (note, only the state of the files &lt;strong&gt;when you issued
&lt;code&gt;add&lt;/code&gt;&lt;/strong&gt; will be recorded) issue
	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


To push changes to a remote repository (ssh, filesystem etc.) issue
	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;git push &amp;lt;remote url&amp;gt;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


To clone a complete repository onto your local disk issue
	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;git clone &amp;lt;remote url&amp;gt;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I like to do some general configuration for all my projects, something like this:&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
git config --global user.name "Your Name" 
git config --global user.email your.mail@host.com
git config --global color.ui auto
git config --global color.interactive auto
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;This tells Git who you are and enables some nice color-features of Git.&lt;/p&gt;


	&lt;p&gt;To get the most out of Git learn one of these commands:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;git help &amp;lt;command&amp;gt;&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;man git-&amp;lt;command&amp;gt;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;So, &lt;code&gt;git help config&lt;/code&gt; is equivalent to &lt;code&gt;man git-config&lt;/code&gt;, similarily, &lt;code&gt;git config...&lt;/code&gt;
is equivalent to &lt;code&gt;git-config...&lt;/code&gt;. The latter seems to be discouraged
(since Git switches to a library approach or something), but is often used in
tutorials or manuals.&lt;/p&gt;


	&lt;p&gt;That may be the most used commands with Git, the more interesting ones &amp;#8211; and
the ones for which you may want to switch to Git follow:&lt;/p&gt;


	&lt;h2&gt;Commands&lt;/h2&gt;


	&lt;h3&gt;Adding/Removing changes to/from the Index&lt;/h3&gt;


	&lt;p&gt;To add all changes in a file, simply use &lt;code&gt;add&lt;/code&gt;, some examples:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;add .&lt;/code&gt; adds all files in the current directory and its sub-directories to the index&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;add &amp;lt;file&amp;gt;&lt;/code&gt; adds a specific file to the index&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;add -u&lt;/code&gt; adds all changed files to the index (that is, it adds alls files Git knows about and that have changed)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;add --patch&lt;/code&gt; lets you decide whether you want to include smaller changes within a file instead of all changes in the file(s) see &lt;a href="http://tomayko.com/writings/the-thing-about-git"&gt;The Thing About Git&lt;/a&gt; for a larger example. This is extremely useful if you accidentally made two unrelated changes to a file and you want to keep your commits clean (you &lt;strong&gt;do&lt;/strong&gt; want to keep your commits clean, don&amp;#8217;t you?!)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;add -i&lt;/code&gt; is an interactive version of &lt;code&gt;add&lt;/code&gt; with a text-based &lt;span class="caps"&gt;GUI&lt;/span&gt; combining all the above capabilities&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you accidentally added some changes to the index, simply use &lt;code&gt;reset&lt;/code&gt; to
clean it, or specify the file to remove from the index, like &lt;code&gt;reset &amp;lt;file&amp;gt;&lt;/code&gt;.
&lt;code&gt;reset&lt;/code&gt; can do more than simply cleaning the index, you can use it to restore
the state of the latest commit by using &lt;code&gt;reset --hard&lt;/code&gt;. &lt;code&gt;reset&lt;/code&gt; also takes a
parameter telling it which commit to consider &amp;#8211; instead of using the latest
&lt;code&gt;HEAD&lt;/code&gt;, use &lt;code&gt;HEAD^&lt;/code&gt; for the parent of the actual &lt;code&gt;HEAD&lt;/code&gt;, or give it a &lt;span class="caps"&gt;SHA1&lt;/span&gt;
hash&amp;#8230; . Take a look &lt;a href="http://andy.delcambre.com/2008/3/12/git-reset-in-depth"&gt;at this
post&lt;/a&gt; for a better
treatment of &lt;code&gt;git reset&lt;/code&gt; and its possibilities.&lt;/p&gt;


	&lt;h3&gt;Checking differences between commits/index/working directory&lt;/h3&gt;


	&lt;p&gt;Sometimes you need to know what exactly the differences between two commits or
the working directory and the index (or some commit) is.&lt;/p&gt;


	&lt;p&gt;This is actually fairly trivial with any revision control system, and of course also
with git.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;diff&lt;/code&gt; compares your working directory with the index&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;diff --cached&lt;/code&gt; compares your index with the latest commit (or any named commit you supply)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;diff &amp;lt;commit&amp;gt;&lt;/code&gt; compares your working directory with the named commit (use &lt;code&gt;HEAD&lt;/code&gt; for the latest commit)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;diff &amp;lt;commit&amp;gt; &amp;lt;commit&amp;gt;&lt;/code&gt; compares (surprise) two named commits (for example, &lt;code&gt;diff HEAD HEAD^&lt;/code&gt; shows the differences from the last two commits)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/git/diff.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;To get a high-level view of changed files, Git offers the &lt;code&gt;status&lt;/code&gt; command.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;status&lt;/code&gt; shows a summary of changed files, files added to the index and files not tracked.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;status -a&lt;/code&gt; shows what the index &lt;strong&gt;would&lt;/strong&gt; look like if you issued &lt;code&gt;add -u&lt;/code&gt; or a &lt;code&gt;commit -a&lt;/code&gt; (that is, all changed files get commited or added to the index).&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;status -u {no, normal, all}&lt;/code&gt; using the &lt;code&gt;-u&lt;/code&gt; parameter, Git&amp;#8217;s behavior concerning untracked files can be changed (don&amp;#8217;t show untracked files, show only files and directories, or show all untracked files recursively).&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Another way to get an overview of your controlled content is by using &lt;code&gt;ls-files&lt;/code&gt;:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;ls-files&lt;/code&gt; shows all tracked files&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;ls-files -t&lt;/code&gt; shows files with some additional information (like cached, modified etc.)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;ls-files --others&lt;/code&gt; shows untracked files&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Somehow I find this more interesting than the &lt;code&gt;status&lt;/code&gt; output, but this may
come from my Mercurial experiences where &lt;code&gt;hg status&lt;/code&gt; would output a very
similar list as &lt;code&gt;ls-files -t&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;Most projects have some files which should not be tracked, for example binaries
built from source, or backup-files from your editor&amp;#8230; . Using &lt;code&gt;.gitignore&lt;/code&gt; you
can tell Git to always ignore these files (unless you order it to show you also
ignored files, though).&lt;/p&gt;


	&lt;p&gt;There are several ways to tell Git what to ignore. The most common one is by
creating a &lt;code&gt;.gitignore&lt;/code&gt; file in the root of your project. This file could be
added to the index and would be shared. The nice thing with this file is, that
you can keep one in each sub-directory overriding the configuration of the
parent directory. See
&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gitignore.html"&gt;gitignore&lt;/a&gt; for
more.&lt;/p&gt;


	&lt;p&gt;The second way, local to your repository, is to edit the file
&lt;code&gt;.git/info/exclude&lt;/code&gt; to your needs. On Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;, Git automatically adds
&lt;code&gt;.DS_Store&lt;/code&gt; files to that exclude file.&lt;/p&gt;


	&lt;p&gt;The third way is to specify a &lt;code&gt;core.excludesfile&lt;/code&gt; configuration (for example
&lt;code&gt;git config --global core.excludesfile "/absolute/path/.gitglobalexclude"&lt;/code&gt;) and
create a global ignore file (I think an absolute path is needed, but a &lt;a href="http://n2.nabble.com/-PATCH--Support-%22core.excludesfile-%3D-~-.gitignore%22-td742043.html"&gt;patch
enabling relative
paths&lt;/a&gt;
was submitted).&lt;/p&gt;


	&lt;p&gt;The format of the files is simple:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;!file&lt;/code&gt; &lt;strong&gt;never&lt;/strong&gt; ignore this file (use &lt;code&gt;!asdf.o&lt;/code&gt; if you excluded &lt;code&gt;*.o&lt;/code&gt;, but you want to track &lt;code&gt;asdf.o&lt;/code&gt;)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;/file&lt;/code&gt; ignore the file in the root of the &lt;strong&gt;project&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;file&lt;/code&gt; ignore the file anywhere in the project&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;*.o&lt;/code&gt; ignore all files with an &amp;#8221;.o&amp;#8221; ending&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;dir/&lt;/code&gt; ignore the directory &amp;#8220;dir&amp;#8221; but not the file &amp;#8220;dir&amp;#8221;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Commiting changes&lt;/h3&gt;


	&lt;p&gt;So, let&amp;#8217;s say we have a clean collection of changes in the index. The next step is to commit it.&lt;/p&gt;


	&lt;p&gt;The basic command is simple, just &lt;code&gt;commit&lt;/code&gt;, but you can do more.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;commit -a&lt;/code&gt; commit all changed files (adding every changed file to the index)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;commit -m "commit message"&lt;/code&gt; supply the commit message at the command line&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;commit --amend&lt;/code&gt; edit the previous commit (that is, the new commit merges with the old one)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;With Git it&amp;#8217;s common to make branches for bigger experiments. Use a branch for
example if you want to implement a new feature which requires many changes in
your code-base, but it takes too long for a single commit.&lt;/p&gt;


	&lt;p&gt;So, to make a branch from the current &lt;span class="caps"&gt;HEAD&lt;/span&gt;, just issue &lt;code&gt;checkout -b name&lt;/code&gt;. This creates
a branch named &amp;#8220;name&amp;#8221; and switches to it. This is equivalent to &lt;code&gt;branch name&lt;/code&gt; &lt;code&gt;checkout name&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;In this branch you can do whatever is needed to implement the new feature, but if necessary, you
can switch back to the old branch (for maintenance or something). After you&amp;#8217;ve completed your
changes, just merge the branch with the new feature back to the original branch &lt;code&gt;merge name&lt;/code&gt;.
After that you can safely delete the &amp;#8220;name&amp;#8221; branch &lt;code&gt;branch -d name&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;The following picture shows two branches, Branch B is created during the working directory (red line)
points to Branch A, we can switch between the branches with &lt;code&gt;checkout&lt;/code&gt; and finally delete Branch B.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/git/branching.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Of course there can be conflicts while merging the changes from the other branch into a branch
which has evolved by itself. Either you resolve the conflicts all at once, or you keep your
branch with the new feature more or less up to date with &lt;code&gt;rebase&lt;/code&gt;. After each change to the
master branch, you could issue a &lt;code&gt;rebase master&lt;/code&gt; in the new branch to get the new changes of 
the master branch incorporated into your &amp;#8220;name&amp;#8221; branch.&lt;/p&gt;


	&lt;p&gt;Another very nice feature of &lt;code&gt;rebase&lt;/code&gt; is to merge many commits into a single
commit (or edit some of them). Suppose you made your changes within a new
branch, now you&amp;#8217;re ready but you&amp;#8217;d like to have a single commit containing all
changes of the branch. Just issue &lt;code&gt;rebase -i master&lt;/code&gt;, and Git with alls commits
leading from master to the current &lt;span class="caps"&gt;HEAD&lt;/span&gt;. Replace each &amp;#8220;pick&amp;#8221; with &amp;#8220;squash&amp;#8221; and
Git merges all the commits into a single new one (you get to supply a new
commit message). Look at &lt;a href="http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive"&gt;git awsome-ness&lt;/a&gt;
for a complete example.&lt;/p&gt;


	&lt;p&gt;The following diagram shows how commits are connected when a branch is made.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/git/branch.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;From the branch we can do a merge (first picture) or a rebase (second picture). Note that the &lt;code&gt;merge&lt;/code&gt;
automatically issues a commit if no conflicts arise!&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/git/merge.png" alt="" /&gt; &lt;img src="http://blog.interlinked.org/static/images/git/rebase.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Here a small illustration what you &lt;strong&gt;could&lt;/strong&gt; do with a &lt;code&gt;rebase&lt;/code&gt; command:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/git/rebase-i.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;For smaller changes there&amp;#8217;s also a special holding area for changes. Suppose you&amp;#8217;re in the middle
of a bigger change and you &lt;strong&gt;have&lt;/strong&gt; to quickly fix something completely unrelated. Just issue &lt;code&gt;stash&lt;/code&gt;
and Git will put away all your current uncommited changes and present you with a clean working directory.
Now make the quick-fix, commit and issue &lt;code&gt;stash pop&lt;/code&gt; (equivalent to &lt;code&gt;stash apply&lt;/code&gt; and &lt;code&gt;stash drop&lt;/code&gt;) to
continue working on your fancy new feature.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s also possible to stack stashes up, use &lt;code&gt;stash list&lt;/code&gt; to see a list of stashes. If you come to the conclusion
that your stashed changes deserve their own branch, issue &lt;code&gt;stash branch foo&lt;/code&gt; to create a new branch &amp;#8220;foo&amp;#8221; and
pop the latest stashed changes.&lt;/p&gt;


	&lt;p&gt;You &lt;strong&gt;never&lt;/strong&gt; should temper with commits you already published to a remote repository (or other people)! If you
find a mistake in a published commit use &lt;code&gt;revert &amp;lt;commit&amp;gt;&lt;/code&gt; which records a special commit telling other people that
something isn&amp;#8217;t right with the specified commit.&lt;/p&gt;


	&lt;h3&gt;Sharing or &amp;#8220;backing up&amp;#8221; your work&lt;/h3&gt;


	&lt;p&gt;Sometimes you&amp;#8217;re not the one who started the project, or you simply reinstalled or changed the computer. How do
you get your repository back?&lt;/p&gt;


	&lt;p&gt;Nothing simpler than that: &lt;code&gt;clone &amp;lt;url&amp;gt;&lt;/code&gt;. Unfortunately, clone cannot clone &lt;strong&gt;to&lt;/strong&gt; a remote repository. I can&amp;#8217;t clone
my local project to my backup server &amp;#8211; I have to either scp it to it or create a project there and pull the changes.
After that I can use the standard command to publish or receive changes.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;clone&lt;/code&gt; sets up all necessary configurations and you can simply issue &lt;code&gt;pull&lt;/code&gt; to update your repository with remote
changes or &lt;code&gt;push&lt;/code&gt; to send your changes to the remote repository.&lt;/p&gt;


	&lt;p&gt;In a distributed environment it&amp;#8217;s not uncommon that you might want to push or pull from different remote repositories.
For that reason, Git allows you to configure shortcuts to other repositories. The main remote repository is called &amp;#8220;origin&amp;#8221;,
and you usually push or pull the master branch. &lt;code&gt;pull&lt;/code&gt; is a twofold operation, it first fetches the contents (using &lt;code&gt;fetch&lt;/code&gt;)
and then merges the new contents with your changes. Of course you could also use &lt;code&gt;fetch&lt;/code&gt;, inspect the changes and &lt;code&gt;merge&lt;/code&gt; 
afterwards.&lt;/p&gt;


	&lt;p&gt;So, how to you want clone the Git repository:&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;git clone git://git.kernel.org/pub/scm/git/git.git&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;After the clone, we can look at the remote sites and their respective URLs with &lt;code&gt;remote -v&lt;/code&gt;. To look which branches
are available at the remote site, issue &lt;code&gt;branch -r&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
me@host:git % git remote -v 
origin    git://git.kernel.org/pub/scm/git/git.git
me@host:git % git branch -r
  origin/HEAD
  origin/html
  origin/maint
  origin/man
  origin/master
  origin/next
  origin/pu
  origin/todo
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Now let&amp;#8217;s add another repository containing the Git project (note the git2 subdomain):&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;git remote add mirror git://git2.kernel.org/pub/scm/git/git.git&lt;/code&gt;&lt;/p&gt;


	&lt;p&gt;This tells Git to add the given &lt;span class="caps"&gt;URL&lt;/span&gt; with the shorthand &amp;#8220;mirror&amp;#8221; and to track all branches. I you&amp;#8217;d like
to track only some branches, for example only the master branch add &lt;code&gt;-t master&lt;/code&gt; to the command.&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
me@host:git % git remote -v 
mirror    git://git2.kernel.org/pub/scm/git/git.git
origin    git://git.kernel.org/pub/scm/git/git.git
me@host:git % git branch -r 
  mirror/html
  mirror/maint
  mirror/man
  mirror/master
  mirror/next
  mirror/pu
  mirror/todo
  origin/HEAD
  origin/html
  origin/maint
  origin/man
  origin/master
  origin/next
  origin/pu
  origin/todo
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;You can either switch to a remote branch with &lt;code&gt;checkout origin/todo&lt;/code&gt; or create a new branch based
on some remote branch &lt;code&gt;checkout -b myownbrach origin/todo&lt;/code&gt;, the latter also sets up &amp;#8220;tracking&amp;#8221; which
means that &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pull&lt;/code&gt; automatically use the branch &amp;#8220;todo&amp;#8221; at the remote repository &amp;#8220;origin&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Another very cool feature of Git (and of course others) is the ability to
&amp;#8220;cherry-pick&amp;#8221;. That is, we could take the patches (commits) interesting to us
and incorporate them into our own branch. To accomplish that task, there&amp;#8217;s
&lt;code&gt;cherry-pick&lt;/code&gt; at our disposal. Simply choose the commit you&amp;#8217;d like to import
from another branch and call &lt;code&gt;cherry-pick &amp;lt;commit&amp;gt;&lt;/code&gt; at the branch you&amp;#8217;d like to
incorporate the patch (commit). Works like a charm.&lt;/p&gt;


	&lt;h2&gt;How I use Git&lt;/h2&gt;


	&lt;p&gt;Note that I just switched to Git, but since Mercurial was very similar I know most of the
concepts to some degree.&lt;/p&gt;


	&lt;p&gt;I use version control for most of my files, be it configuration files in my home directory which
get shared across my laptop, desktop and work machine or letters I write. Of course Git isn&amp;#8217;t
the best way to do everything, but it&amp;#8217;s a better way than not syncing my files at all.&lt;/p&gt;


	&lt;p&gt;I have three &amp;#8220;work-machines&amp;#8221; which synchronise to a server accessible by all of my machines. For
machine-specific files (in my home-dir for example) I made a special directory &amp;#8221;.machinedependent&amp;#8221; 
and created sub-folders for each machine. In this directories I put the configuration files I&amp;#8217;d like
to be version controlled even if the are only interesting for one machine. Then I hard-link files
and soft-link directories and I&amp;#8217;m done. Git handles this quite nicely.&lt;/p&gt;


	&lt;p&gt;All of my coding projects are handled by Git and stored (for backup purposes
and accessibility) on the mentioned server. I like the fact that my code is
distributed across several machine nowhere near each other.
&lt;a href="http://jean-francois.richard.name/ghh/git-home-history.html"&gt;Git-home-history&lt;/a&gt;
has some capabilities to produce encrypted archives of your work too, but I
didn&amp;#8217;t dig into that by now.&lt;/p&gt;


	&lt;p&gt;This, of course, didn&amp;#8217;t touch more than the bare surface of Git. Look at&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.git.or.cz"&gt;Git&amp;#8217;s Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html"&gt;Git&amp;#8217;s Tutorial&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html"&gt;Git&amp;#8217;s User&amp;#8217;s Manual&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/"&gt;Git&amp;#8217;s man pages&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;for more information.&lt;/p&gt;


	&lt;h2&gt;Converting from Mercurial to Git&lt;/h2&gt;


	&lt;p&gt;I downloaded &lt;a href="http://github.com/vitaly/hg2git/tree/master"&gt;hg2git&lt;/a&gt; and
converted all my repositories to Git (you should be in an empty directory and
it may be an advantage to use &lt;a href="http://zsh.sourceforge.net/"&gt;zsh&lt;/a&gt;):&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
for i in path/to/repos/*
do
  proj=$i:t
  mkdir $proj
  cd $proj
  git init
  hg2git.sh -r path/to/repos/$proj
  git checkout default
  git checkout -b master
  git branch -d default
  cd ..
done
&lt;/code&gt;
&lt;/pre&gt;

	&lt;h2&gt;Missing some things from Mercurial&lt;/h2&gt;


	&lt;p&gt;There are actually two features I somewhat miss in Git. First I cannot clone my local repository to a
remote server without hassles (login to the remote server and create an empty project for example,
or just scp the whole project over&amp;#8230; something like that).&lt;/p&gt;


	&lt;p&gt;Second, Mercurial had very nice short-cuts. For example I could issue &lt;code&gt;hg st&lt;/code&gt; instead of &lt;code&gt;hg status&lt;/code&gt;,
Git also has aliases, but you have to configure them on your own.&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;git config --global alias.ci "commit -a"&lt;/code&gt; adds an alias &amp;#8220;ci&amp;#8221; to commit all updated files (instead of adding
each changed file individually to the index).&lt;/p&gt;


	&lt;h2&gt;Which one is the right one?&lt;/h2&gt;


	&lt;p&gt;Well the question of &amp;#8220;which version control software should I use&amp;#8221; comes up sooner or later
(for some people &lt;strong&gt;so&lt;/strong&gt; late, they won&amp;#8217;t even notice it). I cannot tell you which one is right,
the choice between centralized source code management and a distributed one is the first
step and gives different possibilities (distributed is the way to go, &lt;span class="caps"&gt;IMHO&lt;/span&gt;).&lt;/p&gt;


	&lt;p&gt;Anyway, you&amp;#8217;ve got &lt;a href="http://en.wikipedia.org/wiki/List_of_revision_control_software"&gt;plenty to choose from&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;For me only Darcs, Mercurial and (only recently) Git were interesting enough to dig deeper.
I dumped Darcs because installing it was not so easy, I&amp;#8217;m not root on all the machines I
have access to and to compile a Haskell program into my home-dir was too much work for me.
And of course I heard about some nasty bugs in it&amp;#8230; .&lt;/p&gt;


	&lt;p&gt;Mercurial was awesome (take a look at the &lt;a href="http://video.google.com/videoplay?docid=-7724296011317502612"&gt;Mercurial TechTalk&lt;/a&gt;), but Git won me over for absolutely no reason (mabye because it was envisioned
by Linus Torvalds, maybe because I like C &lt;strong&gt;way&lt;/strong&gt; more than Python).&lt;/p&gt;


	&lt;p&gt;I think most of the time we are not the ones to choose the version control software, anyway.&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Sometimes &amp;#8220;pi = 3.14&amp;#8221; is (a) infinitely faster than the &amp;#8220;correct&amp;#8221; 
answer and (b) the difference between the &amp;#8220;correct&amp;#8221; and the &amp;#8220;wrong&amp;#8221; answer is
meaningless. And this is why I get upset when somebody dismisses performance
issues based on &amp;#8220;correctness&amp;#8221;. The thing is, some specious value of
&amp;#8220;correctness&amp;#8221; is often irrelevant because it doesn&amp;#8217;t matter. While performance
almost &lt;em&gt;always&lt;/em&gt; matters. And I absolutely &lt;em&gt;detest&lt;/em&gt; the fact that people so
often dismiss performance concerns so readily. &amp;#8212;Linus Torvalds&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/LADr1GBkwoA" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/tutorials/git.html</feedburner:origLink></item><item><title>Version Control Status in the Command Line Prompt</title><link>http://feedproxy.google.com/~r/IMHO/~3/QDTIhuvQPeM/zsh_mercurial_notifier.html</link><guid isPermaLink="false">tutorials/zsh_mercurial_notifier@http://blog.interlinked.org</guid><dc:subject>tutorials</dc:subject><dc:subject>tutorials</dc:subject><dc:subject>mercurial</dc:subject><dc:subject>version control</dc:subject><dc:subject>zsh</dc:subject><dc:creator>Michael</dc:creator><dc:date>2008-08-07T19:42:12+00:00</dc:date><description xml:space="preserve">&lt;p&gt;I sometimes forget to push or pull changes to or from a remote repository. To remedy the problem I wrote myself a little script to show me the status on the prompt.&lt;/p&gt;


	&lt;p&gt;The script is written for zsh and Mercurial, but can be easily adapted to other version control systems (I guess).&lt;/p&gt;


	&lt;p&gt;Everytime you change a directory the scripts looks up if there are uncommited changes, remote changes to be pulled or local patchsets to be pushed.&lt;/p&gt;


	&lt;p&gt;The prompt of a directory within a project with uncommited changes would look something like this:&lt;/p&gt;


&lt;pre&gt;
  user@C2D:~/root-dir/subdir %            root-dir: U
&lt;/pre&gt;

	&lt;p&gt;Possible states:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;U: Uncommited changes (use hg commit)&lt;/li&gt;
		&lt;li&gt;I: Incoming patchsets (use hg pull)&lt;/li&gt;
		&lt;li&gt;O: Outgoing patchsets (use hg push)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I have configured Mercurial to automatically update my repository after a pull, but some people might wish to add another status for &amp;#8220;pending updates&amp;#8221; or something like that.&lt;/p&gt;


	&lt;p&gt;The script uses &amp;#8220;&lt;code&gt;hg incoming -q&lt;/code&gt;&amp;#8221; or &amp;#8220;&lt;code&gt;hg outgoing -q&lt;/code&gt;&amp;#8221; to check for sets to be pulled or pushed, so you should configure the default paths in your &lt;code&gt;.hg/hgrc&lt;/code&gt; file for pulling or pushing like this:&lt;/p&gt;


&lt;pre&gt;
  [paths]
  default-push = ssh://yoursever.tld/Projects/PlanToTakeOverTheWorld/
  default = ssh://yourserver.tld/Projects/PlanToTakeOverTheWorld/
&lt;/pre&gt;

	&lt;p&gt;Unfortunately there are a few problems:&lt;/p&gt;


	&lt;p&gt;Accessing remote repositories over some network is costly. If you have a slow network connection you might want to temporarily switch off the remote status commands by using &amp;#8220;&lt;code&gt;export VCSNOREMOTE=true&lt;/code&gt;&amp;#8221; please note that &amp;#8220;&lt;code&gt;export VCSNOREMOTE=false&lt;/code&gt;&amp;#8221; has the same effect, in fact any string would switch off the remote commands. To enable them again use &amp;#8220;&lt;code&gt;export VCSNOREMOTE=&lt;/code&gt;&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;The second problem might be that you have to enter your credentials to access remote servers quite frequently. Use some sort of ssh-agent or something similar to avoid typing in your password all the time.&lt;/p&gt;


	&lt;p&gt;The third thing to remember is that updating the status with &lt;strong&gt;every&lt;/strong&gt; prompt is useless, so I opted for updating after changing a directory (also if you type &lt;code&gt;cd .&lt;/code&gt;) but at least after 60 seconds.&lt;/p&gt;


	&lt;p&gt;Installation: save anywhere on your disk and source it in your .zshrc file.&lt;/p&gt;


	&lt;p&gt;Download: &lt;a href="http://blog.interlinked.org/static/files/vcs_status_prompt"&gt;vcs_status_prompt&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&amp;#8212;
Life is painting a picture, not doing a sum. &amp;#8212;Oliver Wendell Holmes&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/QDTIhuvQPeM" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/tutorials/zsh_mercurial_notifier.html</feedburner:origLink></item><item><title>Emacs Basics</title><link>http://feedproxy.google.com/~r/IMHO/~3/5WY6ezCEvp4/emacs.html</link><guid isPermaLink="false">tutorials/emacs@http://blog.interlinked.org</guid><dc:subject>tutorials</dc:subject><dc:subject>tutorials</dc:subject><dc:subject>emacs</dc:subject><dc:subject>editor</dc:subject><dc:subject>unix</dc:subject><dc:subject>introduction</dc:subject><dc:creator>Michael</dc:creator><dc:date>2008-02-24T21:41:50+00:00</dc:date><description xml:space="preserve">&lt;p&gt;It&amp;#8217;s been a while since I wrote my &lt;a href="http://blog.interlinked.org/tutorials/vim_tutorial.html"&gt;Vim Introduction and
Tutorial&lt;/a&gt; (exactly
one year). A lot happened between now and then, I chose to get a better
feeling about Emacs for example.&lt;/p&gt;


	&lt;p&gt;The reasons aren&amp;#8217;t easily explained; The most prominent reason is the
awesome &lt;a href="http://www.gnu.org/software/auctex/"&gt;AucTex-mode&lt;/a&gt; since I&amp;#8217;m
working heavily with LaTeX lately.&lt;/p&gt;


	&lt;p&gt;Anyways, learning Vim &lt;strong&gt;and&lt;/strong&gt; Emacs is better than learning only one of
them :-).&lt;/p&gt;


	&lt;p&gt;Vim started in 1991 and is based on Bill Joy&amp;#8217;s Vi written in
1976/77. Emacs started as set of macros for the &lt;span class="caps"&gt;TECO&lt;/span&gt; editor 1976 and
was rewritten in 1984 (GNU Emacs). So both editors are based on
concepts invented more than 30 years ago and both editors are very
unlikely to change any time soon.&lt;/p&gt;


	&lt;p&gt;I still like Vim&amp;#8217;s way of doing things, for example the basic commands
are very easy and very fast to reach.&lt;/p&gt;


	&lt;p&gt;At first I wanted to compile something similar to my Vim Tutorial, but
I ended up publishing just a few notes and more or less a cheat-sheet
for Emacs. If you like it more
&lt;em&gt;official&lt;/em&gt; look at the &lt;a href="http://www.gnu.org/software/emacs/tour/"&gt;Emacs Guided
Tour&lt;/a&gt; and its very fine
&lt;a href="http://www.gnu.org/software/emacs/manual/index.html"&gt;documentation&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The best way to get up and running with Emacs is the included
tutorial (start by typing &lt;code&gt;C-h t&lt;/code&gt;).&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m using &lt;a href="http://aquamacs.org/"&gt;Aquamacs&lt;/a&gt; on my Mac and &lt;span class="caps"&gt;GNU &lt;/span&gt;Emacs on
Linux. Both use &lt;span class="caps"&gt;GNU &lt;/span&gt;Emacs 22 at its core, but especially Aquamacs
provides some extensions to make it (almost) seamless on &lt;span class="caps"&gt;OS X&lt;/span&gt;.&lt;/p&gt;


	&lt;h1&gt;Basic Concepts&lt;/h1&gt;


	&lt;p&gt;You can&amp;#8217;t learn Emacs and lean back, every mode Emacs provides offers
its own key bindings and has its own specialities you have to know.&lt;/p&gt;


	&lt;p&gt;So, it doesn&amp;#8217;t matter if you use Vim for day-to-day tasks and Emacs
for special purpose text editing (like typing LaTeX, or interacting
with some math software). Only the most basic commands are the same
for all modes.&lt;/p&gt;


	&lt;h2&gt;Two things to remember&lt;/h2&gt;


	&lt;p&gt;You can cancel any operation either by pressing &lt;code&gt;C-g&lt;/code&gt; or three times &lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;To exit Emacs, type &lt;code&gt;C-x C-c&lt;/code&gt;.&lt;/p&gt;


	&lt;h2&gt;Major/Minor Modes&lt;/h2&gt;


	&lt;p&gt;A Major Mode provides Key-Bindings, Indentation, Display, Syntax
etc. There can be only &lt;strong&gt;one&lt;/strong&gt; Major Mode active at a given time. How
would you mix two different syntax-highlighting schemes?&lt;/p&gt;


	&lt;p&gt;A Minor Mode provides additional bindings and some other behavior. For
example spell-correction, automatic line-breaks etc.&lt;/p&gt;


	&lt;h2&gt;Emacs Lisp functions and key bindings&lt;/h2&gt;


	&lt;p&gt;You can access &lt;strong&gt;all&lt;/strong&gt; functions of Emacs with: &lt;code&gt;M-x&lt;/code&gt; (that&amp;#8217;s &lt;code&gt;&amp;lt;Alt&amp;gt;-x&lt;/code&gt;
or &lt;code&gt;&amp;lt;Meta&amp;gt;-x&lt;/code&gt; or &lt;code&gt;&amp;lt;Esc&amp;gt; x&lt;/code&gt; or &lt;code&gt;&amp;lt;Option&amp;gt;-x&lt;/code&gt; depending on your setup,
preferences and terminology).&lt;/p&gt;


	&lt;p&gt;&lt;code&gt;C-x&lt;/code&gt; means pressing &lt;code&gt;Control&lt;/code&gt; and &lt;code&gt;x&lt;/code&gt; at the same time, &lt;code&gt;&amp;lt;Esc&amp;gt; x&lt;/code&gt;
means pressing &lt;code&gt;Escape&lt;/code&gt; and &lt;code&gt;x&lt;/code&gt; after another.&lt;/p&gt;


	&lt;p&gt;There is no way to bind all functions to some key-combo and it might
be impossible to remember the bindings. So, if you want to replace
some string with some other string type &amp;#8220;&lt;code&gt;M-x repl&amp;lt;Tab&amp;gt;&amp;lt;Tab&amp;gt;&lt;/code&gt;&amp;#8221; and
Emacs gives you possible completions, &amp;#8220;replace-string&amp;#8221; sounds good.&lt;/p&gt;


	&lt;h2&gt;Emacs&amp;#8217; Architecture&lt;/h2&gt;


	&lt;p&gt;Emacs has a small Lisp core written in C. But the &amp;#8220;meat&amp;#8221; of Emacs is the
expansion-library written in Emacs Lisp. Essentially everything you do and
write to extend and configure Emacs is written in Emacs Lisp.&lt;/p&gt;


	&lt;p&gt;The Bookworm has an &lt;a href="http://blog.bookworm.at/2007/03/introduction-to-all-these-emacs.html"&gt;introduction to the Emacs
introductions&lt;/a&gt;.&lt;/p&gt;


	&lt;h2&gt;Undo/Redo&lt;/h2&gt;


	&lt;p&gt;To undo almost every action you did, you can use either &lt;code&gt;undo&lt;/code&gt; as
command or one of the following key-bindings: &lt;code&gt;C-/&lt;/code&gt;, &lt;code&gt;C-_&lt;/code&gt; or &lt;code&gt;C-x u&lt;/code&gt;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Undo &amp;rarr; &lt;code&gt;C-/&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;To redo, you have to switch the &amp;#8220;undo-direction&amp;#8221; with &lt;code&gt;C-g&lt;/code&gt;, after
that you can use the usual undo-key of your choice.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Switch undo-direction &amp;rarr; &lt;code&gt;C-g&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h1&gt;Basic Movement&lt;/h1&gt;


	&lt;ul&gt;
	&lt;li&gt;Character movement
	&lt;ul&gt;
	&lt;li&gt;Up &amp;rarr; &lt;code&gt;C-p&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Down &amp;rarr; &lt;code&gt;C-n&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Left &amp;rarr; &lt;code&gt;C-f&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Right &amp;rarr; &lt;code&gt;C-b&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Page movement
	&lt;ul&gt;
	&lt;li&gt;Page Down &amp;rarr; &lt;code&gt;C-v&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Page Up &amp;rarr; &lt;code&gt;M-v&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Line movement
	&lt;ul&gt;
	&lt;li&gt;Start of Line &amp;rarr; &lt;code&gt;C-a&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;End of Line &amp;rarr; &lt;code&gt;C-e&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Sentence movement
	&lt;ul&gt;
	&lt;li&gt;Start of Sentence &amp;rarr; &lt;code&gt;M-a&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;End of Sentence &amp;rarr; &lt;code&gt;M-e&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Paragraph movement
	&lt;ul&gt;
	&lt;li&gt;Start of Paragraph &amp;rarr; &lt;code&gt;M-{&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;End of Paragraph &amp;rarr; &lt;code&gt;M-}&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Other
	&lt;ul&gt;
	&lt;li&gt;Start of File/Buffer &amp;rarr; &lt;code&gt;M-&amp;lt;&lt;/code&gt; &lt;/li&gt;
		&lt;li&gt;End of File/Buffer &amp;rarr; &lt;code&gt;M-&amp;gt;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h1&gt;Search and Search &amp;#38; Replace&lt;/h1&gt;


	&lt;h2&gt;Searching/Replacing&lt;/h2&gt;


	&lt;ul&gt;
	&lt;li&gt;Incremental Search forward &amp;rarr; &lt;code&gt;C-s&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Incremental Search backward &amp;rarr; &lt;code&gt;C-r&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Incremental Search forward with regular expressions &amp;rarr; &lt;code&gt;search-forward-regexp&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Incremental Search backward with regular expressions &amp;rarr; &lt;code&gt;search-backward-regexp&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Replace some string &amp;rarr; &lt;code&gt;replace-string&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Replace using regular expressions &amp;rarr; &lt;code&gt;replace-regexp&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h1&gt;Text Surgery&lt;/h1&gt;


	&lt;ul&gt;
	&lt;li&gt;Deleting/Killing
	&lt;ul&gt;
	&lt;li&gt;Delete char forward &amp;rarr; &lt;code&gt;C-d&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Delete char backward &amp;rarr; &lt;code&gt;&amp;lt;Backspace&amp;gt;&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Kill word forward &amp;rarr; &lt;code&gt;M-d&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Kill word backward &amp;rarr; &lt;code&gt;M-&amp;lt;Backspace&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Kill to end of line &amp;rarr; &lt;code&gt;C-k&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Kill to end of sentence &amp;rarr; &lt;code&gt;M-k&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Transpose (switch elements)
	&lt;ul&gt;
	&lt;li&gt;Transpose chars &amp;rarr; &lt;code&gt;C-t&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Transpose words &amp;rarr; &lt;code&gt;M-t&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Transpose lines &amp;rarr; &lt;code&gt;C-x C-t&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;Case-operations
	&lt;ul&gt;
	&lt;li&gt;Capitalize word &amp;rarr; &lt;code&gt;M-c&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Uppercase word &amp;rarr; &lt;code&gt;M-u&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Lowercase word &amp;rarr; &lt;code&gt;M-l&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
		&lt;li&gt;Text-completion &amp;rarr; &lt;code&gt;M-/&lt;/code&gt; (repeat to cycle through possible completions)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;New-Lines
	&lt;ul&gt;
	&lt;li&gt;New line &amp;rarr; &lt;code&gt;&amp;lt;Return&amp;gt;&lt;/code&gt; or &lt;code&gt;C-m&lt;/code&gt; (insert a CR before the cursor)&lt;/li&gt;
		&lt;li&gt;Open new Line &amp;rarr; &lt;code&gt;C-o&lt;/code&gt; (insert a CR after the cursor)&lt;/li&gt;
		&lt;li&gt;New line and indent &amp;rarr; &lt;code&gt;C-j&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I like to format my text so that no lines are longer than 78
characters. Either I use the minor mode &lt;code&gt;auto-fill-mode&lt;/code&gt; or I use
&lt;code&gt;M-q&lt;/code&gt; to re-justify (fill) the current paragraph (necessary if you edit a
paragraph after it was auto-filled).&lt;/p&gt;


	&lt;h1&gt;Cut/Copy/Paste&lt;/h1&gt;


	&lt;h2&gt;Basic commands&lt;/h2&gt;


	&lt;p&gt;Maybe you noticed that I changed the terminology of deleting a
character to killing a word. The difference is, that &amp;#8220;killed&amp;#8221; text is
put into the &lt;strong&gt;Yank-Ring&lt;/strong&gt;. From this ring, you can get your text back
(pasting, yank). The size of your yank-ring depends on your setup.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Yank &amp;rarr; &lt;code&gt;C-y&lt;/code&gt;, use &lt;code&gt;M-y&lt;/code&gt; to cycle through the various text-parts.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you&amp;#8217;ve marked some text, use &lt;code&gt;C-w&lt;/code&gt; to cut the text, or &lt;code&gt;M-w&lt;/code&gt; to
copy the text into the yank-ring:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Cut &amp;rarr; &lt;code&gt;C-w&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Copy &amp;rarr; &lt;code&gt;M-w&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Regions&lt;/h2&gt;


	&lt;p&gt;To mark some text, use the mouse, or set a mark with &lt;code&gt;C-&amp;lt;Space&amp;gt;&lt;/code&gt; and
move the cursor to the end point of the region. The text between the
mark and the current cursor-position (also called point) is the &lt;strong&gt;region&lt;/strong&gt;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Set mark &amp;rarr; &lt;code&gt;C-&amp;lt;Space&amp;gt;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;You can jump between point and mark using &lt;code&gt;C-x C-x&lt;/code&gt;, this switches the
mark and the point, so that your region remains intact.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Switch point and mark &amp;rarr; &lt;code&gt;C-x C-x&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you&amp;#8217;ve enabled the &lt;code&gt;transient-mark-mode&lt;/code&gt; Emacs highlights the
region when you create it. As soon as you move the cursor, the region
is still there, but the highlight is gone (verify with &lt;code&gt;C-x C-x&lt;/code&gt; for example).&lt;/p&gt;


	&lt;h2&gt;Rectangles&lt;/h2&gt;


	&lt;p&gt;The mark and point also specify a rectangle over your text (upper
right and lower left edge).&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Kill the rectangle &amp;rarr; &lt;code&gt;C-x r k&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Yank the rectangle &amp;rarr; &lt;code&gt;C-x r y&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Insert space into the rectangle &amp;rarr; &lt;code&gt;C-x r o&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Replace text of the rectangle &amp;rarr; &lt;code&gt;C-x r t&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Clear rectangle (replace with space) &amp;rarr; &lt;code&gt;C-x r c&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;There is an interesting minor mode for additional
rectangle-functionality called &lt;strong&gt;CUA&lt;/strong&gt;.&lt;/p&gt;


	&lt;h1&gt;Frames, Windows and Buffers&lt;/h1&gt;


	&lt;p&gt;Emacs has the concept of Frames, Windows and Buffers. A Frame is a
Window in the common sense, a Window is a part of the frame. For
example if you split the screen of your Emacs frame, you got two
windows within one frame.&lt;/p&gt;


	&lt;p&gt;The last concept is the Buffer, it&amp;#8217;s simply a real or virtual file
(virtual == not saved to disk).&lt;/p&gt;


	&lt;p&gt;Buffer commands:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Load a file (buffer) &amp;rarr; &lt;code&gt;C-x C-f&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Show loaded buffers &amp;rarr; &lt;code&gt;C-x C-b&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Switch to another buffer &amp;rarr; &lt;code&gt;C-x b&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Close a buffer &amp;rarr; &lt;code&gt;C-x k&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Save a buffer &amp;rarr; &lt;code&gt;C-x C-s&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Frame commands:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Open new frame with file &amp;rarr; &lt;code&gt;C-x 5 f&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Close this frame &amp;rarr; &lt;code&gt;C-x 5 0&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Switch to other frame &amp;rarr; &lt;code&gt;C-x 5 o&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Window commands:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Split window vertically &amp;rarr; &lt;code&gt;C-x 2&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Split window horizontally &amp;rarr; &lt;code&gt;C-x 3&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Close all other windows &amp;rarr; &lt;code&gt;C-x 1&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Close this window &amp;rarr; &lt;code&gt;C-x 0&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The Minibuffer (the last line of your Emacs screen) is a buffer
itself, but has some specialities I wont go into now.&lt;/p&gt;


	&lt;h1&gt;Getting Help from Emacs&lt;/h1&gt;


	&lt;p&gt;You could fill some very big books with Emacs-specific information,
but Emacs calls itself a &amp;#8220;self-documenting&amp;#8221; editor. This means that
the documentation reflects exactly how your Emacs is configured. If
you change some key-bindings, the documentation reflects this changes
and displays the right key-combo in the help files.&lt;/p&gt;


	&lt;p&gt;Some hints on how to get going using the help-system:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Show information on the current mode(s) &amp;rarr; &lt;code&gt;C-h m&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Describe the command bound to the given key &amp;rarr; &lt;code&gt;C-h k&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Search for a function &amp;rarr; &lt;code&gt;C-h a&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Describe all key-bindings of the current mode(s) &amp;rarr; &lt;code&gt;C-h b&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h1&gt;Further Information&lt;/h1&gt;


	&lt;p&gt;Steve Yegge has some intersting articles on Emacs:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://steve.yegge.googlepages.com/effective-emacs"&gt;Effective
Emacs&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html"&gt;Shiny and new Emacs
22&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;span class="caps"&gt;IBM&lt;/span&gt; has some nice &lt;a href="http://www.ibm.com/developerworks/views/aix/libraryview.jsp?search_by=emacs+editing+environment"&gt;Emacs tutorials
too&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The &lt;a href="http://www.emacswiki.org"&gt;EmacsWiki&lt;/a&gt; is another excellent source
for Emacs related howtos, downloads and &amp;#8211; to some extend &amp;#8211; discussions.&lt;/p&gt;


	&lt;h1&gt;Wish&lt;/h1&gt;


	&lt;p&gt;I&amp;#8217;d wish that Vim and Emacs would merge. That I could take advantage
of Emacs&amp;#8217; awesome tool-support and Vim&amp;#8217;s awesome way of editing small
junks of text. I know there is Viper-mode and Vimpulse, but both are
not exactly what I want. Viper-mode is plain Vi, and Vimpulse is early
in development.&lt;/p&gt;


	&lt;p&gt;Is there a way to integrate a Vim window into Emacs without emulating
and reimplementing the features?&lt;/p&gt;


	&lt;p&gt;For the time being, I&amp;#8217;ll have to switch between the environments. Vim
as my default-editor and Emacs for special purpose editing.&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Emacs outshines all other editing software in approximately the same
way that the noonday sun does the stars. It is not just bigger and
brighter; it simply makes everything else vanish. &amp;#8212;Neal Stephenson&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/5WY6ezCEvp4" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/tutorials/emacs.html</feedburner:origLink></item><item><title>Free and Open Source Math Programs</title><link>http://feedproxy.google.com/~r/IMHO/~3/vsMUAp9YGNI/open_source_math_programs.html</link><guid isPermaLink="false">science/open_source_math_programs@http://blog.interlinked.org</guid><dc:subject>science</dc:subject><dc:subject>science</dc:subject><dc:subject>software</dc:subject><dc:subject>math</dc:subject><dc:subject>windows</dc:subject><dc:subject>mac os x</dc:subject><dc:subject>linux</dc:subject><dc:creator>Michael</dc:creator><dc:date>2008-02-24T14:36:21+00:00</dc:date><description xml:space="preserve">&lt;p&gt;In this post I&amp;#8217;ll go through some of the most prominent math programs
available with source code.&lt;/p&gt;


	&lt;p&gt;This is by no means &amp;#8220;original&amp;#8221; work, I just collected the headlines and links
to various mathematical software projects out there. This started with an
offer of my University (Mathematica for 13 Euro), but I don&amp;#8217;t want to invest
time in a tool I won&amp;#8217;t have (free, or almost free) access to for the rest of
my life.&lt;/p&gt;


	&lt;p&gt;The programs differ in their respective foci, the main areas are
&lt;a href="http://en.wikipedia.org/wiki/Computer_algebra_system"&gt;Computer Algebra
System&lt;/a&gt;,
&lt;a href="http://en.wikipedia.org/wiki/Numerical_analysis"&gt;Numerical Analysis&lt;/a&gt;,
&lt;a href="http://en.wikipedia.org/wiki/Statistics"&gt;Statistics&lt;/a&gt; and general
purpose desktop calculators.&lt;/p&gt;


	&lt;p&gt;My current choice is &lt;em&gt;SAGE&lt;/em&gt; and &lt;em&gt;R&lt;/em&gt; for my math and statistics
needs. For simple calculations I usually use the calculator included
with the OS or some interactive programming-shell (&lt;code&gt;ghci&lt;/code&gt; or &lt;code&gt;irb&lt;/code&gt;).&lt;/p&gt;


	&lt;h2&gt;Hybrid&lt;/h2&gt;


	&lt;h3&gt;&lt;a href="http://www.sagemath.org/"&gt;SAGE&lt;/a&gt;&lt;/h3&gt;


	&lt;p&gt;&lt;span class="caps"&gt;SAGE&lt;/span&gt; is the new star on the open-source math sky. Essentially it is a
&lt;span class="caps"&gt;CAS&lt;/span&gt; written in Python, but it provides interfaces to many math programs
available. This includes commercial programs like Mathematica and
Maple as well as free programs like Maxima, Octave or Singular.&lt;/p&gt;


	&lt;p&gt;From the homepage:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Each interface requires that the corresponding software is
installed on your computer. &lt;span class="caps"&gt;SAGE&lt;/span&gt; includes &lt;span class="caps"&gt;GAP&lt;/span&gt;, PARI, Singular, and
Maxima, but does not include Octave (very easy to install), &lt;span class="caps"&gt;MAGMA&lt;/span&gt;
(non-free), Maple (non-free), or Mathematica (non-free).&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;&lt;span class="caps"&gt;SAGE&lt;/span&gt; runs as service on your server or desktop and you use your
browser to interact with it (you can also use the command-line
interface, though). It is very well documented and gives you
access to the source code of the algorithms right within your browser.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Use &lt;span class="caps"&gt;SAGE&lt;/span&gt; for studying a huge range of mathematics, including
algebra, calculus, elementary to very advanced number theory,
cryptography, numerical computation, commutative algebra, group
theory, combinatorics, graph theory, and exact linear algebra.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;The goal of the &lt;span class="caps"&gt;SAGE&lt;/span&gt; project, which started 2005, is to provide the
&lt;a href="http://www.ddj.com/linux-open-source/204702621"&gt;best mathematical software in the
world&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;SAGE&lt;/span&gt; is pretty large (on my Mac it uses 722MB right after the
installation), but you can find even more (optional packages etc) at
their homepage.&lt;/p&gt;


	&lt;p&gt;It&amp;#8217;s also possible to interact with it via Texmacs or Emacs (again,
available from their download page).&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;SAGE&lt;/span&gt; is available for Windows, Linux and Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.sagemath.org/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.sagemath.org/download.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="https://www.sagenb.org/"&gt;Online Demo&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.sagemath.org/doc/html/tut/index.html"&gt;Tutorial&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.sagemath.org/documentation.html"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.flickr.com/photos/sagescreenshots/sets/72157603532209437/"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Computer Algebra System&lt;/h2&gt;


	&lt;h3&gt;&lt;a href="http://maxima.sourceforge.net/"&gt;Maxima&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Maxima is a system for the manipulation of symbolic and numerical
expressions, including differentiation, integration, Taylor series,
Laplace transforms, ordinary differential equations, systems of linear
equations, polynomials, and sets, lists, vectors, matrices, and
tensors. Maxima yields high precision numeric results by using exact
fractions, arbitrary precision integers, and arbitrarily precision
floating point numbers. Maxima can plot functions and data in two and
three dimensions.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Maxima is very mature and stood the test of time. It started in 1982
and is &amp;#8220;free&amp;#8221; since 1998.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://maxima.sourceforge.net/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://maxima.sourceforge.net/download.shtml"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://maxima.sourceforge.net/docs.shtml"&gt;Documentation/Tutorial&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://maxima.sourceforge.net/screenshots.shtml"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Maxima is included in &lt;span class="caps"&gt;SAGE&lt;/span&gt;.&lt;/p&gt;


	&lt;h3&gt;&lt;a href="http://savannah.nongnu.org/projects/axiom/"&gt;Axiom&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Axiom is a general purpose Computer Algebra system. It is useful
for doing mathematics by computer and for research and development of
mathematical algorithms. It defines a strongly typed, mathematically
correct type hierarchy. It has a programming language and a built-in
compiler.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://page.axiom-developer.org/"&gt;Homepage&lt;/a&gt; or at &lt;a href="http://savannah.nongnu.org/projects/axiom/"&gt;Savannah&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://page.axiom-developer.org/axiom-website/download.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://page.axiom-developer.org/axiom-website/documentation.html"&gt;Documentation/Tutorial&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://page.axiom-developer.org/axiom-website/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;&lt;a href="http://yacas.sourceforge.net/homepage.html"&gt;Yacas&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;YACAS is an easy to use, general purpose Computer Algebra System,
a program for symbolic manipulation of mathematical expressions. It
uses its own programming language designed for symbolic as well as
arbitrary-precision numerical computations. The system has a library
of scripts that implement many of the symbolic algebra operations; new
algorithms can be easily added to the library. &lt;span class="caps"&gt;YACAS&lt;/span&gt; comes with
extensive documentation (hundreds of pages) covering the scripting
language, the functionality that is already implemented in the system,
and the algorithms we used.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://yacas.sourceforge.net/homepage.html"&gt;Homepage&lt;/a&gt; Downlaods,
  Screenshots, Tutorial, Manual and Demo are available there.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;&lt;a href="http://pari.math.u-bordeaux.fr/"&gt;PARI/GP&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;PARI/GP is a widely used computer algebra system designed for fast
computations in number theory (factorizations, algebraic number
theory, elliptic curves&amp;#8230;), but also contains a large number of other
useful functions to compute with mathematical entities such as
matrices, polynomials, power series, algebraic numbers etc., and a lot
of transcendental functions. &lt;span class="caps"&gt;PARI&lt;/span&gt; is also available as a C library to
allow for faster computations.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://pari.math.u-bordeaux.fr/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://pari.math.u-bordeaux.fr/download.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://pari.math.u-bordeaux.fr/doc.html"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;span class="caps"&gt;PARI&lt;/span&gt;/GP is included in &lt;span class="caps"&gt;SAGE&lt;/span&gt;.&lt;/p&gt;


	&lt;h3&gt;&lt;a href="http://www.singular.uni-kl.de/"&gt;Singular&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;SINGULAR is a Computer Algebra System for polynomial computations
with special emphasis on the needs of commutative algebra, algebraic
geometry, and singularity theory.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.singular.uni-kl.de/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.singular.uni-kl.de/download.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.singular.uni-kl.de/Manual/latest/index.htm"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Singular is included in &lt;span class="caps"&gt;SAGE&lt;/span&gt;.&lt;/p&gt;


	&lt;h3&gt;&lt;a href="http://www-gap.mcs.st-and.ac.uk/"&gt;GAP&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;GAP is a system for computational discrete algebra, with
particular emphasis on Computational Group Theory. &lt;span class="caps"&gt;GAP&lt;/span&gt; provides a
programming language, a library of thousands of functions implementing
algebraic algorithms written in the &lt;span class="caps"&gt;GAP&lt;/span&gt; language as well as large data
libraries of algebraic objects.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www-gap.mcs.st-and.ac.uk/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www-gap.mcs.st-and.ac.uk/Download/index.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www-gap.mcs.st-and.ac.uk/Doc/doc.html"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;span class="caps"&gt;GAP&lt;/span&gt; is included in &lt;span class="caps"&gt;SAGE&lt;/span&gt;.&lt;/p&gt;


	&lt;h3&gt;&lt;a href="http://www.math.uiuc.edu/Macaulay2/"&gt;Macaulay2&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Macaulay 2 is a software system devoted to supporting research in
algebraic geometry and commutative algebra.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.math.uiuc.edu/Macaulay2/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.math.uiuc.edu/Macaulay2/Downloads/index.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.math.uiuc.edu/Macaulay2/Book/"&gt;Book&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Numerical Analysis/Computation&lt;/h2&gt;


	&lt;h3&gt;&lt;a href="http://www.gnu.org/software/octave/"&gt;Octave&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;GNU Octave is a high-level language, primarily intended for
numerical computations. It provides a convenient command line
interface for solving linear and nonlinear problems numerically, and
for performing other numerical experiments using a language that is
mostly compatible with Matlab. It may also be used as a batch-oriented
language.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.gnu.org/software/octave/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.gnu.org/software/octave/download.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.gnu.org/software/octave/docs.html"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;&lt;a href="http://mathsrv.ku-eichstaett.de/MGF/homes/grothmann/euler/index.html"&gt;Euler&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Euler is a powerful interactive numerical laboratory. It quickly
evaluates numerical functions, visualizes results, and allows to test
and program numerical algorithms. The system can handle real, complex
and interval numbers, vectors and matrices, and additionally a long
data type for exact computation. Most routines are written in the high
level Euler language and can be modified or extended by the user.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://mathsrv.ku-eichstaett.de/MGF/homes/grothmann/euler/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mathsrv.ku-eichstaett.de/MGF/homes/grothmann/euler/euler_download.html"&gt;Download&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mathsrv.ku-eichstaett.de/MGF/homes/grothmann/euler/sceenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;&lt;a href="http://www.scilab.org/"&gt;Scilab&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Scilab is a scientific software package for numerical computations
providing a powerful open computing environment for engineering and
scientific applications.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.scilab.org/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.scilab.org/download/"&gt;Download&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Statistics&lt;/h2&gt;


	&lt;h3&gt;&lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt;&lt;/h3&gt;


	&lt;p&gt;If you want to do some statistics there is no way around &amp;#8220;R&amp;#8221;. At least
not in the free and open-source software world.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;R provides a wide variety of statistical (linear and nonlinear
modelling, classical statistical tests, time-series analysis,
classification, clustering, ...) and graphical techniques, and is
highly extensible.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;I think R is a tool everyone should be familiar with, at least with the
most basic operations. Statistics is such an important every-day tool
you can immediately put to work as soon as you know something,
anything, about it.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.r-project.org/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://cran.r-project.org/manuals.html"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.cyclismo.org/tutorial/R/"&gt;Tutorial&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.r-project.org/screenshots/screenshots.html"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.r-project.org/doc/bib/R-books.html"&gt;Books&lt;/a&gt; (currently 53 books!)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Command-Line/Desktop Calculator&lt;/h2&gt;


	&lt;p&gt;Sometimes you just want to calculate very simple things, for this task
a full fledged system isn&amp;#8217;t really appropriate.&lt;/p&gt;


	&lt;h3&gt;&lt;a href="http://www.gnu.org/software/bc/"&gt;bc&lt;/a&gt;&lt;/h3&gt;


	&lt;blockquote&gt;
		&lt;p&gt;bc is an arbitrary precision numeric processing language. Syntax
is similar to C, but differs in many substantial areas. It supports
interactive execution of statements. bc is a utility included in the
&lt;span class="caps"&gt;POSIX P1003&lt;/span&gt;.2/D11 draft standard.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.gnu.org/software/bc/"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.gnu.org/software/bc/manual/bc.html"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;bc is usually installed on any Linux/Unix system or available via its
package management.&lt;/p&gt;


	&lt;h3&gt;&amp;#8220;Other&amp;#8221; command-line/desktop calculators&lt;/h3&gt;


	&lt;p&gt;Essentially you can use any interactive shell, like Python&amp;#8217;s &lt;code&gt;python&lt;/code&gt;
or Ruby&amp;#8217;s &lt;code&gt;irb&lt;/code&gt; as well as Haskell&amp;#8217;s &lt;code&gt;ghci&lt;/code&gt; or &lt;code&gt;hugs&lt;/code&gt;.&lt;/p&gt;


	&lt;h3&gt;GUI Calculators&lt;/h3&gt;


	&lt;p&gt;Despite the included Desktop Calculators there are some very fine
products out there, here some pearls I could find:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://home.swiftdsl.com.au/~mattg/"&gt;Magic Number Machine&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
		&lt;li&gt;Linux
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://qalculate.sourceforge.net/"&gt;Qualculate!&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://calcoo.sourceforge.net/"&gt;Calcoo&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
		&lt;li&gt;Windows
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://calcoo.sourceforge.net/win/"&gt;Calcoo for Windows&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Any suggestions?&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If nothing else, there is always &lt;a href="http://www.google.com/search?q=2%2B2*(9%5E2)"&gt;Google Calc&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Not being able to check the code of a computer-based calculation is like not
publishing proofs for a mathematical theorem, it&amp;#8217;s ludicrous. &amp;#8212;William
Stein, author of &lt;span class="caps"&gt;SAGE&lt;/span&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/vsMUAp9YGNI" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/science/open_source_math_programs.html</feedburner:origLink></item><item><title>Addendum to "Time Machine for every Unix out there"</title><link>http://feedproxy.google.com/~r/IMHO/~3/GHODat8KHgY/rsync_addendum.yaml.html</link><guid isPermaLink="false">tutorials/rsync_addendum.yaml@http://blog.interlinked.org</guid><dc:subject>tutorials</dc:subject><dc:subject>tutorials</dc:subject><dc:subject>rsync</dc:subject><dc:subject>backup</dc:subject><dc:subject>unix</dc:subject><dc:subject>linux</dc:subject><dc:subject>windows</dc:subject><dc:subject>Max OS X</dc:subject><dc:creator>Michael</dc:creator><dc:date>2007-12-06T10:55:36+00:00</dc:date><description xml:space="preserve">&lt;p&gt;My article about using rsync to mimic the behavior of Apple&amp;#8217;s Time Machine generated a lot of traffic, and more important, a lot of feedback.&lt;/p&gt;


	&lt;p&gt;In this article I&amp;#8217;ll summarize and try to clarify a few things.&lt;/p&gt;


	&lt;p&gt;First of all: I didn&amp;#8217;t invent any of the things I&amp;#8217;ve written in the &lt;a href="http://blog.interlinked.org/tutorials/rsync_time_machine.html"&gt;article&lt;/a&gt;! All I did was to write it up in a manner I could understand it. The rsync developer(s) included the feature(s) for a specific purpose which might be exactly what we do now. But this was obvious, I hope.&lt;/p&gt;


	&lt;h1&gt;Time Machine and Performance&lt;/h1&gt;


	&lt;p&gt;&lt;a href="http://arstechnica.com/reviews/os/mac-os-x-10-5.ars/14"&gt;Ars Technica&lt;/a&gt; has a very deep review of the new features of Leopard, including Time Machine.&lt;/p&gt;


	&lt;p&gt;Interestingly they do very much the same as I did in my script &amp;#8211; each Backup gets its own folder and there is a link to the latest.&lt;/p&gt;


	&lt;p&gt;Some readers complained that Time Machine looks only at the changed files, where my script has to look at each file on the disk. For me, the difference is negligible. Apple introduced hard-links to &lt;strong&gt;directories&lt;/strong&gt;, which saves a lot of time and a bit of space. Unfortunately this feature isn&amp;#8217;t availabel on plain Unix, but it&amp;#8217;s a neat trick!&lt;/p&gt;


	&lt;h1&gt;Restoring the Files&lt;/h1&gt;


	&lt;p&gt;Since we make full backups each time, you have your whole and complete directory structure in that Backup-directories.&lt;/p&gt;


	&lt;p&gt;Restoring a file is merely a simple &lt;code&gt;copy&lt;/code&gt; command.&lt;/p&gt;


	&lt;p&gt;Or, if you want to restore the whole filesystem, use:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;&lt;code&gt;rsync -avz --delete host:/Backup/scurrent/ /target/&lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;But keep in mind that &lt;strong&gt;&amp;#8212;delete&lt;/strong&gt; removes any file which is not in the backup!&lt;/p&gt;


	&lt;h1&gt;Removing old Backups&lt;/h1&gt;


	&lt;p&gt;Another huge advantage of full backups is: &lt;em&gt;you can delete any backup you don&amp;#8217;t need anymore&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;Of course each backup-directory takes space, if only for the hard-links and directory structure. Cleaning up the backups is a breeze: just delete the directories you don&amp;#8217;t need anymore. For example you could delete all directories older than 2 months or keep one week full, then only the monday backup. There are plenty of possibilities.&lt;/p&gt;


	&lt;h1&gt;Other Tools&lt;/h1&gt;


	&lt;p&gt;Many people suggested many interesting tools for doing backups. My argument against using such tools is that rsync is everywhere!&lt;/p&gt;


	&lt;p&gt;You find rsync in the smallest Linux distributions (like &lt;a href="http://damnsmalllinux.org/"&gt;DSL&lt;/a&gt;), on PDAs like the &lt;a href="http://www.killefiz.de/zaurus/search.php?q=rsync&amp;#38;x=0&amp;#38;y=0"&gt;Zaurus&lt;/a&gt;, on Windows using &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; and also on Nokia&amp;#8217;s Internet Tablets.&lt;/p&gt;


	&lt;p&gt;One backup strategy for all your devices!&lt;/p&gt;


	&lt;h1&gt;Space Requirements for the Links&lt;/h1&gt;


	&lt;p&gt;Nothing in life is free, but the space used by the hardlinks for the backup is marginal. It is also dependent on the filesystem you use, ReiserFS seems to do a good job in packing more links in one cluster. But hey, these things are &lt;strong&gt;Backups&lt;/strong&gt; you throw away space anyways!&lt;/p&gt;


	&lt;h1&gt;Colon&lt;/h1&gt;


	&lt;p&gt;There is one particular problem using a colon in the script: some operating systems don&amp;#8217;t like them.&lt;/p&gt;


	&lt;p&gt;Here an updated version of the script without colons:&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
 #!/bin/sh

 date=`date "+%Y-%m-%dT%H_%M_%S"`
 rsync -azPE --link-dest=PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date \
   &amp;#38;&amp;#38; ssh $HOST "rm PATHTOBACKUP/current \
   &amp;#38;&amp;#38; ln -s back-$date PATHTOBACKUP/current" 
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Another slight change in the script is, that all commands are connected with &lt;code&gt;&amp;#38;&amp;#38;&lt;/code&gt;. This means the next command is only done when the previous command returned no error.&lt;/p&gt;


	&lt;p&gt;Of course, if anything messes up the &amp;#8220;current&amp;#8221; link, the script just makes another full backup without the links to the previous version.&lt;/p&gt;


	&lt;h1&gt;Extended Attributes on &lt;span class="caps"&gt;OS X&lt;/span&gt;&lt;/h1&gt;


	&lt;p&gt;One user suggested the addition of the &lt;code&gt;-E&lt;/code&gt; parameter on Mac &lt;span class="caps"&gt;OS X&lt;/span&gt;. If you use the parameter on non-OS X machines it&amp;#8217;s more or less redundant (&lt;code&gt;-a&lt;/code&gt; contains executability), but on &lt;span class="caps"&gt;OS X&lt;/span&gt; some additional information is backed up.&lt;/p&gt;


	&lt;p&gt;Just use it.&lt;/p&gt;


	&lt;h1&gt;Windows&lt;/h1&gt;


	&lt;p&gt;Some users reported success with this strategy on Windows. I&amp;#8217;m happy that we now have a unified backup strategy for all major operating systems without paying a single cent.&lt;/p&gt;


	&lt;p&gt;You have to use Cygwin to install rsync (there are binaries without the whole Cygwin on the net, &lt;a href="http://optics.ph.unimelb.edu.au/help/rsync/rsync_pc1.html"&gt;here for example&lt;/a&gt;).&lt;/p&gt;


	&lt;h1&gt;Measuring the Space Requirements&lt;/h1&gt;


	&lt;p&gt;To lookup how much space your particular backups need, simply issue &lt;code&gt;du -shc back-*&lt;/code&gt;. This prints each backup directory with its real memory usage:&lt;/p&gt;


&lt;pre&gt;
  me@myserver:Backups % du -shc back-*                                                                                                               
  406M  back-2007-11-12T12:00:00
  6.8M  back-2007-11-13T20:28:56
  189M  back-2007-11-13T23:42:54
  2.6G  back-2007-11-14T08:15:43
  1.8M  back-2007-11-15T20:07:07
  7.9M  back-2007-11-18T23:57:09
  11M back-2007-11-19T21:53:34
  2.6M  back-2007-11-21T18:57:40
  2.1M  back-2007-11-21T19:11:02
  11M back-2007-11-22T01:19:38
  1.9M  back-2007-11-22T11:05:17
  19M back-2007-11-22T18:37:56
  7.4M  back-2007-11-22T22:45:04
  8.5M  back-2007-11-22T22:51:29
  9.2M  back-2007-11-24T12:45:12
  4.2M  back-2007-11-24T17:30:38
  11M back-2007-11-25T00:41:19
  1.9M  back-2007-11-27T20:41:40
  317M  back-2007-12-03T10:19:07
  12M back-2007-12-05T11:51:19
  3.6G  total
  me@myserver:Backups % 
&lt;/pre&gt;

	&lt;p&gt;As you can see, the smallest backup (obviously without any changed file) requires 1.8MB.&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Backups are typically that last line of defense against data loss, and consequently the least granular and the least convenient to use. &amp;#8212;Yosemite Technologies&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/GHODat8KHgY" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/tutorials/rsync_addendum.yaml.html</feedburner:origLink></item><item><title>Time Machine for every Unix out there</title><link>http://feedproxy.google.com/~r/IMHO/~3/UhiwBAxiiK8/rsync_time_machine.html</link><guid isPermaLink="false">tutorials/rsync_time_machine@http://blog.interlinked.org</guid><dc:subject>tutorials</dc:subject><dc:subject>tutorials</dc:subject><dc:subject>rsync</dc:subject><dc:subject>backup</dc:subject><dc:subject>unix</dc:subject><dc:subject>linux</dc:subject><dc:subject>Mac OS X</dc:subject><dc:creator>Michael</dc:creator><dc:date>2007-11-13T20:55:57+00:00</dc:date><description xml:space="preserve">&lt;p&gt;&lt;a href="http://rsync.samba.org"&gt;rsync&lt;/a&gt; is one of the tools that have gradually infiltrated my day to day tool-box (aside Vim and Zsh).&lt;/p&gt;


	&lt;p&gt;Using rsync it&amp;#8217;s very easy to mimic Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; new feature called Time Machine. In this article I&amp;#8217;ll show how to do it, but there is still a nice &lt;span class="caps"&gt;GUI&lt;/span&gt; missing &amp;#8211; for those who like it shiny.&lt;/p&gt;


	&lt;h2&gt;What Time Machine does&lt;/h2&gt;


	&lt;p&gt;Time Machine makes a snapshot of your files every hour. The files are usually stored on a external hard drive connected to your Mac via &lt;span class="caps"&gt;USB&lt;/span&gt; or Firewire. Earlier Leopard versions (ADC preview versions) had the ability to make the backups to a remote drive (I&amp;#8217;ve heard).&lt;/p&gt;


	&lt;p&gt;So if you lose a file, or did a devastating change to one of your files, simply go back in time until you find your file or a version that&amp;#8217;s not corrupted.&lt;/p&gt;


	&lt;p&gt;Incrementally backing up all files every hour so that you can access them in reversed chronological order isn&amp;#8217;t that hard with standard Unix utilities like rsync. The only missing thing is a nice &lt;span class="caps"&gt;GUI&lt;/span&gt; for which Apple is known to be quite good at.&lt;/p&gt;


	&lt;h2&gt;Making full backups in no time every hour&lt;/h2&gt;


	&lt;p&gt;You can use this method to make a backup every hour or every ten minutes if you like. There are many many features you can tune or configure to your own taste &amp;#8211; excluding files that are larger than 1GB for example.&lt;/p&gt;


	&lt;p&gt;So, here the command to make the backup:&lt;/p&gt;


&lt;code&gt;
&lt;pre&gt;
 rsync -aP --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP
&lt;/pre&gt;
&lt;/code&gt;

	&lt;p&gt;Lets go through the parameters step by step.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;-a&lt;/code&gt; means Archive and includes a bunch of parameters to recurse directories, copy symlinks as symlinks, preserve permissions, preserve modification times, preserve group, preserve owner, and preserve device files. You usually want that option for all your backups.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;-P&lt;/code&gt; allows rsync to continue interrupted transfers and show a progress status for each file. This isn&amp;#8217;t really necessary but I like it.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;--link-dest&lt;/code&gt; this is a neat way to make full backups of your computers without losing much space. rsync links unchanged files to the previous backup (using hard-links, see below if you don&amp;#8217;t know hard-links) and only claims space for changed files. This only works if you have a backup at hand, otherwise you have to make at least one backup beforehand.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;PATHTO/$PREVIOUSBACKUP&lt;/code&gt; is the path to the previous backup for linking. Note: if you delete this directory, &lt;strong&gt;no other backup is harmed&lt;/strong&gt; because rsync uses &lt;strong&gt;hard-links&lt;/strong&gt; and the operating system (or filesystem) takes care of releasing space if no link points to that region anymore.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;$SOURCE&lt;/code&gt; is the directory you&amp;#8217;d like to backup.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;$CURRENTBACKUP&lt;/code&gt; is the directory to which you&amp;#8217;d like to make the backup. This should be a &lt;strong&gt;non-existing directory&lt;/strong&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;As said earlier, rsync has many many features. To exclude files over a certain size for example, use the option &lt;code&gt;--max-size&lt;/code&gt; (unfortunately this is not available on the rsync version shipped with Mac &lt;span class="caps"&gt;OS X &lt;/span&gt;Leopard). The man page or the &lt;a href="http://rsync.samba.org/documentation.html"&gt;documentation&lt;/a&gt; can give you plenty of ideas in this direction.&lt;/p&gt;


	&lt;p&gt;So much for the theory of the most important command for our purpose. Here a simple script that makes an incremental backup every time you call it:&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
 #!/bin/sh

 date=`date "+%Y-%m-%dT%H:%M:%S"`
 rsync -aP --link-dest=$HOME/Backups/current /path/to/important_files $HOME/Backups/back-$date
 rm $HOME/Backups/current
 ln -s back-$date $HOME/Backups/current
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;The script creates a file called &amp;#8220;back&amp;#8221; appended by the current date and time, for example &lt;code&gt;back-2007-11-13T22:03:32&lt;/code&gt; which contains the &lt;strong&gt;full backup&lt;/strong&gt;. Then there is a symbolic link called &amp;#8220;current&amp;#8221; which points to the most recent directory. This directory-link is used for the &lt;code&gt;--link-dest&lt;/code&gt; parameter.&lt;/p&gt;


	&lt;p&gt;You should look at the &lt;code&gt;--exclude&lt;/code&gt; parameter (or better, &lt;code&gt;--exclude-from=&lt;/code&gt; parameter) and learn how to exclude certain files or directories from the backup (you shouldn&amp;#8217;t backup your backup for example).&lt;/p&gt;


	&lt;p&gt;The script above only works on the local machine because making links on a remote machine needs some extra work. But not much:&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;
 #!/bin/sh

 date=`date "+%Y-%m-%dT%H:%M:%S"`
 rsync -azP --link-dest=PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date
 ssh $HOST "rm PATHTOBACKUP/current &amp;#38;&amp;#38; ln -s back-$date PATHTOBACKUP/current" 
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;To get that working you either use a public/private key authentication scheme or something else to avoid typing in your password. Another possibility is, of course, to mount the remote file-system on the local computer using the above script.&lt;/p&gt;


	&lt;p&gt;On my setup the script takes about 6 seconds to synchronize 46968 files and 29GB &amp;#8211; this takes 20MB for the file structure (with no actual files to transfer of course). But afterwards, I have a complete backup of my system in a new directory.&lt;/p&gt;


	&lt;p&gt;On a much bigger setup (1.2 million files and 50GB of data) the backup takes about 30 minutes and takes about 3GB of space (just for links!), so it isn&amp;#8217;t exactly &lt;strong&gt;free&lt;/strong&gt;, but very convenient.&lt;/p&gt;


	&lt;p&gt;The space needed for the backup is determined by the shape of your directory structure. On the larger setup I have lots of Maildirs and a very deep directory structure so it takes much more space than my home-directory backup above. 3GB is quite a lot, but 20MB doesn&amp;#8217;t hurt.&lt;/p&gt;


	&lt;h2&gt;Advanced &lt;code&gt;rsync&lt;/code&gt; parameters&lt;/h2&gt;


	&lt;p&gt;Additional to the parameters described above, I usually employ a combination of these parameters in my backup:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;--delete&lt;/code&gt; and &lt;code&gt;--delete-excluded&lt;/code&gt; this tells rsync to remove files from my backups either if they are gone on my local machine, or if I decided to exclude them from my backup.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;--exclude-from=FILE&lt;/code&gt; the file specified here is a simple list of directories of files (one per line) which should &lt;strong&gt;not&lt;/strong&gt; be backed up. My &lt;code&gt;Trash&lt;/code&gt; folder oder some &lt;code&gt;.cache&lt;/code&gt; folders are candidates for this file.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;-P&lt;/code&gt; is used to give more information on how far the backup is, and how many files are to be backed up. Additional it could resume an interrupted transfer (which doesn&amp;#8217;t apply here because we create a blank backup each time we call the script).&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;-x&lt;/code&gt; this one is &lt;strong&gt;important&lt;/strong&gt; because it prohibits rsync to go beyond the local filesystem. For example if you backup you Linux-root partition, you should not include the /proc directory because rsync will get stuck in it. &lt;code&gt;-x&lt;/code&gt; excludes all mounted filesystems from the backup which is probably what you want in most cases.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Hard-Links&lt;/h2&gt;


	&lt;p&gt;Each file in a directory is a link to the actual data on your hard-disk. The file-system keeps track of how many links to a area point, and only if the last link is deleted, the whole area gets deleted (in contrast to soft-links, these are pointers to the file-name, not the contents).&lt;/p&gt;


	&lt;p&gt;Here an illustration of two backups with three files each. &lt;code&gt;File1&lt;/code&gt; and &lt;code&gt;File2&lt;/code&gt; are the &lt;em&gt;same&lt;/em&gt; in both backups, only &lt;code&gt;File3&lt;/code&gt; changed between &lt;code&gt;Backup1&lt;/code&gt; and &lt;code&gt;Backup2&lt;/code&gt;. So in &lt;code&gt;Backup2&lt;/code&gt;, &lt;code&gt;File3 (changed)&lt;/code&gt; has to point to a different area than &lt;code&gt;File3&lt;/code&gt; in &lt;code&gt;Backup1&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/hardlinks.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&lt;span class="caps"&gt;BTW&lt;/span&gt;, there is a &lt;a href="http://code.google.com/p/flyback/"&gt;nice project for Linux&lt;/a&gt; out there which provides the same functionality as Time Machine including a nice &lt;span class="caps"&gt;GUI&lt;/span&gt; which is also based on &lt;strong&gt;&lt;code&gt;rsync&lt;/code&gt;&lt;/strong&gt; and the procedure presented here.&lt;/p&gt;


	&lt;h2&gt;The End&lt;/h2&gt;


	&lt;p&gt;Credit: The initial idea for this approach came from &lt;a href="http://www.mikerubel.org/computers/rsync_snapshots/"&gt;Mike Rubel &amp;#8211; rsync snapshots&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Also interesting if you have to cope with Windows: &lt;a href="http://www.softlab.ntua.gr/~ttsiod/backup.html"&gt;Optimal remote backups with rsync over Samba&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;There are quite a few approaches out there which more or less do the same, but rsync is available on virtually every Unix out there (even the &lt;a href="http://damnsmalllinux.org/"&gt;DSL&lt;/a&gt; with its 50MB footprint includes rsync). So using other tools might be more convenient, but I&amp;#8217;ll stick with the omnipresent rsync.&lt;/p&gt;


	&lt;p&gt;rsync offers the possibility to store only the differences to the previous backup (using &lt;code&gt;--compare-dest&lt;/code&gt; which should point to a full-backup instead of &lt;code&gt;--link-dest&lt;/code&gt;). It then doesn&amp;#8217;t make links to the unchanged files, it just leaves them out. This way you get an incremental backup without the &amp;#8220;directory-overhead&amp;#8221; of the &lt;code&gt;--link-dest&lt;/code&gt; approach. &lt;strong&gt;But&lt;/strong&gt; you have to be &lt;strong&gt;extremely&lt;/strong&gt; cautious which one of older backups you delete because the newer backups just don&amp;#8217;t contain some of these files (think of full-backups as checkpoints)! Using the &lt;code&gt;--link-dest&lt;/code&gt; you can delete all backups but the last and you still got all the files, so I&amp;#8217;m happy to pay 20MB per backup for this safety.&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
The universe tends toward maximum irony. Don&amp;#8217;t push it. &amp;#8212;&lt;a href="http://jwz.livejournal.com/801607.html"&gt;JWZ&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/UhiwBAxiiK8" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/tutorials/rsync_time_machine.html</feedburner:origLink></item><item><title>My Mac OS X Setup</title><link>http://feedproxy.google.com/~r/IMHO/~3/fU38Wg42ZQQ/mac_setup.html</link><guid isPermaLink="false">tutorials/mac_setup@http://blog.interlinked.org</guid><dc:subject>tutorials</dc:subject><dc:subject>tutorials</dc:subject><dc:subject>mac os x</dc:subject><dc:subject>setup</dc:subject><dc:creator>Michael</dc:creator><dc:date>2007-11-04T18:04:03+00:00</dc:date><description xml:space="preserve">&lt;p&gt;Installing Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; on a Mac is a breeze, yet I usually do two things after the installation to improve stability.&lt;/p&gt;


	&lt;h2&gt;Hibernation/Safe Sleep&lt;/h2&gt;


	&lt;p&gt;The newer Macs come with a feature called &amp;#8220;Hibernation&amp;#8221; or &lt;a href="http://docs.info.apple.com/article.html?artnum=302477"&gt;Safe Sleep&lt;/a&gt;. Every Mac owner knows that you can put your Mac to sleep and wake it any time you want. In contrast to some (almost?) all other major operating systems this just works. The sleep mode still powers the &lt;span class="caps"&gt;RAM&lt;/span&gt;, so you still need some power. Now imagine you put your MacBook (Pro) to sleep and you run out of battery. This is where Hibernation comes to play.&lt;/p&gt;


	&lt;p&gt;Hibernation writes the contents of your &lt;span class="caps"&gt;RAM&lt;/span&gt; to a file on disk, an in case of total power loss, it restores the contents of your memory from that file &amp;rarr; nothing is lost.&lt;/p&gt;


	&lt;p&gt;Unfortunately writing several gigabytes to disk takes some time, and I experienced hard crashes when I interrupt this process, for example by opening the Laptop shortly after I&amp;#8217;ve closed it.&lt;/p&gt;


	&lt;p&gt;My solution &amp;#8211; giving up the fallback option &amp;#8211; is to disable Hibernation at all:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;sudo pmset -a hibernatemode 0&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;The pmset utility offers some more options (Hibernation only on battery etc&amp;#8230;).&lt;/p&gt;


	&lt;h2&gt;Wake on Bluetooth&lt;/h2&gt;


	&lt;p&gt;The default setting for Bluetooth and Power Management is to allow Bluetooth devices to wake the computer. For example you can press a button of your Bluetooth Keyboard or Mouse to activate your computer.&lt;/p&gt;


	&lt;p&gt;In my opinion this feature isn&amp;#8217;t that hot on a Laptop. I once put my Mac into my bag and accidently pushed a button of my Keyboard. The computer came to live, but had no chance at all to cool itself &amp;rarr; it ran pretty hot when I took it out of my bag&amp;#8230; .&lt;/p&gt;


	&lt;p&gt;Since this accident I always disable &amp;#8220;Wake on Bluetooth&amp;#8221; because I wake my Mac by opening the lid, not by pressing some button.&lt;/p&gt;


	&lt;p&gt;These two options increased the stability of my machine quite significantly, and I don&amp;#8217;t miss them in any way, although &amp;#8220;Hibernation&amp;#8221; would be nice &amp;#8211; just in case&amp;#8230; .&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.interlinked.org/static/images/wake_on_bluetooth.png" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Boom. &amp;#8212;Steve Jobs&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/fU38Wg42ZQQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/tutorials/mac_setup.html</feedburner:origLink></item><item><title>Apple, Apple Care, MacBook Pro, and Mac OS X Leopard</title><link>http://feedproxy.google.com/~r/IMHO/~3/LDd3jThWpHc/apple_care.html</link><guid isPermaLink="false">reviews/apple_care@http://blog.interlinked.org</guid><dc:subject>reviews</dc:subject><dc:subject>reviews</dc:subject><dc:subject>apple</dc:subject><dc:subject>apple care</dc:subject><dc:subject>macbook pro</dc:subject><dc:subject>leopard</dc:subject><dc:creator>Michael</dc:creator><dc:date>2007-11-01T15:15:11+00:00</dc:date><description xml:space="preserve">&lt;p&gt;About one year ago I bought a second generation MacBook Pro. At first everything was fine and I didn&amp;#8217;t encounter any weird sounds or screen flickers known from previous models. Unfortunately after a few weeks, it started to make some weird sound sometimes when I open it (or switch it on).&lt;/p&gt;


	&lt;p&gt;The noise vanished a few seconds after starting the computer but it still bothered me, so I brought it to an Apple Service center. Three repairs later, the noise was still there (the technician also heard it &amp;#8211; not only me), so I called Apple Care.&lt;/p&gt;


	&lt;p&gt;At first they said &amp;#8220;it&amp;#8217;s the usual operating sound of these machines&amp;#8221;. I was tempted to trust them, but I started a small research on the Internet. It turned out, that there is indeed a sound (issued by the &lt;span class="caps"&gt;CPU&lt;/span&gt;) which is considered normal, but my particular one wasn&amp;#8217;t included here.&lt;/p&gt;


	&lt;p&gt;So I called Apple Care again presenting my new findings and giving a very detailed description of my problem. Due to the unsuccessful repairs they offered me to replace the whole thing.&lt;/p&gt;


	&lt;p&gt;After a week or so I received a brand new MacBook Pro, not the second generation model, but a &lt;strong&gt;third generation&lt;/strong&gt; MacBook Pro including Leopard.&lt;/p&gt;


	&lt;h2&gt;Leopard&lt;/h2&gt;


	&lt;p&gt;The new Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; is a fine step forward. At first it isn&amp;#8217;t very different from Tiger, only some minor user interface tweaks here and there.&lt;/p&gt;


	&lt;p&gt;At a closer look they have improved many details and introduced some very new features (Time Machine and Quick Look for example). I won&amp;#8217;t go into the details here, other sites are much better suited for this. But Time Machine is very nice for backup purposes and offers some kind of &lt;strong&gt;versioning file system&lt;/strong&gt;, Quick Look was one of these features I thought &amp;#8220;nice, but not for me&amp;#8221; until I got a PowerPoint presentation. I don&amp;#8217;t have PowerPoint installed on my system, but Quick Look could open it without a hassle &amp;#8211; nice!&lt;/p&gt;


	&lt;p&gt;Oh, yes &amp;#8211; Leopard seems to be more responsive to me (faster if you like), especially Spotlight got a real performance boost.&lt;/p&gt;


	&lt;h2&gt;Third Generation MacBook Pro&lt;/h2&gt;


	&lt;p&gt;The new &lt;span class="caps"&gt;MBP&lt;/span&gt; has a &lt;span class="caps"&gt;LED&lt;/span&gt; backlit display which helps to increase the battery life time of the notebook (and lower the environmental hazard) together with Intel&amp;#8217;s new Santa Rosa chipset which can independently regulate the &lt;span class="caps"&gt;CPU&lt;/span&gt; cores. Apple claims that these models can run up to 6 hours on battery. Well usually these numbers aren&amp;#8217;t that realistic (you have to shut off Bluetooth, &lt;span class="caps"&gt;WLAN&lt;/span&gt; and set the brightness to the lowest level to get near them), but two movies with medium brightness and sound via the internal speakers are absolutely no problem (about 4-4.5 hours). That&amp;#8217;s pretty good for a 15.4 inch widescreen laptop!&lt;/p&gt;


	&lt;p&gt;At first I was annoyed by the brightness adjustment feature, it turns the brightness down if the surrounding light is dimmed, and up as soon as the environment gets brighter. It&amp;#8217;s only annoying when you see the change, but the eye is more relaxed and working on the laptop is more comfortable (turning the feature off is no problem either).&lt;/p&gt;


	&lt;h2&gt;Boot Camp&lt;/h2&gt;


	&lt;p&gt;Since I like to play a game every now and then, I thought I could try installing Windows using Boot Camp.&lt;/p&gt;


	&lt;p&gt;The installation was quite easy. I installed Windows Vista Business because my student edition of XP didn&amp;#8217;t work (they are altered editions of the standard XP editions). The Boot Camp drivers allow nearly the same features as Mac &lt;span class="caps"&gt;OS X&lt;/span&gt; has (brightness adjustment, volume, sleep when lid is closed etc.). Vista also runs surprisingly fast (I disabled certain services like SuperFetch and the Indexer), but it uses very much space, more than I am willing to spend on a 20 GB partition&amp;#8230; maybe I&amp;#8217;ll give XP another try sometime.&lt;/p&gt;


	&lt;h2&gt;Conclusion&lt;/h2&gt;


	&lt;p&gt;Altogether I am very pleased with the outcome of my noise problems on my notebook. Apple was kind enough to replace the whole machine eleven months after my purchase and the new machine simply rocks.&lt;/p&gt;


	&lt;p&gt;Almost all hardware manufacturers have problems &amp;#8211; whether it&amp;#8217;s &lt;span class="caps"&gt;IBM&lt;/span&gt;/Lenovo, Dell or Apple. The difference in &amp;#8211; my opinion &amp;#8211; lies in the service. I&amp;#8217;m not saying that other companies wouldn&amp;#8217;t replace a faulty product, but replacing it after more than 90% of the warranty have passed is exceptional, isn&amp;#8217;t it?&lt;/p&gt;


	&lt;p&gt;Well, not being able to repair an issue on three repairs is also exceptional (but can I blame Apple for independent service centers?).&lt;/p&gt;


	&lt;p&gt;The only other issue with expensive hardware was with my &lt;span class="caps"&gt;IBM T86 TFT&lt;/span&gt; monitor. I bought it on an internet auction (private seller, no bill or guarantee card etc). I had some problems with it, so I called &lt;span class="caps"&gt;IBM&lt;/span&gt; if there is a possibility to repair it. It turned out that the monitor had four years of warranty left and I was eligible for their rapid-replacement service (a carrier brings me a new one, and I send back the old one). Again, service matters, but you pay for it &amp;#8211; the &lt;span class="caps"&gt;MBP&lt;/span&gt; costs about 2000 Euro, you can get 15,4 inch laptops as low as 500 Euro too, do you think these companies would ever replace the whole thing after 11 months because of some sound which doesn&amp;#8217;t affect the usability of the device at all?&lt;/p&gt;


	&lt;p&gt;&amp;#8212;&lt;br/&gt;
Have you tried turning it off and on again?&amp;#8212;&lt;span class="caps"&gt;IT &lt;/span&gt;Crowd answering machine&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IMHO/~4/LDd3jThWpHc" height="1" width="1"/&gt;</description><feedburner:origLink>http://blog.interlinked.org/reviews/apple_care.html</feedburner:origLink></item></channel>
</rss>
