<?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;C0QMQHw4cSp7ImA9WhRSFEg.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714</id><updated>2011-11-16T13:49:41.239Z</updated><category term="linux" /><category term="apache" /><category term="screen" /><category term="redhat" /><category term="grails" /><category term="hibernate" /><category term="android" /><category term="tools" /><category term="jsf" /><category term="java" /><category term="git" /><category term="jpa" /><category term="clojure" /><category term="euler" /><category term="unix" /><category term="debian" /><category term="tomcat" /><category term="faker" /><category term="ubuntu" /><category term="happy hacking keyboard" /><category term="xmodmap" /><category term="myfaces" /><category term="httpclient" /><title>Doooks Tech Stuff</title><subtitle type="html">(describe 'doookstechstuff)</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://doookstechstuff.blogspot.com/" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>24</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/DoooksTechStuff" /><feedburner:info uri="doookstechstuff" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkANQnszfCp7ImA9Wx5WEkk.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-4129727028893683410</id><published>2010-09-23T12:19:00.000+01:00</published><updated>2010-09-23T12:19:53.584+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-23T12:19:53.584+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="redhat" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><title>How to fix Tomcat5  XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFctory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom</title><content type="html">Saw this exception on a RHEL5 box - our application stopped working after a yum update.&lt;br /&gt;
&lt;br /&gt;
To fix it I deleted the symlink to /usr/share/java/xml-commons-apis.jar in /var/lib/tomcat5/common/endorsed and restarted tomcat. &lt;br /&gt;
&lt;br /&gt;
The stack trace looked something like:&lt;br /&gt;
&lt;br /&gt;
- XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFctory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom&lt;br /&gt;
java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFctory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom&lt;br /&gt;
        at javax.xml.xpath.XPathFactory.newInstance(Unknown Source)&lt;br /&gt;
        at com.sun.tools.xjc.reader.internalizer.Internalizer.&lt;clinit&gt;(Internalizer.java:81)&lt;br /&gt;
        at com.sun.tools.xjc.reader.internalizer.DOMForest.transform(DOMForest.java:448)&lt;br /&gt;
        at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:221)&lt;br /&gt;
        at org.apache.cxf.common.util.ReflectionInvokationHandler.invoke(ReflectionInvokationHandler.java:52)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-4129727028893683410?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/ulFATcS2DgE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/4129727028893683410/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/09/how-to-fix-tomcat5-xpathfactorynewinsta.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4129727028893683410?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4129727028893683410?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/ulFATcS2DgE/how-to-fix-tomcat5-xpathfactorynewinsta.html" title="How to fix Tomcat5  XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFctory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/09/how-to-fix-tomcat5-xpathfactorynewinsta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMGRnc5eSp7ImA9Wx5REU4.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-4334857802708420029</id><published>2010-08-18T13:59:00.002+01:00</published><updated>2010-08-18T14:00:27.921+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-18T14:00:27.921+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="debian" /><title>How to Stop Debian Ignoring /etc/security/limits.conf</title><content type="html">I was trying to increase the number of open files allowed for a user on a Debian 5 box. Changing /etc/security/limits.conf was being ignored until I added the following line to /etc/pam.d/common-session.&lt;br /&gt;
