<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>mikael.io - posts</title>
    <subtitle>Mikael Gueck, software architect. Notes on software, business and people since 2007.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://mikael.io/posts/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://mikael.io/posts/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2012-07-25T12:00:00+03:00</updated>
    <id>https://mikael.io/posts/atom.xml</id>
    <entry xml:lang="en">
        <title>The fundamentals of professional software development</title>
        <published>2012-07-25T12:00:00+03:00</published>
        <updated>2012-07-25T12:00:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2012/07/the-basics-of-professional-software-development/"/>
        <id>https://mikael.io/posts/2012/07/the-basics-of-professional-software-development/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2012/07/the-basics-of-professional-software-development/">&lt;p&gt;I was asked to break down a top-level description of my following description of
how to describe the part of the software development profession one should optimize for.&lt;/p&gt;
&lt;p&gt;&quot;Ethical professional developers optimize for business results per unit of
resources over product or project lifecycles, balanced risk profiles over
project portfolios, and the ablity to scale investment into a given project
both up and down as the business environment changes.&quot;&lt;/p&gt;
&lt;p&gt;Let&#39;s break this down.&lt;/p&gt;
&lt;h2 id=&quot;ethics&quot;&gt;Ethics&lt;/h2&gt;
&lt;p&gt;The virtue of a professional acting ethically is that this allows for trust in
working relations between colleagues and organizations, which in turn makes
working together significantly more efficient, as there is significantly less
need to verify and control. The profession of software development has plenty
of in-house codes of conduct, as well as the codified ACM &quot;Software Engineering
Code of Ethics and Professional Practice&quot;.&lt;/p&gt;
&lt;p&gt;Many of the everyday ethical questions break down to the form: should I do
A which is best for me, B which is best for my employer, or
C which is best for the client. Very rarely you add D, best for our society,
when C is clearly detrimental to the society. Unless D is relevant,
you should pick C, and you&#39;re obligated to look at the problem from the
broadest point of view your client consents to provide you with.&lt;/p&gt;
&lt;h2 id=&quot;product-or-project-lifecycle&quot;&gt;Product or project lifecycle&lt;/h2&gt;
&lt;p&gt;When you&#39;re considering a product or a project, it&#39;s tempting to care only to
the extent you&#39;re personally involved with it, and wash your hands of the rest.
That&#39;s not consistent with the aforementioned professional ethics, though.
When making decisions, you must consider the costs and benefits of your
choices over the whole lifecycle.&lt;/p&gt;
&lt;p&gt;A lifecycle means simply the time and space during which the project is being
developed. It&#39;s also strongly connected to the business motivation that birthed
the project in the first place, and through that, to the adjacent businesses
and offerings, the marketplace in which it operates, and its competitors.&lt;/p&gt;
&lt;h2 id=&quot;optimizing-for-business-results-per-unit-of-resources&quot;&gt;Optimizing for business results per unit of resources&lt;/h2&gt;
&lt;p&gt;If you&#39;re paid to develop software, it&#39;s extremely likely that you&#39;re getting
paid with the hope that you&#39;ll deliver business results. Those might be the
capability to serve new customers, serve them better, serve them cheaper,
serve more of them, serve them with a varying quality of service, enlarge
market share, retarget market share, shorten supply lines, simplify them,
work around risks, work around legal barriers, or anything of the sort.&lt;/p&gt;
&lt;p&gt;It&#39;s very important to understand what business results you&#39;re expected to
deliver, and how the company and its marketplace operates in those areas.
As a professional, you&#39;re also expected to communicate a clear enough
understanding of how exactly should resources be invested in your area,
to get the best results possible. To be able to deliver that, you must
understand the nature of those resources, and the process through which
they are turned into results. In other words, how people of your profession
and adjacent professions work, what happens in people&#39;s heads in general,
what must be done to get your specific group of individuals to perform together,
which skills and how much throughput is required to achieve your objectives,
and how to get your hands on those.&lt;/p&gt;
&lt;p&gt;Resources are, in our profession, mainly people, but also servers,
personal desktops, licenses, enough throughput in corporate processes so that
your people can work efficiently, and most importantly, correctly budgeted cash
so that you can pay your people, as well as acquire outside expertise if it&#39;s
needed. You need to understand how capex and opex budgeting works, so that you
won&#39;t be caught with your pants down with only the kind of money you can spend
on bailing water out of the boat, and no cash which you can spend to fix the
giant leak in the side.&lt;/p&gt;
&lt;p&gt;It&#39;s also easy to forget that from your client&#39;s standpoint, often the most
important costs associated with your project aren&#39;t the development costs,
but the cost of the its normal daily use by people, over its lifecycle.
When thinking of where to spend your development resources, consider that.&lt;/p&gt;
&lt;h2 id=&quot;balanced-risk-profiles-over-project-portfolios&quot;&gt;Balanced risk profiles over project portfolios&lt;/h2&gt;
&lt;p&gt;Risks and uncertainties concern the probability of the shit hitting a fan in
the future, as well as its color and consistency. Every choice carries its own
risks. Some alternatives have been tried and tested, and you can guess what&#39;s
going to happen with more certainty than with other choices.&lt;/p&gt;
&lt;p&gt;This is a common and well-known phenomenon. If you&#39;re an expert in your field,
and provide advice to people concerning your profession, you are required to
have a reasonable understanding of the risks your recommendations carry, and
communicate that information to your client, by all professional codes of
ethics I&#39;m familiar with. Especially in the cases where you&#39;re either unaware
of the risks, or you&#39;re aware of significant unknowns.&lt;/p&gt;
&lt;p&gt;The flipside of risks is that you can mitigate them by planning what to do if
the shit hits the fan in a certain way, and provisioning for specific eventualities.
A common way to handle software risks is to invest in deep in-house expertise for
specific aspects of specific technologies, acquire quick-response consulting contracts
for them, or to over-provision server resources. This costs a lot of resources.&lt;/p&gt;
&lt;p&gt;In balancing risk profiles over project portfolios, you make technology or
process choices which are common to many projects. That way you achieve more
with the same risk mitigation investment, or you&#39;re able to mitigate a
significantly larger group of risks and uncertainties.&lt;/p&gt;
&lt;p&gt;This very seldom happens by chance - you have to understand the principles
and apply this understanding when making technical choices in projects.&lt;/p&gt;
&lt;h2 id=&quot;scaling-project-investment-up-and-down&quot;&gt;Scaling project investment up and down&lt;/h2&gt;
&lt;p&gt;When you succeed and your customers are unusually excited about your product,
you want to be able to invest more in its development.&lt;/p&gt;
&lt;p&gt;If there&#39;s, say, an economic downturn, you might want to turn down the heat
on your product, and invest less in its development.&lt;/p&gt;
&lt;p&gt;Again, if you leave these abilities to chance, it&#39;s very likely that your
people will get very stressed out when new people are hired, or some of the
existing people are moved to other projects, and they have to cope with the change.&lt;/p&gt;
&lt;p&gt;However, if you&#39;re aware of the fact that conditions often change,
you can invest in documentation and clear code, choose languages and
platforms which are easy to recruit for, and develop system architectures
which isolate components which require quick adaptability and those which
require stability and testing, from each other, to mention only a couple
of the steps you can take.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>What to do to turn myself into a master?</title>
        <published>2012-02-19T12:00:00+02:00</published>
        <updated>2012-02-19T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2012/02/what-to-do-to-turn-myself-into-a-master/"/>
        <id>https://mikael.io/posts/2012/02/what-to-do-to-turn-myself-into-a-master/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2012/02/what-to-do-to-turn-myself-into-a-master/">&lt;p&gt;Chris asks: &quot;I would say I&#39;m at the Journeyman level, working on getting to
master, but I have no masters around me. Any advice on what to do to turn myself into a master?&quot;&lt;/p&gt;
&lt;p&gt;There are four important things you&#39;ve got to gain an understanding in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;people&lt;/li&gt;
&lt;li&gt;businesses&lt;/li&gt;
&lt;li&gt;yourself&lt;/li&gt;
&lt;li&gt;technology&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Understanding people is the most important part. Learn to see how and what people
see, when listening to them talk. Understand group dynamics. Pride, shame, guilt,
fear, honor, fairness, and the bond of honesty. Understand how people see themselves
and others. Not so as to deal with people dishonestly, but to be able to represent
yourself to them in the light of shared understanding.&lt;/p&gt;
&lt;p&gt;Understanding businesses is your second most effective leverage for results.
Understand your customer, and their customer. Understand your customer&#39;s arrangement
with their customers. How their organization is structured, and how their deals
are structured. Learning &quot;why&quot; things are that way might not make you sleep better
at night, but it might further your understanding of people. Understand the
conceptual framework of business deals, and their terminology. Understand how
and why business cases are developed. Learn how to explain people how you&#39;ll
make them not only more money, but better money.&lt;/p&gt;
&lt;p&gt;Understanding yourself frees you from some limitations you might otherwise have
laboured under, and might help achieve contentment, even happiness, if one is so
inclined. You can play a better game if you have the balls to see what cards
you&#39;ve been dealt. This is the best investment you can make, but there is no magic.&lt;/p&gt;
&lt;p&gt;Finally, understanding technology. An excellent understanding of technology
lets you amplify your other skills, but can be easily negated by slacking in other areas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Understand how microprosessors work, and how they came to be. Learn what the
next year&#39;s processors will be like, and why the businesses developing them
went that way. Understand how the CPU talks to the memory, and the timescales involved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Understand the broad concepts of assembler programming, if not the entirety
of the actual practise. Understand how the SoC concepts differ from servers and desktops.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Understand how rotational disks and SSDs work, and why, as well as file
systems, and how people see them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look at HP&#39;s and Dell&#39;s price lists for enterprise hardware, and learn what
those things are and what do they do. Look at the prices, and compare the
prices of acquisition to the costs of operating hardware.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn what a good system administrator makes, and why.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Understand what operating systems do, how they usually behave, what happens
in anomalous situations, and what sysadmins do to avoid such situations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn how operating systems interact with the applications running on top of
them, and how to make sure your application behaves well towards the operating system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn the most important thing about programming: how to communicate
effectively with your colleagues and maintainers through code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn the second most important thing about programming: how to design
efficient architectures which communicate their intent well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&#39;s also good to learn how to write efficient code, although an efficient
architecture should ensure that a moderate understanding of these principles
is enough to keep each part relatively efficient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn how small a part of programming the actual programming language is,
and how the entire ecosystem of integrations affects the end result of
programming much more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn your tools. Learn when it&#39;s good business to pay for tools, and when not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Learn the basic history of interactions every major player in the software
development landscape have left behind - you really shouldn&#39;t trust companies
which screw their customers and partners time and again. You&#39;re not exempt,
and it&#39;s better to learn that before than after.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep abreast of the latest in libraries. Pick good ones, and teach your people to use them well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&#39;m sure I&#39;ve missed plenty of stuff, but this should get you started.
It&#39;s Sunday, so it&#39;s a perfect time to pick one thing, and get a-chopping.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lomaopinnot: JSF 2.0 + PrimeFaces 3.0</title>
        <published>2012-01-03T12:00:00+02:00</published>
        <updated>2012-01-03T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2012/01/jsf-20-primefaces-30/"/>
        <id>https://mikael.io/posts/2012/01/jsf-20-primefaces-30/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2012/01/jsf-20-primefaces-30/">&lt;p&gt;(Kopio eri taustaisille kollegoille lähetetystä sähköpostista.)&lt;/p&gt;
&lt;p&gt;Hei, katselin loman aikana erilaisia teknologioita, joista yksi oli JSF 2.0 + PrimeFaces 3.0 RC2.&lt;/p&gt;
&lt;p&gt;Java Server Faces on selainteknologiastandardi, joka tuo yhteen web-käyttöliittymäsuunnittelijat,
backend-kehittäjät sekä kolmannen osapuolen komponenttikirjastojen toimittajat. Se standardoi eri
toimijoiden väliset rajapinnat, sekä web-sovelluksen teknisten toimijoiden osuudet sovelluksien
käytön elinkaaren aikana. Siitä on useita implementaatioita.&lt;/p&gt;
&lt;p&gt;PrimeFaces on komponenttikirjasto, joka sisältää kaiken mitä B2B web-sovellukset
yleensä tarvitsevat, helppokäyttöiseksi paketoituna.&lt;/p&gt;
&lt;p&gt;Nämä teknologiat kilpailevat perinteisen HTML/JavaScript käsin kehityksen kanssa, sekä
sovelluskehittimistä MS:n webbikehittimen, sekä esimerkiksi Google Web Toolkitin, Vaatimen,
ExtJS:n, SmartClientin, SmartGWT:n ja ExtGWT:n kanssa. (Uutena mutta varteenotettavana
kilpailijana kentällä on 2012 dust.js:n tyyppiset teknologiat, joita mm.
LinkedIn on siirtymässä käyttämään, REST JSON-palveluiden kanssa.)&lt;/p&gt;
&lt;p&gt;JSF-sovellukset koostuvat näkymätemplateista (Facelets) joissa HTML-koodin seassa
määritellyt näkymäkomponenttien instanssit osoittavat sovelluksen taustaosioon, eli
beaneihin (tiettyä sopimusta noudattava Java-luokka) jotka on annotoitu JSF:n
kontekstitiedolla. Tyypillisessä sovelluksessa on joitakin taustaluokkia joiden
elikaari kuuluu sessiokontekstiin, joitakin taustaluokkia jotka elävät spesifisessä
keskustelukontekstissa (esim. jos sovelluksessa on osioita joiden halutaan toimivan
samaan aikaan saman selaimen eri tabeissa) tai jopa yhden requestin eli
HTTP-pyynnön pituisessa kontekstissa.&lt;/p&gt;
&lt;p&gt;(JSF 2.0:n sisäänrakennettu keskustelukonteksti toimii hyvin epäintuitiivisesti,
ja sitä varten Apache MyFaces CODI projekti on luonut standardia noudattavan
custom scopen, joka toimii fiksummin. CODI:n käyttöönotto vaatii vain sen,
että otat sen kirjastot mukaan projektiin, ja merkkaat taustapavun sen
keskustelukonteksti-annotaatiolla.)&lt;/p&gt;
&lt;p&gt;Hyvä esimerkki JSF 2.0 toimintaperiaatteesta löytyy PrimeFaces ajax multiupload demosta, http://www.primefaces.org/showcase-labs/ui/fileUploadMultiple.jsf&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;h:form enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;p:fileUpload fileUploadListener=&amp;quot;#{fileUploadController.handleFileUpload}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            mode=&amp;quot;advanced&amp;quot; update=&amp;quot;messages&amp;quot; multiple=&amp;quot;true&amp;quot; sizeLimit=&amp;quot;100000&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            allowTypes=&amp;quot;/(\.|\/)(gif|jpe?g|png)$/&amp;quot;/&amp;gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;p:growl id=&amp;quot;messages&amp;quot; showDetail=&amp;quot;true&amp;quot;/&amp;gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/h:form&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Taustapapu:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class FileUploadController {  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public void handleFileUpload(FileUploadEvent event) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        FacesMessage msg = new FacesMessage(&amp;quot;Succesful&amp;quot;, event.getFile().getFileName() + &amp;quot; is uploaded.&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        FacesContext.getCurrentInstance().addMessage(null, msg);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tässä esimerkissä ajax-komponentti uploadaa tiedostot, ja sen jälkeen päivittää dynaamisesti &quot;messages&quot; komponentin, jonka tehtävä on näyttää pienessä viestilaatikossa eventtinotifikaatioita. Jos metodissa tiedostot laitettaisiinkin talteen keskusteluskooppiseen papuun, johon vaikkapa esikatselukomponentti puolestaan osoittaisi, senkin voisi laittaa automaattisesti päivittymään, ja kokonaisuus toimisi edelleen odotetulla tavalla, vaikka komponenttien ja taustadatan vuorovaikutus ei ole mitenkään yksinkertaista.&lt;/p&gt;
&lt;p&gt;Tässä mallissa kontrolli säilyy palvelinpäässä, kun taas kilpailevassa GWT-mallissa sovellus pyörii itsenäisesti selaimessa, ja tekee vain spesifisiä pyyntöjä taustapalveluihin. Siinä missä käsin koodattavissa järjestelmissä rajapinnat rakennetaan joko REST JSON tai XML päälle, tai enterprise architectien toiveesta SOAP:illa, JSF komponenttikirjastojen rakentajat voivat määrittää käyttäjälle näkymättömästi komponenttien toimintatavat, kunhan ne noudattavat JSF-standardin rajauksia.&lt;/p&gt;
&lt;p&gt;Olin viimeksi kokeillut JSF:aa 1.0-versiossa, jossa se oli varsin kankea eikä vastannut tarkoitustaan, mutta nykyinen 2.0-versio vakuutti. Sillä voi rakentaa B2B sovelluksia valmiista komponenteista merkittävästi vaivattomammin kuin käsin HTML:aa ja JS:aa jyystämällä. Hintana on tosiaan se, että täysin uusia komponentteja on vaikeampi rakentaa, mutta 99%:ssa projekteista valmiissa komponenteissa pitäytyminen on vain positiivinen juttu projektin liiketoimintatavoitteissa onnistumisen kannalta. Jälleen uuden sliderikomponentin keksiminen ei oikeasti hyödytä ketään, mutta saman ajan käyttäminen tuotteen iteroimiseen asiakkaiden kanssa taas hyödyttää.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>PostgreSQL 9.1 incremental backup to Amazon S3</title>
        <published>2011-12-16T12:00:00+02:00</published>
        <updated>2011-12-16T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/12/postgresql-backup-to-amazon-s3/"/>
        <id>https://mikael.io/posts/2011/12/postgresql-backup-to-amazon-s3/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/12/postgresql-backup-to-amazon-s3/">&lt;p&gt;Let&#39;s perform a little exercise, configure PostgreSQL 9.1 to incrementally
back up to Amazon S3, and automatically test that backup.&lt;/p&gt;
&lt;p&gt;We don&#39;t want to take any risks with our current development database, so
let&#39;s create a few independent PostgreSQL servers, called &quot;clusters&quot;, just for
this test. We&#39;ll remove them afterwards.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo pg_createcluster 9.1 gold&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Creating new cluster (configuration: /etc/postgresql/9.1/gold, data: /var/lib/postgresql/9.1/gold)...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/gold/postgresql.conf to /etc/postgresql/9.1/gold...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/gold/pg_hba.conf to /etc/postgresql/9.1/gold...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/gold/pg_ident.conf to /etc/postgresql/9.1/gold...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Configuring postgresql.conf to use port 5433...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo pg_createcluster 9.1 silver&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Creating new cluster (configuration: /etc/postgresql/9.1/silver, data: /var/lib/postgresql/9.1/silver)...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/silver/postgresql.conf to /etc/postgresql/9.1/silver...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/silver/pg_hba.conf to /etc/postgresql/9.1/silver...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/silver/pg_ident.conf to /etc/postgresql/9.1/silver...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Configuring postgresql.conf to use port 5434...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo pg_createcluster 9.1 bronze&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Creating new cluster (configuration: /etc/postgresql/9.1/bronze, data: /var/lib/postgresql/9.1/bronze)...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/bronze/postgresql.conf to /etc/postgresql/9.1/bronze...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/bronze/pg_hba.conf to /etc/postgresql/9.1/bronze...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Moving configuration file /var/lib/postgresql/9.1/bronze/pg_ident.conf to /etc/postgresql/9.1/bronze...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Configuring postgresql.conf to use port 5435...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo /etc/init.d/postgresql start 9.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * Starting PostgreSQL 9.1 database server             [ OK ] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo /etc/init.d/postgresql status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Running clusters: 9.1/bronze 9.1/gold 9.1/main 9.1/silver &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you can see, the original cluster is called main.&lt;/p&gt;
&lt;p&gt;Edit the &lt;code&gt;/etc/postgresql/9.1/{gold,silver,bronze}/pg_hba.conf&lt;/code&gt; file, and
change the authentication method to &lt;code&gt;trust&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--- a/pg_hba.conf	2011-12-16 21:54:34.062338553 +0200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++ b/pg_hba.conf	2011-12-16 23:12:26.010781522 +0200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@@ -87,11 +87,11 @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; # TYPE  DATABASE        USER            ADDRESS                 METHOD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; # &amp;quot;local&amp;quot; is for Unix domain socket connections only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-local   all             all                                     peer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+local   all             all                                     trust&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; # IPv4 local connections:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-host    all             all             127.0.0.1/32            md5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+host    all             all             127.0.0.1/32            trust&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; # IPv6 local connections:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-host    all             all             ::1/128                 md5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+host    all             all             ::1/128                 trust&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; # Allow replication connections from localhost, by a user with the&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; # replication privilege.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; #local   replication     postgres                                peer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Restart.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo /etc/init.d/postgresql restart 9.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * Restarting PostgreSQL 9.1 database server                &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo -u postgres createuser -p 5433 -s $USER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo -u postgres createuser -p 5434 -s $USER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ sudo -u postgres createuser -p 5435 -s $USER&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>IntelliJ IDEA 11 rocks!</title>
        <published>2011-12-07T12:00:00+02:00</published>
        <updated>2011-12-07T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/12/intellij-idea-11-rocks/"/>
        <id>https://mikael.io/posts/2011/12/intellij-idea-11-rocks/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/12/intellij-idea-11-rocks/">&lt;p&gt;IntelliJ IDEA 11 came out yesterday, and I&#39;ve been evaluating it by adding some
unit tests to a hobby project.&lt;/p&gt;
&lt;p&gt;The user interface (on Linux) has improved tremendously from the previous major
version. It&#39;s now better more eye-friendly than either Eclipse or NetBeans,
for a user who&#39;ll be staring at it for hours on end.&lt;/p&gt;
&lt;p&gt;Its Git integration is leaps and bounds past what either Eclipse offers, and
you can&#39;t even mention NetBeans (7.1 RC1) Git &quot;support&quot; in the same sentence.
It prompts you to &quot;git add&quot; files as you add them to the project, and has only
very relevant stuff in the commit and push workflows. Its quick diff is far
superior to Eclipse&#39;s, as is its review functionality. Finally, neither of
its competitors offers anything close to what its git push interface does.&lt;/p&gt;
&lt;p&gt;When writing unit tests, IDEA makes the smartest assumptions of contextual
test running. Control-Shift-F10 not only works by default on Linux, unlike
NetBeans&#39; and Eclipse&#39;s defaults, it detects your context from your cursor
position, running only your current test if your cursor is in a method, or
the entire class, if the cursor is between methods. Eclipse can do the same,
but it also has to pop up a dialog asking whether I want to run the unit test
on a server (?), and its keybindings need a lot of tweaking to work on Linux.
NetBeans just leaves the entire job of determining context to the user.&lt;/p&gt;
&lt;p&gt;Where NetBeans and Eclipse still win, however, is suggesting different class constructors, by their parameters and JavaDoc.&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;
NetBeans 7.1:&lt;br/&gt;
&lt;img src=&quot;http://1.bp.blogspot.com/-SecE3pEfMFE/Tt9NKLJjN1I/AAAAAAAAAj8/a50QfCBESVk/s1600/netbeans-71-string-constructor.png&quot; /&gt;
&lt;p align=&quot;center&quot;&gt;
IntelliJ IDEA 11:&lt;br/&gt;
&lt;img src=&quot;http://4.bp.blogspot.com/-Kkn478nNXwU/Tt9NKc7t4XI/AAAAAAAAAkI/MSAYi6dp5nI/s1600/idea-11-string-constructor.png&quot; style=&quot;display: block; margin-left: auto; margin-right: auto&quot; /&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Testing Spring Data JPA</title>
        <published>2011-11-26T12:00:00+02:00</published>
        <updated>2011-11-26T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/11/testing-spring-data-jpa/"/>
        <id>https://mikael.io/posts/2011/11/testing-spring-data-jpa/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/11/testing-spring-data-jpa/">&lt;p&gt;What I like about Spring libraries is that they just work, and they don&#39;t
suddenly stop working. The APIs are usually well thought-out.&lt;/p&gt;
&lt;p&gt;Spring Data JPA continues on the same track.&lt;/p&gt;
&lt;p&gt;I&#39;ve been going through recent developments in ORM / data access technology,
and porting my tiny skeleton application to each.
Today it&#39;s Spring Data JPA&#39;s turn.&lt;/p&gt;
&lt;p&gt;You provide an interface like this:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import java.util.List;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.data.repository.CrudRepository;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public interface ExampleDao extends CrudRepository&amp;lt;Example, Long&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    List&amp;lt;Example&amp;gt; findByNameLike(final String nameLike);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And configuration like that:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!xml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;jpa:repositories base-package=&amp;quot;com.gueck.spring3&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;bean id=&amp;quot;entityManagerFactory&amp;quot; class=&amp;quot;org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;property name=&amp;quot;dataSource&amp;quot; ref=&amp;quot;dataSource&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;property name=&amp;quot;jpaVendorAdapter&amp;quot; ref=&amp;quot;jpaVendorAdapter&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;property name=&amp;quot;persistenceUnitName&amp;quot; value=&amp;quot;default&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;bean id=&amp;quot;transactionManager&amp;quot; class=&amp;quot;org.springframework.orm.jpa.JpaTransactionManager&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;property name=&amp;quot;entityManagerFactory&amp;quot; ref=&amp;quot;entityManagerFactory&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;beans profile=&amp;quot;production&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;bean id=&amp;quot;dataSource&amp;quot; class=&amp;quot;org.postgresql.ds.PGPoolingDataSource&amp;quot; destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;property name=&amp;quot;serverName&amp;quot; value=&amp;quot;${db.serverName}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;property name=&amp;quot;databaseName&amp;quot; value=&amp;quot;${db.databaseName}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;property name=&amp;quot;user&amp;quot; value=&amp;quot;${db.username}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;property name=&amp;quot;password&amp;quot; value=&amp;quot;${db.password}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;bean id=&amp;quot;jpaVendorAdapter&amp;quot; class=&amp;quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;property name=&amp;quot;database&amp;quot; value=&amp;quot;POSTGRESQL&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;beans profile=&amp;quot;dev&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;jdbc:embedded-database id=&amp;quot;dataSource&amp;quot; type=&amp;quot;H2&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;jdbc:script location=&amp;quot;classpath:com/gueck/spring3/dev-schema.sql&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;jdbc:script location=&amp;quot;classpath:com/gueck/spring3/dev-test-data.sql&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;/jdbc:embedded-database&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;bean id=&amp;quot;jpaVendorAdapter&amp;quot; class=&amp;quot;org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;property name=&amp;quot;database&amp;quot; value=&amp;quot;H2&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!xml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;persistence version=&amp;quot;2.0&amp;quot; xmlns=&amp;quot;http://java.sun.com/xml/ns/persistence&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;persistence-unit name=&amp;quot;default&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/persistence&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After which Spring automatically builds, generates and injects a concrete
implementation of that interface to your application, where you can use it like so:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@Autowired private ExampleDao dao;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;model.put(&amp;quot;examples&amp;quot;, dao.findAll());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;model.put(&amp;quot;comedies&amp;quot;, dao.findByNameLike(&amp;quot;%y%&amp;quot;));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Calling the &lt;tt&gt;findByNameLike&lt;/tt&gt; method results in this SQL query being run:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;select example0_.id as id0_, example0_.name as name0_ from examples example0_ where example0_.name like ?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Compared to many other ways of building simple database access I&#39;ve tried and
used, Spring Data JPA takes the cake.&lt;/p&gt;
&lt;p&gt;The only complaint I have with it is that when integrating JPA entities with
Scaml, you have to refer to their property getters like so &lt;tt&gt;example.getName&lt;/tt&gt;
instead of Scaml autodetecting bean properties by simply &lt;tt&gt;example.name&lt;/tt&gt;,
but that&#39;s more of an issue with Scaml than Spring.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tools that make a difference</title>
        <published>2011-11-24T12:00:00+02:00</published>
        <updated>2011-11-24T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/11/tools-that-make-a-difference/"/>
        <id>https://mikael.io/posts/2011/11/tools-that-make-a-difference/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/11/tools-that-make-a-difference/">&lt;p&gt;When I first started out in the software product development business,
new and shiny tools frequently captivated my imagination.&lt;/p&gt;
&lt;p&gt;Over the years, I&#39;ve come to see that very few new tools truly let youdo new
things, or offer improvements more significant than the costs of their adoption.&lt;/p&gt;
&lt;p&gt;First, let&#39;s go over two disappointments:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ruby on Rails&lt;/strong&gt; is marketed as a way to reduce time to market. It delivers, when
your product is trivial microsites. Otherwise, the investment it requires, and
the restrictions it imposes, more than offset its merits.&lt;/p&gt;
&lt;p&gt;Likewise with &lt;strong&gt;Scala&lt;/strong&gt;. It&#39;s sold as an improvement in language expressivity,
but confuses &quot;more&quot; with &quot;better&quot;. It&#39;s not better for the vast majority of
business missions to be able and encouraged to perform the same primitive
operations in six different, largely unlegible ways. It&#39;s perfectly OK if your
mission is to produce academic papers, or sell a maximum amount of consultancy
hours, but for a customer of product development, a loss both in the short and
long terms. And that&#39;s even without going in the whole matter of upwards compatibility.&lt;/p&gt;
&lt;p&gt;From the bitter comes the sweet, however, and a few tools which truly make a
difference have come out of the innovation around these things:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HAML&lt;/strong&gt; is the best way to describe XML/HTML templates I&#39;ve yet to come across.
It introduces conceptual and communicative symmetry without taking away anything
important. On the JVM side, Scaml is an implementation of the same ideas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; (and Git) changed small software project management. Its predecessors
(SourceForge, other forges, java.net, Kenai et al.) were stuck in a rut with the
concept of how people can fix bugs and customize existing software projects, and
get those changes included in the upstream. The concept of person/team specific
repository namespaces, pull requests, and the fork and merge big red buttons
have let me do things that I&#39;d otherwise not done, as well as easily include others&#39; work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JRebel&lt;/strong&gt; has helped me to rapidly deal with a project in which I had to make
changes to an extremely slow-starting undocumented buggy component, that hadn&#39;t
originally been built to be testable. Most of the time, JRebel just works,
especially with a Spring stack. When I&#39;ve had problems with it with
less-reliable just-released JEE6 stack components, Anton has responded to support mails in hours.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Exciting stuff of November 2011</title>
        <published>2011-11-18T12:00:00+02:00</published>
        <updated>2011-11-18T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/11/exciting-stuff-november-2011/"/>
        <id>https://mikael.io/posts/2011/11/exciting-stuff-november-2011/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/11/exciting-stuff-november-2011/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.infoq.com/presentations/The-Kotlin-Programming-Language&quot;&gt;The IntelliJ Kotlin programming language&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.dartlang.org/&quot;&gt;The Google Dart programming language&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf&quot;&gt;Brian Goetz&#39;s cool Devoxx talk about Java 8 library co-evolution&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;http://cloudfoundry.org/ https://github.com/cloudfoundry&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Testing ORMLite</title>
        <published>2011-11-18T12:00:00+02:00</published>
        <updated>2011-11-18T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/11/testing-ormlite/"/>
        <id>https://mikael.io/posts/2011/11/testing-ormlite/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/11/testing-ormlite/">&lt;p&gt;While various JPA implementations are the standard for good reasons, I took the
