Peter Hellberg

Boulderklättrande Rubyutvecklare som gärna jobbar med ramverken Ruby on Rails och jQuery.

Peters hemsida: http://c7.se

Nordic Ruby

Förra fredagen åkte jag, Robert och Mats ner till Göteborg för att gå på konferensen Nordic Ruby.

Lördag

Standing On the Shoulders of Giants

Corey Haines inledde konferensen med en uppmaning om att reflektera över hur och varför man arbetar som man gör.

“Message passing, not objects”
“Lotus notes is a good document database”

Cucumber Inside

Aslak Hellesøy höll konferensens andra föreläsning och ämnet var inte helt oväntat testramverket Cucumber samt dess språk Gherkin vilket nu har extraherats till en gem.

Den imponerande prestandaökningen i Cucumber den senaste tiden beror på att man har bytt ut TreeTop mot Ragel.

Aslak nämnde även hur hooks i Cucumber fungerar.

Neo4j.rb – The Benefits of Graph Database

Andreas Ronge berättade om sitt projekt Neo4j.rb vilket är en grafdatabas för JRuby.

  • Inbäddad
  • ACID
  • Inga scheman
  • Inga externa beroenden
  • Enbart skrivlås

De två javabibliotek som är inblandade är Neo4j samt Lucene. Neo4j inkluderar ett flertal algoritmer, t.ex. Dijkstra.

Möjligheten att traversera djupa relationsgrafer verkar ha ett ganska begränsat användningsområde, men när man väl behöver göra det så är det säkerligen mycket kraftfullt.

Rubyists, you can write JavaScript again

Priset för konferensens effektfullaste introduktion måste gått till Dr Nic a.k.a. Iron Man.

Han började med att nämna att man kan köra JavaScript i Ruby med hjälp av Johnson (Mozilla SpiderMonkey) och att man kan använda capybara-envjs för att testa sina javascript på serversidan. Men efter det var det CoffeeScript som gällde.

“Capybara because it’s AWESOME”

CoffeeScript är i korta drag:

  • De bra delarna i JavaScript
  • Det Haml är för HTML och Sass är för CSS
  • Går att kombinera med alla JavaScript-bibliotek (jQuery!)
  • Kompilatorn är skriven i CoffeeScript! (Går alltså att köra i en webbläsare)
  • Implicita returvärden
  • Inga onödiga tecken
  • Går att köra i Node.js

Enough Design

Ian McFarland från Pivotal Labs pratade om agila designprocesser och hur viktigt det är med en kort “feedback loop”.

Han påpekade att det är viktigt att iterera över problem, oavsett storlek.

En bra design är:

  • Modulär
  • Principfast
  • Regelbaserad
  • UX > Pixlar!

The Ruby advantage – metaprogramming and DSLs (.pdf, 22MB)

Man kan inte bli annat än imponerad av Niclas Nilsson när han så “vårdslöst” tvingar Ruby att bete sig som han vill.

Han berättade om hur man med lite fantasi kan bygga ett internt DSL utan att för den skull ha tillgång till Rubys AST.

Han visade även sin gem properties.

Middag på SoHo

Lördagskvällen spenderade jag med att diskutera hackerspaces, användning av Ruby för utveckling mot Arduino, mikrobryggerier i USA och mycket annat.

Söndag

From artist to programmer

Dagens första föreläsning stod Keavy McMinn för, och hon pratade om likheter (och skillnader) mellan konstnärskap och programmering.

“Just make”

Några av hennes punkter

  • Var öppen för förändringar
  • Det går att bygga något utan initial finansiering
  • Vi utvecklas genom reflektion

The MongoDB Effect

Jag hade gärna sett att Durran Jordan och Les Hill hade fokuserat lite mer på Mongoid än vad de gjorde. Vi vet redan att MongoDB är häftigt.

Enligt Durran borde man ALLTID använda MongoDB.

Mongoid

  • Rails 2 och Rails 3
  • Atomiska operationer
  • Stora dataset
  • Grymt kriterie API
  • Scopes som tar block
  • Master/Slave

SOLID Ruby

Jag hade verkligen sett fram emot Jim Weirich föreläsning om SOLID och jag blev inte besviken.

Några av hans punkter

  • Fördela ansvaret
  • Monkey patchning i bibliotek är dåligt (Arv framför öppna klasser)
  • Protokoll är viktiga

Artificial stupidity, adding smarts to yer kode with a little machine learning

Konferensens tyngsta föreläsning (med råge) stod Randall Thomas från Engine Yard för.

Ämnet var datautvinning genom att använda statistikspråket R och RSRuby. Den enligt mig intressantaste delen av föreläsningen bestod i användningen av en support vector machine (KSVM i R) för att gruppera data och sedan använda detta för rekomendationer.

Böcker: Super Crunchers, Introductory Statistics with R

