<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2680389767642069814</id><updated>2024-09-19T13:30:23.359+01:00</updated><category term="review"/><category term="web development"/><category term="windows"/><category term="windows7"/><category term="android java webapp war"/><category term="blogger"/><category term="cache"/><category term="cockroach"/><category term="dell"/><category term="domain"/><category term="driving"/><category term="email"/><category term="exam"/><category term="flickr"/><category term="gmail"/><category term="java"/><category term="java javac programming gwt servlet"/><category term="laptop"/><category term="mercurial"/><category term="mini"/><category term="redirection"/><category term="sanfrancisco holiday"/><category term="scjp"/><category term="scm"/><category term="security"/><category term="subversion"/><category term="tutorial"/><category term="ubuntu linux dell mini 9"/><category term="zomg"/><title type='text'>Stuart Miller</title><subtitle type='html'>Stuart Miller&#39;s personal blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.spmiller.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-9215564995807959818</id><published>2013-03-31T22:17:00.001+01:00</published><updated>2013-04-04T08:22:54.523+01:00</updated><title type='text'>Disabling the mouse whilst typing in Linux</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I don&#39;t know why this isn&#39;t turned on in every distro by now, but the magic incantation to fix the annoyance of accidentally clicking the mouse with your palms while you&#39;re typing is:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;syndaemon -d -k -i 0.5&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
The options are: run as resident (-d), ignore modifer keys (-k, so you can still ctrl-click), and wait for half a second before enabling the mouse again (-i 0.5).&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/9215564995807959818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/9215564995807959818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/9215564995807959818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/9215564995807959818'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2013/03/disabling-keyboard-whilst-typing-in.html' title='Disabling the mouse whilst typing in Linux'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-2655583444304722596</id><published>2013-01-25T11:56:00.001+00:00</published><updated>2013-01-25T11:56:22.549+00:00</updated><title type='text'>Close Shared SSH Connections Manually</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Most of the time &lt;a href=&quot;http://blogs.perl.org/users/smylers/2011/08/ssh-productivity-tips.html&quot;&gt;shared SSH connections&lt;/a&gt; are great. They speed up connecting to your frequent servers enormously.&lt;br /&gt;
&lt;br /&gt;
Occasionally though, you may need to stop it (for example, you need to create a new connection with X forwarding). To do this, use &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ssh -O stop &amp;lt;hostname&amp;gt;&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
Via &lt;a href=&quot;http://unix.stackexchange.com/questions/24005/how-to-close-kill-ssh-controlmaster-connections-manually&quot;&gt;StackOverflow&lt;/a&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/2655583444304722596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/2655583444304722596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2655583444304722596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2655583444304722596'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2013/01/close-shared-ssh-connections-manually.html' title='Close Shared SSH Connections Manually'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-2018011172388311093</id><published>2013-01-09T16:17:00.000+00:00</published><updated>2013-01-09T16:17:53.563+00:00</updated><title type='text'>Making Mistakes in Git</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;p&gt;I wanted to make a couple of changes to an &lt;a href=&quot;https://github.com/marceloverdijk/lesscss-java&quot;&gt;open source library&lt;/a&gt; that was based on GitHub. I had made a contribution to another library before, but I didn&#39;t really do it properly. This time, I was definitely going to do it right. Here&#39;s what I learnt.&lt;/p&gt;

&lt;h2&gt;
Start and End with a Branch&lt;/h2&gt;

&lt;p&gt;I thought I was being good with my &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;git branch foo, git checkout foo&lt;/span&gt; skills. While I was diligent in committing to my local branch, when I was finished I merged it into my master and pushed from there.&lt;/p&gt;

&lt;p&gt;Pro tip: &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;git push foo origin&lt;/span&gt; after you&#39;ve finished working in your branch.&lt;/p&gt;

&lt;p&gt;Doing this means you can open a shiny pull request with only your change in it.&lt;/p&gt;

&lt;h2&gt;
Creating Remote Branches from Locally Merged Branches&lt;/h2&gt;

&lt;p&gt;Firstly; give up on your local branch. Seriously -- delete it using &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;git branch -D foo&lt;/span&gt;. Also make sure you haven&#39;t got an existing remote branch (if you do, get rid of it using &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;git push origin :foo&lt;/span&gt;).&lt;/p&gt;

&lt;p&gt;Then recreate your local branch, and use the magic &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;git rebase -i HEAD~5&lt;/span&gt; (where 5 means get the last 5 commits). This opens an editor where you can delete the commits you don&#39;t want to appear in the branch.&lt;/p&gt;

&lt;p&gt;Once you&#39;ve done this, you can git push foo origin, and you&#39;ll have a beautiful remote branch all set up for a pull request.&lt;/p&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/2018011172388311093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/2018011172388311093' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2018011172388311093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2018011172388311093'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2013/01/making-mistakes-in-git.html' title='Making Mistakes in Git'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-1835228648616395158</id><published>2012-11-08T11:02:00.002+00:00</published><updated>2012-11-14T16:23:21.469+00:00</updated><title type='text'>Performance Monitoring in Solaris</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
If you&#39;re unfortunate enough to use Solaris in production, you can at least console yourself with some of the excellent performance monitoring tools the OS supports. We recently had some performance issues which we needed to diagnose on a production server -- i.e. no profiler.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
top == prstat&lt;/h4&gt;
Your first point of call for CPU monitoring is normally &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;top&lt;/span&gt;, which doesn&#39;t exist on Solaris (of course). Use &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;prstat&lt;/span&gt; instead. It&#39;s basically the same in terms of information.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Individual Java Thread Monitoring&lt;/h4&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;prstat&lt;/span&gt; has another trick -- you can use it to get an individual breakdown of the threads in your process. Use:
&lt;br /&gt;
&lt;pre&gt;prstat -mvL -p &amp;lt;processid&amp;gt;&lt;/pre&gt;
To get output like:
&lt;br /&gt;
&lt;pre style=&quot;font-size: small;&quot;&gt;   PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/LWPID 
  2108 stuart   1.7 0.0 0.0 0.0 0.0  98 0.0 0.0   5   2   5   0 java/52
  2108 stuart   0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 100   0 100   0 java/18
  2108 stuart   0.0 0.0 0.0 0.0 0.0 0.0 100 0.0  50   0  50   0 java/28
  2108 stuart   0.0 0.0 0.0 0.0 0.0 0.0 100 0.0   5   0   5   0 java/21
  2108 stuart   0.0 0.0 0.0 0.0 0.0 100 0.0 0.0   5   1   5   0 java/8
  2108 stuart   0.0 0.0 0.0 0.0 0.0 100 0.0 0.0   1   0   1   0 java/20
  2108 stuart   0.0 0.0 0.0 0.0 0.0 100 0.0 0.0   2   0   2   0 java/85
&lt;/pre&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;man prstat&lt;/span&gt; will explain what the columns mean. The individual threads are in the last column; you can get out a stack trace from them via &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;pstack&lt;/span&gt;. In this case, I could run &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;pstack 2108/52&lt;/span&gt; to see what the top thread looks like:
&lt;br /&gt;
&lt;pre style=&quot;font-size: small;&quot;&gt;-----------------  lwp# 2108 / thread# 52  --------------------
 fc829624 * *com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/DOM2DTM.nextNode()Z [compiled] 
 fc2c5bb8 * *com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/DOM2DTM.getHandleFromNode(Lorg/w3c/dom/Node;)I [compiled] +50 (line 1341)
 fca4f1b8 * *com/sun/org/apache/xml/internal/dtm/ref/dom2dtm/DOM2DTM.getHandleOfNode(Lorg/w3c/dom/Node;)I [compiled] +89 (line 1409)
 fca4f1b8 * *com/sun/org/apache/xml/internal/dtm/ref/DTMManagerDefault.getDTMHandleFromNode(Lorg/w3c/dom/Node;)I+219 (line 1135)
 fca1088c * *com/sun/org/apache/xpath/internal/XPathContext.getDTMHandleFromNode(Lorg/w3c/dom/Node;)I [compiled] +6 (line 364)&lt;/pre&gt;
