tag:blogger.com,1999:blog-90408354956543181752009-06-08T23:17:47.222+03:00The little island of excitement!Mikael Gueck (gumi@iki.fi) is a <a href="http://en.wikipedia.org/wiki/Free_range">free range</a> software architect in Finland.guminoreply@blogger.comBlogger103125tag:blogger.com,1999:blog-9040835495654318175.post-17782928244879220392009-02-23T17:06:00.005+02:002009-02-23T17:28:42.632+02:00Verkkokaupan koeajo: Gastronautin saittiTä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.<br /><br />Valinta osuu siis Gastronauttiin, ja taidan samalla koeajaa heidän verkkokauppansa.<br /><br />Gastron saitin suunnittelu ja teknologia on pitkään jo tuntunut jonkun veljenpojan etelänmatkaa vastaan suunnittelemalta ja toteuttamalta. Verkkokauppa ei ole poikkeus.<br /><br />Rekisteröityminen ja sisäänkirjautuminen ollaan <a href="http://www.uie.com/articles/three_hund_million_button">onnistuttu sössimään</a> 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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />Yritän lisätä lohkoperunoita side orderina, mutta saitti valittaa "sinun pitää olla kirjautunut".<br /><br />Kirjaudun sisään uudestaan, ja Gastro on kadottanut tilaukseni.<br /><br />Valitsen suunnilleen samat tuotteet, kiireellä klikkaan tilauksen vahvistukseen, ja teen tilauksen. Saitti lupasi tilauksen menneen perille.<br /><br />Nyt odotetaan...<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-1778292824487922039?l=blog.gueck.com'/></div>guminoreply@blogger.com1tag:blogger.com,1999:blog-9040835495654318175.post-36671084946299956122009-02-09T03:40:00.003+02:002009-02-09T03:52:10.131+02:00The restful hypothesisI'm taking every fourth week off, starting now. Nine days of uninterrupted rest.<br /><br />Why? I've been working fairly actively for the last 15 years. I've learned some things about myself and my field.<br /><br />Projects tend to become hectic. Workplaces become demanding. There would always be so much more to do but so little time.<br /><br />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 <a href="http://huima.wordpress.com/2009/02/08/best-definition-of-it-governance-it-starts-with-common-sense/">recently wrote about</a> a similar subject.)<br /><br />It's hard to critically evaluate efforts one is personally invested in. Most people simply don't go there. I've only been able to step back after the fact. <br /><br />Postmortems are useful, but not as useful as saving the patient in the first place.<br /><br />That's why I'm taking every third week off from now on. <br /><br />To routinely step back and ask myself whether I'm really invested in accomplishing the right tactical goals.<br /><br />Agile that!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3667108494629995612?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-35266042549287075382009-01-02T02:48:00.002+02:002009-01-02T05:39:57.726+02:00Zend_Cache_Backend_File doesn't work on NFSWe had a bit of a time discovering why our project's Zend Framework-using PHP application wasn'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.<br /><br />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't react at all well to POSIX locks.<br /><br />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's source code for flock, finding only the Zend Cache classes.<br /><br />Don't accidentally put your Zend Cache files on NFS when using Zend_Cache_Backend_File, or your application will hang.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3526604254928707538?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-88921099642376147742008-12-27T21:39:00.005+02:002008-12-27T21:46:44.459+02:00Cool service of the day: Web Sequence Diagrams<a href="http://www.websequencediagrams.com/"><img src="http://www.websequencediagrams.com/cgi-bin/cdraw?lz=QWxpY2UtPkJvYjogQXV0aGVudGljYXRpb24gUmVxdWVzdAoKbm90ZSByaWdodCBvZiAAJgVCb2IgdGhpbmtzIGFib3V0IGl0LgoKQm9iLS0-AE4FADsTc3BvbnNlCgpsb29wIGZvbyBiYXIgYmF6CiAgICAAfAx4eXp6eQplbmQK&s=modern-blue"/></a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-8892109964237614774?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-35150775512709679662008-12-18T23:03:00.005+02:002008-12-18T23:10:27.813+02:00Enforcing strict database DDL upgrade version requirements in PostgresqlWhen delivering a upgrade version of a web-based product, you often wish to provide your clients with database upgrade scripts. <br /><br />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. <br /><br />This is an example of how to achieve this objective using Postgresql.<br /><br /><pre>BEGIN;<br /><br />CREATE FUNCTION require_database_version(IN p_version INT) RETURNS boolean AS $$<br />DECLARE<br /> dv INT;<br />BEGIN<br /> IF p_version IS NULL THEN<br /> RAISE EXCEPTION 'require_database_version called with NULL input';<br /> END IF;<br /> SELECT version INTO STRICT dv FROM database_version;<br /> IF dv <> p_version THEN<br /> RAISE EXCEPTION 'Database version required: %. Found %.', p_version, dv;<br /> END IF;<br /> RETURN true;<br />END;<br />$$ LANGUAGE plpgsql VOLATILE;<br /><br />CREATE FUNCTION set_database_version(IN p_version INT) RETURNS boolean AS $$<br />BEGIN<br /> IF p_version IS NULL THEN<br /> RAISE EXCEPTION 'set_database_version called with NULL input';<br /> END IF;<br /> EXECUTE 'CREATE OR REPLACE VIEW database_version AS SELECT ' || p_version || ' AS version';<br /> RETURN true;<br />END;<br />$$ LANGUAGE plpgsql VOLATILE;<br /><br />SAVEPOINT s1;<br />SELECT require_database_version(4);<br />ROLLBACK TO s1;<br />SAVEPOINT s2;<br />SELECT set_database_version(6);<br />SAVEPOINT s3;<br />SELECT require_database_version(4);<br />ROLLBACK TO s3;<br />SELECT require_database_version(6);<br />ROLLBACK TO s3;<br />SELECT require_database_version(NULL);<br />ROLLBACK;</pre><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3515077551270967966?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-10450566754825816792008-12-13T16:24:00.005+02:002008-12-13T16:38:05.083+02:00Setting up a Flash testing environment with several versions of the Flash 9 and 10 pluginsWhen you're developing a Flash application, you usually want to be reasonably certain that it'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.<br /><br />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.<br /><br />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. <br /><br />IE, as usual, is a different kettle of fish altogether, and generates extra customer costs even here.<br /><br />Let's start by visiting Adobe's page "Archived Flash Players available for testing purposes" at <a href="http://www.adobe.com/go/tn_14266">http://www.adobe.com/go/tn_14266</a>.<br /><br />From there, download the files <a href="http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp10_archive.zip">http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp10_archive.zip</a> and <a href="http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp9_archive.zip">http://fpdownload.macromedia.com/get/flashplayer/installers/archive/fp9_archive.zip</a>. If the filenames have changed since writing this blog post, you'll probably be able to find the correct files from the Adobe KB page referenced earlier.<br /><br />These .ZIP files contain all of the .EXE installation files needed to get to the actual plugin files we'll be needing. Create a working directory, and unzip the fp*_archive.zip-files there.<br /><br />Here's a small shell script you can run under Linux to extract the plugin files from the installation executables, using Wine:<br /><pre>export WINEPREFIX=$PWD/wine<br />mkdir $WINEPREFIX<br />mkdir flash_plugins<br /><br />for file in fp*archive/*/flashplayer*_win.exe<br />do<br /> version=`echo $file | awk -F/ '{print $2}'`<br /> echo $file $version<br /> wineconsole $file /S /D=C:\\flash\\$version<br /> cp -r wine/drive_c/flash/$version flash_plugins/<br />done</pre><br /><br />... to be continued!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-1045056675482581679?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-67813478185057912362008-11-20T16:10:00.004+02:002008-11-22T15:24:52.887+02:00Software projects are such fun<object width="425" height="349"><param name="movie" value="http://www.youtube.com/v/WlBiLNN1NhQ&hl=en&fs=1&border=1&ap=%2526fmt%3D18"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WlBiLNN1NhQ&hl=en&fs=1&border=1&ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="349"></embed></object><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-6781347818505791236?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-8007930383164438112008-11-14T03:42:00.001+02:002008-11-14T03:43:49.000+02:00DTrace script for snooping MySQL queries<code>#!/usr/sbin/dtrace -Zs<br /><br />pid$target:libmysqlclient:mysql_real_query:entry<br />{<br /> printf("Query: %s\n", copyinstr(arg1));<br />}</code><br /><br /><code>pgrep httpd</code><br /><br /><code>dtrace -p 714 -s ./mysql.d</code><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-800793038316443811?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-29868470836277860382008-11-13T05:55:00.002+02:002008-11-21T04:17:11.194+02:00Mike Shapiro and Bryan Cantrill demonstrate Fishworks<embed src="http://services.brightcove.com/services/viewer/federated_f8/1460787980" bgcolor="#ffffff" flashVars="videoId=1906937239&playerId=1460787980&viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&servicesURL=http://services.brightcove.com/services&cdnURL=http://admin.brightcove.com&domain=embed&autoStart=false&" base="http://admin.brightcove.com" name="flashObj" width="486" height="412" seamlesstabbing="false" type="application/x-shockwave-flash" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-2986847083627786038?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-35628012593732700592008-10-31T17:57:00.001+02:002008-10-31T18:01:05.150+02:00TDS: Community Organizers<embed FlashVars='videoId=189771' src='http://www.thedailyshow.com/sitewide/video_player/view/default/swf.jhtml' quality='high' bgcolor='#cccccc' width='332' height='316' name='comedy_central_player' align='middle' allowScriptAccess='always' allownetworking='external' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3562801259373270059?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-49786677271428617582008-10-29T23:34:00.002+02:002008-10-29T23:45:13.437+02:00Viikon ravintolalöytö: Marokkolainen ravintola FezOlen onnekas siinä, että minulla on ystäviä jotka tasapainottavat konservatiivisuuttani ravinnon maailmassa innolla uusien kokemusten etsimiseen. Rosa puhui niin innostuneesti marokkolaisesta <a href="http://www.fez.fi/">ravintola Fezistä</a>, että lähdin mielelläni kokeilemaan. Emme pettyneet.<br /><br />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.<br /><br />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ä "suolaa, curryä ja chiliä"-linjasta.<br /><br />Suosittelen.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-4978667727142861758?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-70117585302969114942008-10-21T17:19:00.001+03:002008-10-21T17:19:57.699+03:00Jon Stewart speaks on my behalf<embed FlashVars='videoId=188640' src='http://www.thedailyshow.com/sitewide/video_player/view/default/swf.jhtml' quality='high' bgcolor='#cccccc' width='332' height='316' name='comedy_central_player' align='middle' allowScriptAccess='always' allownetworking='external' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer'></embed><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-7011758530296911494?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-35847292775336620682008-09-21T02:30:00.008+03:002008-09-26T21:15:51.045+03:00SpringSource pulls a bait and switch with Spring FrameworkSpring Framework may be one of the most widely adopted libraries in the Java world.<br /><br />It came to be so widely adopted because of its open source license and consistent quality.<br /><br />Its authors decided to monetize the wide adoption, and formed SpringSource to sell support.<br /><br />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.<br /><br />SpringSource are significantly altering the factors which led to Spring Framework'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.<br /><br />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?<br /><br /><b>Edit:</b> apparently the new pricing <a href="http://www.theserverside.com/news/thread.tss?thread_id=50727#269681">starts from $20,000</a> for a small team.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3584729277533662068?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-49222154628906380602008-09-15T17:41:00.003+03:002008-09-15T17:48:01.604+03:00New cloud datacenter products: VMWare vCloud, Citrix Cloud Center and Sun xVM OpsCenterVMWare released their vAporWare <a href="http://www.vmware.com/company/news/releases/vcloud_vmworld08.html">vCloud announcement</a> at VMWorld08.<br /><br />Citrix released <a href="http://www.citrix.com/English/ps2/products/product.asp?contentID=1681633#c32">Citrix Cloud Center</a>.<br /><br />Sun released <a href="http://blogs.sun.com/jonathan/entry/xvm1">xVM OpsCenter</a> and the rest of the xVM product line.<br /><br />Of the three, the Sun products seem the closest to becoming actual reality.<br /><br />Here's to both competition and standards!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-4922215462890638060?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-84773442084672358212008-09-14T12:34:00.006+03:002008-11-21T04:10:41.390+02:00Skaalautuva palveluarkkitehtuuri joka keittiöstä löytyvillä aineksillaHei, sinä joka rakennat juuri verkkopalvelua! Kyllä, juuri sinä.<br /><br />Teetkö suunnitelmia siitä lähtökohdasta, että tulet onnistumaan työssäsi, vai oletatko epäonnistuvasi?<br /><br /><img src="http://icanhascheezburger.files.wordpress.com/2008/11/funny-pictures-cat-caught-his-tail-and-might-fall.jpg" align="right"><br /><br />Jos verkkopalvelusi onnistuu, kuinka paljon sillä tulee olemaan käyttäjiä? Kuinka monta pyyntöä sekunnissa se saa palvella?<br /><br />Juuri nyt, ennenkuin palvelullasi on vielä sitä ensimmäistäkään käyttäjää, on paras aika istua alas ja ajatella <a href="http://dev.twitter.com/2008/05/twittering-about-architecture.html">mitä onnistuminen tarkoittaa</a>.<br /><br />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.<br /><br />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.<br /><br />Nämä suunnitelmat auttavat sinua onnistumaan. Se on hienoa!<br /><br />Ne eivät auta sinua kohtaamaan onnistumisen aiheuttamia ongelmia. Se on huonoa!<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />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.<br /><br />Näin ei tarvitse käydä sinulle. Toisen mäen hanskaamista kutsutaan <b>palvelun skaalautumiseksi</b>, ja se tarkoittaa sitä, että <b>tuotat palvelun monella pienellä tavalla</b> yhden suuren askeleen sijaan.<br /><br />Yhdellä suurella askeleella tarkoitan järjestelmäarkkitehtuuria, jossa kaikki tieto on yhdessä tietokannassa. Kyllä, vaikka suunnittelisit antavasi kannalle lukuorjia.<br /><br /><big>Monella pienellä tavalla tarkoitan sitä, että teet jokaisesta palvelusi osa-alueesta oman taustapalvelunsa, ja jaat jokaisen taustapalvelun edelleen pienempiin paloihin.</big><br /><br />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 "http://tilipalvelu/users/gumi" ja saa XML/JSON-vastauksen.<br /><br />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. <br /><br />Ennen tilipalvelun toiminnallisia klustereita on hakemistopalvelu, jonka ainoa tehtävä on kertoa, mistä löytyvät käyttäjän "gumi" tiedot. Koko hakemisto pidetään palvelun muistissa, joten vastaukset missä-kyselyihin tulevat pahimmillaan mikrosekunneissa.<br /><br />Voilà. Meillä on tilipalvelu, joka ei väsy toisessa mäessä.<br /><br />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.<br /><br />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ä.<br /><br />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.<br /><br />Olet ohjelmistoja rakentaessasi oppinut saman läksyn kuin minäkin: muutoskustannukset kasvavat logaritmisesti ajan myötä.<br /><br />Sinun tehtäväsi on suunnitella onnistuvasi. Kyllä, juuri sinun!<br /><br />Keskustele tiimisi kanssa ensimmäisestä ja toisesta mäestä, hahmottele palvelusi taustapalveluina ja toiminnallisina klustereina, ja tee prototyyppi hakemistopalvelusta jo tänään!<br /><br />Ja ole ylpeä itsestäsi!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-8477344208467235821?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-88141301555229351382008-08-30T15:25:00.007+03:002008-08-30T16:26:05.590+03:00Pilvi-infrastruktuuri on mannaa aikatauluilleOlen ollut pilvi-infrastruktuurin käyttäjä maaliskuusta 2006, jolloin annoin Amazonille luottokorttitietoni. <br /><br />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.<br /><br />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.<br /><br />En yleensä laskuta asiakkaaltani näitä infrastruktuurikustannuksia, koska niiden laskuttaminen maksaa enemmän kuin itse kustannukset. <br /><br />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. <br /><br />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.<br /><br />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 <a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=101">Linux-distribuutiot</a> ja <a href="http://blogs.sun.com/ec2/">OpenSolaris 2008.05</a>, joka on <a href="http://www.genunix.org/wiki/index.php/DTrace_FAQ#What_is_DTrace.3F">DTrace</a>n ja <a href="http://en.wikipedia.org/wiki/ZFS">ZFS</a>:n takia erittäin kiinnostava vaihtoehto.<br /><br />Tässä kuvaamani palvelut ovat nimeltään <a href="http://aws.amazon.com/ec2">Amazon Elastic Compute Cloud</a> (EC2) ja <a href="http://aws.amazon.com/s3">Simple Storage Service</a> (S3.) <br /><br />Olen myös viime aikoina tutustunut Googlen uuteen beta-vaiheessa olevaan <a href="http://code.google.com/appengine/">Google App Engine</a>-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 <a href="http://code.google.com/appengine/docs/datastore/">tietovarastointitavan</a> joka muistuttaa vain etäisesti relaatiotietokantaa.<br /><br />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.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-8814130155522935138?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-35841143793307572832008-07-14T14:19:00.007+03:002008-08-30T16:07:57.996+03:00Yrityksen Linux-palvelinten hallinta Red Hat SpacewalkillaKaikissa 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.<br /><br /><a href="http://www.redhat.com/spacewalk/img/screenshots/your_spacewalk.png"><img src="http://www.redhat.com/spacewalk/img/spacewalk-screenshot.png" border="0" align="right"></a>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.<br /><br />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ä.<br /><br />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.<br /><br />Red Hat on pitkään lupaillut avata Satellite Serverin lähdekoodin, ja he vihdoin tekivät sen kesällä 2008, nimikkeellä <a href="http://www.redhat.com/spacewalk/">Red Hat Spacewalk</a>. 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.<br /><br />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.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3584114379330757283?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-52429135358362710262008-07-05T10:27:00.001+03:002008-07-05T10:28:14.670+03:00Architecture rules<a href="http://72miles.com/architecturerules/">Architecture rules</a> lets you automatically enforce dependency creation rules.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-5242913535836271026?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-45848768644401039432008-05-26T03:11:00.003+03:002008-05-26T03:14:45.986+03:00The Phoenix has landed on MarsThanks, guys. The work you're doing is the most important work in the solar system.<br /><br /><a href="http://www.nasa.gov/mission_pages/phoenix/main/index.html"><img src="http://www.nasa.gov/images/content/229865main_phx-landed-427.jpg"></a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-4584876864440103943?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-85061410549125059052008-05-15T13:05:00.003+03:002008-05-15T14:14:02.213+03:00Canned Mistakes for JavaI don't usually like to announce vaporware projects, but I have to get this one out to motivate myself to push it on.<br /><br />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.<br /><br />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.<br /><br />Leave a comment if you think of a specific situation that should be covered.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-8506141054912505905?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-31890114074235885512008-05-12T15:07:00.004+03:002008-05-13T17:52:18.358+03:00Catastrophic hard drive failureWell, that's why you're supposed to do backups. Thinking about doing backups and setting up RAID-1 doesn't actually protect against data loss. Oh well, I didn't lose anything irreplaceable.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-3189011407423588551?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-58144883750819238072008-05-11T17:51:00.002+03:002008-05-11T17:56:20.449+03:00Spring view and resolver for QuercusI've been playing around with Spring MVC support for Quercus, and gotten a first beta ready for publication. It's missing VFS support for non-unpacked WARs, among other things.<br /><br />You can get it by running the Mercurial version control application command:<br /><tt>hg clone http://www.gueck.com/hg/p2j</tt><br /><br />The web interface to the repository is <a href="http://www.gueck.com/hg/p2j">http://www.gueck.com/hg/p2j</a> as well.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-5814488375081923807?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-2599839657008969872008-04-10T14:58:00.007+03:002008-04-11T15:24:22.565+03:00Gastronautti on taas elossa<a href="http://www.gastronautti.fi/">Gastronautti</a> 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.<br /><br />Päivitys: soittivat pariin kertaan kun tilaamaani tuotetta ei ollut saatavilla, ja nyt tunnin ja 20 minuutin päästä toimitusta ei vielä näy.<br /><br />Tunti ja 40 minuuttia kulunut, soitin tilaukseen ja kuulema kuski on kiinni ruuhkassa.<br /><br />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ä.<br /><br />Tilasin myös pakasteleipomuksia, joista raportoin sulamisen jälkeen.<br /><br />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.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-259983965700896987?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-7359278888285266932008-04-06T17:59:00.003+03:002008-04-06T18:03:15.373+03:00VMware Server 2 beta is now usableThe 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't do this anymore.<br /><br />My OpenSolaris Indiana PR2 image works better with the beta than the current VMware Workstation.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-735927888828526693?l=blog.gueck.com'/></div>guminoreply@blogger.com0tag:blogger.com,1999:blog-9040835495654318175.post-40176671833151250012008-03-27T10:48:00.008+02:002008-03-27T11:20:46.363+02:00Amazon EC2 is now ready for production useToday is the day Amazon Elastic Computing Cloud (EC2) became ready for production use.<br /><br /><a href="http://www.allthingsdistributed.com/2008/03/on_the_road_to_highly_availabl.html">Werner Vogels</a> announced the launch of two crucial features: customer-specific IP addresses and geographically spread out sites.<br /><br />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.<br /><br />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. <br /><br />The currently available zones are:<br /><tt>AVAILABILITYZONE us-east-1a available<br />AVAILABILITYZONE us-east-1b available<br />AVAILABILITYZONE us-east-1c available</tt><br /><br />Amazon calls these features <a href="http://docs.amazonwebservices.com/AWSEC2/2008-02-01/DeveloperGuide/elastic-addressing.html">Elastic IP Addresses</a> and <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1347&categoryID=112">Availability Zones</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9040835495654318175-4017667183315125001?l=blog.gueck.com'/></div>guminoreply@blogger.com0