Software for the Human Animal

Hampton Catlin pratade om skillnaderna mellan manlig och kvinnlig design. Att vi inte är mycket mer än djur och att Internet är den nya vildmarken.

Han hävdade att vi människor generellt sett är självorganiserande och framförallt trevliga. Vi borde alltså sluta motverka på de fåtal användare som förstör och istället uppmuntra och belöna de användare som uppför sig.

Det finns inga dumma användare, bara dåliga gränssnitt som gör dem dumma.

Frozen Rails

I fredags gick konferensen Frozen Rails av stapeln i Helsingfors och Athega var självklart representerade.

Rails at GitHub (Chris Wanstrath, @defunkt)

Konferensen inleddes av Chris Wanstrath som gick igenom hur Ruby on Rails används på GitHub. Vi fick även reda på hur de använder Git (grit, smoke, chimney) och hur de hanterar meddelandeköer (resque).

Några av projekten som nämndes:

  • albino för syntax highlighting genom (front för pygmentize)
  • faker för att generera påhittad data: namn, adresser, telefonnummer
  • Rack HTTP servern Unicorn

The Plataforma Way (José Valim, @josevalim)

Dagens andra föreläsning hölls av José Valim från Plataforma tecnologia. José pratade om autentiseringslösningen Devise (bygger på Warden), domänspråket simple_form (inspirerat av Formtastic) samt Responders vilket är en utbyggnad av respond_with i Rails 3. Lite rörig föreläsning men med många intressanta projekt, kommer speciellt hålla koll på Devise.

Jag har sedan jag bloggade om MongoDB första gången varit intresserad av projektet och nu fick vi verkligen en bra genomgång av 10gen’s Michael Dirolf.

Översikt av MongoDB:

  • Atomiska operationer per dokument (:$push)
  • Dynamiska frågor
  • Hög prestanda (10% långsammare än memcached, snabbare än CouchDB)
  • Master/Slave failover
  • Auto-sharding (snart)
  • Servern har en JavaScript parser

Mobile Web Apps with Rails 3 (Yehuda Katz, @wycats)

Yehuda Katz på Frozen Rails

Även om jag sett föreläsningen tidigare (Efter Philly ETE, Emerging Technologies for the Enterprise) så var det bra att få se den live så att säga.

Några av punkterna som Yehuda berörde:

  • HTML 5 LocalStorage (samt Offline API)
  • Föredra gammal data
  • HTML == static asset
  • Betrakta webbläsaren som en API-klient
  • “Sip, don’t gulp”

Projekt:

Cucumbered (Joseph Wilk, @josephwilk)

Frozen Rails Cucumbered
(Foto: Chris Comella)

Den bästa föreläsningen på hela konferensen stod Joseph Wilk för, ämnet var Cucumber och mer specifikt hur man ser till att testerna går så fort som möjligt. (Cucumber 0.7 är för övrigt så galet snabb att det inte ens är roligt nu när de bytt från TreeTop till Ragel)

Några av Josephs punkter:

  • Cukover vs. Autotest
  • Harmony (Frontar Trace/SpiderMonkey i Ruby)
  • cucumber –format

CouchDB on Rails (Jonathan Weiss, @jweiss)

Jonathan hade ett digert uppdrag framför sig då konferensdeltagarna direkt jämförde allt med hur det fungerar i MongoDB. Tyvärr var exemplen lite för enkla och visade inte riktigt på styrkan i CouchDB, snarare att det är “svårare” att ställa enkla frågor än med SQL då man måste implementera map/reduce i JavaScript själv. (Vilket är en BRA grej när man gör lite mer avancerade saker)

Några av punkterna:

  • “Built for the web”
  • Skalar bra
  • Inga konstigheter: HTTP, JavaScript, JSON
  • Revisioner (id + rev)
  • Inga collections (på gott och ont)
  • “JavaScript, easier than SQL”
  • Värdet kan vara komplex JSON
  • Nycklarna kan vara arrayer
  • Statiska frågor (map/reduce)
  • Compaction of B-tree via HTTP request (tänker inte ens försöka översätta :)
  • HTTP cache (Varnish) och lastbalansering (HAProxy, nginx)
  • Inbäddad Lucene (Killer feature?)

Rails 3: Tasty Burgers (Carl Lerche, @carllerche)

  • Bundler (Isolation av gems)
  • Möjligt att använda jQuery i Rails!
  • Routern kan nu ha valfria segment, scopes och HTTP verb
  • Rack överallt!
  • rails_upgrade

Perfectionism (Jarkko Laine, @jarkko)

Priset för den nervösaste killen på hela konferensen måste ha gått till Jarkko. Förutom detta var det en grym sista föreläsning om hur vi perfektionister ofta har problem med att skeppa något innan det är helt perfekt. (vilket det kanske aldrig blir) Han rekomenderade även boken The Cluetrain Manifesto (hela bokens text)

