Om Creative Commons-licenser

Richard Stallman skriver intressant om användningen av CC-licenser i utbildning:

Creative Commons publishes six principal licenses. Two are free/libre licenses: the Sharealike license CC-BY-SA is a free/libre license with copyleft, and the Attribution license (CC-BY) is a free/libre license without copyleft. The other four are nonfree, either because they don’t allow modification (ND, Noderivs) or because they don’t allow commercial use (NC, Nocommercial).

In my view, nonfree licenses are ok for works of art/entertainment, or that present personal viewpoints (such as this article itself). Those works aren’t meant for doing a practical job, so the argument about the users’ control does not apply. Thus, I do not object if they are published with the CC-BY-NC-ND license, which allows only noncommercial redistribution of exact copies.

CC-BY-SA borde vara OK för presentationsmaterial, men CC-BY-NC-SA är en jag använt för tidigare arbeten.

FSCONS 2012

FSCONS logotype

FSCONS startade som Free Software Conference Nordic Summit, men ganska snabbt bytte Software ut mot Society. Detta syns tydligt i årets teman: Decentralising Society, Embeddded systems, FS Feminism, General Purpose Computing, Legal, Open security, Wikimedia. Samtidigt finns mjukvara givetvis kvar. Konferensen har haft någonstans mellan 200 och 300 besökare vilket även gäller i år. Nytt för mig i år var att det var ovanligt många barn med på konferensen. De satt och spelade, ritade på whiteboards och verkade vara som barn är. För den som inte varit på FSCONS så kan nämnas att könsfördelningen är långt mer jämn än på alla andra konferenser jag varit på.

Untitled

Fredag

Workshops – jag deltog inte här.

Lördag

Free Your Android

Presentationen föregicks på fredagen av en workshop – och målet är helt enkelt att köra ett alternativt Android OS som är fritt, inklusive en fri appmarknad – F-droid.

OpenRISC

Detta handlade om en öppen hårdvaruplattform. Det finns en hel del att läsa på OpenRISCs hemsida. Det var en hel del diskussion om licensiering, och talarna gav exempel på kommersiella produkter som använder OpenRSIC “trots” LGPL-licensen. Den nya kodbasen skrivs dock om från grunden och använder Mozilla Public License pga att LGPL har som krav att det skall gå att ersätta all mjukvara, och med OpenRISC i en ASIC så går det ju inte (det blir inget kvar som kör)!

OpenRISC startades för längesedan (tror till och med det var 1900-tal!) och den grupp som drev projektet anställdes snart av Flextronics. Mycket har hänt sedan dess, bl a finns OpenRISC i satteliter i rymden. Samsung har det i sina digital-TV-apparater och de har också släppt ut den källkod de producerat fritt.

Software Transactional Memory “for real”

Presentationen hade i programmet titeln Using Multiple Cores in a High Level Language. Armin som tidigare pratat om PyPy på GothPyCon attackerar problemet med att förenkla för utvecklare att skriva kod som använder flera (alla) kärnor i en dator, utan att explicit behöva hantera lås och/eller tråder. Tanken är att köra varje funktionsanrop atomärt med hjälp av Software Transactional Memory. I korthet är atomic implementerat på det sätt att all data/objekt som en transaktion petar på skriver till en kopia av objekten och när transaktionen avslutas så markeras originalobjekten som “jag är uppdaterad, nya versionen ligger nu -> här” som pekar på en senare modell. Skulle det bli konflikt kan transaktionen slängas och köras igen t ex. Systemanrop är dock låsta, eftersom de inte går att rulla tillbaka. Ett utmärkt sätt att få ett program som skrevs för att köras singeltrådat, helt enkelt kunna köras snabbare.

Intressant: Armin förutspår att (Software) Transactional Memory, STM, snart kommer finnas i alla språk och alla plattformar, på samma sätt som Garbage Collection nu är mainstream.

Debian Packaging

Per Andersson (aka avtobiff, som numera är Debian Developer) hade en genomgång av hur man paketerar med hjälp av deb-helper. Inte så mycket fokus på verktyg utan mer vad som behövs för att lyckas bygga i form av konfiguration och metadata. Hann även kika på själv deb-binären. Nytt för mig var vad urgency i changelog-filen gör – det styr hur länge artefakterna ligger i unstable innan det når testing. (urgency=low = 10 dagar)

Jag lärde mig också ett nytt sätt att hämta in text i vim: :read ! date

Untitled

Lightning Talks

Smarí McCarthy talade om ett dropbox replacement.