&lt;br /&gt;
session required pam_limits.so&lt;br /&gt;
&lt;br /&gt;
Logging out and in again after adding that line gave the new session the ulimit I was trying to configure.&lt;br /&gt;
&lt;br /&gt;
Took quite a lot of googling to find this: &lt;a href="http://www.zimbra.com/forums/administrators/16066-solved-too-many-open-files-error.html"&gt;http://www.zimbra.com/forums/administrators/16066-solved-too-many-open-files-error.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-4334857802708420029?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/Hl6AtQUbKZ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/4334857802708420029/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/08/how-to-stop-debian-ignoring.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4334857802708420029?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4334857802708420029?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/Hl6AtQUbKZ0/how-to-stop-debian-ignoring.html" title="How to Stop Debian Ignoring /etc/security/limits.conf" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/08/how-to-stop-debian-ignoring.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8BR3w-eyp7ImA9WxFbGUs.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2012907160587653919</id><published>2010-07-12T20:39:00.001+01:00</published><updated>2010-07-12T20:44:16.253+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-12T20:44:16.253+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="faker" /><title>Faker for Clojure 1.1</title><content type="html">I wanted to use Sebastián Galkin's &lt;a href="http://github.com/paraseba/faker"&gt;Faker&lt;/a&gt; library to create some sample data. It requires some bleeding edge stuff from Clojure 1.2. but my current project is built against Clojure 1.1, so I back-ported it to work with 1.1. &lt;br /&gt;
&lt;br /&gt;
You can find the code at &lt;a href="http://github.com/doooks/faker"&gt;http://github.com/doooks/faker&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2012907160587653919?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/_UsrOdpc1RQ" height="1" width="1"/&gt;</content><link rel="related" href="http://github.com/doooks/faker" title="Faker for Clojure 1.1" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2012907160587653919/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/07/faker-for-clojure-11.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2012907160587653919?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2012907160587653919?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/_UsrOdpc1RQ/faker-for-clojure-11.html" title="Faker for Clojure 1.1" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/07/faker-for-clojure-11.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMERn8yfyp7ImA9WxFRE0s.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-3129346143993405500</id><published>2010-04-27T10:26:00.001+01:00</published><updated>2010-04-27T10:26:47.197+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-27T10:26:47.197+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="redhat" /><category scheme="http://www.blogger.com/atom/ns#" term="grails" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><title>How to Fix Tomcat5 on RHEL5 org.apache.xalan.processor.TransformerFactoryImpl not found</title><content type="html">I got this exception trying to start a Grails app on a RHEL5 box using OpenJDK and Tomcat5, all installed from Yum.&lt;br /&gt;
&lt;br /&gt;
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'annotationHandlerAdapter': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]: Constructor threw exception; nested exception is javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found at java.lang.Thread.run(Thread.java:636)&lt;br /&gt;
&lt;br /&gt;
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class &lt;br /&gt;
[org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]: Constructor threw exception; nested exception is javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found&lt;br /&gt;
&lt;br /&gt;
To fix I did a yum install of xerces and xalan, created a symlink from $catalina_home/common/endorsed/xalan.jar to /usr/share/java/xalan-j2.jar and restarted Tomcat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-3129346143993405500?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/KiPu1t6XvDg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/3129346143993405500/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/04/how-to-fix-tomcat5-on-rhel5.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/3129346143993405500?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/3129346143993405500?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/KiPu1t6XvDg/how-to-fix-tomcat5-on-rhel5.html" title="How to Fix Tomcat5 on RHEL5 org.apache.xalan.processor.TransformerFactoryImpl not found" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/04/how-to-fix-tomcat5-on-rhel5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIMRn8yfCp7ImA9WxBbFkU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2612680091931420599</id><published>2010-03-15T20:06:00.000Z</published><updated>2010-03-15T20:06:27.194Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T20:06:27.194Z</app:edited><title>Project Euler Problem 14 in Clojure</title><content type="html">This one was fun. I also learned a good lesson the hard way about lazy sequences. When I was playing with the code in the REPL everything worked fine, but I got confused when I hooked everything up and started getting empty lists out of functions. It looked like functions were returning the values pointed to by the atoms before I modified them. I'd read about how lazy sequences don't get evaluated until they are required, but it didn't occur to me that "for" would return immediately, without evaluating anything. In the REPL this doesn't happen of course.&lt;br /&gt;
&lt;br /&gt;
Was also my first look at maps, and the loop macro.&lt;br /&gt;
&lt;br /&gt;
Solves in about 40sec&lt;br /&gt;
&lt;br /&gt;
(defn- next-int [n]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(if (even? n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(/ n 2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(+ (* n 3) 1)))&lt;br /&gt;
&lt;br /&gt;
(defn- grow [start-num]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(let [sequence (atom (list start-num))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop [head (first @sequence)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [next (next-int head)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(swap! sequence conj next)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (= 1 next)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@sequence&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(recur next))))))&lt;br /&gt;
&lt;br /&gt;
(defn- measure-sequences []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(let [counts (atom {})]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(doall&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(for [start-num (range 1 1000000)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [sequence (grow start-num)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(swap! counts assoc start-num (count sequence)))))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@counts))&lt;br /&gt;
&lt;br /&gt;
(defn max-map-entry [map]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(first (sort (comparator #(&gt; (val %1) (val %2))) (seq map))))&lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(first (max-map-entry (measure-sequences))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2612680091931420599?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/-A9HPx0wT34" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=14" title="Project Euler Problem 14 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2612680091931420599/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-14-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2612680091931420599?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2612680091931420599?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/-A9HPx0wT34/project-euler-problem-14-in-clojure.html" title="Project Euler Problem 14 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-14-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8ER3Y6cSp7ImA9WxBbFkU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-4091897494081542263</id><published>2010-03-15T19:53:00.000Z</published><updated>2010-03-15T19:53:26.819Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T19:53:26.819Z</app:edited><title>Project Euler Problem 13 in Clojure</title><content type="html">Really not very interesting&lt;br /&gt;
&lt;br /&gt;
;; defining big list of numbers elided&lt;br /&gt;
&lt;br /&gt;
(defn solve[]&lt;br /&gt;
  (.substring (str (apply + numbers)) 0 10))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-4091897494081542263?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/U8VPd_4ALAU" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=13" title="Project Euler Problem 13 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/4091897494081542263/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-13-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4091897494081542263?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4091897494081542263?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/U8VPd_4ALAU/project-euler-problem-13-in-clojure.html" title="Project Euler Problem 13 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-13-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIMSX87fSp7ImA9WxBbFkU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2209363112721939681</id><published>2010-03-15T19:48:00.001Z</published><updated>2010-03-15T19:49:48.105Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T19:49:48.105Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 9 in Clojure</title><content type="html">Solves in about 16sec. I quite liked the solution though of course the forum posts on the Project Euler site show some much cleverer solutions.&lt;br /&gt;
&lt;br /&gt;
(defn pythagorean-triplet? [a b c]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(and&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt; a b)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt; b c)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(= (+ (* a a) (* b b)) (* c c))))&lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(first&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(for [a (range 1 1000) b (range a 1000) c (range b 1000)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:when (and&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(pythagorean-triplet? a b c)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(= 1000 (+ a b c)))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(* a b c))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2209363112721939681?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/EAv86cjEh3s" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=9" title="Project Euler Problem 9 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2209363112721939681/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-9-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2209363112721939681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2209363112721939681?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/EAv86cjEh3s/project-euler-problem-9-in-clojure.html" title="Project Euler Problem 9 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-9-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEEQXo9fip7ImA9WxBbFkU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-8744200918652963594</id><published>2010-03-15T19:44:00.001Z</published><updated>2010-03-15T19:50:00.466Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T19:50:00.466Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 8 in Clojure</title><content type="html">Not very interesting solution, since I use int/string conversions. As a clojure newcomer it feels a bit weird using the Java String API, just because you know its there. Writing functions to wrap the Java String API is probably not idiomatic Clojure, but I think it might be nice to wrap them in macros one day, to make the substring calls look a bit more Clojure-ish. &lt;br /&gt;
&lt;br /&gt;
Solves in about 20msec.&lt;br /&gt;
&lt;br /&gt;
(def bignumber "73167176531330624919......") ;; elided&lt;br /&gt;
&lt;br /&gt;
(defn- calc-offsets []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(range 0 (- 1000 5)))&lt;br /&gt;
&lt;br /&gt;
(defn- five-digit-list [bigstring offset]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(let [substr (.substring bigstring offset (+ 5 offset))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map #(Integer/parseInt (str %)) substr)))&lt;br /&gt;
&lt;br /&gt;
(defn- five-digit-lists [bigstring]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(map #(five-digit-list bigstring %) (calc-offsets)))&lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(apply max (map #(apply * %) (five-digit-lists bignumber))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-8744200918652963594?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/VFehSdeQIww" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=8" title="Project Euler Problem 8 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/8744200918652963594/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-8-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/8744200918652963594?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/8744200918652963594?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/VFehSdeQIww/project-euler-problem-8-in-clojure.html" title="Project Euler Problem 8 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-8-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcFRXo5fyp7ImA9WxBbE0U.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-3979794611536725961</id><published>2010-03-11T21:56:00.002Z</published><updated>2010-03-12T09:43:34.427Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-12T09:43:34.427Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 7 in Clojure</title><content type="html">Another idea stolen from Ed. This defines a lazy sequence of primes, and holds on to the head, so whichever primes have been realised are memoised, and so are cached for future access.&lt;br /&gt;
&lt;br /&gt;
Takes about 45 seconds to run. &lt;br /&gt;
&lt;br /&gt;
(def primes&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(let [known-primes (atom (list))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(for [n (iterate inc 2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:when (or&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(= 2 n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(not-any? #(zero? (mod n %)) @known-primes))]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(do&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(swap! known-primes conj n)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n))))&lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(nth primes 10000))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-3979794611536725961?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/rf752db4sDM" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=7" title="Project Euler Problem 7 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/3979794611536725961/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-7-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/3979794611536725961?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/3979794611536725961?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/rf752db4sDM/project-euler-problem-7-in-clojure.html" title="Project Euler Problem 7 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-7-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEFQHg_eyp7ImA9WxBbFkU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-8972673942853690084</id><published>2010-03-09T20:55:00.001Z</published><updated>2010-03-15T19:50:11.643Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-15T19:50:11.643Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 6 in Clojure</title><content type="html">Wrote a square function so that the result wasn't cast to Double, so I didn't have to mess about with the formatting of the answer.&lt;br /&gt;
&lt;br /&gt;
(defn square [num]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(* num num))&lt;br /&gt;
&lt;br /&gt;
(defn sum-squares [max]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(reduce + (map #(square %) (range 1 max))))&lt;br /&gt;
&lt;br /&gt;
(defn square-sum [max]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(square (apply + (range 1 max))))&lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(- (square-sum 101) (sum-squares 101)))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-8972673942853690084?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/bguDtNCC3Vc" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=6" title="Project Euler Problem 6 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/8972673942853690084/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-6-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/8972673942853690084?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/8972673942853690084?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/bguDtNCC3Vc/project-euler-problem-6-in-clojure.html" title="Project Euler Problem 6 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-6-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8DQ388fCp7ImA9WxBbEEU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-4087695666310344825</id><published>2010-03-08T22:21:00.000Z</published><updated>2010-03-08T22:21:12.174Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-08T22:21:12.174Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 5 in Clojure</title><content type="html">Not very impressive performance, this brute-force method takes about 30 seconds to run. Could probably be a lot quicker if factors were chosen more intelligently.&lt;br /&gt;
&lt;br /&gt;
(def factors (into () (range 20 3 -1)))&lt;br /&gt;
&lt;br /&gt;
(defn- all-factors [number]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(if (every? #(zero? (mod number %)) factors)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;number&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(recur (inc number))))&lt;br /&gt;
&lt;br /&gt;
(defn solve[]&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;(all-factors 1))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-4087695666310344825?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/GM3tOe1uyKI" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=5" title="Project Euler Problem 5 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/4087695666310344825/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-5-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4087695666310344825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/4087695666310344825?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/GM3tOe1uyKI/project-euler-problem-5-in-clojure.html" title="Project Euler Problem 5 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-5-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEESXY9eyp7ImA9WxBbEEU.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-7434369757315044308</id><published>2010-03-08T21:09:00.001Z</published><updated>2010-03-08T21:10:08.863Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-08T21:10:08.863Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 4 in Clojure</title><content type="html">Most of my time was spent playing with for, trying to work out if it was best to do it all in the list comprehension. In the end I thought it was more readable to pull the creation of the products out into its own function.&lt;br /&gt;
&lt;br /&gt;
(defn palindrome? [str]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(if (= (first str) (last str))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (&lt;= 2 (count str))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(recur (rest (butlast str)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;true)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;false))&lt;br /&gt;
&lt;br /&gt;
(defn three-digit-numbers []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(range 100 1000))&lt;br /&gt;
&lt;br /&gt;
(defn- products []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(distinct&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(for [n1 (three-digit-numbers) n2 (three-digit-numbers)]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(* n1 n2))))&lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(apply max (filter #(palindrome? (str %)) (products))))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-7434369757315044308?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/q0aHEScuKDQ" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=4" title="Project Euler Problem 4 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/7434369757315044308/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-4-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/7434369757315044308?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/7434369757315044308?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/q0aHEScuKDQ/project-euler-problem-4-in-clojure.html" title="Project Euler Problem 4 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-4-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMFSX48fCp7ImA9WxBUGUs.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-437523098150062379</id><published>2010-03-07T11:46:00.001Z</published><updated>2010-03-07T11:46:58.074Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-07T11:46:58.074Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 3 in Clojure - part 2</title><content type="html">So the solution in part 1 was no good - it took half an hour to run. I spent a while trying and failing to make a lazy, purely functional version but after talking to Ed about his solution I came up with this, which runs in about 500msec :&lt;br /&gt;
&lt;br /&gt;
(defn factor? [big small]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(zero? (mod big small)))                                                                     &lt;br /&gt;
&lt;br /&gt;
(defn prime? [n]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(not-any? #(factor? n %) (range 2 n)))                                                       &lt;br /&gt;
&lt;br /&gt;
(defn primes []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(filter #(prime? %) (iterate inc 2)))                                                        &lt;br /&gt;
&lt;br /&gt;
(defn prime-factors [n]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(let [factors (atom ())]                                                                     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(last                                                                            &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (for [candidate (primes) :while (&lt; (apply * @factors) n)]                       &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (if (factor? n candidate)                                           &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(swap! factors conj candidate))))))                                  &lt;br /&gt;
&lt;br /&gt;
(defn solve []&lt;br /&gt;
&amp;nbsp;&amp;nbsp;(first (prime-factors 600851475143)))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-437523098150062379?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/z60HQ03hTcM" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=3" title="Project Euler Problem 3 in Clojure - part 2" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/437523098150062379/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-3-in-clojure-part_07.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/437523098150062379?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/437523098150062379?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/z60HQ03hTcM/project-euler-problem-3-in-clojure-part_07.html" title="Project Euler Problem 3 in Clojure - part 2" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-3-in-clojure-part_07.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIAQ3Y6eCp7ImA9WxBUF0k.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2331729386905835809</id><published>2010-03-04T22:46:00.006Z</published><updated>2010-03-04T23:15:42.810Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-04T23:15:42.810Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 3 in Clojure - part 1</title><content type="html">This one is proving a bit tougher. First you need a list of prime numbers. I'm using the &lt;a href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Euler.27s_Sieve"&gt;Euler's Sieve&lt;/a&gt; to produce primes.&lt;br /&gt;&lt;br /&gt;First I wrote this function:&lt;br /&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                   &lt;br /&gt;(defn sieve-numbers [position numbers]                                                                                                                       &lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (&gt;= position (count numbers))                                                                                                                          &lt;br /&gt;&amp;nbsp;&amp;nbsp;numbers                                                                                                                                                  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [prime (nth numbers position)]                                                                                                                      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [products (map #(* prime %) numbers)]                                                                                                             &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [filtered (remove #(some #{%} products) numbers)]                                                                                               &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(recur (inc position) filtered))))))&lt;br /&gt;&lt;br /&gt;which worked but was dog-slow:&lt;br /&gt;&lt;br /&gt;;; (dotimes [_ 5] (time (sieve-euler 1000)))                                                                                                                 &lt;br /&gt;;; "Elapsed time: 484.981564 msecs"                                                                                                                          &lt;br /&gt;;; "Elapsed time: 459.624835 msecs"                                                                                                                          &lt;br /&gt;;; "Elapsed time: 462.771112 msecs"                                                                                                                          &lt;br /&gt;;; "Elapsed time: 460.312279 msecs"                                                                                                                          &lt;br /&gt;;; "Elapsed time: 462.203786 msecs"                                                                                                                          &lt;br /&gt;;; nil  &lt;br /&gt;&lt;br /&gt;To solve the problem we need to primes up to ceil(sqrt(N)) which is 775147 so that first method would take days.&lt;br /&gt;&lt;br /&gt;To speed up the filtering I rewrote to use a SortedSet:&lt;br /&gt;&lt;br /&gt;(defn sieve-numbers [primes candidates]&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (empty? candidates)&lt;br /&gt;&amp;nbsp;&amp;nbsp;primes&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let [prime (first candidates)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [products (map #(* prime %) candidates)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let [filtered (difference candidates products #{prime})]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(recur (conj primes prime) filtered))))))&lt;br /&gt;&lt;br /&gt;which is about 32 times faster:&lt;br /&gt;&lt;br /&gt;;; (dotimes [_ 5] (time (sieve-euler 1000)))&lt;br /&gt;&lt;br /&gt;;; "Elapsed time: 13.061787 msecs"&lt;br /&gt;;; "Elapsed time: 12.994529 msecs"&lt;br /&gt;;; "Elapsed time: 13.716897 msecs"&lt;br /&gt;;; "Elapsed time: 13.237088 msecs"&lt;br /&gt;;; "Elapsed time: 14.33136 msecs"&lt;br /&gt;&lt;br /&gt;Still not good enough though. I need a faster sieve before I can even attempt to factor the large(ish) number and solve problem 3 inside a minute. I think my next step will be to pre-filter some of the non-primes with a &lt;a href="http://en.wikipedia.org/wiki/Wheel_factorization"&gt;Wheel Factorisation&lt;/a&gt;. This method wont remove all the non-primes, but it might be fun to implement.&lt;br /&gt;&lt;br /&gt;I'm leaving the current sieve chugging away tonight to see how long it takes anyway, for comparison.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2331729386905835809?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/GQNdEIEZON8" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=3" title="Project Euler Problem 3 in Clojure - part 1" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2331729386905835809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-3-in-clojure-part.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2331729386905835809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2331729386905835809?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/GQNdEIEZON8/project-euler-problem-3-in-clojure-part.html" title="Project Euler Problem 3 in Clojure - part 1" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-3-in-clojure-part.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYBQngycCp7ImA9WxBUFkg.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-7333039729102879030</id><published>2010-03-03T22:40:00.003Z</published><updated>2010-03-03T22:42:33.698Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T22:42:33.698Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 2 in Clojure</title><content type="html">&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;;; lazy fibo stolen from programming clojure p137                                                                                                                                  &lt;br /&gt;(defn fibo []&lt;br /&gt;         (map first (iterate (fn [[a b]] [b (+ a b)]) [1 2])))&lt;br /&gt;&lt;br /&gt;(defn solve []&lt;br /&gt;      (reduce + (filter even? (take-while #(&gt; 4000000 %) (fibo)))))&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-7333039729102879030?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/NW31pFu7RGM" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=2" title="Project Euler Problem 2 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/7333039729102879030/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-2-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/7333039729102879030?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/7333039729102879030?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/NW31pFu7RGM/project-euler-problem-2-in-clojure.html" title="Project Euler Problem 2 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-2-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04BRH84eSp7ImA9WxBUFkg.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2137277164769938035</id><published>2010-03-03T22:30:00.004Z</published><updated>2010-03-03T22:39:15.131Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T22:39:15.131Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="euler" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Project Euler Problem 1 in Clojure</title><content type="html">I'm trying to solve Project Euler using Clojure as an exercise to learn the language. My aim is to favour readability over performance, but still execute each problem inside a minute.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;(defn is-multiple [number factor]&lt;br /&gt;  (zero? (mod number factor)))&lt;br /&gt;&lt;br /&gt;(defn is-multiple-3-or-5 [number]&lt;br /&gt;  (or (is-multiple number 3)&lt;br /&gt;         (is-multiple number 5)))&lt;br /&gt;&lt;br /&gt;(defn solve []&lt;br /&gt;  (reduce + (filter is-multiple-3-or-5 (range 1 1000))))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2137277164769938035?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/WJfodYdBHaA" height="1" width="1"/&gt;</content><link rel="related" href="http://projecteuler.net/index.php?section=problems&amp;id=1" title="Project Euler Problem 1 in Clojure" /><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2137277164769938035/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-1-in-clojure.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2137277164769938035?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2137277164769938035?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/WJfodYdBHaA/project-euler-problem-1-in-clojure.html" title="Project Euler Problem 1 in Clojure" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/03/project-euler-problem-1-in-clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IFSHc4cCp7ImA9WxBRFkQ.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-6397346971555238679</id><published>2010-01-05T13:46:00.002Z</published><updated>2010-01-05T13:51:59.938Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-05T13:51:59.938Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><title>Easy way to get information about a running JVM</title><content type="html">kill -3 $PID&lt;br /&gt;&lt;br /&gt;outputs a load of information about your running JVM to stdout. Very handy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-6397346971555238679?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/c5S1lXLuK14" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/6397346971555238679/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2010/01/easy-way-to-get-information-about.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/6397346971555238679?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/6397346971555238679?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/c5S1lXLuK14/easy-way-to-get-information-about.html" title="Easy way to get information about a running JVM" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2010/01/easy-way-to-get-information-about.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkADQHc7eip7ImA9WxNUGUs.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-7433915332607955666</id><published>2009-11-11T17:09:00.006Z</published><updated>2009-11-11T17:32:51.902Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-11T17:32:51.902Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="happy hacking keyboard" /><category scheme="http://www.blogger.com/atom/ns#" term="xmodmap" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Happy Hacking Keyboard Lite 2 Xmodmap settings for Ubuntu Linux</title><content type="html">During the upgrade to Ubuntu 9.10 I managed to clobber my hard-won Xmodmap settings to make my Happy Hacking Keyboard Lite 2 (the USB version, with the arrow keys) work properly.&lt;br /&gt;&lt;br /&gt;Here is the commented xmodmap file I use to modify the default key mappings, which is slightly British oriented. To use the file, run &lt;span style="font-style: italic;"&gt;xmodmap&lt;/span&gt; &lt;span style="font-style: italic;"&gt;path_to_file&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Some features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;pound; and &amp;euro; symbols are mapped to right-diamond-3 and right-diamond-e, respectively.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Arrow keys work.&lt;/li&gt;&lt;li&gt;PageUp/PageDown on Fn-Arrows work. &lt;/li&gt;&lt;li&gt;Left Diamond is another Alt.&lt;/li&gt;&lt;li&gt;Tilde, pipe, backslash and backtick behave themselves.&lt;/li&gt;&lt;/ul&gt;I just hope I don't ever have to work all this out again.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;------------------- SNIP FILE -------------------&lt;br /&gt;&lt;br /&gt;! This is an xmodmap input file for the Happy Hacking Keyboard, model HHKB Lite 2. It assumes that the&lt;br /&gt;! keymap is already set up for a gb-105 keyboard, then applies fixes for arrow keys and British conventions&lt;br /&gt;!&lt;br /&gt;! This file makes the following changes:&lt;br /&gt;!&lt;br /&gt;! Fix the arrow keys&lt;br /&gt;!&lt;br /&gt;keycode 111 = Up&lt;br /&gt;keycode 116 = Down&lt;br /&gt;keycode 113 = Left&lt;br /&gt;keycode 114 = Right&lt;br /&gt;!&lt;br /&gt;! Fix the Fn-Arrows to give PgUp, PgDown, Home and End&lt;br /&gt;!&lt;br /&gt;keycode 112 = Prior&lt;br /&gt;keycode 117 = Next&lt;br /&gt;keycode 110 = Home&lt;br /&gt;keycode 115 = End&lt;br /&gt;!&lt;br /&gt;! Fix the Alt and Diamond keys&lt;br /&gt;!&lt;br /&gt;keycode 133 = Super_L&lt;br /&gt;keycode 134 = Mode_switch&lt;br /&gt;keycode 64 = Alt_L&lt;br /&gt;keycode 108 = Alt_R&lt;br /&gt;!&lt;br /&gt;! Put the @ on shift-' as British keyboards do&lt;br /&gt;!&lt;br /&gt;keycode 48 = apostrophe at&lt;br /&gt;!&lt;br /&gt;! Put the " on shift-2 as British keyboards do&lt;br /&gt;!&lt;br /&gt;keycode 11 = 2  quotedbl&lt;br /&gt;!&lt;br /&gt;! Put the Pound symbol on right-diamond-3&lt;br /&gt;!&lt;br /&gt;keycode 12 = 3 numbersign sterling sterling&lt;br /&gt;!&lt;br /&gt;! Put the Euro symbol on right-diamond-e&lt;br /&gt;!&lt;br /&gt;keycode 26 = e E EuroSign&lt;br /&gt;!&lt;br /&gt;! Fix tilde&lt;br /&gt;!&lt;br /&gt;keycode 49 = grave asciitilde&lt;br /&gt;!&lt;br /&gt;! Fix backslash&lt;br /&gt;!&lt;br /&gt;keycode 51 = backslash bar&lt;br /&gt;!&lt;br /&gt;!&lt;br /&gt;! Remove all the existing modifier key mappings&lt;br /&gt;!&lt;br /&gt;clear Shift&lt;br /&gt;clear Lock&lt;br /&gt;clear Control&lt;br /&gt;clear Mod1&lt;br /&gt;clear Mod2&lt;br /&gt;clear Mod3&lt;br /&gt;clear Mod4&lt;br /&gt;clear Mod5&lt;br /&gt;!&lt;br /&gt;! Put the modifier key mappings back&lt;br /&gt;!&lt;br /&gt;add    Shift   = Shift_L Shift_R&lt;br /&gt;add    Lock    = Caps_Lock&lt;br /&gt;add    Control = Control_L Control_R&lt;br /&gt;!&lt;br /&gt;! including this line which makes both Alt keys and the left diamond key act as Alt keys&lt;br /&gt;!&lt;br /&gt;add    Mod1    = Alt_L Alt_R Super_L&lt;br /&gt;!&lt;br /&gt;! makes the right diamond acts as the Mode_switch modifier (mapped to right diamond above)&lt;br /&gt;!&lt;br /&gt;add    Mod3    = Mode_switch&lt;br /&gt;add    Mod5    = Scroll_Lock&lt;br /&gt;&lt;br /&gt;------------------------- END OF FILE -----------------------&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-7433915332607955666?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/CA4DvwhAqTE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/7433915332607955666/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/11/happy-hacking-keyboard-lite-2-xmodmap.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/7433915332607955666?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/7433915332607955666?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/CA4DvwhAqTE/happy-hacking-keyboard-lite-2-xmodmap.html" title="Happy Hacking Keyboard Lite 2 Xmodmap settings for Ubuntu Linux" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/11/happy-hacking-keyboard-lite-2-xmodmap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YNRn88eSp7ImA9WxNTF0U.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-5515242529115549284</id><published>2009-08-20T15:52:00.004+01:00</published><updated>2009-08-20T16:13:17.171+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-20T16:13:17.171+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>Share a git repository with unix groups</title><content type="html">If you have a shared Linux/Unix box that all your developers use to share code with git, there are various ways of setting up the shared repository. If you just use git over ssh, you don't need to maintain any more servers.&lt;br /&gt;&lt;br /&gt;The simplest possible solutions assume that there is a single user account and different developers are authenticated on the server with their ssh public keys. I needed to restrict which developers get access to different repositories, and to be able to switch these permissions on and off. Unix has already solved this problem of course, with users and groups. Here is how to use real users and groups on your unix server to control git access.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Set up unix accounts for your users. "adduser jim"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Set up groups for each project, "addgroup wonderproject-developers"&lt;/li&gt;&lt;li&gt;Add the appropriate developers to the group "adduser jim wonderproject-developers"&lt;/li&gt;&lt;li&gt;In a private directory on your server, logged in as yourself, make a directory for the git repository "mkdir wonderproject.git"&lt;/li&gt;&lt;li&gt;Make the new group the group owner of the git repository "chgrp wonderproject-developers wonderproject.git/"&lt;/li&gt;&lt;li&gt;Fix the perms so only the group and the owner can read and write the repository "chmod 770 wonderproject.git/"&lt;/li&gt;&lt;li&gt;Make the repository setgid, so that any new files created inside it have group ownership the same as the directory "chmod g+s wonderproject.git"&lt;/li&gt;&lt;li&gt;cd wonderproject.git&lt;/li&gt;&lt;li&gt;create the git repository "git --bare init --shared=group" the --shared option ensures that git keeps the correct permissions when the various developers push commits into the repository.&lt;/li&gt;&lt;li&gt;Now, if your project is empty, clone this new repository onto your desktop and start committing "git clone ssh://jim@git.example.com:port/path/to/repos/wonderproject.git&lt;/li&gt;&lt;li&gt;If you have an existing repository on your desktop and you want to push it into the empty shared repository, edit your .git/config remote url to point at the new server url and then do a "git push --all"&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-5515242529115549284?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/00QRwxEKTtE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/5515242529115549284/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/08/share-git-repository-with-unix-groups.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/5515242529115549284?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/5515242529115549284?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/00QRwxEKTtE/share-git-repository-with-unix-groups.html" title="Share a git repository with unix groups" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/08/share-git-repository-with-unix-groups.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQCRXo_eSp7ImA9WxJVE0g.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2493936863321310287</id><published>2009-06-30T11:01:00.003+01:00</published><updated>2009-06-30T11:06:04.441+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-30T11:06:04.441+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="httpclient" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="android" /><title>Switching off Expect: 100-Continue header with Apache HttpClient</title><content type="html">Apache HTTP client version 4.0 (at least, the version bundled with the Android SDK) adds the header "Expect: 100-Continue" by default, which confuses many web servers. The following snippet switches this header off:&lt;br /&gt;&lt;br /&gt;HttpClient client = new DefaultHttpClient();&lt;br /&gt;client.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);&lt;br /&gt;&lt;br /&gt;I was seeing an error response like the following before I switched this header off:&lt;br /&gt;&lt;br /&gt;HTTP/1.1 417 Expectation Failed.&lt;br /&gt;Date: Tue, 30 Jun 2009 10:03:59 GMT.&lt;br /&gt;Server: hi.&lt;br /&gt;Vary: Accept-Encoding.&lt;br /&gt;Content-Length: 364.&lt;br /&gt;Connection: close.&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1.&lt;br /&gt;&lt;br /&gt;417 Expectation Failed&lt;br /&gt;Expectation Failed&lt;br /&gt;The expectation given in the Expect request-header field could not be met by this server.&lt;br /&gt;The client sent Expect: 100-Continue but we only allow the 100-continue expectation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2493936863321310287?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/4AKUPMfcaic" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2493936863321310287/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/06/switching-off-expect-100-continue.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2493936863321310287?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2493936863321310287?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/4AKUPMfcaic/switching-off-expect-100-continue.html" title="Switching off Expect: 100-Continue header with Apache HttpClient" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/06/switching-off-expect-100-continue.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8FSH0_eip7ImA9WxJVE0g.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-8976691119726123445</id><published>2009-06-30T10:17:00.005+01:00</published><updated>2009-06-30T10:23:39.342+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-30T10:23:39.342+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="debian" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Copying package selections with debian/ubuntu</title><content type="html">This is documented in lots of places but it seems to always take me a while to find it. Here is how to install the set of packages from one machine to another.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;On the source machine: sudo dpkg --get-selections &gt; output_file&lt;/li&gt;&lt;li&gt;Transfer the output file to the target machine&lt;/li&gt;&lt;li&gt;On the target machine: sudo dpkg --set-selections &lt;&gt;&lt;/li&gt;&lt;li&gt;On the target machine: sudo apt-get -u dselect-upgrade&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-8976691119726123445?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/du32hrd_iQM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/8976691119726123445/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/06/copying-package-selections-with.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/8976691119726123445?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/8976691119726123445?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/du32hrd_iQM/copying-package-selections-with.html" title="Copying package selections with debian/ubuntu" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/06/copying-package-selections-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUCRXwyeip7ImA9WxJSE0k.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-2006129648288193781</id><published>2009-05-03T11:08:00.009+01:00</published><updated>2009-05-03T11:41:04.292+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-03T11:41:04.292+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="screen" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Screen Tweaks on Ubuntu Jaunty</title><content type="html">&lt;a href="http://www.gnu.org/software/screen/"&gt;Screen&lt;/a&gt; is a must-have tool for anyone that spends time at the command line. I move my .screenrc file around with me whenever I move machine, and hadn't thought about it much for a while, but when I started screen on a Ubuntu Jaunty box with no .screenrc, I noticed that the system-wide screen config in /etc/screenrc is now quite useful.&lt;br /&gt;&lt;br /&gt;The screenshot below shows the status line from the default config.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qsFmkLsd_xw/Sf1zvT_L-sI/AAAAAAAAACw/wp_nfh0o6d0/s1600-h/screen-screenshot.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 33px;" src="http://4.bp.blogspot.com/_qsFmkLsd_xw/Sf1zvT_L-sI/AAAAAAAAACw/wp_nfh0o6d0/s400/screen-screenshot.jpg" alt="" id="BLOGGER_PHOTO_ID_5331544790532881090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Using two whole lines for status messages seems a bit much but I'm a little old school when it comes to preserving display space. So you get load, CPU, free memory, a clock and named screens without any effort now.&lt;br /&gt;&lt;br /&gt;I copied the /etc/screenrc to ~/.screenrc and added a few options&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bind x&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bind ^x&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ignorecase on&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The bind options stop C-ax, which normally detaches the terminal from screen, from working. I tend to type that keystroke by accident fairly frequently. The last option ignores case during history searches.&lt;br /&gt;&lt;br /&gt;If you use lots of gnome-terminal windows or even tabs to manage your terminal sessions you should try screen, it will speed you up a lot once the keystrokes get wired into your muscle memory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-2006129648288193781?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/yroXCf5uplQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/2006129648288193781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/05/screen-tweaks-on-ubuntu-jaunty.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2006129648288193781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/2006129648288193781?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/yroXCf5uplQ/screen-tweaks-on-ubuntu-jaunty.html" title="Screen Tweaks on Ubuntu Jaunty" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_qsFmkLsd_xw/Sf1zvT_L-sI/AAAAAAAAACw/wp_nfh0o6d0/s72-c/screen-screenshot.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/05/screen-tweaks-on-ubuntu-jaunty.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04NRHo4eyp7ImA9WxVXGEw.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-350145618906457786</id><published>2009-02-16T15:26:00.008Z</published><updated>2009-02-16T21:33:15.433Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-16T21:33:15.433Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="myfaces" /><category scheme="http://www.blogger.com/atom/ns#" term="jsf" /><title>MyFaces NoSuchMethodError</title><content type="html">&lt;blockquote&gt;&lt;/blockquote&gt;java.lang.NoSuchMethodError - org.apache.myfaces.component.html.ext.HtmlDataTable.refresh(Ljavax/faces/context/FacesContext;)V&lt;br /&gt;&lt;br /&gt;This exception can be thrown by MyFaces when the page backing bean doesn't return a String that is mapped in the navigation-rules in faces-config.xml (or wherever you have your mapping file).&lt;br /&gt;&lt;br /&gt;Check for typos or a missing entry in the navigation rules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-350145618906457786?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/hy9_eWNlJVM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/350145618906457786/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/02/myfaces-nosuchmethoderror.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/350145618906457786?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/350145618906457786?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/hy9_eWNlJVM/myfaces-nosuchmethoderror.html" title="MyFaces NoSuchMethodError" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/02/myfaces-nosuchmethoderror.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UMRHw8cSp7ImA9WxVXGEw.&quot;"><id>tag:blogger.com,1999:blog-6990058277989688714.post-6052868055015581939</id><published>2009-02-16T13:52:00.011Z</published><updated>2009-02-16T21:21:25.279Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-16T21:21:25.279Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="jpa" /><title>Hibernate gotcha: in clause with positional and named query parameters</title><content type="html">Here's a gotcha that can break JPA QL queries with an IN clause when using Hibernate as the persistence provider. The problem happens when you use positional parameters rather than named parameters.&lt;br /&gt;&lt;br /&gt;Code such as the following will break with positional parameters:&lt;br /&gt;&lt;blockquote&gt;List&lt;widgetstate&gt; states = widgetService.findSomeWidgetStates();&lt;br /&gt;Query q = entityManager.createQuery("select count(w) from Widget w where w.state in (?)");&lt;br /&gt;q.setParameter(1, states);&lt;br /&gt;&lt;/widgetstate&gt;&lt;/blockquote&gt;with the error message:&lt;br /&gt;&lt;blockquote&gt;Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field example.Widget.id to....&lt;br /&gt;&lt;/blockquote&gt;But if you change to named parameters, as in:&lt;br /&gt;&lt;blockquote&gt;Query q = entityManager.createQuery("select count(w) from Widget w where w.state in (:widgetStates)");&lt;br /&gt;q.setParameter("widgetStates", states);&lt;br /&gt;&lt;/blockquote&gt;Everything just works. So it seems named parameters are worth a little extra typing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6990058277989688714-6052868055015581939?l=doookstechstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DoooksTechStuff/~4/wgQG3xnhn6w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://doookstechstuff.blogspot.com/feeds/6052868055015581939/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://doookstechstuff.blogspot.com/2009/02/hibernate-gotcha-named-query-parameters.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/6052868055015581939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6990058277989688714/posts/default/6052868055015581939?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/DoooksTechStuff/~3/wgQG3xnhn6w/hibernate-gotcha-named-query-parameters.html" title="Hibernate gotcha: in clause with positional and named query parameters" /><author><name>Dan Dukeson</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://doookstechstuff.blogspot.com/2009/02/hibernate-gotcha-named-query-parameters.html</feedburner:origLink></entry></feed>

