<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;CkABRH87eyp7ImA9WxBbEkg.&quot;"><id>tag:blogger.com,1999:blog-5127857</id><updated>2010-03-10T20:52:35.103+01:00</updated><title>Asgeir S. Nilsen tenker litt</title><subtitle type="html">Ymse tanker om dette og hint.  Mye om Open Source, noe politikk og annet jeg er opptatt av.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>373</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/asgeirn" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="asgeirn" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">asgeirn</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fasgeirn" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/asgeirn" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fasgeirn" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.addtoany.com/?linkname=Asgeir%20S.%20Nilsen%20tenker%20litt&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fasgeirn&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><entry gd:etag="W/&quot;CkABRH85eyp7ImA9WxBbEkg.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-5785978507743716958</id><published>2010-03-10T20:52:00.001+01:00</published><updated>2010-03-10T20:52:35.123+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-10T20:52:35.123+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c++0x" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>C++0x: A const * const Odyssey</title><content type="html">&lt;p&gt;This is a presentation I and my colleague &lt;a href="http://knatten.org/"&gt;Anders Schau Knatten&lt;/a&gt; held at an internal software seminar this February.&lt;/p&gt;  &lt;p&gt;It was meant to cover both some introductory material, best practices we have acquired, new features to look forward to and things that might (or should) scare you.&lt;/p&gt;  &lt;p&gt;However not one member of our audience had less experience with C++ than Anders and myself have together, so we quickly jumped down into details.&lt;/p&gt;  &lt;p&gt;You should probably view the presentation full screen and open the speaker notes to get the most out of it.&lt;/p&gt;  &lt;p&gt;&lt;iframe height="451" src="http://docs.google.com/present/embed?id=dgw3tfxz_76fxn8jwg8&amp;amp;size=m" frameborder="0" width="555"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;You might find this additional note on slide 43 interesting:&amp;#160; A non-virtual destructor once made it to the board of directors..&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-5785978507743716958?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=knZ4Sk4qEUg:sWAsgrv9xiE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=knZ4Sk4qEUg:sWAsgrv9xiE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=knZ4Sk4qEUg:sWAsgrv9xiE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=knZ4Sk4qEUg:sWAsgrv9xiE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=knZ4Sk4qEUg:sWAsgrv9xiE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=knZ4Sk4qEUg:sWAsgrv9xiE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=knZ4Sk4qEUg:sWAsgrv9xiE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/5785978507743716958/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2010/03/c0x-const-const-odyssey.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5785978507743716958?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5785978507743716958?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2010/03/c0x-const-const-odyssey.html" title="C++0x: A const * const Odyssey" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;DE8GQHY5eip7ImA9WxBbEEU.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-5567534236040929608</id><published>2010-03-08T21:39:00.011+01:00</published><updated>2010-03-08T23:20:21.822+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-08T23:20:21.822+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="humor" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Why C++ is Male</title><content type="html">&lt;p&gt;Through recent frustrations, and needless to say, core dumps, I have realized that C++ as a language have some distinct features often associated with men: It can only do one thing at a time, and it cannot communicate. In this post I'll elaborate on these. &lt;/p&gt;  &lt;h3&gt;It Can Only Do One Thing at a Time&lt;/h3&gt;  &lt;p&gt;In C++ threads or the notion of multiprocessing simply does not exist. The language has neither a thread concept nor any thread synchronization primitives like mutexes, semaphores and locks. &lt;/p&gt;  &lt;p&gt;Even relatively simple constructs like static members simply do not work in a multi-threaded context. As described by Scott Meyers and Andrei Alexandrescu in &lt;a href="http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf"&gt;C++ and the Perils of Double-Checked Locking&lt;/a&gt;, no matter how many volatile keywords or extra locking you add in the mix, it still won't work consistently. Some compilers try to help you by fixing this for you, but since that is compiler implementation dependent it does more harm than help. &lt;/p&gt;  &lt;p&gt;C++ has no thread-safe memory model, and does not provide any means for a memory barrier. Which means that any &amp;quot;clever&amp;quot; compiler or instruction dispatcher is free to reorder your statements in whichever way provides the same result in a single thread of execution. &lt;/p&gt;  &lt;h3&gt;C++ Cannot Communicate&lt;/h3&gt;  &lt;p&gt;What is the de facto standard for communicating with the outside world, and has been for the last two decades? The Internet Protocol, or more specifically, the TCP and UDP protocols on top of it. But the C++ language &lt;i&gt;does not support&lt;/i&gt; this protocol. The only means of communication provided by the language are streams for input and output, and they can only be used for talking to files or to the console. &lt;/p&gt;  &lt;h3&gt;You Can Teach C++ New Tricks&lt;/h3&gt;  &lt;p&gt;In the recent years I've learned the art of walking and chewing gum at the same time. I can even pay attention to a conversation while doing other stuff, or at least I think I can. &lt;/p&gt;  &lt;p&gt;Being a married man I have also learned to cope with my lack of communication skills, to some extent. Neither of these feats came easy. They were achieved after failing a lot and suffering many crashes. &lt;/p&gt;  &lt;p&gt;I have never tried teaching a man to do these things, but having been taught these capabilities has provided some insight into the requisite effort and amount of frustration involved. &lt;/p&gt;  &lt;p&gt;Trying to teach C++ to do several things at the same time while communicating with others can also be accomplished. It is however probably equally frustrating as teaching your significant other something he obviously wasn't designed to do. Both capabilities require that you deal with the more primitive foundation the individual has evolved from (Neanderthals and C), and relying on cultural constructs (operating system interfaces) that have been added on top of evolution and behave differently from individual to individual. &lt;/p&gt;  &lt;p&gt;In many circumstances the resulting behavior is undefined, and will certainly cause some surprises. You also have to meticulously and in great detail instruct your friend on every step required to perform the task, in a language he understands. &lt;/p&gt;  &lt;h3&gt;The Modern Man: C++0x&lt;/h3&gt;  &lt;p&gt;Men have evolved, and so has C++ as well. In C++0x the language has grown the capability of doing several things at once, but it still prefers to do so alone in a dark corner.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-5567534236040929608?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=hOPzm4O2wI8:1QjPi4QNnME:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=hOPzm4O2wI8:1QjPi4QNnME:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=hOPzm4O2wI8:1QjPi4QNnME:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=hOPzm4O2wI8:1QjPi4QNnME:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=hOPzm4O2wI8:1QjPi4QNnME:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=hOPzm4O2wI8:1QjPi4QNnME:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=hOPzm4O2wI8:1QjPi4QNnME:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/5567534236040929608/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2010/03/why-c-is-male.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5567534236040929608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5567534236040929608?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2010/03/why-c-is-male.html" title="Why C++ is Male" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry><title type="text">Links for 2010-02-24 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2010-02-24" /><updated>2010-02-25T00:00:00-08:00</updated><id>http://del.icio.us/asgeirn#2010-02-24</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://xp2010.org/content.ap?thisId=68#"&gt;The Agile Train to Trondheim&lt;/a&gt;&lt;br/&gt;
A museum train that will leave from Oslo in the morning and arrive in Trondheim by the evening, just in time for the conference.