En norska (missade hennes namn) pratade om hur de jobbat med sin Linux/BSD user group i Bergen. Det jag tog med mig var att affischer på staden är det som gjort mest skillnad i avseende att nå nya medlemmar.

PageKite, Bjarni Rúnar – ett projekt med två HTTP relayer: en på en server med publik IP-adress och sedan en relay som sitter i Androidtelefoner. Tanken är alltså: man skriver en HTTP server på sin android-telefon och man vill göra den publik tillgänglig. Dessvärre är nät-tillgång opålitligt (wifi, 3g?) och lösningen är att PageKit lägger sig mellan internet och telefonen med två hopp: slutanvändares browser (eller server) -> HTTP server/pagekit publik server -> pagekit webb relay “klient” på telefonen -> HTTP server på telefonen. Undrar om det fungerar med WebSockets! :-)
Bjarni har en startup kring detta och det han ser är att alla “uttjänta” Android-telefoner är en perfekt lite webbserver – den är billig, har redundanta anslutningar (wifi, 3g) och är kraftigare än den maskin man betalade tio tusentals kronor för när internet var nytt på 90-talet.

Per Andersson med familj – pratade om sina erfarenheter från att ta med barn till konferensen. Vad behövs? Vad är omtyckt? Fungerar det över huvud taget? De hade ett barnrum som fanns med i den officiella kartan i programmet. På scenen när Per pratade visades GCompris och barnen började jaga fallande bokstäver samt muspekaren – de förväntade sig att bokstäverna skulle försvinna när de “slog” på projektorduken! Touch is the shit. :-)

Egil Möller – pratade om att man vill publicera positioneringsdata. En GPS-daemon som cache:ar tills nättillgång finns. Node.js användes och en server kan sedan spela upp strömmen i efterhand.

New new new iPad. En anonym deltagare berättade om sitt köp över internet som visade den ursprungliga Ipad:en – en tvåsidig griffeltavla (i Ipadstorlek) som hittades i en väska köpt över nätet. Humor som gick hem!

Oyvind Hanssen – search and rescue operations Free software, open data. Problemet: Polisen och liknande organisationer har dåligt programvarustöd när de gör avsökningar – det är i princip penna och papper som gäller. Oyvind har ett mjukvarubaserat system som ritar ut olika truppers rörelse över tid. Visade också upp en bit hårdvara som sänder in GPS-koordinater. (Det gick tydligen inte att förlita sig på tillgång på nätet.) Norska polisen har använt det i flera lyckade insatser.

Sam – owncloud, user data manifesto. Framför allt en plattform för att låta användare äga och kontrollera sin data, men pluggbart med “appar” på app.owncloud.org. Det jag tyckte var mest intressant var hur de satt upp Continuous Integration med Jeknins, trots att “allt var PHP”!

CAcert och PGP/GPG

Sent på kvällen var det också CAcert Assurance och PGP-nyckelutbyten/-signering. Att bedöma äktheten av någons identitetshandlingar är tidskrävande åtgärd som man kan träna en hel del på.

Söndag

Making IPsec scale

Michael Candell har jobbat med att försöka få upp IPsec-tunnlar dynamiskt/on demand. Normalt sett behöver nycklar distribueras i förväg och man behöver i princip veta vem man skall prata med, redan innan man börjar prata. Michael visade tre olika scenarion att göra detta mer dynamiskt. DNSSEC, IPSECKEY records ihop med DNS Update ger bra förutsättningar för att sköta detta dynamiskt. Om båda noder vet varandras namn på förhand kan helt säkra tunnlar (och transporter, lite beroende på plattform och inblandad mjukvara), men även utan detta är Better-Than-Nothing-Security något som kan uppnås. Med BTNS IPsec-scenariot Micheal föreslår kan t ex BGP skyddas från TCP reset+sekvensnummergissande. Detta BTNS scenario skyddar mot replay-attacker, BTNS liknar SMTPS + STARTTLS med självsignerat certifikat.
Projektet har sponsrats av internetfonden.se.
DNS update uses MD5 – weak spot.
IPsec har ingen userland-kod vilket är ett problem med OpenVPN – inte för klienten men för en server med tusentals anslutningar blir detta mycket kostsamt. Därmed skalar IPsec bättre än OpenVPN.

Freedom box

En dansk herre pratade om vad freedom box är, varför det behövs (fast han sade att han inte skulle gå in på det) och lite om vart man vill. Handlar återigen om att ta kontroll över sin data och privacy. Underhållande men ganska tomt på innehåll tyvärr.

Sammanfattning