time to shop around for some of the lighter ORM tools, especially one with a
reasonable SQL query builder DSL.&lt;/p&gt;
&lt;p&gt;ORMLite won this round, and I integrated it into my skeleton application, where
it replaced Spring JDBC.&lt;/p&gt;
&lt;p&gt;The @DatabaseTable and @DatabaseField annotations come with far fewer rules
than JPA beans. The _ID and _NAME constants are used with the query builder.&lt;/p&gt;
&lt;p&gt;src/main/java/com/gueck/spring3/Example.java:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.google.common.base.Objects;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.j256.ormlite.field.DatabaseField;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.j256.ormlite.table.DatabaseTable;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * Example domain class.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@DatabaseTable(tableName=&amp;quot;examples&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class Example {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public static final String _ID = &amp;quot;id&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @DatabaseField(columnName=_ID, generatedId=true)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Long id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public static final String _NAME = &amp;quot;name&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    /** A name to show in a user interface. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @DatabaseField(columnName=_NAME, canBeNull=false)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public String name;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Example() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Example(final String name) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        this.name = name;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Override&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public String toString() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return Objects.toStringHelper(this)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                .add(&amp;quot;id&amp;quot;, id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                .add(&amp;quot;name&amp;quot;, name)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                .toString();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unfortunately Spring doesn&#39;t automagically translate the SQLException to
DataAccessException, so I have to use the translator manually.&lt;/p&gt;
&lt;p&gt;src/main/java/com/gueck/spring3/ExampleDao.java:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.j256.ormlite.dao.Dao;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import java.sql.SQLException;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import java.util.List;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.jdbc.support.SQLExceptionTranslator;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.stereotype.Repository;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@Repository&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class ExampleDao {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Autowired&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private Dao&amp;lt;Example, Long&amp;gt; delegate;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static final SQLExceptionTranslator TRANSLATOR =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            new SQLErrorCodeSQLExceptionTranslator();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean createExample(final Example example) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return 1 == delegate.create(example);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } catch (final SQLException e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            throw TRANSLATOR.translate(&amp;quot;update example&amp;quot;, null, e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Example readExample(final Long id) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return delegate.queryForId(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } catch (final SQLException e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            throw TRANSLATOR.translate(&amp;quot;read example&amp;quot;, null, e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean updateExample(final Example example) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return 1 == delegate.update(example);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } catch (final SQLException e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            throw TRANSLATOR.translate(&amp;quot;update example&amp;quot;, null, e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean deleteExample(final Long id) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return 1 == delegate.deleteById(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } catch (final SQLException e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            throw TRANSLATOR.translate(&amp;quot;delete example&amp;quot;, null, e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public List&amp;lt;Example&amp;gt; listExamples() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return delegate.queryForAll();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } catch (final SQLException e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            throw TRANSLATOR.translate(&amp;quot;list examples&amp;quot;, null, e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    /**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     * Comedy examples always have a &amp;#39;y&amp;#39; character in their names.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public List&amp;lt;Example&amp;gt; listComedies() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        try {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return delegate.queryBuilder().where().like(Example._NAME, &amp;quot;%y%&amp;quot;).query();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } catch (final SQLException e) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            throw TRANSLATOR.translate(&amp;quot;list comedies&amp;quot;, null, e);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configuring ORMLite with Spring is painless. Had to switch HSQLdb to H2,
since HSQLdb threw some permission exceptions when used with ORMLite.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!xml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:jdbc=&amp;quot;http://www.springframework.org/schema/jdbc&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        xmlns:c=&amp;quot;http://www.springframework.org/schema/c&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        xmlns:cache=&amp;quot;http://www.springframework.org/schema/cache&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xsi:schemaLocation=&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- DispatcherServlet Context: defines this servlet&amp;#39;s request-processing infrastructure --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- Scans within the base package of the application for @Components to configure as beans --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- @Controller, @Service, @Configuration, etc. --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;context:component-scan base-package=&amp;quot;com.gueck.spring3&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- Enables the Spring MVC @Controller programming model --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;mvc:resources mapping=&amp;quot;/resources/**&amp;quot; location=&amp;quot;/WEB-INF/resources/&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;cache:annotation-driven /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;cacheManager&amp;quot; class=&amp;quot;org.springframework.cache.support.SimpleCacheManager&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;property name=&amp;quot;caches&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;set&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                &amp;lt;bean class=&amp;quot;org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean&amp;quot; p:name=&amp;quot;examples&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;/set&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;/property&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;viewNameTranslator&amp;quot; class=&amp;quot;org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;scalateViewResolver&amp;quot; class=&amp;quot;org.fusesource.scalate.spring.view.ScalateViewResolver&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p:order=&amp;quot;1&amp;quot; p:prefix=&amp;quot;/WEB-INF/view/&amp;quot; p:suffix=&amp;quot;.scaml&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;viewResolver&amp;quot; class=&amp;quot;org.springframework.web.servlet.view.InternalResourceViewResolver&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         p:order=&amp;quot;2&amp;quot; p:viewClass=&amp;quot;org.springframework.web.servlet.view.JstlView&amp;quot; p:prefix=&amp;quot;/WEB-INF/jsp/&amp;quot; p:suffix=&amp;quot;.jsp&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;context:property-placeholder /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;jdbcTemplate&amp;quot; class=&amp;quot;org.springframework.jdbc.core.JdbcTemplate&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p:dataSource-ref=&amp;quot;dataSource&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;connectionSource&amp;quot; class=&amp;quot;com.j256.ormlite.jdbc.DataSourceConnectionSource&amp;quot; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        init-method=&amp;quot;initialize&amp;quot; c:_0-ref=&amp;quot;dataSource&amp;quot; c:_1-ref=&amp;quot;databaseType&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;exampleLiteDao&amp;quot; class=&amp;quot;com.j256.ormlite.spring.DaoFactory&amp;quot; factory-method=&amp;quot;createDao&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        c:_0-ref=&amp;quot;connectionSource&amp;quot; c:_1=&amp;quot;com.gueck.spring3.Example&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;beans profile=&amp;quot;production&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;bean id=&amp;quot;dataSource&amp;quot; class=&amp;quot;org.postgresql.ds.PGPoolingDataSource&amp;quot; destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;serverName&amp;quot; value=&amp;quot;${db.serverName}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;databaseName&amp;quot; value=&amp;quot;${db.databaseName}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;user&amp;quot; value=&amp;quot;${db.username}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;password&amp;quot; value=&amp;quot;${db.password}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;bean id=&amp;quot;databaseType&amp;quot; class=&amp;quot;com.j256.ormlite.db.PostgresDatabaseType&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;beans profile=&amp;quot;dev&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;jdbc:embedded-database id=&amp;quot;dataSource&amp;quot; type=&amp;quot;H2&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;jdbc:script location=&amp;quot;classpath:com/gueck/spring3/dev-schema.sql&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;jdbc:script location=&amp;quot;classpath:com/gueck/spring3/dev-test-data.sql&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;/jdbc:embedded-database&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;bean id=&amp;quot;databaseType&amp;quot; class=&amp;quot;com.j256.ormlite.db.H2DatabaseType&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Spring 3.1 MVC skeleton project upgrade</title>
        <published>2011-11-14T12:00:00+02:00</published>
        <updated>2011-11-14T12:00:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/11/spring-31-skeleton-project-upgrade/"/>
        <id>https://mikael.io/posts/2011/11/spring-31-skeleton-project-upgrade/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/11/spring-31-skeleton-project-upgrade/">&lt;p&gt;Over the weekend I upgraded my Spring project skeleton to include Spring 3.1 MVC support.&lt;/p&gt;
&lt;p&gt;The skeleton app uses Scaml, a HAML-variant, as its view layer.
The index page merely lists all the examples we have available.&lt;/p&gt;
&lt;p&gt;It also contains the standard dependencies I usually recommend:
Spring Framework 3.1, Joda-Time 2.0, Guava 10, LogBack/SLF4j, JUnit, Mockito and PostgreSQL.&lt;/p&gt;
&lt;p&gt;The skeleton application is available as a Maven project at my BitBucket page at
&lt;a href=&quot;http://dev.gueck.com/project-skeletons/src/tip/spring3-web&quot;&gt;http://dev.gueck.com/project-skeletons/src/tip/spring3-web&lt;/a&gt;.
It can be executed with the command &lt;tt&gt;mvn -Dspring.profiles.active=dev jetty:run&lt;/tt&gt;.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!haml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-@ var examples:java.util.List[com.gueck.spring3.Example]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;!!! 1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;%html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  %head&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    %title Example application with #{examples.size} examples.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  %body&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    %form(method=&amp;#39;POST&amp;#39; action=&amp;#39;/submitExample&amp;#39;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      %input(type=&amp;#39;text&amp;#39; name=&amp;#39;name&amp;#39;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      %input(type=&amp;#39;submit&amp;#39; value=&amp;#39;OK&amp;#39;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    %p Our Examples:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - for(x &amp;lt;- examples)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      %p.example&amp;lt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        %a(href=&amp;#39;/edit/#{x.id}&amp;#39;) #{x.name}!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The embedded development database gets re-initialized with a schema and test data at every application restart.&lt;/p&gt;
&lt;p&gt;src/main/resources/com/gueck/spring3/dev-schema.sql:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE TABLE examples (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  id IDENTITY,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  name VARCHAR(65536)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;src/main/resources/com/gueck/spring3/dev-test-data.sql:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!sql&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;INSERT INTO examples (name)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;VALUES (&amp;#39;The Wire&amp;#39;), (&amp;#39;The West Wing&amp;#39;), (&amp;#39;The Daily Show&amp;#39;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Spring MVC controller, service and DAO classes don&#39;t need much introduction.&lt;/p&gt;
&lt;p&gt;src/main/java/com/gueck/spring3/ExampleController.java:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.stereotype.Controller;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.ui.ModelMap;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.web.bind.annotation.RequestMapping;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.web.bind.annotation.RequestMethod;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.web.bind.annotation.RequestParam;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@Controller&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class ExampleController {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Autowired&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private ExampleService exampleService;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Autowired&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private ExampleDao dao;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @RequestMapping(&amp;quot;/&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public String welcome(final ModelMap model) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        model.put(&amp;quot;examples&amp;quot;, dao.listExamples());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return &amp;quot;index&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @RequestMapping(value=&amp;quot;/submitExample&amp;quot;, method=RequestMethod.POST)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public String submitExample(@RequestParam final String name) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        exampleService.submitNewExample(new Example(name));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return &amp;quot;redirect:/&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The service makes the business decisions, such as whom to exclude, and also demonstrates Guava&#39;s usefulness in collection handling.&lt;/p&gt;
&lt;p&gt;src/main/java/com/gueck/spring3/ExampleService.java:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import static com.google.common.collect.Iterables.any;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.google.common.base.Predicate;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.google.common.collect.ImmutableList;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.stereotype.Service;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class ExampleService {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Autowired&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private ExampleDao dao;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static Predicate&amp;lt;String&amp;gt; contains(final String match) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return new Predicate&amp;lt;String&amp;gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            @Override public boolean apply(final String input) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                return match.toLowerCase().contains(input.toLowerCase());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private ImmutableList&amp;lt;String&amp;gt; badWords = ImmutableList.of(&amp;quot;republican&amp;quot;, &amp;quot;religion&amp;quot;, &amp;quot;true finns&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean submitNewExample(final Example example) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (any(badWords, contains(example.name))) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return false;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        } else {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return dao.createExample(example);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The easiest way to do a simple CRUD DAO is with Spring JDBC, but it gets progressively more complex as your domain tables/classes get more complex, and pretty soon you&#39;re better off with just going with JPA.&lt;/p&gt;
&lt;p&gt;src/main/java/com/gueck/spring3/ExampleDao.java:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import java.util.List;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.beans.factory.annotation.Autowired;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.jdbc.core.JdbcTemplate;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.stereotype.Repository;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@Repository&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class ExampleDao {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static final String INSERT_EXAMPLE = &amp;quot;INSERT INTO examples (name) VALUES (?)&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static final String SELECT_EXAMPLE = &amp;quot;SELECT * FROM examples WHERE id = ?&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static final String UPDATE_EXAMPLE = &amp;quot;UPDATE examples SET name = ? WHERE id = ?&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static final String DELETE_EXAMPLE = &amp;quot;DELETE FROM examples WHERE id = ?&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private static final String LIST_EXAMPLES = &amp;quot;SELECT * FROM examples&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Autowired&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    private JdbcTemplate jdbcTemplate;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean createExample(final Example example) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return 1 == jdbcTemplate.update(INSERT_EXAMPLE, example.name);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Example readExample(final long id) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return jdbcTemplate.queryForObject(SELECT_EXAMPLE, Example.MAPPER, id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean updateExample(final Example example) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return 1 == jdbcTemplate.update(UPDATE_EXAMPLE, example.name, example.id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean deleteExample(final long id) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return 1 == jdbcTemplate.update(DELETE_EXAMPLE, id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public List&amp;lt;Example&amp;gt; listExamples() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return jdbcTemplate.query(LIST_EXAMPLES, Example.MAPPER);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The skeleton domain class uses Guava&#39;s ToStringHelper, and contains a static instance of Spring JDBC&#39;s RowMapper.&lt;/p&gt;
&lt;p&gt;I like to situate some or many of the Spring JDBC helpers in the actual domain
class, but the location varies depending on the various architectural visions
you might embrace.&lt;/p&gt;
&lt;p&gt;src/main/java/com/gueck/spring3/Example.java:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!java&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;package com.gueck.spring3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import com.google.common.base.Objects;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import java.sql.ResultSet;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import java.sql.SQLException;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;import org.springframework.jdbc.core.RowMapper;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * Example domain class.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public class Example {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Long id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    /** A name to show in a user interface. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public String name;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Example() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public Example(final String name) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        this.name = name;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public static final RowMapper&amp;lt;Example&amp;gt; MAPPER = new RowMapper&amp;lt;Example&amp;gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        @Override&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        public Example mapRow(ResultSet rs, int rowNum) throws SQLException {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            final Example ret = new Example();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ret.id = rs.getLong(&amp;quot;id&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ret.name = rs.getString(&amp;quot;name&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return ret;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Override&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public String toString() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return Objects.toStringHelper(this)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                .add(&amp;quot;id&amp;quot;, id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                .add(&amp;quot;name&amp;quot;, name)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                .toString();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Override&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public int hashCode() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return Objects.hashCode(id, name);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @Override&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    public boolean equals(Object obj) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (obj == null) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return false;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (getClass() != obj.getClass()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return false;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        final Example other = (Example) obj;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (!java.util.Objects.equals(this.id, other.id)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return false;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (!java.util.Objects.equals(this.name, other.name)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            return false;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return true;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Spring XML configuration file now demonstrates the new mvc:resources-tag, as well as profiles, and how to create a embedded development database with them.&lt;/p&gt;
&lt;p&gt;src/main/webapp/WEB-INF/springmvc-servlet.xml:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!xml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;beans xmlns=&amp;quot;http://www.springframework.org/schema/beans&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:mvc=&amp;quot;http://www.springframework.org/schema/mvc&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:jdbc=&amp;quot;http://www.springframework.org/schema/jdbc&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        xmlns:p=&amp;quot;http://www.springframework.org/schema/p&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        xmlns:c=&amp;quot;http://www.springframework.org/schema/c&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xmlns:context=&amp;quot;http://www.springframework.org/schema/context&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    xsi:schemaLocation=&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- DispatcherServlet Context: defines this servlet&amp;#39;s request-processing infrastructure --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- Scans within the base package of the application for @Components to configure as beans --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- @Controller, @Service, @Configuration, etc. --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;context:component-scan base-package=&amp;quot;com.gueck.spring3&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!-- Enables the Spring MVC @Controller programming model --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;mvc:annotation-driven /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;mvc:resources mapping=&amp;quot;/resources/**&amp;quot; location=&amp;quot;/WEB-INF/resources/&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;viewNameTranslator&amp;quot; class=&amp;quot;org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;scalateViewResolver&amp;quot; class=&amp;quot;org.fusesource.scalate.spring.view.ScalateViewResolver&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p:order=&amp;quot;1&amp;quot; p:prefix=&amp;quot;/WEB-INF/view/&amp;quot; p:suffix=&amp;quot;.scaml&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;viewResolver&amp;quot; class=&amp;quot;org.springframework.web.servlet.view.InternalResourceViewResolver&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         p:order=&amp;quot;2&amp;quot; p:viewClass=&amp;quot;org.springframework.web.servlet.view.JstlView&amp;quot; p:prefix=&amp;quot;/WEB-INF/jsp/&amp;quot; p:suffix=&amp;quot;.jsp&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;context:property-placeholder /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;bean id=&amp;quot;jdbcTemplate&amp;quot; class=&amp;quot;org.springframework.jdbc.core.JdbcTemplate&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        p:dataSource-ref=&amp;quot;dataSource&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;beans profile=&amp;quot;production&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;bean id=&amp;quot;dataSource&amp;quot; class=&amp;quot;org.postgresql.ds.PGPoolingDataSource&amp;quot; destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;serverName&amp;quot; value=&amp;quot;${db.serverName}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;databaseName&amp;quot; value=&amp;quot;${db.databaseName}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;user&amp;quot; value=&amp;quot;${db.username}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;property name=&amp;quot;password&amp;quot; value=&amp;quot;${db.password}&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;beans profile=&amp;quot;dev&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;jdbc:embedded-database id=&amp;quot;dataSource&amp;quot; type=&amp;quot;HSQL&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;jdbc:script location=&amp;quot;classpath:com/gueck/spring3/dev-schema.sql&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &amp;lt;jdbc:script location=&amp;quot;classpath:com/gueck/spring3/dev-test-data.sql&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;/jdbc:embedded-database&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Email MIME container handling inside PostgreSQL with PL/Python</title>
        <published>2011-10-15T12:00:00+03:00</published>
        <updated>2011-10-15T12:00:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/10/email-mime-container-handling-inside/"/>
        <id>https://mikael.io/posts/2011/10/email-mime-container-handling-inside/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/10/email-mime-container-handling-inside/">&lt;p&gt;Some examples from a discussion with some colleagues of how to best
handle complex LOB parsing for rare ad-hoc analytical business database queries.&lt;/p&gt;
&lt;script src=&quot;http://dev.gueck.com/code-examples/src/db91366dd5cf/pgmail.sql?embed=t&quot;&gt;&lt;/script&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Google Dart + JetBrains Kotlin = ethical hotness</title>
        <published>2011-10-10T12:00:00+03:00</published>
        <updated>2011-10-10T12:00:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/10/google-dart-jetbrains-kotlin-ethical/"/>
        <id>https://mikael.io/posts/2011/10/google-dart-jetbrains-kotlin-ethical/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/10/google-dart-jetbrains-kotlin-ethical/">&lt;p&gt;I&#39;ve written software for pay in many various languages, and lately mostly in Java,
since professional ethics require me to recommend and use the language with the
most balanced match of individual, group and business features to my employer&#39;s
business objectives and mission.&lt;/p&gt;
&lt;p&gt;What excites me about a couple new tools coming out in the 4Q2011-1H2012 timeframe,
is that they seem credible competitors for tool choices compatible with professional ethics.&lt;/p&gt;
&lt;p&gt;Google Dart came out today, and offers the promise of a strong player bringing
significant change to the best way of delivering applications to both consumers
and business users today.&lt;/p&gt;
&lt;p&gt;JetBrains Kotlin is yet to be published, but is proposed by one of the strongest niche
players in the software tools landscape, and offers to actually reduce complexity of
backend programming, without sacrificing the supporting tooling which gives
participants to the Java ecosystem a lot of good value. It&#39;s different enough
from Java to be worth an investment, but evades the trap many of its purported
competitors fell into - optimizing the language for academic papers, and pushing out
duplicate half-baked features after another.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>X79 Siler + i7-3930K: Java-sovellusten palvelinraudan sweet spot 4Q2011-1Q2012</title>
        <published>2011-08-14T12:00:00+03:00</published>
        <updated>2011-08-14T12:00:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/08/x79-siler-i7-3930k/"/>
        <id>https://mikael.io/posts/2011/08/x79-siler-i7-3930k/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/08/x79-siler-i7-3930k/">&lt;p&gt;Tyypilliset Java-palvelinsovellukset, business-tietokannat ja business-virtuaalikoneet
eivät käytä CPU:ta tapissa, vaan niiden kustannustehokkuuden portinvartijana on keskusmuisti,
ja muutaman kymmenen gigan datasettiin kohdistuvat IOPS:it.&lt;/p&gt;
&lt;p&gt;X79 Siler-emolevyt tarjoavat mahdollisuuden kahdeksaan DDR3 slottiin per prosessori,
eli 64 GB (latenssiltaan symmetriseen, NUMA:n tarpeettomuuden vuoksi) keskusmuistiin,
yhdistettynä LGA2011 kantaiseen prosessoriin, kuten Sandy Bridge-E i7-3930K.&lt;/p&gt;
&lt;p&gt;Intelin 320-sarjan SSD-levyt eivät (PostgreSQL-kehittäjien kokeiden mukaan) tarvitse
superkapasitaattoria virtakatkoista selvitäkseen, ja niiden hinnat liikkuvat parissa
eurossa per gigatavu, melko tyylikkäillä IOPS-luvuilla.&lt;/p&gt;
&lt;p&gt;Tälläinen prosumer-vallankumous tarjoaa uskaltavalle ja yrittävälle firmalle mahdollisuuden
rakentaa Suomen (ja lähialueiden, jos vähän näkee vaivaa) mittakaavaisiin tuotteisiin hyvin
edullisesti ominaisuuksia, joiden kustannukset olisivat olleet satakertaisia vielä vuosi
tai pari sitten.&lt;/p&gt;
&lt;p&gt;Jotta voi ottaa ilon irti rautapuolen kehityksestä, pitää vaan pysytellä kauempana
harrastajaporukan ohjelmistokehityksen työkaluista, kuten skriptikielistä jotka eivät
vaan käytännössä pysty käyttämään samanaikaisesti kahtatoista säiekontekstia,
ja käyttämään keskusmuistia säieturvallisesti datasetin käsittelyyn.&lt;/p&gt;
&lt;p&gt;8GB registered DDR3 hinnat saisivat vielä pudota...&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Charliella on asiaa</title>
        <published>2011-07-16T12:00:00+03:00</published>
        <updated>2011-07-16T12:00:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/07/charliella-on-asiaa/"/>
        <id>https://mikael.io/posts/2011/07/charliella-on-asiaa/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/07/charliella-on-asiaa/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=QcvjoWOwnn4&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube-nocookie.com/embed/QcvjoWOwnn4?rel=0&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Running Java .WARs at port 80 with Ivy, Jetty, upstart, authbind and OpenJDK</title>
        <published>2011-04-28T23:30:00+03:00</published>
        <updated>2011-04-28T23:30:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/04/java-port-80-ubuntu-ivy-authbind/"/>
        <id>https://mikael.io/posts/2011/04/java-port-80-ubuntu-ivy-authbind/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/04/java-port-80-ubuntu-ivy-authbind/">&lt;p&gt;First, let&#39;s install the various dependencies:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo apt-get install openjdk-6-jdk ivy authbind curl nano&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We need to create a Hello, World! application to test with:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo mkdir /var/tmp/helloworld&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo chown 1000 /var/tmp/helloworld&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;#39;&amp;lt;%= &amp;quot;Hello, World! &amp;quot; + new java.util.Date() %&amp;gt;&amp;#39; &amp;gt; /var/tmp/helloworld/index.jsp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s test that ivy can fetch us the requirements for running Jetty.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/usr/lib/jvm/java-6-openjdk/bin/java -jar /usr/share/java/ivy.jar -dependency org.mortbay.jetty jetty-runner 7.3.1.v20110307&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use the same mechanism to start up Jetty on port 8080 for /var/tmp/helloworld.
Since the previous run cached the dependencies to ~/.ivy2/cache/,
this time Jetty will start up much faster.&lt;/p&gt;
&lt;p&gt;Notice, that whichever user you end up running the service as must have
an existing home directory which they also own.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/usr/lib/jvm/java-6-openjdk/bin/java -jar /usr/share/java/ivy.jar -dependency org.mortbay.jetty jetty-runner 7.3.1.v20110307 -main org.mortbay.jetty.runner.Runner -- --port 8080 /var/tmp/helloworld&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;curl http://localhost:8080/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next we need to configure authbind to let you bind to port 80 as a
regular user. Unfortunately, Authbind has a bug in that it doesn&#39;t let
you just configure permissions for 0.0.0.0/0, and you have to define
one row for all addresses which start with bit 0 and one row for bit 1.
A bit funny, but it works.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;#39;0.0.0.0/1:1,32000&amp;#39; &amp;gt; authbind.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;#39;127.0.0.0/1:1,32000&amp;#39; &amp;gt;&amp;gt; authbind.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo mv authbind.conf /etc/authbind/byuid/1000 # assuming that your uid is 1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo chown 1000 /etc/authbind/byuid/1000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s test your helloworld with Jetty and Authbind together, notice that we must
explicitly tell Java to use the IPv4 stack with &lt;code&gt;-Djava.net.preferIPv4Stack=true&lt;/code&gt;
for authbind to do its jobs properly:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/usr/bin/authbind --deep /usr/lib/jvm/java-6-openjdk/bin/java -Djava.net.preferIPv4Stack=true -jar /usr/share/java/ivy.jar -dependency org.mortbay.jetty jetty-runner 7.3.1.v20110307 -main org.mortbay.jetty.runner.Runner -- --port 80 /var/tmp/helloworld&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;curl http://localhost/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since everything went swimmingly so far, we&#39;ll go ahead and create an
Upstart script to automatically start the service when the server comes up:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo nano -w /etc/init/helloworld.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# Create a file with the following contents:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;start on runlevel [2345]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stop on runlevel [!2345]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;exec /usr/bin/sudo -u &amp;#39;#1000&amp;#39; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  /usr/bin/authbind --deep \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  /usr/bin/java -Djava.net.preferIPv4Stack=true -jar /usr/share/java/ivy.jar \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -dependency org.mortbay.jetty jetty-runner 7.3.1.v20110307 \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -main org.mortbay.jetty.runner.Runner -- \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          --port 80 /var/tmp/helloworld \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;gt; /dev/null 2&amp;gt; /dev/null&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we&#39;re ready to test and see that our Upstart script pulls everything together correctly:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo start helloworld&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;curl http://localhost/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If upstart complains that it can&#39;t find the service, or something or other,
make sure that the exec statement in helloworld.conf is perfect in that it
doesn&#39;t contain any suprise spaces after the backslashes.&lt;/p&gt;
&lt;p&gt;To further customize your environment, take a look at the additional parameters Jetty and Ivy accept:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/usr/lib/jvm/java-6-openjdk/bin/java -jar /usr/share/java/ivy.jar -help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/usr/lib/jvm/java-6-openjdk/bin/java -jar /usr/share/java/ivy.jar -dependency org.mortbay.jetty jetty-runner 7.3.1.v20110307 -main org.mortbay.jetty.runner.Runner -- --help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Have fun!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Impressed with VMWare Cloud Foundry</title>
        <published>2011-04-20T16:00:00+03:00</published>
        <updated>2011-04-20T16:00:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2011/04/impressed-with-vmware-cloud-foundry/"/>
        <id>https://mikael.io/posts/2011/04/impressed-with-vmware-cloud-foundry/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2011/04/impressed-with-vmware-cloud-foundry/">&lt;p&gt;Just got my VMWare Cloud Foundry login, and tried my first application there.&lt;/p&gt;
&lt;p&gt;I&#39;ve previously used Google App Engine and Amazon EC2 for production apps, and Cloud Foundry blows them out of water by its ease of use.&lt;/p&gt;
&lt;p&gt;The feature I&#39;m most interested to measure is IOPS and disk throughput, though.&lt;/p&gt;
&lt;p&gt;I&#39;ll have to block out some time to test that, some time this week.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ vmc runtimes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+--------+-------------+-----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| Name   | Description | Version   |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+--------+-------------+-----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| node   | Node.js     | 0.4.5     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| java   | Java 6      | 1.6       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| ruby18 | Ruby 1.8    | 1.8.7     |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| ruby19 | Ruby 1.9    | 1.9.2p180 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+--------+-------------+-----------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ vmc frameworks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| Name    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| grails  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| node    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| spring  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| sinatra |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| rails3  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ vmc services&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;============== System Services ==============&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---------+---------+-------------------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| Service | Version | Description                   |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---------+---------+-------------------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| mysql   | 5.1     | MySQL database service        |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| mongodb | 1.8     | MongoDB NoSQL store           |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| redis   | 2.2     | Redis key-value store service |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+---------+---------+-------------------------------+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=========== Provisioned Services ============&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No PostgreSQL 9.0 yet... :(&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>&#39;The Evolution of Confusion&#39; by Dan Dennett, AAI 2009</title>
        <published>2010-10-17T19:45:00+03:00</published>
        <updated>2010-10-17T19:45:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/10/evolution-of-confusion-by-dan-dennett/"/>
        <id>https://mikael.io/posts/2010/10/evolution-of-confusion-by-dan-dennett/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/10/evolution-of-confusion-by-dan-dennett/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=D_9w8JougLQ&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube-nocookie.com/v/D_9w8JougLQ?fs=1&amp;hl=en_US&amp;rel=0&amp;hd=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OpenBlocks branch</title>
        <published>2010-09-09T15:54:00+03:00</published>
        <updated>2010-09-09T15:54:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/09/openblocks-branch/"/>
        <id>https://mikael.io/posts/2010/09/openblocks-branch/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/09/openblocks-branch/">&lt;p&gt;I&#39;ve started my own refactoring branch of MIT OpenBlocks, to make the project
more amenable to inclusion to other applications. I&#39;m using this project to
test-drive GitHub/git, which seems pretty nice compared to BitBucket/hg, which
I&#39;ve been using lately.&lt;/p&gt;
&lt;p&gt;The branch is available at &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://github.com/mikaelhg/openblocks&quot;&gt;http://github.com/mikaelhg/openblocks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&#39;ve also been contemplating moving this blog to GitHub Pages, and using
Google SideWiki for comments.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Uusi Nokia?</title>
        <published>2010-07-29T13:17:00+03:00</published>
        <updated>2010-07-29T13:17:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/07/uusi-nokia/"/>
        <id>https://mikael.io/posts/2010/07/uusi-nokia/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/07/uusi-nokia/">&lt;p&gt;Tuollainen &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://uusinokia.livejournal.com/&quot;&gt;uusi Nokia&lt;/a&gt; voisi kuulostaa paikalta jossa teknologistit ehkä
tykkäisivätkin työskennellä.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>La Haine, one of the better movies</title>
        <published>2010-07-12T11:10:00+03:00</published>
        <updated>2010-07-12T11:10:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/07/la-haine-grunwalski/"/>
        <id>https://mikael.io/posts/2010/07/la-haine-grunwalski/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/07/la-haine-grunwalski/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=sOHp_UV77zY&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube-nocookie.com/v/sOHp_UV77zY?fs=1&amp;hl=en_US&amp;rel=0&amp;hd=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Kuinka käyttää vähemmän rahaa ohjelmistoprojekteihin</title>
        <published>2010-05-22T16:01:00+03:00</published>
        <updated>2010-05-22T16:01:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/05/kuinka-kayttaa-vahemman-rahaa/"/>
        <id>https://mikael.io/posts/2010/05/kuinka-kayttaa-vahemman-rahaa/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/05/kuinka-kayttaa-vahemman-rahaa/">&lt;p&gt;Isoista ohjelmistoprojekteista tekee Suomessa erityisen kalliita se, ettei
toimittajataho osaa, halua, tai vaan saa riittävää tilaisuutta selittää
tilaajataholle projektien kulurakenteiden merkitystä, eikä
tilaajaorganisaatiossa ole tilaisuutta kerätä budjetointiosaamista. On maamme
köyhä, siksi jää!&lt;/p&gt;
&lt;p&gt;Tästä seuraa usein se, että tilaajaorganisaatio antaa rahansa halvimman
kiinteän tarjouksen tehneelle, joka lopulta toimittaa ohjelmiston, josta
seuraavat kokonaiskustannukset ohjelmiston tavoite-elinkaaren aikana ovat
moninkertaiset suhteessa tarjouksiin, joiden kulurakenteet ovat tasapainossa,
ja joiden ensimmäisen vaiheen hinta on siksi korkeampi kuin voittaneen
tarjouksen.&lt;/p&gt;
&lt;p&gt;Tähän problematiikkaan pääsisi käsiksi siten, että tilaajaorganisaatiossa
valmistauduttaisiin psykologisesti ja poliittisesti siihen, että isoja
ohjelmistoja hankittaessa prosessin osapuolten pitää ensin harjoitella
yhdessä, jotta osaavat viestiä toisilleen. Tämän jälkeen vasta lähdetään
yleisön eteen soittamaan.&lt;/p&gt;
&lt;p&gt;Konkreettisesti vuoden tai parin ohjelmistotoimitusprojektia suunniteltaessa
lisätään jo ihan alussa kalenteriin ylimääräinen vuosi, ja budjettiin 10
ylimääräistä henkilötyövuotta, 3 tilaajalta ja 7 toimittajalta, joiden avulla
ylimääräisen vuoden aikana harjoitellaan yhdessä konkretisoimalla ajatuksia
viikon toimitussykleissä prototyypeiksi, joita stakeholderit voivat yhdessä
hypistellä, samalla kuin tarkentavat omia ajatuksiaan itselleen ja toisilleen.&lt;/p&gt;
&lt;p&gt;Lopputulemana tämän vuoden jälkeen on suunnitelma, speksit ja aikataulu,
joissa voidaan aikuisten oikeasti pysyä, ja samalla tuottaa ohjelmisto jonka
käyttökustannukset ovat järkevässä suhteessa tilaajan muihin
prosessikustannuksiin.&lt;/p&gt;
&lt;p&gt;Keskikokoisissa projekteissa harjoittelua voidaan skaalata puoleen vuoteen, ja
pienissä kolmeen kuukauteen. Tässä puhun tietysti suurten organisaatioiden
skaaloista, en PK-yritysten webbisivuista.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mirror, mirror on the wall, who in the land is most in need of Colt and RowSet of them all?</title>
        <published>2010-05-10T16:11:00+03:00</published>
        <updated>2010-05-10T16:11:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/05/mirror-mirror-on-wall-who-in-land-is/"/>
        <id>https://mikael.io/posts/2010/05/mirror-mirror-on-wall-who-in-land-is/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/05/mirror-mirror-on-wall-who-in-land-is/">&lt;p&gt;Through the miracle of BitBucket, or soon GitHub if BitBucket doesn&#39;t start
getting a bit faster, I bring you discrete, mavenized mirrors of &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://dev.gueck.com/cern-colt-mirror/&quot;&gt;CERN Colt
1.2.0&lt;/a&gt; and com.sun.rowset.CachedRowSetImpl -&amp;gt;
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://dev.gueck.com/rowset/&quot;&gt;gumi.rowset.CachedRowSetImpl&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;People refactoring older JDBC-based applications will find a non-com.sun-based
CachedRowSetImpl class useful, as it doesn&#39;t evoke nasty, unoverrideable
compiler warnings.&lt;/p&gt;
&lt;p&gt;CERN Colt was last updated in 2004, and it&#39;s slowly disappearing from the web,
which is why I wanted to make a mirror of it while it&#39;s still around. My
employer uses it in a few projects, although I&#39;ll upgrade to fastutil/trove
ASAP.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>What&#39;s important</title>
        <published>2010-05-01T11:27:00+03:00</published>
        <updated>2010-05-01T11:27:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/05/whats-important/"/>
        <id>https://mikael.io/posts/2010/05/whats-important/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/05/whats-important/">&lt;p&gt;Lately I&#39;ve been thinking about values and what&#39;s important, and come to the
conclusion that there are really three things which tower above everything else:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Keeping your word&lt;/li&gt;
&lt;li&gt;Keeping your powder dry (i.e. always preparing for what you can)&lt;/li&gt;
&lt;li&gt;Showing your respect at what people are and what they do&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There are many other aspects in life, and many subtleties to consider in any
given situation, but these three things let you effectively tackle life&#39;s
problems with the help of other people.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Agile-ambivalenssi</title>
        <published>2010-01-07T06:19:00+02:00</published>
        <updated>2010-01-07T06:19:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2010/01/agile-ambivalenssi/"/>
        <id>https://mikael.io/posts/2010/01/agile-ambivalenssi/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2010/01/agile-ambivalenssi/">&lt;p&gt;Agilen ajatteleminen jättää minut ambivalentiksi.&lt;/p&gt;
&lt;p&gt;Toisaalta kannatan kaikkea, mikä kehittää kehitystä.&lt;/p&gt;
&lt;p&gt;Toisaalta aiheesta keskustelu lähiympäristöni Agile-konsulttien kanssa tuo
mieleen ne keskustelut, joissa ei niin monta vuotta sitten yritin myydä
samoille ihmisille ajatusta siitä, että lähdekoodin versionhallintaa ei
kannata jättää vain sähköpostin varaan.&lt;/p&gt;
&lt;p&gt;Onko se edistystä, mitä kutsutaan edistykseksi?&lt;/p&gt;
&lt;p&gt;Olen kehittänyt softaa eri rooleissa yli 15 vuotta, ja tämä aika on opettanut
minulle, että useimmilla maailman ilmiöillä, sekä hyvillä että huonoilla, on
minulle paljon opetettavaa, ja silmien sulkeminen jokapäiväisiltä opetuksilta
vain siksi ettei niiden takana ole auktoriteettia, on elämän hukkausta.&lt;/p&gt;
&lt;p&gt;Samalla kun opin monenlaisista ilmiöistä niiden läksyn, tiedostan kuitenkin,
ettei välttämättä näitä itsessään opettavaisia ilmiöitä ja tapoja toimia
kannata yrittää jäljitellä omassa toiminnassa, sillä opetuksen hyödyllisyys on
sidoksissa toiminnan kontekstiin.&lt;/p&gt;
&lt;p&gt;Tehdashallin lean-ajattelun takana olevien kahden peruspilarin: ihmisten
kunnioittamisen ja jatkuvan (tai jokapäiväisen, kokoaikaisen) toiminnan
parantamisen/sopeuttamisen takana on tehdashallin konteksti.&lt;/p&gt;
&lt;p&gt;Siinä kontekstissa, kuten tietävät ne, jotka ovat joskus tehdashallissa
työskennelleet, on karkeasti ottaen kaksi roolia: työntekijät ja esimiehet.
Vaikka tämä vaikuttaa pintapuolisesti varsin samalta asetelmalta kuin mitä
käytämme koodausprojekteissa, se ei voisi olla erilaisempi. Koodari on
asiantuntija joka ohjaa hyvin pitkälle omaa työtään, kun taas tehdashallissa
duunari tekee yleensä ottaen mitä käsketään.&lt;/p&gt;
&lt;p&gt;Tehdashallin Lean tuo duunari-työyksikön autonomian lähelle sitä paikkaa,
jossa koodarin henkilökohtainen autonomia on koko ajan ollut. Tehdashallissa
ei kyse ole demokratiasta, vaan siitä, että työyksiköllä, mukaan lukien tiimi
työntekijöitä ja heidän työnjohtonsa, on mahdollisuus muuttaa omaa
toimintatapaansa, yhdessä, työnjohdon ohjaamana.&lt;/p&gt;
&lt;p&gt;Se, että Lean tuo ihmisten kunnioittamisen tehdashallin peruspilariksi on
suhteellisen uusi juttu. Se tarkoittaa merkittävää henkistä muutosta
asenteissa, alkaen asiakkaista ja yrityksen ylimmästä johdosta, välijohtoon ja
työnjohtoon. Se toi tehdashalliin jotain sellaista, joka on aina ollut
koodaajan maailman vakiokalustoa. Arvostuksen tunteen.&lt;/p&gt;
&lt;p&gt;Tehdashallissa Lean oli merkittävä mullistus, jota on yritetty vaihtelevalla
menestyksellä jäljitellä ympäri maailmaa. Sen vaikutus tehdastoimintaan on
validoitu, ja ainoa este sen toistettavuudelle on asiakkaiden ja johdon
päässä.&lt;/p&gt;
&lt;p&gt;Ohjelmistokehityksessä Leania kutsutaan Agilen peruspilariksi.&lt;/p&gt;
&lt;p&gt;Leanin validointikehystä tehdashallissa, ja sen vaikutusta tehdashalliin,
myydään Agilen validointikehyksenä ja vaikutuksena ohjelmistokehitykselle.&lt;/p&gt;
&lt;p&gt;Agilella ei ole muuta konkreettista validaatiota, sillä näkemäni Agile-
projektit epäonnistuvat useammin kuin onnistuvat tuomaan Agile-konsulttien
lupaamia etuja, ja onnistumisetkin selittyvät helpoimmin muutoksen ja
lisääntyneen seurannan luomana placebo-vaikutuksena.&lt;/p&gt;
&lt;p&gt;Siinä missä tehdashallin Leanin vaikutukset olivat seurattavissa, ja koko
prosessin vuorovaikutusketju on ymmärrettävissä ja toistettavissa, ei Agilella
ole sellaista kuvausta Agile-konsulttien lupaamiin positiivisiin
lopputuloksiin johtavasta syy-seurausketjusta, josta eri merkittävät Agilistit
olisivat edes lähestulkoon samaa mieltä, saati että ketjun osien vaikutuksia
voitaisiin validoida pienemmissä osissa.&lt;/p&gt;
&lt;p&gt;Täällä meillä Suomessakin Agileksi kutsutaan toimintatapoja, jotka eroavat
toisistaan kuin yö ja päivä.&lt;/p&gt;
&lt;p&gt;Eräs firma kutsuu toimintatapaa, jossa ohjelmistoja kehitetään
demokraattisesti, ja ohjelmistoarkkitehtuurista päättävät äänekkäimmät ja
itsepintaisimmat, Scrumiksi ja Agileksi. Toinen käyttää samoja termejä omasta
perinteisestä toimintatavastaan, jota on vähän kuorrutettu Agile-
terminologialla.&lt;/p&gt;
&lt;p&gt;Toisaalta kannatan kaikkea, mikä kehittää kehitystä.&lt;/p&gt;
&lt;p&gt;Onko se edistystä, mitä kutsutaan edistykseksi?&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Plea to Maven repository managers</title>
        <published>2009-12-29T00:03:00+02:00</published>
        <updated>2009-12-29T00:03:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/12/plea-to-maven-repository-managers/"/>
        <id>https://mikael.io/posts/2009/12/plea-to-maven-repository-managers/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/12/plea-to-maven-repository-managers/">&lt;p&gt;Thank you, library developers who provide a Maven repository, or push to the
main repository. You make my life as a developer a lot easier by doing that.&lt;/p&gt;
&lt;p&gt;I have a few small requests, which would in my opinion serve both you, and
your developer users.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Please make your repository fast. Serve the files as straight-up static
files, not through a Subversion HTTP repository interface, nor from the
horrible depths of java.net.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Please make your repository rsyncable. While the lack of middle men has
contributed greatly to the success of the Maven model, many organizations
would like to, for various reasons, provide their developers with golden
mirrors of the good stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since Maven repositories consist of directory entries, and plain files,
providing a rsync read interface to the repository would probably lower your
bandwidth costs and theirs, as well as allow the simple creation of second-
level public mirrors.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;Please use separate repositories for releases, milestones, and snapshots.
If you push to the main repository, please don&#39;t push milestones or snapshots
there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Occasionally you will want to refactor the package structure of your
product. Currently, it is a common sight in the public repository, for a
popular library to have obsolete artefacts cluttering up the namespace, and it
might be quite an adventure to try to find out which artefacts are in fact up
to date, and which should absolutely not be used.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When you do major refactorings of this kind for a major release, please don&#39;t
be afraid to break backwards compatibility by cleaning up the old, obsolete
packages, or preserve compatibility through a clean break, by creating a new
sub-namespace for the new generation of package architecture.&lt;/p&gt;
&lt;p&gt;Your users are developers who can restore compatibility, after deciding
whether to upgrade or to stay with the old version, by making a small change
to pom.xml, pushing it to version control, after which compatibility is
restored for all the developers.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Spring to Java EE 6 porting gotchas</title>
        <published>2009-12-24T18:09:00+02:00</published>
        <updated>2009-12-24T18:09:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/12/spring-to-java-ee-6-porting-gotchas/"/>
        <id>https://mikael.io/posts/2009/12/spring-to-java-ee-6-porting-gotchas/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/12/spring-to-java-ee-6-porting-gotchas/">&lt;p&gt;JSF/Facelets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Don&#39;t use JSTL tags with Facelets. Just don&#39;t do it. Substitute
&lt;code&gt;&amp;lt;ui:repeat&amp;gt;&lt;/code&gt; for &lt;code&gt;&amp;lt;c:foreach&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;f:subview rendered=&quot;#{expression}&quot;&amp;gt;&lt;/code&gt; for
&lt;code&gt;&amp;lt;c:if&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&#39;re wondering why your JavaScript can&#39;t access the document variable
on the Google Chrome browser in a Facelets application, it&#39;s because the
default Facelets content-type is &lt;code&gt;application/xml+xhtml&lt;/code&gt; which doesn&#39;t sit well
with some browsers. &lt;code&gt;&amp;lt;f:view contenttype=&quot;text/html&amp;gt;&lt;/code&gt; will help.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JPA/EclipseLink:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GlassFish has a directory called &lt;code&gt;domains/domain1/lib/databases&lt;/code&gt;, but won&#39;t
find your JDBC driver from there. Put the JAR in &lt;code&gt;domains/domain1/lib&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Getting EclipseLink to do JOINs instead of N+1 or even 2N+1 queries is
sometimes challenging. &lt;code&gt;query.setHint(QueryHints.BATCH, &quot;user.emails&quot;)&lt;/code&gt; to the
rescue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using Postgresql sequences with default settings all around will lead to
problems when trying to insert several new entities in a session, because by
default JPA will assume that once it has acquired an identity number from the
sequence, it can freely use 50 numbers up from there before having to re-
acquire a new identity number from the sequence.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The workaround is to configure either your JPA &lt;code&gt;@SequenceGenerator&lt;/code&gt; to have the
parameter &lt;code&gt;@SequenceGenerator(allocationSize=1)&lt;/code&gt; or to modify your database
sequence to have a step of 50 instead of 1. I&#39;m going with the JPA
configuration, although if I&#39;d be inserting large batches regularly, I&#39;d
rather reconfigure the database sequences to avoid the roundtrip.&lt;/p&gt;
&lt;p&gt;Or just use &lt;code&gt;IDENTITY&lt;/code&gt; instead of &lt;code&gt;SEQUENCE&lt;/code&gt;, if you&#39;re also using the &lt;code&gt;SERIAL&lt;/code&gt; datatype.&lt;/p&gt;
&lt;p&gt;JAX-RS/Jersey:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you&#39;ve mapped your Jersey servlet to, say, &quot;&lt;code&gt;/jersey/*&lt;/code&gt;&quot; in web.xml, your
class-level resource path is &lt;code&gt;@Path(&quot;jersey&quot;)&lt;/code&gt; and your method-level resource
path is &lt;code&gt;@Path(&quot;users/{id}&quot;)&lt;/code&gt;, you need to do the HTTP request to
http://server/jersey/jersey/users/123, because the servlet starts interpreting
paths from its own root, and not from the context root.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Generating JPA 2.0 Criteria canonical metamodels with Maven and NetBeans</title>
        <published>2009-12-13T16:59:00+02:00</published>
        <updated>2009-12-13T16:59:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/12/generating-jpa-20-criteria-canonical/"/>
        <id>https://mikael.io/posts/2009/12/generating-jpa-20-criteria-canonical/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/12/generating-jpa-20-criteria-canonical/">&lt;p&gt;Java EE 6 and JPA 2.0 bring us a neat feature from Hibernate: &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm.html&quot;&gt;Criteria
queries&lt;/a&gt;, which allow you to construct complex database queries in a safe
manner, instead of trying to append pieces of SQL or JQL together, and hoping
that the result doesn&#39;t allow injection attacks.&lt;/p&gt;
&lt;p&gt;That&#39;s all well and good, but JPA 2.0 adds a wrinkle: instead of using simple
strings to construct Criteria queries, one must generate metamodel classes,
out of the entity classes. This is done by using the Java 6 APT annotation
pre-processor.&lt;/p&gt;
&lt;p&gt;Unfortunately, Maven doesn&#39;t support this kind of generation process very well
out of the box. There are, however, various plugins such as the &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/p/maven-annotation-plugin/&quot;&gt;maven-
annotation-plugin&lt;/a&gt; and &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://mojo.codehaus.org/apt-maven-plugin/&quot;&gt;apt-maven-plugin&lt;/a&gt; to help with this process.&lt;/p&gt;
&lt;p&gt;I am still in the process of figuring out which way of generating the classes
is the best, where they should go, and how to handle the process in a way
which doesn&#39;t tie one to a specific JPA provider.&lt;/p&gt;
&lt;p&gt;NetBeans has &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://wiki.netbeans.org/MavenBestPractices&quot;&gt;its own opinion&lt;/a&gt; on how the generated classes should be
handled, as well.&lt;/p&gt;
&lt;p&gt;Meanwhile, these are the best resources I&#39;ve found for generating metamodels
for various JPA implementations:&lt;/p&gt;
&lt;h3 id=&quot;eclipselink&quot;&gt;EclipseLink&lt;/h3&gt;
&lt;p&gt;org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_(ELUG)&quot;&gt;http://wiki.eclipse.org/UserGuide/JPA/Using_the_Canonical_Model_Generator_(ELUG)&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;hibernate&quot;&gt;Hibernate&lt;/h3&gt;
&lt;p&gt;org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://relation.to/Bloggers/HibernateStaticMetamodelGeneratorAnnotationProcessor&quot;&gt;http://relation.to/Bloggers/HibernateStaticMetamodelGeneratorAnnotationProcessor&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;openjpa&quot;&gt;OpenJPA&lt;/h3&gt;
&lt;p&gt;org.apache.openjpa.persistence.meta.AnnotationProcessor6
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://openjpa.apache.org/builds/latest/docs/manual/manual.html#d0e11085&quot;&gt;http://openjpa.apache.org/builds/latest/docs/manual/manual.html#d0e11085&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;datanucleus&quot;&gt;DataNucleus&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.jpox.org/servlet/jira/browse/NUCJPA-49&quot;&gt;http://www.jpox.org/servlet/jira/browse/NUCJPA-49&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Edit: this works for me with EclipseLink.&lt;/p&gt;
&lt;script src=&quot;http://dev.gueck.com/project-skeletons/src/33a73dedd3bd/javaee6/pom.xml?embed=t&quot;&gt;&lt;/script&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My Windows 2008 Server trial is over, but my 2008R2 trial has just begun...</title>
        <published>2009-12-11T17:31:00+02:00</published>
        <updated>2009-12-11T17:31:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/12/my-windows-2008-server-trial-is-over/"/>
        <id>https://mikael.io/posts/2009/12/my-windows-2008-server-trial-is-over/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/12/my-windows-2008-server-trial-is-over/">&lt;p&gt;For the last 6 months, I&#39;ve been test-driving Windows 2008 Server on my home
Windows machine.&lt;/p&gt;
&lt;p&gt;The upgrade from XP to W2K8 was painless. I did a full re-install on a new
hard drive. The W2K8 installation experience almost rivals the ease of Ubuntu
and Redhat Linux installations, but still required a few reboots. I also added
4GB of memory for the price of 40€, so I chose the 64-bit version of Windows
to be able to use the full range of 6GB.&lt;/p&gt;
&lt;p&gt;W2K8 is much, much more stable than XP was. I&#39;ve started to trust my Windows
computer a lot more after the upgrade. A typical source of flakiness under XP
was my KVM. If I accidentally switched out of my Windows computer when it was
booting up, the least of my problems would be that I&#39;d have to restart the
whole powerup cycle yet again. W2K8 feels much more fault-tolerant.&lt;/p&gt;
&lt;p&gt;What seems almost miraculous to me is that the NVIDIA graphics drivers have
flaked out a few times during the six months during gameplay, but the only
real consequence of that, under W2K8, is that the screen goes dark for a few
seconds, while the operating system reloads the drivers. Under XP, that
usually meant a power button full reset.&lt;/p&gt;
&lt;p&gt;Thumbs up for Windows 2008 from me! The trial period ran out, however, so now
I installed Windows 2008 R2 Server, which shares most of its core with Windows
7, over the old installation. The process was quite painless, and since my
games are from Steam, I simply had to re-install Steam, and move my steamapps
folder under the new Steam directory. Easy as that.&lt;/p&gt;
&lt;p&gt;I&#39;m happy with this product. Corporate sysadmins, please, please, upgrade your
users to Windows 7 or W2K8R2.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My favorite movie scene</title>
        <published>2009-12-09T16:12:00+02:00</published>
        <updated>2009-12-09T16:12:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/12/my-favorite-movie-scene/"/>
        <id>https://mikael.io/posts/2009/12/my-favorite-movie-scene/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/12/my-favorite-movie-scene/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=wcsBvX10h74&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube-nocookie.com/v/wcsBvX10h74?fs=1&amp;hl=en_US&amp;hd=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Google App Engine-kokeilun tulokset täällä</title>
        <published>2009-11-24T08:44:00+02:00</published>
        <updated>2009-11-24T08:44:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/11/google-app-engine-kokeilun-tulokset/"/>
        <id>https://mikael.io/posts/2009/11/google-app-engine-kokeilun-tulokset/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/11/google-app-engine-kokeilun-tulokset/">&lt;p&gt;&lt;strong&gt;Päivitys 20.5.2010:&lt;/strong&gt; Google on nyt päivittänyt GAE:n huomattavasti paremmat
profilointiominaisuudet kuin mihin tässä kommentissa viitataan, eikä 1000
hakutuloksen raja ole enää voimassa.&lt;/p&gt;
&lt;p&gt;Asiaan vihkiytymättömille: &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine&lt;/a&gt; on Googlen oma tuote, jonka
tehtävä on ajaa päivittäiskäytössä kehittäjien rakentamaa ohjelmistoa, joka
tuottaa verkkosivuston, ja tallettaa käyttäjien tiedot.&lt;/p&gt;
&lt;p&gt;Se on suunnattu cloud-markkinoille, joka on hieno tapa sanoa että
tietojenkäsittelykapasiteettia ostetaan kevyellä, joustavalla prosessilla,
tilastollisen tarpeen mukaan, vähän kuin sähköä tai maitoa.&lt;/p&gt;
&lt;p&gt;Jutun juju on siinä, että cloud-myyjä osaa ennustaa tilastollisesti, kuinka
paljon kapasiteettia tarvitaan ensi kuussa, ja cloudia käyttävät yksittäiset
projektit voivat hankkia kapasiteettia vakiotuotteina, vähän kuin litran
maitoa kaupasta, sen sijaan että pitäisi tietää kyseisen lehmän nimi ja
lempiruoka kolme kuukautta etukäteen. Kun projektit saavat nopeata joustoa
yllättäviin tarpeisiin, ne onnistuvat edullisemmin, ja lähempänä aikatauluaan.&lt;/p&gt;
&lt;p&gt;Google App Engine kilpailee cloud-markkinoilla &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://aws.amazon.com/&quot;&gt;Amazon Web
Services&lt;/a&gt;-palveluperheen kanssa, ja Mansikki-markkinoilla PHP/MySQL-
konseptin ja sitä käyttävien &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.google.fi/search?q=%245+php+hosting&quot;&gt;superhalpojen laaduttomien alustatuotteiden&lt;/a&gt;
kanssa.&lt;/p&gt;
&lt;p&gt;No niin, itse asiaan!&lt;/p&gt;
&lt;p&gt;Olen testannut GAE:ta pari kuukautta aika simppelillä sovelluksella, jota olen
käyttänyt päivittäin.&lt;/p&gt;
&lt;p&gt;Aloitin kehityksen vielä silloin, kun GAE ei tukenut Javaa, joten sovellus on
Pythonia.&lt;/p&gt;
&lt;p&gt;Kehitysprosessi on varsin kömpelö. GAE-työkalut sisältävät paikallisen
kehityspalvelimen, mutta siinä ei ole valmista tapaa synkronoida tietokantaa
Googlen palvelimilta paikalliseen ympäristöön, joten tuotantodatasetin
saaminen kehitykseen on varsin hankalaa.&lt;/p&gt;
&lt;p&gt;Suurin ongelma minulle on kuitenkin se, että kaikki sovelluksen tieto
tallennetaan Googlen omaan tietokantajärjestelmään, jonka
luku/kirjoituslatenssia on erittäin vaikea ennustaa. Heidän tietokantansa ei
tue SQL JOIN-rakennetta, ja se ei voi palauttaa vastauksena yhteen kyselyyn
kuin 1000 tietuetta.&lt;/p&gt;
&lt;p&gt;Toinen ongelmallinen kohta on koodin suorituskyky ja profilointi. Pääsivun
luominen kestää melkein 2 sekuntia, vaikka cachetan suurimman osan datasta.
Googlen profilointimetodit eivät palauttaneet mitään olennaisen hyödyllistä
tietoa jonka perusteella voisin tehdä johtopäätöksiä. Lisäksi osa Googlen
palvelurajapinnoista ei toimi dokumentaation mukaisesti, ja tietysti myös ihan
olennaisesti eri tavalla paikallisessa kehityspalvelimessa, ja Googlen
tuotantopalvelimessa.&lt;/p&gt;
&lt;p&gt;Siirrän sovelluksen GAE:sta paikallisesti pyöriväksi Java-sovellukseksi. En
suosittele GAE:ta vielä otettavaksi käyttöön, ilman varsin kattavaa
tietokantahakujen testausta todellisilla tuotantotietomäärillä.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://code.google.com/appengine/images/appengine-noborder-120x30.gif&quot; alt=&quot;Powered by Google App Engine&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Addendum&lt;/strong&gt;: Paras tapa saada data ulos GAE:sta on
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/appengine/articles/remote_api.html&quot;&gt;http://code.google.com/appengine/articles/remote_api.html&lt;/a&gt;. Heillä on
roadmapissa parempi importti/exportti, mutta näkee sitten.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Haluan parantaa ohjelmistoinvestointien tuottavuutta</title>
        <published>2009-11-21T20:38:00+02:00</published>
        <updated>2009-11-21T20:38:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/11/haluan-parantaa-ohjelmistoinvestointien/"/>
        <id>https://mikael.io/posts/2009/11/haluan-parantaa-ohjelmistoinvestointien/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/11/haluan-parantaa-ohjelmistoinvestointien/">&lt;p&gt;Yritysohjelmistojen joustamattomuus liiketoiminnan muutoksiin on laatuongelma,
jota uskaliaskaan prosessikehitys ei tähän mennessä ole saanut kuriin.&lt;/p&gt;
&lt;p&gt;Sen kanssa eletään sinnittelemällä joustamattomien järjestelmien kanssa,
kunnes on taas aika uudelle isolle kehitysprojektille.&lt;/p&gt;
&lt;p&gt;En enää jaksa uskoa, että tälle ongelmalle olisi yhtä isoa ratkaisua.&lt;/p&gt;
&lt;p&gt;Sen ytimessä ovat ihmiset, tilaaja-toimittajasuhteen rakenne, ja syvälle
juurtunut tapa budjetoida IT-varoja liiketoiminnan kehittämispyrähdyksinä,
eikä sen jatkuvana pyörittämisenä.&lt;/p&gt;
&lt;p&gt;Tämä kaikki johtaa lopulta siihen, että liiketoiminnan kehittyviin tarpeisiin
taipumattoman koodin suunnittelijan ja kirjoittajan ensi tason työnvalvonta
viestii tekijöille prioriteetteja, jotka peilaavat ensi sijassa
toimittajaorganisaation rakenteellisia tavoitteita.&lt;/p&gt;
&lt;p&gt;Toimittajien kehittäjät eivät yleensä ottaen ole hölmöjä tai epäpäteviä,
vaikka tilaajan projektihenkilöstö joskus muodostaakin sellaisen mielikuvan.&lt;/p&gt;
&lt;p&gt;He mittaisivat tekemiensä ratkaisujen oikeutta tai vääryyttä projektin ja
asiakkaan pitkän tähtäimen tavoitteiden mukaan, jos heille viestittäisiin
niistä uskottavasti osana päivittäistä rutiinia.&lt;/p&gt;
&lt;p&gt;He oppisivat yhdistämään tavoitteet omaan työhönsä, jos laatua
kontrolloitaisiin, ja poikkeamista viestittäisiin, osana päivittäistä
rutiinia.&lt;/p&gt;
&lt;p&gt;Tällä hetkellä tälläistä roolia ei ole. Laatua kontrolloidaan liian pitkällä
syklillä jotta siitä oppiminen olisi rutiinia, ja sairauksien sijaan hoidetaan
oireita.&lt;/p&gt;
&lt;p&gt;Yksinään tälläisen viestivän lähettiläsroolin lisääminen ei ratkaise koko
laatuongelmaa, mutta jos me emme etsi parempaa huomista, niin kuka sitten?&lt;/p&gt;
&lt;p&gt;Tiedostetaanko teillä tämä ongelma IT-kehitysprojektien suhteellisesta
tuottamattomuudesta, liiketoiminnan muuttuviin tarpeisiin joustamattomuudesta,
ja turhista jännitteistä?&lt;/p&gt;
&lt;p&gt;Tehdään asialle jotain yhdessä!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Verkkokaupan koeajo: Gastronautin saitti</title>
        <published>2009-02-23T17:06:00+02:00</published>
        <updated>2009-02-23T17:06:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/02/verkkokaupan-koeajo-gastronautin-saitti/"/>
        <id>https://mikael.io/posts/2009/02/verkkokaupan-koeajo-gastronautin-saitti/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/02/verkkokaupan-koeajo-gastronautin-saitti/">&lt;p&gt;Tänään ei huvita käydä kaupassa tai laittaa ruokaa. Voisin tilata jotain.
Pizza Pasila olisi hyvä valinta, mutta tänään en halua currykanaa.&lt;/p&gt;
&lt;p&gt;Valinta osuu siis Gastronauttiin, ja taidan samalla koeajaa heidän
verkkokauppansa.&lt;/p&gt;
&lt;p&gt;Gastron saitin suunnittelu ja teknologia on pitkään jo tuntunut jonkun
veljenpojan etelänmatkaa vastaan suunnittelemalta ja toteuttamalta.
Verkkokauppa ei ole poikkeus.&lt;/p&gt;
&lt;p&gt;Rekisteröityminen ja sisäänkirjautuminen ollaan &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.uie.com/articles/three_hund_million_button&quot;&gt;onnistuttu sössimään&lt;/a&gt;
tekemällä kentistä joihin pitää kirjoittaa aivan samannäköisiä kuin kentistä
joissa mainostetaan uusia ravintoloita, ja kentästä jolla valitaan kaupunki.
Kenttien päällä on kyllä perinteisen syöttökentän näköinen otsikko, josta
klikkaaminen ei tee mitään. Rekisteröityminen onnistuu, jos löytää tekstin
alle piiloitetun nuolen.&lt;/p&gt;
&lt;p&gt;On aivan turha kuvitella voivansa edes yhtään katsella tai kerätä tilaustaan
ennen rekisteröintilomakkeen täyttämistä. Joku amatööri erotti nuo kaksi
prosessia toisistaan totaalisesti.&lt;/p&gt;
&lt;p&gt;Valitsen ravintolan nimen vasemmasta menusta, ja pääsen ravintolasivulle.
Tällä sivulla näen tukun otsikoita, mutta en ensimmäistäkään ruoan nimeä. Jos
tajuan klikata erittäin himmeää nuolta otsikkorivin oikeassa päädyssä, otsikon
alakohta ruoka-annoksineen aukeaa näkyville.&lt;/p&gt;
&lt;p&gt;Oho! Kun valitsin Spizy Co:sta New York purilaisen, sivun ylälaitaan avautui
uudestaan samat sisäänkirjautumiskentät joita käyttämällä hetki sitten
kirjauduin mielestäni. Ostoskorissa näkyy kuitenkin valintani.&lt;/p&gt;
&lt;p&gt;Yritän lisätä lohkoperunoita side orderina, mutta saitti valittaa &quot;sinun pitää
olla kirjautunut&quot;.&lt;/p&gt;
&lt;p&gt;Kirjaudun sisään uudestaan, ja Gastro on kadottanut tilaukseni.&lt;/p&gt;
&lt;p&gt;Valitsen suunnilleen samat tuotteet, kiireellä klikkaan tilauksen
vahvistukseen, ja teen tilauksen. Saitti lupasi tilauksen menneen perille.&lt;/p&gt;
&lt;p&gt;Nyt odotetaan...&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The restful hypothesis</title>
        <published>2009-02-09T03:40:00+02:00</published>
        <updated>2009-02-09T03:40:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/02/restful-hypothesis/"/>
        <id>https://mikael.io/posts/2009/02/restful-hypothesis/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/02/restful-hypothesis/">&lt;p&gt;I&#39;m taking every fourth week off, starting now. Nine days of uninterrupted rest.&lt;/p&gt;
&lt;p&gt;Why? I&#39;ve been working fairly actively for the last 15 years. I&#39;ve learned
some things about myself and my field.&lt;/p&gt;
&lt;p&gt;Projects tend to become hectic. Workplaces become demanding. There would
always be so much more to do but so little time.&lt;/p&gt;
&lt;p&gt;The pressure to enact big, meaningful changes gives one tunnel vision and
encourages one to create and manipulate dangerously oversimplified models of
reality in order to create the self-deceptive illusion of reaching
organizational goals. (Heimo &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://huima.wordpress.com/2009/02/08/best-definition-of-it-&quot;&gt;recently wrote about&lt;/a&gt; a similar subject.)&lt;/p&gt;
&lt;p&gt;It&#39;s hard to critically evaluate efforts one is personally invested in. Most
people simply don&#39;t go there. I&#39;ve only been able to step back after the fact.&lt;/p&gt;
&lt;p&gt;Postmortems are useful, but not as useful as saving the patient in the first place.&lt;/p&gt;
&lt;p&gt;That&#39;s why I&#39;m taking every third week off from now on.&lt;/p&gt;
&lt;p&gt;To routinely step back and ask myself whether I&#39;m really invested in
accomplishing the right tactical goals.&lt;/p&gt;
&lt;p&gt;Agile that!&lt;/p&gt;
&lt;p&gt;governance-it-starts-with-common-sense/&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zend_Cache_Backend_File doesn&#39;t work on NFS</title>
        <published>2009-01-02T02:48:00+02:00</published>
        <updated>2009-01-02T02:48:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2009/01/zendcachebackendfile-doesnt-work-on-nfs/"/>
        <id>https://mikael.io/posts/2009/01/zendcachebackendfile-doesnt-work-on-nfs/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2009/01/zendcachebackendfile-doesnt-work-on-nfs/">&lt;p&gt;We had a bit of a time discovering why our project&#39;s Zend Framework-using PHP
application wasn&#39;t working at all well in our production environment. The
first few page loads were working fine, but concurrent page loads were
presenting a problem. Neither PHP nor Zend Framework were at all helpful in
trying to track down the problem.&lt;/p&gt;
&lt;p&gt;It turns out that the application was misconfigured to store its Zend Cache
files on a NFS mounted remote file system, and that Zend_Cache_Backend_File
tries to flock() its files. On RHEL5, the NFSv3 implementation doesn&#39;t react
at all well to POSIX locks.&lt;/p&gt;
&lt;p&gt;We cracked the problem by figuring out that the locks seemed to timeout at the
NFS timeout period, while the rest of our timeouts were at one-minute range,
using pstack to dump the stack trace of hanging Apache processes, finding
flock() to be the culprit, and grepping through our app&#39;s source code for
flock, finding only the Zend Cache classes.&lt;/p&gt;
&lt;p&gt;Don&#39;t accidentally put your Zend Cache files on NFS when using
Zend_Cache_Backend_File, or your application will hang.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Cool service of the day: Web Sequence Diagrams</title>
        <published>2008-12-27T21:39:00+02:00</published>
        <updated>2008-12-27T21:39:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/12/cool-service-of-day-web-sequence/"/>
        <id>https://mikael.io/posts/2008/12/cool-service-of-day-web-sequence/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/12/cool-service-of-day-web-sequence/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.websequencediagrams.com/&quot;&gt;&lt;img src=&quot;http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QWxpY2UtPkJvYjogQX&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;V0aGVudGljYXRpb24gUmVxdWVzdAoKbm90ZSByaWdodCBvZiAAJgVCb2IgdGhpbmtzIGFib3V0IGl0
LgoKQm9iLS0-AE4FADsTc3BvbnNlCgpsb29wIGZvbyBiYXIgYmF6CiAgICAAfAx4eXp6eQplbmQK&amp;amp;s
=modern-blue&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Enforcing strict database DDL upgrade version requirements in Postgresql</title>
        <published>2008-12-18T23:03:00+02:00</published>
        <updated>2008-12-18T23:03:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/12/enforcing-strict-database-upgrade/"/>
        <id>https://mikael.io/posts/2008/12/enforcing-strict-database-upgrade/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/12/enforcing-strict-database-upgrade/">&lt;p&gt;When delivering a upgrade version of a web-based product, you often wish to
provide your clients with database upgrade scripts.&lt;/p&gt;
&lt;p&gt;As the data in the database is the most critical part of the installation,
both the upgrader and the developer want to be absolutely certain that
upgrades are pushed into the database in the correct order.&lt;/p&gt;
&lt;p&gt;This is an example of how to achieve this objective using Postgresql.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE FUNCTION require_database_version(IN p_version INT) RETURNS boolean AS $$&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DECLARE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  dv INT;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  IF p_version IS NULL THEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    RAISE EXCEPTION &amp;#39;require_database_version called with NULL input&amp;#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  END IF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  SELECT version INTO STRICT dv FROM database_version;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  IF dv = p_version THEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    RAISE EXCEPTION &amp;#39;Database version required: %. Found %.&amp;#39;, p_version, dv;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  END IF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  RETURN true;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;END;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$$ LANGUAGE plpgsql VOLATILE;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE FUNCTION set_database_version(IN p_version INT) RETURNS boolean AS $$&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  IF p_version IS NULL THEN&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    RAISE EXCEPTION &amp;#39;set_database_version called with NULL input&amp;#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  END IF;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  EXECUTE &amp;#39;CREATE OR REPLACE VIEW database_version AS SELECT &amp;#39; || p_version || &amp;#39; AS version&amp;#39;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  RETURN true;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;END;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$$ LANGUAGE plpgsql VOLATILE;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SAVEPOINT s1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SELECT require_database_version(4);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ROLLBACK TO s1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SAVEPOINT s2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SELECT set_database_version(6);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SAVEPOINT s3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SELECT require_database_version(4);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ROLLBACK TO s3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SELECT require_database_version(6);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ROLLBACK TO s3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SELECT require_database_version(NULL);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ROLLBACK;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up a Flash testing environment with several versions of the Flash 9 and 10 plugins</title>
        <published>2008-12-13T16:24:00+02:00</published>
        <updated>2008-12-13T16:24:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/12/setting-up-flash-testing-environment/"/>
        <id>https://mikael.io/posts/2008/12/setting-up-flash-testing-environment/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/12/setting-up-flash-testing-environment/">&lt;p&gt;When you&#39;re developing a Flash application, you usually want to be reasonably
certain that it&#39;ll work with the various versions of the Flash plugin which
your users might have. The best way to be certain is to see for yourself.&lt;/p&gt;
&lt;p&gt;Alas, the Flash plugin was designed to be installed only once per PC, and
Adobe wants you as a consumer to always have only the newest version of the
plugin installed.&lt;/p&gt;
&lt;p&gt;Adobe, however, have provided us with all the tools we need to build a Firefox
installation which contains all of the Flash 9 and Flash 10 plugins in
separate profiles, so that we can even run the various versions
simultaneously.&lt;/p&gt;
&lt;p&gt;IE, as usual, is a different kettle of fish altogether, and generates extra
customer costs even here.&lt;/p&gt;
&lt;p&gt;Let&#39;s start by visiting Adobe&#39;s page &quot;Archived Flash Players available for
testing purposes&quot; at &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.adobe.com/go/tn_14266&quot;&gt;http://www.adobe.com/go/tn_14266&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From there, download the files &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp10_archive.zip&quot;&gt;http://fpdownload.macromedia.com/get/flashplay
er/installers/archive/fp10_archive.zip&lt;/a&gt; and &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp9_archive.zip&quot;&gt;http://fpdownload.macromedia.c
om/get/flashplayer/installers/archive/fp9_archive.zip&lt;/a&gt;. If the filenames
have changed since writing this blog post, you&#39;ll probably be able to find the
correct files from the Adobe KB page referenced earlier.&lt;/p&gt;
&lt;p&gt;These .ZIP files contain all of the .EXE installation files needed to get to
the actual plugin files we&#39;ll be needing. Create a working directory, and
unzip the fp*_archive.zip-files there.&lt;/p&gt;
&lt;p&gt;Here&#39;s a small shell script you can run under Linux to extract the plugin
files from the installation executables, using Wine:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;export WINEPREFIX=$PWD/wine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mkdir $WINEPREFIX&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mkdir flash_plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;for file in fp*archive/*/flashplayer*_win.exe&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  version=`echo $file | awk -F/ &amp;#39;{print $2}&amp;#39;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  echo $file $version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  wineconsole $file /S /D=C:\\flash\\$version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  cp -r wine/drive_c/flash/$version flash_plugins/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;... to be continued!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Software projects are such fun</title>
        <published>2008-11-20T16:10:00+02:00</published>
        <updated>2008-11-20T16:10:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/11/software-projects-are-such-fun/"/>
        <id>https://mikael.io/posts/2008/11/software-projects-are-such-fun/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/11/software-projects-are-such-fun/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=WlBiLNN1NhQ&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/WlBiLNN1NhQ&amp;hl=en&amp;fs=1&amp;border=1&amp;ap=%2526fmt%3D18&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>DTrace script for snooping MySQL queries</title>
        <published>2008-11-14T03:42:00+02:00</published>
        <updated>2008-11-14T03:42:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/11/dtrace-script-for-snooping-mysql/"/>
        <id>https://mikael.io/posts/2008/11/dtrace-script-for-snooping-mysql/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/11/dtrace-script-for-snooping-mysql/">&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#!/usr/sbin/dtrace -Zs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pid$target:libmysqlclient:mysql_real_query:entry {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  printf(&amp;quot;Query: %s\n&amp;quot;, copyinstr(arg1));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pgrep httpd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dtrace -p 714 -s ./mysql.d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mike Shapiro and Bryan Cantrill demonstrate Fishworks</title>
        <published>2008-11-13T05:55:00+02:00</published>
        <updated>2008-11-13T05:55:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/11/mike-shapiro-and-bryan-cantrill/"/>
        <id>https://mikael.io/posts/2008/11/mike-shapiro-and-bryan-cantrill/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/11/mike-shapiro-and-bryan-cantrill/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://services.brightcove.com/services/viewer/federated_f8/1460787980&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>TDS: Community Organizers</title>
        <published>2008-10-31T17:57:00+02:00</published>
        <updated>2008-10-31T17:57:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/10/tds-community-organizers/"/>
        <id>https://mikael.io/posts/2008/10/tds-community-organizers/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/10/tds-community-organizers/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.thedailyshow.com/sitewide/video_player/view/default/swf.jhtml&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Viikon ravintolalöytö: Marokkolainen ravintola Fez</title>
        <published>2008-10-29T23:34:00+02:00</published>
        <updated>2008-10-29T23:34:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/10/viikon-ravintolalyt-marokkolainen/"/>
        <id>https://mikael.io/posts/2008/10/viikon-ravintolalyt-marokkolainen/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/10/viikon-ravintolalyt-marokkolainen/">&lt;p&gt;Olen onnekas siinä, että minulla on ystäviä jotka tasapainottavat
konservatiivisuuttani ravinnon maailmassa innolla uusien kokemusten
etsimiseen. Rosa puhui niin innostuneesti marokkolaisesta &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.fez.fi/&quot;&gt;ravintola
Fezistä&lt;/a&gt;, että lähdin mielelläni kokeilemaan. Emme pettyneet.&lt;/p&gt;
&lt;p&gt;Alkuruoaksi otin kasvis msmen-annoksen, joka oli varsin kevyt annos rapeaksi
paistettuja kasvistäytteisen crepen tyylisiä suupaloja salaatin päällä.
Keskellä oleva juustonappi täydensi alkuruoan makua todella sopivasti.
Yllättävän hyvin kokonaisuuteen sopi tilaamamme kannu marokkolaista makeaa
minttuteetä. En ole koskaan maistanut sellaista kokonaisuutta, johon tälläinen
ateriajuoma sopii yhtä hyvin.&lt;/p&gt;
&lt;p&gt;Pääruoaksi valitsin sitruunaisen kanataginen, joka on uunissa haudutettu ja
keramiikka-astiassa tarjoiltu kana- ja lisukeannos. Ravintolan tapa maustaa
annos teki minuun vaikutuksen. Ehkä olen tottunut liian yksinkertaisiin
maustoihin, mutta annoksen keskimerellinen tyyli poikkesi edukseen
tyypillisemmästä &quot;suolaa, curryä ja chiliä&quot;-linjasta.&lt;/p&gt;
&lt;p&gt;Suosittelen.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Jon Stewart speaks on my behalf</title>
        <published>2008-10-21T17:19:00+03:00</published>
        <updated>2008-10-21T17:19:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/10/jon-stewart-speaks-on-my-behalf/"/>
        <id>https://mikael.io/posts/2008/10/jon-stewart-speaks-on-my-behalf/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/10/jon-stewart-speaks-on-my-behalf/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.thedailyshow.com/sitewide/video_player/view/default/swf.jhtml&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>SpringSource pulls a bait and switch with Spring Framework</title>
        <published>2008-09-21T02:30:00+03:00</published>
        <updated>2008-09-21T02:30:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/09/springsource-pulls-bait-and-switch-with/"/>
        <id>https://mikael.io/posts/2008/09/springsource-pulls-bait-and-switch-with/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/09/springsource-pulls-bait-and-switch-with/">&lt;p&gt;Spring Framework may be one of the most widely adopted libraries in the Java world.&lt;/p&gt;
&lt;p&gt;It came to be so widely adopted because of its open source license and consistent quality.&lt;/p&gt;
&lt;p&gt;Its authors decided to monetize the wide adoption, and formed SpringSource to sell support.&lt;/p&gt;
&lt;p&gt;Now they are pulling a bait and switch to maximize their short term profit, by
selling licenses on top of support, because license business scales better
than support business.&lt;/p&gt;
&lt;p&gt;SpringSource are significantly altering the factors which led to Spring
Framework&#39;s popularity, by making the previously simple process required to
use Spring Framework so complicated, with marked unknowns, that the
SMB/consultant sector, which comprises 90% of its user and technology
decisionmaker base, has to in effect make a whole new purchase decision in a
product landscape which has the technology giant Google offering Guice, and
EJB 3.1 getting nearly on par on technological usability.&lt;/p&gt;
&lt;p&gt;The question is: is Spring Framework worth it anymore to anyone, if its user
base shrinks to 10%, and is unlikely to raise back to preceding levels?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; apparently the new pricing &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=50727#269681&quot;&gt;starts from $20,000&lt;/a&gt; for a small team.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>New cloud datacenter products: VMWare vCloud, Citrix Cloud Center and Sun xVM OpsCenter</title>
        <published>2008-09-15T17:41:00+03:00</published>
        <updated>2008-09-15T17:41:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/09/new-cloud-datacenter-products-vmware/"/>
        <id>https://mikael.io/posts/2008/09/new-cloud-datacenter-products-vmware/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/09/new-cloud-datacenter-products-vmware/">&lt;p&gt;VMWare released their vAporWare &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.vmware.com/company/news/releases/vcloud_vmworld08.html&quot;&gt;vCloud announcement&lt;/a&gt; at VMWorld08.&lt;/p&gt;
&lt;p&gt;Citrix released &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.citrix.com/English/ps2/products/product.asp?contentID=1681633#c32&quot;&gt;Citrix Cloud Center&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sun released &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blogs.sun.com/jonathan/entry/xvm1&quot;&gt;xVM OpsCenter&lt;/a&gt; and the rest of the xVM product line.&lt;/p&gt;
&lt;p&gt;Of the three, the Sun products seem the closest to becoming actual reality.&lt;/p&gt;
&lt;p&gt;Here&#39;s to both competition and standards!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Skaalautuva palveluarkkitehtuuri joka keittiöstä löytyvillä aineksilla</title>
        <published>2008-09-14T12:34:00+03:00</published>
        <updated>2008-09-14T12:34:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/09/skaalautuva-palveluarkkitehtuuri-joka/"/>
        <id>https://mikael.io/posts/2008/09/skaalautuva-palveluarkkitehtuuri-joka/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/09/skaalautuva-palveluarkkitehtuuri-joka/">&lt;p&gt;Hei, sinä joka rakennat juuri verkkopalvelua! Kyllä, juuri sinä.&lt;/p&gt;
&lt;p&gt;Teetkö suunnitelmia siitä lähtökohdasta, että tulet onnistumaan työssäsi, vai
oletatko epäonnistuvasi?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2008/11/funny-pictures-cat-caught-his-tail-and-might-fall.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Jos verkkopalvelusi onnistuu, kuinka paljon sillä tulee olemaan käyttäjiä?
Kuinka monta pyyntöä sekunnissa se saa palvella?&lt;/p&gt;
&lt;p&gt;Juuri nyt, ennenkuin palvelullasi on vielä sitä ensimmäistäkään käyttäjää, on
paras aika istua alas ja ajatella &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://dev.twitter.com/2008/05/twittering-about-architecture.html&quot;&gt;mitä onnistuminen tarkoittaa&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jos rakennat verkkopalvelua, suunnittelet varmaankin käyttäväsi työkaluina
PHP:ta, Pythonia, Javaa tai dotnettiä, ja tallettavasi palvelun tiedot
MySQL:n, Postgresiin tai MSSQL:n.&lt;/p&gt;
&lt;p&gt;Olet tottunut toimimaan niin, että ensin suunnittelet relaatiokannan, sitten
rakennat sitä käyttävän saitin, ja iteroit asiakastarpeiden ja uusien
ajatusten pohjalta. Jos sinulla on jo jonkin verran kokemusta, suunnittelet
rakentavasi kolmitasoarkkitehtuurin ja käyttäväsi MVC-kehystä, sen sijaan että
kaikki koodi on samoissa PHP-tiedostoissa.&lt;/p&gt;
&lt;p&gt;Nämä suunnitelmat auttavat sinua onnistumaan. Se on hienoa!&lt;/p&gt;
&lt;p&gt;Ne eivät auta sinua kohtaamaan onnistumisen aiheuttamia ongelmia. Se on huonoa!&lt;/p&gt;
&lt;p&gt;Onnistuminen ja epäonnistuminen ovat luonteeltaan erilaisia. Jos onnistut,
peli ei lopukaan, vaan sinulta odotetaan vielä lisää onnistumisia. On paljon
katkerampaa väsyä toisessa mäessä, kun ensimmäinen on jo ylitetty.&lt;/p&gt;
&lt;p&gt;Kehitys ei pysähdy koskaan, mutta verkkopalveluiden kohdalla voit ottaa
suurten toimijoiden onnistumisista ja epäonnistumisista mallia, ja suunnitella
järjestelmäarkkitehtuurisi sekä ensimmäistä että toista mäkeä varten. Kolmatta
mäkeä ei sitten teknologialla valloitetakaan, vaan siitä huolehtivat humanistit.&lt;/p&gt;
&lt;p&gt;Ensimmäinen mäki on palvelun saaminen markkinoille. Toinen on suurten
käyttäjämäärien palveleminen palvelunlaadun kärsimättä. Kolmas on oman
organisaation kasvukivut tämän seurauksena.&lt;/p&gt;
&lt;p&gt;Toisessa mäessä moni verkkopalvelu uupuu siihen, että kehitystiimin
sydänverelläkään ei pysytä käyttäjämäärän kasvun perässä, vaan palvelu alkaa
hidastumaan ja saattaa hajota kokonaankin, josta viime aikojen kuuluisimpana
esimerkkinä Twitter. Hidastelu ja hajoileminen on tuhonnut monta lupaavaa
palvelua ajamalla niiden käyttäjät luotettavampien saittien huomaan. Mitä
sosiaalisempi on palvelukonsepti, sitä herkemmin näin käy.&lt;/p&gt;
&lt;p&gt;Näin ei tarvitse käydä sinulle. Toisen mäen hanskaamista kutsutaan &lt;strong&gt;palvelun
skaalautumiseksi&lt;/strong&gt;, ja se tarkoittaa sitä, että &lt;strong&gt;tuotat palvelun monella
pienellä tavalla&lt;/strong&gt; yhden suuren askeleen sijaan.&lt;/p&gt;
&lt;p&gt;Yhdellä suurella askeleella tarkoitan järjestelmäarkkitehtuuria, jossa kaikki
tieto on yhdessä tietokannassa. Kyllä, vaikka suunnittelisit antavasi kannalle
lukuorjia.&lt;/p&gt;
&lt;p&gt;Monella pienellä tavalla tarkoitan sitä, että teet jokaisesta palvelusi osa-
alueesta oman taustapalvelunsa, ja jaat jokaisen taustapalvelun edelleen
pienempiin paloihin.&lt;/p&gt;
&lt;p&gt;Käyttäjätilien hallinta voi olla oma taustapalvelunsa. Kun koostat
verkkosivun, jossa haluat sanoa käyttäjän koko nimen, sivua rakentava
kontrolleri tekee HTTP-haun &quot;http://tilipalvelu/users/gumi&quot; ja saa XML/JSON-
vastauksen.&lt;/p&gt;
&lt;p&gt;Tilipalvelu puolestaan koostuu jatkuvasti kasvavasta määrästä yhden
edustakoneen ja kahden HA-klusteroidun MySQL-palvelimen kokonaisuuksia, joissa
jokaisessa on vain niin monen käyttäjän tiedot kuin mitä tälläinen
toiminnallinen kokonaisuus voi palvella hyvällä palvelunlaadulla.&lt;/p&gt;
&lt;p&gt;Ennen tilipalvelun toiminnallisia klustereita on hakemistopalvelu, jonka ainoa
tehtävä on kertoa, mistä löytyvät käyttäjän &quot;gumi&quot; tiedot. Koko hakemisto
pidetään palvelun muistissa, joten vastaukset missä-kyselyihin tulevat
pahimmillaan mikrosekunneissa.&lt;/p&gt;
&lt;p&gt;Voilà. Meillä on tilipalvelu, joka ei väsy toisessa mäessä.&lt;/p&gt;
&lt;p&gt;Haastavampaa on suunnitella ryhmäpalvelu. Jos ryhmät ja käyttäjätunnukset ovat
eri koneilla, tietokanta ei voi pitää huolta tiedon eheydestä sillä tavalla
johon olet jo tottunut.&lt;/p&gt;
&lt;p&gt;Se, että tiedon eheyttä ei voida 100% taata taustapalveluiden rajojen yli on
se hinta joka joudutaan maksamaan toisen mäen ylittämisestä. Siitä ei pääse
yli eikä ympäri. Tämä johtuu siitä, että etäisyydet tietokoneiden välillä
verkossa ovat niin erilaisia kuin etäisyydet yhden tietokoneen prosessorin ja
muistin välillä.&lt;/p&gt;
&lt;p&gt;Sovellussuunnittelijoiden ja sivuja koostavien kontrollereiden pitää varautua
siihen, että yhden ryhmän jäsenen tietoja ei enää löydykään, ja jättää nimi
tulostamatta. Suunnittelijoiden pitää priorisoida sivun tavoitteet, ja päättää
mistä voidaan tarvittaessa tilapäisesti luopua.&lt;/p&gt;
&lt;p&gt;Olet ohjelmistoja rakentaessasi oppinut saman läksyn kuin minäkin:
muutoskustannukset kasvavat logaritmisesti ajan myötä.&lt;/p&gt;
&lt;p&gt;Sinun tehtäväsi on suunnitella onnistuvasi. Kyllä, juuri sinun!&lt;/p&gt;
&lt;p&gt;Keskustele tiimisi kanssa ensimmäisestä ja toisesta mäestä, hahmottele
palvelusi taustapalveluina ja toiminnallisina klustereina, ja tee prototyyppi
hakemistopalvelusta jo tänään!&lt;/p&gt;
&lt;p&gt;Ja ole ylpeä itsestäsi!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Pilvi-infrastruktuuri on mannaa aikatauluille</title>
        <published>2008-08-30T15:25:00+03:00</published>
        <updated>2008-08-30T15:25:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/08/pilvi-infrastruktuuri-on-mannaa/"/>
        <id>https://mikael.io/posts/2008/08/pilvi-infrastruktuuri-on-mannaa/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/08/pilvi-infrastruktuuri-on-mannaa/">&lt;p&gt;Olen ollut pilvi-infrastruktuurin käyttäjä maaliskuusta 2006, jolloin annoin
Amazonille luottokorttitietoni.&lt;/p&gt;
&lt;p&gt;Heillä oli kyllä jo korttini lukemattomien (luettujen) kirjaostosten jäljiltä,
mutta 2006 Amazon huomasi, että he voivat hyödyntää verkkokauppansa
ylimääräisen kapasiteetin myymällä senkin asiakkailleen.&lt;/p&gt;
&lt;p&gt;Minulle ja työlleni pilvi tarkoittaa sitä, että saan tarvitsemani koneet ja
levytilan valmiiksi asennettuina heti kun klikkaan, enkä muutaman viikon tai
kuukauden päästä, ja jos tarvitsen lisää niin saan senkin heti. Koska annoin
Amazonille oman luottokorttini, arvostan myös sitä että maksan vain
käytettyjen tuntien ja gigatavujen perusteella, ja voin nollata kustannukset
heti kun en enää halua maksaa.&lt;/p&gt;
&lt;p&gt;En yleensä laskuta asiakkaaltani näitä infrastruktuurikustannuksia, koska
niiden laskuttaminen maksaa enemmän kuin itse kustannukset.&lt;/p&gt;
&lt;p&gt;Tyypillisessä tapauksessa on tarvetta testata tai käyttää jotain ohjelmistoa
paikassa, johon pääsevät ihmiset monesta organisaatiosta. Tällöin käynnistän
listalta sopivan palvelimen, avaan siihen tarvittavat palomuuriportit, joko
kaikkialle tai vain tiettyihin IP-osoitteisiin, ja luon palvelimelle
tarvittavat käyttäjät. Luon projektia varten pysyvän verkkolevyalueen, ja
liitän sen käynnistämääni koneeseen. Lopuksi annan kolmannen osapuolen
nimipalveluntarjoajan käyttöliittymästä koneelle jonkun fiksun nimen, ja
kerron sen osallistujille.&lt;/p&gt;
&lt;p&gt;Kun olemme testanneet tai käyttäneet ohjelmistoa, suljen koneen, ja säilytän
pysyvää levyaluetta kunnes uskon ettemme tarvitse sitä enää. Lopuksi otan joko
levyalueesta pysyvän snapshotin jonka osallistujat voivat ladata verkosta, tai
tuhoan sen pysyvästi.&lt;/p&gt;
&lt;p&gt;Konevaihtoehtoja on usean kokoisia 1.7GB:n muistista 15GB:n muistiin, ja
yhdestä coresta kahdeksaan. Pienin maksaa 10 amerikkalaista senttiä, ja
kallein 80 amerikansenttiä tunnissa. Käyttöjärjestelmävaihtoehtoina ovat lähes
kaikki &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=101&quot;&gt;Linux-distribuutiot&lt;/a&gt; ja &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blogs.sun.com/ec2/&quot;&gt;OpenSolaris 2008.05&lt;/a&gt;, joka on
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.genunix.org/wiki/index.php/DTrace_FAQ#What_is_DTrace.3F&quot;&gt;DTrace&lt;/a&gt;n ja &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://en.wikipedia.org/wiki/ZFS&quot;&gt;ZFS&lt;/a&gt;:n takia erittäin kiinnostava vaihtoehto.&lt;/p&gt;
&lt;p&gt;Tässä kuvaamani palvelut ovat nimeltään &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://aws.amazon.com/ec2&quot;&gt;Amazon Elastic Compute Cloud&lt;/a&gt;
(EC2) ja &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://aws.amazon.com/s3&quot;&gt;Simple Storage Service&lt;/a&gt; (S3.)&lt;/p&gt;
&lt;p&gt;Olen myös viime aikoina tutustunut Googlen uuteen beta-vaiheessa olevaan
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine&lt;/a&gt;-palveluun, joka lähestyy samaa aluetta eri suunnasta.
Se ei tarjoa perusinfrastruktuuria, jolla voit tehdä mitä vain, vaan sen
sijaan varsin spesifisen alustan Python-verkkosovelluksille, ja
verkkosovelluksille soveltuvan &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/appengine/docs/datastore/&quot;&gt;tietovarastointitavan&lt;/a&gt; joka muistuttaa vain
etäisesti relaatiotietokantaa.&lt;/p&gt;
&lt;p&gt;Jos GAE tarjoaa jatkossa myös Java-tuen, se voi olla mielenkiintoinen
vaihtoehto minullekin. Joka tapauksessa se tulee määräämään low-end
markkinoilla koska Google tarjoaa ilmaiseksi 500MB tilaa ja noin 5 miljoonaa
sivunlatausta kuussa. Sillä pärjää hyvin moni pienen budjetin projekti.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Yrityksen Linux-palvelinten hallinta Red Hat Spacewalkilla</title>
        <published>2008-07-14T14:19:00+03:00</published>
        <updated>2008-07-14T14:19:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/07/yrityksen-linux-palvelimien-hallinta/"/>
        <id>https://mikael.io/posts/2008/07/yrityksen-linux-palvelimien-hallinta/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/07/yrityksen-linux-palvelimien-hallinta/">&lt;p&gt;Kaikissa yrityksissä, joiden IT-osasto vähänkin valvoo firman etua, on
nykyisin tukku Linux-palvelimia. Yrityksen koosta riippuen näitä voi olla
kahdesta kymmeniin. Suuryrityksissä satoja ja tuhansia.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.redhat.com/spacewalk/img/screenshots/your_spacewalk.png&quot;&gt;&lt;img src=&quot;http://www.redhat.com/spacewalk/img/spacewalk-screenshot.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;Linuxin mukana tulevat ylläpitotyökalut taipuvat oikeastaan
kaikkiin mahdollisiin ylläpitoprosesseihin, ja siksi ne eivät tee mistään
yhdestä prosessista point-and-click helppoa. Tässä on puolensa ja puolensa.&lt;/p&gt;
&lt;p&gt;Red Hat tarjoaa Red Hat Network-palvelua, joka taas määrittelee tarkemmin
ylläpidon roolit ja prosessit, antaen kuitenkin ylläpitäjien toimia samaan
aikaan normaaleilla yleistyökaluilla. Tämä palvelu pyörii Red Hatin
ympäristössä heidän konehuoneessaan, ja ylläpidetyt palvelimet ottavat sinne
yhteyttä aika-ajoin kysyäkseen mitä pitäisi seuraavaksi tehdä.&lt;/p&gt;
&lt;p&gt;Joihinkin ympäristöihin tämä sopii, ja toiset taas karsastavat palvelimien
ulkomaille soittelua. Tätä jälkimmäistä tapausta varten Red Hat toimittaa RHN
Satellite Serverin, joka toimii kuten RHN mutta firman omassa
palvelinhuoneessa. Tämä tuote ylittää kuitenkin pienyrityksen IT-budjetin
kymmenillä tuhansilla euroilla.&lt;/p&gt;
&lt;p&gt;Red Hat on pitkään lupaillut avata Satellite Serverin lähdekoodin, ja he
vihdoin tekivät sen kesällä 2008, nimikkeellä &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.redhat.com/spacewalk/&quot;&gt;Red Hat Spacewalk&lt;/a&gt;. Tämä tuo
RHN-ylläpidon kaikkien ulottuville, myös CentOS-ympäristössä. Avaus tekee myös
mahdolliseksi paikallisten ylläpitokonsulttipalveluiden tarjoamisen tätä
kautta. Ylläpitokonsulttiyritys pyörittää omaa Spacewalk-palvelintaan, joihin
asiakkaiden järjestelmät ovat yhteydessä, ja päivittävät järjestelmiä sovitun
mukaan.&lt;/p&gt;
&lt;p&gt;Tällä tavalla ylläpidetyssä ympäristössä voidaan käyttää RHEL/CentOS:in
normaalia paketinhallintaa hoitamaan myös kaikkia yrityksessä käytettyjä
softia, sekä omia että muiden. Ohjelmistoista ja niiden konfiguraatioista
tehdään vain RPM-paketit, ja annetaan ylläpitäjien huolehtia pakettien
deployaamisesta testi- ja tuotantoympäristöihin. Sama pätee päivitysten
kanssa, on paljon fiksumpaa käyttää yleistä RPM-standardia päivitysten
hallintaan, kuin keksiä omat ratkaisut.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Architecture rules</title>
        <published>2008-07-05T10:27:00+03:00</published>
        <updated>2008-07-05T10:27:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/07/architecture-rules/"/>
        <id>https://mikael.io/posts/2008/07/architecture-rules/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/07/architecture-rules/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://72miles.com/architecturerules/&quot;&gt;Architecture rules&lt;/a&gt; lets you automatically enforce dependency creation rules.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Phoenix has landed on Mars</title>
        <published>2008-05-26T03:11:00+03:00</published>
        <updated>2008-05-26T03:11:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/05/phoenix-has-landed-on-mars/"/>
        <id>https://mikael.io/posts/2008/05/phoenix-has-landed-on-mars/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/05/phoenix-has-landed-on-mars/">&lt;p&gt;Thanks, guys. The work you&#39;re doing is the most important work in the solar system.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.nasa.gov/mission_pages/phoenix/main/index.html&quot;&gt;&lt;img src=&quot;http://www.nasa.gov/images/content/229865main_phx-landed-427.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Canned Mistakes for Java</title>
        <published>2008-05-15T13:05:00+03:00</published>
        <updated>2008-05-15T13:05:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/05/canned-mistakes-for-java/"/>
        <id>https://mikael.io/posts/2008/05/canned-mistakes-for-java/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/05/canned-mistakes-for-java/">&lt;p&gt;I don&#39;t usually like to announce vaporware projects, but I have to get this
one out to motivate myself to push it on.&lt;/p&gt;
&lt;p&gt;Canned Mistakes are small applications that demonstrate relatively common
problems, such as different kinds of memory leaks or unbuffered I/O,
documentation on how to diagnose the problems using jstat, VisualVM, DTrace
and YourKit, and instructions of how to work around and fix the problems.&lt;/p&gt;
&lt;p&gt;Why? To provide a controlled setting for learning and truly understanding
situations which, in the wild, have too much pressure attached to allow
careful reflection.&lt;/p&gt;
&lt;p&gt;Leave a comment if you think of a specific situation that should be covered.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Catastrophic hard drive failure</title>
        <published>2008-05-12T15:07:00+03:00</published>
        <updated>2008-05-12T15:07:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/05/catastrophic-hard-drive-failure/"/>
        <id>https://mikael.io/posts/2008/05/catastrophic-hard-drive-failure/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/05/catastrophic-hard-drive-failure/">&lt;p&gt;Well, that&#39;s why you&#39;re supposed to do backups. Thinking about doing backups
and setting up RAID-1 doesn&#39;t actually protect against data loss. Oh well, I
didn&#39;t lose anything irreplaceable.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Spring view and resolver for Quercus</title>
        <published>2008-05-11T17:51:00+03:00</published>
        <updated>2008-05-11T17:51:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/05/spring-view-and-resolver-for-quercus/"/>
        <id>https://mikael.io/posts/2008/05/spring-view-and-resolver-for-quercus/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/05/spring-view-and-resolver-for-quercus/">&lt;p&gt;I&#39;ve been playing around with Spring MVC support for Quercus, and gotten a
first beta ready for publication. It&#39;s missing VFS support for non-unpacked
WARs, among other things.&lt;/p&gt;
&lt;p&gt;You can get it by running the Mercurial version control application command:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;hg clone http://www.gueck.com/hg/p2j&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The web interface to the repository is &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.gueck.com/hg/p2j&quot;&gt;http://www.gueck.com/hg/p2j&lt;/a&gt; as well.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gastronautti on taas elossa</title>
        <published>2008-04-10T14:58:00+03:00</published>
        <updated>2008-04-10T14:58:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/04/gastronautti-on-taas-elossa/"/>
        <id>https://mikael.io/posts/2008/04/gastronautti-on-taas-elossa/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/04/gastronautti-on-taas-elossa/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.gastronautti.fi/&quot;&gt;Gastronautti&lt;/a&gt; on taas elävien kirjoissa, ilmeisesti uuden yrittäjän
voimin. Laitoin ensimmäisen koetilauksen juuri sisään, pitäisi tulla tunnin
sisällä. Katsotaan kuinka käy.&lt;/p&gt;
&lt;p&gt;Päivitys: soittivat pariin kertaan kun tilaamaani tuotetta ei ollut
saatavilla, ja nyt tunnin ja 20 minuutin päästä toimitusta ei vielä näy.&lt;/p&gt;
&lt;p&gt;Tunti ja 40 minuuttia kulunut, soitin tilaukseen ja kuulema kuski on kiinni
ruuhkassa.&lt;/p&gt;
&lt;p&gt;No niin, ruoka saapui kahden tunnin ja 20 minuutin kuluttua. Pippuripihvi
Beefy Kingistä oli ehtinyt jäähtyä, mutta alla olevat ranskikset olivat
muuttuneet lämpimäksi massaksi. Kokonaisuuden pelasti pippurikastike, jossa
oli riittävästi ytyä.&lt;/p&gt;
&lt;p&gt;Tilasin myös pakasteleipomuksia, joista raportoin sulamisen jälkeen.&lt;/p&gt;
&lt;p&gt;Ilokseni voinkin raportoida, että Alénin cookiet ovat todella mainioita, ja
olisi varmaan pitänyt tilata niitä vähän vähemmän, jo hammashuollonkin
kannalta.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>VMware Server 2 beta is now usable</title>
        <published>2008-04-06T17:59:00+03:00</published>
        <updated>2008-04-06T17:59:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/04/vmware-server-2-beta-is-now-usable/"/>
        <id>https://mikael.io/posts/2008/04/vmware-server-2-beta-is-now-usable/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/04/vmware-server-2-beta-is-now-usable/">&lt;p&gt;The previous version of the VMware Server 2 beta I had tried had massive user
interface problems, but the current version is almost usable. The only
ridiculous hoop it forces you through is that you must enable logon as root
and set a root password, since modern Linux distributions don&#39;t do this
anymore.&lt;/p&gt;
&lt;p&gt;My OpenSolaris Indiana PR2 image works better with the beta than the current
VMware Workstation.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Amazon EC2 is now ready for production use</title>
        <published>2008-03-27T10:48:00+02:00</published>
        <updated>2008-03-27T10:48:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/amazon-ec2-is-now-ready-for-production/"/>
        <id>https://mikael.io/posts/2008/03/amazon-ec2-is-now-ready-for-production/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/amazon-ec2-is-now-ready-for-production/">&lt;p&gt;Today is the day Amazon Elastic Computing Cloud (EC2) became ready for
production use.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.allthingsdistributed.com/2008/03/on_the_road_to_highly_availabl.html&quot;&gt;Werner Vogels&lt;/a&gt; announced the launch of two crucial features: customer-
specific IP addresses and geographically spread out sites.&lt;/p&gt;
&lt;p&gt;Previously every machine you started was assigned a random IP address, and you
had to have your own load balancers, or hope that none of your clients had
misconfigured their DNS.&lt;/p&gt;
&lt;p&gt;This also gives us hope that we can serve non-US customers through Amazon EC2
someday, as the availability zones can be easily extended to the EU and Asia.&lt;/p&gt;
&lt;p&gt;The currently available zones are:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AVAILABILITYZONE us-east-1a available&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AVAILABILITYZONE us-east-1b available&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AVAILABILITYZONE us-east-1c available&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Amazon calls these features &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://docs.amazonwebservices.com/AWSEC2/2008-02-01/DeveloperGuide/elastic-addressing.html&quot;&gt;Elastic IP Addresses&lt;/a&gt; and &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1347&amp;amp;categoryID=112&quot;&gt;Availability Zones&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mikael&#39;s Java library pack</title>
        <published>2008-03-21T11:31:00+02:00</published>
        <updated>2008-03-21T11:31:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/mikaels-java-library-pack/"/>
        <id>https://mikael.io/posts/2008/03/mikaels-java-library-pack/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/mikaels-java-library-pack/">&lt;p&gt;These are the Java libraries I end up using in many if not most of my
projects, from the least known to the most popular:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://jga.sourceforge.net/docs/javadoc/&quot;&gt;Generic Algorithms for Java&lt;/a&gt; (jga) provides really easy tools for common
collection tasks. Alas, this great library has languished unmaintained for a while.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/p/google-collections/&quot;&gt;Google Collections&lt;/a&gt; contains the same kind of functor functionality as
jga, as well as useful collections utilities. There is only an alpha release
available at this time, and it is unclear to me whether Google is committed to
maintaining the library in the future.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://joda-time.sourceforge.net/&quot;&gt;Joda-Time&lt;/a&gt; lets you handle dates and times in a way that leaves you
refreshed and invigorated, instead of wanting to scratch your eyes out, like
the standard library date/time functionality. It is in the process of being
included in the standard library at some point in the future.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://mina.apache.org/&quot;&gt;Apache MINA&lt;/a&gt; provides nice, just abstract enough interfaces for building
network servers for lesser-known protocols, and takes care of the nitty gritty
details of the high-performance networking requirements.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;https://grizzly.dev.java.net/&quot;&gt;Grizzly&lt;/a&gt; approaches the same area as MINA from a different direction, and
might replace it in my use, especially as it&#39;s a part of GlassFish, and thus
deployed into production with every GF installation.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.springframework.org/&quot;&gt;Spring Framework&lt;/a&gt; does a whole lot of J2EE related gruntwork and
boilerplate, saving you the trouble of re-inventing those wheels. Instantly
improve the quality of your codebase by telling junior developers to only
touch JDBC through Spring. This library is a gift that keeps on giving.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/p/google-guice/&quot;&gt;Google Guice&lt;/a&gt; provides a subset of Spring&#39;s functionality. It has
excellent potential, but only a few developers and few users outside Google.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Barack Obama&#39;s speech: A more perfect union</title>
        <published>2008-03-20T09:45:00+02:00</published>
        <updated>2008-03-20T09:45:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/barack-obamas-speech-more-perfect-union/"/>
        <id>https://mikael.io/posts/2008/03/barack-obamas-speech-more-perfect-union/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/barack-obamas-speech-more-perfect-union/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=pWe7wTVbLUU&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/pWe7wTVbLUU&amp;rel=0&amp;hl=en&amp;fmt=18&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OpenSolaris&#39; Grand Day Out, starring DTrace and VMware</title>
        <published>2008-03-18T05:50:00+02:00</published>
        <updated>2008-03-18T05:50:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/opensolaris-grand-day-out-starring/"/>
        <id>https://mikael.io/posts/2008/03/opensolaris-grand-day-out-starring/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/opensolaris-grand-day-out-starring/">&lt;p&gt;I finally started the DTrace experiment I&#39;ve been planning for a while, yesterday.&lt;/p&gt;
&lt;p&gt;The experiment had a rocky start, since the primary platform I planned using,
SXCE Nevada b84, refused to install inside VMware. The solution I found today
was to remove the virtual IDE hard drive the VMware image creation tool added
to a new Solaris project, and add a virtual 16GB SCSI drive. Since the SXCE
installer was very unhelpful with its error messages, it took a bit of tinkering.&lt;/p&gt;
&lt;p&gt;Overall I&#39;m installing three Solaris distributions: Nexenta Core 1.0, Indiana
PR2 and SXCE b84.&lt;/p&gt;
&lt;p&gt;Indiana had a reasonably pleasant installation experience, nonwithstanding the
networking problems which necessitated disabling the nwadm tool and twiddling
with the VMware .vmx configuration file. Its challenges lie in the new
packaging tool, IPS, which seems to be in a prototyping stage, since it
doesn&#39;t offer any kind of dist-upgrade functionality, and its undecipherable
package names seem to be stuck in the MS/DOS land of 8.3.&lt;/p&gt;
&lt;p&gt;SXCE still offered the option of using CDE, which is a bit like a car door
offering the option of slamming on your fingers, and it shared Indiana&#39;s
networking problems. Its overall user experience is worse than Vista&#39;s.&lt;/p&gt;
&lt;p&gt;Nexenta Core had the most pleasant installation and use experience, and that&#39;s
what I&#39;d like to use, but I fear its tools don&#39;t have DTrace support compiled
in. Have to see about that.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>NetBeans 6.1, Maven, Spring 2.5 MVC, Quercus and Mercurial</title>
        <published>2008-03-13T07:08:00+02:00</published>
        <updated>2008-03-13T07:08:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/netbeans-61-maven-spring-25-mvc-quercus/"/>
        <id>https://mikael.io/posts/2008/03/netbeans-61-maven-spring-25-mvc-quercus/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/netbeans-61-maven-spring-25-mvc-quercus/">&lt;p&gt;I&#39;ve been playing around with the NetBeans 6.1 beta, learning how the new
Spring 2.5 MVC annotation-based controllers work combined with Quercus, and
how to use Mercurial to source control the whole shebang.&lt;/p&gt;
&lt;p&gt;My local Mercurial repository is at &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.gueck.com/hg/&quot;&gt;http://www.gueck.com/hg/&lt;/a&gt;, and this
project at &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.gueck.com/hg/p2j/&quot;&gt;http://www.gueck.com/hg/p2j/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The concrete objective I set myself is to think up a workable way for growing
organizations to transition their applications from PHP to Java, without
stopping the world.&lt;/p&gt;
&lt;p&gt;Step 1: See whether you can run your PHP code completely on Quercus on the
JVM, or whether you have to run some parts of the application off Apache and
some off the JVM, using mod_rewrite.&lt;/p&gt;
&lt;p&gt;Step 2: Transition your whole PHP codebase to run on Quercus on the JVM.&lt;/p&gt;
&lt;p&gt;Step 3: Hire at least two senior Java developers to help your developers get
to in terms with object-oriented development with virtual machines. Start the
slow process of moving people&#39;s thinking from a prodecural model to a object-
oriented model.&lt;/p&gt;
&lt;p&gt;Step 4: Start writing business logic controllers in Java, and use Quercus/PHP for views.&lt;/p&gt;
&lt;p&gt;Step 5: Together refactor the controllers which will inevitably still be
written in the old procedural PHP model, no matter how smart your developers
are, because changing how you think takes time.&lt;/p&gt;
&lt;p&gt;Step 6: Profit! Maintainable code! Fewer security risks!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>NetBeans 6.1 beta is getting pretty good!</title>
        <published>2008-03-11T07:24:00+02:00</published>
        <updated>2008-03-11T07:24:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/netbeans-61-beta-is-getting-pretty-good/"/>
        <id>https://mikael.io/posts/2008/03/netbeans-61-beta-is-getting-pretty-good/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/netbeans-61-beta-is-getting-pretty-good/">&lt;p&gt;I&#39;ve been test-driving the new &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://download.netbeans.org/netbeans/6.1/beta/&quot;&gt;beta of NetBeans 6.1&lt;/a&gt; through the night.&lt;/p&gt;
&lt;p&gt;I&#39;m impressed with what it delivers.&lt;/p&gt;
&lt;p&gt;The high points for me are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;usability: it&#39;s quick, it has the shortcuts I use often, and the UI doesn&#39;t
look like monkey poo flung to a wall, like the previous versions with the GTK L&amp;amp;F did&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;library support: it supports Spring 2.5 out of the box! If I want to get
someone to try out Spring for the first time, I&#39;ll direct them to NB 6.1. Even
its wizard-generated projects and code files look fairly sensible, which is
very rare.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;default SVN, CVS and Mercurial support: I&#39;ve been playing around with
Mercurial for a while, lamenting its lack of a Eclipse plugin, and this has
been a nice opportunity to experience what working with Mercurial in a
graphical environment would feel like.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hyvät työkalut nostavat suupieliä</title>
        <published>2008-03-08T17:06:00+02:00</published>
        <updated>2008-03-08T17:06:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/hyvt-tykalut-nostavat-suupieli/"/>
        <id>https://mikael.io/posts/2008/03/hyvt-tykalut-nostavat-suupieli/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/hyvt-tykalut-nostavat-suupieli/">&lt;p&gt;Lopettelen pitkää lomaani, ja tein todella onnistuneita työkaluhankintoja.&lt;/p&gt;
&lt;p&gt;Hankin Mikromafiasta uuden koneen (E8400, 8GB, 2TB) johon asensin Ubuntu 7.10 amd64:n.&lt;/p&gt;
&lt;p&gt;4x2GB DDR2 muistin hinta on vain 220€. Suosittelen päivittämään. Ero on todella tuntuva.&lt;/p&gt;
&lt;p&gt;Suoraan Ubuntun mukana ilmaiseksi tuleva, vastikään Sunin ostama VirtualBox-
softa toimii erinomaisesti. Se ei ole yhtä kypsä kuin VMware, mutta sen
asentamisen ja käytön vaivattomuus, &quot;aptitude install virtualbox&quot;, korvaa tätä.&lt;/p&gt;
&lt;p&gt;Sain hyvin nopeasti tehtyä dedikoidut virtuaalikoneet Windows Server 2008
Enterprise trialille, Oracle 10g XE:lle ja PostgrSQL 8.3:lle. Tuossa vaiheessa
kärsivällisyyteni loppui, ja aloin leikkimään^H^H^H^H opiskelemaan noita
tuotteita, mutta seuraavaksi DB2-ExpressC 9.5, MySQL 5.1 ja
sovelluspalvelimista pari WLS-versiota, JBoss ja tietysti GlassFish.&lt;/p&gt;
&lt;p&gt;Tuntuu todella hyvältä kun ei tarvitse koko ajan kiertää työkalujen
rajoituksia. Funtsin että olisiko pitänyt samalla ostaa Samsungin 30&quot;
monitori, jota olen pitkään himoinnut, mutta sen 1500€ hinta/hyötysuhde tekee
siitä vielä urheiluautonkorvikkeen suhteessa 300€ 22&quot; Samsung 226bw-
monitoriini, johon olen ollut myös erittäin tyytyväinen.&lt;/p&gt;
&lt;p&gt;Näillä kelpaa tehdä töitä. :-) Sitten pitäisi vaan lähteä keikalle myymään
itseään. :-(&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>American Gods by Neil Gaiman</title>
        <published>2008-03-03T17:15:00+02:00</published>
        <updated>2008-03-03T17:15:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/03/american-gods-by-neil-gaiman/"/>
        <id>https://mikael.io/posts/2008/03/american-gods-by-neil-gaiman/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/03/american-gods-by-neil-gaiman/">&lt;p&gt;HarperCollins is apparently releasing the whole text of this book for free on the Internet.&lt;/p&gt;
&lt;p&gt;Thanks, Reddit, for the &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://browseinside.harpercollins.com/index.aspx?isbn13=9780060558123&amp;amp;WT.mc_id=author_AmerGods_FullAccess_022208&quot;&gt;original link&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Yes We Can</title>
        <published>2008-02-02T23:51:00+02:00</published>
        <updated>2008-02-02T23:51:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/02/yes-we-can/"/>
        <id>https://mikael.io/posts/2008/02/yes-we-can/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/02/yes-we-can/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=2fZHou18Cdk&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/2fZHou18Cdk&amp;rel=0&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0&amp;border=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Daily Show explains how direct mail political advertising is made</title>
        <published>2008-02-01T21:22:00+02:00</published>
        <updated>2008-02-01T21:22:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/02/daily-show-explains-how-direct-mail/"/>
        <id>https://mikael.io/posts/2008/02/daily-show-explains-how-direct-mail/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/02/daily-show-explains-how-direct-mail/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.thedailyshow.com/sitewide/video_player/view/default/swf.jhtml&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mikä OSGi?</title>
        <published>2008-01-27T21:55:00+02:00</published>
        <updated>2008-01-27T21:55:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/01/mik-osgi/"/>
        <id>https://mikael.io/posts/2008/01/mik-osgi/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/01/mik-osgi/">&lt;p&gt;Taktisella tasolla OSGi ratkaisee ongelmaa: mitäs jos haluan projektissani
käyttää kahta kirjastoa jotka vaativat kolmannesta komponentista (esim.
loggaus) eri versiot?&lt;/p&gt;
&lt;p&gt;Strategisella tasolla OSGi ratkaisee sitä, kuinka kuvataan standarditavalla
samassa koneessa pyörivä sovellus joka koostuu monesta itsenäisesti
asennettavasta, ajettavasta ja päivitettävästä osasta.&lt;/p&gt;
&lt;p&gt;OSGi ratkoo verkostomaisesti vähän samoja ongelmia kuin EJB/WAR hierarkisesti.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Barack Obama&#39;s victory speech in South Carolina</title>
        <published>2008-01-27T16:50:00+02:00</published>
        <updated>2008-01-27T16:50:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/01/barack-obamas-victory-speech-in-south/"/>
        <id>https://mikael.io/posts/2008/01/barack-obamas-victory-speech-in-south/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/01/barack-obamas-victory-speech-in-south/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=-iVAPH_EcmQ&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/-iVAPH_EcmQ&amp;rel=1&amp;border=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Päivän ruokalöytö: Pirkka viherpippurikastike 3 dl</title>
        <published>2008-01-24T14:28:00+02:00</published>
        <updated>2008-01-24T14:28:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2008/01/pivn-ruokalyt-pirkka/"/>
        <id>https://mikael.io/posts/2008/01/pivn-ruokalyt-pirkka/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2008/01/pivn-ruokalyt-pirkka/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.pirkka.fi/ruoka/pirkka_tuotteet/pirkka_tuotehaku/?action=product&amp;amp;productId=6410405063595&quot;&gt;&lt;img src=&quot;http://www.vision.fi/cgi-bin/gwib/gm?model=remote/get.gws&amp;amp;w=plussa&amp;amp;q=2&amp;amp;f=tnro&amp;amp;id=6410405063595&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; Kastikkeet ovat olleet pitkään ruoanlaiton Akilleen kantapääni. En
ole koskaan opetellut niiden valmistamista. Siksi olen käyttänyt jopa
kyllästymiseen asti itämaisia tuotteita kuten teriyaki ja Santa Maria Indian
maustepusseja sekoitettuna muutamaan desiin vettä.&lt;/p&gt;
&lt;p&gt;Metsästys- ja keräilyretkellä eksoottisessa Arabian kauppakeskuksen K-kaupassa
törmäsin hyllyn päädyssä Pirkan valmiskastikevalikoimaan pienissä
muovipusseissa. Edullinen 2€ kappalehinta ja hauska pakkaus houkuttelivat
kokeilemaan viherpippurikastiketta.&lt;/p&gt;
&lt;p&gt;Päätin valmistaa muuten maustamattoman aterian hunajamarinoiduista kanan
rintafileistä ja puuroriisistä, ja kokeilla minkälaisen vaikutelman kastike
yksinään luo.&lt;/p&gt;
&lt;p&gt;Valmistin kanan ruskistamalla kevyesti kummaltakin puolelta, ja sitten
marinoimalla viitisen minuuttia kastikkeessa kuumalla pannulla.&lt;/p&gt;
&lt;p&gt;Tulos oli erittäin hyvä, kahden hengen ravintolatasoinen annos. Kastike
maistui ensimmäisen palan kanssa vain kermaiselta, ja pippurinen jälkimaku
kasvoi varsin hyväksi vahvaksi kontrastiksi kolmannen palan kohdalla.&lt;/p&gt;
&lt;p&gt;Ostan näitä Pirkan kastikkeita jatkossakin. Seuraavaksi kokeilen samasta
valikoimasta currykastiketta kanan, ja metsäsienikastiketta lihan kanssa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Päivitys:&lt;/strong&gt; currykastike ei ollut erityisen hyvää, maistui lähinnä
tavalliselta ruskealta kastikkeelta, sitä en suosittele.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Toinen päivitys:&lt;/strong&gt; &lt;em&gt;vihreä&lt;/em&gt; currykastike taas &lt;em&gt;oli&lt;/em&gt; oikein hyvää. Noissa
hyvissä kastikkeissa näyttää olevan teemana sana vihreä nimissä.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Everybody wants that, dear. It doesn&#39;t exist.</title>
        <published>2007-12-15T08:12:00+02:00</published>
        <updated>2007-12-15T08:12:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/12/everybody-wants-that-dear-it-doesnt/"/>
        <id>https://mikael.io/posts/2007/12/everybody-wants-that-dear-it-doesnt/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/12/everybody-wants-that-dear-it-doesnt/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=bbpbf_V8tAc&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/bbpbf_V8tAc&amp;rel=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Google Chart API is out!</title>
        <published>2007-12-06T19:50:00+02:00</published>
        <updated>2007-12-06T19:50:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/12/google-chart-api-is-out/"/>
        <id>https://mikael.io/posts/2007/12/google-chart-api-is-out/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/12/google-chart-api-is-out/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/apis/chart/&quot;&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p3&amp;amp;chd=s:hWx&amp;amp;chs=250x100&amp;amp;chl=Google%7CChart%7CAPI&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p3&amp;chd=s:hWx&amp;chs=250x100&amp;chl=Google|Chart|API&quot;&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Apple vs. Mikromafia = 1000 EUR erotusta</title>
        <published>2007-11-30T05:17:00+02:00</published>
        <updated>2007-11-30T05:17:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/apple-vs-mikromafia-1000-eur-erotusta/"/>
        <id>https://mikael.io/posts/2007/11/apple-vs-mikromafia-1000-eur-erotusta/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/apple-vs-mikromafia-1000-eur-erotusta/">&lt;p&gt;Hyvä ystäväni Heimo on Apple-fani, ja vinkkasi Applen jouluhintapäivästä.&lt;/p&gt;
&lt;p&gt;Päätin katsoa millaisia tarjouksia sieltä löytyisi, erityisesti suhteessa
hankinnan alla olevaan uuteen työkoneeseeni.&lt;/p&gt;
&lt;p&gt;Price: Eur 2.376,23&lt;/p&gt;
&lt;p&gt;PROMOTION SAVINGS: -Eur 74,59&lt;/p&gt;
&lt;p&gt;VAT: Eur 506,36&lt;/p&gt;
&lt;p&gt;Subtotal: Eur 2.808,00&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2.8GHz Intel Core 2 Extreme&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;4GB 667MHz DDR2 SDRAM - 2 x 2GB&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;500GB Serial ATA Drive&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SuperDrive 8x (DVD±R DL/DVD±RW/CD-RW)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apple Mighty Mouse&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keyboard (Finnish) + Mac OS X (Finnish)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ATI Radeon HD 2600 PRO with 256MB memory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;24-inch glossy widescreen LCD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AirPort Extreme&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bluetooth 2.0 + EDR&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vertaa tätä Mikromafian Challenger2-laskurilla laskettuun tuota lähimpänä
olevaan, mutta silti huomattavasti parempaan kokoonpanoon:&lt;/p&gt;
&lt;p&gt;Kotelo: Antec P182 ATX musta + 400W Fortron&lt;/p&gt;
&lt;p&gt;Emolevy: Intel DG33TL, 4xDDR, vga/dvi, gblan, hd-audio, firew, raid, mAtx&lt;/p&gt;
&lt;p&gt;Prosessori: Intel Core 2 Quad Q6600 2,4 GHz 8 Mt S775&lt;/p&gt;
&lt;p&gt;Muisti: Kingston 4096Mt DDR2 667 MHz CL5 2x2048 Mt Kit&lt;/p&gt;
&lt;p&gt;Kiintolevy: Seagate Barracuda 7200.10 500GB SATA2 32MB&lt;/p&gt;
&lt;p&gt;Optinen asema: Samsung DVD+/-RW Dual Layer 20x, SATA, musta&lt;/p&gt;
&lt;p&gt;Näytönohjain: Geforce 8800GT PCI-E 512 Mt (tulossa)&lt;/p&gt;
&lt;p&gt;Käyttöjärjestelmä: Windows XP Professional UK (OEM)&lt;/p&gt;
&lt;p&gt;Paketin hinta: 1239 eur (sis. alv 22%)&lt;/p&gt;
&lt;p&gt;Lisäksi tietysti näyttö, Samsungin 24&quot; 245B hintaan 520 EUR.&lt;/p&gt;
&lt;p&gt;Vielä tätä parempi kokoonpano, jota suunnittelen pohjaksi seuraavalle
työkoneelleni, on:&lt;/p&gt;
&lt;p&gt;Kotelo: Antec P182 ATX musta + 400W Fortron&lt;/p&gt;
&lt;p&gt;Emolevy: Intel DG33TL, 4xDDR, vga/dvi, gblan, hd-audio, firew, raid, mAtx&lt;/p&gt;
&lt;p&gt;Prosessori: Intel Core 2 Quad Q6600 2,4 GHz 8 Mt S775&lt;/p&gt;
&lt;p&gt;Muisti: Kingston 8192Mt DDR2 667 MHz CL5 4x2048 Mt Kit&lt;/p&gt;
&lt;p&gt;Kiintolevy: Seagate Barracuda 7200.11 1TB SATA2 32MB&lt;/p&gt;
&lt;p&gt;Toinen kiintolevy: Seagate Barracuda 7200.11 1TB SATA2 32MB&lt;/p&gt;
&lt;p&gt;Optinen asema: Samsung DVD+/-RW Dual Layer 20x, SATA, musta&lt;/p&gt;
&lt;p&gt;Näytönohjain: Geforce 8800GT PCI-E 512 Mt (tulossa)&lt;/p&gt;
&lt;p&gt;Paketin hinta: 1587 eur (sis. alv 22%)&lt;/p&gt;
&lt;p&gt;Järeän kokoonpanon tarkoituksena on toimia alustana usealle samanaikaiselle
virtuaalikoneelle, joissa voin pyörittää kulloisenkin tarpeen mukaan eri J2EE-
sovelluspalvelimia ja tietokantoja kuten DB2 Express-C ja Oracle XE. Isot
levyt ovat tarpeen, sillä aion antaa VMwarelle käyttöön suoraan raa&#39;an
levypartition, siinä uskossa että se parantaa virtuaalikoneen suorituskykyä.&lt;/p&gt;
&lt;p&gt;En voi siis löytää minkäänlaista perustetta harkita Applen tuotteita, edes
tuon 70 EUR alennuksen kanssa, sillä vähintään 1000 EUR hintaero huonomman
Applen ja paremman standardituotteen välillä on aivan liikaa.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mary Poppendieck: The Role of Leadership in Software Development</title>
        <published>2007-11-28T02:31:00+02:00</published>
        <updated>2007-11-28T02:31:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/mary-poppendieck-role-of-leadership-in/"/>
        <id>https://mikael.io/posts/2007/11/mary-poppendieck-role-of-leadership-in/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/mary-poppendieck-role-of-leadership-in/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://safari.oreilly.com/0321437381&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/21qohisAIGL._AA115_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; Mary Poppendieck gave a really great talk at QCon on &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.infoq.com/presentations/poppendieck-agile-leadership&quot;&gt;the role of
leadership in software management&lt;/a&gt;. It&#39;s freely accessible, as well as the
first &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.awprofessional.com/articles/article.asp?p=664147&amp;amp;rl=1&quot;&gt;two&lt;/a&gt; &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.infoq.com/resource/articles/poppendieck-implementing-lean/en/resources/poppendieck_ch02.pdf&quot;&gt;chapters&lt;/a&gt; of her book &lt;em&gt;Implementing Lean Software
Development: From Concept to Cash&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Both the talk and the book are very exciting.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Kent Beck: Implementation Patterns</title>
        <published>2007-11-22T18:29:00+02:00</published>
        <updated>2007-11-22T18:29:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/ken-beck-implementation-patterns/"/>
        <id>https://mikael.io/posts/2007/11/ken-beck-implementation-patterns/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/ken-beck-implementation-patterns/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://safari.oreilly.com/9780321413093&quot;&gt;&lt;img src=&quot;http://www-fp.aw.com/coverimage/0321413091.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; It&#39;s on Safari now!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Implementation Patterns&lt;/em&gt; really ties common sense software development
concepts into a neat, digestible package that creates new common ground among
your developers.&lt;/p&gt;
&lt;p&gt;It&#39;s divided into well named themed sections, so that you can easily look up
the solution you need.&lt;/p&gt;
&lt;p&gt;I very much recommend Kent Beck&#39;s &lt;em&gt;Implementation Patterns&lt;/em&gt; to both junior and
senior developers, as well as their managers.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Oscar Peterson - You Look Good To Me</title>
        <published>2007-11-20T23:33:00+02:00</published>
        <updated>2007-11-20T23:33:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/oscar-peterson-you-look-good-to-me/"/>
        <id>https://mikael.io/posts/2007/11/oscar-peterson-you-look-good-to-me/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/oscar-peterson-you-look-good-to-me/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=nKKpoCy0a5Y&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/nKKpoCy0a5Y&amp;rel=1&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Teenkö tahtomattani työtä Kokoomuksen ja Keskustan yhteiskuntasopimuksen romutuskampanjan hyväksi?</title>
        <published>2007-11-15T09:20:00+02:00</published>
        <updated>2007-11-15T09:20:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/teenk-tahtomattani-tyt-kokoomuksen-ja/"/>
        <id>https://mikael.io/posts/2007/11/teenk-tahtomattani-tyt-kokoomuksen-ja/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/teenk-tahtomattani-tyt-kokoomuksen-ja/">&lt;p&gt;Olen julkisen sektorin työntekijä, ammatiltani ohjelmistoarkkitehti.&lt;/p&gt;
&lt;p&gt;En ole koskaan pitänyt itseäni erityisen isänmaallisena.&lt;/p&gt;
&lt;p&gt;Siksi minua häiritsi kun huomasin ajattelevani &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.hs.fi/politiikka/artikkeli/Hus+komentaa+tuhat+hoitajaa+suojelut%C3%B6ihin+Tehy-lain+synnytty%C3%A4/1135231830475&quot;&gt;Helsingin Sanomien
lakkoartikkeleita&lt;/a&gt; lukiessani että se mitä Kokoomus ja Keskusta ovat
tekemässä hoitajille on epäsuomalaista.&lt;/p&gt;
&lt;p&gt;Miksi ajattelin että se on epäsuomalaista? Eikö tälläinen epäisänmaallisuus
ole enemmän amerikkalainen käsite? Enkö ole aina ollut sitä mieltä, että on
asiatonta arvostella toisten sitoutumista yhteiskuntasopimukseen, jos he eivät
suorastaan heittele polttopulloja?&lt;/p&gt;
&lt;p&gt;Pidän suomalaisesta yhteiskunnasta. Olen ajatellut, että se, että täällä on
niin kylmää niin suuren osan vuodesta, on tarkoittanut lukemattomille
sukupolville sitä, että paikat on pidettävä kunnossa, ja rakennukset ja
työkalut rakennettava kunnolla, jotta talvella ei tule kaikille kylmä ja nälkä.&lt;/p&gt;
&lt;p&gt;Ihmisten välisiä suhteita on muokannut se tosiasia, että jos jätät apua
tarvitsevan hankeen yöksi, hän kuolee takuulla, ja se on hankeenjättäjän
vastuu. Siksi aina on autettava. Samalla tavalla jokaisen on saatava ja
syötävä oma reilu osuutensa tai kaikki nälkiintyvät tai kuolevat.&lt;/p&gt;
&lt;p&gt;Nämä periaatteet ovat iskostuneet suomalaiseen kulttuuriin sukupolvien
kokemuksen kautta, ja näitä ajattelutapoja itse kukin tiedostamatta soveltaa
myös moderniin elämään niinkuin parhaiten osaa.&lt;/p&gt;
&lt;p&gt;Se mitä Kokoomus ja Keskusta tekevät nyt rikkoo tätä vastaan.&lt;/p&gt;
&lt;p&gt;Se on epäsuomalaista.&lt;/p&gt;
&lt;p&gt;Esi-isäni häpeäisivät elämistä samassa tuvassa näin käyttäytyvien ihmisten kanssa.&lt;/p&gt;
&lt;p&gt;Minä häpeän sitä, että tuen heidän toimintaansa työskentelemällä julkisella
sektorilla tälläisen hallinnon alaisuudessa.&lt;/p&gt;
&lt;p&gt;Olen jo jonkin aikaa arvioinut julkisella sektorilla työskentelemisen
todellista hyödyllisyyttä yhteiskunnalle kriittisesti, mutta tämä heinänkorsi
katkaisi nyt karhun selän.&lt;/p&gt;
&lt;p&gt;Sinä päivänä kun käskykirjeet lähtevät irtisanoutuneille hoitajille, minä
eroan julkisen sektorin työstäni. Vaikka vien tietysti myös henkilökohtaisen
paperin, tätä voi tarvittaessa myös pitää irtisanoutumisilmoituksena.&lt;/p&gt;
&lt;p&gt;Tuolla tavalla ei vain saa toimia. Se on väärin.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Päivän ruokalöytö: Blå Band Mexican pata</title>
        <published>2007-11-14T09:53:00+02:00</published>
        <updated>2007-11-14T09:53:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/pivn-ruokalyt-bl-band-mexican-pata/"/>
        <id>https://mikael.io/posts/2007/11/pivn-ruokalyt-bl-band-mexican-pata/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/pivn-ruokalyt-bl-band-mexican-pata/">&lt;p&gt;&lt;img src=&quot;http://www1.campbells.fi/bildbankfi/pictures_small/3832.jpg&quot; alt=&quot;&quot; /&gt; Viime aikana uudet tuotekokeilut ovat menneet yllättävän hyvin, eikä
Blå Band Mexican patakaan pettänyt.&lt;/p&gt;
&lt;p&gt;400g HK:n naudan jauhelihaa ja Mexican-pussi maksoivat yhteensä noin 5€, mutta
en huomannut ostaa standardireseptiin kuuluvaa papupurkkia, ja korvaan
chilipaprikan sitruunapippurilla ja chilijauheella.&lt;/p&gt;
&lt;p&gt;Tätä suomalais-meksikolaista kokemusta täydentää pussi nachoja ja purkki salsaa.&lt;/p&gt;
&lt;p&gt;Hyvää oli, mutta seuraavalla kerralla lisään myös pavut ja juustoa päälle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Päivitys:&lt;/strong&gt; myös Italian oli hyvää.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Google Android kicks Nokia&#39;s ass</title>
        <published>2007-11-13T07:35:00+02:00</published>
        <updated>2007-11-13T07:35:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/google-android-kicks-nokias-ass/"/>
        <id>https://mikael.io/posts/2007/11/google-android-kicks-nokias-ass/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/google-android-kicks-nokias-ass/">&lt;p&gt;Game over, check please.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/android/what-is-android.html&quot;&gt;http://code.google.com/android/what-is-android.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Android is to Nokia&#39;s development environments what a developer is to a bureucrat.&lt;/p&gt;
&lt;p&gt;Getting the SDK, installing it, and creating an application is SO much easier with Android.&lt;/p&gt;
&lt;p&gt;It&#39;s as if Google had figured out some way to make money without trying to
extort every available penny out of everyone who even looks your platform&#39;s
way, and without trying to control every possible aspect of their developers&#39;
lives.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to sell technology to your boss and your boss&#39;s boss</title>
        <published>2007-11-11T07:32:00+02:00</published>
        <updated>2007-11-11T07:32:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/how-to-sell-technology-to-your-boss-and/"/>
        <id>https://mikael.io/posts/2007/11/how-to-sell-technology-to-your-boss-and/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/how-to-sell-technology-to-your-boss-and/">&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/11/funny-pictures-cat-birdcage.jpg&quot; alt=&quot;&quot; /&gt; There are two basic modes of action in business: making money and saving money.&lt;/p&gt;
&lt;p&gt;Well, make it three: the black sheep is, of course, losing money.&lt;/p&gt;
&lt;p&gt;Making money is much more interesting than saving money.&lt;/p&gt;
&lt;p&gt;Making money means that you pour money into a business process, and get more
money out from the other end of the process than you originally invested.&lt;/p&gt;
&lt;p&gt;Your boss&#39;s boss has a lot of money to invest. He&#39;s only interested in hearing
about business processes that are both profitable and, as importantly, can
accomodate the kind of amount of money he has available to invest.&lt;/p&gt;
&lt;p&gt;If a business process is profitable, but can only take 500 EUR and turn it to
1000 EUR, he won&#39;t be interested. Yes, even if a 50% profit is guaranteed,
it&#39;s not worth it unless you can put in at least 1,000,000 EUR, or in some
large companies, 100,000,000 EUR, and get a 20% profit on that.&lt;/p&gt;
&lt;p&gt;Similarly, saving money is interesting if the way to save money is applicable
to a large business process that goes through a lot of money to provide a profit.&lt;/p&gt;
&lt;p&gt;When the business is turning a loss, however, your boss and your boss&#39;s boss
will be eager to find savings even in medium and small processes, especially
in those parts of the process that are not directly turning existing inventory
or other assets into revenue. They are eager, not because of any direct
business effects of those savings, but because in times of loss, there is a
lot of blame to go around, and they will be eager to receive as little as
possible. One way to duck blame is to be able to make an argument, or even
show, that your department is cutting costs. The blame pertains both to them,
personally, and to their whole department. If you don&#39;t help them duck it, it
might be your position that gets cut.&lt;/p&gt;
&lt;p&gt;OK, are you ready to sell technology?&lt;/p&gt;
&lt;p&gt;First, start with a self-assessment. Do you know enough about your
department&#39;s and the company&#39;s business, objectives, strategy and budget so
that you can talk about them with your boss in such a way that your boss will
find you credible and want to continue the conversation?&lt;/p&gt;
&lt;p&gt;The answer is probably no. You&#39;ve spent all your life learning to be really
good at what you do, while your boss has spent his life trying to do the same.
There&#39;s not a lot of natural common ground, which is a shame.&lt;/p&gt;
&lt;p&gt;If you can&#39;t immediately sound credible, don&#39;t start selling before you&#39;ve had
a chance to prepare.&lt;/p&gt;
&lt;p&gt;The good news is that if your boss has a high opinion of you as a person,
expert and employee, she&#39;ll probably want to help you to become able to
discuss those subjects credibly.&lt;/p&gt;
&lt;p&gt;If not, or if she&#39;s just too busy, or there&#39;s some other reason, you can try
to move laterally, and start by expanding your knowledge of, for example,
sales and marketing, by finding a trustworthy contact and expressing the wish
to learn. People are generally very eager to talk about themselves and what
they do well.&lt;/p&gt;
&lt;p&gt;You might want to think through why you&#39;re embarking on this quest for
knowledge. People will be interested in your motivations and objectives. Learn
to express your sincere desire to be able to work with different kinds of
people better, and your awakening to the fact that other professions are
imporant, too. They will be curious to know whether you have a specific
political motivation for your questions. Best not to mention political matters
at this point. If you&#39;re known as a firm proponent of some idea that&#39;s losing
traction, try to remember that it&#39;s very important to try to look at that
matter, and the whole, from an alternative point of view.&lt;/p&gt;
&lt;p&gt;With a little help from your friends, you&#39;ll be able to find out what larger
objectives and constraints your business and your department has, how the
political landscape looks, and who you must win on your side to be able to
sell your ideas. Be careful to find out what your boss and boss&#39;s boss are
interested in, and are in a position to sell upwards.&lt;/p&gt;
&lt;p&gt;Now, knowing what you do about technology, and with your newfound knowledge,
draw a grid of all of the matters you find important at this point, and think
of how the technology you want to sell can make a little money in a lot of
places, a lot of money in few places, save money, and so on like we&#39;ve
discussed.&lt;/p&gt;
&lt;p&gt;Then pull back and think of what in that technology creates that particular
opportunity. Generalize to the level of a fairly well known phenomenon. If
you&#39;d want to sell VMware, you&#39;d think virtualization at this point, or maybe
even consolidation. OK, take those broader concepts and think things through.
What other things associate to the concept? What kind of a history does that
concept have, what kind of a future do credible or popular writers predict,
and would you personally bet ten thousand euros on that technology. What are
the alternative ways to approach that business problem? Now that you think
about it, is the technology you want to sell really an appropriate solution to
this problem? Go through your grid and write these things down.&lt;/p&gt;
&lt;p&gt;Sleep on it, and let your thoughts simmer for a couple of days.&lt;/p&gt;
&lt;p&gt;Now it&#39;s time to cull the herd. Cut out the ideas that you don&#39;t have enough
expertise to discuss with confidence. Cut out ideas that don&#39;t apply to your
department&#39;s current situation. Cut it all down, leave three to five ideas.
Cutting doesn&#39;t mean that you abandon the idea entirely, it just means that
you&#39;ll have to think about it more before going forward with it.&lt;/p&gt;
&lt;p&gt;Research the three to five things you picked. Who else is doing this, or
similar things? What kinds of resources would you really need to do this? How
many buyers are there on the market? Has your boss or your boss&#39;s boss said
something that could be interpreted as interest in this problem?&lt;/p&gt;
&lt;p&gt;You want to do two things that are difficult to do at once: prepare yourself
very well for a discussion about your ideas, but also keep your mind and
opinions on the matter fluid enough that you can see the problem from the
viewpoint of others, adapt to new or conflicting information, or change your
opinion entirely if need be.&lt;/p&gt;
&lt;p&gt;Then it&#39;s time to start selling your ideas. If you&#39;re unsuccesful, you&#39;ll get
the blame. If you&#39;re successful, someone else will take the credit. But you
don&#39;t care about that, right? Right?&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OpenSolaris Indiana test drive part 3</title>
        <published>2007-11-03T04:51:00+02:00</published>
        <updated>2007-11-03T04:51:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive-part-3/"/>
        <id>https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive-part-3/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive-part-3/">&lt;p&gt;Now to head out to the solaris-indiana mailing list... I&#39;ve been a subscriber
for a few months, but haven&#39;t really read the list so far, just archived it
into a GMail folder.&lt;/p&gt;
&lt;p&gt;What a bunch whiners I found on that list, going on endlessly about irrelevant
details like obscure default shells, distribution naming, or why nobody has
consulted their endlessly bickering subcommittee about some urgent detail.&lt;/p&gt;
&lt;p&gt;Someone there might want to watch &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://video.google.com/videoplay?docid=-4216011961522818645&quot;&gt;this video&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To be continued...&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OpenSolaris Indiana test drive part 2</title>
        <published>2007-11-02T20:59:00+02:00</published>
        <updated>2007-11-02T20:59:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive-part-2/"/>
        <id>https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive-part-2/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive-part-2/">&lt;p&gt;After a quick trip to &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.easyvmx.com/&quot;&gt;EasyVMX!&lt;/a&gt; to create a suitable empty image for
VMware Player...&lt;/p&gt;
&lt;p&gt;I created a 10GB disk image to install Indiana on, it should be enough. Gave
it 1GB of memory. The install is running pretty slowly.&lt;/p&gt;
&lt;p&gt;For sure, I&#39;ll get 8GB of memory for my next work-from-home computer, as well
as an extra 500GB disk I&#39;ll slice up so that I can give my virtual machines
direct disk access for faster action.&lt;/p&gt;
&lt;p&gt;The &quot;Loading smf(5) service descriptions&quot; part of the first bootup takes a
while, wouldn&#39;t it be possible to precompute whatever this does?&lt;/p&gt;
&lt;p&gt;First boot done, now to log in as the username I provided to the installer.&lt;/p&gt;
&lt;p&gt;Accept the license without reading it, just like everybody else. Wow, the
fonts are screwed up even worse. Change the resolution to 1024x768. Set the
font antialiasing again, and this time go to the Advanced tab and set the DPI
setting manually to 96.&lt;/p&gt;
&lt;p&gt;Start up a terminal. The home directory is in /export/home/$USER. The default
shell is bash, thank goodness. The root file system is ZFS.&lt;/p&gt;
&lt;p&gt;How to get the network adapter working under VMware? The solaris-indiana
mailing list to the rescue, this is a known defect,
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://defect.opensolaris.org/bz/show_bug.cgi?id=66&quot;&gt;http://defect.opensolaris.org/bz/show_bug.cgi?id=66&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shutting down the system from the Gnome button doesn&#39;t work (another known
defect) so I had to run &quot;pfexec gnome-sys-suspend&quot; from a terminal.&lt;/p&gt;
&lt;p&gt;I chose the &quot;e1000&quot; workaround for the networking defect, had to disable the
automagic networking option as described at
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://opensolaris.org/os/project/nwam/phase0/nwamd_1m/&quot;&gt;http://opensolaris.org/os/project/nwam/phase0/nwamd_1m/&lt;/a&gt; and then
configure the virtual network adapter through the System -&amp;gt; Administration -&amp;gt;
Network utility. A reboot, and the network connection is up and working.&lt;/p&gt;
&lt;p&gt;Created a ZFS snapshot of my home directory by running the command &quot;pfexec zfs
shapshot zpl_slim/export/home@now&quot;. Have to remind myself that &quot;pfexec&quot; means
&quot;sudo&quot; in Solaris-land. I was lucky enough to find out about the pfexec
through a Google search, this would have been a very short test drive if I
hadn&#39;t. Hope others are as lucky.&lt;/p&gt;
&lt;p&gt;I don&#39;t think I&#39;ll try zones yet. They probably won&#39;t work yet.&lt;/p&gt;
&lt;p&gt;At least Firefox works after I&#39;ve set its fonts to look reasonable.&lt;/p&gt;
&lt;p&gt;To be continued... &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blog.gueck.com/2007/11/opensolaris-indiana-test-drive-part-3.html&quot;&gt;part 3&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OpenSolaris Indiana test drive</title>
        <published>2007-11-01T09:43:00+02:00</published>
        <updated>2007-11-01T09:43:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive/"/>
        <id>https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/11/opensolaris-indiana-test-drive/">&lt;p&gt;Oh, the Indiana preview is now available, say the RSS feeds of blogs.sun.com
in my Google Reader.&lt;/p&gt;
&lt;p&gt;The download page is pretty simple. Wow, I just clicked on the ISO image link,
and it started downloading immediately, instead of the usual Sun rigamarole
with five logins and checkbox clickery.&lt;/p&gt;
&lt;p&gt;Download speed is around 600kBps...&lt;/p&gt;
&lt;p&gt;Boots up nicely in VMware... the first window it opens contains a huge, huge
license file, which everyone with a brain knows nobody will read through.&lt;/p&gt;
&lt;p&gt;Xorg and Gnome are configured with a DPI value that results the fonts being really tiny.&lt;/p&gt;
&lt;p&gt;System -&amp;gt; Preferences -&amp;gt; Appearance -&amp;gt; Fonts, set subpixel smoothing on.&lt;/p&gt;
&lt;p&gt;System -&amp;gt; Preferences -&amp;gt; Screen Resolution, set to 1024x768.&lt;/p&gt;
&lt;p&gt;Applications -&amp;gt; System Tools -&amp;gt; Terminal.&lt;/p&gt;
&lt;p&gt;Wow, the default shell just works like I expect it to work. What a huge step forward for Solaris.&lt;/p&gt;
&lt;p&gt;Sudo doesn&#39;t work. Networking doesn&#39;t work. &quot;su -&quot; does work, the password is &quot;opensolaris&quot;.&lt;/p&gt;
&lt;p&gt;Open Firefox. The default font is terrible. Firefox -&amp;gt; Edit -&amp;gt; Preferences -&amp;gt;
Content -&amp;gt; Fonts and Colors -&amp;gt; Advanced: Serif =&amp;gt; &quot;Bitstream Vera Serif&quot;,
Sans-serif =&amp;gt; &quot;Bitstream Vera Sans&quot;, Monospace =&amp;gt; &quot;Bitstream Vera Sans Mono&quot;.&lt;/p&gt;
&lt;p&gt;Now to create a VMware virtual disk to install this on.&lt;/p&gt;
&lt;p&gt;To be continued... &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blog.gueck.com/2007/11/opensolaris-indiana-test-drive-&quot;&gt;part 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;part-2.html&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ulrich Drepper&#39;s &quot;What every programmer should know about memory&quot; parts 3, 4 and 5</title>
        <published>2007-10-30T21:05:00+02:00</published>
        <updated>2007-10-30T21:05:00+02:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/10/ulrich-dreppers-what-every-programmer-30/"/>
        <id>https://mikael.io/posts/2007/10/ulrich-dreppers-what-every-programmer-30/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/10/ulrich-dreppers-what-every-programmer-30/">&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/10/lolcats-funny-pictures-angermanagement.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://lwn.net/Articles/253361/&quot;&gt;Memory part 3: Virtual Memory&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://lwn.net/Articles/254445/&quot;&gt;Memory part 4: NUMA support&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://lwn.net/SubscriberLink/255364/1e135ddf3bff4b77/&quot;&gt;Memory part 5: What programmers can do&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>New phone number</title>
        <published>2007-10-17T21:42:00+03:00</published>
        <updated>2007-10-17T21:42:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/10/new-phone-number/"/>
        <id>https://mikael.io/posts/2007/10/new-phone-number/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/10/new-phone-number/">&lt;p&gt;My new phone number is +358-40-5804702. My email address is, as always, gumi@iki.fi.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ulrich Drepper&#39;s &quot;What every programmer should know about memory&quot;</title>
        <published>2007-10-08T18:05:00+03:00</published>
        <updated>2007-10-08T18:05:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/10/ulrich-dreppers-what-every-programmer/"/>
        <id>https://mikael.io/posts/2007/10/ulrich-dreppers-what-every-programmer/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/10/ulrich-dreppers-what-every-programmer/">&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/10/128346014772031250lettherebej.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ulrich Drepper has written two extremely useful articles about today&#39;s memory technology.&lt;/p&gt;
&lt;p&gt;Let&#39;s hope that the third part will be an equally good treatise on cross calls and problem space scaling/partitioning.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://lwn.net/Articles/250967/?format=printable&quot;&gt;http://lwn.net/Articles/250967/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://lwn.net/SubscriberLink/252125/568f5f3b7d53bd46/?format=printable&quot;&gt;http://lwn.net/Articles/252125/&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Noir cat doesn&#39;t mind a reasonable amount of trouble.</title>
        <published>2007-09-07T22:36:00+03:00</published>
        <updated>2007-09-07T22:36:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/09/noir-cat-doesnt-mind-reasonable-amount/"/>
        <id>https://mikael.io/posts/2007/09/noir-cat-doesnt-mind-reasonable-amount/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/09/noir-cat-doesnt-mind-reasonable-amount/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://books.google.com/books?q=lolcat&amp;amp;as_brr=1&quot;&gt;&lt;img src=&quot;http://icanhascheezburger.wordpress.com/files/2007/09/noir-cat-doesnt-mind-a-reasonable-amount-of-trouble.jpg&quot; alt=&quot;noir-cat-doesnt-mind-a-reasonable-amount-of-trouble.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Parable of the Software Architect</title>
        <published>2007-09-04T17:05:00+03:00</published>
        <updated>2007-09-04T17:05:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/09/parable-of-software-architect/"/>
        <id>https://mikael.io/posts/2007/09/parable-of-software-architect/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/09/parable-of-software-architect/">&lt;p&gt;&quot;This guy&#39;s walking down the street when he falls in a hole. The walls are so
steep he can&#39;t get out.&lt;/p&gt;
&lt;p&gt;&quot;A doctor passes by and the guy shouts up, &#39;Hey you. Can you help me out?&#39; The
doctor writes a prescription, throws it down in the hole and moves on.&lt;/p&gt;
&lt;p&gt;&quot;Then a priest comes along and the guy shouts up, &#39;Father, I&#39;m down in this
hole can you help me out?&#39; The priest writes out a prayer, throws it down in
the hole and moves on&lt;/p&gt;
&lt;p&gt;&quot;Then an architect walks by, &#39;Hey, Joe, it&#39;s me can you help me out?&#39; And the
architect jumps in the hole. Our guy says, &#39;Are you stupid? Now we&#39;re both
down here.&#39; The architect says, &#39;Yeah, but I&#39;ve been down here before and I
know the way out.&#39;&quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I&#39;ve been asked about what software architecture means, and what good it does.
It&#39;s a way out of the hole, drawn by someone who&#39;s been there before.&lt;/p&gt;
&lt;p&gt;The first time I heard the original version of this parable about friendship
was on the West Wing, my absolute favourite TV series ever. It stuck with me.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>HBR Case Study: Too Far Ahead of the IT Curve?</title>
        <published>2007-08-31T23:50:00+03:00</published>
        <updated>2007-08-31T23:50:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/hbr-case-study-too-far-ahead-of-it/"/>
        <id>https://mikael.io/posts/2007/08/hbr-case-study-too-far-ahead-of-it/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/hbr-case-study-too-far-ahead-of-it/">&lt;p&gt;I&#39;m in the middle of reading the latest HBR case study, &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://harvardbusinessonline.hbsp.harvard.edu/hbsp/hbr/articles/article.jsp?_requestid=9482&amp;amp;value=BR0707&amp;amp;ml_subscriber=true&amp;amp;ml_action=get-article&amp;amp;ml_issueid=BR0707&amp;amp;articleID=R0707A&amp;amp;pageNumber=1&quot;&gt;Too Far Ahead of the
IT Curve?&lt;/a&gt; and thought I&#39;d place my bet before reading the commentary.&lt;/p&gt;
&lt;p&gt;This is what I think: all IT investments rust rapidly. Prevention is a hundred
times cheaper than repair. Just one quarter of lapsed prevention means
repairs. Just one quarter of lapsed repairs means that parts of the system are
beyond repair and have to be replaced wholesale or they start falling apart.&lt;/p&gt;
&lt;p&gt;There must be software governance. Software auditors must routinely inspect
corporate software assets and report back to the board if they find signs of
disrepair, whether because of neglect or malice. SAP, like Arthur Andersen, is
just not an acceptable excuse.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Generating Amazon EC2 web service client classes with Metro 1.0m6 and JAX-WS 2.1.2RC1</title>
        <published>2007-08-31T18:46:00+03:00</published>
        <updated>2007-08-31T18:46:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/generating-amazon-ec2-web-service/"/>
        <id>https://mikael.io/posts/2007/08/generating-amazon-ec2-web-service/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/generating-amazon-ec2-web-service/">&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WSIMPORT_OPTS=&amp;quot;-Djava.endorsed.dirs=./lib&amp;quot; bin/wsimport.sh -extension -d . -s . http://s3.amazonaws.com/ec2-downloads/ec2.wsdl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;zip -r amazon-ec2.jar com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;rm -rf com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Java: the barriers of entry are ridiculously low</title>
        <published>2007-08-30T14:53:00+03:00</published>
        <updated>2007-08-30T14:53:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/java-barriers-of-entry-are-ridiculously/"/>
        <id>https://mikael.io/posts/2007/08/java-barriers-of-entry-are-ridiculously/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/java-barriers-of-entry-are-ridiculously/">&lt;p&gt;It came to my mind as I was just eating lunch: the barriers of entry to
starting a software development business are getting ridiculously low these
days. The only expensive things you need are skills, a decade of experience
and a willingness to meet new people.&lt;/p&gt;
&lt;p&gt;As an example, I have three computers at home, just for redundancy. The latest
addition cost me €600 for an Acer Aspire E380 with an AMD64 dual core
processor, 2GB of memory and a 320GB disk. My other two computers cost a
couple hundred euros more per computer, but they are a bit more silent. You
can reasonably run a software business with two home computers. I use the
third to test things like new Solaris versions with DTrace and ZFS that really
need to run on bare iron, and as beta stuff, might not necessarily play nice
with other products.&lt;/p&gt;
&lt;p&gt;For effective Eclipse use, I bought a 22&quot; widescreen monitor for €400. Had I
gone with a good Acer AL2216WSD instead of the best Samsung 226bw, I would
have saved €150 on that too. Having a good monitor is extremely important, and
having a widescreen monitor really pays off when working with modern IDE&#39;s.&lt;/p&gt;
&lt;p&gt;I have both an ADSL and a cable Internet connection, again for redundancy. I
monitor the lines, and in the last 3 or so years there&#39;s only been a single
one hour time period when both lines have been down at the same time. A fast
ADSL line and a fast cable connection together cost around €80 a month,
maximum.&lt;/p&gt;
&lt;p&gt;For servers, I&#39;m enrolled in the Amazon S3 and EC2 programs, and I can easily
start up as many servers as I need in a few minutes. No need for costly
infrastructure investments. Since gigabytes of transfer and storage cost
peanuts (literally ten cents an hour and gigabyte,) I can easily fund whatever
I need from my Pepsi cola budget until the customers pay the first bills. For
external version control, I can use services such as CVSDude, or just set up
an EC2 server that automatically backs itself up on S3.&lt;/p&gt;
&lt;p&gt;Since the Acer E380 disk was partitioned in two, I just installed Ubuntu
Feisty Fawn 64bit on the empty partition, and kept the original Windows Vista
on the other. Installing Ubuntu was a breeze, unlike the process of
initializing the &quot;pre-installed&quot; Windows Vista that took hours.&lt;/p&gt;
&lt;p&gt;After that, I downloaded and installed the 64-bit JDK 1.6 from Sun, downloaded
and installed Eclipse, its JEE plugins and Subclipse, Glassfish and some other
tools. You can tell the Ubuntu system to apt-get all of these tools
automatically, with just one apt-get, but I like to use the newest JDK and
application servers to check on my desktop whether the newest bug fixes and
features have any adverse effect on my stuff before they get installed on any
servers.&lt;/p&gt;
&lt;p&gt;The free VMWare Server and Player products take care of any virtualization
needs that the Amazon EC2 service doesn&#39;t cover.&lt;/p&gt;
&lt;p&gt;After that, if you know how to develop good software, you&#39;re home golden. If
you don&#39;t, all the money in the world won&#39;t help you.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bryan Cantrill presents DTrace at Google</title>
        <published>2007-08-22T20:14:00+03:00</published>
        <updated>2007-08-22T20:14:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/bryan-cantrill-presents-dtrace-at/"/>
        <id>https://mikael.io/posts/2007/08/bryan-cantrill-presents-dtrace-at/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/bryan-cantrill-presents-dtrace-at/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://video.google.com/googleplayer.swf?docId=-8002801113289007228&amp;hl=en&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Advanced Topics in Programming Languages: JSR-305: Java annotations For Defects</title>
        <published>2007-08-13T18:51:00+03:00</published>
        <updated>2007-08-13T18:51:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/advanced-topics-in-programming/"/>
        <id>https://mikael.io/posts/2007/08/advanced-topics-in-programming/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/advanced-topics-in-programming/">&lt;p&gt;Just when I get started with my &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://code.google.com/p/gueckdotcom/wiki/NullPolicy&quot;&gt;NullPolicy&lt;/a&gt; tool...&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Before you enlist</title>
        <published>2007-08-09T19:09:00+03:00</published>
        <updated>2007-08-09T19:09:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/before-you-enlist/"/>
        <id>https://mikael.io/posts/2007/08/before-you-enlist/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/before-you-enlist/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=6fkkdoDOIJM&quot; class=&quot;self-start py-2&quot;&gt;Look for it on YouTube ↗&lt;/a&gt;
&lt;span class=&quot;text-sm text-dim&quot;&gt;It might not be there any more.&lt;/span&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.youtube.com/v/6fkkdoDOIJM&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sneaky</title>
        <published>2007-08-08T05:51:00+03:00</published>
        <updated>2007-08-08T05:51:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/sneaky/"/>
        <id>https://mikael.io/posts/2007/08/sneaky/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/sneaky/">&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/08/sneaky-cat.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Presentaatioiden konvertoiminen webimuotoon</title>
        <published>2007-08-04T06:22:00+03:00</published>
        <updated>2007-08-04T06:22:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/presentaatioiden-konvertoiminen/"/>
        <id>https://mikael.io/posts/2007/08/presentaatioiden-konvertoiminen/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/presentaatioiden-konvertoiminen/">&lt;p&gt;Päivitys:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.readwriteweb.com/archives/adobe_flash_player_moviestar_h264.php&quot;&gt;http://www.readwriteweb.com/archives/adobe_flash_player_moviestar_h264.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.kaourantin.net/2007/08/what-just-happened-to-video-on-web_20.html&quot;&gt;http://www.kaourantin.net/2007/08/what-just-happened-to-video-on-web_20.html&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mplayer -playlist &amp;#39;http://kraken.it.helsinki.fi/ramgen/TP2007/19447_ISO.rm&amp;#39; -dumpstream -bandwidth 10000000 -dumpfile input.ra&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mplayer -identify input.ra -ao null -vo null -frames 0 2&amp;gt;/dev/null | grep ^ID_&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mencoder -ovc x264 -x264encopts pass=1:8x8dct:i8x8 -nosound  -o output.mov input.ra&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mencoder -ovc x264 -x264encopts bitrate=1000:pass=2:8x8dct:i8x8 -oac copy -o output.mov input.ra&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ohjelmistokehitysongelman selvittäminen ensimmäisen ja toisen kerran</title>
        <published>2007-08-03T19:20:00+03:00</published>
        <updated>2007-08-03T19:20:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/ohjelmisto-ongelman-selvittminen/"/>
        <id>https://mikael.io/posts/2007/08/ohjelmisto-ongelman-selvittminen/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/ohjelmisto-ongelman-selvittminen/">&lt;p&gt;Kananmunan paistaminen 1.0:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Otetaan kananmunat ja pekoni ulos jääkaapista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan rypsiöljy ulos kaapista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan lieden vasen takalevy päälle, teholle 4.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan rypsiöljyä paistinpannulle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan pekonit paistinpannulle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 2min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nostetaan vasemman takalevyn tehoa 5:n.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 2min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Käännetään pekonit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 1min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Huomataan, ettei ole puhtaita lautasia.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Siirretään paistinpannu oikealle takalevylle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pestään lautanen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Siirretään vetiset pekonit lautaselle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan pannu takaisin vasemmalle takalevylle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 3min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rikotaan kananmunat paistinpannulle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan paahtoleipä jääkaapista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan ensimmäiset leivät paahtumaan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Käännetään kananmunat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ripotellaan pippuria ja suolaa munille.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Siirretään kananmunat lautaselle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 2min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan leivät paahtimesta, laitetaan toiset tilalle, ja paahdin päälle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan valkosipulijuustolevite ulos jääkaapista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pestään voiveitsi nopeasti.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Levitetään levite kuivahtaneille leiville.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 1min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan leivät paahtimesta.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan kuivahtaneet mutta vetiset pekonit leiville, ja kylmentyneet
kananmunat päälle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Syödään.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Elinkumppani tulee kommentoimaan sarkastisesti astioista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jätetään aamiainen kesken, laitetaan astiat likoamaan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jatketaan nyt kylmän aamiaisen syömistä.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kananmunan paistaminen 2.0:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Valitaan liedestä paisto- ja alustalevyt Lp ja La.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan Lp päälle, teholle 6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan paahtoleipä ja valkosipulijuustolevite ulos jääkaapista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan kaksi paahtoleivänpalasta valmiiksi paahtimeen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan voiveitsi valmiiksi levitykseen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan kananmunat ja pekoni ulos jääkaapista.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Odotetaan 1min.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan pekonisuikaleet paistumaan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan leivänpaahdin päälle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan lautanen ulos kaapista ja asetetaan se La alustalle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Käännetään pekonit ja muutetaan Lp teho 5:n.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan ensimmäiset leivät ulos paahtimesta, uudet leivät sisälle ja
paahdin päälle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Levitetään juustoa leiville.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan pekonit pannulta lautaselle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rikotaan kananmunat pannulle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otetaan viimeiset leivät uudet paahtimesta ja levitetään juustoa ja
pekonit leiville.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ripotellaan pippuria ja suolaa kananmunien päälle, ja käännetään ne
pannulla.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Siirretään kananmunat lautaselle leipien päälle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Laitetaan Lp pois päältä, paistinpannu ja -lasta veteen, pekoni,
kananmunat, levite ja leipä jääkaappiin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Syödään.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Päivän ravintolalöytö: Pizza Pasila</title>
        <published>2007-08-02T19:03:00+03:00</published>
        <updated>2007-08-02T19:03:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/pivn-ravintolalyt-pizza-pasila/"/>
        <id>https://mikael.io/posts/2007/08/pivn-ravintolalyt-pizza-pasila/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/pivn-ravintolalyt-pizza-pasila/">&lt;p&gt;Olin tänään sairaslomalla kotona odottamattoman verenvuodon vuoksi,
jääkaappini oli tyhjä ja Gastronautti konkurssissa, joten päätin kokeilla
uutta ravintolaa, joka oli sujauttanut postiluukkuuni mainoksen, Pizza
Pasilaa. Mainos oli varsin pizzeriamainen, mutta ruoka oli todella hyvää, 24
EUR maksoi iso annos currykanaa ja riisiä, katkarapupasta, 3 litraa Pepsi
Maxia ja kotiinkuljetus. Positiivinen yllätys! Puh. 09-147393, ma-pe 10-22,
la-su 11-22. Opastinsilta 10.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Skepticism</title>
        <published>2007-08-02T18:34:00+03:00</published>
        <updated>2007-08-02T18:34:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/skepticism/"/>
        <id>https://mikael.io/posts/2007/08/skepticism/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/skepticism/">&lt;p&gt;&lt;img src=&quot;https://mikael.io/posts/2007/08/skepticism/skeptical-cat-is-fraught-with-skepticism.jpg&quot; alt=&quot;Skeptical cat is fraught with skepticism.&quot; /&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Atlassian Crucible koeajo</title>
        <published>2007-08-01T22:10:00+03:00</published>
        <updated>2007-08-01T22:10:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/08/atlassian-crucible-koeajo/"/>
        <id>https://mikael.io/posts/2007/08/atlassian-crucible-koeajo/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/08/atlassian-crucible-koeajo/">&lt;p&gt;Koeajoin tänään muutamaa ajankohtaista projektia varten &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.atlassian.com/software/crucible/&quot;&gt;Atlassian Crucible&lt;/a&gt;n.&lt;/p&gt;
&lt;p&gt;Se on laatutyökalu ohjelmistokehitysprosessiin, jolla ohjelmoijat saavat tukea
ja kuria toisiltaan.&lt;/p&gt;
&lt;p&gt;Crucible kuuntelee versionhallintaa, ja kun sinne tulee muutoksia, niitä voi
kehittäjä tai arkkitehti poimia arvioitaviksi kokonaisuuksiksi, joilla on
useita arvioijia ja yksi moderaattori.&lt;/p&gt;
&lt;p&gt;Arvioijat käyvät koodia läpi ja merkkaavat paikat joista heillä on kysymyksiä
tai kommentteja klikkaamalla selaimessa highlightatun muuttuneen koodirivin
päälle. Koodin kirjoittaja voi vastata heille siihen.&lt;/p&gt;
&lt;p&gt;Ymmärtääkseni kehittäjä voi myös tehdä koodiinsa muutoksia, kommitoida ne, ja
lisätä uudet muutokset samaan arviointiin.&lt;/p&gt;
&lt;p&gt;Lopuksi moderaattori sulkee arvionnin, ja tekee tuloksista yhteenvedon.&lt;/p&gt;
&lt;p&gt;Työkalu vaikutti juuri riittävän monimutkaiselta, ja yllättävän hyvältä
versioksi 1.0, mutta toisaalta se onkin suoraa jatkoa Cenquan FishEye-
työkalulle, jonka päälle Crucible on kerros.&lt;/p&gt;
&lt;p&gt;Taidan ottaa työkalun käyttöön muutamassa tulevassa uudessa projektissa,
joiden kehitysprosessissa todennäköisesti tarvitaan jotain tälläistä.&lt;/p&gt;
&lt;p&gt;Atlassian osti Cenquan muutkin tuotteet, mm. Cloverin, jonka versio 2.0
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.cenqua.com/clover/20/samples/pmd/dashboard.html&quot;&gt;vaikuttaa oikein hyvältä&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Arvion teossa Amazon EC2:sta oli paljon hyötyä. Loin yhdellä komennolla uuden
virtuaalikoneinstanssin, SSH:asin sinne sisään, asensin Javan, unzippasin
Crucible-paketin, lisäsin SvnKit-kirjaston, käynnistin Cruciblen, ja voilá.
Sekä koekaniini &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www-hotel1.it.helsinki.fi/wpmu/hklaukka/&quot;&gt;Heimo&lt;/a&gt; että minä pääsimme käsiksi kätevästi työkaluun.
Oodin Sampokin varmaan jossain välissä testaa työkalua.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Completely Fair Scheduler työpöydällä</title>
        <published>2007-08-01T01:43:00+03:00</published>
        <updated>2007-08-01T01:43:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/completely-fair-scheduler-typydll/"/>
        <id>https://mikael.io/posts/2007/07/completely-fair-scheduler-typydll/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/completely-fair-scheduler-typydll/">&lt;p&gt;Testaan juuri Linux 2.6.23:n sisällytettyä Completely Fair Scheduleria, ja
täytyy sanoa että tämä tekee työpöytätyöskentelystä mukavampaa. Selaimessa
hidastelevat verkkosivut eivät hidasta muita selainikkunoita saati sitten
muita sovelluksia. Kokeilkaa huviksenne.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tuotepino valtion hallinnollisten sovellusten kehitykseen</title>
        <published>2007-07-29T15:47:00+03:00</published>
        <updated>2007-07-29T15:47:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/tuotepino-valtion-hallinnollisten/"/>
        <id>https://mikael.io/posts/2007/07/tuotepino-valtion-hallinnollisten/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/tuotepino-valtion-hallinnollisten/">&lt;p&gt;Valtion hallinnollisen sovelluskehityksen tarpeet ovat melko spesifisiä.&lt;/p&gt;
&lt;p&gt;Esittelemällä oikeat vaihtoehdot kehityksen asiakkaille hallitaan onnistumisen
riskejä. (Käyttöliittymää suunniteltaessa asiakkaalle esitellään vakioidut
JSF:n komponentit, kuinka ne toimivat, ja mietitään yhdessä miten ongelma
voidaan esittää niillä termeillä.)&lt;/p&gt;
&lt;p&gt;Itse kirjoitetun koodin ja konfiguraation minimoinnilla hallitaan ylläpidon
riskejä. (Valmiiksi rakennetut ja muiden ylläpitämät kirjastot ja frameworkit
kuten Spring ja Seam keksivät pyörän kerran, ja emme keksi pyörää uudestaan.)&lt;/p&gt;
&lt;p&gt;Käyttämällä stabiileja ja vähäbugisia taustatuotteita hallitaan operoinnin
riskejä. (Standardeista on eri laatuisia implementaatioita.)&lt;/p&gt;
&lt;p&gt;Tukeutumalla standardituotteisiin ja avoimeen lähdekoodiin hallitaan
valmistajariippuvuuden riskejä. (Java SE, Java EE ja JSF-standardeista on
useita realistisesti mahdollisia implementaatioita.)&lt;/p&gt;
&lt;p&gt;Vakioimalla käytetyt järjestelmät ja ongelmanratkaisutavat hallitaan
kustannuksia ja henkilöstöriskejä. (Useimmat hallinnolliset sovellukset
sopivat hyvin ilmaistavaksi MVC/JSF/Seam termeillä, eikä usean pinon käytöstä
ole mitään olennaisia hyötyjä.)&lt;/p&gt;
&lt;p&gt;Määrittelemällä kohtuulliset muutosikkunat hallitaan liiallisen muutoksen ja
kalkkeutumisen riskejä. (2006-2008, 2009-2011 ja 2012-2014. Seuraavaa kolmen
vuoden ikkunaa voidaan jo suunnitella, ja suuremmat muutokset budjetoida.)&lt;/p&gt;
&lt;p&gt;2006-2008 pino:&lt;/p&gt;
&lt;p&gt;Asiakaspäässä XHTML, CSS ja Ajax, Firefox 2.0:ssa ja IE 6-7:ssä.&lt;/p&gt;
&lt;p&gt;Arkkitehtuureissa ja kirjastoissa &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://en.wikipedia.org/wiki/Model-view-controller&quot;&gt;MVC&lt;/a&gt;, &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://java.sun.com/javaee/5/docs/tutorial/doc/JSFIntro4.html#wp114963&quot;&gt;JSF&lt;/a&gt;/&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://docs.jboss.com/seam/latest-2.0/reference/en/html/tutorial.html#registration-example&quot;&gt;Seam&lt;/a&gt;, &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://static.springframework.org/spring/docs/2.1.x/reference/introduction.html#overview-usagescenarios&quot;&gt;Spring&lt;/a&gt;,
&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://openjpa.apache.org/docs/latest/manual/manual.html#jpa_overview_arch&quot;&gt;JPA&lt;/a&gt;/&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html#tutorial-webapp-processing&quot;&gt;Hibernate&lt;/a&gt;, JavaEE.&lt;/p&gt;
&lt;p&gt;Tietokannoissa Oracle 10g, Postgresql 8.&lt;/p&gt;
&lt;p&gt;Sovelluspalvelimissa ja virtuaalikoneissa GlassFish 2, J2SE 1.6, OpenJDK 1.7.&lt;/p&gt;
&lt;p&gt;Debuggaustyökaluissa JMX, &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.yourkit.com/features/index.jsp&quot;&gt;YourKit&lt;/a&gt; ja &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blogs.sun.com/ahl/entry/dtracing_java&quot;&gt;DTrace&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Käyttöjärjestelmissä CentOS5/RHEL5, Solaris 10u4.&lt;/p&gt;
&lt;p&gt;Raudassa AMD64 bladet, 2x2core tai 1x4core, 16GB.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>lolcats</title>
        <published>2007-07-23T23:11:00+03:00</published>
        <updated>2007-07-23T23:11:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/lolcats/"/>
        <id>https://mikael.io/posts/2007/07/lolcats/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/lolcats/">&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/06/scratchsm.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/06/donut-worry-we-iz-profesion.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/07/hahaha-lulz.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/05/helpercat.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Palveluluettelo?</title>
        <published>2007-07-23T20:12:00+03:00</published>
        <updated>2007-07-23T20:12:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/palveluluettelo/"/>
        <id>https://mikael.io/posts/2007/07/palveluluettelo/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/palveluluettelo/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www-hotel1.it.helsinki.fi/wpmu/hklaukka/2007/07/23/palvelut-palveluluettelo-ja-elaman-tarkoitus/&quot;&gt;Heimo kysyy&lt;/a&gt; &quot;Miten siis voisimme kertoa palveluistamme yksinkertaisesti, koherentisti ja ymmärrettävästi?&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/07/mouse.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Aloittaisin muokkaamalla kysymykseen muotoon &quot;Miten kertoa palveluistamme?&quot;
Vähemmän sanoja.&lt;/p&gt;
&lt;p&gt;Käännetään ajatus päälaelleen. &quot;Mitä asiakasryhmiä tämä palvelu kiinnostaa?&quot;&lt;/p&gt;
&lt;p&gt;Käytetään organisaation sisäisen toimijan edut. &quot;Hei, sinä IT:tä tunteva
tutkija, kävisitkö meidän kanssamme läpi koko palvelulistan, ja tekisit
avainasioista tutkijoita hyödyttävän wikisivun tovereidesi kanssa?&quot;&lt;/p&gt;
&lt;p&gt;Paketoidaan asioita kokonaisuuksiksi. &quot;Mitä paketteja IT-markkinoilla on jo
olemassa? Mitä maksaa se, että teemme olennaisesti erilaisia tuotteita, ja
seuraako siitä todellisia hyötyjä?&quot;&lt;/p&gt;
&lt;p&gt;Vähennetään byrokratiaa. &quot;Olisiko maitoa helpompi myydä aina litra kerrallaan,
kuin kaataa tonkkaan ja punnita?&quot;&lt;/p&gt;
&lt;p&gt;Tehdään oikeita asioita. &quot;Mitä hyötyä tämän asian itse tekemisestä on, ja
kelpaisiko asiakkaille huonompilaatuinen ostettu palvelu?&quot;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>lolcat</title>
        <published>2007-07-20T13:56:00+03:00</published>
        <updated>2007-07-20T13:56:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/lolcat/"/>
        <id>https://mikael.io/posts/2007/07/lolcat/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/lolcat/">&lt;p&gt;&lt;img src=&quot;http://icanhascheezburger.files.wordpress.com/2007/07/533267369_21815683be.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>No End in Sight</title>
        <published>2007-07-19T22:57:00+03:00</published>
        <updated>2007-07-19T22:57:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/no-end-in-sight/"/>
        <id>https://mikael.io/posts/2007/07/no-end-in-sight/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/no-end-in-sight/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://video.google.com/googleplayer.swf?docId=9147761136890542136&amp;hl=en&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to: confront your assumptions honestly</title>
        <published>2007-07-15T06:32:00+03:00</published>
        <updated>2007-07-15T06:32:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/how-to-confront-your-assumptions/"/>
        <id>https://mikael.io/posts/2007/07/how-to-confront-your-assumptions/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/how-to-confront-your-assumptions/">&lt;p&gt;I can&#39;t tell you how long it will take to write this piece of software.&lt;/p&gt;
&lt;p&gt;If you were to ask my collagues for a list of the top 10 people they know who
can tell you how long it&#39;ll take to write a piece of software, my name would
be somewhere at the top of that list, and I can&#39;t tell you how long it&#39;ll take
to write this piece of software. I really can&#39;t.&lt;/p&gt;
&lt;p&gt;I can estimate, but you won&#39;t like the fact that my estimates could be 1000%
off. And those are good estimates, most of the time pretty accurate!&lt;/p&gt;
&lt;p&gt;If you give me the full authority and resources to direct the development,
I&#39;ll sure as heck produce something that will fulfill the expectations I heard
you communicate to me at our first discussion, but it sure as heck won&#39;t
fulfill your revised expectations! To do that, we&#39;ll have to play the whole
game all over again.&lt;/p&gt;
&lt;p&gt;I&#39;ve come to think that we can never win by playing that game. I&#39;ve come to
think that we shouldn&#39;t play that game at all. That we should change the rules.&lt;/p&gt;
&lt;p&gt;I don&#39;t yet know what the new rules should look like. We should probably take
in moderation from &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://harvardbusinessonline.hbsp.harvard.edu/b02/en/common/item_detail.jhtml?id=R0704E&quot;&gt;promise-based management&lt;/a&gt;, Scrum, and develop more
credible vocabulary to describe software quality.&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Recompiling the FreeType package in Fedora to render reasonable fonts</title>
        <published>2007-07-14T12:52:00+03:00</published>
        <updated>2007-07-14T12:52:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/recompiling-freetype-package-in-fedora/"/>
        <id>https://mikael.io/posts/2007/07/recompiling-freetype-package-in-fedora/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/recompiling-freetype-package-in-fedora/">&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo nano -w /usr/src/redhat/SPECS/freetype.spec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo rpmbuild -ba --define=&amp;quot;dist .fonts&amp;quot; /usr/src/redhat/SPECS/freetype.spec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo rpm -Fvh /usr/src/redhat/RPMS/i386/freetype*fonts*rpm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Jon Stewart demolishes Crossfire</title>
        <published>2007-07-10T11:52:00+03:00</published>
        <updated>2007-07-10T11:52:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/jon-stewart-demolishes-crossfire/"/>
        <id>https://mikael.io/posts/2007/07/jon-stewart-demolishes-crossfire/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/jon-stewart-demolishes-crossfire/">&lt;p&gt;The classic clip from a few years back.&lt;/p&gt;
&lt;figure class=&quot;flex flex-col gap-2&quot; lang=&quot;en&quot;&gt;
&lt;div data-youtube=&quot;aFQFB5YpDZE&quot; data-title=&quot;Jon Stewart on Crossfire&quot; class=&quot;flex items-center justify-center border border-rule bg-panel&quot; style=&quot;aspect-ratio: 4 / 3&quot;&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=aFQFB5YpDZE&quot; class=&quot;flex min-h-11 items-center gap-[1ch] px-4 no-underline&quot;&gt;&lt;span class=&quot;text-accent&quot; aria-hidden=&quot;true&quot;&gt;▶&lt;/span&gt;&lt;span class=&quot;underline decoration-text/40 underline-offset-[3px]&quot;&gt;play: Jon Stewart on Crossfire&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;figcaption class=&quot;text-sm text-dim&quot;&gt;The video is loaded from YouTube (youtube-nocookie.com) only when you press play.&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Max Weber: Politics as a vocation</title>
        <published>2007-07-05T03:33:00+03:00</published>
        <updated>2007-07-05T03:33:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/max-weber-politics-as-vocation/"/>
        <id>https://mikael.io/posts/2007/07/max-weber-politics-as-vocation/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/max-weber-politics-as-vocation/">&lt;p&gt;&quot;Politics is a strong and slow boring of hard boards. It takes both passion
and perspective. Certainly all historical experience confirms the truth--that
man would not have attained the possible unless time and again he had reached
out for the impossible. But to do that a man must be a leader, and not only a
leader but a hero as well, in a very sober sense of the word. And even those
who are neither leaders nor heroes must arm themselves with that steadfastness
of heart which can brave even the crumbling of all hopes. This is necessary
right now, or else men will not be able to attain even that which is possible
today. Only he has the calling for politics who is sure that he shall not
crumble when the world from his point of view is too stupid or too base for
what he wants to offer. Only he who in the face of all this can say &#39;In spite
of all!&#39; has the calling for politics.&quot;&lt;/p&gt;
&lt;p&gt;Max Weber, &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://tiunet.tiu.edu/acadinfo/cas/socsci/psych/SOC410/Readings/Weber/Works/politics.htm&quot;&gt;Politik als Beruf&lt;/a&gt;, 1921&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sicko</title>
        <published>2007-07-04T18:17:00+03:00</published>
        <updated>2007-07-04T18:17:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/sicko/"/>
        <id>https://mikael.io/posts/2007/07/sicko/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/sicko/">&lt;figure class=&quot;flex flex-col gap-2&quot; lang=&quot;en&quot;&gt;
&lt;div data-youtube=&quot;YbEQ7acb0IE&quot; data-title=&quot;SiCKO | A Film by Michael Moore&quot; class=&quot;flex items-center justify-center border border-rule bg-panel&quot; style=&quot;aspect-ratio: 4 / 3&quot;&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=YbEQ7acb0IE&quot; class=&quot;flex min-h-11 items-center gap-[1ch] px-4 no-underline&quot;&gt;&lt;span class=&quot;text-accent&quot; aria-hidden=&quot;true&quot;&gt;▶&lt;/span&gt;&lt;span class=&quot;underline decoration-text/40 underline-offset-[3px]&quot;&gt;play: SiCKO | A Film by Michael Moore&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;figcaption class=&quot;text-sm text-dim&quot;&gt;The video is loaded from YouTube (youtube-nocookie.com) only when you press play.&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Big Kahuna</title>
        <published>2007-07-04T18:05:00+03:00</published>
        <updated>2007-07-04T18:05:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/big-kahuna/"/>
        <id>https://mikael.io/posts/2007/07/big-kahuna/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/big-kahuna/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.amazon.co.uk/Big-Kahuna-Kevin-Spacey/dp/B0009F68BG&quot;&gt;&lt;img src=&quot;http://ec1.images-amazon.com/images/I/519G5WGWSHL._AA240_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.imdb.com/name/nm0000228/&quot;&gt;Larry Mann&lt;/a&gt;&lt;/strong&gt;: There are people in this world, Bob, who look
very official while they are doing what they are doing. And do you know why?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.imdb.com/name/nm0004906/&quot;&gt;Bob Walker&lt;/a&gt;&lt;/strong&gt;: Why?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.imdb.com/name/nm0000228/&quot;&gt;Larry Mann&lt;/a&gt;&lt;/strong&gt;: Because they don&#39;t know what they are doing. Because if
you know what you are doing, then you don&#39;t have to look like you know what
you are doing, because it comes naturally.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.imdb.com/name/nm0000362/&quot;&gt;Phil Cooper&lt;/a&gt;&lt;/strong&gt;: I&#39;m saying you&#39;ve already done plenty of things to
regret, you just don&#39;t know what they are. It&#39;s when you discover them, when
you see the folly in something you&#39;ve done, and you wish that you had it do
over, but you know you can&#39;t, because it&#39;s too late. So you pick that thing
up, and carry it with you to remind you that life goes on, the world will spin
without you, you really don&#39;t matter in the end. Then you will gain character,
because honesty will reach out from inside and tattoo itself across your face.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.imdb.com/name/nm0000362/&quot;&gt;Phil Cooper&lt;/a&gt;&lt;/strong&gt;: It doesn&#39;t matter whether you&#39;re selling Jesus or Buddha
or civil rights or &#39;How to Make Money in Real Estate With No Money Down.&#39; That
doesn&#39;t make you a human being; it makes you a marketing rep. If you want to
talk to somebody honestly, as a human being, ask him about his kids. Find out
what his dreams are - just to find out, for no other reason. Because as soon
as you lay your hands on a conversation to steer it, it&#39;s not a conversation
anymore; it&#39;s a pitch. And you&#39;re not a human being; you&#39;re a marketing rep.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Java EE 6 on its way</title>
        <published>2007-07-04T02:12:00+03:00</published>
        <updated>2007-07-04T02:12:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/07/java-ee-6-on-its-way/"/>
        <id>https://mikael.io/posts/2007/07/java-ee-6-on-its-way/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/07/java-ee-6-on-its-way/">&lt;p&gt;Rod Johnson &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blog.interface21.com/main/2007/07/03/java-ee-6-gets-it-right/&quot;&gt;highlights&lt;/a&gt; some of the more prominent features in the newly
published, revised Java EE 6 proposal.&lt;/p&gt;
&lt;p&gt;I would be happy, I would be extatic, if only Java EE 6 would standardize the
high availability characteristics of application servers and applications.
We&#39;ll see in 2008.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Cameron Purdy at Google, explaining Tangosol Coherence</title>
        <published>2007-06-30T14:33:00+03:00</published>
        <updated>2007-06-30T14:33:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/cameron-purdy-at-google-explaining/"/>
        <id>https://mikael.io/posts/2007/06/cameron-purdy-at-google-explaining/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/cameron-purdy-at-google-explaining/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://video.google.com/googleplayer.swf?docId=7254718570171090852&amp;hl=en&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Memo to self: When re-installing Oracle XE, remember...</title>
        <published>2007-06-29T23:50:00+03:00</published>
        <updated>2007-06-29T23:50:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/memo-to-self-when-re-installing-oracle/"/>
        <id>https://mikael.io/posts/2007/06/memo-to-self-when-re-installing-oracle/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/memo-to-self-when-re-installing-oracle/">&lt;p&gt;&lt;code&gt;/etc/sysconfig/oracle-xe&lt;/code&gt;:
ORACLE_DBENABLED=true&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/oratab&lt;/code&gt;:
XE:/usr/lib/oracle/xe/app/oracle/product/10.2.0/server:Y&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Latency in MMOGs</title>
        <published>2007-06-28T16:01:00+03:00</published>
        <updated>2007-06-28T16:01:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/latency-in-mmogs/"/>
        <id>https://mikael.io/posts/2007/06/latency-in-mmogs/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/latency-in-mmogs/">&lt;p&gt;This is a reprint of my message on an another forum.&lt;/p&gt;
&lt;p&gt;&quot;Ping&quot; has, in the MMOG context, two meanings. The operating system ping
command sends and receives ICMP echo packets, while the MMOG might just send
an ACK command through a pre-existing TCP stream. When you ICMP echo ping
someone, the response you get comes from the operating system network stack.
When you pseudo-ping a MMOG server over TCP, you have to wait until the server
goes through the TCP streams it&#39;s receiving, handles the ACK message, and
queues a response on the TCP stream. These two pings have obviously very
different characteristics. I&#39;ll disregard the UDP and hybrid UDP/TCP options
here, because their characteristics aren&#39;t too dissimilar from TCP when we&#39;re
talking about the difference of ICMP ping and app level ping. Only ICMP pings
can be compared across board, different games give completely different
application level ping results.&lt;/p&gt;
&lt;p&gt;In a MMOG, you need to create a virtual environment by keeping track of these
things on the server side: player location, map characteristics (which impede
the player&#39;s movement,) AI-controlled mob locations, player-placed process
marker locations (piles, projects, harvesters), event trap locations (portals,
traps) and so forth. When the player&#39;s client sends requests for, say,
movement, we need to make sure that the movement isn&#39;t impeded by the map, by
a dynamic item on the map, by a flag (dead) or a dynamic process (getting
tired.) All of the things I mentioned take up memory space on the server.&lt;/p&gt;
&lt;p&gt;When we make the decision to grant a player&#39;s request for movement, we need to
consider the factors I mentioned, but since considering a factor takes a
certain number of nanoseconds, we generally try to only consider those factors
which can be easily estimated to be relevant. For example, we can be pretty
sure that we don&#39;t have to care what someone is doing in city A when we&#39;re
considering the movements of people in city B. The tricky part about this is
we don&#39;t want the time that is taken by these calculations to grow either in a
linear or exponential fashion when the number of players and items active grow
when new players buy the game and log in.&lt;/p&gt;
&lt;p&gt;The reason you hear about how MMOG operators buy gajillion servers to run
their games is because of the three nasty units which haunt the nightmares of
programmers everywhere: milliseconds, microseconds and nanoseconds.&lt;/p&gt;
&lt;p&gt;1 second = 1 000 milliseconds = 1 000 000 microseconds = 1 000 000 000
nanoseconds.&lt;/p&gt;
&lt;p&gt;It takes about 5 milliseconds to read data from an internal 10KRPM SCSI disk
to RAM, and about 50 nanoseconds to read data from RAM.&lt;/p&gt;
&lt;p&gt;If a player action causes you to read stuff from the disk, that player action
has just taken as much time as 100,000 player actions which only touch the RAM
would have taken. Ideally, you&#39;d like to run all of your simulations with just
the commands and data which can fit into the processor cache, but people
rarely manage that. The UltraSparc T2 line looks interesting from a MMOG
latency perspective, though.&lt;/p&gt;
&lt;p&gt;So, let&#39;s get back on track: when you&#39;re making the decision on whether to
grant or deny a player&#39;s movement request, you only want to consider the
minimum amount of factors and you want to be able to locate all of the factors
in main memory. Developers have created many different ways to ease the task
of deciding which facts you want to account for and how to locate those facts.
The most common of these is breaking the virtual environment up to cells and
storing pointers to all facts in that cell in a easily accessible manner. Then
you just make sure you handle the event where people leave cells and join
neighboring cells. Another way is to have two layers of cells, the static ones
I just mentioned and dynamic ones to accomodate, say, a larger battle. In
reality, things are much more complicated than this, but I don&#39;t have time to
go into more detail.&lt;/p&gt;
&lt;p&gt;In any case, from what I have read, it looks like the XXX developers were, for
whatever reason, and I&#39;m not judging them here, unable to realistically test
their decision-making trees with simulated traffic before launch. At this
point, they must be refining their algorithms and considering, for example,
whether their hardware architecture would handle some of the FP math better
through integer math simulations. I&#39;m just guessing here, of course.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Apachefest</title>
        <published>2007-06-24T14:23:00+03:00</published>
        <updated>2007-06-24T14:23:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/apachefest/"/>
        <id>https://mikael.io/posts/2007/06/apachefest/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/apachefest/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://openjpa.apache.org/&quot;&gt;Apache OpenJPA&lt;/a&gt; graduated, &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://activemq.apache.org/&quot;&gt;Apache ActiveMQ&lt;/a&gt; is out, and &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://activemq.apache.org/camel/&quot;&gt;Apache Camel&lt;/a&gt; looks interesting as well.&lt;/p&gt;
&lt;p&gt;Maybe during the summer I&#39;ll have the time to put ActiveMQ through a little stress test.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Robert McNamara: The Fog Of War</title>
        <published>2007-06-20T00:29:00+03:00</published>
        <updated>2007-06-20T00:29:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/errol-morris-fog-of-war/"/>
        <id>https://mikael.io/posts/2007/06/errol-morris-fog-of-war/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/errol-morris-fog-of-war/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.amazon.co.uk/Fog-War-Robert-McNamara/dp/B0002849HA&quot;&gt;&lt;img src=&quot;http://ec1.images-amazon.com/images/I/51G0JHDNFKL._AA240_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>HBR: Moments of Truth</title>
        <published>2007-06-19T17:47:00+03:00</published>
        <updated>2007-06-19T17:47:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/hbr-moments-of-truth/"/>
        <id>https://mikael.io/posts/2007/06/hbr-moments-of-truth/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/hbr-moments-of-truth/">&lt;p&gt;I use my subscription to HBR strictly as bathroom reading material. This
injects a dose of much-needed humility to it.&lt;/p&gt;
&lt;p&gt;The articles are often interesting, but the topic is seldom presented from the
European point of view, never mind from the Scandinavian point of view. The
Nokia articles are formulaic, and I suppose to the triumph of the Nokia PR
department, I never feel that I have any kind of an emotional bond to the
issues or people.&lt;/p&gt;
&lt;p&gt;Imagine my surprise when in the very first article of an issue, Olli-Pekka
Kallasvuo shows a kind of an &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://harvardbusinessonline.hbsp.harvard.edu/hbsp/hbr/articles/article.jsp?ml_action=get-article&amp;amp;articleID=R0701A&quot;&gt;insight into the Finnish culture&lt;/a&gt;. The
contrast to the next part of the article, written by the American CEO of the
private defense industry company Blackwater, couldn&#39;t be starker.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A Content-Type patch for Tim Kay&#39;s AWS Perl tool</title>
        <published>2007-06-19T13:35:00+03:00</published>
        <updated>2007-06-19T13:35:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/content-type-patch-for-tim-kays-aws/"/>
        <id>https://mikael.io/posts/2007/06/content-type-patch-for-tim-kays-aws/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/content-type-patch-for-tim-kays-aws/">&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #FFFFFF); background-color: light-dark(#FFFFFF, #101010);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--- /home/mikael/bin/aws.orig   2007-06-10 02:45:37.000000000 +0300&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++ /home/mikael/bin/aws        2007-07-10 04:12:31.000000000 +0300&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@@ -500,7 +500,10 @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-    my $data = &amp;quot;$verb\n\n\n$expires\n/$name&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+    my($content_type) = `file -bi &amp;quot;$file&amp;quot;` if $isPUTobj;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+    chomp($content_type) if $isPUTobj;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+    my $data = &amp;quot;$verb\n\n$content_type\n$expires\n/$name&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     my($sig, $awskey) = sign($data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     my $url = &amp;quot;https://s3.amazonaws.com/$name?AWSAccessKeyId=@{[encode_url($awskey)]}&amp;amp;Expires=$expires&amp;amp;Signature=@{[encode_url($sig)]}&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@@ -508,6 +511,8 @@&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     $content = &amp;quot;--upload-file @{[cq($file)]}&amp;quot; if $isPUTobj;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     $content = &amp;quot;--output @{[cq($file)]}&amp;quot; if $verb eq GET &amp;amp;&amp;amp; $file;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+    $content .= &amp;quot; --header &amp;#39;Content-Type: $content_type&amp;#39; &amp;quot; if $content_type;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     my $content_length = &amp;quot;--header &amp;#39;Content-Length: $length&amp;#39;&amp;quot; if $length;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     if ($isGETobj)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Update: and here&#39;s the patch for a slightly more recent version.
--- aws.tim     2007-08-19 23:03:08.000000000 +0300
+++ aws.gumi2   2007-09-01 17:32:42.000000000 +0300
@@ -517,13 +517,16 @@
}
my $header = join(&quot;\n&quot;, map {s/^(.&lt;em&gt;?):\s&lt;/em&gt;/\L$1:/s; $_} @header) . &quot;\n&quot; if @header;
-    my $data = &quot;$verb\n\n\n$expires\n$header/$name&quot;;
+    my($content_type) = $isPUTobj ? &lt;code&gt;file -bi &quot;$file&quot;&lt;/code&gt; : &quot;&quot;;
+    chomp($content_type) if $content_type;
+    my $data = &quot;$verb\n\n$content_type\n$expires\n$header/$name&quot;;
my($sig, $awskey) = sign($data);
my $url = &quot;https://s3.amazonaws.com/$name?AWSAccessKeyId=@{[encode_url($awskey)]}&amp;amp;Expires=$expires&amp;amp;Signature=@{[encode_url($sig)]}&quot;;
my($content);
$content = &quot;--upload-file @{[cq($file)]}&quot; if $isPUTobj;
$content = &quot;--output @{[cq($file)]}&quot; if $verb eq GET &amp;amp;&amp;amp; $file;
+    $content .= &quot; --header &#39;Content-Type: $content_type&#39; &quot; if $content_type;
my $content_length = &quot;--header &#39;Content-Length: $length&#39;&quot; if $length;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>JavaOne: Enterprise Javabeans 3.1 Technology</title>
        <published>2007-06-18T12:43:00+03:00</published>
        <updated>2007-06-18T12:43:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/javaone-enterprise-javabeans-31/"/>
        <id>https://mikael.io/posts/2007/06/javaone-enterprise-javabeans-31/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/javaone-enterprise-javabeans-31/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://sessions.sun.com/learning/javaoneonline/sessions/2007/TS-4247/index.html&quot;&gt;http://sessions.sun.com/learning/javaoneonline/sessions/2007/TS-4247/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Too bad Sun didn&#39;t just make these generally available. Now you have to
register to their SDN and I can&#39;t embed the presentation here, without any
hoops to jump through.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mikä on ohjelmistotuotteen arvo, ja miten arvoa voidaan kasvattaa?</title>
        <published>2007-06-15T13:13:00+03:00</published>
        <updated>2007-06-15T13:13:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/mik-on-ohjelmistotuotteen-arvo-ja-miten/"/>
        <id>https://mikael.io/posts/2007/06/mik-on-ohjelmistotuotteen-arvo-ja-miten/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/mik-on-ohjelmistotuotteen-arvo-ja-miten/">&lt;p&gt;Ohjelmiston käyttöpäivän vaikutus yhteisön missioon on arvon perusyksikkö.
Ohjelmiston &lt;em&gt;käyttöikä ilman muutoksia&lt;/em&gt; muodostaa tulevaisuuden arvon
perusosan. _Tavoitekäyttöikä _potenssiin sen helppous, että ohjelmiston koodi
saadaan &lt;em&gt;taivutettua tulevaisuuden tarpeisiin&lt;/em&gt;, muodostaa suurimman osan
ohjelmiston arvosta, sillä ilman muutoksia käyttöpäivän arvo organisaation
missiolle pienenee sitä mukaa kun maailma muuttuu organisaation ympäriltä.&lt;/p&gt;
&lt;p&gt;Ohjelmiston koodi muodostuu suuresta joukosta abstrakteja konsepteja jotka on
konkretisoitu paperille matemaattisen kaavan muotoon. Toisin kuin fysiikassa
ja matematiikassa, ohjelmistokehityksessä käsiteltävät abstraktit konseptit
ovat kuitenkin hyvin läheisessä suhteessa ihmisten ajatuksiin ja tulkintoihin,
joiden suhteiden toisiinsa odotetaan muuttuvan, eikä tulkintojen &quot;oikeutta&quot;
voida mitata itsenäisesti.&lt;/p&gt;
&lt;p&gt;Viime vuosikymmeninä tietokoneiden teho oli suurin haaste.
Ohjelmistokehittäjät keskittyivät muokkaamaan ongelman muotoon, jossa
tietokone pystyi kaikkine rajoituksineen ymmärtämään ja käsittelemään sen.
Nykypäivänä tietokoneet ovat niin paljon nopeampia, että ollaan edetty paljon
vaikeamman ongelman ratkaisemiseen: kuinka voidaan rakentaa laajempia
ohjelmistoja, sekä niin että ne voivat tehdä enemmän että niin että niiden
ylläpitoikä on pidempi. Sen sijaan, että ongelma pitää selittää tietokoneelle,
se pitää pukea sellaiseen muotoon että sekä tietokone että toiset ihmiset
ymmärtävät sen samanaikaisesti.&lt;/p&gt;
&lt;p&gt;Jotkut ovat kokeilleet sitä, että ylläpidetään samaan aikaan erillistä
ongelmakuvausta tietokoneelle, ja erillistä ihmisille, mutta se ei ole vielä
toiminut, sillä kuvaukset väistämättä poikkeavat toisistaan oleellisesti.
Kohtuullisesti toimivassa nykymallissa itse kuvaus siitä mitä tehdään jaetaan
tietokoneen ja ihmisen välillä, mutta ihmisille kirjoitetaan väliin lyhyitä
kommentteja siitä, miksi ongelma ratkaistaan niin, ja mikä ratkaisun laajempi
merkitys on.&lt;/p&gt;
&lt;p&gt;Ohjelmiston koodi saadaan taivutettua tulevaisuuden tarpeisiin sitä paremmin,
mitä enemmän sen rakennukseen valittu tapa abstrahoida ongelma muistuttaa
tulevaisuuden tulkintoja. Käytännössä menestyneet tavat abstrahoida kokonaisia
ongelmia ovat keskittyneet siihen, että kokonainen ongelma jaetaan sellaisiin
palasiin, jotka muodostuvat alakäsitteistä jotka muuttuvat samassa prosessissa
tai saman yhteisön sisällä tapahtuvien muutosten muovaamina.&lt;/p&gt;
&lt;p&gt;Esimerkiksi monien ohjelmistojen pitää käsitellä raha-asioita. Valuutat,
tilitapahtumat ja valuuttasummat voivat tällöin muodostaa oman yksikkönsä.
Tällöin, kun Suomi siirtyy Euroon, voidaan olla aika varmoja siitä, että
sovelluksen muuntamiseen vaadittu työmäärä voidaan selvittää tutkimalla
pelkästään tätä yksikköä, eikä koko sovellusta tarvitse käydä läpi. Raha-asiat
ovat kuitenkin varsin helppo esimerkki, sillä useimmat käsitteet eivät ole
käytössä yhtä laajalti ja yksiselitteisesti kuin raha ja vaihdannan välineet.
Useimmat konseptit ovat vähemmän mietittyjä ja niistä on eri ihmisten ja
organisaatioiden välillä eri tulkintoja.&lt;/p&gt;
&lt;p&gt;Lomakkeet joissa on tekstikenttiä ovat tyypillinen tapa hallita ihmisten
toiminnan tuottamaa tietoa, jonka hallinnassa pitää olla tarkkana. Sovelluksen
ratkaisemasta ongelmasta riippumattomien yleisten haasteiden selvittäminen
itse ei ole enää kovinkaan usein tarpeen, vaan löytyy valmiita runkoja
(framework) jotka muotoilevat ongelman ja tarjoavat siihen kokonaisratkaisun
tavalla, joka jättää auki mahdollisuuden luoda itse esimerkiksi
ilmaisukykyisempiä sovelluskohtaisia kenttiä lomakkeeseen.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Energy efficient computer labs and how IT can work to remove roadblocks</title>
        <published>2007-06-13T03:01:00+03:00</published>
        <updated>2007-06-13T03:01:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/energy-efficient-computer-labs-and-how/"/>
        <id>https://mikael.io/posts/2007/06/energy-efficient-computer-labs-and-how/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/energy-efficient-computer-labs-and-how/">&lt;p&gt;Via &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blogs.sun.com/enviro/entry/the_economics_of_energy_efficiency&quot;&gt;DD&#39;s Eco Notes&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://economist.co.uk/images/20070602/CSU971.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve been contemplating for a while how well a more energy efficient computer
lab solution would fit our customers&#39; needs.&lt;/p&gt;
&lt;p&gt;Let&#39;s face it: off-the-shelf computers are becoming much more powerful than
necessary. Five or ten customers could well share a single modern computer,
since most of the time computers just sit idle, eating electricity and waiting
for you to press a key.&lt;/p&gt;
&lt;p&gt;We&#39;d just need a off-the-shelf solution to achieve this, since developing such
a solution from scratch would eat away its savings, and more.&lt;/p&gt;
&lt;p&gt;The solution I&#39;ve been concentrating on is the &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.sun.com/sunray/&quot;&gt;Sun Ray&lt;/a&gt; technology from
Sun Microsystems.&lt;/p&gt;
&lt;p&gt;You replace your &lt;img src=&quot;http://www.sun.com/desktop/images/I1_ultra40_g.jpg&quot; alt=&quot;&quot; /&gt; with a &lt;img src=&quot;http://sunsolve.sun.com/handbook_pub/Systems/SunRay2FS/images/SunRay2FS.jpg&quot; alt=&quot;&quot; /&gt;.&lt;/p&gt;
&lt;p&gt;The Sun Ray client connects to your monitor, mouse, USB and Ethernet, and lets
you run 10 lab desktop sessions on one computer. It&#39;s stateless, all the
processing happens on the other end. If the Sun Ray desktop client breaks, you
just replace it, and you&#39;re back up and running where you were before the
break.&lt;/p&gt;
&lt;p&gt;The software that runs on the computer that powers the 10 desktop sessions is
in the process of being open sourced. It runs on Windows, Linux and Solaris.&lt;/p&gt;
&lt;p&gt;For security, you can have most of the applications that are delivered to the
Sun Ray client and on the user&#39;s screen run on Windows, but some of the
security sensitive applications like the web browser or email, can actually
run on a Linux or Solaris computer.&lt;/p&gt;
&lt;p&gt;To take the idea further, this makes it possible for a department to set up
(or rent) machines to run a certain application just for their users, without
it affecting the whole IT setup like business units delivering specific
applications directly would today. If they start to use the application more,
and it slows down, the department can very easily just have more machines run
the application, and spread the load.&lt;/p&gt;
&lt;p&gt;This way departments can dynamically scale their investment, if some
application feels more or less important at some point of time, or there is a
budget crunch.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Absolutely ... not!</title>
        <published>2007-06-13T00:51:00+03:00</published>
        <updated>2007-06-13T00:51:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/absolutely-not/"/>
        <id>https://mikael.io/posts/2007/06/absolutely-not/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/absolutely-not/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.namesatwork.com/blog/2007/06/04/talking-to-techies-culture-clash/&quot;&gt;http://www.namesatwork.com/blog/2007/06/04/talking-to-techies-culture-clash/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&quot;I’m working on a glossary to help people translate aspirational tech-talk
into real-world expectations, but here’s the transcript of an IM conversation
with a sterling example of the tech tribe, whom I dearly love.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AVC - (presenting plan and budget) Can you do this?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AB - Absolutely&lt;/p&gt;
&lt;p&gt;AVC - Can you get it done by the due date?&lt;/p&gt;
&lt;p&gt;AB - Yep&lt;/p&gt;
&lt;p&gt;AVC - Can we get it done using this budget?&lt;/p&gt;
&lt;p&gt;AB - Yes, could do&lt;/p&gt;
&lt;p&gt;AVC - Can you get it done in this time &lt;em&gt;and&lt;/em&gt; with this budget&lt;/p&gt;
&lt;p&gt;AB - If you can get someone to work for free&lt;/p&gt;
&lt;p&gt;AVC - So you can’t do this by yourself?&lt;/p&gt;
&lt;p&gt;AB - Yes, I can&lt;/p&gt;
&lt;p&gt;AVC - But not by the due date…&lt;/p&gt;
&lt;p&gt;AB - I could…&lt;/p&gt;
&lt;p&gt;AVC - But not with the other stuff you’re doing?&lt;/p&gt;
&lt;p&gt;AB - Yes&lt;/p&gt;
&lt;p&gt;AVC - Meaning no, you can’t get it done and do your other work too….&lt;/p&gt;
&lt;p&gt;AB - Not without help&lt;/p&gt;
&lt;p&gt;AVC - Which costs money&lt;/p&gt;
&lt;p&gt;AB - Normally&lt;/p&gt;
&lt;p&gt;AVC - So this current plan of you doing this by yourself by this date and with
this budget won’t work&lt;/p&gt;
&lt;p&gt;AB - Not without divine intervention&lt;/p&gt;
&lt;p&gt;AVC - So when you said “absolutely”, you meant “absolutely not”?&lt;/p&gt;
&lt;p&gt;AB - Absolutely&quot;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>&quot;Checking Java Programs&quot; and &quot;Facelets&quot;</title>
        <published>2007-06-12T18:19:00+03:00</published>
        <updated>2007-06-12T18:19:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/checking-java-programs-and-facelets/"/>
        <id>https://mikael.io/posts/2007/06/checking-java-programs-and-facelets/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/checking-java-programs-and-facelets/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://safari.oreilly.com/9780596510237&quot;&gt;&lt;img src=&quot;http://safari.oreilly.com/images/9780596510237/9780596510237_xs.gif&quot; alt=&quot;Checking Java Programs&quot; title=&quot;Checking Java Programs&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://safari.oreilly.com/9780596529246&quot;&gt;&lt;img src=&quot;http://safari.oreilly.com/images/9780596529246/9780596529246_xs.gif&quot; alt=&quot;Facelets&quot; title=&quot;Facelets&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Advanced Topics in Programming Languages: The Java Memory Model</title>
        <published>2007-06-11T17:39:00+03:00</published>
        <updated>2007-06-11T17:39:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/advanced-topics-in-programming/"/>
        <id>https://mikael.io/posts/2007/06/advanced-topics-in-programming/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/advanced-topics-in-programming/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.cs.umd.edu/~pugh/java/memoryModel/&quot;&gt;http://www.cs.umd.edu/~pugh/java/memoryModel/&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Stephen Fry - The Internet</title>
        <published>2007-06-10T19:38:00+03:00</published>
        <updated>2007-06-10T19:38:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/stephen-fry-internet/"/>
        <id>https://mikael.io/posts/2007/06/stephen-fry-internet/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/stephen-fry-internet/">&lt;figure class=&quot;flex flex-col gap-3 border border-dashed border-rule p-4&quot; lang=&quot;en&quot;&gt;
&lt;figcaption class=&quot;flex flex-col gap-1&quot;&gt;
&lt;span class=&quot;text-accent&quot;&gt;// archived embed&lt;/span&gt;
&lt;span&gt;This was a Flash video embed. Flash is gone, so the player is too.&lt;/span&gt;
&lt;/figcaption&gt;
&lt;code class=&quot;break-all text-xs text-faint&quot;&gt;http://www.videojug.com/player?type=interview&amp;id=d7955f3e-66db-12be-209b-ff0008c9724d&lt;/code&gt;
&lt;/figure&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Douglas Crockford — &quot;Quality&quot;</title>
        <published>2007-06-10T01:22:00+03:00</published>
        <updated>2007-06-10T01:22:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/douglas-crockford-quality/"/>
        <id>https://mikael.io/posts/2007/06/douglas-crockford-quality/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/douglas-crockford-quality/">&lt;p&gt;Erittäin hyvä kuvaus ohjelmistotyön laadun konkretiasta.&lt;/p&gt;
&lt;p&gt;Douglas Crockford onnistuu kuvaamaan asian tavalla, joka sopii sekä
asiakkaille, projektipäälliköille että ohjelmistokehittäjille.&lt;/p&gt;
&lt;p&gt;iPod/MP4: &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://us.dl1.yimg.com/download.yahoo.com/dl/ydn/yui/theater/crockford-quality.m4v&quot;&gt;http://us.dl1.yimg.com/download.yahoo.com/dl/ydn/yui/theater/crockford-quality.m4v&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>LVM ehdottaa postisalaisuuden luovuttamista Nokialle</title>
        <published>2007-06-06T14:20:00+03:00</published>
        <updated>2007-06-06T14:20:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/lvm-ehdottaa-postisalaisuuden/"/>
        <id>https://mikael.io/posts/2007/06/lvm-ehdottaa-postisalaisuuden/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/lvm-ehdottaa-postisalaisuuden/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://dfasuomi.stakes.fi/EN/dfa2006/rovaniemi/speakers/liisaero.htm&quot;&gt;Liisa Ero&lt;/a&gt; (puheenjohtaja, ylijohtaja, Liikenne- ja viestintäministeriö)&lt;/p&gt;
&lt;p&gt;Anna-Riitta Wallin (lainsäädäntöneuvos, ylijohtaja, Oikeusministeriö)&lt;/p&gt;
&lt;p&gt;Kimmo Hakonen (lainsäädäntöneuvos, poliisijohtaja, Sisäministeriö)&lt;/p&gt;
&lt;p&gt;Raila Kangasperko (hallitusneuvos, Työministeriö)&lt;/p&gt;
&lt;p&gt;Mikael Kiviniemi (neuvotteleva virkamies, VAHTIn puheenjohtaja,
Valtiovarainministeriö)&lt;/p&gt;
&lt;p&gt;Timo Koskinen (lakimies, SAK)&lt;/p&gt;
&lt;p&gt;Pauliina Juntunen (lakimies, STTK)&lt;/p&gt;
&lt;p&gt;Paula Ilveskivi (lakimies, Akava)&lt;/p&gt;
&lt;p&gt;Mikko Nyyssölä (asiantuntija, Elinkeinoelämän keskusliitto)&lt;/p&gt;
&lt;p&gt;Juhapekka Ristola (viestintäneuvos, Liikenne- ja viestintäministeriö)&lt;/p&gt;
&lt;p&gt;Jussi Mäkinen (neuvotteleva virkamies, Liikenne- ja viestintäministeriö)&lt;/p&gt;
&lt;p&gt;http://www.mintc.fi/oliver/upl758-LVM29_2007.pdf&lt;/p&gt;
&lt;p&gt;Analyysia työpäivän jälkeen, mutta maistiaiseksi...&lt;/p&gt;
&lt;p&gt;1.5 Keskeiset ehdotukset&lt;/p&gt;
&lt;p&gt;Esityksessä ehdotetaan muutoksia sähköisen viestinnän tietosuojalakiin.
Ehdotuksella esitetään laajennettavaksi yhteisötilaajien oikeuksia käsitellä
tunnistamistietoja väärinkäytöstilanteissa.&lt;/p&gt;
&lt;p&gt;Sääntelyä ehdotetaan muutettavaksi siten, että yhteisötilaajalla olisi tietyin
edellytyksin oikeus käsitellä sähköisen viestinnän tunnistamistietoja
viestintäverkkonsa tai palvelunsa sekä maksullisten tietoyhteiskunnan
palvelujen luvattoman käytön ja käytöstä aiheutuvien kustannusten sekä
yrityssalaisuuden oikeudettoman paljastamisen selvittämiseksi.&lt;/p&gt;
&lt;p&gt;Ehdotettu tunnistamistietojen käsittelyoikeus liittyy yhteisötilaajien
viestintäverkkojen ja viestintäpalvelujen käytön turvaamiseen ja
viestintäverkon kautta tapahtuneen elinkeinotoiminnan kannalta keskeisen
yrityssalaisuuden paljastamisen selvittämiseen.&lt;/p&gt;
&lt;p&gt;Ehdotetun sääntelyn mukaan ensisijaisena keinona viestintäverkon ja
viestintäpalvelun käytön asianmukaisuuden turvaamisessa olisi verkkojen ja
palvelujen käyttäjille annetut ohjeet ja niiden noudattamisen automaattisesti
tapahtuva seuranta.&lt;/p&gt;
&lt;p&gt;Sääntelyssä edellytettäisiin, että verkon ja palveluiden suunniteltu käyttö
sekä yrityssalaisuuksien suoja on järjestetty asianmukaisin tietoturva- ja
käyttäjähallintotoimenpitein.&lt;/p&gt;
&lt;p&gt;Ehdotetut tunnistamistietojen käsittelyoikeudet eivät oikeuttaisi
yhteisötilaajia saamaan tietoa viestien sisällöistä.&lt;/p&gt;
&lt;p&gt;Tunnistamistietojen käsittelyllä yhteisötilaaja ei saisi selville muiden kuin
omien viestintäpalveluidensa kautta lähetettyjen ja vastaanotettujen viestien
tunnistamistiedot.&lt;/p&gt;
&lt;p&gt;Kaupallisesti tarjolla olevien sähköposti-, verkkopankki- tai muiden
teknisesti suojattujen palveluiden käytöstä tunnistamistiedot paljastaisivat
vain palvelun käytön ajankohdan ja keston.&lt;/p&gt;
&lt;p&gt;Työnantaja-asemassa olevan yhteisötilaajan tulisi ottaa tunnistamistietojen
käsittelyyn liittyvät asiat yhteistoimintamenettelyssä käsiteltäviksi ja
tiedottaa niistä työntekijöille.&lt;/p&gt;
&lt;p&gt;Ehdotettujen muutosten mahdollistamaa tunnistamistietojen käsittelyä valvoisi
tietosuojavaltuutettu.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Another exhausting yet exhilarating day!</title>
        <published>2007-06-05T02:50:00+03:00</published>
        <updated>2007-06-05T02:50:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/06/another-exhausting-yet-exhilarating-day/"/>
        <id>https://mikael.io/posts/2007/06/another-exhausting-yet-exhilarating-day/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/06/another-exhausting-yet-exhilarating-day/">&lt;p&gt;These kinds of days are where the fun is, when you can&#39;t really know how the
day will end, but there is a chance to make something happen and get something
built if you work real hard.&lt;/p&gt;
&lt;p&gt;A &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.youtube.com/watch?v=7TkzLnUNeVo&quot;&gt;West Wing&lt;/a&gt; day!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>UTF-8 käyttöön kaikkialle!</title>
        <published>2007-05-31T02:59:00+03:00</published>
        <updated>2007-05-31T02:59:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/05/utf-8-kyttn-kaikkialle/"/>
        <id>https://mikael.io/posts/2007/05/utf-8-kyttn-kaikkialle/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/05/utf-8-kyttn-kaikkialle/">&lt;p&gt;Olen nähnyt tapeltavan merkistöjen kanssa lähes jokaisessa projektissa johon
olen osallistunut.&lt;/p&gt;
&lt;p&gt;Harras pyyntö: käyttäkää UTF-8:aa ihan kaikkialla mihin se on mahdollista
tunkea, käyttöjärjestelmän vakioasetuksista sovelluskehitykseen! Yksikin
rikkinäinen lenkki ketjussa aiheuttaa kaikille harmaita hiuksia!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>OPM julkaisi yliopistojen opintohallinnon tietojärjestelmäselvityksen!</title>
        <published>2007-05-31T02:56:00+03:00</published>
        <updated>2007-05-31T02:56:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/05/opm-julkaisi-yliopistojen/"/>
        <id>https://mikael.io/posts/2007/05/opm-julkaisi-yliopistojen/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/05/opm-julkaisi-yliopistojen/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.minedu.fi/OPM/Julkaisut/2007/Yliopistojen_opintohallinnon_tietojxrjestelmxselvitys_.html?lang=fi&quot;&gt;http://www.minedu.fi/OPM/Julkaisut/2007/Yliopistojen_opintohallinnon_tietojxrjestelmxselvitys_.html?lang=fi&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My five Oracle wishes</title>
        <published>2007-05-30T01:21:00+03:00</published>
        <updated>2007-05-30T01:21:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/05/my-five-oracle-wishes/"/>
        <id>https://mikael.io/posts/2007/05/my-five-oracle-wishes/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/05/my-five-oracle-wishes/">&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://blogs.oracle.com/duffblog/2007/05/29&quot;&gt;Brian Duff @ Oracle.com challenged us&lt;/a&gt; to amuse ourselves and others by
coming up with 5 wishes for Oracle, even if traditionally wishes are the
purview of Genies.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Come up with a new database product for the next 15 years, designed to
overcome modern limitations. Servers have gigabytes of memory instead of
kilobytes. The game is now about collaboration between people instead of
trying to think like a machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tell your developers unambiguously to stop using PL/SQL for their
applications. Triggers, sure. Applications, please don&#39;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Come up with a support offering of such incredible value that it will
change the way companies hire developers. Push your new database to every
Linux server and desktop on Earth, for free.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get out of the application server and IDE &quot;businesses&quot; and become a huge
actor in existing application server and IDE communities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Roll out standardized quality metrics, and automated quality measurement
tools for every one of your products and platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Amazon S3 ahoy!</title>
        <published>2007-05-26T18:38:00+03:00</published>
        <updated>2007-05-26T18:38:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/05/amazon-s3-ahoy/"/>
        <id>https://mikael.io/posts/2007/05/amazon-s3-ahoy/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/05/amazon-s3-ahoy/">&lt;p&gt;I&#39;ve been looking at Amazon &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://aws.amazon.com/s3&quot;&gt;S3&lt;/a&gt; and &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://aws.amazon.com/ec2&quot;&gt;EC2&lt;/a&gt; for a while now, but haven&#39;t
had a good opportunity to really use them in practise.&lt;/p&gt;
&lt;p&gt;With all the discussion at my work about hosting products, maybe now would be
a good time to see whether S3 really is ready for production use. Fortunately
I&#39;d pre-registered as a Amazon Web Services customer for S3 ahead of time.
It&#39;s easy to become a S3 user, less so for the EC2 service beta at the moment.&lt;/p&gt;
&lt;p&gt;Step 1: add a new subdomain to my personal gueck.com domain using the
easydns.com web tools.&lt;/p&gt;
&lt;p&gt;Step 2: create a Amazon S3 &quot;bucket&quot; for the name static.gueck.com, and upload
a file, using &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://timkay.com/aws/&quot;&gt;Timothy Kay&#39;s aws tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Step 3: set the bucket and file ACLs to allow anonymous browsing, using the
&lt;a rel=&quot;noreferrer external&quot; href=&quot;https://jets3t.dev.java.net/&quot;&gt;JetS3t&lt;/a&gt; Java tool.&lt;/p&gt;
&lt;p&gt;Step 4: &lt;a rel=&quot;noreferrer external&quot; href=&quot;http://static.gueck.com/confluence-migrator.sql&quot;&gt;http://static.gueck.com/confluence-migrator.sql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The only problem now is that the file content-type is binary/octet-stream,
which triggers a download instead of a view in most browsers. Apparently you
have to set the file content-type when you upload it, and it can&#39;t be changed
afterwards, short of deleting and re-uploading it.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Kiinnostavaa työtä näköpiirissä!</title>
        <published>2007-05-22T13:42:00+03:00</published>
        <updated>2007-05-22T13:42:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/05/kiinnostavaa-tyt-nkpiiriss/"/>
        <id>https://mikael.io/posts/2007/05/kiinnostavaa-tyt-nkpiiriss/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/05/kiinnostavaa-tyt-nkpiiriss/">&lt;p&gt;Firman coren kontrollointiohjelmistojen eteen tehtävä työ tuntuu
mielenkiintoiselta ja hyödylliseltä, ja siksi olen ollut erityisen innostunut
kahdesta potentiaalisesta casesta, jossa toisessa tehtäisiin ohjelmiston
arkkitehtuurikonsultointia, ja toisessa toisen ohjelmiston laatuauditointia
sen laajentuneiden tavoitteiden saavuttamiseksi.&lt;/p&gt;
&lt;p&gt;Toivottavasti kummatkin tulevat meille!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Helsingin Sanomat - Ilmavoimien komentaja: Lentäjille lisää lentotunteja</title>
        <published>2007-05-22T03:33:00+03:00</published>
        <updated>2007-05-22T03:33:00+03:00</updated>
        
        <author>
          <name>Mikael Gueck</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://mikael.io/posts/2007/05/helsingin-sanomat-ilmavoimien-komentaja/"/>
        <id>https://mikael.io/posts/2007/05/helsingin-sanomat-ilmavoimien-komentaja/</id>
        
        <content type="html" xml:base="https://mikael.io/posts/2007/05/helsingin-sanomat-ilmavoimien-komentaja/">&lt;p&gt;Yleensä en ole kiinnostunut keskustelemaan puolustusasioista, mutta tämä
lausunto kommentissa HY:n artikkeliin sai minut ärsytettyä kirjoittamaan
ulkopuolisen analyysin.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer external&quot; href=&quot;http://www.hs.fi/kotimaa/artikkeli/Ilmavoimien+komentaja+Lent%C3%A4jille+lis%C3%A4%C3%A4+lentotunteja/1135227388260&quot;&gt;&lt;em&gt;Jos viisikymmentä konetta ampuu alas viisinkertaisen määrän MiGejä ja
Suhoita kuin kymmenen konetta, hyöty on silloin viisinkertainen.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Isänmaallisuuden yhdistäminen objektiiviseen analyysiin tapattaa vain turhaan
ihmisiä ja heittää kaivoon verovaroja. Puolustusvoimien koko henkilökunta, ja
suurin osa asiasta keskustelevasta yleisöstä, on kulkenut yhden homogenisoivan
koulun läpi, jossa heidän kapasiteettinsa itsekriittisyyteen keskeisten
strategisten kysymysten suhteen on kärsinyt, kenellä enemmän, kenellä
vähemmän.&lt;/p&gt;
&lt;p&gt;Keskeinen strateginen kysymys on, kuinka mahdollisimman monesta
todennäköisestä skenaariosta saadaan tehtyä sellaisia, ettei Suomeen
hyökkääminen osana tai vastauksena niihin ole kenellekään kannattavaa.&lt;/p&gt;
&lt;p&gt;Avainongelma suunnittelun suhteen on se, että skenaariot ja niiden
todennäköisyydet muuttuvat jatkuvasti, ja tiedon keruu eri luokista
skenaarioita maksaa ja sen valmistelu on hidasta. Lisäksi rahoituksen
hankkiminen muuttuviin skenaarioihin vastaamiseksi on vaikeaa, koska
puolustusvoimain korkeimman johdon pitää osallistua työhön, eivätkä he ole
maailman joustavimpia ihmisiä.&lt;/p&gt;
&lt;p&gt;Heidän pitäisi vaikuttaa poliittisiin päättäjiin ja suureen yleisöön, ja saada
nämä emotionaalisella tasolla hyväksymään se, että se mistä puhuttiin
totuutena ja tärkeänä viime viikolla ei olekaan enää totta ja tärkeää, vaan
jokin uusi asia, johon pitäisi nyt saada rahaa, jota ei ole.&lt;/p&gt;
&lt;p&gt;Tehtävän mahdottomuus tekee mahdottoman houkuttelevaksi sen, että otetaan vain
jotain skenaarioita joita on helppo myydä, vaikka tiedetään etteivät ne ole
ihan oikeasti mahdollisia, mutta jotka kuulostavat tutuilta kun muistellaan
mitä tapahtui viime sodassa 60 vuotta sitten. Näiden skenaarioiden perusteella
voidaan sitten hankkia resursseja joita voidaan sitten pienemmässä
mittakaavassa suunnata paikallisesti oikealta tuntuviin asioihin.&lt;/p&gt;
&lt;p&gt;Ongelmana tässä on se, että nämä tehtaillut skenaariot alkavat elää omaa
elämäänsä, eivätkä niiden perusteella saadut resurssit enää ole
kohdennettavissa oikeasti hyödyllisiin asioihin.&lt;/p&gt;
&lt;p&gt;Näin on hävittäjien suhteen tilanteessa, jossa ei ole todennäköistä että 50
hävittäjää tekisi 250 vastustajaan viisinkertaisen vahingon suhteessa 10:n
hävittäjään, siitä yksinkertaisesta syystä että hyökkääjät sanelevat pelin
säännöt, ja tällöin hyökkääjät käyttävät vahvuuksiaan puolustajan heikkouksia
vastaan, jolloin kolme vastustajaa kerrallaan voi keskittyä yhteen omaan,
jolloin on paljon yli kolme kertaa todennäköisempää että kaikki vastustajat
säilyvät vaurioitta ja oma kone tuhoutuu.&lt;/p&gt;
&lt;p&gt;Lisäksi on rehellisesti kysyttävä, vaikuttaako hävittäjämäärän kasvattaminen
kymmenestä viiteenkymmeneen tai viidestäkymmenestä sataan, olennaisesti tällä
hetkellä todennäköisten skenaarioiden suhteen estävästi, jos otetaan huomioon
se, että voimasuhteet vastustajan ja oman tiimin välillä ovat merkittävästi
epäsymmetrisemmät kuin Irakin ja Yhdysvaltain, kummassakin viime Yhdysvaltain
suuroperaatiossa.&lt;/p&gt;
&lt;p&gt;On epärehellistä väittää jollekulle että sellainen skenaario olisi oikeasti
mahdollinen, jossa hyökkääjä asettaisi omat heikkoutensa meidän vahvuuksiamme
vastaan.&lt;/p&gt;
&lt;p&gt;Meidän on kysyttävä itseltämme, mitä voimme oppia Irakin sodasta. Onko meidän
paras mahdollisuutemme kentällä, kuten Irakin aikaisempi johto ajatteli, vai
jossain muussa tavassa puolustaa maata?&lt;/p&gt;
</content>
        
    </entry>
</feed>