Perfection, Minimally Viable Product, Markets are conversations, Ship!

Oh, hela konferensen filmades så när filmerna dyker upp på nätet så länkar jag dem här.

Athega sponsrar Nordic Ruby

Nordic Ruby

I slutet av maj kommer några av oss att befinna sig i Göteborg för att delta i konferensen Nordic Ruby. Under två dagar hålls föreläsningar om så vitt skilda ämnen som den dokumentorienterade databasen MongoDB, spelmekanik, en introduktion till maskininlärning samt metaprogrammering i Ruby.

Hoppas att vi syns där!

Att ta sig in i Zonen som systemutvecklare

Jag har skrivit denna bloggpost utifrån mitt eget perspektiv som systemutvecklare, men jag hoppas att även andra kan ha nytta av det jag skrivit.

Zonen eller “The Zone” är den tid då man glömmer bort tid och rum, när man kan arbeta med ett problem och komma fram till en lösning utan onödiga avbrott. För min egen del inträffar denna oftast sent på natten.

Förebyggande

Sov

Jag tycker att det absolut viktigaste när det kommer till förebyggande åtgärder är att sova tillräckligt. Hur länge man sover är inte speciellt viktigt, bara man sover effektivt.

Att skaffa en bättre säng (utvald baserat på min längd, vikt och sovstil) samt ergonomiska kuddar har gjort underverk för min nattsömn.

Ät ordentligt!

Det har sagts tidigare och det tål att sägas igen, frukosten är det absolut viktigast målet på dagen.

Jag märker direkt att jag inte är lika skärpt om jag inte ätit en ordentlig frukost, redan där har man “slösat bort” halva arbetsdagen.

Jag äter oftast lunch ute på restaurang då det blir ett distinkt avbrott i arbetsdagen, detta gör att man återkommer till sina arbetsuppgifter med nya ögon och ökad energi.

Sandwiches with milk

Klättra

Min stora passion just nu är att klänga på stenblock, en sport (Bouldering) där man tävlar med och mot sig själv. Oavsett vilken sport det är man utövar så anser jag att det är mycket viktigt att bli fysiskt utmattad för att må riktigt bra samt förbättra sin arbetsprestation.

Vidare läsning

Rensa skrivbordet

Något jag hela tiden har förespråkat i mitt privatliv likväl arbetsliv så är det att ju färre prylar man har runt omkring sig desto mindre är chansen att man distraheras. Därför försöker jag hålla mitt skrivbord så tomt som möjligt, för att sedan under korta perioder belamra det med de anteckningar, dokument och böcker som rör mitt nuvarande arbete.

Athega, My desk

Vidare läsning

Diska

Att göra något så tråkigt som att diska får mig direkt att börja fundera på annat, ofta relaterat till något problem jag försökt lösa tidigare under dagen.

Irritationsmoment

Minimera antal irritationsmoment

Jag har för vana att skriva startscript för de olika projekt jag arbetar med så att jag snabbt och enkelt kan komma igång och jobba på morgonen, de startar oftast min texteditor (TextMate) och drar igång en eller flera servrar. (Thin, Apache/Passenger)

Ett annat litet irritationsmoment är strömförsörjningen till laptopen, laddare till mobilen, osv. Detta löser jag genom att ALLTID ha ett 3-vägs grenuttag på skrivbordet bredvid skärmen. Jag har även en extra eladapter hemma så att jag slipper packa upp den jag har i väskan.

Stäng ner IM-klienten

Ett bra och relativt självklart tips är att stänga ner IM-klienten. Nuförtiden använder jag nästan uteslutande chatten i GMail för att hålla kontakten med mina kollegor och andra utvecklare, detta gör att jag undermedvetet flyttar över det mesta av chattandet till de tillfällen då jag kollar min mail. (Jag har självklart ingen mailklient igång som kan störa)

Passiv kommunikation som Twitter är att föredra framför IM då man själv styr över vilka tillfällen man aktivt deltar.

Under tiden du arbetar

Omgivning

Det är viktigt att man har en bekväm arbetsmiljö, vad som är bekvämt varierar självklart och man ska vara uppmärksam på detta. Under vissa perioder står jag upp (Höj och sänkbart skrivbord) och någon gång ibland tycker jag att det bästa sättet att ta sig in i Zonen är att sitta i soffan (helt oergonomiskt) med laptopen i knät och hacka kod. Övergripande är att få tid till att vara helt för sig själv. (Förutom planerade sessioner av parprogrammering och KORTA möten)

Vidare läsning

Stäng av datorn

Något av det bästa jag kan göra för att komma in i Zonen är helt enkelt att stänga av datorn. (Eller inte fullt lika drastiskt, flytta sig från datorn)