Onboard there will be a mini-conference with lightning talks and open space sessions, plus good food and lots of opportunities to get to know other conference goers. This is the perfect way to get the most out of your journey to Trondheim.&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry gd:etag="W/&quot;Ak4BRnY7cCp7ImA9WxBUEEk.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-5389296598898440199</id><published>2010-02-24T22:42:00.007+01:00</published><updated>2010-02-24T23:02:37.808+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-24T23:02:37.808+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="uml" /><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="plantuml" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>UML in a new way</title><content type="html">Once again I found myself in the need of writing some UML.  My last attempt nearly got me carpal tunnel syndrome and a broken mouse.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Yet I once more went on the quest of finding a UML editor, bracing myself for a crunch down on the little pointer with a tool that would eat all my RAM and spit it back out.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This time around however, I discovered &lt;a href="//plantuml.sourceforge.net/"&gt;PlantUML&lt;/a&gt;.  The process of writing for instance an action diagram became this easy:&lt;/div&gt;&lt;div&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6m61GL21m8M/S4Wf-evEywI/AAAAAAAADuU/li0Cioq9RmA/s1600-h/activity.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 188px; height: 320px;" src="http://1.bp.blogspot.com/_6m61GL21m8M/S4Wf-evEywI/AAAAAAAADuU/li0Cioq9RmA/s320/activity.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5441931620498328322" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;@startuml&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;(*) --&gt; "Download PlantUML"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;--&gt; "Run it"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;--&gt; "Open Notepad"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;--&gt; "Write Some Text"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;--&gt; "Hit Save"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;--&gt; "Look at the generated diagram"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;--&gt; (*)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;@enduml&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;The tool supports Sequence, Use Case, Class, Activity, Component, and State diagrams, and only requires &lt;a href="//www.graphviz.org/"&gt;GraphViz&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;And if Notepad isn't your tool of choice, you can choose between Word macros, Eclipse plugins, Ant tasks, or 10 other ways of running the tool.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Since it's text you can easily store it in version control, source code comments, pass it along in emails, &lt;a href="//twitter.com/asgeirn/status/9590335845"&gt;tweet it&lt;/a&gt;, generate it, and parse it.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Batteries included, mouse not required.  Highly recommended.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-5389296598898440199?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5ldBdTOrUoQ:Iba-sNRV_wM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5ldBdTOrUoQ:Iba-sNRV_wM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=5ldBdTOrUoQ:Iba-sNRV_wM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5ldBdTOrUoQ:Iba-sNRV_wM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=5ldBdTOrUoQ:Iba-sNRV_wM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5ldBdTOrUoQ:Iba-sNRV_wM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5ldBdTOrUoQ:Iba-sNRV_wM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/5389296598898440199/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2010/02/uml-in-new-way.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5389296598898440199?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5389296598898440199?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2010/02/uml-in-new-way.html" title="UML in a new way" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_6m61GL21m8M/S4Wf-evEywI/AAAAAAAADuU/li0Cioq9RmA/s72-c/activity.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;DEcESHw5eip7ImA9WxBQFU0.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-1987995605739087807</id><published>2010-01-14T22:51:00.005+01:00</published><updated>2010-01-14T22:53:29.222+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-14T22:53:29.222+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xmleditor" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>New version of XPath XML editor</title><content type="html">&lt;div&gt;Recently I needed to use my &lt;a href="http://blog.asgeirnilsen.com/search?q=xmleditor"&gt;XPath XML editor&lt;/a&gt; to tweak a number of POMs.  Only catch was that I was required to do this on a Windows machine.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;What's the catch you ask?  XML and Java work just as fine on Windows.  However, my editor requires a list of POM file names on the command line, something I quite easily fixed with &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;`find . -name pom.xml`&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This isn't easy in CMD, but even Windows has evolved recently.  Enter &lt;a href="http://www.microsoft.com/powershell"&gt;Windows PowerShell&lt;/a&gt;. The PowerShell replacement is pretty simple once you get to know the PowerShell basics:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;$(ls -include pom.xml -recurse -name)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;If you'd like to tinker with it, I've also pushed the xmleditor to &lt;a href="http://github.com/asgeirn/xmleditor"&gt;GitHub&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-1987995605739087807?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5mPc1nYkszE:3XRBxZNUWQs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5mPc1nYkszE:3XRBxZNUWQs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=5mPc1nYkszE:3XRBxZNUWQs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5mPc1nYkszE:3XRBxZNUWQs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=5mPc1nYkszE:3XRBxZNUWQs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5mPc1nYkszE:3XRBxZNUWQs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=5mPc1nYkszE:3XRBxZNUWQs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/1987995605739087807/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2010/01/new-version-of-xpath-xml-editor.html#comment-form" title="2 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1987995605739087807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1987995605739087807?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2010/01/new-version-of-xpath-xml-editor.html" title="New version of XPath XML editor" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry><title type="text">Links for 2009-11-24 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2009-11-24" /><updated>2009-11-25T00:00:00-08:00</updated><id>http://del.icio.us/asgeirn#2009-11-24</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/news/2009/11/legacy-code"&gt;InfoQ: Test Driven Development and the Trouble with Legacy Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title type="text">Links for 2009-11-14 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2009-11-14" /><updated>2009-11-15T00:00:00-08:00</updated><id>http://del.icio.us/asgeirn#2009-11-14</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nasa.gov/topics/earth/features/2012.html"&gt;NASA - 2012: Beginning of the End or Why the World Won't End?&lt;/a&gt;&lt;br/&gt;
Remember the Y2K scare? It came and went without much of a whimper because of adequate planning and analysis of the situation. Impressive movie special effects aside, Dec. 21, 2012, won&amp;#039;t be the end of the world as we know. It will, however, be another winter solstice.&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title type="text">Links for 2009-11-10 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2009-11-10" /><updated>2009-11-11T00:00:00-08:00</updated><id>http://del.icio.us/asgeirn#2009-11-10</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html"&gt;A Git Workflow for Agile&amp;nbsp;Teams&lt;/a&gt;&lt;br/&gt;
Suggest workflow for git development.  Feature branches with rebasing from an always-green master.&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title type="text">Links for 2009-10-21 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2009-10-21" /><updated>2009-10-22T00:00:00-07:00</updated><id>http://del.icio.us/asgeirn#2009-10-21</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://designbygravity.wordpress.com/2009/10/19/what-mother-never-told-you-about-svn-branching-and-merging/"&gt;What Mother never told you about SVN Branching and Merging &amp;laquo; Design By Gravity&lt;/a&gt;&lt;br/&gt;
Using Bunny Hopping (rebase really) to keep a feature branch in sync with trunk&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title type="text">Links for 2009-10-14 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2009-10-14" /><updated>2009-10-15T00:00:00-07:00</updated><id>http://del.icio.us/asgeirn#2009-10-14</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.google.com/viewer"&gt;Google Docs Viewer&lt;/a&gt;&lt;br/&gt;
Easily view or embed PDFs, powerpoints, or TIFFs on your web page&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry gd:etag="W/&quot;DUQBQ3s9eyp7ImA9WxNWFUw.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-1130198631933824754</id><published>2009-10-13T21:55:00.004+02:00</published><updated>2009-10-14T12:49:12.563+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T12:49:12.563+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tdd" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Six questions on TDD</title><content type="html">Read Uncle Bob's &lt;a href="http://blog.objectmentor.com/articles/2009/10/08/tdd-triage"&gt;&lt;i&gt;TDD Triage&lt;/i&gt;&lt;/a&gt;:  &lt;blockquote&gt;"Is TDD a replacement for architecture?&lt;div&gt;Is TDD a replacement for design?&lt;/div&gt;&lt;div&gt;Should TDD be used for every line of code?&lt;/div&gt;&lt;div&gt;Well, if you are going to write some tests afterwards, why not write all tests afterwards?&lt;/div&gt;&lt;div&gt;Given that we accept the need for tests, why the resistance to test-first?&lt;/div&gt;&lt;div&gt;Wouldn’t it be faster without such high test coverage?"&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;and &lt;a href="http://blog.objectmentor.com/articles/2009/10/06/echoes-from-the-stone-age"&gt;Echoes from the Stone Age&lt;/a&gt;: &lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;"TDD&lt;/div&gt;&lt;div&gt;The Design Pattern Religion&lt;/div&gt;&lt;div&gt;Minimizing Concurrency"&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Very good reads indeed.  It is of course triggered by all the controversy of Joel Spolsky's blog on Jamie Zawinski being a &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;Duct Tape Programmer&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Here are some of my comments:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Learn concurrency principles.  You'll need it.  Moore's Law no longer gives you more clock cycles per second, it gives you more processor cores.  To effectively utilize a modern CPU you have to keep all cores busy.
And if you struggle keeping two quad-cores busy, imagine keeping 1,000 cores busy.  It probably requires a fundamental programming paradigm change like the proposed &lt;a href="http://docs.google.com/viewer?url=http%3A%2F%2Fgee.cs.oswego.edu%2Fdl%2Fpapers%2Ffj.pdf"&gt;fork-join framework for Java&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Use high level building blocks like &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html"&gt;java.util.concurrent&lt;/a&gt; and &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/atomic/package-summary.html"&gt;java.util.concurrent.atomic&lt;/a&gt;.  It gives you well tested code that is maintained by Other Smart People, relieving your brain to work on more important things. Two classes to study: &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html"&gt;ExecutorService&lt;/a&gt; and &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html"&gt;BlockingQueue&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;TDD is a good way of writing safe concurrency code.  Design each element as a single threaded execution flow, and assert state before and after.  Pay attention to locks and shared data.&lt;/li&gt;&lt;li&gt;Architecture is Important.  You don't build a skyscraper or a space station in the same way as a dog house or a residential house.&lt;/li&gt;&lt;li&gt;Testing is a good way of exploring unknown APIs or legacy code.  You basically assert the expected output or behavior of the code you are exploring.&lt;/li&gt;&lt;li&gt;Duct Tape is good for many things.  You can even build a &lt;a href="http://twitter.com/grantimahara/statuses/4838528129"&gt;sailboat&lt;/a&gt; out of it. But you probably wouldn't enlist for the &lt;a href="http://www.volvooceanrace.org/"&gt;Volvo Ocean Race&lt;/a&gt; with it?&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-1130198631933824754?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=GZv6hMuDNiQ:Vp9bVLnSUcM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=GZv6hMuDNiQ:Vp9bVLnSUcM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=GZv6hMuDNiQ:Vp9bVLnSUcM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=GZv6hMuDNiQ:Vp9bVLnSUcM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=GZv6hMuDNiQ:Vp9bVLnSUcM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=GZv6hMuDNiQ:Vp9bVLnSUcM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=GZv6hMuDNiQ:Vp9bVLnSUcM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/1130198631933824754/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/10/six-questions-on-tdd.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1130198631933824754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1130198631933824754?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/10/six-questions-on-tdd.html" title="Six questions on TDD" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry><title type="text">Links for 2009-10-07 [del.icio.us]</title><link rel="alternate" type="text/html" href="http://del.icio.us/asgeirn#2009-10-07" /><updated>2009-10-08T00:00:00-07:00</updated><id>http://del.icio.us/asgeirn#2009-10-07</id><content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.moserware.com/2009/07/just-enough-mba-to-be-programmer.html"&gt;Just Enough MBA to Be a Programmer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry gd:etag="W/&quot;D04MSHkyfCp7ImA9WxNSEU0.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-7515512081289737651</id><published>2009-08-24T11:19:00.003+02:00</published><updated>2009-08-24T11:26:29.794+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T11:26:29.794+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="versioning" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Versions Maven Plugin</title><content type="html">Ever struggled with keeping versions of dependencies or inter-module links up to date?  Now the &lt;a href="http://mojo.codehaus.org/versions-maven-plugin/index.html"&gt;Versions Maven Plugin&lt;/a&gt; comes to the rescue!  It has readily available goals for tasks like:
&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/examples/advancing-dependency-versions.html"&gt;Advancing dependency versions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/examples/update-parent.html"&gt;Updating the Parent version&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/examples/update-child-modules.html"&gt;Fixing a multi-module build&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/examples/set.html"&gt;Changing the project version&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/examples/lock-snapshots.html"&gt;Locking snapshot dependencies&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mojo.codehaus.org/versions-maven-plugin/examples/use-releases.html"&gt;Replacing -SNAPSHOT versions with their corresponding releases&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;The worst thing about this plugin is that it haven't appeared sooner.  It also means I can now retire my &lt;a href="http://www.blogger.com/2007/08/oppdatert-xmleditor.html"&gt;XML Editor&lt;/a&gt; tool's primary usage.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-7515512081289737651?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fRCr_JrYVZI:8MVKngtRLvY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fRCr_JrYVZI:8MVKngtRLvY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=fRCr_JrYVZI:8MVKngtRLvY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fRCr_JrYVZI:8MVKngtRLvY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=fRCr_JrYVZI:8MVKngtRLvY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fRCr_JrYVZI:8MVKngtRLvY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fRCr_JrYVZI:8MVKngtRLvY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/7515512081289737651/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/08/versions-maven-plugin.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/7515512081289737651?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/7515512081289737651?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/08/versions-maven-plugin.html" title="Versions Maven Plugin" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CkUAQXg4cSp7ImA9WxJbF0o.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-8030313324152146731</id><published>2009-07-28T10:36:00.001+02:00</published><updated>2009-07-28T10:37:20.639+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-28T10:37:20.639+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tls" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>HTTPS connection explained</title><content type="html">&lt;div&gt;If you wonder how HTTPS works, you could read this one:&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html"&gt;The First Few Milliseconds of an HTTPS Connection&lt;/a&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;After that, please come back and read my post &lt;a href="/2009/06/tls-broken-trust-model.html"&gt;TLS: A Broken Trust Model&lt;/a&gt; about the flaws of how HTTPS establishes a trust relationship between client and server.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-8030313324152146731?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=wUclOGkMyEU:TwBbSvqTwsM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=wUclOGkMyEU:TwBbSvqTwsM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=wUclOGkMyEU:TwBbSvqTwsM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=wUclOGkMyEU:TwBbSvqTwsM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=wUclOGkMyEU:TwBbSvqTwsM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=wUclOGkMyEU:TwBbSvqTwsM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=wUclOGkMyEU:TwBbSvqTwsM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/8030313324152146731/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/07/https-connection-explained.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/8030313324152146731?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/8030313324152146731?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/07/https-connection-explained.html" title="HTTPS connection explained" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;DEcDRXw4fSp7ImA9WxJXF0k.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-1888737785411553154</id><published>2009-06-11T20:45:00.002+02:00</published><updated>2009-06-11T20:47:54.235+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-11T20:47:54.235+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="tls" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>TLS: A Broken Trust Model</title><content type="html">&lt;h1&gt;What is TLS&lt;/h1&gt;&lt;div&gt;TLS stands for Transport Layer Security.  It was formerly known as SSL, or Secure Sockets Layer.  In short, it's the protocol behind the s in https, making internet banking, passwords and other data safe from eavesdropping while browsing.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;In https, TLS also has another purpose -- trust.  Through a chain of digital certificates and certificate authorities, the system tries to ensure you that the web site you are visiting is controlled by the company they claim to be.&lt;/div&gt;&lt;h1&gt;How Does TLS Work&lt;/h1&gt;&lt;div&gt;To protect communication, an encryption key has to be agreed upon by both ends in the conversation - namely the web browser and the web server.  Because of efficiency this key must be identical on both sides.  But how do you exchange this key in a secure fashion, ensuring no-one else can access it?&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;TLS solves this by encoding this key in &lt;i&gt;another&lt;/i&gt; key.  This other key is &lt;i&gt;asymmetric&lt;/i&gt;, meaning different keys are used for encrypting and decrypting data.  The key used for encrypting data can thus be openly exchanged.  This encryption key, also called the &lt;i&gt;public key&lt;/i&gt;, is encapsulated in a &lt;i&gt;digital certificate&lt;/i&gt; with other information about the rightful owner of this key.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;Among other things, this certificate contains the DNS name of the web server who owns it, and the name of the organization or individual it is registered to.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;This certificate is presented to the browser by the web server when they initiate the TLS session.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="font-size:180%;"&gt;The Purpose of those Certificates&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;But how do you know that this certificate is valid?  This is where &lt;i&gt;certificate authorities&lt;/i&gt; come in. They &lt;i&gt;sign&lt;/i&gt; digital certificates, telling us that they vouch for the validity of this digital certificate and have verified that it is issued to the correct organization or person.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;And how does the certificate authority identify itself.  By another digital certificate.  And how do you know &lt;i&gt;this&lt;/i&gt; digital certificate is trustworthy?  By &lt;i&gt;yet another&lt;/i&gt; certificate authority, vouching for this intermediate certificate authority.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This obviously cannot continue forever.  This is why TLS relies on &lt;i&gt;root certificates&lt;/i&gt;.  These certificates are &lt;i&gt;ultimately &lt;/i&gt;trusted, meaning you simply accept that they are valid.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;In order for this certificate chain to work in practice, these root certificates are installed in every web browser as they are distributed by the web browser vendor.&lt;/div&gt;&lt;h1&gt;Who do you trust?&lt;/h1&gt;&lt;div&gt;The web browser's &lt;i&gt;ultimate&lt;/i&gt; trust in root certificates is distributed among a large number of corporations like &lt;i&gt;Verisign, Thawte, COMODO, Microsoft, Deutsche Telekom, Entrust, Geotrust, Equifax, GlobalSign, Go Daddy, GTE CyberTrust, Starfield Technologies, and USERTrust&lt;/i&gt;.  These comprise the list that my Internet Explorer 8 contains.  &lt;/div&gt;&lt;div&gt;
Firefox 3 contains the following staggering list: &lt;i&gt;TÜRKTRUST, ABA.ECOM, AC Camerfirma SA, AddTrust AB, America Online, AOL Time Warner, Autodidad de Certificacion Firmaprofesional, Baltimore, beTRUSTed, Certplus, COMODO, DigiCert, DigiNotar, Digital Signature Trust, Entrust, Equifax, GeoTrust, GlobalSign, Taiwan Goverment Root Certification Authority, GTE Corporation, IPS Internet Publishing Services, IPS Seguridad, NetLock Halozatbiztonsagi, Network Solutions, QuoVadis, RSA Data Security, SECOM Trust, SecureTrust, Sonera, Staat der Nederlanden, Starfield Technologies, StartCom, Swisscom, SwissSign, TC TrustCenter for Security in Data Networks, TDC, Thawte, Go Daddy, USERTRUST, Unizeto, ValiCert, VeriSign, VISA, Wells Fargo, and XRamp Security Services&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So: Who decides which companies are admitted into this inner circle of ultimately trusted organizations?  What means do they take to ensure that they are as trustworthy as they claim.  And why is there such a large difference between Microsoft's and Mozilla's list?&lt;/div&gt;&lt;h1&gt;A Snake Oil Market: Issuing Digital Certificates&lt;/h1&gt;&lt;div&gt;These certificate authorities have created an artificial market, selling their trust at a high price.  Furthermore, since digital certificates always have an &lt;i&gt;expiration date,&lt;/i&gt; after which the certificate is no longer valid, they have ensured return customers as well.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;The organizations provide little added value, apart from the aforementioned trust.  But are these certificate authorities really more trustworthy than the organizations forced to purchase digital certificates from them?&lt;/div&gt;&lt;h1&gt;What Is Wrong With TLS&lt;/h1&gt;&lt;div&gt;It boils down to trust.  If you were to make a top ten list of the organizations you trust most -- what would these organizations be?  And are any of the organizations mentioned above on that list?&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Why can't you choose for yourself who to trust?&lt;/div&gt;&lt;h1&gt;What is TLS supposed to protect?&lt;/h1&gt;&lt;div&gt;TLS protects the data transmitted between the browser and the web server.  Often this is your personal or confidential data, like user identification, financial information or other data which you would like to be kept secret, and that the organization you exchange data with often is mandated to protect.&lt;/div&gt;&lt;h1&gt;What are the risks involved?&lt;/h1&gt;&lt;div&gt;The most severe risk is that a certificate authority issues a certificate to the wrong people.  These people could then pose as the organization the certificate is issued to, and steal your personal data without you being aware of it.  The browser would claim the communication is secure with a trustworthy party, and it's impossible to detect that something wrong is going on.&lt;/div&gt;&lt;h1&gt;A Better TLS Key Exchange&lt;/h1&gt;&lt;div&gt;Remember, the primary purpose of the digital certificate is to exchange and protect the key used to encrypt the data in transit between the browser and the web site.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This key could be protected in other ways, two of which are suggested here:&lt;/div&gt;&lt;h2&gt;1. The browser issues a digital certificate&lt;/h2&gt;&lt;div&gt;The web browser can generate a self-signed certificate and present it to the web server when initiating a TLS session.  The web server doesn't know whether this certificate is trustworthy, but that doesn't matter.  It's only a matter of exchanging an encryption key in a secure manner, not trust.  Most web sites require you to log on to identify yourself and establish this trusted relationship.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This certificate can be generated when the browser starts, and be destroyed when the browser exits.&lt;/div&gt;&lt;h2&gt;2. The encryption key is based on shared secrets&lt;/h2&gt;The encryption key, or a scheme to generate an encryption key, can be shared between the browser and the web site.  This can be based on the user's authentication data like user name and password.  The browser can then start sending encrypted data, expecting the web site to know how to decrypt them.&lt;h1&gt;A Better Trust Model&lt;/h1&gt;&lt;div&gt;Since the data exchanged is yours -- shouldn't you decide whether you trust the organization you exchange data with?
&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This could be solved by removing the intermediate steps in the trust chain.  Either you trust the party you are exchanging data with, or you do not.  The decision is yours and yours only.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;For example, when you establish a customer relationship with an organization, this organization could send you a self-signed digital certificate identifying itself.  You would then choose whether you accept or reject this certificate.&lt;/div&gt;&lt;/div&gt;&lt;h1&gt;Conclusion&lt;/h1&gt;&lt;div&gt;TLS in itself is not broken, but the trust model employed is.  Furthermore, the TLS protocol does not need to change, at least not significantly, to implement the improvements suggested.  The key exchange part needs to be revised, and the way browsers handle digital certificates must change.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;But it would create an overall more trustworthy solution, removing an unnecessary middle man.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-1888737785411553154?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=2TyLdMSVrT4:bknzhOZDcBc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=2TyLdMSVrT4:bknzhOZDcBc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=2TyLdMSVrT4:bknzhOZDcBc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=2TyLdMSVrT4:bknzhOZDcBc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=2TyLdMSVrT4:bknzhOZDcBc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=2TyLdMSVrT4:bknzhOZDcBc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=2TyLdMSVrT4:bknzhOZDcBc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/1888737785411553154/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/06/tls-broken-trust-model.html#comment-form" title="5 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1888737785411553154?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1888737785411553154?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/06/tls-broken-trust-model.html" title="TLS: A Broken Trust Model" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CUUCRXkzfip7ImA9WxJSF00.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-7556195743328634398</id><published>2009-05-07T15:29:00.002+02:00</published><updated>2009-05-07T15:34:24.786+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-07T15:34:24.786+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="password" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Why submitting clear text passwords is bad</title><content type="html">&lt;div&gt;Jeff Atwood reminds me why even &lt;i&gt;submitting&lt;/i&gt; passwords in the clear to a web site can be dangerous:  You basically have to &lt;i&gt;trust&lt;/i&gt; that they are storing the password in a secure fashion. &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Which they more often than not don't.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001263.html?r=15200#endcomments"&gt;Coding Horror: I Just Logged In As You: How It Happened&lt;/a&gt;: &lt;blockquote&gt;"I guess I can tell you, so you don't fall into this trap again. There's a site I help out with that doesn't salt their passwords. They're MD5 encrypted, but if you've got a dictionary password, it's very easy to use a reverse-MD5 site to get the original. I was able to figure out you were a user on the site some time back, and realized I could do this, if only I knew your openid provider..."&lt;/blockquote&gt;There are basically two ways of solving this:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Use different passwords for different web sites.  &lt;a href="http://supergenpass.com/"&gt;SuperGenPass&lt;/a&gt; takes the hassle out of this by generating a password based on a master password and the site's domain name.&lt;/li&gt;&lt;li&gt;Hash the password in the browser before submitting.  My blog entry &lt;a href="/2005/11/password-authentication-without.html"&gt;Password Authentication Without Revealing Your Password&lt;/a&gt; demonstrates a solution to this one.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I really wish client side hashing was more prominent than it is.  I have seen it in action only two or three times, one of those implemented by myself.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-7556195743328634398?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oOmr4YQBaOA:b7BRJCHxRow:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oOmr4YQBaOA:b7BRJCHxRow:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=oOmr4YQBaOA:b7BRJCHxRow:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oOmr4YQBaOA:b7BRJCHxRow:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=oOmr4YQBaOA:b7BRJCHxRow:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oOmr4YQBaOA:b7BRJCHxRow:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oOmr4YQBaOA:b7BRJCHxRow:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/7556195743328634398/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/05/why-submitting-clear-text-passwords-is.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/7556195743328634398?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/7556195743328634398?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/05/why-submitting-clear-text-passwords-is.html" title="Why submitting clear text passwords is bad" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;C0QNSH8zcCp7ImA9WxJSFk8.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-3219204294341448392</id><published>2009-05-06T16:42:00.005+02:00</published><updated>2009-05-06T16:49:59.188+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T16:49:59.188+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pirat" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="krevsvar" /><title>Hemmelig kjennelse i Stavanger Tingrett om piratkopiering</title><content type="html">&lt;div&gt;&lt;a href="http://www.tu.no/it/article209110.ece"&gt;tu.no - Slik forklares hemmelig pirat-dom - Teknisk Ukeblad&lt;/a&gt;:&lt;/div&gt;&lt;blockquote&gt;"Dagbladet skrev tirsdag at Stavanger tingrett har avsagt hemmelig kjennelse i spørsmålet om Lyse Tele må utlevere identiteten til en av sine bredbåndskunder som er mistenkt for piratkopiering av «Max Manus»-filmen.&lt;/blockquote&gt;&lt;blockquote&gt;Spørsmålet er svært betent, fordi piratjegerne som vil ha identiteten er advokater som jobber på vegne av en privat kunde.&lt;/blockquote&gt;&lt;blockquote&gt;Idag er det bare politiet som kan kreve dette, men i et byråkratvedtak av Post- og teletilsynet er det åpnet for at advokatfirmaet kan kreve utlevering på egenhånd, uten å måtte gå via politiet.&lt;/blockquote&gt;&lt;blockquote&gt;Reaksjonene på dette har kommet på nettet, men politikerne har så langt holdt seg unna på tross av mange oppfordringer om å komme på banen."&lt;/blockquote&gt;Hvor er politikerne?  Er det slik vi vil ha det?&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Dommeren som har avsagt kjennelsen har tatt ferie.  Tilfeldig?&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Se kommentarene på Twitter: &lt;a href="http://search.twitter.com/search?q=%23krevsvar"&gt;#krevsvar&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-3219204294341448392?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=zpd8KwUcN7U:bWVJBKiw0ZE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=zpd8KwUcN7U:bWVJBKiw0ZE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=zpd8KwUcN7U:bWVJBKiw0ZE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=zpd8KwUcN7U:bWVJBKiw0ZE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=zpd8KwUcN7U:bWVJBKiw0ZE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=zpd8KwUcN7U:bWVJBKiw0ZE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=zpd8KwUcN7U:bWVJBKiw0ZE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/3219204294341448392/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/05/hemmelig-kjennelse-i-stavanger-tingrett.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/3219204294341448392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/3219204294341448392?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/05/hemmelig-kjennelse-i-stavanger-tingrett.html" title="Hemmelig kjennelse i Stavanger Tingrett om piratkopiering" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;DUQCRn04eCp7ImA9WxJTFEo.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-7477882169839295939</id><published>2009-04-22T20:50:00.005+02:00</published><updated>2009-04-23T11:02:47.330+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-23T11:02:47.330+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="drittunge" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="pirate" /><title>Saksøk drittungene!</title><content type="html">&lt;a href="http://www.aftenposten.no/kul_und/musikk/article3034488.ece"&gt;Piratene er de beste kundene - Kultur - Musikk - Aftenposten.no&lt;/a&gt;: &lt;blockquote&gt;"Samtidig som Pirate Bay-gründerne på fredag ble dømt til både fengsel og svimlende bøter, slapp BI de oppsiktsvekkende resultatene fra sin store undersøkelse Kulturkonsum i krisetider.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div&gt;Den viser at de som laster ned musikk gratis også er de desidert største forbrukerne av betalt nedlastet musikk fra iTunes og andre nettbutikker – og at de betaler for ti ganger så mange nedlastinger som de som aldri laster ned ulovlig.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;–Det mest overraskende er at andelen betalt nedlasting er såpass høy, sier Audun Molde, høyskolelektor ved BI og fagansvarlig for musikk ved NISS.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;–Resultatene kan tyde på at det lastes ned dobbelt så mye betalt musikk som gratis, og det er altså de som oppgir at de laster ned gratis som faktisk er de desidert største kundene av betalt musikk på nettet."&lt;/blockquote&gt;Når begynte de å lære bort idéen om at den beste måten å behandle innflytelsesrike kunder på er å kriminalisere dem og kalle dem for &lt;a href="http://thomasmoen.com/news/show/80533"&gt;drittunger&lt;/a&gt;? &lt;div&gt;
&lt;/div&gt;&lt;div&gt;Se kommentarene på Twitter: &lt;a href="http://search.twitter.com/search?q=%23drittunge"&gt;#drittunge&lt;/a&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;i&gt;Oppdatering:&lt;/i&gt; Se artikkelen i &lt;a href="http://www.dinside.no/811433/warner-kalte-even-en-drittunge"&gt;DinSide&lt;/a&gt;. Den havnet også på førstesiden på &lt;a href="http://digg.com/music/Norwegian_Warner_Music_calls_blogger_a_brat_on_Twitter"&gt;Digg&lt;/a&gt;! Even Sandvold Roland er på vei til Norsk Redaktørforenings landsmøte for å snakke om denne saken.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-7477882169839295939?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=KWoh8PRWKmw:uqWBfJYgPyk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=KWoh8PRWKmw:uqWBfJYgPyk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=KWoh8PRWKmw:uqWBfJYgPyk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=KWoh8PRWKmw:uqWBfJYgPyk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=KWoh8PRWKmw:uqWBfJYgPyk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=KWoh8PRWKmw:uqWBfJYgPyk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=KWoh8PRWKmw:uqWBfJYgPyk:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/7477882169839295939/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/piratene-er-de-beste-kundene-kultur.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/7477882169839295939?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/7477882169839295939?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/piratene-er-de-beste-kundene-kultur.html" title="Saksøk drittungene!" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;DEcAQHc7eSp7ImA9WxVaGUs.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-6075116455827142254</id><published>2009-04-17T12:56:00.002+02:00</published><updated>2009-04-17T13:00:41.901+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T13:00:41.901+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="pirate" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>The Pirate Bay lost the court case</title><content type="html">&lt;a href="http://deltemeninger.no/-/bulletin/show/288640_pirate-bay-tapte-saken"&gt;Delte meninger : Pirate Bay tapte saken&lt;/a&gt;: &lt;blockquote&gt;"Klokka 11 i dag avsa Stockholm Tingrät dom (PDF, 107 sider) i saken mot Fredrik Neij (30), Gottfrid Svartholm Warg (24), Peter Sunde Kolmisoppi (30), og Carl Lundström (49). Alle de fire ble dømt for medvirkning til brudd på den svenske opphavsrettlovgivingen.
Dommen lyder på et års fengsel for alle de fire tiltalte, i tillegg skal de betale en erstatning til flere filmselskap. Til sammen er erstatnings­beløpene på 30 millioner svenske kroner."&lt;/blockquote&gt;All four were sentenced to one years imprisonment, and to pay damages amounting to &lt;a href="http://www.google.com/search?q=30+million+SEK+in+USD"&gt;30 million SEK&lt;/a&gt;.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This is most probably not the final say in this matter, as it is highly likely that this ruling will be appealed.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-6075116455827142254?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=U9CwXPNChIQ:VJqxsD7U_1M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=U9CwXPNChIQ:VJqxsD7U_1M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=U9CwXPNChIQ:VJqxsD7U_1M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=U9CwXPNChIQ:VJqxsD7U_1M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=U9CwXPNChIQ:VJqxsD7U_1M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=U9CwXPNChIQ:VJqxsD7U_1M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=U9CwXPNChIQ:VJqxsD7U_1M:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/6075116455827142254/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/pirate-bay-tapte-saken.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/6075116455827142254?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/6075116455827142254?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/pirate-bay-tapte-saken.html" title="The Pirate Bay lost the court case" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;Dk4NQH09eyp7ImA9WxVaGUs.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-604041883471697640</id><published>2009-04-17T12:31:00.005+02:00</published><updated>2009-04-17T12:43:11.363+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T12:43:11.363+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>InfoQ: Sun's Garbage First Collector Largely Eliminates Low Latency/High Throughput Tradeoff</title><content type="html">&lt;a href="http://www.infoq.com/news/2009/04/g1"&gt;InfoQ: Sun's Garbage First Collector Largely Eliminates Low Latency/High Throughput Tradeoff&lt;/a&gt;: &lt;blockquote&gt;"Sun's Garbage First garbage collector (hereafter referred to by its nickname G1) is the new low latency garbage collector planned to replace CMS in the Hotspot JVM. It is a server-style collector, targeted at multi-processor machines with large amounts of memory. There are two major differences between CMS and G1. The first is that G1 is a compacting collector. (...) As well as compacting, G1 offers more predictable garbage collection pauses than can be obtained with the CMS collector and allows users to set their desired pause targets."&lt;/blockquote&gt;It is part of &lt;a href="http://twingine.no/search.php?q=JDK+6u14+early+access"&gt;JDK 6u14 early access&lt;/a&gt;, so you can try it out already now. Use the following options to enable it: &lt;div&gt;
&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -Xloggc:gc.log&lt;/span&gt;&lt;/div&gt;
The last time I tested this jconsole and jvisualvm were not updated to handle this garbage collector, and the gc log format cannot directly be handled by current gc log parsers.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-604041883471697640?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FOWYNWHb8K4:ij8Ev87urd8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FOWYNWHb8K4:ij8Ev87urd8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=FOWYNWHb8K4:ij8Ev87urd8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FOWYNWHb8K4:ij8Ev87urd8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=FOWYNWHb8K4:ij8Ev87urd8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FOWYNWHb8K4:ij8Ev87urd8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FOWYNWHb8K4:ij8Ev87urd8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/604041883471697640/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/infoq-suns-garbage-first-collector.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/604041883471697640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/604041883471697640?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/infoq-suns-garbage-first-collector.html" title="InfoQ: Sun's Garbage First Collector Largely Eliminates Low Latency/High Throughput Tradeoff" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;C08ER3s4eyp7ImA9WxVaGEQ.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-5481973129865238444</id><published>2009-04-16T14:02:00.003+02:00</published><updated>2009-04-16T16:23:26.533+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T16:23:26.533+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="creative commons" /><category scheme="http://www.blogger.com/atom/ns#" term="delingskultur" /><title>Delte meninger er lansert</title><content type="html">&lt;a href="http://deltemeninger.no/-/sandbox/show/209433"&gt;Delte meninger&lt;/a&gt;: &lt;blockquote&gt;"Velkommen til den opne nettversjonen av boka mi “Delte meninger”! Dei tre delane av boka vil verte lagt ut til fri nedlasting og debatt fram mot lansering av papirversjonen den 19. mai. Artiklane har ulik tilnærming til korleis den sosiale delingskulturen på nettet kan påvirke demokratiet vårt. Eg håpar flest mogeleg vil gi sine synspunkt på desse temaene.
– Heidi Grande Røys, Fornyingsminister"&lt;/blockquote&gt;Boken tar opp mange interessante aspekter ved deling av digitalt innhold, og skal bli interessant å følge med på. &lt;div&gt;
&lt;/div&gt;&lt;div&gt;De tre delene er:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Åpen, fri og tilgjengelig&lt;/li&gt;&lt;li&gt;Demokratisk delingskultur&lt;/li&gt;&lt;li&gt;Barn og unge i nettverksamfunnet&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-5481973129865238444?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=X4JHuSQLjtM:C0VfmA5HVN8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=X4JHuSQLjtM:C0VfmA5HVN8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=X4JHuSQLjtM:C0VfmA5HVN8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=X4JHuSQLjtM:C0VfmA5HVN8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=X4JHuSQLjtM:C0VfmA5HVN8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=X4JHuSQLjtM:C0VfmA5HVN8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=X4JHuSQLjtM:C0VfmA5HVN8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/5481973129865238444/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/delte-meninger-er-lansert.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5481973129865238444?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5481973129865238444?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/delte-meninger-er-lansert.html" title="Delte meninger er lansert" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;A0cDQ3s7eCp7ImA9WxVaGEw.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-4677464005309302615</id><published>2009-04-15T19:53:00.004+02:00</published><updated>2009-04-15T20:11:12.500+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-15T20:11:12.500+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hagearbeid" /><title>Furua faller</title><content type="html">Furua som har stått på tomten i femti år måtte ned.  &lt;a href="http://trefellerne.no/"&gt;Trefellerne.no&lt;/a&gt; ble satt på saken:
&lt;p&gt;

