<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D0QMSX88fSp7ImA9WhRaFE0.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511</id><updated>2012-02-16T15:16:28.175Z</updated><category term="GTD" /><category term="android" /><category term="emacs" /><category term="scala" /><category term="gs" /><category term="git" /><category term="Kindle Notes" /><category term="tips" /><category term="books" /><category term="acl" /><category term="Mac" /><category term="Clojure" /><category term="Ubuntu" /><category term="links" /><category term="Programming" /><category term="netbeans" /><title>Maybe Technology</title><subtitle type="html">(maybe not)</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.maybetechnology.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/MaybeTechnology" /><feedburner:info uri="maybetechnology" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DU8BSH0zeip7ImA9WhRSF0Q.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-8973118322528035523</id><published>2011-11-20T14:04:00.000Z</published><updated>2011-11-20T14:04:19.382Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-20T14:04:19.382Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gs" /><title>#Occupy</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;blockquote class="tr_bq"&gt;"We have nothing else cheap left to exploit. We are completely in danger from lack of culture. We were all trained up to be consumers...throw away the  past, the future will take care of itself, catch the latest thing and  suck it up." -- Vivienne Westwood, addressing Occupy activists (&lt;a href="http://www.bbc.co.uk/news/uk-england-london-15806945"&gt;http://www.bbc.co.uk/news/uk-england-london-15806945&lt;/a&gt;)&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&amp;nbsp;"There is no doubt in 1933 that the collapses of the older systems which we witness are probably irrevocable. Sir Auckland Geddes, the British Ambassador to the United States of America, foresaw them when he said in 1920: 'In Europe, we know that an age is dying. Here it would be easy to miss the the signs of coming changes, but I have little doubt that it will come. A realization of the aimlessness of life lived to labour and to die, having achieved nothing but avoidance of starvation, and the birth of children also doomed to the weary treadmill, has seized the minds of millions.'" -- Science and Sanity, p. 49, Alfred Korzybski&lt;/blockquote&gt;What does 'human' mean? What differentiates human from animal? Alfred Korzybski suggested we classify life on Earth as follows:&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;&lt;li&gt;Plants: static, synthesize sunlight and other chemicals in order to grow. Hence we define them as 'chemical-binders'.&lt;/li&gt;
&lt;li&gt;Animals: like plants, they synthesize chemicals to grow, but also have the ability to move around. This movement in 'space' differentiates plants from animals and hence we define them as 'space-binders'.&lt;/li&gt;
&lt;li&gt;Humans: like plants, synthesize chemicals to grow, and like animals move around in space. Humans add to this the ability to learn from previous generations - one generation can start from where the previous left off. This ability to transmit knowledge across time leads to the definition of humans as 'time-binders'.&lt;/li&gt;
&lt;/ol&gt;Korzybski argues first in &lt;a href="http://www.amazon.co.uk/Manhood-Humanity-Alfred-Korzybski/dp/B003YMMCNO/ref=sr_1_1?ie=UTF8&amp;amp;qid=1321796839&amp;amp;sr=8-1"&gt;&lt;i&gt;Manhood of Humanity&lt;/i&gt;&lt;/a&gt;, and later in &lt;a href="http://www.amazon.co.uk/Science-Sanity-Introduction-Non-Aristotelian-Semantics/dp/0937298018/ref=sr_1_2?ie=UTF8&amp;amp;qid=1321796849&amp;amp;sr=8-2"&gt;&lt;i&gt;Science and Sanity&lt;/i&gt;&lt;/a&gt;, that this definition of humans as 'time-binders' describes functionally what humans actually do. One only needs to look around to verify the claim. The presents from the past rest all around us.&lt;br /&gt;
&lt;br /&gt;
The time-binding capacity of humans means that I can learn from Korzybski, despite the fact that he died 60 years ago. I can learn from Einstein, despite the fact he died 60 years ago. I can learn from Aristotle, despite the fact that he died 2000 years ago. Civilization arises because of the time-binding capacity. Imagine a world where every generation starts afresh, unable to use the fruits of the previous generations' efforts. We would still be living in the trees, picking flies off each other.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;"NYPD &amp;amp; Brookfield have taken the People's Library again. and we love you all." -- &lt;a href="https://twitter.com/#%21/owslibrary/status/136970287601291265"&gt;https://twitter.com/#!/owslibrary/status/136970287601291265&lt;/a&gt;&lt;/blockquote&gt;By building a People's Library, the Occupiers in NY implicitly recognized the uniquely human capacity of time-binding. Bringing together books in that way honours the time-binding capacity that defines humans. What does destroying them signify?&lt;br /&gt;
&lt;br /&gt;
So far, the mass media has focused on the occupation of 'space' in cities all around the world. But this space-binding activity is incidental to the more important time-binding activities, the creation and propagation of memes.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="225" mozallowfullscreen="" src="http://player.vimeo.com/video/31918806?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/31918806"&gt;OWS Teach-In with Douglas Rushkoff&lt;/a&gt; from &lt;a href="http://vimeo.com/user1757840"&gt;Douglas Rushkoff&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Pepper spray doesn't work against ideas. You can't kettle a meme. Animalistic, space-binding tactics may work in the short-term, but in the long-term, human-nature, the time-binding capacity, will assert itself.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kBg34HqmCCM/TskAFNkWjiI/AAAAAAAAAPM/Y8kTa1lpXsg/s1600/pike-pepper-spraying-line.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-kBg34HqmCCM/TskAFNkWjiI/AAAAAAAAAPM/Y8kTa1lpXsg/s320/pike-pepper-spraying-line.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
To live life as a human means to live life in order to learn and progress, not simply to labour and die. To live a life of culture, rather than consumerism. To exercise the uniquely human time-binding capacity.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-8973118322528035523?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/8973118322528035523/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/11/occupy.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/8973118322528035523?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/8973118322528035523?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/dyOXPMpuVFU/occupy.html" title="#Occupy" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kBg34HqmCCM/TskAFNkWjiI/AAAAAAAAAPM/Y8kTa1lpXsg/s72-c/pike-pepper-spraying-line.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/11/occupy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8GQ3c-eCp7ImA9WhdQE08.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-5159805736331515840</id><published>2011-08-14T13:10:00.000+01:00</published><updated>2011-08-14T13:10:22.950+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-14T13:10:22.950+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Literate Programming with Marginalia</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Here is the source code of the project I'm working on at home, formatted by &lt;a href="https://github.com/fogus/marginalia"&gt;Marginalia&lt;/a&gt;: &lt;a href="http://neillalexander.github.com/rtm-clj/uberdoc.html"&gt;http://neillalexander.github.com/rtm-clj/uberdoc.html&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I love it. Having something so beautifully formatted really motivates me to write comprehensive documentation. I'll be using it in all my Clojure projects from now on.&lt;br /&gt;
&lt;br /&gt;
The set up was fairly straightforward, so I won't go through it in depth here. Once I had it working, I wanted to find an easy way to publish the updated documentation, and make it easily readable on-line. The solution was GitHub pages, and git submodules.&lt;br /&gt;
&lt;br /&gt;
Here's what I did:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Set up a project page for the project using instructions at &lt;a href="http://pages.github.com/"&gt;http://pages.github.com/&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Added that branch as a submodule of the main source code in the docs directory.&lt;/li&gt;
&lt;pre class="brush: bash"&gt;git submodule add git@github.com:NeillAlexander/rtm-clj.git docs
cd docs
git checkout gh-pages
&lt;/pre&gt;&lt;li&gt;Created index.html which redirects to uberdoc.html&lt;/li&gt;
&lt;li&gt;Back up to the parent directory and run 'lein marg'&lt;/li&gt;
&lt;/ul&gt;Running 'lein marg' creates a new version of uberdoc.html in the docs directory, which is actually the gh-pages branch of the overall project. Pushing the change therefore makes it available at http://neillalexander.github.com/rtm-clj/uberdoc.html &lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-5159805736331515840?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/5159805736331515840/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/08/literate-programming-with-marginalia.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5159805736331515840?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5159805736331515840?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/ztxRHFpvu6s/literate-programming-with-marginalia.html" title="Literate Programming with Marginalia" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/08/literate-programming-with-marginalia.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIBQ3s5fCp7ImA9WhdQEUQ.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-874751851968894766</id><published>2011-08-13T00:59:00.000+01:00</published><updated>2011-08-13T00:59:12.524+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-13T00:59:12.524+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Simple Arity Checking Using Higher Order Functions</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;As a learning exercise I'm writing a little command line tool to connect to Remember the Milk using Clojure. The idea is that the tool is a mini shell (or repl) which reads commands, executes them, and prints the result.&lt;br /&gt;
&lt;br /&gt;
The commands are written as simple Clojure functions. When I type something at the command line, the command is looked up in a map and, if found, executed, passing the rest of the arguments.&lt;br /&gt;
&lt;br /&gt;
For this to be safe I need to check the arity of the function matches the number of commands entered at the command line. &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
When I type 'help' then all the available commands are returned:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;rtm&amp;gt; help
(echo exit help)
&lt;/pre&gt;&lt;br /&gt;
If I type help with an argument, then it still works, because help is multi-arity, and has an implementation that takes an argument:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;rtm&amp;gt; help command
Help for command
&lt;/pre&gt;&lt;br /&gt;
If I type help with more than one argument, the arity check kicks in and refuses to call the function:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;rtm&amp;gt; help won't work
help: wrong number of args
Help for help
&lt;/pre&gt;&lt;br /&gt;
It took a bit of thinking to work out how to do this, but I eventually came up with the following solution.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: clj"&gt;;; higher order functions rock!
(defn arity-check
  "Returns a function that evaluates to true if the arity matches the count"
  [arglist]
  ;; special case - if arglist is of zero length then no need to check for &amp;amp; args
  (if (= 0 (count arglist))
    #(= % 0)
    (let [arg-map (apply assoc {}
                         (interleave arglist (range 0 (count arglist))))]
      ;; if &amp;amp; args found then number of args is &amp;gt;= the position of the &amp;amp;
      ;; otherwise it's just a simple size comparison
      (if ('&amp;amp; arg-map)
        #(&amp;gt;= % ('&amp;amp; arg-map))
        #(= % (count arglist))))))


;; this builds a collection of functions, one for each of the arglists
;; which evaluates to true if the number of args matches the arity of the
;; arglist. it then applies each function in turn against the size of the
;; args, and determines if any of them returned true. if at least one of
;; them returned true, then we can safely do the call
(defn arity-matches-args
  "Returns true if the args match up to the function"
  [f args]
  (let [arity-check-fns (map arity-check (:arglists (meta f)))]
    ((set (map #(% (count args)) arity-check-fns)) true)))
&lt;/pre&gt;&lt;br /&gt;
The arity-check function takes an arglist, as returned from the meta-data of a function. This is a higher order function which returns a function that evaluates to true if the number passed in is assignment compatible with the arity of the arglist.&lt;br /&gt;
&lt;br /&gt;
e.g. if the arglist is [x] then 1 argument is expected. If it is [x y] then 2 arguments are expected. If it is [&amp;amp; args] then any number of arguments &amp;gt;= 0 are expected. If it's [x &amp;amp; args] then any number of arguments &amp;gt;= 1.&lt;br /&gt;
&lt;br /&gt;
The arity-matches-args function calls the arity-check for each of the arglists in the meta data of the function, and stores them in a sequence, arity-check-fns. It then calls every one of those functions passing in the number of arguments in args, and generates a set of the results, which will be either true, false, or nil. It then uses the set as a function to see if it contains true. If it does then at least one of the arglist arities matches the number of arguments that have been entered.&lt;br /&gt;
&lt;br /&gt;
There is probably an easier way to do this...but I'm still proud of this solution. It opened my eyes to the power of higher order functions&lt;br /&gt;
&lt;br /&gt;
The source code is at &lt;a href="https://github.com/NeillAlexander/rtm-clj"&gt;https://github.com/NeillAlexander/rtm-clj&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-874751851968894766?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/874751851968894766/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/08/simple-arity-checking-using-higher.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/874751851968894766?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/874751851968894766?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/dH0A0Y6YXc0/simple-arity-checking-using-higher.html" title="Simple Arity Checking Using Higher Order Functions" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/08/simple-arity-checking-using-higher.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4MSHs4fip7ImA9WhRSFkk.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-932687396769124006</id><published>2011-08-06T10:24:00.004+01:00</published><updated>2011-11-18T18:29:49.536Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-18T18:29:49.536Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Will Clojure Ever Be 'Finished'?</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Clojure, as a Lisp dialect, is an extremely malleable language. The lack of syntax lends itself to creating domain specific languages. The built-in meta-programming (macros) means that anyone can add new language features. In contrast, adding new language features to Java requires a lengthy process of negotiation and compromise via the JCP. &lt;br /&gt;
&lt;blockquote&gt;If you give someone Fortran, he has Fortran. If you give someone Lisp, he has any language he pleases.&amp;nbsp; -- Guy Steele&lt;/blockquote&gt;Will we hit a point where Rich and the Clojure/Core team regard the core language as complete? In other words, will Clojure hit a stage where it is rich enough (no pun intended) that there is no further work required, other than to write new libraries? This seems plausible to me, and perhaps even desirable.&lt;br /&gt;
&lt;br /&gt;
I'd be interested to hear Rich Hickey's view on this.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update (18th November)&lt;/b&gt;: at the Clojure / Conj last week, I had the opportunity to put this question to Rich. He broadly agreed with the point, saying that the core language is basically done, and that the remaining work is mostly around the edges.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-932687396769124006?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/932687396769124006/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/08/will-clojure-ever-be-finished.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/932687396769124006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/932687396769124006?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/VHzWt49NQHs/will-clojure-ever-be-finished.html" title="Will Clojure Ever Be 'Finished'?" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/08/will-clojure-ever-be-finished.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUENRHg8fSp7ImA9WhdREUw.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-5428318356202527857</id><published>2011-07-31T14:08:00.000+01:00</published><updated>2011-07-31T14:08:15.675+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-31T14:08:15.675+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Lazy Sequences</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I like this a lot:&lt;br /&gt;
&lt;pre class="brush: clj"&gt;;; define a function with a side effect to show when it is called
(defn square [x]
  (do
    (println (str "Processing: " x))
    (* x x)))

;; define map-result which is result of calling square for every item in the list
(def map-result (map square '( 1 2 3 4 5 6 7 8)))
&lt;/pre&gt;First time, enough of the lazy sequence is evaluated to generate the result:&lt;br /&gt;
&lt;pre class="brush: clj"&gt;practical-clojure.chpt5&amp;gt; (nth map-result 2)
Processing: 1
Processing: 2
Processing: 3
9
&lt;/pre&gt;The next time, with the same args, the previous calculation was cached, so nothing to evaluate:&lt;br /&gt;
&lt;pre class="brush: clj"&gt;practical-clojure.chpt5&amp;gt; (nth map-result 2)
9
&lt;/pre&gt;The next call it needs to evaluate a couple more of the lazy sequence:&lt;br /&gt;
&lt;pre class="brush: clj"&gt;practical-clojure.chpt5&amp;gt; (nth map-result 4)
Processing: 4
Processing: 5
25
&lt;/pre&gt;And again, this is cached:&lt;br /&gt;
&lt;pre class="brush: clj"&gt;practical-clojure.chpt5&amp;gt; (nth map-result 4)
25
&lt;/pre&gt;&lt;/div&gt;This is possible because a sequence looks like:&lt;br /&gt;
&lt;pre class="brush: clj"&gt;first --&gt; (rest)
first --&gt; (first --&gt; (rest))
first --&gt; (first --&gt; (first --&gt; rest))
&lt;/pre&gt;Rest is only evaluated when it is required.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-5428318356202527857?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/5428318356202527857/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/lazy-sequences.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5428318356202527857?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5428318356202527857?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/KW9xR2_p8kw/lazy-sequences.html" title="Lazy Sequences" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/lazy-sequences.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QDSHw8eSp7ImA9WhdREU0.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-3340834987834458103</id><published>2011-07-31T09:36:00.000+01:00</published><updated>2011-07-31T09:36:19.271+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-31T09:36:19.271+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="emacs" /><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Auto Save a File in Emacs</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Download &lt;a href="http://www.litchie.net/programs/real-auto-save.html"&gt;http://www.litchie.net/programs/real-auto-save.html&lt;/a&gt; to .emacs.d, and then:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: clj"&gt;;; real auto-save - forces auto save mode
(require 'real-auto-save)
(add-hook 'text-mode-hook 'turn-on-real-auto-save)
(add-hook 'muse-mode-hook 'turn-on-real-auto-save)
(add-hook 'slime-mode-hook 'turn-on-real-auto-save)
(add-hook 'emacs-list-mode-hook 'turn-on-real-auto-save)
(setq real-auto-save-interval 5) ;; in seconds
&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-3340834987834458103?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/3340834987834458103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/auto-save-file-in-emacs.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/3340834987834458103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/3340834987834458103?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/tzgj60Ry2VM/auto-save-file-in-emacs.html" title="Auto Save a File in Emacs" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/auto-save-file-in-emacs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYNSXwyeip7ImA9WhdREEQ.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-2006521536611317062</id><published>2011-07-31T08:09:00.000+01:00</published><updated>2011-07-31T08:09:58.292+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-31T08:09:58.292+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Fixing Git Remote Reference</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Did a 'git pull' and saw this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Your configuration specifies to merge with the ref 'master'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;from the remote, but no such ref was fetched.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
A quick bit of googling turned up http://stackoverflow.com/questions/4297795/configure-git-so-that-git-pull-instead-of-git-pull-origin-master, which indicated I needed to edit my &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.git/config&lt;span style="font-family: inherit;"&gt; file to contain this:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[branch "master"]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remote = origin &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: inherit;"&gt;The &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;remote = origin&lt;/span&gt; line was missing, therefore git didn't know where to pull from.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-2006521536611317062?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/2006521536611317062/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/fixing-git-remote-reference.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2006521536611317062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2006521536611317062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/unqc4q49Yrw/fixing-git-remote-reference.html" title="Fixing Git Remote Reference" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/fixing-git-remote-reference.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QBSXw7eCp7ImA9WhdREEQ.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-6403898529619132584</id><published>2011-07-30T12:13:00.001+01:00</published><updated>2011-07-31T07:55:58.200+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-31T07:55:58.200+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="emacs" /><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Auto Complete in Clojure</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This is awesome. My one concern about switching from Eclipse to Emacs for Clojure was losing the handy auto-complete stuff in Eclipse. I no longer have that concern:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/kH0gOE7rj7g" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Install the &lt;a href="http://cx4a.org/software/auto-complete/"&gt;auto-complete&lt;/a&gt; mode (M-x package-install, auto-complete if using &lt;a href="http://tromey.com/elpa/"&gt;ELPA&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Download ac-slime from here: &lt;a href="https://github.com/purcell/ac-slime"&gt;https://github.com/purcell/ac-slime&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here is the config required to set it up:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: clj"&gt;;; auto complete
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
(ac-config-default)
(setq ac-delay 0.5) ;; eclipse uses 500ms

;; configure auto complete to work in slime
(add-to-list 'load-path "~/.emacs.d/ac-slime")
(require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
&lt;/pre&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-6403898529619132584?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/6403898529619132584/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/auto-complete-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/6403898529619132584?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/6403898529619132584?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/AqyaGHb3VPg/auto-complete-in-clojure.html" title="Auto Complete in Clojure" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/kH0gOE7rj7g/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/auto-complete-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4HSHs9fSp7ImA9WhZaGEQ.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-6290954654331884262</id><published>2011-07-05T21:48:00.000+01:00</published><updated>2011-07-05T21:48:59.565+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-05T21:48:59.565+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Counterclockwise Eclipse Plugin</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I'm going to run with Counterclockwise for now, since I'm already very  comfortable with Eclipse. Having had a quick play with it this evening  it seems to do everything I want, and will only get better.&lt;br /&gt;
&lt;br /&gt;
The list of key bindings is defined at: &lt;a href="http://code.google.com/p/counterclockwise/wiki/EditorKeyBindingsFeatures"&gt;http://code.google.com/p/counterclockwise/wiki/EditorKeyBindingsFeatures&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Balanced brackets only seem to work in strict mode on Ubuntu. &lt;br /&gt;
&lt;br /&gt;
Unfortunately Ubuntu 11.04 has some system key bindings which interfere with the Counterclockwise bindings:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Shift-Alt-Up: bound to Compiz scale windows. Install compizconfig-settings-manager, run "ccsm", and find Scale under Window Management, and disable the key binding.&amp;nbsp; &lt;/li&gt;
&lt;li&gt;Ctrl-Alt-T: launches a terminal in Eclipse. Disable via System -&amp;gt; Preferences -&amp;gt; Keyboard Shortcuts &lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-6290954654331884262?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/6290954654331884262/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/counterclockwise-eclipse-plugin.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/6290954654331884262?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/6290954654331884262?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/IID10Ws_EQU/counterclockwise-eclipse-plugin.html" title="Counterclockwise Eclipse Plugin" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/counterclockwise-eclipse-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGRX89fip7ImA9WhZaF08.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-7962282824577371349</id><published>2011-07-03T22:15:00.000+01:00</published><updated>2011-07-03T22:15:24.166+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-03T22:15:24.166+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Cljr</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Well this is new: &lt;a href="https://github.com/liebke/cljr"&gt;https://github.com/liebke/cljr&lt;/a&gt;. A very simple way to move from zero to a working Clojure REPL. All it took was:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;wget http://incanter.org/downloads/cljr-installer.jar
java -jar cljr-installer.jar
export PATH=/home/neill/.cljr/bin:$PATH
cljr repl
&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-7962282824577371349?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/7962282824577371349/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/cljr.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/7962282824577371349?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/7962282824577371349?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/t8l_eqn4Cfg/cljr.html" title="Cljr" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/cljr.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUFQnk8cSp7ImA9WhZaF08.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-8496508477243173725</id><published>2011-07-03T22:06:00.000+01:00</published><updated>2011-07-03T22:06:53.779+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-03T22:06:53.779+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Clojure" /><title>Clojure Revisited</title><content type="html">&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;In the first half of 2010 I did a bit of programming in Clojure, using it to write a simple &lt;a href="https://github.com/NeillAlexander/sponge"&gt;debug proxy&lt;/a&gt; for SOAP. Although I wrote many lines of Clojure code for that project, by the end I had the nagging feeling that I hadn't written idiomatic Clojure code.&lt;br /&gt;
&lt;br /&gt;
And so, to stop that feeling from nagging, I am going to try to approach Clojure once again with beginners mind. My weapon of choice for this new assault is&amp;nbsp;&lt;a href="http://www.amazon.co.uk/Joy-Clojure-Thinking-Way/dp/1935182641/ref=sr_1_1?ie=UTF8&amp;amp;qid=1309726992&amp;amp;sr=8-1"&gt;The Joy of Clojure&lt;/a&gt;. I have high hopes that this will help my understanding of the language to move up a level. I hope to be thinking in Clojure by the end of it. And I'm going to record the journey for posterity here.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-8496508477243173725?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/8496508477243173725/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/07/clojure-revisited.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/8496508477243173725?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/8496508477243173725?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/mEDAgTynmHI/clojure-revisited.html" title="Clojure Revisited" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/07/clojure-revisited.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMER3c6eyp7ImA9WhZXEUg.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-5671508688382993660</id><published>2011-04-30T09:00:00.026+01:00</published><updated>2011-04-30T09:00:06.913+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T09:00:06.913+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Reverse Incremental Search in Bash</title><content type="html">I learned a new trick this week. Reverse incremental search through bash history using the up key. This blog post outlines it nicely:&lt;br /&gt;
&lt;a href="http://codeinthehole.com/archives/17-The-most-important-command-line-tip-incremental-history-searching-with-.inputrc.html"&gt;&lt;br /&gt;
http://codeinthehole.com/archives/17-The-most-important-command-line-tip-incremental-history-searching-with-.inputrc.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Using these bindings, I can type 'git', then hit the up-arrow to search back through all the recent git commands I've used. This is a really quick way to improve productivity at the command line.&lt;br /&gt;
&lt;br /&gt;
For future reference, just in case the above linked blog entry disappears.&lt;br /&gt;
&lt;br /&gt;
In ~/.inputrc: &lt;br /&gt;
&lt;pre class="brush: bash"&gt;"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char
&lt;/pre&gt;In ~/.bashrc:&lt;br /&gt;
&lt;pre class="brush: bash"&gt;export HISTSIZE=1000000
export HISTFILESIZE=1000000000
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-5671508688382993660?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/5671508688382993660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/reverse-incremental-search-in-bash.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5671508688382993660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5671508688382993660?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/ut_4MOE4vsE/reverse-incremental-search-in-bash.html" title="Reverse Incremental Search in Bash" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/reverse-incremental-search-in-bash.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEEQXk4eCp7ImA9WhZQGUo.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-9020933890973099689</id><published>2011-04-28T09:00:00.002+01:00</published><updated>2011-04-28T09:00:00.730+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-28T09:00:00.730+01:00</app:edited><title>Make it Work First...</title><content type="html">========== &lt;br /&gt;
Pragmatic Thinking and Learning (Neill Alexander) (Hunt) &lt;br /&gt;
- Highlight Loc. 1277-83&amp;nbsp; | Added on Saturday, April 23, 2011, 10:06 AM &lt;br /&gt;
&lt;br /&gt;
Author Anne Lamott is an advocate of purposefully creating a shitty first draft. That is, it's better to complete a shitty first draft than to never complete a perfect one. In her book Bird by Bird: Some Instructions on Writing and Life, Lamott explains the dangers of perfectionism: "Perfectionism is the voice of the oppressor, the enemy of the people. It will keep you cramped and insane your whole life, and it is the main obstacle between you and a shitty first draft. I think perfectionism is based on the obsessive belief that if you run carefully enough, hitting each stepping-stone just right, you won't have to die. The truth is that you will die anyway and that a lot of people who aren't even looking at their feet are going to do a whole lot better than you, and have a lot more fun while they're doing it."&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
Make it work first, then make it better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-9020933890973099689?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/9020933890973099689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/make-it-work-first.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/9020933890973099689?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/9020933890973099689?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/PLUB5EZfG30/make-it-work-first.html" title="Make it Work First..." /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/make-it-work-first.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8EQXk8eyp7ImA9WhZQGE0.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-4622744664167412933</id><published>2011-04-26T09:00:00.001+01:00</published><updated>2011-04-26T09:00:00.773+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-26T09:00:00.773+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Kindle Notes" /><title>Deliberate Practice</title><content type="html">========== &lt;br /&gt;
Pragmatic Thinking and Learning (Neill Alexander) (Hunt) &lt;br /&gt;
- Highlight Loc. 1067-69&amp;nbsp; | Added on Friday, April 08, 2011, 08:16 PM &lt;br /&gt;
&lt;br /&gt;
Skills and abilities that you constantly use and constantly practice will begin to dominate, and more of your brain will become wired for those purposes. At the same time, lesser-used skills will lose ground. "Use it or lose it" is perfectly accurate in this case, because your brain will dedicate more resources to whatever you are doing the most. &lt;br /&gt;
========== &lt;br /&gt;
Pragmatic Thinking and Learning (Neill Alexander) (Hunt) &lt;br /&gt;
- Highlight Loc. 1070-73&amp;nbsp; | Added on Friday, April 08, 2011, 08:16 PM &lt;br /&gt;
&lt;br /&gt;
Perhaps this is why musicians practice scales incessantly; it's sort of like refreshing dynamic RAM. Want to be a better coder? Practice coding more. Engage in deliberate, focused practice as described in the sidebar (here…). Want to learn a foreign language? Immerse yourself in it. Speak it all the time. Think in it. Your brain will soon catch on and adapt itself to better facilitate this new usage. &lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
Over the last couple of years the majority of my personal programming time has gone into 2 largish applications; &lt;a href="https://github.com/NeillAlexander/sponge"&gt;Sponge&lt;/a&gt; and &lt;a href="https://market.android.com/details?id=com.nwalex.meditation"&gt;Meditation Helper&lt;/a&gt;. The main aim of the first project was to write something substantial in &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt;, and the second to do the same for Android. Both were fun projects to work on. However, I have now decided to change my approach.&lt;br /&gt;
&lt;br /&gt;
Instead of embarking on another application, I am instead using my personal programming time to practice scales. I am writing toy classes to learn apis, libraries etc that I haven't had much experience with, or that I want to learn in more depth. I want to improve as a programmer, and the only way to do that is practice, practice, practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-4622744664167412933?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/4622744664167412933/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/deliberate-practice.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/4622744664167412933?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/4622744664167412933?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/51Yg967kBkU/deliberate-practice.html" title="Deliberate Practice" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/deliberate-practice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcEQ3s6fCp7ImA9WhZQFk4.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-6430816416367899569</id><published>2011-04-24T09:00:00.000+01:00</published><updated>2011-04-24T09:00:02.514+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-24T09:00:02.514+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Kindle Notes" /><title>Unknown Unknowns</title><content type="html">==========&lt;br /&gt;
Pragmatic Thinking and Learning (Neill Alexander) (Hunt)&lt;br /&gt;
- Highlight Loc. 376-89 &amp;nbsp;| Added on Thursday, April 07, 2011, 07:58 AM&lt;br /&gt;
&lt;br /&gt;
When you are not very skilled in some area, you are more likely to think you're actually pretty expert at it. In the paper "Unskilled and Unaware of It: How Difficulties in Recognizing One's Own Incompetence Lead to Inflated Self-Assessments" [AUOIHDIROOILTIS] , psychologists Kruger and Dunning relate the unfortunate story of a would-be thief who robbed a bank in broad daylight. He was incredulous at his prompt arrest, because he was under the impression that wearing lemon juice on your face would make you invisible to security cameras. The "lemon juice man" never suspected that his hypothesis was, er, suspect. This lack of accurate self-assessment is referred to as second-order incompetence, that is, the condition of being unskilled and unaware of it. This condition is a huge problem in software development, because many programmers and managers aren't aware that better methods and practices even exist. I've met many younger programmers (one to five years of experience) who never have been on a successful project. They have already succumbed to the notion that a normal project should be painful and should fail. Charles Darwin pegged it when he said, "Ignorance more frequently begets confidence than does knowledge." The converse seems to be true as well; once you truly become an expert, you become painfully aware of just how little you really know.&lt;br /&gt;
==========&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-6430816416367899569?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/6430816416367899569/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/unknown-unknowns.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/6430816416367899569?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/6430816416367899569?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/k3GSo7DAepw/unknown-unknowns.html" title="Unknown Unknowns" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/unknown-unknowns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UERXw-eyp7ImA9WhZQFEg.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-2778742396984354738</id><published>2011-04-22T09:00:00.001+01:00</published><updated>2011-04-22T09:00:04.253+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-22T09:00:04.253+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Kindle Notes" /><title>Baby Steps</title><content type="html">==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 1850-55 &amp;nbsp;| Added on Monday, April 04, 2011, 07:24 AM&lt;br /&gt;
&lt;br /&gt;
When you're driving on a long trip, does it make sense to hold the wheel firmly in one position, stare straight ahead, and then just floor the gas for a couple of hours? Of course not. You have to steer. You have to be constantly aware of traffic. You have to check your gas gauge. You have to stop for fuel, food, and other necessities, and so on.[30] Don't code for hours, or even minutes, without stopping to make sure you're on the right path---by testing what you produce. Instead, code in short increments. You'll find that coding in increments helps you refine and structure the code as you go along. The code is less likely to become complicated or messy; you build the code based on the on-going feedback from writing and testing in increments.&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
At university, there were people who used to code and code and code and code and code and code and code and code...&lt;br /&gt;
&lt;br /&gt;
Then they'd hit the compile button and wonder why they had so many errors. A lot of them thought programming was 'too hard' because of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-2778742396984354738?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/2778742396984354738/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/baby-steps.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2778742396984354738?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2778742396984354738?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/ODMActgHLFc/baby-steps.html" title="Baby Steps" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/baby-steps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMEQ347eSp7ImA9WhZQEkU.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-2267098978594229075</id><published>2011-04-20T09:00:00.006+01:00</published><updated>2011-04-20T09:00:02.001+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-20T09:00:02.001+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Kindle Notes" /><title>Commenting Code is like Eating Peas</title><content type="html">==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 1786-88 &amp;nbsp;| Added on Monday, April 04, 2011, 07:19 AM&lt;br /&gt;
&lt;br /&gt;
Code will always be read many more times than written, so the little extra effort that is required to document your code when writing it will pay you back handsomely in the end.&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
When I was a kid, I used to leave my vegetables until last. At the end of my dinner I'd be sitting there with an enormous mound of peas, with my mother breathing down my neck, demanding that they be finished before I could leave the table.&lt;br /&gt;
&lt;br /&gt;
I hated peas.&lt;br /&gt;
&lt;br /&gt;
When I was at university learning how to program, there were people in my class who used to leave commenting code until the end. They used to write their entire computer program, then go back at the end and add comments, because they'd lose marks if they didn't provide any.&lt;br /&gt;
&lt;br /&gt;
They hated writing comments.&lt;br /&gt;
&lt;br /&gt;
What I didn't understand as a kid was that peas aren't so bad when you eat them in combination with the rest of your food. In fact, now I think they are delicious. I wouldn't like to eat a giant mound of them by themselves though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-2267098978594229075?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/2267098978594229075/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/commenting-code-is-like-eating-peas.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2267098978594229075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2267098978594229075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/qNbGwAx1AsU/commenting-code-is-like-eating-peas.html" title="Commenting Code is like Eating Peas" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/commenting-code-is-like-eating-peas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEFQX0_fSp7ImA9WhZQEUw.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-2910657169976576149</id><published>2011-04-18T09:00:00.012+01:00</published><updated>2011-04-18T09:00:10.345+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-18T09:00:10.345+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><title>ORM is a Solved Problem</title><content type="html">==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 864-66 &amp;nbsp;| Added on Friday, April 01, 2011, 08:47 AM&lt;br /&gt;
&lt;br /&gt;
For instance, if you have a hankering to develop your own persistence layer, remember Ted Neward's remark that "object-relational mapping is the Vietnam of computer science." You can spend more time and effort building only what you need to build for your application---the domain or application-specific stuff.&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
This made me laugh, because I built a persistence layer for a project, then realized after the fact that I should just have used Hibernate. It was a valuable lesson.&lt;br /&gt;
&lt;br /&gt;
The thing is, at one point during the project I was talking to the project manager who expressed his concern at the length of time it was taking to complete the work. I said to him, "Don't worry, I'm not trying to re-implement Hibernate!". Shortly after that conversation I realized that I was, in fact, trying to re-implement Hibernate. It all started very naively - I implemented a solution using Spring JDBC, and then saw an opportunity to extract some higher level abstractions. That process continued to the point that I found myself writing a DSL that would enable me to express the various object relationships, and map them to the database structure.&lt;br /&gt;
&lt;br /&gt;
Hmmm. Object relational mapping you say. That rings a bell.&lt;br /&gt;
&lt;br /&gt;
Object-relational mapping is a solved problem. There are multiple solutions out there. Pick one and use that. Even if you need to learn it from scratch, it will still be quicker than writing your own version.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-2910657169976576149?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/2910657169976576149/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/orm-is-solved-problem.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2910657169976576149?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/2910657169976576149?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/DaNR1YcrIlU/orm-is-solved-problem.html" title="ORM is a Solved Problem" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/orm-is-solved-problem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MSXk6cSp7ImA9WhZRGUs.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-5737678019233689297</id><published>2011-04-16T15:59:00.000+01:00</published><updated>2011-04-16T15:59:48.719+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-16T15:59:48.719+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Rooting for the Underdog</title><content type="html">I installed Cyanogen 7 onto my HTC Desire this week. Along the way I changed the partition table to free up some space for applications. I now have a phone running the very latest version of Android, and space for plenty more apps.&lt;br /&gt;
&lt;br /&gt;
The ability to customize my phone in this way is very important to me. I will never buy a phone that does not allow me to have root access, or that prevents me from installing ROMs with mechanisms such as signed bootloaders. I didn't know about any of this stuff when I jumped from the good ship Apple (see&amp;nbsp;&lt;a href="http://www.maybetechnology.com/2010/04/operation-bad-apple.html"&gt;Operation Bad Apple&lt;/a&gt;). I bought an HTC Desire because it seemed like the best Android phone at the time. Had I known about custom ROMs and rooting, I probably would have gone for the Nexus One, because for a while it wasn't possible to get full root access to the Desire. It was only when&amp;nbsp;&lt;a href="http://alpharev.nl/"&gt;Alpharev&lt;/a&gt;&amp;nbsp;came along that this became possible.&lt;br /&gt;
&lt;br /&gt;
Which is why this link is so important&amp;nbsp;-&amp;nbsp;&lt;a href="http://unrevoked.com/rootwiki/doku.php/public/root_friendly"&gt;http://unrevoked.com/rootwiki/doku.php/public/root_friendly&lt;/a&gt;. It's a list of phones that are amenable to rooting. You'll notice all the newer HTC phones appear in the "poor choices" category. That's because HTC have started signing the boot partition, making it impossible to install custom ROMs. In my eyes, in the space of a year, HTC have move from being the plucky underdogs who need to be supported. to the dicks that need to be ignored. Although I am very impressed with my HTC Desire, there is no way I will be buying any of the newer HTC phones.&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Sony Ericsson have announced that all their new phones in the Xperia range will have unlockable bootloaders. They even provide a web-site to enable you to unlock the bootloader (see&amp;nbsp;&lt;a href="http://unlockbootloader.sonyericsson.com/"&gt;http://unlockbootloader.sonyericsson.com/&lt;/a&gt;). This is fantastic news, and is likely to win Sony Ericsson a lot of hardcore Android fans. You'll note that the new Sony phones appear in the "root friendly" section of the unrevoked list.&lt;br /&gt;
&lt;br /&gt;
Hopefully this is a sign of things to come, and more manufacturers will follow Sony's lead. If I were in the market for a new phone right now, I'd probably go for the Sony Arc. This kind of enlightened behaviour from phone manufacturers needs to be encouraged.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-5737678019233689297?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/5737678019233689297/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/rooting-for-underdog.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5737678019233689297?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/5737678019233689297?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/9-vW-U8GcbM/rooting-for-underdog.html" title="Rooting for the Underdog" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/rooting-for-underdog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8ER3oyfyp7ImA9WhZRGUk.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-4475112614552272213</id><published>2011-04-16T09:00:00.012+01:00</published><updated>2011-04-16T09:00:06.497+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-16T09:00:06.497+01:00</app:edited><title>Context Matters</title><content type="html">==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 373-75 &amp;nbsp;| Added on Friday, April 01, 2011, 07:53 AM&lt;br /&gt;
&lt;br /&gt;
There is no absolute best, only better. Despite the popularity of the term, there is no such thing as "best practices," only better practices in a particular situation.&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
In &lt;a href="http://www.generalsemantics.org/"&gt;General Semantics&lt;/a&gt;&amp;nbsp;we talk about &lt;a href="http://esgs.free.fr/uk/el.htm"&gt;non-elementalism&lt;/a&gt;&amp;nbsp;i.e. don't split verbally what cannot be split in actuality. The classic example is talking about 'space' and 'time' as opposed to space-time. Another example might be 'body' and 'mind' as opposed to the organism-as-a-whole.&lt;br /&gt;
&lt;br /&gt;
Everything has a context and must be evaluated in relation to that context.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-4475112614552272213?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/4475112614552272213/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/context-matters.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/4475112614552272213?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/4475112614552272213?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/9UrfcYSZSWw/context-matters.html" title="Context Matters" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/context-matters.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcERHc7cCp7ImA9WhZRF0s.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-9137062287758326041</id><published>2011-04-14T09:00:00.009+01:00</published><updated>2011-04-14T09:00:05.908+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T09:00:05.908+01:00</app:edited><title>Speak Up!</title><content type="html">==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 329-32 &amp;nbsp;| Added on Friday, April 01, 2011, 07:49 AM&lt;br /&gt;
&lt;br /&gt;
We all have some good ideas and some bad ideas, and everyone on the team needs to feel free to express them. Even if your idea is not fully taken up, it may help shape the solution. Don't be afraid of being criticized. Remember, everyone who became an expert started somewhere. In the words of Les Brown, "You don't have to be great to get started, but you have to get started to be great."&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
Even if the idea that you come up with isn't adopted, it may trigger someone else in the room to come up with a better idea. And that may in turn trigger someone else. Inspiration comes from the funniest places.&lt;br /&gt;
&lt;br /&gt;
I've read a few Edward de Bono books in my time where he talks about using nonsense words to trigger lateral thinking e.g. foo a bike with square wheels might lead someone to think about active suspension in a bike.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-9137062287758326041?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/9137062287758326041/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/speak-up.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/9137062287758326041?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/9137062287758326041?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/AvmbYtqvWh4/speak-up.html" title="Speak Up!" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/speak-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UFRno6eyp7ImA9WhZRFUQ.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-3479378488839028178</id><published>2011-04-12T09:00:00.008+01:00</published><updated>2011-04-12T09:00:17.413+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-12T09:00:17.413+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><title>Dealing with Problems</title><content type="html">==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 206-11 &amp;nbsp;| Added on Thursday, March 31, 2011, 09:02 AM&lt;br /&gt;
&lt;br /&gt;
You may not believe this, but not everyone always has the outcome of the project as their top priority. Not even you. Consider your first, "default" reaction when a problem arises. You might inadvertently fuel the problem by saying things that will complicate things further, by casting blame, or by making people feel defensive. Instead, take the high road, and ask, "What can I do to solve this or make it better?" In an agile team, the focus is on outcomes. You want to focus on fixing the problem, instead of affixing the blame. Blame doesn't fix bugs.&lt;br /&gt;
&lt;br /&gt;
==========&lt;br /&gt;
Practices of an Agile Developer (Neill Alexander) (Hunt Subramaniam)&lt;br /&gt;
- Highlight Loc. 221-24 &amp;nbsp;| Added on Thursday, March 31, 2011, 09:03 AM&lt;br /&gt;
&lt;br /&gt;
On an agile team, the situation is different. If you go to an agile team member with a complaint, you'll hear, "OK, what can I do to help you with this?" Instead of brooding over the problem, they'll direct their efforts toward solving it. Their motive is clear; it's the outcome that's important, not the credit, the blame, or the ongoing intellectual superiority contest.&lt;br /&gt;
==========&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-3479378488839028178?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/3479378488839028178/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/dealing-with-problems.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/3479378488839028178?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/3479378488839028178?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/cmUwFeZZbDo/dealing-with-problems.html" title="Dealing with Problems" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/dealing-with-problems.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMERHszeCp7ImA9WhZRFE8.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-3958298015226845598</id><published>2011-04-10T09:00:00.012+01:00</published><updated>2011-04-10T09:00:05.580+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-10T09:00:05.580+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><title>Compass</title><content type="html">I read about the &lt;a href="http://www.compass-project.org/"&gt;Compass Project&lt;/a&gt; in the book &lt;a href="http://pragprog.com/titles/cwosg/modular-java"&gt;Modular Java&lt;/a&gt;. When I next need to add search functionality to a Java application I will definitely be checking it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-3958298015226845598?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/3958298015226845598/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/compass.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/3958298015226845598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/3958298015226845598?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/R3HfAlhq4XY/compass.html" title="Compass" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/compass.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EERns_fCp7ImA9WhZREkk.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-7713294145605543075</id><published>2011-04-08T09:00:00.000+01:00</published><updated>2011-04-08T09:00:07.544+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-08T09:00:07.544+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Kindle Notes" /><title>Over Learning</title><content type="html">==========&lt;br /&gt;
Pomodoro Technique Illustrated (Neill Alexander) (Noteberg)&lt;br /&gt;
- Highlight Loc. 646-56 &amp;nbsp;| Added on Sunday, March 27, 2011, 12:49 PM&lt;br /&gt;
&lt;br /&gt;
Never switch activities in the middle of a Pomodoro. If you finish an activity halfway through a Pomodoro, spend the rest of the time over-learning. For example, if I finish early, I review what I have done, I repeat what I have learned, I see whether I can enhance my work, or I note new conclusions on paper---until the kitchen timer rings. Over-learning is when we continue to study or practice even after attaining proficiency. Malcolm Gladwell argues that this is necessary if we want to be really good at something: "Once a musician has enough ability to get into a top music school, the thing that distinguishes one performer from another is how hard he or she works. That's it. And what's more, the people at the very top don't work just harder or even much harder than everyone else. They work much, much harder.".[32] So, you're not allowed to impulsively switch activities in the middle of a Pomodoro. In fact, just having the option to switch in the middle is a recurring disturbance. You can't just stop in the middle of a Pomodoro and take a break either. Then you will lose the rhythm. And since the stopped Pomodoro was shorter, it will not be compatible---in terms of tracking---with other Pomodori.&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
I hadn't heard or read the phrase 'over-learning' prior to reading this book. It makes sense, and is something I am looking to adopt to improve my technical / programming skills.&lt;br /&gt;
&lt;br /&gt;
The Pomodoro Technique is, 1 week later, proving to be a useful addition to my personal productivity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-7713294145605543075?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/7713294145605543075/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/over-learning.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/7713294145605543075?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/7713294145605543075?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/p1v9Zvsg1cU/over-learning.html" title="Over Learning" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/over-learning.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8ER3o9eSp7ImA9WhZREEo.&quot;"><id>tag:blogger.com,1999:blog-5178998253654826511.post-584857501361272818</id><published>2011-04-06T09:00:00.001+01:00</published><updated>2011-04-06T09:00:06.461+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-06T09:00:06.461+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Kindle Notes" /><title>Double Trouble</title><content type="html">==========&lt;br /&gt;
Backgammon For Dummies (Chris Bray)&lt;br /&gt;
- Highlight on Page 78 | Loc. 989-91 &amp;nbsp;| Added on Monday, March 14, 2011, 07:33 AM&lt;br /&gt;
&lt;br /&gt;
In a game you may make up to 30 decisions about how to move your checkers, but you’re likely to make only two or three doubling of decisions, so taking the time to get them right is worth it. As Paul Magriel said, in his 1976 book Backgammon, ‘Good checker play will never compensate for serious errors of judgement in doubling.’&lt;br /&gt;
==========&lt;br /&gt;
Backgammon For Dummies (Chris Bray)&lt;br /&gt;
- Highlight on Page 99 | Loc. 1245-49 &amp;nbsp;| Added on Monday, March 14, 2011, 08:06 AM&lt;br /&gt;
&lt;br /&gt;
One of the keys to winning backgammon is to double when you have a strong threat, not after you’ve executed that threat perfectly. Remember, your opponent has to have some chance of winning in order to take your double. Winning just one point when you may have won four (via a doubled gammon) won’t make you rich, or leave you satisfied. Of course, sometimes you double and your opponent turns the game around and wins it. You just develop the knack of living with that possibility. If certainty is what you seek, backgammon is probably not for you. If, however, you want excitement, you’re playing the right game!&lt;br /&gt;
==========&lt;br /&gt;
&lt;br /&gt;
I have come to the conclusion that backgammon is a solved problem. For any particular roll of a dice there is a statistically best move you can make. Neural net based backgammon bots have proved this. However, you can play a match making the best moves all the way and still lose due to bad dice luck.&lt;br /&gt;
&lt;br /&gt;
So I'm putting my short-lived online backgammon career behind me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5178998253654826511-584857501361272818?l=www.maybetechnology.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.maybetechnology.com/feeds/584857501361272818/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.maybetechnology.com/2011/04/double-trouble.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/584857501361272818?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5178998253654826511/posts/default/584857501361272818?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/MaybeTechnology/~3/F8SEPK1CFZ0/double-trouble.html" title="Double Trouble" /><author><name>Neill Alexander</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-ANFXOk7RpvI/Tj09EWWHYQI/AAAAAAAAAOQ/zfqfpXG5rac/s220/profile-pic.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.maybetechnology.com/2011/04/double-trouble.html</feedburner:origLink></entry></feed>