&lt;br /&gt;
&lt;h4&gt;
IO Monitoring&lt;/h4&gt;
This one is easy -- run &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;iostat -xtc 1 10000&lt;/span&gt; to get refreshes every second for 10,000 seconds. All these devices report how busy they are; of particular interest is the column&amp;nbsp;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;%b&lt;/span&gt;, which will tell you how busy the disk is.
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
IO Monitoring per process&lt;/h4&gt;
As far as I can tell, this isn&#39;t possible with the built in tools. I believe you can use DTrace and&amp;nbsp;&lt;a href=&quot;http://www.brendangregg.com/DTrace/iotop&quot;&gt;iotop&lt;/a&gt;, but as I didn&#39;t have enough privileges on the machine I couldn&#39;t try it.
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/1835228648616395158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/1835228648616395158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/1835228648616395158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/1835228648616395158'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2012/11/performance-monitoring-in-solaris.html' title='Performance Monitoring in Solaris'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-7237728041356611409</id><published>2012-09-05T17:01:00.000+01:00</published><updated>2012-09-05T17:02:37.101+01:00</updated><title type='text'>GZipping vs Minification of JavaScript Resources</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
A debate that pops up every so often in the office is whether minification is worth it when you have GZip available.&lt;br /&gt;
&lt;br /&gt;
The short answer:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;GZipping is always a good idea, and better than nothing.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Minification is&amp;nbsp;always a good idea, and better than nothing.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
To find this out I looked at JQuery 1.8.1 from the&amp;nbsp;&lt;a href=&quot;https://developers.google.com/speed/libraries/devguide#jquery&quot;&gt;Google Hosted Libraries&lt;/a&gt;. The results:&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Technique&lt;/th&gt;&lt;th&gt;Size (kb)&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Original&lt;/td&gt;&lt;td&gt;256&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GZip&lt;/td&gt;&lt;td&gt;76&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Minified&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=2680389767642069814#minfootnote&quot;&gt;*&lt;/a&gt;&lt;/td&gt;&lt;td&gt;91&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Minified + GZipped&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
So — you can reduce your JS (or JQuery, at least) size by three simply by GZipping. If for some absurd reason you can&#39;t GZip then you&#39;d best at least minify, but you get the best performance by using both.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=2680389767642069814&quot; name=&quot;minfootnote&quot;&gt;*&lt;/a&gt;I&#39;m not immediately sure what tool was used for minification&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/7237728041356611409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/7237728041356611409' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/7237728041356611409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/7237728041356611409'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2012/09/gzipping-vs-minification-of-javascript.html' title='GZipping vs Minification of JavaScript Resources'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-4435509377993824208</id><published>2012-07-25T11:36:00.000+01:00</published><updated>2012-07-25T11:36:08.243+01:00</updated><title type='text'>How much space does a Java object use?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
A &lt;a href=&quot;http://dan.bodar.com/&quot;&gt;colleague&lt;/a&gt; mentioned in passing today that Java takes 128 bits to represent a 32bit integer. I couldn&#39;t believe him -- I had expected some overhead, but a ratio of 4:1? Really?&lt;br /&gt;
&lt;br /&gt;
He turned out to be right. On a 32bit JVM you need 128 bits for an integer, and for a 64bit machine, you need 224 because the class pointers double in size. Ulp.&lt;br /&gt;
&lt;br /&gt;
The increase in class pointer size means that code running in a 64bit JVM generally needs &lt;i&gt;70% more&lt;/i&gt; memory than its 32bit counterpart. There&#39;s a switch you can use on Oracle and IBM JVMs to use compressed pointers (&lt;a href=&quot;https://wikis.oracle.com/display/HotSpotInternals/CompressedOops&quot;&gt;-XX:+UseCompressedOops&lt;/a&gt;). I haven&#39;t found if there are any side effects to using this.&lt;br /&gt;
&lt;br /&gt;
Find all this information on&amp;nbsp;&lt;a href=&quot;http://www.ibm.com/developerworks/java/library/j-codetoheap/index.html&quot;&gt;From Java code to Java heap:&amp;nbsp;Understanding and optimizing your application&#39;s memory usage&lt;/a&gt;.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/4435509377993824208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/4435509377993824208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/4435509377993824208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/4435509377993824208'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2012/07/how-much-space-does-java-object-use.html' title='How much space does a Java object use?'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-5486561283010152361</id><published>2012-05-03T10:16:00.001+01:00</published><updated>2012-05-03T10:48:31.354+01:00</updated><title type='text'>Deny IFrames with X-Frame-Options</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
While researching an issue in which I was trying to prevent our login page from being displayed inside an iframe, I found a great &lt;a href=&quot;http://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-needed&quot;&gt;StackOverflow question&lt;/a&gt;. The first answer was interesting, but the second was awesome!&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Turns out you can prevent anybody using a modern browser from seeing your page in an iframe by using the &lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;X-Frame-Options&lt;/span&gt; header. Eric Lawrence details the various options &lt;a href=&quot;http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx&quot;&gt;here&lt;/a&gt;; for us the perfect version would be&amp;nbsp;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;X-Frame-Options&lt;/span&gt;&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;:SAMEORIGIN&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
I still needed the frame-busting JavaScript for our issue (the login page was showing on a session timeout) but this header is my new best friend.&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/5486561283010152361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/5486561283010152361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/5486561283010152361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/5486561283010152361'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2012/05/deny-iframes-with-x-frame-options.html' title='Deny IFrames with X-Frame-Options'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-5165685967377303716</id><published>2011-10-22T11:12:00.001+01:00</published><updated>2011-10-22T12:04:51.325+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android java webapp war"/><title type='text'>Running a webapp on Android</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
TL;DR -- it didn&#39;t work because of code generation.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Why would you want to run a webapp on your phone?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
My job is writing internally facing webapps. Recently we&#39;ve been working on a fairly large refactoring of one particular one -- gutting it out and replacing it with a different technology stack, whilst ensuring the existing pages still function ok.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We&#39;re replacing Wicket with the open-source framework &lt;a href=&quot;http://code.google.com/p/utterlyidle&quot;&gt;UtterlyIdle&lt;/a&gt;, which we&#39;re adding functionality to as we need it. Something we added was MD5 hashing of responses for&amp;nbsp;ETag headers.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
When we tested this on our production-like hardware, we were a bit upset with its performance (summary: 300ms requests for a no-content response, eventually diagnosed as network troubles). So, on the assumption that our production hardware was terrible, I decided to run the app on my phone and performance test it there.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;I-Jetty&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Luckily for me, there&#39;s a servlet container available for Android called &lt;a href=&quot;http://code.google.com/p/i-jetty/&quot;&gt;I-Jetty&lt;/a&gt;. It installed and started just fine (kudos), but it doesn&#39;t support standard war files -- it needs what it called a &lt;i&gt;downloadable webapp&lt;/i&gt;.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Downloadable War Files&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The developers of I-Jetty have documented &lt;a href=&quot;http://code.google.com/p/i-jetty/wiki/DownloadableWebapps&quot;&gt;how to convert a war file to a &lt;i&gt;downloadable webapp&lt;/i&gt;&lt;/a&gt;, but to clarify:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Extract all classes (both yours and your dependencies) into a folder. I call this the uber-jar folder.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Run &lt;a href=&quot;http://developer.android.com/guide/developing/tools/index.html&quot;&gt;dx&lt;/a&gt; over this directory. The arguments on the I-Jetty documentation seem to work ok, but boost the Xmx setting if you have problems.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;If dx doesn&#39;t run successfully (the end of the output will mention how many errors you have), you&#39;ll need to scroll up a bit to find the last actual error. Searching for &quot;unexpected top-level&quot; generally finds the exception section, as it&#39;s not always near the bottom. I also had to pass the switch &quot;--no-locals&quot; because of my dependencies.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;dx doesn&#39;t work if you have a large number of dependencies -- you end up exceeding the dalvik vm&#39;s maximum number of symbols.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;The output of dx is a .dex file; zip this up and place it in your WEB-INF/lib folder.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;If you have resources in your webapp, they must also be zipped up and placed in the WEB-INF/lib folder.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;There shouldn&#39;t be anything else in the WEB-INF/lib folder; the I-Jetty classloader only reads zip files, so it won&#39;t hurt but it will make your war file unnecessarily large.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;I had to give up on the app I was using and use a much smaller one instead. Eventually I got this into a downloadable webapp suitable for I-Jetty.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Running it&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Everything looked ok to start with; however, this app uses &lt;a href=&quot;http://cglib.sourceforge.net/&quot;&gt;cglib&lt;/a&gt; because it needs to proxy classes, not just interfaces. The first problem was java.lang.VerifyErrors -- these are a little bit opaque, as all they mean is the Dalvik VM is refusing to load a particular class. Unless you use &lt;a href=&quot;http://developer.android.com/guide/developing/tools/logcat.html&quot;&gt;logcat&lt;/a&gt;, you can&#39;t tell why.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;I did use logcat, and I found the classes were not being loaded because of NoClassDefFoundErrors -- it&#39;s easy to forget the Android API isn&#39;t a complete port of Java. So, I grabbed the missing package (java.beans) from Apache Harmony, compiled it, dx&#39;d it along with my other classes, and banished the errors.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;Apart from the ones from cglib. Cglib generates bytecode, you see, and it currently doesn&#39;t know how to generate Dalvik bytecode. Android &lt;a href=&quot;http://code.google.com/p/android/issues/detail?id=6322&quot;&gt;doesn&#39;t support&lt;/a&gt; it.&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Conclusion&lt;/span&gt;&lt;br /&gt;
You should be able to run a war file on Android (and I did) -- but if it needs cglib like mine did, you&#39;re out of luck. Oh well.&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/5165685967377303716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/5165685967377303716' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/5165685967377303716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/5165685967377303716'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2011/10/running-webapp-on-android.html' title='Running a webapp on Android'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-7412576960361972509</id><published>2010-11-17T21:17:00.003+00:00</published><updated>2010-11-17T21:30:34.688+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mercurial"/><category scheme="http://www.blogger.com/atom/ns#" term="scm"/><category scheme="http://www.blogger.com/atom/ns#" term="subversion"/><category scheme="http://www.blogger.com/atom/ns#" term="tutorial"/><title type='text'>Introduction to Mercurial</title><content type='html'>Hands up if you&#39;ve been happily using Subversion for many years when some crazy dude comes in and makes you use Mercurial. Anyone? I&#39;m sure it can&#39;t just be me.&lt;br /&gt;&lt;br /&gt;Anyway, Mercurial is very different to Subversion. I recently found out that Subversion causes brain damage in developers which makes it very difficult to understand how Mercurial works: you try to do things in Mercurial the way you do in Subversion, it doesn&#39;t work and you go &quot;ARGH&quot; and &lt;span style=&quot;font-family: courier new;&quot;&gt;rm -rf &lt;/span&gt;your repository and start again (being more careful this time).&lt;br /&gt;&lt;br /&gt;Well, &lt;span style=&quot;font-family: courier new;&quot;&gt;rm -rf&lt;/span&gt; no longer my friends. Joel Spolsky has written a &lt;a href=&quot;http://hginit.com/&quot;&gt;rather excellent introduction to Mercurial&lt;/a&gt; which I would recommend you all read if you need to use Mercurial or you&#39;re sick of merging in Subversion. I especially appreciated the first page -- Mercurial for Subversion users -- basically a pep talk telling you not to give up on Mercurial just because it&#39;s not Subversion.&lt;br /&gt;&lt;br /&gt;My take on Mercurial? As far as I can tell, its view of the world is identical to the one I end up drawing when I try to map out how I think Subversion should be working. Instead of representing your codebase as a series of snapshots in time, it represents the changes you make to it. This makes it very easy to merge different branches together, which is pretty much the most painful thing you have to do in Subversion.&lt;br /&gt;&lt;br /&gt;Joel explains it very well. Please go and read his &lt;a href=&quot;http://hginit.com/&quot;&gt;tutorial&lt;/a&gt; now, if only so you&#39;re not surprised when some crazy guy makes you use it.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/7412576960361972509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/7412576960361972509' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/7412576960361972509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/7412576960361972509'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2010/11/introduction-to-mercurial.html' title='Introduction to Mercurial'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-7129936760584961888</id><published>2010-10-11T22:21:00.004+01:00</published><updated>2010-10-11T23:04:29.607+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu linux dell mini 9"/><title type='text'>Ubuntu 10.10 Netbook Edition: Unity</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4YczPzz0pIuG-KIGJyTpDk-H0lI1lLwgiwXAE8JtuUDkUPNv_PyKOD7NhR_JmvaRBf0PwDuNEh1SPWcyMMXbm5vWoHK9AQChAonPVV2Ic-7HyIiQdDgq9Huhr5sy63lx4i4ajWrQ-BTaF/s1600/Desktop-small.png&quot;&gt;&lt;img style=&quot;float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 342px; height: 200px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4YczPzz0pIuG-KIGJyTpDk-H0lI1lLwgiwXAE8JtuUDkUPNv_PyKOD7NhR_JmvaRBf0PwDuNEh1SPWcyMMXbm5vWoHK9AQChAonPVV2Ic-7HyIiQdDgq9Huhr5sy63lx4i4ajWrQ-BTaF/s400/Desktop-small.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5526912700322658562&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;I wanted to like Unity, the new Ubuntu Netbook interface, I really did. I had seen the screenshots and the promos, and I liked the idea of a dock-like interface for launching my programs. Until I installed it.&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:large;&quot;&gt;&lt;b&gt;It&#39;s slow.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;I was trying this on a Dell Mini 9. It&#39;s not a new netbook, but it&#39;s &lt;a href=&quot;https://wiki.ubuntu.com/HardwareSupport/Machines/Netbooks#Dell%20Mini%209&quot;&gt;Tier One&lt;/a&gt; supported hardware. Ubuntu itself is quick to boot -- I looked away while it was restarting and found it had booted when I looked back. Browsing seems relatively quick. Youtube videos play without stuttering.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Yet, the Unity interface has got to be the slowest way of launching programs on my netbook. When I click them, I&#39;m never sure if I did it successfully because it takes so long to load them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Weirdly, it&#39;s worse for the built-in parts of the interface. Want to launch a program that&#39;s not in the dock? Click the Applications button, and wait while it populates the list of all your applications. Want the &#39;hub&#39; (the menu that launches when you click the Ubuntu logo)? That&#39;s not instant to launch either. Overall, it&#39;s lacking the speed I would expect from a final release.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:large;&quot;&gt;&lt;b&gt;It&#39;s inflexible&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The &#39;dock&#39; (they don&#39;t want you to call it one) is &lt;b&gt;always there&lt;/b&gt;. You can&#39;t hide it. You can&#39;t resize it. It&#39;s a permanent fixture of your screen, so you&#39;d better learn to love it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the ideas of the dock placement down the size is that it saves vertical space, which on a netbook is more precious than horizontal (more vertical space means less scrolling). Unfortunately, it also means you have less horizontal space, meaning the space available to my browser is less than the 1024 pixels most websites have come to expect. That means I permanently now have horizontal scrollbars which means: less vertical space. Urgh. How many netbooks have a screen resolution wider than 1024 pixels? Doesn&#39;t that mean that everybody will have this problem?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:large;&quot;&gt;&lt;b&gt;It&#39;s buggy&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Once you push an application into full screen (perhaps you&#39;re sick of scrolling), the dock helpfully animates itself out of the way. When you leave full screen mode though, the icons are now halfway down your dock. Why&#39;s this? Dunno. You have to drag them back up to the top if you want to see them all.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When you open an application that&#39;s not already on your dock (and you want to put it there), you&#39;re meant to be able to right click it and add it. At least, that&#39;s what happens with the built in apps, like Solitaire. But if you install Chrome or Skype and want that? Nope, it won&#39;t work. You can&#39;t drag the icon from the Applications folder, so don&#39;t be trying that either.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And when you launch an application, its title is meant to go to the top frame. In my experience, the title just disappears, leaving you with a mysterious File menu up there instead. Lucky I can tell what application is open by looking at the little arrow indicators on the dock, eh?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-size:large;&quot;&gt;In Summary&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Unity is not ready for the prime time -- at least not on my Dell Mini. The version of Ubuntu that came with it worked fine, albeit anciently. The latest version also ran acceptably, although it chewed the battery like nothing else. The netbook version of 10.10? Well, it&#39;s barely usable. It lasted one evening before I wiped it off.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/7129936760584961888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/7129936760584961888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/7129936760584961888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/7129936760584961888'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2010/10/ubuntu-1010-netbook-edition-unity.html' title='Ubuntu 10.10 Netbook Edition: Unity'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4YczPzz0pIuG-KIGJyTpDk-H0lI1lLwgiwXAE8JtuUDkUPNv_PyKOD7NhR_JmvaRBf0PwDuNEh1SPWcyMMXbm5vWoHK9AQChAonPVV2Ic-7HyIiQdDgq9Huhr5sy63lx4i4ajWrQ-BTaF/s72-c/Desktop-small.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-995729256928147400</id><published>2010-09-22T14:07:00.003+01:00</published><updated>2010-09-22T15:24:00.934+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java javac programming gwt servlet"/><title type='text'>On the Oddness of javac</title><content type='html'>At work recently, we had a strange problem: one of our jars was not being loaded in Tomcat. Some closer investigation revealed the all too familiar error message instructing us to &lt;em&gt;See Servlet Spec 2.3, section 9.7.2&lt;/em&gt;. Normally I see this when the servlet api jar makes its way into &lt;tt&gt;lib&lt;/tt&gt; directory by mistake (usually a poorly configured &lt;tt&gt;pom.xml&lt;/tt&gt; file). However, this was in one of our jars -- and we certainly don&#39;t check in the servlet api in our codebase. What gives?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;It&#39;s always Maven&#39;s fault, right?&lt;/h2&gt;&lt;br /&gt;Well, usually it is. First of all, we (rather densely) configured Maven to realise the servlet api was a provided library. About two seconds of thought showed this wasn&#39;t the problem -- the servlet classes must have been actually &lt;em&gt;in&lt;/em&gt; our jar file.&lt;br /&gt;&lt;br /&gt;We knew they weren&#39;t checked in, so we whacked Maven into verbose mode (&lt;tt&gt;mvn -X&lt;/tt&gt; for those of you playing at home) and scanned the output, line by line. No clues there. At this point my coworker began pushing for a manual compile using &lt;tt&gt;javac&lt;/tt&gt;, and after about an hour of me saying &quot;no, it can&#39;t possibly be javac&quot; but not being able to find the problem, I relented. (The verbose output proved helpful to get the classpath out, even if Maven doesn&#39;t print it out in the standard format.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Et tu, javac?&lt;/h2&gt;&lt;br /&gt;We did a manual compile, and I was gobsmacked when the servlet files were in the resulting output directory. &lt;tt&gt;javac&lt;/tt&gt;, which I had considered a close personal friend (except when it exhibited &lt;a href=&quot;http://bugs.sun.com/view_bug.do?bug_id=6199662&quot;&gt;this bug&lt;/a&gt;), was the culprit. There must have been a reasonable explanation, and I was out to find it.&lt;br /&gt;&lt;br /&gt;I headed to the &lt;a href=&quot;http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html&quot;&gt;javac documentation page&lt;/a&gt;, and it didn&#39;t take too long to find this part:&lt;br /&gt;&lt;blockquote&gt;Note: Classes found through the classpath may be subject to automatic recompilation if their sources are also found.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What?!&lt;/b&gt; Lemme get this straight: if there are java source files in the classpath, they can be compiled and placed into the output directory? Alas, it is true. This meant that somewhere, we had the servlet source code in our classpath, and that it was newer than the regular servlet api.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;GWT: Gee, What Twits&lt;/h2&gt;&lt;br /&gt;Some spectacularly 1337 searching found that GWT distributes the servlet api and sources inside its jars (note that we were using version 1.7.1. Maybe it&#39;s fixed now?)&lt;br /&gt;&lt;br /&gt;Including somebody else&#39;s library inside yours is a really bad idea. Sure, it&#39;s convenient -- junit distributes hamcrest matchers -- but unless you also provide a version that &lt;em&gt;doesn&#39;t&lt;/em&gt; include them (like &lt;tt&gt;junit-dep&lt;/tt&gt;), your users are in for a world of hurt. If they need a different version of the library from the one you&#39;re distributing, well, they&#39;ll have to rely on the magic of the classpath to find the one they want before they find yours (and good luck with that if you&#39;re using Tomcat, which doesn&#39;t define the jar order when it loads jar files).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Lessons&lt;/h2&gt;&lt;br /&gt;Here are the lessons I learnt that day:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;tt&gt;javac&lt;/tt&gt; has some interesting features that you might not come across on a day to day basis.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GWT is evil.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;In the end, we hacked the build file to exclude anything in the &lt;tt&gt;javax&lt;/tt&gt; directory from being jar&#39;ed up. That solved the problem, and I went home to take a long shower.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Footnote&lt;/h3&gt;&lt;br /&gt;Why didn&#39;t we &lt;a href=&quot;http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html#implicit&quot;&gt;RTFM&lt;/a&gt; and use &lt;tt&gt;javac -implicit:none&lt;/tt&gt;? Cos we were using Java 1.5, that&#39;s why.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/995729256928147400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/995729256928147400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/995729256928147400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/995729256928147400'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2010/09/on-oddness-of-javac.html' title='On the Oddness of javac'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-206877080955807421</id><published>2009-11-19T22:43:00.003+00:00</published><updated>2009-11-19T22:50:14.852+00:00</updated><title type='text'>Signs your recommendations could use some work</title><content type='html'>Facebook likes to recommend friends for you, and recently it started recommending actions as well. Quite often it&#39;s recommending I poke someone, but yesterday I got this:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/wahooie_stuie/4116111846/&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 103px;&quot; src=&quot;http://farm3.static.flickr.com/2456/4116111846_3215849646_o.png&quot; border=&quot;0&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A recommendation for Facebook: you probably don&#39;t need to remind people to catch up with their partner.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/206877080955807421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/206877080955807421' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/206877080955807421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/206877080955807421'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/11/signs-your-recommendations-could-use.html' title='Signs your recommendations could use some work'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-2074266332548044591</id><published>2009-11-01T13:10:00.002+00:00</published><updated>2009-11-01T13:28:03.852+00:00</updated><title type='text'>Log4J Null Pointers</title><content type='html'>Sometimes you may get a strange error message in your logs coming from Log4J. Depending on what version you&#39;re using, you may get odd messages like &lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you&#39;re using an older version, you may get a NullPointerException somewhere in the Log4J bowels.&lt;br /&gt;&lt;br /&gt;So what&#39;s happening? Basically, it&#39;s Tomcat being helpful. When you redeploy a webapp to Tomcat (perhaps by using Eclipse in debug mode, or by using the Manager webapp), Tomcat goes and clears out any static fields by setting them to null before reloading. This helps to prevents memory leaks in your webapp.&lt;br /&gt;&lt;br /&gt;However, the order in which it does this can&#39;t be specified, and if it happens to Log4J before it does another class which uses Log4J somewhere, you can run into the situation where Log4J is essentially broken but other classes are still trying to use it. This can happen on a shutdown hook, but more commonly it&#39;ll happen because Tomcat has to use reflection to find out about fields. The associated bug for this issue has &lt;a href=&quot;https://issues.apache.org/bugzilla/show_bug.cgi?id=43867#c58&quot;&gt;more information&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, what can you do about it? It&#39;s actually quite easy to solve: ensure your Log4J jars aren&#39;t in your webapp&#39;s lib folder -- you could either move them to tomcat/shared/lib, or if you want Tomcat to use Log4J too, move them into tomcat/common/lib. If you&#39;re using commons-logging, move that in there too.&lt;br /&gt;&lt;br /&gt;The issue is supposedly resolved (ie you could put Log4J in along with your webapp) with Tomcat 5.5.25+ and Log4J 1.2.15+, but I could still reproduce it with 5.5.27 and 1.2.15. I&#39;d recommend you move them into tomcat/common/lib, if only because then you can control Tomcat&#39;s logging with Log4j.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;NOTE&lt;/span&gt;: when you move the jar files, you&#39;ll also have to move your log4j.properties or log4j.xml. This has the (possibly welcome) side effect of having one central configuration file, rather than one per webapp.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/2074266332548044591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/2074266332548044591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2074266332548044591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2074266332548044591'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/11/log4j-null-pointers.html' title='Log4J Null Pointers'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-1787126512053688701</id><published>2009-10-05T21:20:00.007+01:00</published><updated>2009-10-05T21:43:19.512+01:00</updated><title type='text'>On the Importance of Scope</title><content type='html'>&lt;style&gt; .code { font-family:courier new; white-space:pre;} &lt;/style&gt;&lt;br /&gt;Those of you who know me may think I&#39;m going to harp on about JavaScript again. No, this time it&#39;s about Spring.&lt;br /&gt;&lt;br /&gt;Spring is good for wiring up your beans with any services it may need. You do this in XML traditionally, by declaring beans:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;code&quot;&gt;&lt;br /&gt;&amp;lt;bean id=&quot;lieschke&quot;&amp;gt;&lt;br /&gt; &amp;lt;property name=&quot;doc&quot; value=&quot;true&quot;&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;You can then use this bean inside other beans:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;code&quot;&gt;&lt;br /&gt;&amp;lt;bean id=&quot;webArchitecting&quot;&amp;gt;&lt;br /&gt; &amp;lt;property name=&quot;architect&quot; ref=&quot;lieschke&quot;&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The problem is that with this bean declaration is that Spring, by default, will only make one instance of the &lt;span style=&quot;font-family:courier new;&quot;&gt;lieschke&lt;/span&gt; bean. This is a problem if you need your bean to not be a singleton; perhaps if you give it a database connection which you wouldn&#39;t want it to hang onto for a long time.&lt;br /&gt;&lt;br /&gt;The solution is the &lt;a href=&quot;http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes&quot;&gt;&lt;span style=&quot;font-family:courier new;&quot;&gt;scope&lt;/span&gt; property&lt;/a&gt;. Using this property, we can say that we want a new instance every time:&lt;br /&gt;&lt;div class=&quot;code&quot;&gt;&lt;br /&gt;&amp;lt;bean id=&quot;lieschke&quot; &lt;span style=&quot;font-weight:bold;&quot;&gt;scope=&quot;prototype&quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;property name=&quot;doc&quot; value=&quot;true&quot;&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;All very easy and all, but why isn&#39;t it this by default?</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/1787126512053688701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/1787126512053688701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/1787126512053688701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/1787126512053688701'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/10/on-importance-of-scope.html' title='On the Importance of Scope'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-8217286964807602548</id><published>2009-09-26T13:20:00.003+01:00</published><updated>2009-09-26T13:27:10.917+01:00</updated><title type='text'>Jonathan Coulton Playing London in November</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Jonathan_Coulton&quot;&gt;Jonathan Coulton&lt;/a&gt;, everybody&#39;s favourite &lt;a href=&quot;https://www.popsci.com/category/tags/jonathan-coulton&quot;&gt;troubadour&lt;/a&gt;, is playing London on &lt;a href=&quot;http://www.jonathancoulton.com/2009/11/13/london-111309/&quot;&gt;13 Movember&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I&#39;ve booked my tickets, but if you want some you&#39;d better get them soon -- there are 24 available today, but there were 49 this time yesterday!</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/8217286964807602548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/8217286964807602548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/8217286964807602548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/8217286964807602548'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/09/jonathan-coulton-playing-london-in.html' title='Jonathan Coulton Playing London in November'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-6165258123299567140</id><published>2009-08-12T21:43:00.001+01:00</published><updated>2009-08-12T21:43:50.726+01:00</updated><title type='text'>Alan! Alan! Al! Al!</title><content type='html'>&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/HzypOnklG60&amp;hl=en&amp;fs=1&amp;&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/HzypOnklG60&amp;hl=en&amp;fs=1&amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/6165258123299567140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/6165258123299567140' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/6165258123299567140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/6165258123299567140'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/08/alan-alan-al-al.html' title='Alan! Alan! Al! Al!'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-6440390419100524657</id><published>2009-07-04T10:08:00.000+01:00</published><updated>2009-07-04T10:08:28.392+01:00</updated><title type='text'>Profiling in Eclipse</title><content type='html'>Recently I had to analyse some code I&#39;d written to work out why it was running so slowly. And it was running pig-in-the-mud slowly too, not just little-old-lady-going-shopping slowly. This thing was almost going backwards.&lt;br /&gt;&lt;br /&gt;So I decided to bust out the profiler. It&#39;s my fervent belief that you shouldn&#39;t optimise code just because you think something might be slow; you have to &lt;span style=&quot;font-style:italic;&quot;&gt;know&lt;/span&gt; that it&#39;s slow. This is what a profiler excels at, and it sure beats System.out.println.&lt;br /&gt;&lt;br /&gt;I&#39;d previously had some exposure to &lt;a href=&quot;http://www.ej-technologies.com/products/jprofiler/overview.html&quot;&gt;JProfiler&lt;/a&gt;, which is excellent. Unfortunately though, it has a non-zero pricetag, which is often a barrier. I instead decided to investigate Eclipse&#39;s profiling solution.&lt;br /&gt;&lt;br /&gt;The official one seems to be the &lt;a href=&quot;http://www.eclipse.org/tptp/&quot;&gt;Eclipse Test and Performance Tools Platform Project&lt;/a&gt; (there are others, but this one is officially hosted). This is also not a solution, because it is awful. It ran out of memory when I naively ran it with the default settings, and still ran out as I filtered the settings back to only profiling a few particular classes. In the end, the only way I could get it to work was to pare it back to only a handful of classes, which wasn&#39;t very useful.&lt;br /&gt;&lt;br /&gt;The best solution out there is actually in NetBeans. If you hate the IDE, don&#39;t worry, you don&#39;t have to use it. Under the profiling menu, there is a command to attach to a remote process. Just fire your process up with the correct arguments -- NetBeans gives you these -- and your app will obediently wait until the profiler is started. Then you get profiling goodness in NetBeans (which works with the default settings), and the luxury of Eclipse. It&#39;s pretty much the best of both worlds, and unlike JProfiler it&#39;s free. Give it a try.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/6440390419100524657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/6440390419100524657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/6440390419100524657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/6440390419100524657'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/06/profiling-in-eclipse.html' title='Profiling in Eclipse'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-8329564288340919750</id><published>2009-06-30T22:07:00.000+01:00</published><updated>2009-06-30T22:07:54.285+01:00</updated><title type='text'>Standards</title><content type='html'>I&#39;m somewhat of a mobile network junkie. I&#39;m on my third one now, and this is only my fourth month in the UK. This last move is due to a unfortunate situation where we had to take out another contract to get a stolen phone replaced, but that&#39;s another story.&lt;br /&gt;&lt;br /&gt;I could never have done this back in NZ. Aside from the fact that there were only two networks when I left, they were both completely incompatible with each other. So, if I wanted to jump ship, I had to get a whole new phone.&lt;br /&gt;&lt;br /&gt;In the UK, all the networks use GSM or one of its successors. This means that as long as I&#39;m not tied into a lengthy contract, I can flit around them and choose whoever has the best deal. And there are plenty of deals out there; you can pay £10 and get a rolling contract that will give you 100 mins and 300 texts (you can get slightly more of one and slightly less of the other depending on which network you choose).&lt;br /&gt;&lt;br /&gt;I can&#39;t help but wonder what the mobile situation would have been like in NZ if the networks were compatible with each other. A rumour I&#39;ve heard was that when Telecom NZ were setting up their network, the government of the time forced them to use CDMA because they thought it would be better for consumers if there was more competition -- ie if they used a different technology to BellSouth&#39;s GSM.&lt;br /&gt;&lt;br /&gt;Unfortunately, that reasoning has been shown to be wrong. The most competition occurs when there is a level playing field, as players &lt;span style=&quot;font-style:italic;&quot;&gt;must&lt;/span&gt; differentiate themselves on other grounds. This is actually a better situation for companies; they are flexible, innovative, and up for a challenge. If consumers don&#39;t like what they get from you, they can always jump to a competitor.&lt;br /&gt;&lt;br /&gt;What I&#39;d like you to remember is that standards, and a homogeneous culture, is a very good thing for consumers. It lowers the barrier of entry for you, the producer, and for you, the consumer. The World Wide Web is another pertinent example; it&#39;s difficult to see how it could have taken off if everyone wasn&#39;t speaking HTTP and HTML, and if consumers couldn&#39;t easily switch between browsers.&lt;br /&gt;&lt;br /&gt;There are risks; some people like to complain about the Microsoft culture: in particular, how having a massive install base of Windows is harmful as it is easier to attack. Companies may also see locking consumers into their own proprietary technology is an advantage. While these are both true to some extent, I would argue that the benefits of standards outweigh these. Please use standards. They&#39;re &lt;span style=&quot;font-style:italic;&quot;&gt;good&lt;/span&gt; for you!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS Some of you may be thinking &quot;why, CDMA is a standard just like GSM&quot;. This is true; but perhaps GSM was just a little more standard than CDMA :)</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/8329564288340919750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/8329564288340919750' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/8329564288340919750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/8329564288340919750'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/06/standards.html' title='Standards'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-1280093842892973792</id><published>2009-06-20T11:12:00.003+01:00</published><updated>2009-06-20T21:52:55.516+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web development"/><title type='text'>What is a Browser?</title><content type='html'>When you work in technology, it&#39;s sometimes hard to remember that most people don&#39;t speak the same language as you. This is a good reminder of what regular people think a browser is.&lt;br /&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/o4MwTvtyrUQ&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/o4MwTvtyrUQ&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; allowScriptAccess=&quot;always&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Via &lt;a href=&quot;http://www.geekzone.co.nz/freitasm/6580&quot;&gt;Mauricio Freitas&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/1280093842892973792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/1280093842892973792' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/1280093842892973792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/1280093842892973792'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/06/what-is-browser.html' title='What is a Browser?'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-6158265651469356056</id><published>2009-05-03T19:25:00.000+01:00</published><updated>2009-05-03T19:25:17.839+01:00</updated><title type='text'>On SSDs and battery life</title><content type='html'>Some time ago, the gadget websites posted a link to some &lt;a href=&quot;http://netbookreview.darrenyates.com.au/?p=329&quot;&gt;empirical testing of netbook batteries&lt;/a&gt;. The observant reader will note that my netbook, the Dell Mini 9, fits in about halfway down the list. What&#39;s interesting about these results is that the Mini has the &lt;span style=&quot;font-weight: bold;&quot;&gt;smallest&lt;/span&gt; battery capacity of all the netbooks on the list.&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://uk.asus.com/products.aspx?l1=24&amp;amp;l2=164&amp;amp;l3=0&amp;amp;l4=0&amp;amp;model=2303&amp;amp;modelmenu=2&quot;&gt;Asus 1000H&lt;/a&gt; has double the battery capacity of the Mini, but it also has a regular hard disk. It only gets an extra 20 minutes or so of battery life (the other specifications are mostly the same as the Mini).&lt;br /&gt;&lt;br /&gt;From this I think we can conclude that solid state drives are more power efficient than their regular counterparts in laptops. This was a common belief before an article in &lt;a href=&quot;http://hardware.slashdot.org/article.pl?sid=08/07/02/134256&quot;&gt;Tom&#39;s Hardware&lt;/a&gt; claimed they weren&#39;t; if we believe the results in this test, which might be a little bit more indicative of real use, rather than the tests used by Tom et al.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/6158265651469356056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/6158265651469356056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/6158265651469356056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/6158265651469356056'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/04/on-ssds-and-battery-life.html' title='On SSDs and battery life'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-209594237478064059</id><published>2009-04-30T20:38:00.000+01:00</published><updated>2009-06-20T21:52:55.516+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web development"/><title type='text'>Late to the Party: Google App Engine</title><content type='html'>One thing I always meant to try out was the Google App Engine. Now that I have a bit of time on my hands, I thought it would be an excellent time to give it a go.&lt;br /&gt;&lt;br /&gt;If you&#39;re not familiar with GAE, it launched quite a while ago with solely Python support. Recently they added experimental Java support, with mixed feelings from &lt;a href=&quot;http://blogs.sun.com/webmink/entry/java_needs_a_cloud_profile&quot;&gt;Simon Phipps&lt;/a&gt;. I wasn&#39;t interested in the Java support -- I wanted the Python!&lt;br /&gt;&lt;br /&gt;For a simple test case I wrote a twitter spammer -- it will ping my twitter account every time I write a new blog post. This will hopefully encourage traffic to my blog, and will hopefully be complex enough to let me try out all the main features of GAE.&lt;br /&gt;&lt;br /&gt;One of the things I enjoyed most was the persistence model. Instead of having to define a database structure to accompany your objects, you just define your object with appropriate database strings. Your object is magically persisted when you go object.put().&lt;br /&gt;&lt;br /&gt;Another thing I enjoyed was the templating. While the example starts you off by manually writing data out into the response, it&#39;s fairly easy to start using a template, and not that much more complex to start automatically creating things like forms.&lt;br /&gt;&lt;br /&gt;The thing is though that these features are both provided by Django (well, the persistence model is more inspired by it). Given that the two main features I like aren&#39;t really features of GAE, what does it have going for it?&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;It&#39;s free&lt;/font&gt;&lt;br /&gt;The most compelling reason to use GAE is that it&#39;s free and always available. Instead of having to pay for hosting for your Python (or Java) app, you get to run it on Google&#39;s hardware (until your app becomes too popular, when you&#39;ll have to start paying).&lt;br /&gt;&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;It has elegant cron&lt;/font&gt;&lt;br /&gt;Cron jobs aren&#39;t really that difficult to set up in Unix, but Google&#39;s implementation is particularly elegant. You define a URL to hit, and then specify your cron pattern. I really like how they used a regular URL to implement this rather than making you define a script you want to run -- it&#39;s simple, and it works.&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;br /&gt;It&#39;s Google&lt;/font&gt;&lt;br /&gt;Not much of a reason, I know, but while I had heard of Django I never got around to using it. GAE got me to use something I had wanted to play with not by virtue of the technology, but by its brandname. Who knows what else I&#39;ll come across in the course of developing my app that I wouldn&#39;t normally.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If you haven&#39;t had a chance to give it a whirl, I&#39;d recommend you give it a try. Let me know what you think of the Java support.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/209594237478064059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/209594237478064059' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/209594237478064059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/209594237478064059'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/04/late-to-party-google-app-engine.html' title='Late to the Party: Google App Engine'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-3732221188267523991</id><published>2009-04-25T10:15:00.005+01:00</published><updated>2009-04-27T14:41:10.232+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="flickr"/><category scheme="http://www.blogger.com/atom/ns#" term="review"/><title type='text'>Face Recognition in Flickr</title><content type='html'>It is a truth universally acknowledged that &lt;a href=&quot;http://www.flickr.com/services/api/&quot;&gt;Flickr&lt;/a&gt; has a load of APIs. Recently, a website named &lt;a href=&quot;http://polarrose.com/&quot;&gt;Polar Rose&lt;/a&gt; has &lt;a href=&quot;http://news.cnet.com/8301-17939_109-10224607-2.html?tag=mncol&quot;&gt;emerged&lt;/a&gt;, which offers to run face recognition over your Flickr photos.&lt;br /&gt;&lt;br /&gt;Note that I&#39;m not calling it face &lt;span style=&quot;font-style: italic;&quot;&gt;detection&lt;/span&gt;, which is merely being able to find a face, but face &lt;span style=&quot;font-style: italic;&quot;&gt;recognition&lt;/span&gt; -- it should be able to know who the face is. This is quite a tough problem: I remember coding face detection at University wasn&#39;t that easy.&lt;br /&gt;&lt;br /&gt;So, I added my photos and gave it a go. There&#39;s a processing time delay as it sucks everything out of Flickr (they estimated 30 mins for my 700 odd photos). After it&#39;s done, you get to start naming people: it pops up a face, asking who it is. When you tell it, it shows you similar faces and asks if these are also the same person.&lt;br /&gt;&lt;br /&gt;My experience started smoothly. The first picture it chose was one of me, wearing sunglasses. Adding my name was easy enough, but then the subsequent pictures were all of my girlfriend, also wearing sunglasses. Not a good start overall.&lt;br /&gt;&lt;br /&gt;As I kept tagging faces, I was generally impressed by the face detection. It seemed to be picking &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmLciMz3JRIayB-vL7n9UW4Yw-AWOJj1WKflI7fAHSY2GnBY7LLdlZZUS4_FPipPPTwHbC7WMuQE0MC8z7Y-T_R2tVM8Y1Yi9VbRSaWOKmh3rISeSSn9CKg-P1FYm-1rREUi_A4NRNSI55/s1600-h/Meerkat.png&quot;&gt;most faces&lt;/a&gt;, even partly obscured ones. I was less enamoured by the recognition, which seemed to find at most maybe two other photos of the same person.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtUj_1s2K81xUmkOfzawxH8YV6JHy3DHTt8-V2FLvewk4Lw-qsSgNES99Q_JG6KjKWa3zw1CG4RtyI40Bb1SMyHsworwfh8wVVgceFTPTFPwhwVEWY4bHewyzEIh4CCKYrREsBT37SMtdF/s1600-h/Clouds.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 117px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtUj_1s2K81xUmkOfzawxH8YV6JHy3DHTt8-V2FLvewk4Lw-qsSgNES99Q_JG6KjKWa3zw1CG4RtyI40Bb1SMyHsworwfh8wVVgceFTPTFPwhwVEWY4bHewyzEIh4CCKYrREsBT37SMtdF/s200/Clouds.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5328569299665323298&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Eventually though, it all got a bit silly. It kept asking me to identify people I had already said I didn&#39;t want to, and started showing faces that weren&#39;t even faces. I suggest the threshold for what is considered a face might need to be adjusted a bit higher, as by the end I was getting almost an even ratio between faces and non-faces.&lt;br /&gt;&lt;br /&gt;Although I read it would tag my original Flickr photos with the names of the people I&#39;d chosen, I checked the originals and couldn&#39;t see any. While I can understand this -- if you can browse pictures of people through tags on Flickr, why would you use Polar Rose -- it&#39;s a little bit sad in this era of openness.&lt;br /&gt;&lt;br /&gt;Overall, I&#39;d recommend Polar Rose as an entertaining way to spend a rainy afternoon. I don&#39;t think I&#39;ll be coming back frequently though; the face recognition gimmick quickly wears thin, and its accuracy deteriorates quite rapidly.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Update:&lt;/span&gt; if I was friends with William Shatner, I&#39;d be in &lt;a href=&quot;http://gizmodo.com/5228470/carnegie-mellon-demos-the-power-of-facial-recognition-using-star-trek-tos&quot;&gt;more luck&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/3732221188267523991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/3732221188267523991' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/3732221188267523991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/3732221188267523991'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/04/face-recognition-in-flickr.html' title='Face Recognition in Flickr'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtUj_1s2K81xUmkOfzawxH8YV6JHy3DHTt8-V2FLvewk4Lw-qsSgNES99Q_JG6KjKWa3zw1CG4RtyI40Bb1SMyHsworwfh8wVVgceFTPTFPwhwVEWY4bHewyzEIh4CCKYrREsBT37SMtdF/s72-c/Clouds.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-8267857225453069010</id><published>2009-04-02T15:06:00.003+01:00</published><updated>2009-04-02T15:35:37.310+01:00</updated><title type='text'>A Keyboard Conundrum</title><content type='html'>One thing you very quickly notice about life in the UK is the difference in keyboards. Although I&#39;ve been here for over a month now, I still don&#39;t remember that the @ symbol is down by the semicolon instead of up above 2 (that&#39;s where you&#39;ll find the double quotation mark).&lt;br /&gt;&lt;br /&gt;The other change I notice is that the # symbol has its own dedicated key instead of being above 3, which is where the £ hangs out (which is fairly amusing if you think about how our American friends refer to # as &quot;pound&quot;). This is obviously sensible, though I do wonder why they simply didn&#39;t replace $ with £ and move the former to be a secondary key, like the Euro symbol.&lt;br /&gt;&lt;br /&gt;But I really don&#39;t understand the logic behind @ and &quot;. My usual answerer of tricky questions, &lt;a href=&quot;http://wikipedia.org&quot;&gt;Wikipedia&lt;/a&gt;, is exceedingly knowledgeable about the &lt;a href=&quot;http://en.wikipedia.org/wiki/British_and_American_keyboards&quot;&gt;differences&lt;/a&gt; between the British keyboard and what I would call &#39;the normal one&#39;, but is surprisingly quiet about the reasons behind the key-switcheroo.&lt;br /&gt;&lt;br /&gt;I suspect this will remain a mystery unless I decide to fork out £32 for a copy of BS 4822, but I would love it if somebody out there could tell me &lt;span style=&quot;font-style: italic;&quot;&gt;why the @ symbol is in a different place on the British keyboard?&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/8267857225453069010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/8267857225453069010' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/8267857225453069010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/8267857225453069010'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/04/keyboard-conundrum.html' title='A Keyboard Conundrum'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-3964208556989666578</id><published>2009-03-23T10:43:00.005+00:00</published><updated>2009-03-23T14:56:00.113+00:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dell"/><category scheme="http://www.blogger.com/atom/ns#" term="laptop"/><category scheme="http://www.blogger.com/atom/ns#" term="mini"/><category scheme="http://www.blogger.com/atom/ns#" term="review"/><title type='text'>Dell Mini 9 Quick Review</title><content type='html'>When Leah and I arrived in the UK, we didn&#39;t have a laptop. This made it quite hard to apply for jobs, so one of the first things we did was order one.&lt;br /&gt;&lt;br /&gt;Our requirements were fairly simple. I didn&#39;t want to get a full-blown beast with Vista etc because Windows 7 is just around the corner, and Vista is sometimes painful to use (the observant reader will recall I have had a &lt;a href=&quot;http://blog.spmiller.net/2009/01/windows-7-just-what-microsoft-needs.html&quot;&gt;good experience&lt;/a&gt; with Windows 7). I also didn&#39;t want a desktop because we&#39;re not planning to be too settled over here, and we don&#39;t want to have to lug it around.&lt;br /&gt;&lt;br /&gt;That pretty much left netbooks, and it just so happened that Dell had a special on. We bought the model with an 8GB SSD and 1GB RAM with Ubuntu for £189, which was £70 off. It took its &lt;a href=&quot;http://twitter.com/wahooie_stuie/status/1337471013&quot;&gt;sweet time&lt;/a&gt; arriving, but eventually a shiny new Dell Mini arrived in the mail. You can check out the &lt;a href=&quot;http://www.flickr.com/photos/wahooie_stuie/sets/72157615585453979/&quot;&gt;unboxing pics&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The first thing you notice about the Mini is not the size -- you expect it to be small. The first thing you notice is that it&#39;s completely silent. It doesn&#39;t have any fans, and the silence is lovely.&lt;br /&gt;&lt;br /&gt;After using it for a while, the next thing you notice is how cramped the keyboard is. The keys on it are really close together, and while the alphabet characters are ok, the punctuation keys really suffer. The apostrophe key is right next to enter, and when I go for it I often get enter instead. This makes me look really stupid on Skype. The 10&quot; model probably won&#39;t suffer from such problems (the &lt;a href=&quot;http://en.wikipedia.org/wiki/HP_Mini_1000&quot;&gt;HP Mini&lt;/a&gt; has a keyboard that&#39;s 92% the size of a normal one), and eventually you do get used to it. It means though that when you use a regular sized keyboard it feels giant.&lt;br /&gt;&lt;br /&gt;The Mini comes with a Dell custom launcher that gives you easy access to common apps. I turned it off fairly quickly; there was plenty of razzle dazzle in it, and it looks ok, but I&#39;m quite happy with the default layout. I might turn it on again once I&#39;ve finished exploring and I know which apps I normally use.&lt;br /&gt;&lt;br /&gt;The battery life is meant to be pretty phenomenal; Ubuntu is estimating I have 4h of battery time remaining on a full charge. I&#39;m using the wireless connection, but just surfing the web (no video or anything). So far it looks accurate.&lt;br /&gt;&lt;br /&gt;The one really annoying thing was the trackpad. It has tap to click enabled by default, and if you don&#39;t know the magic to disable it after you press a key, you end up accidentally clicking when you go for the space bar. You can &lt;a href=&quot;http://www.quicktweaks.com/2008/04/08/disable-accidental-touchpad-tapping-while-typing/&quot;&gt;disable tap to click temporarily&lt;/a&gt; by using &lt;a href=&quot;http://www.quicktweaks.com/2008/04/08/disable-accidental-touchpad-tapping-while-typing/&quot;&gt;syndaemon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other than that, there&#39;s nothing really wrong with this netbook. It supposedly comes with a slot for a SIM card, so I&#39;m going to pop the battery out and check if mine has one. If it does -- internet anywhere, baby!</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/3964208556989666578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/3964208556989666578' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/3964208556989666578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/3964208556989666578'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/03/dell-mini-9-quick-review.html' title='Dell Mini 9 Quick Review'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2680389767642069814.post-2796390290453513185</id><published>2009-02-27T09:57:00.002+00:00</published><updated>2009-02-27T09:59:38.058+00:00</updated><title type='text'>Not Dead</title><content type='html'>Just a quick note -- I know I haven&#39;t posted for a while, but it&#39;s not because I&#39;ve been hit by a no. 74 bus. I&#39;ve just moved from Auckland to London (via a one week holiday in San Francisco).&lt;br /&gt;&lt;br /&gt;Leah and I have started a travelling blog to update everybody -- this is also suffering from some neglect as we&#39;re using the internet at the library -- but the address is &lt;a href=&quot;http://leahandstuart.spmiller.net/&quot;&gt;http://leahandstuart.spmiller.net&lt;/a&gt;. We&#39;ll update it when we can.</content><link rel='replies' type='application/atom+xml' href='http://blog.spmiller.net/feeds/2796390290453513185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/2680389767642069814/2796390290453513185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2796390290453513185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2680389767642069814/posts/default/2796390290453513185'/><link rel='alternate' type='text/html' href='http://blog.spmiller.net/2009/02/not-dead.html' title='Not Dead'/><author><name>Stuart</name><uri>http://www.blogger.com/profile/01616888914971179940</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>