Artiklar skrivna av
Nathalie Sandström

HTML5′s History API kom med pushState vilket kort och gott låter utvecklaren manipulera browser-historiken genom att manuellt peta in URL:ar på historikstacken. pushState är användbart för tillfällen då endast delar av webbsidan behöver laddas om, där det tidigare inte varit möjligt att samtidigt tala om för browsern att byta URL. Med pushState förändrar du URL:en på sidor med dynamiskt innehåll vilket lämnar användaren med en snabbare laddning och fungerande bakåt- och framåtknapp i browsern.

history.pushState(null, "dinosaurs", dinosaurs.html);

Här lägger vi till ett ny historik-post (dinosaurs.html) på stacken och passar samtidigt på att döpa om sidan till ”dinosaurs”.

pjax är ett jQuery-bibliotek som utnyttjar pushState och, som de själva säger, ökar browsingupplevelsen – nothing more.

pjax kan implementeras på ett flertal sätt, här följer ett:

<script type="text/javascript">
    "#nav change": function(el) {
        $.pjax({
            url: el.find(":selected").data("href"),
        	container: "#main"
        });
    }
</script>

<div id="main">
    Hello dinosaurs!
</div>

<select id="nav">
    <option data-href="/home">home</option>
    <option data-href="/dinosaurs" selected="selected">dinosaurs</option>
</select>

I koden anropas funktionen pjax() när användaren byter värde i en select-box. pjax-anropet fungerar i stort sätt som ett vanligt ajax-anrop där det svar vi får tillbaka skrivs ut i den main-container vi plockar ut med selektorn "#main".

Det som slutligen, implicit och per default, sker är ett anorp till pushState där vi lägger till URL:en på stacken. Anropet ser ut något i stil med:

history.pushState(null, $(data).filter('title').text(), '/dinosaurs')

Ett smidigt sätt att öka upplevelsen för användaren.

Vill du labba med pjax hittar du koden här och för ett hands-on-exempel kan du titta närmare på den här koden.

Maven, som tillämpar en livscykelbaserad ansats, kommer med en tydligt fördefinierad bygg- och distribueringsprocess där användaren endast behöver lära sig ett litet antal kommandon för att bygga sin artefakt. I POM:en talar vi om hur projektet ska se ut och vad det ska innehålla. Här definierar vi upp hur projektet paketeras och vilka beroenden det har. Hur Maven sedan hanterar projektet när det utför sitt jobb bestäms genom mål (goals) knutna till ett gäng bestämda faser (phases) i olika livscykler (lifecycles).

Kort och gott innebär detta att du, när du kör ett Mavenkommando, talar om för Maven att gå igenom ett antal faser och att exekvera de mål som hör till varje fas.

Illustration över Mavens olika nivåer
Illustration över Mavens olika nivåer

Maven har tre inbyggda livscykler:

  • default (även kallad build) som hanterar deployment
  • clean som sköter rensning av projekt
  • site som hanterar projektdokumentering

Var och en av dessa cykler innehåller ett antal faser som representerar ett specifikt steg i cykeln. Exempelvis innehåller defaultcykeln fasen compile som ansvarar för kompilering av källkoden. Trots att varje fas har en specifik uppgift kan sättet den utför sin uppgift på variera då det är de mappade målen som i slutändan bestämmer vad som faktiskt sker. Vilka mål som knyts till vilken fas bestäms dels och framöverallt genom sättet artefakten paketerats men också genom de plugins som sugs in i projektet.

Som bilden ovan visar kan ett mål kan vara knutet till ett, flera eller inga faser precis som en fas kan innehålla noll eller flera mål. Ett fristående mål kan exekveras utanför livscykeln samtidigt som ett mål mappat mot flera faser körs en gång för varje mappning. Faser innehållandes multipla mål exekverar dessa i samma ordning som de deklarerats i POM:en. Däremot kommer en fas utan några mål aldrig att exekveras.

Defaultcyklen – för många användare den mest betydelsefulla cykeln då den fungerar som en generell modell för en applikations byggprocess – innehåller sammanlagt 23 faser. Nedan listar jag de mest framträdande av dessa:

Validate
Bekräftar att projektet är korrekt och att all information som behövs för att slutföra ett bygge finns tillgänligt.

Compilie
Komplilerar källkoden.

Test
Testar den kompilerade koden mot uppsatta tester.

Package
Paketerar den kompilerade koden till ett distribuerbart format (exempelvis .jar).

Integration-test
Om så är nödvändigt läggs den paketerade koden ut i en miljö anpassad för att köra integrationstester i.

Verify
Kör uppsatta kontroller för verifiering av paketets giltighet samt kontrollerar att paketet möter alla kvalitetskriterier.

Install
Installerar paketet i det lokala repot och kan nu användas som ett beroende i andra projekt lokalt.

Deploy
Kopierar det slutgiltiga paketet till ett remote repo för delning med andra projekt och utvecklare.

Utöver dessa faser tillkommer mellanfaser vilka bland annat hanterar förberedelser som att kopiera och flytta resurser till rätt kataloger samt post-process-steg som att städa upp efter körda tester. Här hittar ni den kompletta listan över faser.

