Santa was here… with books!
Posted by alexander in Kära dagbok on November 7, 2012
I haven’t had time to do techbookreader for a long time. At present, I don’t even have time to write a proper blog post.
BUT. I got this today!
Here’s why I bought these particular books. There’s reason behind the madness
Agile Software Development – Principles, Patterns, and Practices: A classic by Uncle Bob. I should have read it a long time ago.
Patterns of Enterprise Application Architecture: I feel bad about not having read this one. Really bad.
Ship it – A Practical Guide to Successful Software Projects: The Continuous Delivery book keeps referring to this one. Let’s see what it’s about…
Exploratory Software Testing – Tips, tricks, tours, and techniques to guide test design: I should know more about exploratory testing.
How to Break Web Software – Functional and Security Testing of Web Applications and Web Services: I know nothing about this book, but I feel I should be better at web testing.
JUnit in Action – Second Edition: First edition was quite ok.
Testing Computer Software: I liked Cem Kaner’s writing in another book.
Perfect Software – And other Illusions about Testing: Gerald M. Weinberg. No explanation needed.
Geekar hårdvara
Posted by alexander in Geekande, Kära dagbok on September 30, 2012
En gång var femte år får jag ett infall. Jag försöker bevisa för mig själv att jag kan geeka med hårdvara. Resultatet brukar vara sådär, och kontot går 500-1000 spänn back. Jaja… Människan är inte en rationell varelse.
Förra omgången körde jag stenhårt på PIC 16F84A med en seriell Velleman-programmerare. Försökte få liv i en servokontroller, men det gick inte. 16F84:an programmeras i Assembler, och man våndas varje gång, men samtidigt känner man sig duktig eftersom man programmerar i Assembler.
Denna gång triggades mitt infall av en födelsedagspresent. Jag fick en Arduino Uno. Den här gången bestämde jag mig för att det är en materialsport, så jag köpte på mig det jag inte hade. Resultatet ses nedan:
Sedan kom jag på att jag faktiskt inte kan löda, men det åtgärdades lätt med Youtube. Tre tutorials senare kände jag mig mogen att försöka på allvar. Denna gång hade jag också klämmor. Jag lödde ihop en liten “buss” till Arduinon och ville egentligen löda mer, men hade inget mer att löda.
Efter en del grejande fick jag också igång min servokontroller jag köpte för type fem år sen. Om man kopplar in saker på rätt pinnar, så blir det enklare. Det jag hade fått ihop vid det här laget var en Arduino som pratade seriell kommunikation med en Pololu Micro Serial Servo Controller.
Resultatet ses i denna film.
Det finns en massa tutorials på nätet för hur man sätter ihop allting, men jag presenterar gärna “lessons learned”:
- En kabelskalare är värd sin vikt i guld
- Grundläggande lödning är inte svårt, men man måste ha grejerna
- Det lilla servot på bilden pajade direkt. Dålig produkt, eller dålig koppling?
- Man borde läsa lite mer grundläggande elektronik. Digitaldelen är enkel, men man måste göra magi med kondensatorer, spänningsregulatorer, pull-up/down-motstånd m m.
I samband med detta övergav jag helt mina PIC 16F84-ambitioner. Det visade sig att ingen av mina datorer ville prata seriell kommunikation med en gammal programmeringsbräda. Det är en materialsport, så till nästa gång kommer jag köpa en USB-baserad programmerare, samt köra på processorer som kan programmeras i C.
Writeup JFokus 2012 – Tutorialdagen
Idag var jag på JFokus tutorialdag. Två sessioner på ca tre timmar vardera. Jag valde Continuous Delivery med Neal Ford och HTML 5 med Robert Nyman.
Continuous Delivery
Ska man sammanfatta den första sessionen med en mening, så kan man säga att den troget följde boken med samma namn (som jag kommer att recensera på techbookreader i dagarna). Det jag saknade i boken blev inte förtydligat under presentationen, men jag kunde ställa mina frågor till Neal efteråt, så det löste sig. Jag undrade hur man får till static, pinned, och fluid dependencies på riktigt och hur man ska förhålla sig till databasdeltan och branchning. (Svaren är: använd Maven, skriv automagiskt om POM:en vid misslyckat bygge, respektive ”gör det inte”.)
Som sagt, inget supernytt för den som har läst boken och fått jobba med liknande saker, men några takeaways blev det:
CD handlar om att teamat måste kontrollera mer av sin omgivning. Infrastruktur och databaser kan inte längre kontrolleras av andra. Kanske uppenbart, men ganska axiomatiskt. Detta gäller även ”the last mile”, d v s slutintegration, utrullning, Q/A. Nu måste man ta hand om allt. Stackars de utvecklare som bara vill koda…
Komponenter: Om man inför komponenter på rätt ställen kan man göra om arkitekturförändringar till design.
Bra nyckeltal:
- “Hur lång tid tar det att få ut en rad kod i produktion” (Mary Poppendieck)
- Ledtid är måttet på IT:s effektivitet (tämligen självklart, men jag gillar absoluta utsagor formulerade som korta meningar)
Sköna citat:
- Om drift: “We invented computers to do simple repetitive tasks. Now we hire people to do simple repetitive tasks on computers”
- Merge ambush = Man får en massa förändringar från trunken, så att ens bygge förstörs totalt. Påträffas typiskt vid branchning när en annan branch ”har vunnit”.
Jag måste läsa:
- The Four Steps to the Epiphany: Successful Strategies for Products that Win
- Release It!: Design and Deploy Production-Ready Software
- Neals gratisartiklar på devloperWorks. Sök på “emergent design”.
Mjukvara att testa:
Tal att se:
HTML 5
Mekanisk presentation, där mycket HTML 5 visades. För en newbie som jag var det bra. Jag tyckte själva presentationen spretade. Första delen handlade om semantiska element, andra om forms och tredje om API:erna, men den röda tråden inom varje block var inte självklar. Baserat på denna presentation och några enstaka från andra konferenser drar jag slutsatsen att HTML 5 har en bit kvar. Jag kan givetvis ha fel, men detta är inte mitt fokusområde.
För det första verkar åter igen browser-tillverkarna göra lite som de vill. Gillar de inte en viss del av standarden, så struntar de i den (Microsoft om keygen-taggen [förresten, varför ska man ha en tagg för att generera nycklar???]), och vissa lägger till egna klasser eller tolkningar för att fylla ut gap, och hoppas att andra ska följa efter. Känner vi igen detta?
Form-elementet har blivit rejält pimpat i HTML 5! Mer input-element, t ex color, range, datetime, o s v och funktioner för validering, MEN utvecklingen av dessa är eftersatt, eftersom browser-tillverkarna tycker att prestanda och 3D är viktigare. Implementationen spretar alltså mellan olika browsers, och man måste fortfarande använda otippade JavaScript-lösningar på ställen där man helst hade sluppit.
Sen har vi allt det där med Web Sockets, Web Workers och local storage. Jag tolkar det som att man bokstavligt talat försöker uppfinna opertivsystemet: IPC, trådning och permanent minne. Kalla mig konservativ, men jag känner en viss oro. Det mest talande exemplet är Web Sockets. Jag vet inte mycket om dem alls, men tittar man på deras API, så verkar det vilja mimikera get gamla hederliga socket-API:t från UNIX. Jag kan tänka mig att det finns ett antal utvecklare som aldrig har arbetat med C under UNIX och detta API, och de förstår inte hur bra det är att det har abstraherats bort de senaste 10 åren. Nu ”uppfinner” man det i HTML 5 och JavaScript. Det är inte självklart att resultatet blir bra. Samma sak med trådning. Man har uppfunnit trådar i webbläsaren, medan resten av världen har börjat bygga abstraktioner runt trådar, eftersom trådning är svårt, eller programmera med funktionella språk. Lång rant.
Summa summarum, så lärde man sig mycket i alla fall.
Andra takeaways i punktform:
- HTML 5 Doctor verkar vara en bra site att kolla in om man ska greja med HTML 5.
- Man kan skapa egna attribut i HTML 5, så länge de börjar med ”data”. Kolla t ex här.
- Vid.ly är en skön site om man behöver koda om lite video till olika format
- Popcorn.js: gulligt ramverk för att lägga på sidocontent samtidigt som ett videoklipp spelas.
DevCon 11 writeup
Gör en sån där liten sammanfattning av ett event jag har varit på. Denna gång var handlar det om DevCon 11, som hölls i Karlskrona. Konferensen varade två dagar och var av det mindre slaget, kring 100+ deltagare. Jag måste dock säga att det var en av de bästa konferenser jag varit på! Storleken gjorde att man verkligen fick tid att prata med folk, lära känna nya människor och utbyta idéer och erfarenheter, till skillnad mot att trängas med 1000+ personer, köa till toaletten och slåss om fikat.
Konferensen hade två spår ”Software Craftsmanship” och ”Technology”. Det som ingick i respektive spår var lite slumpmässigt, men det gjorde ingenting. Arrangörerna hade verkligen lyckats få dit bra talare och fick till en bra spridning på ämnena.
Ur en talares synpunkt fungerade allting väldigt väl. Tekniken funkade, bra volym på micken, bra moderering och tidhållning. Alla skötte sig med tiden också J
Själv fick jag jättemycket behållning av dessa två dagar. Inte nog med att jag träffade väldigt många riktigt duktiga personer; jag såg till att pricka in ämnen som jag inte kunde så bra, så marginalinlärningen blev hög.
De föreläsningar jag av olika skäl fick mest behållning av var:
- Keynoten av Joakim Jardenberg. Inspirerande och lite skrämmande för en som inte är med i Facebook.
- Managing complex projects with Maven 3, Lennart Jörelid
- Exploratory test design, Rikard Edengren
- Clojure – Data Structures and Concurrency Mechanisms, Ulrik Sandberg (via en komprimerad privatsession, eftersom vi talade samtidigt. Tack!)
- Bägge av David Jacobys säkerhetsföreläsningar
- OSGi – 10 years ahead if their time, Christer Larsson
- Asynchronous Programming with Node.js, Anders Janmyr
- Is your REST Assured, Johan Haleby.
Alla andra föreläsningar, som jag var på, var också mycket bra, men jag kunde ämnet, så de tjänade mer som kvitton.
Sammanfattningsvis kan jag konstatera att jag fyllde på med introföreläsningar i teknologier jag inte kan så bra: Node.js, Clojure, OSGi.
Den stora ögonöppnaren var nog ändå att jag började förstå vad polyglot-programmeringen går ut på och varför den är bra. Jag har länge avfärdat en del språk och paradigmer som kuriosa och leksaker som inte skulle klara av enterprise, men efter denna konferens får jag nog omvärdera mina åsikter.
Converting Selenium waitForCondition to WebDriverWait
Posted by alexander in Kära dagbok on September 11, 2011
I usually don’t write simple tutorial posts, but I’d like to share this one, because it took me some time to google the answer, and I still had to adapt it to my case.
I had the simplest possible vanilla Ajax application, that would react to keystrokes in a textfield and then return a list of words based on the entered value. You see this everywhere! My particular HTML snippet looked like this:
<body onload="document.getElementById('prefixText').focus()">
<input type="text" id="prefixText" onkeyup="checkForExpansion(document.getElementById('prefixText').value)"/>
<br/>
<span id="ajaxResults"></span>
</body>
checkForExpansion just made an asynchronous call the a servlet that returned a list of completions. However, one thing was a little untypical with this application: The results went in as strings separated by <br/> tags into the span element. The consequence of this was that there was no obvious element to wait for when testing this page; the span was there already.
Now, my first test went like this:
@Test
public void trivialAjaxListCompletionExampleUsingSelenium1StyleWait() {
Selenium selenium = new WebDriverBackedSelenium(webDriver, testedUrl);
webDriver.get(testedUrl);
webDriver.findElement(By.id("prefixText")).sendKeys("a");
selenium.waitForCondition("selenium.browserbot.getCurrentWindow().document.getElementById('ajaxResults').innerHTML.indexOf('ALEX') > 0", "1000");
}
It worked, but it relied on WebDriverBackedSelenium, which I really didn’t want it to. After some googling and experiementing, I came up with the followging:
@Test
public void trivialAjaxListCompletionExampleUsingWebDriverStyleWait() {
webDriver.get(testedUrl);
webDriver.findElement(By.id("prefixText")).sendKeys("a");
boolean isListPopulated = (new WebDriverWait(webDriver, 1000))
.until(new ExpectedCondition() {
public Boolean apply(WebDriver d) {
JavascriptExecutor javascriptExecutor = (JavascriptExecutor) webDriver;
return (Boolean)javascriptExecutor.executeScript("return document.getElementById('ajaxResults').innerHTML.indexOf('ALEX') > 0");
}
});
assertTrue(isListPopulated);
}
As a test, this sucks, but this snippet shows several interesting things. First we have the WebDriverWait class. Waiting can be quite fine-tuned using the FluentWait class.
Then we have an example of the browserbot being dropped (since it’s a Selenium 1 thing) and Javascript with a return (mandatory in Selenium 2).
Finally, we have the boolean test. Many examples on the web are written so that they wait for a certain element to appear, and then return it. Since the element (the span) was already present, I wanted to make the example a little odd.
Installerar monsterfläkten Noctua NH-U12P