När jag har oklara krav, dåligt med idéer eller helt enkelt kört fast av någon annan anledning så brukar jag ta fram penna och papper och börja skissa. (Gillar att använda PILOT Fineliners och linjerade A5-kollegieblock)

Det är ofta enklast om man inte är så precis i det man ritar, om det är vyer man arbetar med så räcker det fint att rita fyrkanter och andra geometriska former.

Jag brukar skissa rätt grovt och sedan annotera med pilar kors och tvärs, ofta kommer jag fram till vad som fungerar och inte fungerar innan jag hunnit tillbaka till datorn. Det är oftast mycket lättare att ta sig in i Zonen om man har en mental bild av vad som ska göras.

Designing a new feature, with jQuery!

Byt arbetstid

Jag har oftast mycket lättare att ta mig in i Zonen på kvällar och nätter, om du är likadan som mig samt har möjlighet så kan det vara en bra idé att lägga om dina arbetstider så att de bättre reflekterar den tid som passar dig bäst.

Det är även naivt att tro man får dubbelt så mycket gjort på 40 timmar jämfört med 20 timmar. Det är den effektiva tiden vi vill maximera, inte den totala arbetstiden. Jobba ALDRIG övertid, det blir ingen lyckligare av.

Lyssna på musik

Jag är en av många som inte kan jobba utan musik, det spelar inte så stor roll vilken genre det är, bara det inte är för “komplicerad” musik.

För min egen del betyder det att jag lyssnar på mycket minimal tech, ambient eller psytrance, när jag väl är inne i Zonen så lyssnar jag knappt på musiken, den blir snarare ett filter mot omvärlden. (Helst ska man ha ett par stora
hörlurar på sig, då noterar folk att man inte hör vad de säger)

Som ett litet incitament så belönar jag de två bästa kommentarerna till denna bloggpost med varsin invite till Spotify. Det enda kravet är att du skriver lite kort om hur du tar dig in i Zonen.

Vidare läsning

MongoDB

MongoDB - Scalability/Performance - Depth of Functionality

MongoDB är en blandning av nyckel-värde databas (t.ex. Scalaris), dokumentdatabas (t.ex. CouchDB) och relationsdatabas (t.ex. MySQL).

Den är skriven i C++ och passar bra för realtidsanalys av webbstatistik
(sidvisningar, unika besökare, osv), Sessionsobjekt, Datacachning och mycket mer.

Den har inbyggd replikering, automatisk failover och sharding, hög prestanda och den är open source.

Internt så sparas datan i formatet BSON, vilket är JSON med ett datumformat och möjlighet att spara binärdata.

Installation

Jag kommer som vanligt att använda Mac OS X och Ruby men det finns förkompilerade paket för de vanligaste operativsystemen:

  • OS X 32 bit
  • OS X 64 bit
  • Linux 32 bit
  • Linux 64 bit
  • Windows 32 bit
  • Solaris i86pc (EXPERIMENTAL)

Det finns även bindningar till ett flertal olika språk, dock har jag inte sett någon för .NET

Installationen var helt smärtfri, bara att ladda ner senaste tarbollen (mongodb-osx-x86_64-0.9.5) och packa upp den på valfri plats.

Man behöver skapa en datakatalog (standard är /data/db) och sen starta servern med

./mongod --dbpath [DATAKATALOGEN]

Nu lyssnar databasen på port 27017 och det finns ett webbgränssnitt på port 28017.

På Rubysidan behövde jag bara installera paketet mongodb-mongo från GitHub med RubyGems:

sudo gem install mongodb-mongo

Dags för lite kod

Att ansluta till databasen:

#!/usr/bin/env ruby
 
require 'rubygems'
require 'mongo'
 
db = XGen::Mongo::Driver::Mongo.new.db("mydb")

MongoDB har konceptet collections för likartade dokument. (Eller olikartade.. det bestämmer du helt själv) Man kan likna dem vid tabeller.

# Hämtar en collection, den skapas om den inte redan finns
coll = db.collection("testCollection")
 
# Man kan stoppa in olika sorters dokument
coll.insert({ :name => "Peter", :address => { :city => "Stockholm" } })
coll.insert({ :name => "Velociraptor", :top_speed => "25 m/s",
              :can => {
                :open_doors => true,
                :turn_at_any_angle_at_any_velocity => true
              }
            })
 
# Man kan sedan hämta ut datat ur databasen med metoden find_first.
peter  = coll.find_first(:name => 'Peter')
raptor = coll.find_first(:top_speed => '25 m/s')
 
# Man kan även hämta alla dokument i en collection
coll.find.each do |doc|
  puts doc.inspect
end

Vidare läsning

Jag har bara skrapat lite lätt på ytan av allt som går att göra med MongoDB, om du tycker att det verkar intressant så rekomenderar jag följande länkar: