<?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: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-10896564</id><updated>2011-07-29T08:24:36.292+02:00</updated><category term='test'/><category term='tdd'/><category term='java'/><category term='english'/><category term='softwarecraftmanship'/><category term='citerus'/><category term='security'/><title type='text'>Ingenious Life</title><subtitle type='html'>Strength through relaxation.&lt;br&gt;
Software development done right.&lt;br&gt;
Information security without too much paranoia.&lt;br&gt;
&lt;br&gt;
It's all about enjoying an ingenious life.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10896564.post-212674345684684478</id><published>2009-09-22T23:23:00.000+02:00</published><updated>2009-09-22T23:23:44.916+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citerus'/><category scheme='http://www.blogger.com/atom/ns#' term='softwarecraftmanship'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Is Technical Debt still a mess?</title><content type='html'>Robert Martin just published &lt;a&gt;a note on Technical Debt&lt;/a&gt;, and his definitions leaves me a bit confused. Uncle Bob describes Technical Debt as the result of a conscious business decision.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;As a simple example, your initial website design may need to be frames based because you don’t have time to build an Ajax framework.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I usually use the term to describe the result of developers (more or less conscious) decisions to deliver features that are not really done. When a team is delivering features lacking automated tests, proper refactoring, documentation, or whatever is (or should be) incorporated in their Definition of Done, a debt occurs, because these features though formally delivered still require more work. Perhaps they are hoping that there soon will be more time to go back and actually finish them, something less likely to happen as the code gets messier, or perhaps it is unintentionally by lack of required skills. Either way, the debt is in their code and is collecting interest until dealt with.&lt;br /&gt;&lt;br /&gt;If the term Techical Debt is being reserved for decisions to design systems using last year's 1.0 technology instead of a brand new 2.0(RC1) solution, then I need a new name for that other kind of debt. Creative phrases like &lt;i&gt;Deficit Programming&lt;/i&gt; or &lt;i&gt;Ignorance Tax&lt;/i&gt; comes to mind, but they have a quite elitist and harsh ring to them, and seem less useful as metaphors when discussing causes and consequences of messy code with managers.&lt;br /&gt;&lt;br /&gt;Is it time to reclaim (the term) Technical Debt and make it also incorporate messy code, or is there a better name for it? Write your suggestions in the comments!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-212674345684684478?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.objectmentor.com/articles/2009/09/22/a-mess-is-not-a-technical-debt' title='Is Technical Debt still a mess?'/><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/212674345684684478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=212674345684684478' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/212674345684684478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/212674345684684478'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2009/09/is-technical-debt-still-mess.html' title='Is Technical Debt still a mess?'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-8656030951823456045</id><published>2009-09-16T07:00:00.035+02:00</published><updated>2011-01-20T11:37:57.131+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='citerus'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>How to write an automated test for code that calls System.exit()</title><content type='html'>The other day I came across some code that during certain conditions was expected to call System.exit(). Naturally I wanted test coverage for that code too, but since any test calling the method in question would terminate the entire testrun I had to find a different approach. Here is one strategy that can be used.&lt;br /&gt;&lt;br /&gt;Assume we need to write a test for the following simple method. (Yep, I just made this one up.)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void inconceivable() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.exit(42);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I can not just call the method in a JUnit test like this (but feel free to try it :-)).&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void shouldCallSystemExit() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new ObjectUnderTest().inconceivable();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Assert what now?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One way to make it possible is by utilizing a SecurityManager. By installing a custom security manager I can prevent the exit from actually happen. The following implementation overrides &lt;code&gt;checkExit()&lt;/code&gt; to throw an exception whenever a call to System.exit() is made. By also overriding &lt;code&gt;checkPermission()&lt;/code&gt; to do nothing, I allow myself to remove the security manager again, after it has been installed.&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;class ExceptionOnExitSecurityManager extends SecurityManager {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void checkExit(int status) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.checkExit(status);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new SystemExitException(status);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void checkPermission(Permission perm) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Override to allow removal of this security manager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A custom exception makes it really easy to access the status code.&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;class SystemExitException extends SecurityException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int statusCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SystemExitException(int statusCode) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.statusCode = statusCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now I am ready to write my test.&lt;br /&gt;&lt;pre class="brush:java"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void shouldCallSystemExit() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.setSecurityManager(new ExceptionOnExitSecurityManager());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new ObjectUnderTest().inconceivable();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fail("Did not call System.exit()");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (SystemExitException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assertEquals(42, e.statusCode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.setSecurityManager(null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This test will fail nicely if System.exit() is never called, or if it is called with a different status code than expected. Now the expected behaviour is documented and verified, and my test coverage moved up a notch.&lt;br /&gt;&lt;br /&gt;Do you have a different strategy for this type of situations, or do you see any problems with this approach? Please share it in the comments!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-8656030951823456045?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/8656030951823456045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=8656030951823456045' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8656030951823456045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8656030951823456045'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2009/09/how-to-write-automated-test-for-code.html' title='How to write an automated test for code that calls System.exit()'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-7377067932783937532</id><published>2009-02-09T00:08:00.003+01:00</published><updated>2009-02-09T00:38:44.224+01:00</updated><title type='text'>Problem with Google Latitude on Windows Mobile?</title><content type='html'>After a few failed attempts I have finally managed getting Google Latitude to work on my Windows Mobile device, a HTC TyTN II running Windows Mobile 6.&lt;br /&gt;&lt;br /&gt;Following the instructions from Google I visited &lt;a href="http://www.google.com/latitude"&gt;http://www.google.com/latitude&lt;/a&gt; on my device and got a link to download an updated version of the Google Maps application. After installing it, I could tell that the application had been updated to a newer version, but it did not contain any Latitude features. After redoing the downloading and installation process a few times without getting any further I finally found a method that worked for me.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Uninstall the Google Maps application if you already have an older version on your device.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Reboot your device. You can do this by pressing the power button for a few seconds.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Visit &lt;a href="https://www.google.com/accounts/Login"&gt;https://www.google.com/accounts/Login&lt;/a&gt; and login with your Google credentials.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Follow the link that says "Latitude" and the continue with downloading and installing the software.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Congratulations! You should now have access to Google Latitude on you mobile device. If not, you might still have luck using the Google &lt;a href="http://www.google.com/support/mobile/bin/topic.py?topic=19501"&gt;Mobile Help Center&lt;/a&gt; or the &lt;a href="http://www.google.com/support/forum/p/Google+Mobile?hl=en&amp;hl=en"&gt;Help Forum&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-7377067932783937532?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/7377067932783937532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=7377067932783937532' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/7377067932783937532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/7377067932783937532'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2009/02/problem-with-google-latitude-on-windows.html' title='Problem with Google Latitude on Windows Mobile?'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-4893941328003684065</id><published>2008-10-29T19:54:00.005+01:00</published><updated>2008-10-29T20:00:53.124+01:00</updated><title type='text'>Över ån efter vatten</title><content type='html'>När livet går för fort är det skönt att varva ned med en god bok eller en rafflande omgång pong. Eller varför inte både och?&lt;br /&gt;&lt;br /&gt;&lt;a href="#" onClick="javascript:window.open('http://paperconsole.com/paperpong.html','PaperPong','width=620,height=450,resizable=no,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no')"&gt;Paper Pong&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-4893941328003684065?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/4893941328003684065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=4893941328003684065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/4893941328003684065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/4893941328003684065'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2008/10/ver-n-efter-vatten.html' title='Över ån efter vatten'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-5707617437280076622</id><published>2008-06-15T15:31:00.004+02:00</published><updated>2008-06-15T16:47:55.006+02:00</updated><title type='text'>Kör försiktigt</title><content type='html'>Trygghet och säkerhet. Terrorism ska förhindras och livsmedelstillsatser kontrolleras. Detta och allt däremellan är stort och komplext, men frågar du mig "vad kan jag göra för en tryggare och säkrare tillvaro?" så är mitt svar enkelt:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;Kör försiktigt!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hmu1R_Bb4NI&amp;hl=en"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/hmu1R_Bb4NI&amp;hl=en" type="application/x-shockwave-flash" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-5707617437280076622?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/5707617437280076622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=5707617437280076622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/5707617437280076622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/5707617437280076622'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2008/06/kr-frsiktigt.html' title='Kör försiktigt'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-2373989454863722569</id><published>2008-02-12T07:47:00.000+01:00</published><updated>2008-02-12T08:35:38.787+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Recognizable features</title><content type='html'>The Register writes about researchers who &lt;a href="http://www.theregister.co.uk/2008/01/28/hundred_percent_face_recognition_claim/"&gt;claim to have a system for automatic face recognition&lt;/a&gt; with much higher accuracy than other existing systems. You know, the kind of system paranoid people think are connected to CCTV systems in public places to track people.&lt;br /&gt;&lt;br /&gt;How does this system work then? To avoid being distracted by changed hairstyles, different facial expressions, and so on, one must provide several images of the subject ranging over different looks. It then uses an average of the provided pictures to find the features that are constant and unique to the subject.&lt;br /&gt;&lt;br /&gt;Phew, that means that only celebrities who are frequent paparazzi targets are in risk of being tracked by public CCTV cameras. Unless someone decides to grab tagged faces from pictures on &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;. Hmmm, mabye I should start writing that add-on to show me the location of all my friends on Google maps...&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://www.schneier.com/blog/archives/2008/02/improvements_in.html"&gt;Bruce Schneier&lt;/a&gt; for the tip.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-2373989454863722569?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.theregister.co.uk/2008/01/28/hundred_percent_face_recognition_claim/' title='Recognizable features'/><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/2373989454863722569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=2373989454863722569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/2373989454863722569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/2373989454863722569'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2008/02/register-writes-about-researchers-who.html' title='Recognizable features'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-8235027812512329782</id><published>2008-01-20T23:04:00.000+01:00</published><updated>2008-01-20T23:27:57.811+01:00</updated><title type='text'>Keeping up with updates</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.apple.com/downloads/dashboard/status/images/appupdate_20070608165532.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px;" src="http://images.apple.com/downloads/dashboard/status/images/appupdate_20070608165532.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Sometimes I feel overwhelmed by the task of keeping all applications on my computer up to date. While a few applications makes it really easy to stay current with the latest version (I'm talking about you, &lt;a href="www.adiumx.com"&gt;Adium&lt;/a&gt;), others require me to visit their websites to find out if there are newer versions available. That's way too much work!&lt;br /&gt;&lt;br /&gt;I have just tried out a Dashboard widget called &lt;a href="http://www.apple.com/downloads/dashboard/status/appupdate.html"&gt;App Update&lt;/a&gt; that really simplifies staying up to date. It looks at your installed applications and compares with information from Apple, MacUpdate and VersionTracker and shows you a list of applications that have newer versions. Sweet!&lt;br /&gt;&lt;br /&gt;Now, go get up to date! Working through that list also makes a good opportunity to uninstall all that software you installed to try out but ended up never using.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-8235027812512329782?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.apple.com/downloads/dashboard/status/appupdate.html' title='Keeping up with updates'/><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/8235027812512329782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=8235027812512329782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8235027812512329782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8235027812512329782'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2008/01/keeping-up-with-updates.html' title='Keeping up with updates'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-808959446094552514</id><published>2008-01-16T23:53:00.000+01:00</published><updated>2008-01-16T23:57:09.874+01:00</updated><title type='text'>Steve in 60 seconds</title><content type='html'>Curious about the new stuff Steve Jobs presented during yesterdays MacWorld keynote, but not enough to spend 90 minutes watching the whole thing?&lt;br /&gt;&lt;br /&gt;You can have the important stuff in just &lt;a href="http://daily.mahalo.com/2008/01/16/md038-the-steve-jobs-90-minute-keynote-in-60-seconds/"&gt;60 seconds.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-808959446094552514?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://daily.mahalo.com/2008/01/16/md038-the-steve-jobs-90-minute-keynote-in-60-seconds/' title='Steve in 60 seconds'/><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/808959446094552514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=808959446094552514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/808959446094552514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/808959446094552514'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2008/01/steve-in-60-seconds.html' title='Steve in 60 seconds'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-1722814382044873862</id><published>2008-01-13T16:55:00.000+01:00</published><updated>2008-01-13T19:13:16.561+01:00</updated><title type='text'>Story of Stuff</title><content type='html'>Apart from telling an important story about consumerism, the &lt;a href="http://storyofstuff.com/"&gt;Story of Stuff&lt;/a&gt; is an example of how to make a great online presentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-1722814382044873862?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://storyofstuff.com/' title='Story of Stuff'/><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/1722814382044873862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=1722814382044873862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/1722814382044873862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/1722814382044873862'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2008/01/story-of-stuff.html' title='Story of Stuff'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-8917300483705014743</id><published>2007-06-10T16:06:00.000+02:00</published><updated>2007-06-10T16:16:25.635+02:00</updated><title type='text'>It's a Mac. No, it's a PC.</title><content type='html'>Well it actually is a Mac with MacOS running as the fundamental operating system and Windows running inside a virtual environment using &lt;a href="http://www.vmware.com/products/beta/fusion/"&gt;VMWare Fusion&lt;/a&gt; (currently in beta).&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JIApJMzGzDQ"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JIApJMzGzDQ" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;If you mistrust beta software, there is a similar feature in the newest release of &lt;a href="http://www.parallels.com/"&gt;Parallels&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-8917300483705014743?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/8917300483705014743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=8917300483705014743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8917300483705014743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8917300483705014743'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2007/06/its-mac-no-its-pc.html' title='It&apos;s a Mac. No, it&apos;s a PC.'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-8195254849178996462</id><published>2007-06-06T22:08:00.000+02:00</published><updated>2007-06-08T17:05:12.696+02:00</updated><title type='text'>Deliberate writing: Email</title><content type='html'>&lt;span style="font-style:italic;"&gt;We consume loads of information these days. Producers of information who want to get their message through should therefore strive to carry as much as possible of the intended consumers' burden. This applies to a lot of different contexts, but let us begin with email.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apparently, some people still believe that text written in email do not have to be grammatically correct or spelled correctly. That the email medium does not even require you to be coherent. That is fine when it comes to mail with artsy dadaist poetry from friends who just want to keep in touch. But if your message is intended to provide me with information or making me take some kind of action, then I would like to ask you this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If what ever you are trying to communicate to me is not important enough to justify decent spelling, grammar and interpunctuation, then why should I spend more time deciphering your text than you spent composing it?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;When writing email, of which most of us receive a lot every day, put some extra effort in making the text comprehensible to the recipient. As a minimum, just read through your text once before you send it and fix the most obvious errors in spelling, grammar and interpunctuation. You also might want to check if that automated spell checker you probably have gives you any good advice.&lt;br /&gt;&lt;br /&gt;As the sender, it should be in your greatest interest to get the message through to the reciever, loud and clear. Make the significant part of your message stand out. Please do this for me and I promise to return the favor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-8195254849178996462?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/8195254849178996462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=8195254849178996462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8195254849178996462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/8195254849178996462'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2007/06/deliberate-writing-email.html' title='Deliberate writing: Email'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-5448906197924283050</id><published>2007-06-01T08:17:00.000+02:00</published><updated>2008-02-12T08:39:17.256+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Airport Security</title><content type='html'>Airport security annoys me.&lt;br /&gt;&lt;br /&gt;Or rather, the randomness of it annoys me. I will get back to this subject in coming posts, that I promise you. For now I just want to share this Saturday Night Live rant on the subject.&lt;br /&gt;&lt;br /&gt;Saturday Night Live amuses me.&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ykzqFz_nHZE"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ykzqFz_nHZE" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-5448906197924283050?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/5448906197924283050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=5448906197924283050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/5448906197924283050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/5448906197924283050'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2007/06/airport-security.html' title='Airport Security'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10896564.post-377426280527325442</id><published>2007-05-31T23:15:00.000+02:00</published><updated>2007-05-31T23:31:15.331+02:00</updated><title type='text'>Veckans spaning</title><content type='html'>Vi har sett Apples &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt; med dess multitouch-gränsnitt.&lt;br /&gt;&lt;br /&gt;Vi ser nu Microsofts &lt;a href="http://www.microsoft.com/surface/"&gt;Surface&lt;/a&gt; i form av framtidens kaffebord.&lt;br /&gt;&lt;br /&gt;Vi ser mjukvara som &lt;a href="http://jchyip.blogspot.com/2007/05/photosynth-demo-at-ted2007.html"&gt;Photosynth&lt;/a&gt; demonstrera ett smart användargränssnitt i kombination med nya sätt att använda bilder.&lt;a href="http://jchyip.blogspot.com/2007/05/photosynth-demo-at-ted2007.html"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pusselbitar börjar nu falla på plats som möjliggör ett enormt språng i utvecklingen av användargränssnitt. Idéerna är inte nya och inte heller tekniken är helt ny, men har hittills bara setts i prototyper i labbmiljö. De kommer mycket snart att dyka upp i de apparater och program vi använder dagligen.&lt;br /&gt;&lt;br /&gt;Det börjar nu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10896564-377426280527325442?l=ingeniouslife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingeniouslife.blogspot.com/feeds/377426280527325442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10896564&amp;postID=377426280527325442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/377426280527325442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10896564/posts/default/377426280527325442'/><link rel='alternate' type='text/html' href='http://ingeniouslife.blogspot.com/2007/05/veckans-spaning.html' title='Veckans spaning'/><author><name>Rickard</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://farm1.static.flickr.com/29/buddyicons/79948562@N00.jpg?1124963442'/></author><thr:total>0</thr:total></entry></feed>