Jag var kunde inte medverka de sista timmarna men har ändå som vanligt enormt mycket mer i huvudet än man orkar få ned i skrift, massor med intryck, nya idéer och kunskap om verktyg och möjligheter. Dessutom har jag haft trevligt med öppna människor som gärna pratar om erfarenheter och lyssnar till varandras problem.
Enda negativa med en konferens som denna är att min “att göra/undersöka”-lista växer. :-)

Is Your Team Busy Producing Legacy Code?

Jag sprang över en artikel (sälj för en bok) med titeln: Is Your Team Busy Producing Legacy Code? Upphovsmannen Gil Broza pekar på precis de områden som jag själv brinner för – hur man faktiskt lever (eller överlever) med sin kodbas. I kort skulle jag sammanfatta det Gil skriver så här:

Du är inte agil om du inte jobbar proffesionellt med kod. Undvik skriva legacy kod genom TDD, refactoring och Clean Code.

Andra kallar det Software Craftmanship.

Vi hjälper våra kunder öva dessa fördigheter med Coding Dojos. Vi tror att vi lyckas bättre med plattformsspecifika övningar som inte bara övar ett visst moment eller färdighet, utan också visar på att det går att använda “i riktiga problem, för att skriva riktig produktionskod”. Att sitta med enkla plattformsoberoende övningar har givetvis sin plats – man fokuserar på principen, att få in tankesättet genom att ta bort komplexiteten från t ex stela och stora API:er. Men stannar man där – i små enkla problem – har vi sett att det är också där tillämpandet fastnar. Klivet till “verkligheten” blir för stort från övningsexemplets förenklade och säkra sandlåda till den grymma verklighetens omständigheter.

Snabbspårskurs i TDD

Den 3-6 december går JDays av stapeln för första gången i Göteborg. De första dagarna består av föreläsningar (som till viss del väljs av besökarna) och sista dagen är kurser (som ingår i priset). Jag kommer hålla en av heldagskurserna och den beskrivs så här:

Software Craftsmanship stands on the notion that “code is written by humans, for humans” and realizes that the developers themselves are the first users of the code they produce. They’ll read it several times during the code’s lifetime – and the time it takes to read and understand the code, is heavily affected by how “clean” that piece of code is.

Test-driven development offers more than just simple validation of correctness. By focusing on the test first, a developer must imagine how the system and/or it’s APIs will be used, which may help in crafting interfaces and APIs that are easy to understand and digest – thus being a great help in writing actual clean code.

In this hands-on crash course attendees will learn and master the basics of TDD. The theory behind TDD will be explained and intertwined with exercises. Focus is on practicing TDD – i.e. writing code – so that the participant is ready to start doing TDD in real life projects the following day. During the day, various topics related to Software Craftmanship and Clean Code will be explained and discussed.

Attendees should be comfortable with the Java programming language and bring a laptop with Eclipse (or similar IDE) installed.

Väl mött! :-)

When Fluent API:s help

Through my work, I often run across an API pattern that looks like this: it consists of the API definition itself and some definition of how to consume the API. An example:

Three typical options

If you look at the get method in this API, one typically has three options on defining it’s behaviour (or contract):

  • return a BillingPeriod object
  • return null if there’s nothing to return
  • throw an exception if there’s nothing to return

From what I’ve seen, returning null is common as well as throwing an exception. Every now and then (way too often according to the bug tracker) the usage of API on either of these patterns fail – the consumer of simply forgets to check with the boolean method before calling the getCurrentOrNextPeriod().

I really really really think that putting “null” in source code should be frowned upon and only used in very rare circumstances. The problem with returning null is that you have to check if you received a null reference instead of a reference pointing to an actual object. Throwing an exception may be a “safer” way saying “HEY you really shouldn’t proceed now since you asked me to get something that I can’t provide, and you shouldn’t have asked me for stuff I don’t have in the first place and so you probably may do other harmful stuff if I don’t interrupt you now right away”.

A fourth option

A fourth option would be to return a Nullable – a pattern suggested by Uncle Bob and others. This is simply a reference that you can ask: “do you point to an actual object, or will you give me a null reference back?”
which would let us rewrite the API to:


But, while this surely adds information saying “there may not be a BillingPeriod – you should check first”, it still relies on the programmer to call the hasValue() method before getValue().

Wait, there’s a fifth option!

But, there’s also a fifth option. With a more “fluent” API one may enforce a completely fail safe usage pattern:

which would make a consumer look like this:

This would force the consuming programmer to use the API properly and in a safe way.

Yes, it requires some more code from the programmer that provides the API, but it’s not that much and it does reduce errors in the consuming programmer’s code! And bugs that are discovered “late” (when the API is used (in production)) are always much more expensive than bugs discovered “early” (when the API is produced).