Hallå!
Idag blev det en leveransdag, leverans av LÄSK!
Själv drycker jag inte så mycket läsk just, det blir dock flera kaffe istället! Jag tror att kaffemaskinen är något som bara jag verkligen uppskattar på kontoret.
I alla fall… Så ser kylskåpet ut idag:
All läsk är gratis så klart, samma grej med kaffe, coolt, eller hur?
Imorgon har vi så kallad ”retrospective”, dvs. sammanfattning av det som har pågått de senaste två veckor, då röstar vi även fram den ”bästa” medarbetaren och Johannes fixar oftast fram något litet pris, så idag tänkte jag att jag skulle kanske kunna bidra lite och också ta fram ett litet pris, något till IE-haterZ i alla fall!
Bye!
Tja!
Läget?
Idag har jag bestämt mig att jag skall dubbelkolla, dubbelläsa, dubbel-göra-allt för att annars så blir det så många stav- vad-som-helst-fel och det är ju tråkigt att läsa annars, har till och med installerat den svenska ordlistan till min Firefox, ”hacksit”? Yes sir!
Idag blev det lite sent med scrum (jobbigt), annars så brukar vi ha det vid klockan 09:15.
Idag fick jag läsa lite om Drupal, jag tror (är ganska säker på det) att jag ska utveckla en modul för hemmakanalen (TV4), ett projekt som vi håller på med just nu.
Nu börjar jag fatta lite av det, modul-delen i alla fall.
Sedan hade jag två express-möte, en med Mattias och Mike och en med Fredrik; kunden (bodegashop.com). Resultatet av första mötet blev att jag fick designa databasmodellen för sidan, vilket jag tyckte var en rolig grej!
Annars så har jag försökt att ”twittra” lite, men jag vet inte om det är jag eller twitter men vi passar nog inte ihop så bra… Antingen så blir det väldigt korta, ointressanta twitts, eller så blir det äckliga, felaktigt skrivna ord som jag inte vet vad de betyder. Jag får ge twitter en till chans, det kanske kommer fungera lite bättre i framtiden.
Imorgon skall jag försöka implementera databasmodellen med hjälp av ett Drupal-skript, har aldrig gjort det innan, så Du får hålla tummarna nu fan, haha.
Ha det bra!
Ps. Blev det en semla för Dig också, eller?
Pss. Några bra tips på musik som man kan dra i Spotify när man arbetar i byrån?
Som Du redan kanske vet så har jag börjat arbeta på en webbyrå i Stockholm.
Lite jobbigt var det i början då jag var tvungen att flytta från min kära (NOT!) Kalmar, men det var nog på tiden det alltså, har ju studerat där i 3 år.
Problem med lägenheten hade jag också, men det är nog en default-grej här uppe…
Nu har jag bott här med min flickvän och arbetat på produktion203.se i över ett halvt år nu och jag måste säga att det går upp och ner, men oftast upp, speciellt nu när Magdalena har börjat läsa svenska på SFI och allt går som det ska i byrån.
Jag fick redan arbeta med några stora och några mindre projekt.
Gadyet.dk är en sida som jag fick hjälpa lite (lite, lite, lite, lite) Christian med och bodegashop.com är en sida som jag fick ”fresha upp” lite med ny funktionalitet och html-strukturen.
Nu har jag bestämt mig att jag ska blogga lite, för att det är så ”roligt” att dela med sig.
Ha det bra!
För kanske en timme sedan fick jag e-post från ”The Aptana Jaxer Team” om att ny version av Jaxer har släppts ut.
Det som är nytt och fixat är följande:
- Jaxer.Sandbox: HTTP-level control, support readyState, toHTML, waitForCompletion
- Built-in, extensible dispatching for RESTful and RPC service requests
- Fast, native JSON support
- Improved APIs for HTTP Request and Response
- More flexible handling of application configuration
- Many bug fixes, smaller improvements, and cleanups
Det finns mer faktiskt, men jag vill inte gå igenom det, för att jag inte har tittat på det alls, utan använt mig av ”standard” API funktioner som Jaxer erbjuder.
Jag vill inte fördjupa mig allt för mycket (då det finns risk att jag gör det mer än det behövs) i det hela för mycket för att det verkar ganska stort utan vill hålla mig vid kanten av det hela.
Jag har faktiskt ändrat mig vad det gäller applikationen.
Desktopapplikationen som jag valde visat upp innan, var rolig att utveckla i början, sedan blev det bara tråkigt att hålla på med det.
Därför valde jag att skapa en ”shop”. Först tänkte jag använda amazons API, men det visade sig att det inte var så enkelt… Stor dokumentation, som jag inte förstod.
Därför använder jag mig utav Last.fm API.
Användaren skriver in vilken artists skiva han / hon vill köpa och får fram resultatet.
Genom att dra över bilderna till ”kundvagnen” till höger sparar man de i en temporär tabell i databasen och en lista över varorna i ”vagnen” visas.
Man kan klicka på krysset vid varje vara för att ta bort den.
Dock så måste man vara en inloggad användare för att kunna göra allt det som jag beskrev ovanför.
Inloggningsfönster ser ut på följande sätt:

