<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Observations from Uppsala &#187; rant</title>
	<atom:link href="http://jakob.engbloms.se/archives/tag/rant/feed" rel="self" type="application/rss+xml" />
	<link>http://jakob.engbloms.se</link>
	<description>Computer Technology: Simulation, Virtualization, Virtual Platforms, Embedded, Multicore and Multiprocessing (by Jakob Engblom)</description>
	<lastBuildDate>Sun, 29 Jan 2012 19:45:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<image>
    <title>Observations from Uppsala</title>
    <url>http://jakob.engbloms.se/favicon.png</url>
    <link>http://jakob.engbloms.se</link>
    <width>32</width>
    <height>32</height>
    <description>Observations from Uppsala - http://jakob.engbloms.se</description>
    </image>		<item>
		<title>Can we Rely on C?</title>
		<link>http://jakob.engbloms.se/archives/885?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/885#comments</comments>
		<pubDate>Mon, 10 Aug 2009 07:49:04 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[computer simulation technology]]></category>
		<category><![CDATA[embedded software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Michael Barr]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=885</guid>
		<description><![CDATA[I have written several times on this blog about the odd propensity of the &#8220;EDA&#8221; business to consider the C and C++ languages &#8220;high level&#8221; languages. They are what I use almost daily for most of the demo-order programming I do, but I still don&#8217;t consider them very high-level. High-level for me is scripting (Python, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-166" style="margin: 5px 10px;" title="whyc" src="http://jakob.engbloms.se/wp-content/uploads/2008/07/whyc.png" alt="whyc" width="100" height="106" />I have written several times on this blog about the odd propensity of the &#8220;EDA&#8221; business to consider the C and C++ languages &#8220;high level&#8221; languages. They are what I use almost daily for most of the demo-order programming I do, but I still don&#8217;t consider them very high-level. High-level for me is scripting (Python, Lua, &#8230;) or domain-specific languages (DML, Lex, Yacc, MatLab, &#8230;) or model-driven development (UML, LabView, Simulink, &#8230;) or languages which at least provide sensible and reasonably safe semantics (Erlang, Java, &#8230;).</p>
<p>However, in fact, most the embedded industry and the &#8220;virtual platform&#8221; industry rely on C and C++ to get our daily jobs done. Question is, how much longer can we expect to do that? An interesting post at Embedded.com by Michael Barr brought back my argument that modeling needs to move up in levels of abstraction just like mainstream programming.</p>
<p><span id="more-885"></span></p>
<p>Michael Barr wrote the column &#8220;<a href="http://www.eetimes.eu/semi/218900394">Real Programmers Program in C</a>&#8220;, where he points out that knowledge of C is declining among computer science graduates. It is simply not efficient enough for simple mainstream work like creating web services and custom IT applications.</p>
<p style="padding-left: 30px;">Clever though he is, the young man admitted he wasn&#8217;t making that quote up on the spot. That &#8220;real men program in C&#8221; is part of a lingo he and his fellow computer science students developed while categorizing the usefulness of the various programming languages available to them. Exploring a bit, I learned the quiche-like phrase assigns both a high difficulty factor to the C language and a certain age group to C programmers. Put simply, C was too hard for programmers of their generation to bother mastering.</p>
<p>Obviously, if you take this argument to the extreme, you end up with the Monthy Python sketch where a bunch of old men are trying to trumph each other with the tough childhoods they had. In the end, they claim to have eaten just a handful of cold gravel for breakfast, walked 50 km to school, and having to clean the road each day&#8230; and kids these days, they just don&#8217;t understand&#8230;</p>
<p>But apart from the fact that kids in the western world today are very lazy and can&#8217;t stomach running 15km to school each day and therefore lack the toughness to match Kenyans in marathons there is a real issue here.</p>
<p style="padding-left: 30px;">The bottom line is that embedded programmers aren&#8217;t going to stop using C anytime soon. There are several reasons for this. First, C compilers are available for the vast majority of 8-, 16-, and 32-bit CPUs. Second, C offers just the right mix of low-level and high-level language features for programming at the processor and driver level. Until the use of C starts to turn down in future such surveys, C programming skills will remain important.</p>
<p>The issue is that universities are moving up in the efficiency scale of languages, teaching students good things rather than hard things. Not all universities do (and I am trying my best to lobby for keeping assembly language and device driver programming in the core computer science curriculum whenever I can), but it is clear that the market for &#8220;general IT stuff&#8221; is so much bigger that it will attract more students to &#8220;easy&#8221; languages like Ruby and VisualBasic.</p>
<p>So we need to move both embedded programming and virtual platform technology much more in this direction to maintain  a steady influx of smart people into the field. High-level synthesis of hardware and virtual platform models from a VisualBasic form? Sounds like a stretch&#8230;</p>
<p>We also need to jump into the education system and create the courses and motivate professors to teach lower-level languages. Not all are that familiar with actual practices in industry, unfortunately.</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/885"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/885" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/885" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/885/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Immigration, Visas, and other Hassles</title>
		<link>http://jakob.engbloms.se/archives/860?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/860#comments</comments>
		<pubDate>Sun, 26 Jul 2009 21:56:10 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[travel]]></category>
		<category><![CDATA[I-W94]]></category>
		<category><![CDATA[immigrations]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[visa]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=860</guid>
		<description><![CDATA[I have travelled to the United States more times than I care to remember now, starting back in 1997. Business tends to make me come here for the interesting, exciting, large events. Being here is usually a nice experience, but getting here is not. Apart from the bother of a 12-hour flight in economy class, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-861" title="passport icon" src="http://jakob.engbloms.se/wp-content/uploads/2009/07/passport-icon.png" alt="passport icon" width="106" height="103" />I have travelled to the United States more times than I care to remember now, starting back in 1997. Business tends to make me come here for the interesting, exciting, large events. Being here is usually a nice experience, but getting here is not. Apart from the bother of a 12-hour flight in economy class, there is the <span style="color: #339966;"><strong>green form called I-W94</strong></span>.</p>
<p><span id="more-860"></span>For those that do not know, it is the immigration form you fill in in order to be allowed to enter the US without a visa. It applies to the lucky countries that have a visa waiver agreement with the US, which includes most of the &#8220;Western World&#8221; as far as I understand.</p>
<p>It is not really the filling in that bothers me, it is fairly straightforward. It is the idea that you are somehow considered a suspicious person for traveling to the US. Why do I have to answer questions like &#8220;have you been involved in war crimes&#8221; just to enter the country? The first time  I saw it, I laughed so hard it hurt. For a Swede, the idea that you have a formal interrogation of people coming into a country was not expected at all.  The subtext of the I-W94 is really that you do not feel particularly welcome. When US citizens go to Europe, they don&#8217;t have to suffer any of this procedure, apart from a cursory passport check.</p>
<p>I had never seen that before, traveling around in Europe for more than twenty years. Since then, I have seen such procedures in a few other places in the world. I have even got a real visa in my passport, which was needed for going to mainland China. Getting a visa felt like a really strange experience, which I guess indicates my mostly boring and limited choice of travel destinations to the &#8220;western world&#8221;. After all, visa-free travel for a Swede is only available for the EU, US, Korea, Japan, and some other places. India, China, and Russia all require visa, for example.</p>
<p>I guess this really shows just how spoiled we are in Europe. Indeed, I almost consider the idea that I would need a passport to travel around offensive, as that was not required between the Nordic countries. When I was living in Iceland in 1989-1990, it was sufficient to go by the passport control booth shouting &#8220;Sáenskur&#8221; (Swede). No checks, no custom, no silliness. Also, up in the north of Sweden, I could easily ski into and out of Norway on a day trip, across open mountains where there was no way to put in a customs or passport check.</p>
<p>Traveling on the continent today, borders are wonderfully open and you do not expect any kind of inhibitions. Once, we drove across the border from Belgium to the Netherlands, and were surprised when our ongoing mobile phone conversations were dropped. Apparently, cross-border automatic roaming hand-off was not supported by GSM. Disappointing. But only then did we notice that we had entered a different country&#8230;</p>
<p>However, things did not use to be that simple. Last year, I saw the 1960&#8242;s movie &#8220;The Jackal&#8221;. In the movie, the French police is tracing the suspected assassin by checking the border crossing lists of people who have entered France, as well as collecting the check-in records of Paris hotels. This is really just about forty years ago, and at that time we still had border checks even between friends like Italy and France! Today, that is unthinkable, which does show just how far things have progressed.</p>
<p>On a historical note, one should note that the idea of passports and border controls is fairly recent. As I understand it, borders around the world and in Europe were open until the advent of World War I. Only after this did nations start to suspect each other enough to start asking for passports and visas to enter countries. If you read <em>Around the world in eighty days</em> by Jules Verne, I cannot recall any mention of immigration checks&#8230;</p>
<p>What added some extra silliness to the US system this time around was that I had to enter the information found on the I-W94 form ahead of time in the new &#8220;ESTA&#8221; system. I had a vague hope that this would replace the paper form, but no such luck. I had to enter the same information again&#8230; if we have to do it ahead of time, couldn&#8217;t we at least not be spared the manual paperwork? Just print out some receipt code and hand that to immigrations?</p>
<p>To sum up, I think more of the world should adopt the EU model. Why bother with immigration forms and visas and other such stuff? It just makes visitors feel less welcome, and would not seem to solve any important problem in terms of stopping unsavioury individuals from entering a country (if that is indeed the purpose).</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/860"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/860" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/860" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/860/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The EU Election, Pirates, and Society</title>
		<link>http://jakob.engbloms.se/archives/796?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/796#comments</comments>
		<pubDate>Sat, 30 May 2009 20:07:24 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[Politics]]></category>
		<category><![CDATA[EU]]></category>
		<category><![CDATA[EU Election]]></category>
		<category><![CDATA[Folkpartiet]]></category>
		<category><![CDATA[Miljöpartiet]]></category>
		<category><![CDATA[Piratpartiet]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=796</guid>
		<description><![CDATA[Next week (June 7) is the election date for the EU parliament for the next five-year term. As a citizen of the EU and Sweden, I feel it is my civic duty to vote&#8230; but the quality of the election campaign so far does not exactly encourage it. As in many other EU countries, the [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-797" style="margin: 5px;" title="toppage_logo_sv" src="http://jakob.engbloms.se/wp-content/uploads/2009/05/toppage_logo_sv.jpg" alt="toppage_logo_sv" width="110" height="101" />Next week (June 7) is the election date for the EU parliament for the next five-year term. As a citizen of the EU and Sweden, I feel it is my civic duty to vote&#8230; but the quality of the election campaign so far does not exactly encourage it. As in many other EU countries, the EU and its parliament feels like a distant power hard to affect, and the EU election process tends to be more about domestic issues than true EU-level issues. Even so, there is one relevant, interesting, and burning topic that has come to the fore. Intellectual property rights and &#8220;media piracy&#8221;.</p>
<p><span id="more-796"></span>Thanks to &#8220;<a href="http://www.piratpartiet.se/">Piratpartiet</a>&#8220;, and the recent Pirate Bay trial, file-sharing of media and the laws and enforcement procedures against it is a very hot topic. There is a strong current of thinking that it is hard to outlaw an entire generation of kids, which has some logic to it. There is also a strong backlash against the heavy-handed way that the media companies are enforcing their rights, and way in which lawmakers across the EU are bending over to accomodate the media companies. Laws that make it possible to cut off someones Internet access just because some company claims they are copying media files, with no trial to prove their guilt, are not making tech-savvy people happy. For a good reason. All of this is leading up to making &#8220;Internet freedom&#8221; a key issue in the campaign here in Sweden.</p>
<p>What is nice with this is that it is actually a topic over which the EU parliament has some say. Some other topics, like jobs, which the <a href="http://www.socialdemokraterna.se/">Social democrats </a>are using as their focus in the campaign are simply completely out of the domain of the parliament. Needless to say, that kind of posturing mostly for the domestic market will not win my vote.</p>
<p>But I find the debate around &#8220;piracy&#8221; very worrying in some ways. The problem is that there are a lot of people who seem to think that copyright as a concept is wrong. Crazy and false notions like &#8220;copyright is a state-sponsored monopoly&#8221; pop up quite commonly. Making my living from selling software, I feel this kind of lack of respect for the intellectual property of others quite disturbing.</p>
<p>Disliking the way current laws and media companies are treating piracy is one thing. Claiming that we should abolish a central part of our modern knowledge-based economy is quite  a different issue.The logic and dynamics of the debate is very interesting. From the idea that &#8220;we cannot make everyone a criminal&#8221; via &#8220;big music is bad&#8221; to &#8220;copyright is bad for society&#8221; is quite an interesting path. I am reminded of a tenet of philosophy: &#8220;an <em>is </em>is not  a <em>should</em>.&#8221; And I lack self-reflection and thinking about the bigger picture in most of what I hear and read.</p>
<p>I don&#8217;t think that most or even a miniscule minority of the millions of people sharing songs and movies over peer-to-peer networks starting doing it as a political statement against copyright. They did it because they wanted something and piracy gave it to them for free. Pure self-interest here. Today, there might be some more political activism behind it, but in general, file-sharing looks to be about getting something for free rather than paying for it.When you confront people to discuss this, they start talking about &#8220;freedom on the Internet&#8221; and &#8220;the need to promote culture&#8221;&#8230; which has nothing to do with it. Other popular arguments is that &#8220;music labels take most of the money anyway so I do not take money from artists&#8221; and &#8220;so few artists can live from their money anyway that removing a source of income will have no effect on music production&#8221;.</p>
<p>By the way, I believe that 90% or more of traffic is likely to be the same set of recent Hollywood block-busters and top-of-pops tunes. Indeed, file-sharing does not seem to promote the long tail theory, rather it makes head of the curve even more spiked. Kids want what all the other kids are listening to or watching, most kids are not using the Internet to explore new and exciting bands or forms of popular culture. And in any case: how does not paying for the music you buy have anything to do with this?</p>
<h2>The Big Big Problem</h2>
<p>My main issue with the current debate is exactly that: that people completely fail to see how our entire society and economy rests on respect for intellectual property rights, and the assumption that you should pay for what you use. For me, that is a given. In certain parts of the world, it is not, and when the basic moral compass of people is that &#8220;I take what I need in whatever way I can&#8221; rather than &#8220;I respect the (intellectual) property of others&#8221;, selling software can be pretty tough. The current attitude towards intellectual property in the industrialized world is a great educational achievement, and a foundation or our modern economy.</p>
<p>If we look at the broader picture, giving up on music copying and considering it &#8220;lawful for personal use&#8221; as some want to have it, where do we then draw the line? At some point, we need to start considering computer software, which is a big industry. And beyond that, how would we protect the knowledge embodied in the form of mechanical and software design for the cars, mobile phones, industrial robots, and other products on the sales of which our relative prosperity still rests? The patent system is needed to encourage the research into new medicines, for example. We have to strike down on pirate copies of clothes, watches, and other European products. Given this bigger picture, I think the only sane stance is to maintain that music piracy <em>is </em>immoral and a crime.</p>
<p>Furthermore, I think our current copyright regime has allowed music creators and book authors and others creators the means to be more independent than they have been earlier in history. Once again, the music business is a dirty business that tends to pay the artist pennies for every dollar they bring in&#8230; but it is possible to sell music. And books.</p>
<p>Copyright makes it possible for talented individuals to make a living off of their &#8220;art&#8221; in comparative freedom, which really was not possible before the modern era. The great artists of antiquity and the renaissance were all financed by kings, nobels, states, or other wealthy people to produce cultural goods that would enhance the glory and status of the sponsor. Basically, being an artist meant being a consultant, a gun for hire, not a free agent since there was no real market for cultural goods that would let you make a living. With this perspective, I think copyright in itself is a strong democratic and cultural force that rather encourages than discourages innovation and creativity.</p>
<p>The current intellectual property regimes around the world has huge problems, for sure. The Mickey Mouse extension to US copyright is a joke. The way the music industry is chasing pirates in the courts is horrendous. Patents are abused by big companies to bully small inventors.</p>
<p>But all of these are policy issues that can be adjusted in the normal course of the democratic process. Completely giving up the fight and surrendering to the forces proclaiming that copyright is evil and that music wants to be free is not the best option.</p>
<p>Even so, the fact that we have Piratpartiet in action will mean that Internet-related questions will be brought more into focus, and hopefully lead to a tempering of the overly broad laws currently being put into place solely to help Big Music chase small-time file-sharers. I will not vote for them, but I actually think their existence is good for the overall ecosystem of politics.</p>
<h2>The Election</h2>
<p>This was one 1200-word rant on a hot topic. You might then wonder what my stance for the election actually is. And it comes here, in Swedish, as this is only relevant to Sweden.</p>
<p>Folkpartiet verkar i min mening ha den bästa kombinationen av att ha historisk röstat &#8220;vettigt&#8221; i Internetfrågor i parlamentet och i val av frågor som de driver inför EU-valet. Miljöpartiet är inte dumma de heller, eftersom miljö- och matfrågorna som de driver hårt ligger på parlamentets bord. FP har dock Marit Paulson som jag verkligen tror på. Socialdemokraterna och vänstern är ute och cyklar med snack om jobb &#8212; det är inte vad det här valet handlar om. Moderaterna har en rösthistoria i Internetfrågor som inte är så vacker, precis som Kristdemokraterna.</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/796"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/796" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/796" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/796/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Off-Topic: Colder Weather and (Consumer) Electronics</title>
		<link>http://jakob.engbloms.se/archives/290?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/290#comments</comments>
		<pubDate>Fri, 26 Sep 2008 22:05:39 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[business issues]]></category>
		<category><![CDATA[gadgets]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[winter]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=290</guid>
		<description><![CDATA[The colder season is coming fast here in Uppsala, and it is time to bring out gloves and warmer jackets. Even if we have had some nice sunny pretty warm days (up to 15 degrees Celsius!), we are getting into October soon, a month where there is usually some day of freak snow fall. Another [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-291" title="ipodnano3g" src="http://jakob.engbloms.se/wp-content/uploads/2008/09/ipodnano3g.png" alt="" width="72" height="72" />The colder season is coming fast here in Uppsala, and it is time to bring out gloves and warmer jackets. Even if we have had some nice sunny pretty warm days (up to 15 degrees Celsius!), we are getting into October soon, a month where there is usually some day of freak snow fall.</p>
<p>Another sign that it is getting colder is the reaction of consumer electronics.</p>
<p><span id="more-290"></span>The plastic in the cords for my earpieces for my iPod gets noticeably stiffer when temperatures drop down towards zero, and the touch wheel tends to work worse in colder conditions. Not to mention trying to operate a touch wheel when wearing gloves. Most times, it just does not work at all.</p>
<p>It really makes one wonder how designers test these things, and whether they really think about common types of weather across the globe. I can see a problem with designing things in a climate like Northern California, where it never particularly overly hot or in any sense cold. The designers just do not naturally experience having to work equipment in minus twenty degrees and snow fall&#8230;I think that could lead to some different choices in materials and designs, seriously.</p>
<p>Case in point: last time I was on a skiing holiday, we had pretty nice warm temperatures between minus ten and minus five degrees. The iPod headphone cords were sufficiently rigid at that temperature that you could hear them rustle against themselves and my clothes. Seriously, minus ten is not a particularly severe temperature. I have some friends who design forestry equipment that works in Siberia. Minus forty in the morning. Or try living in nothern Finland or Norway &#8212; civilized areas, but you can expect many days of minus twenty (which is a temperature where you can easily be outside given sufficiently good clothing).</p>
<p>I managed to kill the battery of my mobile phone last winter as well, as it did not particularly take well to walking in minus ten-like temperatures while on the phone. Fortunately, the battery could be changed to a new one, which is pretty necessary when using portable electronics in cold weather. I guess severe heat can be just as bad for electronics, it is just rarer for me personally.</p>
<p>Obviously, most keyboards on phones are too cramped to be worked with heavy gloves.</p>
<p>Maybe the consumer electronics industry should think a bit like the automotive people who have to make sure things work between minus 30 and plus 80 (or something similar to that).</p>
<p>I guess this goes into a rant category, as electronics will keep being designed for benign environment and &#8220;normal&#8221; temperatures. Bad luck for us living in colder climates&#8230; or maybe a niche to be exploited. People still look for the classic Ericsson R310s: one of the most rugged phones ever made&#8230;</p>
<p><img class="aligncenter size-full wp-image-292" title="err310s" src="http://jakob.engbloms.se/wp-content/uploads/2008/09/err310s.gif" alt="" width="139" height="184" /></p>
<p>One could think of a similarly toughened music player. And accessories made to work well in severly cold weather for use on skiing trips, Arctic research expeditions, and by Siberian loggers. Huge market here, somewhere, right?</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/290"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/290" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/290" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/290/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parallel Programming is Not Needed? I don&#8217;t quite agree&#8230;</title>
		<link>http://jakob.engbloms.se/archives/253?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/253#comments</comments>
		<pubDate>Tue, 02 Sep 2008 06:40:37 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[multicore software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[efficiency]]></category>
		<category><![CDATA[Jonathan Edwards]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=253</guid>
		<description><![CDATA[This was a refreshingly different post: Too Many Cores, not Enough Brains: More importantly, I believe the whole movement is misguided. Remember that we already know how to exploit multicore processors: with now-standard multithreading techniques. Multithreaded programming is notoriously difficult and error-prone, so the challenge is to invent techniques that will make it easier. But [...]]]></description>
			<content:encoded><![CDATA[<p>This was a refreshingly different post: <a href="http://alarmingdevelopment.org/?p=117">Too Many Cores, not Enough Brains</a>:</p>
<blockquote><p>More importantly, I believe the whole movement is misguided. Remember that we already know how to exploit multicore processors: with now-standard multithreading techniques. Multithreaded programming is notoriously difficult and error-prone, so the challenge is to invent techniques that will make it easier. But I just don’t see vast hordes of programmers needing to do multithreaded programming, and I don’t see large application domains where it is needed. Internet server apps are architected to scale across a CPU farm far beyond the limits of multicore. Likewise CGI rendering farms. Desktop apps don’t really need more CPU cycles: they just absorb them in lieu of performance tuning. It is mostly specialized performance-intensive domains that are truly in need of multithreading: like OS kernels and database engines and video codecs. Such code will continue to be written in C no matter what.</p></blockquote>
<p>The argument at core is that multicore is about performance, and performance optimization is generally something that we do prematurely rather than focussing on how to solve the core problem in the best way. You have to respect Jonathan Edwards, and often this is true: programmers optimize themselves into a horrible design that is also slow.</p>
<p><span id="more-253"></span></p>
<p>But he is missing the picture painted in embedded computing and the need to chase low-power using multiple slow cores rather than a few fast cores. The only way to solve many computational problems in our infrastructure (LTE mobile telephony or Internet security scanning, for example) is to use multiple cores and multiple application-specific accelerators. What this is saying is that there are more performance-critical areas where single-threaded programs will not work fast enough than Jonathan thinks.</p>
<p>Also, we do need to write efficient software, as wasteful software uses more energy to drive the computers it is running on, contributing to our overuse of the Earth&#8217;s resources and global warming and other fun. Programmers could do their part by making their programs run using less energy, which would mean fewer cycles and more parallelism. Optimization might never die, since there will always be a reason to do things more efficiently. The reasons will vary from lack of instruction cycles (1980s) to reduced power (2000s), but it is a fact of life in all other areas of human activity. So us programmers will also have to get used to it.</p>
<p>Also, I think that part of the &#8220;core problem&#8221; should be how to think in terms of parallel parts in a problem. Some things are sequential, but most real-world problems have plenty of parallelism in the domain simply because the world the software interacts with is parallel in so many ways.</p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/253"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/253" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/253" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/253/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What&#8217;s the Obsession with C in EDA?</title>
		<link>http://jakob.engbloms.se/archives/165?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/165#comments</comments>
		<pubDate>Wed, 23 Jul 2008 20:25:06 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[computer simulation technology]]></category>
		<category><![CDATA[embedded software]]></category>
		<category><![CDATA[ESL]]></category>
		<category><![CDATA[multicore software]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[C2S]]></category>
		<category><![CDATA[Cadence]]></category>
		<category><![CDATA[Catapult-C]]></category>
		<category><![CDATA[Cynthesizer]]></category>
		<category><![CDATA[Forte]]></category>
		<category><![CDATA[jokes]]></category>
		<category><![CDATA[Mentor]]></category>
		<category><![CDATA[parallelism]]></category>
		<category><![CDATA[rant]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=165</guid>
		<description><![CDATA[In early July, Cadence announced their new &#8220;C2S&#8221; C-to-silicon compiler. This event was marked with some excitement and blogging in the EDA space (SCDSource, EDN-Wilson, CDM-Martin, to give some links for more reading). At core, I agree that what they are doing is fairly cool &#8212; taking an essentially hardware-unrelated sequential program in C and [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-166" style="margin: 10px;" title="whyc" src="http://jakob.engbloms.se/wp-content/uploads/2008/07/whyc.png" alt="" width="100" height="106" />In early July, Cadence announced their new &#8220;C2S&#8221; C-to-silicon compiler. This event was marked with some excitement and blogging in the EDA space (<a href="http://www.scdsource.com/article.php?id=270:">SCDSource</a>, <a href="http://www.edn.com/index.asp?layout=blog&amp;blog_id=1690000169&amp;blog_post_id=230029823">EDN-Wilson</a>, <a href="http://www.chipdesignmag.com/martins/2008/07/14/leibsons-law-in-action-cadence-returns-to-esl-with-new-synthesis-tool/">CDM-Martin</a>, to give some links for more reading). At core, I agree that what they are doing is fairly cool &#8212; taking an essentially hardware-unrelated sequential program in C and creating hardware from it. The kind of heavy technology that I have come to admire in the EDA space.</p>
<p>But I have to ask: why start with C?</p>
<p><span id="more-165"></span></p>
<h2>Productivity by Abstraction</h2>
<p>The motivation given in the marketing materials from Cadence is &#8220;productivity&#8221;, up to ten times more productivity or 90% of design time reduced. The key idea appears to be that C/C++/SystemC is more abstract than Verilog/VHDL, and therefore more design is produced in less time (<a href="http://www.cadence.com/rl/Resources/datasheets/C2Silicon_ds.pdf">see Cadence C2Silicon Datasheet</a>).</p>
<p>Similar (in spirit) products have similar motivations, with various numbers of how much better things are. For example, <a href="http://www.forteds.com/products/cynthesizer.asp">Forte&#8217;s Cynthesizer </a>claims &#8220;<em>2X-4X faster implementation from spec to netlist over RTL</em>&#8220;. <a href="http://www.mentor.com/products/esl/high_level_synthesis/catapult_synthesis/upload/Catapult_DS_0107.pdf"></a></p>
<p><a href="http://www.mentor.com/products/esl/high_level_synthesis/catapult_synthesis/upload/Catapult_DS_0107.pdf">Materials for Mentor&#8217;s Catapult </a>tool says it the best:</p>
<blockquote><p><em>Using industry standard pure ANSI C++ to describe functional intent, designers move up to a more productive abstraction level for designing complex ASIC or FPGA hardware typically found in next-generation, compute-intensive applications.</em></p></blockquote>
<p>And</p>
<blockquote><p><em>Single C++ source unites system designer and hardware designer</em></p></blockquote>
<p>So the idea from a large part of the EDA community seems to be that using a C-family language offers benefits of abstraction as well as a way to communicate with software people.</p>
<h2>Is C the Right Answer?</h2>
<p>What is funny with this obsession with raising the level of abstraction is that you keep ending up in the C family of languages. C, which is considered a &#8220;high-level assembler&#8221; by many people, and even worse, C++ which is a hard-to-parse semantic nightmare that most CS people that I know would rather do without.</p>
<p>I was reminded of an old joke from my early university CS days, about how to shoot yourself in the foot in various languages. The part on C++ is especially telling. From <a href="http://www-users.cs.york.ac.uk/susan/joke/foot.htm">http://www-users.cs.york.ac.uk/susan/joke/foot.htm</a>:</p>
<dl>
<blockquote><dt><em><strong>C</strong></em></dt>
<dd><em>You shoot yourself in the foot.</em></dd>
<dt><em><strong>C++</strong></em></dt>
<dd><em>You accidentally create a dozen instances of yourself and shoot them         all in the foot. Providing emergency medical assistance is impossible         since you can&#8217;t tell which are bitwise copies and which are just         pointing at others and saying &#8220;That&#8217;s me, over there.&#8221; </em></dd>
</blockquote>
</dl>
<p>So, putting on my Computer Science hat, I find the idea of using C as a raised level of abstraction would have been considered a bad joke when I was an undergraduate. In essence, C codies procedural programming as it was understood in the early 1970s, when compilers were very weak and a language that could do all that assembler could do was badly needed to write operating systems in a high-level language. In many ways, it was a step back compared to Pascal, Fortran, or Cobol. But it had the power to do anything, tended to result in faster code than other languages, and was available for more machines and operating systems than any other language. C++ then added objects (good), templates (good), but also tried to maintain the close-to-the-machine style of C (bad), multiple inheritance (complex), resulting in something very complex but decently useful and still being mostly like old C (despite having innumerable little detail differences in semantics compared to plain C).</p>
<p>So for a lot of good reasons, C/C++ is the de-facto standard language when you actually get down to the gritty job of getting a new language or operating system to run. It is the language to implement run-time systems, operating systems, new interpreted languages, etc. For the embedded space, C/C++ is often the only language available for a particular chip/OS combination. It is usually the best supported with the most compilers, the highest investment in compilers, and the most users of the compilers.</p>
<p>I have worked for a C compiler company called <a href="http://www.iar.se">IAR Systems</a>, and I appreciate the great engineering effort, skill, and pure intellectual fun that goes into creating C compilers that generate code that work well on resource-constrained embedded systems (doing C on an Intel 8051 is no mean feat). Compilers, that are good enough to wean embedded people off of assembly language.</p>
<p>But today, in general, I think that C/C++ is not the language anybody choses for a project if the goal is abstraction and greater productivity. Instead, you go for languages that are much more productive and that raises your productivity a few times over plain C/C++. Some typical examples:</p>
<ul>
<li>Languages that do away with memory management, like Java.</li>
<li>Languages that use virtual machine technology to ease porting across platforms, like Java, C#.net, Prolog, Python, Perl.</li>
<li>Languages that use dynamic typing or even duck typing, like Python and Ruby.</li>
<li>Languages that feature concurrency as a primary design features, like Erlang.</li>
<li>Functional languages with type inference, like ML and Haskell.</li>
<li>Graphical modeling tools that generate skeleton code, like UML.</li>
<li>Graphical domain-specific modeling tools that generate final code, like Matlab, Labview, and VisualState.</li>
<li>Constriant-resolution-based languages, like Oz.</li>
<li>Narrowly focused domain-specific languages, like CoWare LISA and Virtutech DML.</li>
<li>In-house very focused languages, usually not &#8220;Turing complete&#8221;.</li>
</ul>
<p>When I was studying CS, the basic assumption was that languages are tools, not religion. Any computer science major worth her or his salt should be able to learn any language in a short time, and you should use the language most appropriate for the task at hand. Using the same language all over the place because it is a &#8220;standard&#8221; is absolutely inefficient, from a software programming perspective.</p>
<p>In practice, large software systems in the embedded and desktop space tend to be constructed from around ten or so different languages (typically, you find C, C++, Java, some macro expanders like M4, string processing and file generation in perl, funky makefiles, some scripting in shell script, Python, VisualBasic, etc.). This is not anarchy, it is professionalism. If you asked a carpenter to use a hammer for all tasks, he would be pretty sad &#8212; different tools are good for different things, and it is the same with languages.</p>
<h2>So Why C in EDA?</h2>
<p>Today, EDA companies are moving from hardware design into partially software design, as SoC designs become more complex and software becomes a greater part of the overall system value. In this process, C/C++ and SystemC seem to be the language of choice.</p>
<p>I find this strange, considering the proud tradition of language inventions that you find in EDA. VHDL and Verilog were uniquely new things when they appeared, languages to describe hardware on hardware terms, and not software on instruction-set terms. Later, you have more abstract language like Bluespec and HandelC. There is a tradition, it seems, of very large and sophisticated compilers that take complicated inputs and transform them into hardware.</p>
<p>Using C/C++ as the input language really makes no technical sense, as it is very hard to parse and understand well in general. The restrictions imposed by the requirements of synthesis limits the C you can input quite severly, if you ask me.</p>
<p>If one idea for starting with C/C++ was to take a piece of &#8220;generic&#8221; source code and then compile it either to software or hardware, depending on system partitioning, I cannot see that working too well. Software-C tends to use constructs that are not appropriate for hardware synthesis like pointers and recursion. Hardware-C does not look likely to generate particuarly elegant or simple constructs when compiled to software.</p>
<p>So since the code is still going to be special for doing synthesis, why not use an altogether more elegant language? That seems to be what SystemVerilog is about to some extent, and what BlueSpec, for example, are doing. Or the tools to do hardware from UML.</p>
<p>I really do not understand how C/C++ came to be seen as the answer to what software is. Maybe because EDA companies tend to meet with the lowest-level software engineers? And these engineers are certainly only using C since they are running on very bare hardware and cannot assume the existence of rich run-time environment and virtual machines.</p>
<h2>Disciplined C</h2>
<p>Note that I do like the core idea of C-based synthesis, which is using C with restrictions, discipline, and coding patterns to ensure quality final code and communicate programmer intent to the compiler.</p>
<p>When I was with IAR, I taught several courses on how to get good small code out of an embedded C compiler (see for example <a href="http://www.engbloms.se/publications/engblom-esc-sf-2001.pdf">my ESC 2001 paper</a>). Basically, it comes down to writing &#8220;boring&#8221; C code that looks a whole lot like Pascal, and which does not rely on fancy semantic intricacies or old rules like using &#8220;which&#8221; rather than &#8220;for&#8221;. The <a href="http://www.imec.be/CleanC/">IMEC CleanC guidelines </a>are quite recent, but follow much of the same ideas to enable automatic parallelization of code for MPSoC designs.</p>
<p>But doing this is really a work-around for a poor initial language, if you look at the problem without preconceptions.</p>
<h2>The Sensible Starting Point</h2>
<p>What I think would make more sense is to start with some higher level of abstraction and then generate software code or hardware design from it.</p>
<p>This starting point should really be a parallel language, in some way, shape, or form. Using a sequential language like C as the starting point is fundamentally broken in this age of pervasive multicore systems. Future software will be written to run on parallel machines as the common case, and programs should expose the natural parallelism present in the problem being tackled. Taking a naturally parallel problem, packing it into disciplined sequential C, and then having a compiler discover the parallelism again is really a huge waste of effort.</p>
<p>The starting language might not necessarily be explicitly parallel (no need to scream about Occam or Ada tasking), it could just be domain-natural like Labview (which has been proven to be compilable down to parallel code). I do think that local memory + message passing + built-in task handling like Erlang looks like a very good approach for hardware design and software design, as it makes it possible to use sequential descriptions where they make sense and expose natural parallelism where it makes sense.</p>
<p>The starting language should also be as simple as possible in terms of how many different ways you can express things. In C, you can do &#8220;i++;&#8221;, &#8220;++i;&#8221;, &#8220;i+=1;&#8221;, &#8220;i=i+1;&#8221; to increment a variable. Why have more than one operation for this? The original point in C was to support various machine operations directly in the source language, as you could not trust the compiler to figure things out. Today, compilers can figure these things, so there is no point to be able to express the same thing in more than one very regular and easy-to-read way.</p>
<p>Another important aspect of modern software engineering is to support quick iterations, quick changes, and agile and extreme programming theories. This comes down to languages and environments that work even when systems are incomplete, and where it is easy to stub things out and later put in the details. C/C++ does not do this terribly well due to the use of static typing, static checking, and lack of default implementatioins for things which have not yet been filled in.</p>
<p>The language should also be designed to run on some virtual machine, as that helps portability and understanding programs. It also makes it a whole lot easier to write a reference compiler to integrate the language into simulation environments.</p>
<h2>Conclusion</h2>
<p>So where does this put me? I think these are my main points:</p>
<ul>
<li>C-to-hardware synthesis is pretty impressive technology</li>
<li>But why use C?</li>
<li>C is the EDA high-level darling</li>
<li>C is sequential and complicated</li>
<li>C is very low-level from the perspective of a software professional</li>
<li>A better input language should be concurrent/parallel and simple</li>
<li>A better input language should be designed for modern agile and extreme programming styles</li>
<li>EDA companies should really look at the leading edge of software engineering for inspiration, rather than what conservative embedded C programmers are doing.</li>
<li>VM-based languages are good</li>
</ul>
<p>I guess this goes into the &#8220;rant&#8221; bin&#8230;</p>
<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]><br />
<mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Table Normal"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif";} --></p>
<p><!--[endif]--></p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/165"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/165" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/165" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/165/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Serendipity and Music</title>
		<link>http://jakob.engbloms.se/archives/133?&#038;owa_medium=feed&#038;owa_sid=</link>
		<comments>http://jakob.engbloms.se/archives/133#comments</comments>
		<pubDate>Fri, 06 Jun 2008 20:43:29 +0000</pubDate>
		<dc:creator>Jakob</dc:creator>
				<category><![CDATA[popular culture]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[Universal Poplab]]></category>

		<guid isPermaLink="false">http://jakob.engbloms.se/?p=133</guid>
		<description><![CDATA[I often listen to Leo Laporte&#8217;s &#8220;This Week in Tech&#8221; podcast. It is not particularly focused, but thanks to the quality of the participants it always enjoyable and I tend to end up learning something about general IT and general desktop computing that I did not know before. However, there are a few annoying themes [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jakob.engbloms.se/wp-content/uploads/2008/06/uprising_front_cover_small.jpg"><img class="alignleft alignnone size-medium wp-image-134" style="float: left; margin: 10px;" title="uprising_front_cover_small" src="http://jakob.engbloms.se/wp-content/uploads/2008/06/uprising_front_cover_small.jpg" alt="" width="200" height="200" /></a></p>
<p>I often listen to Leo Laporte&#8217;s &#8220;This Week in Tech&#8221; podcast. It is not particularly focused, but thanks to the quality of the participants it always enjoyable and I tend to end up learning something about general IT and general desktop computing that I did not know before. However, there are a few annoying themes that tend to pop up. One of these is the idea that traditional paper journalism and journalism in general is dead, to be replaced by smart news search engines finding &#8220;just what I need&#8221; based on my preferences. I think that idea is utterly broken. There is immense value to reading a collection of news and articles put together by someone skilled in the craft, and not just a search bot looking for stuff like what I already know and like.</p>
<p>Here is nice example of what such a bleak world would be missing&#8230;</p>
<p>Just last week I found the group &#8220;<a href="http://www.universalpoplab.com/">Universal Poplab</a>&#8220;. A Swedish trio making nice pop music in a style that is quite reminiscent of classic 1980&#8242;s Synthpop. Which I happen to like. How I found it? Pure serendipity of the kind that will never happen in a world of agent-based targeted search and information. I was moving the car to the garage, and just tuned in to <a href="http://www.sr.se/p3/">P3</a> on the radio. Where they happened to interviewing the group and played some short bits from their hits from recent years (hits that had completely gone me by, as I tend to be quite out of touch with cultural developments since we had a child a few years ago). &#8220;This is brilliant&#8221; I thought and logged into iTunes and bought a record immediately.</p>
<p>Without that purely random act, I probably would never have found out about them. There is so much good stuff out there hidden in enormous mass of indifferent stuff that the only really good way to get a handle on it is to let someone better informed tell you. Not some search bot. I guess this qualifies for &#8220;Rant&#8221; status.</p>
<p><a href="http://jakob.engbloms.se/wp-content/uploads/2008/06/uprising_front_cover_small.jpg"><br />
</a></p>
<div class="simple_likebuttons_container_small">
      <div class="simple_likebuttons_googleplus">
        <g:plusone size="medium" count="false" href="http://jakob.engbloms.se/archives/133"></g:plusone>
      </div>
    
      <div class="simple_likebuttons_twitter simple_likebuttons_twitter_s">
        <a href="https://twitter.com/share" class="twitter-share-button" data-count="none" data-url="http://jakob.engbloms.se/archives/133" data-lang="en">Tweet</a>
      </div>
    
      <div class="simple_likebuttons_facebook">
        <div id="fb-root"></div>
        <script>(function(d, s, id) {
          var js, fjs = d.getElementsByTagName(s)[0];
          if (d.getElementById(id)) {return;}
          js = d.createElement(s); js.id = id;
          js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
          fjs.parentNode.insertBefore(js, fjs);
        }(document, "script", "facebook-jssdk"));</script>
        <div class="fb-like" data-href="http://jakob.engbloms.se/archives/133" data-send="false" data-layout="button_count" data-show-faces="false" data-width="90"></div>
      </div>
    </div>]]></content:encoded>
			<wfw:commentRss>http://jakob.engbloms.se/archives/133/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