&lt;object width="700" height="525"&gt; &lt;param name="flashvars" value="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fasgeir%2Fsets%2F72157616816011902%2Fshow%2Fwith%2F3444588107%2F&amp;page_show_back_url=%2Fphotos%2Fasgeir%2Fsets%2F72157616816011902%2Fwith%2F3444588107%2F&amp;set_id=72157616816011902&amp;jump_to=3444588107"&gt;&lt;/param&gt; &lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=70908"&gt;&lt;/param&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=70908" allowFullScreen="true" flashvars="offsite=true&amp;lang=en-us&amp;page_show_url=%2Fphotos%2Fasgeir%2Fsets%2F72157616816011902%2Fshow%2Fwith%2F3444588107%2F&amp;page_show_back_url=%2Fphotos%2Fasgeir%2Fsets%2F72157616816011902%2Fwith%2F3444588107%2F&amp;set_id=72157616816011902&amp;jump_to=3444588107" width="700" height="525"&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/5127857-4677464005309302615?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=ZQTpPaR7ruk:pZK2xCcrW0Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=ZQTpPaR7ruk:pZK2xCcrW0Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=ZQTpPaR7ruk:pZK2xCcrW0Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=ZQTpPaR7ruk:pZK2xCcrW0Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=ZQTpPaR7ruk:pZK2xCcrW0Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=ZQTpPaR7ruk:pZK2xCcrW0Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=ZQTpPaR7ruk:pZK2xCcrW0Q:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/4677464005309302615/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/furua-faller.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/4677464005309302615?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/4677464005309302615?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/furua-faller.html" title="Furua faller" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CkIAQ3g5fSp7ImA9WxVbF0g.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-4602518976027804281</id><published>2009-04-02T21:37:00.003+02:00</published><updated>2009-04-03T11:22:22.625+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-03T11:22:22.625+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="english" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>A man of no principles</title><content type="html">The few of you that might have followed my blog for a while, might have read some of my rather bombastic statements on principles.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;In &lt;a href="http://www.blogger.com/2005/02/why-ill-never-buy-ipod-or-anything.html"&gt;2005&lt;/a&gt;, I said I would never buy an iPod or music from iTunes.  Wrong.  I both have an iPod Nano (it was a gift though) and have bought a lot of music from iTunes, first buy only three months after this bold statement.  In total I have spent more than &lt;a href="http://google.com/search?q=3000+NOK+in+USD"&gt;3,000 NOK&lt;/a&gt; on music from iTunes.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;And I've bought a MacBook.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.blogger.com/2008/07/hvordan-jeg-ikke-fikk-en-iphone-3g-og.html"&gt;Last year&lt;/a&gt; I queued for an iPhone 3G, failing to obtain one and then claiming I would never get one. I ordered one from Telenor two weeks ago, and have spent &lt;a href="http://google.com/search?q=200+NOK+in+USD"&gt;200 NOK&lt;/a&gt; on apps already.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So, in conclusion, I now have only one principle: to not stick to my principles, except this one.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Maybe.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-4602518976027804281?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=j8vXHehNWFE:nzNTCCIP9_0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=j8vXHehNWFE:nzNTCCIP9_0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=j8vXHehNWFE:nzNTCCIP9_0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=j8vXHehNWFE:nzNTCCIP9_0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=j8vXHehNWFE:nzNTCCIP9_0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=j8vXHehNWFE:nzNTCCIP9_0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=j8vXHehNWFE:nzNTCCIP9_0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/4602518976027804281/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/man-of-no-principles.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/4602518976027804281?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/4602518976027804281?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/04/man-of-no-principles.html" title="A man of no principles" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CUQNQHo7eip7ImA9WxVbFEk.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-5039659987932019616</id><published>2009-03-30T21:48:00.002+02:00</published><updated>2009-03-30T22:03:11.402+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-30T22:03:11.402+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Why adhering to established standards is always a Good Thing</title><content type="html">The memory in my &lt;a href="http://google.com/search?q=Dell+Precision+M4300"&gt;work laptop&lt;/a&gt; failed the other day, rendering my Windows XP setup completely unbootable.  It even killed the hard drive in the process.  How?  I don't know.  But if you buy Dell, make sure you add the extended warranty.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;As impractical as a complete crash and burn is, it was also an excellent opportunity to do an upgrade of the operating system.  I opted to go for broke, and asked for Vista 64-bit.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Compatiblity wise this is a doubly complicated upgrade.  Firstly the changed Vista security model, and secondly a 64-bit kernel.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Xerox has not released neither a Vista nor a 64-bit driver for &lt;a href="http://google.com/search?q=Xerox+Phaser+6120"&gt;my printer&lt;/a&gt;.  Impediment?  Not so.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;My printer talks &lt;a href="http://en.wikipedia.org/wiki/PostScript"&gt;PostScript&lt;/a&gt;, an industry standard for computers and printers to exchange print ready data.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Any decent operating system is fully able to produce postscript data, and provides the necessary software and drivers out of the box.  All that is needed is the &lt;a href="http://en.wikipedia.org/wiki/PostScript_Printer_Description"&gt;PPD file&lt;/a&gt; describing the capabilities of the printer in question, like duplex printing, input trays, paper sizes and print quality.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So, as long as Xerox is willing to sell supplies and the printer doesn't burn, I'll always be able to upgrade. Driver or no driver.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;As for Vista in general? Visual improvement, and many things work better than on XP. And being 64 bit I finally get to use the last 512MB of the memory...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-5039659987932019616?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=bEBCR-1TMeE:0YhIEL7uKRY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=bEBCR-1TMeE:0YhIEL7uKRY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=bEBCR-1TMeE:0YhIEL7uKRY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=bEBCR-1TMeE:0YhIEL7uKRY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=bEBCR-1TMeE:0YhIEL7uKRY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=bEBCR-1TMeE:0YhIEL7uKRY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=bEBCR-1TMeE:0YhIEL7uKRY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/5039659987932019616/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/why-adhering-to-established-standards.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5039659987932019616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5039659987932019616?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/why-adhering-to-established-standards.html" title="Why adhering to established standards is always a Good Thing" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CkIDQXs-cCp7ImA9WxVbF0g.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-634438465861000592</id><published>2009-03-21T10:46:00.002+01:00</published><updated>2009-04-03T11:22:50.558+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-03T11:22:50.558+02:00</app:edited><title>Her lekker det</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://4.bp.blogspot.com/_6m61GL21m8M/ScS3fcFcYpI/AAAAAAAABpk/oE7URckNEws/s1600-h/image-upload-383-796914.jpg"&gt;&lt;img src="http://4.bp.blogspot.com/_6m61GL21m8M/ScS3fcFcYpI/AAAAAAAABpk/oE7URckNEws/s400/image-upload-383-796914.jpg" /&gt;&lt;/a&gt;
&lt;span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span&gt;Vanntrykket falt, og etter en del leting ble lekkasjen påvist. Nå er det bare å vente til snøen forsvinner før vi kan grave opp hagen.. &lt;/span&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-634438465861000592?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=6IMWjyxYDKw:plMRDjxfuiU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=6IMWjyxYDKw:plMRDjxfuiU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=6IMWjyxYDKw:plMRDjxfuiU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=6IMWjyxYDKw:plMRDjxfuiU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=6IMWjyxYDKw:plMRDjxfuiU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=6IMWjyxYDKw:plMRDjxfuiU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=6IMWjyxYDKw:plMRDjxfuiU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/634438465861000592/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/her-lekker-det.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/634438465861000592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/634438465861000592?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/her-lekker-det.html" title="Her lekker det" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_6m61GL21m8M/ScS3fcFcYpI/AAAAAAAABpk/oE7URckNEws/s72-c/image-upload-383-796914.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;DUACSHk-eyp7ImA9WxVUFEs.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-6828946516405048451</id><published>2009-03-19T14:02:00.001+01:00</published><updated>2009-03-19T14:02:49.753+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-19T14:02:49.753+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>The Positive Legacy of C++ and Java</title><content type="html">&lt;div&gt;Java might have a limited lifespan as a language, but the JVM ensures that it will have a role even after that.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=252441"&gt;The Positive Legacy of C++ and Java&lt;/a&gt;: &lt;blockquote&gt;"Java itself will diminish, just as C++ did, to be used in special cases (or perhaps just to support legacy code, since it doesn't have the same connection to hardware as C++ does). But the unintentional benefit, the true accidental brilliance of Java is that it has created a very smooth path for its own replacements, even if Java itself has reached the point where it can no longer evolve. All future languages should learn from this: either create a culture where you can be refactored (as Python and Ruby have done) or allow competitive species to thrive."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-6828946516405048451?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=Jbo0Ciwov9E:_I9H8ytvIbU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=Jbo0Ciwov9E:_I9H8ytvIbU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=Jbo0Ciwov9E:_I9H8ytvIbU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=Jbo0Ciwov9E:_I9H8ytvIbU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=Jbo0Ciwov9E:_I9H8ytvIbU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=Jbo0Ciwov9E:_I9H8ytvIbU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=Jbo0Ciwov9E:_I9H8ytvIbU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/6828946516405048451/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/positive-legacy-of-c-and-java.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/6828946516405048451?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/6828946516405048451?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/positive-legacy-of-c-and-java.html" title="The Positive Legacy of C++ and Java" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CkAFQ3c6fyp7ImA9WxVUEUQ.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-178895722977501078</id><published>2009-03-16T09:02:00.001+01:00</published><updated>2009-03-16T09:05:12.917+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-16T09:05:12.917+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Java Specialist Master Course</title><content type="html">&lt;p&gt;Last week I attended Dr. Heinz M. Kabutz' &lt;i&gt;Java Specialist Master Course&lt;/i&gt;, which my employer held as an on-site course.  These are my field notes from this training.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;I strongly recommend this course if you're fluent in Java, but want to take it one step further or remind yourself of some of the advanced features or intricacies.&lt;/p&gt;&lt;h1&gt;
  Day One
&lt;/h1&gt;
&lt;h2&gt;
  Multi-Threading&lt;br&gt;
&lt;/h2&gt;
&lt;p&gt;
  TreadGroup: Stay away!   Not really usable.
&lt;/p&gt;
&lt;p&gt;
  &lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
  A thread can also wake up without being notified, interrupted, or timing out, a so-called &lt;i&gt;spurious wakeup&lt;/i&gt;. While this will &lt;span style="BACKGROUND-COLOR:#ffff00"&gt;rarely occur in practice&lt;/span&gt;, applications must guard against it by testing for the condition that should have caused the thread to be awakened, and continuing to wait if the condition is not satisfied. In other words, waits should always occur in loops, like this one:
&lt;/p&gt;
&lt;pre&gt;     synchronized (obj) {
         while (&amp;lt;condition does not hold&gt;)
             obj.wait(timeout);
         ... // Perform action appropriate to condition
     }&lt;/pre&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;div&gt;
  You cannot break out of a &lt;span style="FONT-FAMILY:'Courier New'"&gt;synchronized&lt;/span&gt; block in a safe way.  If you do, the JVM will be in an unsafe state.  The Java 5 locks are much safer.
&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;
  Synchronizing on &lt;span style="FONT-FAMILY:'Courier New'"&gt;this&lt;/span&gt; is very dangerous:  There's always someone who holds a reference to you (or you would be garbage collected).  If they use you as a lock, they can effectively lock you out.  They can also &lt;span style="FONT-FAMILY:'Courier New'"&gt;notify()&lt;/span&gt; you, confusing the internal work flow.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  Locking on specific lock instances is always easier to get correct.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  Java 5 locks &lt;b&gt;must&lt;/b&gt; be wrapped in a try / finally block -- &lt;b&gt;always&lt;/b&gt;.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  Lock with WAITING state instead for BLOCKING state:  &lt;span style="FONT-FAMILY:'Courier New'"&gt;lock.lockinterruptibly()&lt;/span&gt;.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  Deadlock: lock.tryLock(long,TimeUnit) can give false deadlock warnings in JConsole.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  Thread priorities cannot be relied upon.  They can cause starvation, and not all operating systems have a direct mapping between Java thread priorities and OS priorities.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;span style="FONT-FAMILY:'Courier New'"&gt;volatile&lt;/span&gt; makes race conditions worse.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  The value of a ThreadLocal is stored with the thread.
&lt;/div&gt;
&lt;div&gt;
  &lt;br&gt;
&lt;/div&gt;
&lt;div&gt;
  Usually not recommended to introduce fairness in Java. Starvation is usually not a problem, and the performance impact is significant.  The OS scheduler does a good job at ensuring fairness.&lt;/div&gt;
&lt;h1&gt;
  Day Two
&lt;/h1&gt;
&lt;h2&gt;
  Java IO
&lt;/h2&gt;
&lt;p&gt;
  Java Input and Output Streams have been designed using Decorator, where additional classes add functionality to underlying streams.  Without this we would have extremely many permutations of these classes.
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;It is only necessary to &lt;span style="font-family: 'Courier New';"&gt;close()&lt;/span&gt; the instance on top of this decorated chain. Closing the input or output stream on a socket will also close the underlying socket.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;ObjectOutputStream has two caveats:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The caching for previously written objects is not bounded, and can result in an OutOfMemoryError&lt;/li&gt;&lt;li&gt;If you change an object after it has been written, this change will not be picked up and written.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;ObjectInputStream also cache objects in an unbounded Hashtable, and can get an OutOfMemoryError.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;SerialVersionUID is a hash of both fields and methods.  Adding a method will also change it!&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;readResolve()&lt;/span&gt; and &lt;span style="font-family: 'Courier New';"&gt;writeReplace()&lt;/span&gt; overrides the default serialization input or output form.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Externalizable classes are very easy to hack.  The public read / write methods could be called from anyone to either extract its private contents or inject fabricated data into an instance.&lt;/div&gt;&lt;br&gt;&lt;div&gt;Versioned serialization:  Write a version number to the head of the stream, and switch on this version number when you read the object back.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;writeObject()&lt;/span&gt; / &lt;span style="font-family: 'Courier New';"&gt;readObject()&lt;/span&gt; can have roughly the same performance benefit as &lt;span style="font-family: 'Courier New';"&gt;Externalizable&lt;/span&gt;.&lt;/div&gt;&lt;br&gt;&lt;div&gt;Roedy Green: &lt;a href="http://mindprod.com/jgloss/serialization.html"&gt;http://mindprod.com/jgloss/serialization.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h2&gt;Java NIO&lt;/h2&gt;You read or write as much data from / to a channel as you can &lt;i&gt;without blocking&lt;/i&gt;. So a thread busy transfering data would spend less time waiting for data. But there is a risk of spin looping if either the source or target is unable to accept data, but isn't closed.&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Direct allocation and MappedByteBuffer uses the C heap, not the Java heap.  Overallocating would therefore not cause a OutOfMemoryError, but virtual memory thrashing.&lt;/div&gt;&lt;h2&gt;Java Memory&lt;/h2&gt;&lt;p&gt;Premature tenuring can be a real performance problem.  If the survivor spaces are slightly too small, and you hold on to your objects slightly too long, the survivor spaces get contended, and objects get tenured (moved to the old gen tenured space) too soon.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;This &lt;i&gt;can&lt;/i&gt; be fixed by tuning the survivor space sizes.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;When tuning GC logs: Chop off the startup phase of the JVM -- it can confuse the steady state behavior.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Problems with JConsole:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;It takes snapshots.  A lot can happen between snapshots.&lt;/li&gt;&lt;li&gt;It cannot connect to a JVM which is having problems.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Tuning JVM&lt;/h2&gt;&lt;p&gt;Don't confuse memory leaks with loitering objects (objects that just stick around longer than necessary).&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Recommended heap size:  10% larger than steady state.&lt;/p&gt;&lt;h1&gt;Day Three&lt;/h1&gt;&lt;h2&gt;References&lt;/h2&gt;&lt;p&gt;What is the size of a Boolean (64-bit)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;16 bytes for an object&lt;/li&gt;&lt;li&gt;1 byte for the boolean value.  This is rounded up to the nearest 8 bytes&lt;/li&gt;&lt;li&gt;Total: 24 bytes&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Finalizers: 80 bytes overhead per instance.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;References makes object stay around longer than necessary, thereby leaking into old space.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Phantom references &lt;i&gt;must&lt;/i&gt; be cleared, and &lt;i&gt;must&lt;/i&gt; be constructed with a reference queue.&lt;/div&gt;&lt;h2&gt;Object Pooling&lt;br&gt;&lt;/h2&gt;&lt;div&gt;Object Pooling is like ceramic mugs compared to disposable cups. It has a higher initial cost, and also a maintenance cost.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Generally used only in two cases: Thread pools and database connection pools.&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Reflection API&lt;br&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;Class.getDeclaredFields()&lt;/span&gt; uses a different SecurityManager permission than &lt;span style="font-family: 'Courier New';"&gt;Class.getFields()&lt;/span&gt;.  It is thus possible that the former is not allowed; only the latter.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span style="font-family: 'Courier New';"&gt;Class.newInstance()&lt;/span&gt; has dangerous side effects.  It can throw checked exceptions that aren't declared!  The culprit is this:&lt;div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        // Run constructor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        try {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;            return tmpConstructor.newInstance((Object[])null);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        } catch (InvocationTargetException e) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;            Unsafe.getUnsafe().throwException(e.getTargetException());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;            // Not reached&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;            return null;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;It is generally safer to use &lt;span style="font-family: 'Courier New';"&gt;Class.getConstructor().newInstance()&lt;/span&gt; and catch the InvocationTargetException wrapping this checked exception.&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Changing a final field through &lt;span style="font-family: 'Courier New';"&gt;setAccessible(true)&lt;/span&gt; is currently possible, but this might change.  Also, changing a final field might not be visible everywhere, since the Hotspot compiler can cache or inline the value of this final field.&lt;/div&gt;&lt;br&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;java.util.Arrays.copyOfRange(T[], int, int)&lt;/span&gt; -- return a subarray.  There's also a method where you can declare the return type.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;java.lang.Class.getComponentType()&lt;/span&gt; returns the type of the array members, and null if the class is not an array.&lt;/div&gt;&lt;h2&gt;Dynamic Proxies&lt;/h2&gt;The Method instance is linked to the declaring class (or interface), &lt;i&gt;not&lt;/i&gt; to the &lt;b&gt;implementing&lt;/b&gt; class or instance.  This means this can be passed from the InvocationHandler to the actual implementation you are facading.&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;A generic factory for dynamic proxies:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;import java.lang.reflect.InvocationHandler;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;import java.lang.reflect.Proxy;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;public class ProxyFactory {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;    public static &amp;lt;T&gt; T proxy(Class&amp;lt;T&gt; type, final T obj, final InvocationHandler handler,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;            Class&amp;lt;?&gt;... otherInterfaces) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        return type.cast(Proxy.newProxyInstance(type.getClassLoader(),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;                merge(type, otherInterfaces), handler));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;    private static Class&amp;lt;?&gt;[] merge(Class&amp;lt;?&gt; first, Class&amp;lt;?&gt;[] rest) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        Class&amp;lt;?&gt;[] result = new Class&amp;lt;?&gt;[rest.length + 1];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        result[0] = first;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        System.arraycopy(rest, 0, result, 1, rest.length);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;        return result;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Courier New';"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Data Structures&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;CopyOnWriteArrayList is faster for iterating than the regular ArrayList, but much more expensive for modifications.&lt;h3&gt;Sorting&lt;br&gt;&lt;/h3&gt;&lt;p&gt;Java uses merge sort because of overall good performance. Quick sort is often faster, but can be much slower in the worst cases, one being if the list is already sorted.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1.4+ HashMap bit masking was originally introduced for performance reasons, but over time the bit mixing has become more complex, thus closing this performance gap.  The end result is that the hashing is completely unpredictable and much harder to understand.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'Courier New';"&gt;equals()&lt;/span&gt; should cover all attributes of an object, but &lt;span style="font-family: 'Courier New';"&gt;hashCode()&lt;/span&gt; doesn't need to.  Find the attributes that most uniquely identify your instance.&lt;/p&gt;&lt;h3&gt;Generics&lt;br&gt;&lt;/h3&gt;&lt;p&gt;&amp;lt;N extends Number&gt; means that you now can call methods on Number using N:  N n; n.doubleValue();&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Generics sometimes produce very confusing compiler errors.&lt;/p&gt;&lt;h3&gt;Other Structures&lt;/h3&gt;&lt;p&gt;A LinkedHashMap normally orders elements by insertion order, but can also be set up to order elements by access order, placing most accessed elements first.  This can be used to create a LRU cache.&lt;/p&gt;&lt;h2&gt;Exceptions&lt;/h2&gt;RuntimeException's original definition was "exceptions thrown by the Runtime to protect itself from your code."&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Checked exceptions were designated for errors where there would be some corrective action.&lt;/div&gt;&lt;br&gt;&lt;div&gt;It is always a bad idea to use exceptions for flow control.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;An uncaught exception handler can be used to restart a thread replacing the one that just died, continuing its work.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h1&gt;Day Four&lt;/h1&gt;&lt;h2&gt;Critical Errors Inside the JVM&lt;/h2&gt;&lt;p&gt;What to do when the JVM dies:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Upgrade to a later version of the JRE&lt;/li&gt;&lt;li&gt;Examine the hs_err file, find out what was causing the problem, and change your code so that it doesn't provoke this behaviour&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;To analyze the hs_err file, take a look at &lt;a id="id_4" href="http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/TSG-VM.pdf" target="_blank" title="http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/TSG-VM.pdf"&gt;http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/TSG-VM.pdf&lt;/a&gt; &lt;/div&gt;&lt;h2&gt;Best Practices for Exceptions&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Checked vs unchecked&lt;/li&gt;&lt;li&gt;Custom exceptions -- avoid when possible&lt;/li&gt;&lt;li&gt;Wrap (chain) low level exceptions&lt;/li&gt;&lt;li&gt;Don't swallow exceptions!&lt;/li&gt;&lt;li&gt;Cleanup after an exception -- in the finally block&lt;/li&gt;&lt;li&gt;Never abuse exceptions for flow control&lt;/li&gt;&lt;li&gt;Exceptions management strategy is a vital element of code reviews and post mortem analysis&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Exceptions thrown in a finally block will hide the original exception.&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Assertions&lt;/h2&gt;&lt;p&gt;Ensure you avoid side-effects : assertions could always be disabled, effectively disabling this statement.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;You could assert that you hold the lock as expected:  assert Thread.currentThread().holdsLock(lock)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;When using assertions, the entire system must be tested &lt;i&gt;both&lt;/i&gt; with assertions enabled &lt;i&gt;and&lt;/i&gt; disabled.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Useful to verify preconditions, postconditions, and class invariants.&lt;/p&gt;&lt;h2&gt;Java Optimizations&lt;/h2&gt;&lt;p&gt;Order of importance for performance improvements:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Design and architecture&lt;/li&gt;&lt;li&gt;Algorithm selection&lt;/li&gt;&lt;li&gt;Code implementation&lt;/li&gt;&lt;li&gt;System configuration&lt;/li&gt;&lt;li&gt;System infrastructure&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Good design should win over performance.  The Hotspot is very good at optimizing "normal" code, but could struggle if the code is cryptic. By coding in a complex way, you can make the performance worse than the clean and simple way.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Measure, don't guess.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Performance improvements &amp;lt;15% are typically not noticeable.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Specify your target, so you know when to stop.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Top five bottlenecks, find the easiest one, and fix this.  Rinse and repeat.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Record everything.  Use paper or some other means independent of the test setup.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Start by looking at hardware -- CPU, memory usage, I/O.  Locate any bottlenecks on the hw level.  Most performance problems appear as CPU bottlenecks.&lt;br&gt;&lt;/li&gt;&lt;li&gt;Then look at JVM level: threads, memory usage, garbage collection.&lt;/li&gt;&lt;li&gt;Application level: Basically lock contention.&lt;/li&gt;&lt;li&gt;People level: study usage pattern, arrival rates.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br&gt;&lt;div&gt;Beware of Hotspot effects.  Discard the first few results of a run.  Look at the variance to determine whether the test is deterministic.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Work around GC interference: Larger initial heap size, forciby run System.gc() periodically.  Sleep a while after the gc, at least 100ms, ideally 2 seconds.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Compare -client vs -server vs -Xint&lt;/div&gt;&lt;h3&gt;The HotSpot compiler&lt;/h3&gt;&lt;div&gt;Two levels of compilation: Just-In-Time compilation replaces bytecodes with machine instructions. The HotSpot compiler profiles the running application, directing the JIT on how to compile based on an execution profile.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;-Xcomp compiles everything to native.  This is generally slower, since it compiles too much, like methods invoked only once.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Bi-morphic: special case of polymorphism if only two implementations of a certian function is available.  The method dispatch is simplified into an if / else statement.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The cost of a method call: 0 if only one implementation exists, little if two implementations exist, more if three or more implementations exist.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;The thread must stop while the On Stack Replacement is performed.&lt;/div&gt;&lt;h3&gt;Problem Areas&lt;/h3&gt;&lt;p&gt;The two major problem areas are excessive &lt;i&gt;looping&lt;/i&gt; and excessive &lt;i&gt;object creation&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Special byte codes to handle the first four arguments and local variables. Long and double counts as two.  Move most-used variables into these slots.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Object Pooling usable only for expensive resources (files, sockets, connections, threads)&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;You don't save memory by using substring(), since this new String instance would share the char[].  You'd need to create a new String.&lt;/p&gt;&lt;h2&gt;Profiling Tools&lt;/h2&gt;hprof is bundled with the JVM. Can do cpu and heap profaling.  Its output can be read by many tools.&lt;h2&gt;Logging&lt;/h2&gt;&lt;p&gt;Don't write your own logging framework....&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Mentions Commons Logging, but fails to mention that Commons Logging is hated by many developers: &lt;a href="http://www.qos.ch/logging/thinkAgain.jsp"&gt;http://www.qos.ch/logging/thinkAgain.jsp&lt;/a&gt;.  Also it is claimed to have memory leaks: &lt;a href="http://www.szegedi.org/articles/memleak.html"&gt;http://www.szegedi.org/articles/memleak.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Also describes setting up logger statically per class, with some tricks involving a stack trace to get the class name.  It is probably better to have a transient instance field.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;SLF4J is also a wrapper API, enabling you to select logging implementation at runtime through the classpath. But SLF4J is more modern.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;For Log4J he mentions only the properties format, and not the XML format, which is more structured.&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;Logging guards: use log.ifXXXEnabled() before your log statement.  One neat trick is to create an aspect, inserting this code for you.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Varargs has a performance side effect.  It will create an Object[] containing object instances of all parameters.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;With asynchronous logging you would loose the most interesting messages if the JVM crashes.&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-178895722977501078?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FCVcDhEqCJw:ybvVV5F8cYQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FCVcDhEqCJw:ybvVV5F8cYQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=FCVcDhEqCJw:ybvVV5F8cYQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FCVcDhEqCJw:ybvVV5F8cYQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=FCVcDhEqCJw:ybvVV5F8cYQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FCVcDhEqCJw:ybvVV5F8cYQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=FCVcDhEqCJw:ybvVV5F8cYQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/178895722977501078/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/java-specialist-master-course.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/178895722977501078?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/178895722977501078?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/03/java-specialist-master-course.html" title="Java Specialist Master Course" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;D0IFQHo5fip7ImA9WxVWEEg.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-4561423997445465609</id><published>2009-02-19T15:43:00.005+01:00</published><updated>2009-02-19T15:58:31.426+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T15:58:31.426+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ie6" /><title>Bruker du IE6?  Slutt!</title><content type="html">&lt;div&gt;Dersom du fortsatt bruker Internet Explorer 6:  Nå er det på tide å slutte med det.  Dersom du er forhindret fra å oppgradere Internet Explorer -- bytt til en annen nettleser!&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://www.tu.no/it/article200622.ece"&gt;tu.no - Microsoft støtter IE6-kampanjen - Teknisk Ukeblad&lt;/a&gt;: &lt;blockquote&gt;"Det pågår en &lt;a href="http://www.tu.no/it/article200342.ece"&gt;omfattende kampanje &lt;/a&gt;for å fåbrukere som fortsatt bruker Internet Explorer 6 til å oppgradere til en nyere versjon, eventuelt bytte.

Den &lt;a href="http://www.tu.no/it/article199563.ece"&gt;gamle nettleseren skaper store problemer &lt;/a&gt;for alle nettsteder fordi utviklerne må bruke mye tid på testing og spesialtilpasning til en nettleser som ble lansert helt tilbake i 2001.

Microsoft erklærte i fjor at de nå satser for fullt på åpenhet og på å følge åpne standarder, og sier til Teknisk Ukeblad at de støtter den pågående IE6-kampanjen fullt ut"&lt;/blockquote&gt;
For mer informasjon, se &lt;a href="http://ie6.forteller.net/"&gt;ie6.forteller.net&lt;/a&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Her er noen av nettleserne du kan velge imellom:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/norge/windows/ie/downloads/default.mspx"&gt;Internet Explorer 7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/chrome"&gt;Google Chrome&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://opera.com"&gt;Opera&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.apple.com/safari/"&gt;Safari&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-4561423997445465609?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fvgUtlwbs-M:XG7Vs5DTPwo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fvgUtlwbs-M:XG7Vs5DTPwo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=fvgUtlwbs-M:XG7Vs5DTPwo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fvgUtlwbs-M:XG7Vs5DTPwo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=fvgUtlwbs-M:XG7Vs5DTPwo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fvgUtlwbs-M:XG7Vs5DTPwo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=fvgUtlwbs-M:XG7Vs5DTPwo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/4561423997445465609/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/02/bruker-du-ie6-slutt.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/4561423997445465609?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/4561423997445465609?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/02/bruker-du-ie6-slutt.html" title="Bruker du IE6?  Slutt!" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;D04GQ3o7eyp7ImA9WxVRF00.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-2329712423423949272</id><published>2009-01-23T11:17:00.002+01:00</published><updated>2009-01-23T11:18:42.403+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-23T11:18:42.403+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="build" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="broken" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><category scheme="http://www.blogger.com/atom/ns#" term="svn" /><title>An automatic way to figure out which commit broke the build</title><content type="html">&lt;a href="http://blogs.atlassian.com/developer/2009/01/git_bisect.html"&gt;Atlassian Developer Blog - git bisect...&lt;/a&gt;: &lt;blockquote&gt;"JIRA's Clover Code Coverage build is scheduled to run once a day. Yesterday someone checked in something that broke 194 tests. The problem is there were 18 commits by 7 unique authors and none of the commits come with a helpful message like 'Warning, this commit is the one that will break the coverage build!'
To try to narrow down which of the commits was the problem, I decided to use an automated bisection of commits.
git comes with a built-in utility called bisect. This isn't unique to git. You can even do it with subversion via svn-bisect. The idea is that you tell it a good revision and a bad revision and then git helps you perform a binary search to narrow down exactly which commit broke things."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-2329712423423949272?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=H-UwtZQXvgU:XmoCQ-1f4Fs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=H-UwtZQXvgU:XmoCQ-1f4Fs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=H-UwtZQXvgU:XmoCQ-1f4Fs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=H-UwtZQXvgU:XmoCQ-1f4Fs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=H-UwtZQXvgU:XmoCQ-1f4Fs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=H-UwtZQXvgU:XmoCQ-1f4Fs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=H-UwtZQXvgU:XmoCQ-1f4Fs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/2329712423423949272/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/en-automatisk-mte-finne-ut-hvilken.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/2329712423423949272?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/2329712423423949272?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/en-automatisk-mte-finne-ut-hvilken.html" title="An automatic way to figure out which commit broke the build" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;CUEGSXY9eyp7ImA9WxVRF00.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-934530540142736842</id><published>2009-01-23T10:40:00.001+01:00</published><updated>2009-01-23T10:40:28.863+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-23T10:40:28.863+01:00</app:edited><title>Change has come</title><content type="html">Front pages all over the world after Barack Obama's Inauguration Day in january 2009, viewed as a zoomable portait of Obama.&lt;br/&gt;&lt;br/&gt;&lt;a href='http://change.urkemedia.com/'&gt;read more&lt;/a&gt; | &lt;a href='http://digg.com/2008_us_elections/Change_has_come_4'&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-934530540142736842?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oImDKvHaHBQ:qLYm-HsqRx0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oImDKvHaHBQ:qLYm-HsqRx0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=oImDKvHaHBQ:qLYm-HsqRx0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oImDKvHaHBQ:qLYm-HsqRx0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=oImDKvHaHBQ:qLYm-HsqRx0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oImDKvHaHBQ:qLYm-HsqRx0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=oImDKvHaHBQ:qLYm-HsqRx0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/934530540142736842/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/change-has-come.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/934530540142736842?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/934530540142736842?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/change-has-come.html" title="Change has come" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;C0UFQX0zcCp7ImA9WxVREU0.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-1372732516628524744</id><published>2009-01-16T11:20:00.001+01:00</published><updated>2009-01-16T11:20:10.388+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-16T11:20:10.388+01:00</app:edited><title>Linnea og Elvira</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://1.bp.blogspot.com/_6m61GL21m8M/SXBfWaxBGVI/AAAAAAAABYM/dBWwhxCkAu0/s1600-h/image-upload-8-708997.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_6m61GL21m8M/SXBfWaxBGVI/AAAAAAAABYM/dBWwhxCkAu0/s400/image-upload-8-708997.jpg"/&gt;&lt;/a&gt;
&lt;span&gt;Aketur i masse snø&lt;/span&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-1372732516628524744?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=vtg_iWgTclw:z03yRWUUrL0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=vtg_iWgTclw:z03yRWUUrL0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=vtg_iWgTclw:z03yRWUUrL0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=vtg_iWgTclw:z03yRWUUrL0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=vtg_iWgTclw:z03yRWUUrL0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=vtg_iWgTclw:z03yRWUUrL0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=vtg_iWgTclw:z03yRWUUrL0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/1372732516628524744/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/linnea-og-elvira.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1372732516628524744?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/1372732516628524744?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/linnea-og-elvira.html" title="Linnea og Elvira" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_6m61GL21m8M/SXBfWaxBGVI/AAAAAAAABYM/dBWwhxCkAu0/s72-c/image-upload-8-708997.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry><entry gd:etag="W/&quot;Ck4FRHk_eSp7ImA9WxVREU0.&quot;"><id>tag:blogger.com,1999:blog-5127857.post-5625258747381094466</id><published>2009-01-16T11:12:00.002+01:00</published><updated>2009-01-16T11:15:15.741+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-16T11:15:15.741+01:00</app:edited><title>Skøyter på Veslevann</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;a href="http://3.bp.blogspot.com/_twYbyYCU3sk/SXBdikcasuI/AAAAAAAAAAM/1NoLbG8BPCE/s1600-h/image-upload-10-746482.jpg"&gt;&lt;img src="http://3.bp.blogspot.com/_twYbyYCU3sk/SXBdikcasuI/AAAAAAAAAAM/1NoLbG8BPCE/s320/image-upload-10-746482.jpg" /&gt;&lt;/a&gt;
Vi var ute og skøytet på Veslevann i romjulen.  Isen var kjempeflott!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5127857-5625258747381094466?l=blog.asgeirnilsen.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=uEYrUJ5u3hk:lp8zR44sn3g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=uEYrUJ5u3hk:lp8zR44sn3g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=uEYrUJ5u3hk:lp8zR44sn3g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=uEYrUJ5u3hk:lp8zR44sn3g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?i=uEYrUJ5u3hk:lp8zR44sn3g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=uEYrUJ5u3hk:lp8zR44sn3g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/asgeirn?a=uEYrUJ5u3hk:lp8zR44sn3g:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/asgeirn?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.asgeirnilsen.com/feeds/5625258747381094466/comments/default" title="Legg inn kommentarer" /><link rel="replies" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/skyter-p-veslevann.html#comment-form" title="0 Kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5625258747381094466?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5127857/posts/default/5625258747381094466?v=2" /><link rel="alternate" type="text/html" href="http://blog.asgeirnilsen.com/2009/01/skyter-p-veslevann.html" title="Skøyter på Veslevann" /><author><name>Asgeir S. Nilsen</name><uri>http://www.blogger.com/profile/09990435798930983334</uri><email>asgeirn@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="08959582694896526640" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_twYbyYCU3sk/SXBdikcasuI/AAAAAAAAAAM/1NoLbG8BPCE/s72-c/image-upload-10-746482.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /></entry></feed>