Efter man har loggad in så kan man börja ”handla”…

Det som är lite tråkigt är att jag inte riktigt har några priser…
Jag skulle kunna auto-generera dem, men hur bra blir det?
Eftersom jag använder just Last.fm API som inte har något med handel att göra så får jag klura ut det på något sätt.
Det som skulle vara fördelen med att använda just Amazon API är att jag inte behövde oroa mig för priser och så vidare… Det skulle kanske även vara roligt att kunna handla de skivor på riktigt, vilket jag inte kan gör nu…
I alla fall… Detta är mycket roligare + att det är också en singlepageapplication, fast det ser kanske bara ut som att det inte är det.
Jag är inte riktigt nöjd med förra inlägget därför väljer jag att beskriva Jaxers databashantering liter mer djupare.
Det är viktigt att notera att just nu så har inte Jaxers API stöd för ORM och allt annat än ren SQL.
Gruppen som utvecklar Jaxer har valt att inte implementera det i BETA versionen.
Managed Access
Enklaste sättet att få databasfunktionaliteten är att använda sig av ”pre-configured”, statisk (icke objektorienterad) API.
Jaxer levereras med en inbyggd SQLite3 databas och en SQLite3 ”driver” samt en MySQL 5 ”driver”.
Den ”defaulta” konfigurationen av Jaxer använder just den inbyggda SQLite3 databasen.
För att enklast få tillgång till databasen så behöver man bara köra lite SQL frågor, till exempel:
Jaxer.DB.execute('CREATE TABLE IF NOT EXIST user (user_id INTEGER PRIMARY_KEY AUTO_INCREMENT, username VARCHAR(45))');
Jaxer.DB.execute('INSERT INTO user(username) VALUES("mikwiat")');
Jaxer.DB.execute('INSERT INTO user(username) VALUES("nisse")');
Jaxer.DB.execute('INSERT INTO user(username) VALUES("karl")');
var result = Jaxer.DB.execute('SELECT username FROM user');
API är ganska så enkel – Jaxer.DB.execute() returnerar en Jaxer.DB.ResultSet.
SQL strängen är obligatorisk.
För att ha tillgång till den senaste radens id så använder man sig utav Jaxer.DB.lastInsertId, eller Jaxer.DB.lastInsertRowId som returnerar ett nummer.
Egentligen så är det så här:
Jaxer skapar en (per en Jaxer process) uppkoppling mot databasen som är specifierad i filen config.js och använder denna för att exekvera förfrågor mot databasen och returnera data som Jaxer.DB.ResultSet.
Detta kallas för en ”managed access” för att uppkoppling hanteras automatiskt av Jaxer – den öppnas automatiskt, stängs (beroende på inställningar) automatiskt efter varje förfråga, för varje sida eller efter servern stängs när. Eftersom uppkopplingen innehåller ingen annan data än Jaxer.DB.lastInsertId, eller Jaxer.DB.lastInsertRowId så är den säker.
Om man vill att denna ”Managed access” skall bli konfigurerad på ett annar sätt så öppnar man config.js filen och ändrar i den, den ligger i jaxer_local katalogen.
Som jag nämnde förr så levereras Jaxer med två stycken ”drivers”, en för MySQLite3 och en för MySQL 5.
Om man vill så kan man konfigurera dem hur man vill, här är ett exempel för MySQLite3:
Config.DB_IMPLEMENTATION = 'SQLite'; Config.DB_CONNECTION_PARAMS = { PATH: 'c:\\sokvag\\till\\min\\fil.sqlite', CLOSE_AFTER_EXECUTE: false, // stänger uppkoppling efter exekvering av Jaxer.DB.execute() (ej obligatorisk) CLOSE_AFTER_REQUEST: true, // stänger uppkoppling efter varje request (ej obligatorisk) MAX_NUM_TRIES: 100, // om raderna är låsta, upprepa så många gånger (ej obligatorisk) MILLIS_BETWEEN_TRIES: 37 // antal millisekunder mellan varje försök (ej obligatorisk) };
och här är ett för MySQL 5:
Config.DB_IMPLEMENTATION = 'MySQL'; Config.DB_CONNECTION_PARAMS = { HOST: '127.0.0.1', PORT: 3306, // serverns port NAME: 'schema', // namnet av databasen USER: 'root', // användarnamnet PASS: 'pass' // lösenord };
Dynamisk, konfigurbar Access
Om man behöver något mer flexibet än en ”pre-configured”, ”managed” uppkoppling mot databas så kan man faktiskt välja att använda den dynamiska Jaxer DB API:et.
För att göra det så skapar man enklast ett objekt och anropar dess metoder, till exempel (MySQLite):
var connection_parameters = {PATH 'c:\\sokvag\\till\min\\fil.sqlite'}; Jaxer.DB.SQLite.createDB(connection_parameters); // behövs då databasinstansen inte existerar var connection = new Jaxer.DB.SQLite.Connection(connection_parameters); connection.open(); connection.execute('CREATE TABLE IF NOT EXIST user (user_id INTEGER PRIMARY_KEY AUTO_INCREMENT, username VARCHAR(45))'); connection.execute('INSERT INTO user(username) VALUES("mikwiat")'); connection.execute('INSERT INTO user(username) VALUES("nisse")'); connection.execute('INSERT INTO user(username) VALUES("karl")'); var result = connection.execute('SELECT username FROM user'); connection.close();
Liknande ser det ut för MySQL 5:
var connection_parameters =
{
HOST: '127.0.0.1',
PORT: 3306, // serverns port
NAME: 'schema', // namnet av databasen
USER: 'root', // användarnamnet
PASS: 'pass' // lösenord
};
Jaxer.DB.MySQL.createDB(connection_parameters); // behövs då databasinstansen inte existerar
var connection = new Jaxer.DB.MySQL.Connection(connection_parameters);
connection.open();
connection.execute('CREATE TABLE IF NOT EXIST user (user_id INTEGER PRIMARY_KEY AUTO_INCREMENT, username VARCHAR(45))');
connection.execute('INSERT INTO user(username) VALUES("mikwiat")');
connection.execute('INSERT INTO user(username) VALUES("nisse")');
connection.execute('INSERT INTO user(username) VALUES("karl")');
var result = connection.execute('SELECT username FROM user');
connection.close();
Eftersom det är användaren som hanterar uppkopplingar så har man ingen större behov av CLOSE_EFTER_EXECUTE samt CLOSE_EFTER_REQUEST parametrar.
Man skall även inte glömma att connection_parameters är ”case-sensitive”.
Förfrågor som returnerar data
När man skall hämta data ur databasen så använder man sig utav en SELECT SQL-fråga som skickas till databasen med hjälp av execute() metoden som returnerar en resultat av typen Jaxer.DB.ResultSet, det nämnde jag förr.
Objektet innehåller all data som returnerades från databasen efter förfrågan, så man kan använda den efter uppkopplingen stängs ner och det ändras inte även om datan har blivit ändrat i databasen.
Resultatet erbjuder användaren att nå dess data på olika sätt.
Enklaste sättet är nog att komma åt data med hjälp av row egenskapen, vilken är en array av objekt, en per varje rad.
TIll exempel:
var result = connection.execute('SELECT username FROM user'); var first_username = result.rows[0].username; // i detta fall returneras 'mikwiat'
Om man vill få reda på antalet rader som returnerades från databasen så använder man helt enkelt rows.length, till exempel:
var result = connection.execute('SELECT username FROM user'); var number_of_returner_rows = result.rows.length; // returnerar '3' i detta fall
Om man vet att SQL-frågan kommer att returnera bara en rad, eller om man bara vill ha en rad av resultatet så kan man använda sig utav egenskapen singleResult, till exempel:
var single_result = connection.execute('SELECT COUNT(*) AS count FROM user').singleResult;
Den returnerar alltid null om det inte finns någon data i resultatet.
Om man vill kolla om resultatet innehåller någon data, och sedan returnera den så gör man på följande sätt:
var single_result = connection.execute('SELECT COUNT(*) AS count FROM user').singleResult; if(single_result.hasData) { return single_result; } else { return 'no data'; }
Jag tänker faktiskt inte ge mig in på datatyper, om man vill så kan man läsa mer om det här.
Jag har även märkt att texten på denna sida innehåller en del stavfel, samt fel i koden, men har mailat supporten, får se vad de svarar :)