Mycket geekande nu. Köpte en födelsedagspresent till mig själv: monsterfläkten NH-U12P från Noctua.
Egentligen håller jag inte på med överklockning, utan vill ha en tyst dator, men min andra dator blev tvungen att köra på en riktig stock-cooler, så jag bestämde mig för att transplantera CPU-fläkten från min nuvarande dator till den, men då behövde jag en ny. Då tänkte jag att det är lika bra att köpa något ordentligt, instället för något skit för 300 spänn.
Installationen tog drygt två timmar, eftersom jag fick rycka hela moderkortet, rengöra CPU:n och trassla med sladdarna till fläktkontrollerna. Manualen är tydlig, och hela produkten andas kvalitet. Monteringsdelarna för AMD och Intel är tydligt separerade, så det vara bara tuta och köra.
Allt gick smärtfritt, och jag fick ihop alla sladdar inför första starten. Självklart körde jag med bägge fläktarna som följde med. Kan också nämna att lådan jag körde med var en Antec 300, och ja, fläkten passar, även med sidofläkten intallerad. Har googlat detta själv, för det är inte självklart.
Kan nämna någonting om ljudet också. Alla fläktar förutom en i den låda är just Noctua-fläktar. Att köra två P12:or till i 1000RPM bidrog inte direkt till att höja ljudnivån.
Nu i efterhand måste jag säga att det var kul att installera denna fläkt. Normalt vill jag bara få det att funka, men den här har tillräckligt många delar man ska skruva fast och greja med, att man känner att man bygger ihop något. Lego
.
Halvvägs: moderkortet ryckt, CPU:n ren, monterkingsskenorna på plats.
Kände mig sen tvungen att överklocka lite defensivt bara för att, och då blev det så här med Prime95 och bägge fläktarna på 1000 RPM:
TDD in JavaScript
This is not a big leap for humanity, but it’s a big leap for me. Today I officially tried doing TDD in JavaScript. The task was perfect: implement a widget that would render a simple markup language that had almost a 1:1 correspondence to HTML. The markup looked something like:
|F02|Hello world!|B|This is bold|/B| etc. There are always some gotchas (like unbalanced tags and alike), but the task was perfect for state-based testing.
I googled TDD and JavaScript and found jsUnit. It was amazingly simple to get started with. Just downloading and adding a reference to the library. The idea is that you put your code under test in one file, and you create an HTML-file that references jsUnit and your tested code. That file also contains your unit tests. This is very clearly documented on the framework’s site, so I won’t repeat it here. Then you load another HTML-file, which is the runner. You point out your HTML-file with the tests and of you go. That’s all there’s to it.
This is the first time I’ve tried doing this for JavaScript, so I have no references and cannot make any comparisons. However, I got a very positive impression:
- The framework is really easy to install.
- It mimicks’ JUnit very well (it has
setUp,tearDown, tests start withtest, and the basic asserts are the same) - The runner looks nice
To truly recommend jsUnit, I’d like to figure you how well it runs in batch mode, and what it can actually do. I’ve only tried basic asserts so far. Anyway, It’s a cool tool worth trying only for the fun of it.
If I keep using it and it proves inadequate, I’ll probably write a post like “Why jsUnit sucks”
Skill tag cloud
Posted by alexander in Uncategorized on August 20, 2011
I wanted a fancy “about me” slide for a conference, so I used Wordle to create a tag cloud of my current skills. Apart from having to say that Wordle is an amazing piece of software, I look forward to creating another tag cloud in a year to see how it turns out.
Sometimes digging in history hurts
Posted by alexander in Guldkorn aka WTFs on July 18, 2011
You learn something new every day. I never thought I’d post an auto-generated CVS log here, but it contains so many gems in so few lines of comments, so I had to. Keep in mind that the underlying code was written six years ago, in an era where everything had to be XML. If you don’t share my sense of humor, here are two tips: “EO” and “resubstitute the existing text”.
I’ve changed the name of the class, modification dates, and committers.
/*
* $Log: ObscuredEO.java,v $
* Revision 1.6 2005/04/17 11:16:37 mr_x
* reintroduced.
*
* Revision 1.4 2005/03/19 14:03:12 mr_x
* added type constants.
*
* Revision 1.3 2004/11/26 11:29:10 mr_x
* Added the function restartText(), this method can be used to resubstitute the existing text with a new text.
*
* Revision 1.2 2004/11/23 15:44:18 mr_x
* modified this class, so that it inherits from the XmlMessage class, like all other EO-classes in the message-package. It now overrides the method toXMLString to generate the complete tag plus its enclosed message.
*
* Revision 1.1 2004/10/14 14:59:17 mr_y
* First version
*
Gör en Blondinbella
Posted by alexander in Kära dagbok on June 14, 2011
Idag gör jag som vilken 20-årig bloggande flicka som helst och visar vad jag fått med posten…
Ta-da! Den högra boken – Solaris Internals. Lägg märke till dett gulliga omslaget
För att få en finare bild har jag ställt en annan bok ur min bokhylla bredvid. Varför detta? Jo, därför att jag för ett tag sedan insåg att jag är för dålig på OS. Jag har kört Linux sedan -96 och Solaris sedan -99, men jag har kört dem som lekman. Mina kunskaper slutar vid grundläggande IPC (jag vet vad en door-fil är) och vid halvavancerade kommandon (jag vet hur man använder strace och truss, men vet inte vilka växlar man ska använda). Fram till för en vecka sedan tyckte jag att jag “kan göra allt jag vill” i ett Unix-baserat system. Nu har jag dock ändrat åsikt och börjat känna att det är dags att plugga på lite.
Det jag vill säga med detta inlägg är inte hur bra eller dåligt jag kan Unix. Det jag vill säga är att jag vill leva som jag lär. På min hemsida skriver jag att professionell mjukvaruutveckling handlar om att kunna hantera sin egen dator och servern man jobbar med. Med detta menar jag att den professionelle utvecklaren vet hur operativsystemet fungerar – på djupet.
Kan man sitt OS har man en otroligt kraftfull verktygslåda till sin hjälp. Fram till för ett tag sedan var det bara Unix som gällde, men i och med att Windows har saker som VBScript och PowerShell, så är det värt att snegla på det också. De flesta utveklare jag känner behärskar följande kommandon: cd, cp, pwd, ls, more, less, cat och ps. That’s it. Detta brukar leda till att de stöter på artificiella begränsningar, som inte behöver vara där. Bland annat blir allehanda automatisering tidskrävande.
Summa summarum: är du utvecklare, lär dig ditt OS. Ordentligt! Dessutom skadar det inte att råka läsa om minneshantering i en tid när en garbage collector försöker rensa upp allt…