Att skapa och kanske framförallt bibehålla en schyst, begriplig struktur när man kodar JavaScript kan vara en besvärlig uppgift. Stora, dynamiska webbprojekt innebär ofta en stor, JS-tung kodbas som – allteftersom funktionaliteten utökas – kan bli mer och mer svårhanterlig. Koden saknar många gånger organisation, sprids ut och kan i slutändan leda till onödigt invecklad kod som blir svår att underhålla och utöka.

JavaScriptMVC (JMVC) är ett open source-ramverk med motivationen att hjälpa dig som klientutvecklare att bygga strukturerade, skalbara JavaScript-applikationer av hög kvalitet. Byggt ovanpå jQuery erbjuder JMVC en samling best-practices och verktyg där man plockat ut det bästa från jQuery i avsikt att bringa ordning i röran: jQueryMX, StealJS, FuncUnit och DocumentJS. Läs mer >>

På Cygni använder vi Google Apps för en stor del av all kommunikation: e-post, kalendrar, wiki, kontakter o.s.v. vilket fungerar grymt. Kalenderbiten är en viktig del och personligen har jag ett tiotal olika kalendrar – egna som andras, privata som arbetsrelaterade – kopplade till mitt konto. I kombination med detta kör jag iPhone, både privat och på jobbet, och ser det som en nödvändighet att kunna nå och editera mina kalendrar från den enheten.

Det finns redan mängder med tutorials över hur man sätter upp Google-konton på sin iPhone men jag har upplevt det aningen problematiskt att synka multipla Google-kalendrar och tänker mig att detta inlägg får fungera som en steg för steg-guide över hur jag fick till synkningen. Jag har en iPhone 3GS med iOS 5 och använder mig av Google Sync för synkronisering.

Har du inte redan satt upp ett Google-konto på din iPhone följer du dessa steg:

  1. Under inställningsmenyn på din iPhone väljer du E-post, kontakter, kalendrar
  2. Lägg till konto
  3. Välj att skapa ett Microsoft Exchange-konto (vilket är det protokoll Google Sync använder vid synkronisering till iPhone)

Add Microsoft Exchange account

  1. Under E-post fyller du i din fullständiga e-postadress
  2. Lämna domänfältet tomt
  3. Fyll i din fullständiga e-postadress under Användarnamn
  4. Skriv in lösenordet för ditt Google-konto
  5. Klicka på Nästa
  6. När fältet Server poppar upp fyller du i m.google.com
  7. Klicka på Nästa
  8. Välj vad du vill synka (denna guide kräver att du åtminstone väljer att synka kalendrar)

Account information

Setup av synkroniseringen är nu klar och beroende på vad du i steg 11 valde att synka kommer det nu att pushas ut information till din iPhone.

Med Google Sync kan du synka upp till 25 kalendrar på din iPhone vilket man enkelt ska kunna sätta upp genom att surfa in på http://m.google.com/sync och logga in på sitt konto. Här stötte jag dock på problem. Sidan talade om för mig att Google Sync tyvärr inte kunde stödja min enhet eftersom jag var tvungen att ha iOS 3 eller senare – något som jag uppenbarligen hade då jag precis uppdaterat till iOS 5.

Efter en tids undersökning kunde jag konstatera att detta var en bugg fler användare upplevt och en konsekvens av att Google Sync befinner sig i ett beta-stadie. Sajten kräver att sidan presenteras på engelska och det du behöver göra för att komma runt problemet är att byta språk från svenska till just engelska enligt nedan steg:

  1. Med din iPhone, surfa in på http://m.google.com/sync
  2. För att ändra språk klickar du på länken Byt språk (jag valde English (UK))
  3. Sidan laddas om och du har nu möjlighet att logga in. Gör detta genom att klicka på Sign in with your Google Account
  4. Du möts nu av de enheter du har satt upp ditt Google-konto på och genom att klicka dig in på de olika enheterna kan du välja exakt vilka kalendrar du vill synka

Sync devices

  1. Efter att ha valt vilka kalendrar du vill synka och klickat på Save är du klar

När du nu lägger till, editerar eller tar bort händelser i dina kalendrar kommer dessa speglas på alla enheter du synkat enligt ovan steg – detta gäller självfallet oberoende av om du gör förändringarna i kalendern på din iPhone eller i webbgränssnittet på din dator.

Devices synced

Du har just klickat dig in på den första delen i min samling artiklar om Python – detta dynamiska högnivåspråk som både jag, många andra utvecklare samt organisationer som Google och YouTube tycker är grymt att utveckla i. I de kommande artiklarna tar jag upp bakomliggande filosofier, egenskaper hos språket, hantering av datatyper och allmänna tips och tricks som kan vara till hjälp för dig som är ny i språket. Läs mer >>

Ibland kan det vara skönt att inte uppfinna hjulet en gång till, att låta någon annan göra jobbet och ägna sin tid åt viktigare saker. Ibland kan det vara skönt att gå till plugins.jquery.com och inse att det du vill göra i jQuery redan är gjort och det, handen på hjärtat, många gånger bättre än vad du själv hade lyckats med. Att använda ett jQuery-plugin kan spara dig mycket tid och arbete då alla jQuery-funktioner du skulle behöva leta upp och använda redan är samlade och ihop-pusslade.

Utifrån ett webbprojekt signerat Cygni, listar jag i den här artikeln fem jQuery-plugins som vi valt att använda oss av.  Jag ger en introduktion till pluginet, beskriver lite kort hur det fungerar och ger sedan exempel på var och hur det används i det projekt vi här kan kalla SiteDoe.

Läs mer >>