Reklam, reklam

May 6th, 2011

Sitter och tittar på tv-programmet Jobbjägaren på Kanal5.. då det är reklampauser så mår jag illa.. riktigt illa. Känner bara för att blunda och trycka in öronproppar. Vill inte höra! Då tänker jag på.. har den lilla meditationen + yogan jag hållt på med i veckan gett lite effekt kanske? Befinner jag mig i ett litet annat “space”?

Precis samma känsla och illamåeende hade jag över jul senast då jag var hemma och såg på all tv-reklam.. intressant, intressant =) Vem är reklamen till för? köparna eller för företagen själva.. ingen svår fråga förstås.

Solhälsningar, healing och skorpioner

May 4th, 2011

Idag blev det lite meditation och några solhälsningar *klappar mig själv på huvudet* Om jag kan smygstarta så här kanske sommarträning på Yoga i Sala ? =) Den börjar om lite mer än en månad.. i början av året så skulle jag gå en Yogakurs där men det gick inte så bra. Betalade kursavgiften och gick två eller tre gånger och sen rann det ut ur sanden. Har även försökt mig på Aikido i lokala klubben här i staden två gånger men även det har runnit ut i sanden.

Jag lärde mig igår att trots den nya EU-lagen att förbjuda massa örter så är Johannesört redan godkänt vilket är en bra sak iaf. Kom på igårkväll att jag kan dricka av mitt Johannesört-te för att höja upp humöret. Inatt blev det ett stort sådant glas.

Kom på varför det är så slitsamt med c-exjobbet jag håller på med nu; i ungefär ett år har jag laddat det med massa negativ energi. Att jag inte vill göra det, att jag inte vill skriva och bli bedömd att jag skriver totalt kasst som i b-uppsatsen (nej, jag är ingen perfekt författare – jag är bäst på praktiska saker) o.s.v. Så nu har jag laddat och fortsätter ladda med BRA saker samt att jag KAN slutföra det. Ser mig själv på redovisningsdagen och genomför det när det är klart.

Förut så hittade jag två Java-kurser i höst (halvtid, två perioder) som påbyggnad för sommarkursen. Tycker det verkar riktigt intressant och känns rätt faktiskt. Kanske är det Java-programmering jag ska hamna i? Vem vet… :P

Här är en riktigt intressant video som en vän postade på Facebook. Den handlar om att heala trauman som ligger i kroppen eller rättare sagt i hjärnstammen. Lyssna och sug åt dig =)

Healing Trauma in the 4 levels of the Heart

(klicka på bilden för att öppna)

Ikväll ska det flygas en Scorpion tillsammans med Terran Legacy i EVE Online. Ska bli riktigt spännande.. ett nytt skepp som jag inte flygit innan och ett skepp där jag kan ha nytta av mina Caldari-skills. Spana in den här sötnosen (klicka på den för större bild):

Caldari Scorpion

Caldari Scorpion

Framtid vs nutid vs dåtid

May 2nd, 2011

Inatt när jag skulle låg snurrade tankarna en del.. och då kom jag att tänka på energi<->tankesätt. Smaka på det här:

När man har saker som måste göras (men troligen inte en sån stor lust) brukar det vara:

     Jag MÅSTE göra x

Vilket innebär att man tänker i framtid som även oftast ger ångest. Har man läst självhjälpböcker eller gått en kurs har man fått lära sig att det är bättre fokusera här och nu vilket leder till:

     Jag ÄR bra på att göra x

Det är en bättre energi än framtidstänket med ångest och man hamnar i nutid. Jag tycker det känns mer som en peppande sak och inte så mycket känslor. Går man vidare till det tredje steget dock så blir det:

     Jag VAR bra på att göra x

Då hamnar man i dåtid som då man tänker tillbaka på dagen. Den energin tycker jag är mycket skönare och lättare att lägga in känslor. Man kan lägga in känslor som lättnad, känslan då man har gjort nått bra eller känslan att man har utfört något.

Jag tyckte det var intressant den tanken som dök på mig; framtid – nutid – dåtid vs de tre sätten att tänka.

Idag (eller nyss) har jag gjort några solhälsningar – yay! =) Usch vad otränad jag är.. haha.. kanske var det kroppen som igår sa till mig att det var mycket just då och det som gjorde att lusten “pös ur mig”.

Erkännande

May 1st, 2011

Okej.. jag erkänner! Jag är beroende.

Är det en röd tröd i hela mitt liv i stort sett? Det känns som det.. beroende av TV-serier, Film, Äta, Socker, Spel.. men även min gamla vän(?) stamning känns som ett beroende för mig. Är det detta jag valde att gå ner för att uppleva beroende? Något jag inte var färdig med? Jag vet inte.. men jag faller alltid tillbaka till gamla mönster förr eller senare – det vet jag minsann. Många är dessutom verklighetsflykt. Ett perfekt exempel på det är spel som EVE online; går in i en helt annan värld och får chansen att göra så mycket som jag annars inte kan, det är så mycket mer spännande.

Idag när jag vaknade så tänkte jag att nu SKA jag minsann köra lite morgonyoga och laddade upp en del också. Men sen när jag plockat lite så känner jag att lusten försvann som då luften pyser ut ur en luftmadrass. Vad sjutton hände? Jag gjorde en annan bra sak förstås; satte mig ner och mediterade en kort en stund. Yay me! Rak rygg, tumme-pekfinger ihop, handflata upp, skapa en ljusbro av livsenergi; hjärta – kronchrakrat och likadant neråt, bubbla in mig, känna in andningen och bara vara..

Det sista kändes bra iaf.. ett steg i rätt riktning. Nä, det är dags att klättra uppåt nu – MER energi; komsi komsi!

Dagens plan? Nån biologisk energi, lite Eve, skriva c-uppsats, mer Eve (Incursion-op) och sen vet jag inte..

Steg 7 – Slutet

March 27th, 2011

Bygget

Som ni säkert fick höra i steg 6 – fördjupning så hade jag en hel del kritik på JavascriptMVC och p.g.a missar i dokumentation så var det en riktig påfrestande resa att bygga applikationen. När jag väl kom in i hur ramverket fungerade så tycker jag att det funkar väl okej – men absolut inte mer än så.

Som utvecklingsmiljö valde jag Komodo IDE och vad ska jag säga.. det funkar ju *rycker på axlarna* Men jag tycker inte det var överlägset bäst.. att programmet hade  code-completion o.s.v kunde jag lika gärna vara utan därför att det är så extremt sällan jag behöver det i Javascript (stark betoning på extremt sällan). Förmodligen beror detta på att det inte är så många olika funktioner i Javascript. När jag kodar i PHP som har betydligt mer så är code-completion en stor hjälp.

Resultatet

Jag tycker applikationen och layouten blev riktigt bra om man bortser från allt negativa med JavascriptMVC – om det hade varit en annan struktur så hade jag känt att applikationen vore en fullträff samt något att vara stolt över.

I efterhand så insåg jag också att det var overkill att använda en databas som backend.. det hade räckt med att bara använda localstorage därför att 5mb är en hel del. När man skriver in text motsvarade 5mb så misstänker jag att hela ytan är upptagen ändå. Dessutom om det bara hade varit localstorage utan php och mysql så hade det varit mycket smidigare och lättare att lägga upp flera instanser – förmodligen behövs ingen webserver ens.

Lärdomarna

I diket så lägger jag JavascriptMVC för alltid såvida jag inte är absolut tvingad att använda det igen. Ett open source-projekt som detta SKA ha en bra dokumentation. Punkt! Behöver hitta en annan struktur eller designmönster som jag känner är bra – att bara ha en bra OOP-struktur (så gott det går i Javascript) räcker inte för applikationer som har mycket Javascript.

Det var ändå nyttigt tycker jag att kämpa på med någonting istället för att bara dumpa det – en bra sak i arbetslivet där man inte kan få allt som man vill (oavsett om man är anställd eller eget företag).

Javascript och kursen

Jag tycker inte att jag lärt mig så mycket nytt om Javascript i sig vilket är lite av en besvikelse. 3/4 av det som steg 2 – avancerad Javascript bestod av har vi redan gått igenom. Skulle snarare rekommendera för denna kursen och programmet Webbprogrammerare att lyfta ur en del moment ur den första Javascript-kursen till denna RIA-kursen (den första kursen var riktigt avancerad – lite för mycket). Men jag tycker det var kul att skriva en Javascript-applikation där jag kunde välja vad jag ville jobba med.

Citerar kurswebben lite grann:

"JavaScriptMVC är, precis som namnet antyder, ett ramverk för att strukturera
 JavaScriptapplikationer enligt Model-View-Controller-paradigmen. Är du bekväm
 i denna så är JSMVC en het kandidat att bygga din app i!"

.. het kandidat? ehm.. nä, JavascriptMVC ska slängas i en soptunna som dom gör i programmet Plus ;)

Webbnisse

Jag tror det finns få människor som verkligen kan specialisera sig inom ett eller ett fåtal områden när det gäller webben. Om man har ett eget företag så kan man absolut göra det men inte om man är anställd därför att dom har alltid så höga krav att den anställde ska kunna a, b, c, d, e, f.. och gärna g, h, i.. o.s.v. Sen blir det förstås naturligt att man är bättre på en eller några saker.

Redan innan jag började på Webbprogrammerare så hade jag mycket kunskap om PHP/MySQL/Javascript så för mig är det bara naturligt att det är den vägen som jag är bäst på. Jag bygger mer än gärna en applikation med mycket Javascript men det beror också på vad det är för projekt – det är inte alltid lämpligt att ha mycket av just den smaken.

Steg 6 – fördjupning

March 24th, 2011

Här kommer det =) Blev kanske lite långt (18minuter).. men poppa lite popcorn eller satt på kaffe ;)


( klicka på bilden :P )

Steg 5 – Användargränssnitt

March 18th, 2011

Inre och yttre skönhet

Denna veckan har jag jobbat med både inre skönhet i applikationen i form av omstrukturering men även yttre skönhet i form av lite nytt gränssnitt. Själv så tycker jag att det blev lite bättre och lite renare samt enklare i gränssnittet. Så här blev resultatet:

Dessa saker har ändrats i gränssnittet:

  • Mindre topbar
  • Inga dropdowns
  • Länk (gul) till ändra namn och ny grupp
  • Ikon med länk till en hjälpsida
  • Varje grupp har två stycken actions till höger, inställningar och ny scribble
  • För chrome har nu alla textareaor css-regeln resize:none

Förutom detta så har jag då jobbat med lite omskrivningar av koden. Det jag har gjort är:

  • Alla modeller är statiska
  • Lyfte ur kod ifrån main_controller och skapade ett objekt för grupper

Kan tyckas som en kort lista men främst omskrivningarna tog sin tid som även gav fler fördelar – läs längre ner. Sedan spenderade jag 6 till 7 timmar att testa och försöka få ihop en fin lösning för att flytta en scribble mellan grupper men efter jag lagt ner så mycket tid så hade jag nästan en lösning fast det skulle ha tagit många timmar till för att slutföra så jag avbröt det och tog bort koden. Men om jag skulle implementera en sådan funktion så vet jag nu att då måste man skapa en egen drag’n'drop-funktionalitet med en trigger (dubbelklick eller shift-tangenten t.ex) för override med area-begränsningen (drag’n'drop endast inom gruppen)

Jag satt och testade om jag vid en override bara kunde ändra contraint som redan finns i jQuery Window-pluginet men detta fungerade inte alls. Den inställningen kan bara göras vid initiering och inte efteråt. Sedan satt jag även och testade med jQuery UI’s draggable och droppable men då fick jag problemet att draggable tog över drag’n'drop-funktionen så det inte blev någon begränsning inom gruppen. Det gick inte heller att skriver över specifika funktioner i draggable (drag, start, stop, create t.ex) så att den inte tog hand om drag’n'drop men då slutade droppable att fungera.

Så den lösning som jag kom en bra bit med var att ha egen drag’n'drop via DOM level 2  (kod ifrån en tidigare kurs så jag skrev inte allt ifrån noll) och sen måste man ha events som kan reagera eller beräkna när en scribble har släppts i en annan grupp. Ett alternativ kan eventuellt vara om man kan skapa ett skal för draggable (utan drag’n'drop dock) som är kompatibelt med droppable. Men som sagt; det skulle ha tagit minst lika lång tid till så jag la ner det p.g.a tidsbrist.

När jag skriver detta så trillar det ner en idé till.. :P om man använder draggable + droppable och sen implementerar man en egen constraint-funktion så man inte kan dra utanför en grupp – om man kan avbryta en drag’n'drop i en event i draggable förstås.

Omstruktureringen

Det blev väldigt många fördelar tycker jag med omstruktureringen och främst att lyfta ut koden för en grupp till ett eget objekt. Dessa förbättringar blev det:

  • Ansvaret för en grupp ligger i ett eget objekt istället för i en controller
  • Vid lägga till/ta bort grupp så ändras html-strukturen direkt istället för att rendera om alla grupper
  • Lättare att implementera och hantera funktionaliteten för actions i en grupp
  • Bättre koduppdelning för framtida utveckling
  • Mindre databasanrop då rendering av ny grupp/ta bort grupp sker direkt i html-strukturen

Förutom dom punkterna så gjorde jag även så att då en ny grupp läggs till eller en grupp tas bort så centreras scribbles för dom andra grupperna.

Textareaor

Som jag nämde ovan så la jag till en css-regel så iaf chrome inte skulle automatiskt lägga till resize. Dock så är det en regel specifik för chrome så det är inte någon standard. Det kan vara intressant att skriva hur man löser en sådan sak och det jag fann så finns det främst två stycken lösningar. Den första är:

textarea {
     resize:none
 }

.. och som sagt; bara för chrome. Detta var som det jag valde därför att den andra lösningen skulle betyda att jag måste lägga till events då en scribble ändrar storlek och göra nya beräkningar. Så här ser den andra lösningen ut som är fullt css-kompatibel i alla webbläsare:

textarea {
   width:400px !important;
   min-width:400px !important;
   max-width:400px !important;
   height:400px !important;
   min-height:400px !important;
   max-height:400px !important;
 }

Som synes så specifierar man alltså bland annat min och max-höjd samt anger att reglerna är kritiska att följa (!important).

Tangentbordskommandon

Denna punkten tycker jag låter väldigt intressant och funderade på om det är nått som kan läggas till men sen kom jag fram till att det vore bara ett begränsat antal kommandon man kan lägga till på smidigt sätt så jag övergav den tanken. Om man skulle ha ett snabbkommando för settings i en grupp och då det är fler grupper; hur skulle man bygga snabbkommandon då?

Ajax back and forward

Även denna tycker jag låter väldigt intressant men framförallt nyttigt.. dock inte användbart i min applikationen därför att jag bara har en “sida” som allting lever på.

Dynamisk grafik

Detta är redan något som finns sen i implementationen och främst manipulering av html-dokumentet. Ett exempel är då jQuery UI dialog används så lägger jag in html-koden (en div-tagg) för dialogen i slutet av html-dokuemntet för att sedan låta pluginet sköta magin och göra det till en fin dialog. När användaren sedan är klar (ok eller cancel) så tas div-taggen med dialogen bort ifrån dokumentet.

Avslutning

Jag tycker själv det här projektet blev riktigt bra och med lite mer jobb så kommer jag definitivt att visa upp denna applikationen i min portfölj. Dessutom kan jag tänka mig att det är en användbar applikation i riktiga situationer och inte bara en skoluppgift.

Projektet kan beskådas här och koden finns här (deployment 1.0-mappen som är lite rensad från filer som inte behövs).

Steg 4 – implementation

March 10th, 2011

Slutresultatet

Innan jag börjar att berätta om resan så kommer här två skärmdumpar ifrån slutresultatet:

Så blev det =) Fast du vill säkert testa själv.. eller hur? ;) Studsa hit

Om det blir ett fel ifrån backend så gjorde jag så att felet kunde “blöda igenom” och visas på en “blue screen of death” som kunde se ut så här:

Just denna funktionen tyckte jag blev riktigt bra och väldigt hjälpsam då jag gjorde liten miss nånstans och glömde ett semikolon till exempel. Annars så “fastnar” gärna ett sånt här meddelande och man behöver öppna firebug för att se vad det var som egentligen hände.

Resan

Jaa.. var ska jag börja? Det har varit en kurvig resa genom implementationen vilket beror på brister i JavascriptMVC som jag valde att jobba med. Vanligtvis skulle ha jag ha dumpat ramverket p.g.a såna här brister men denna gången så höll jag envist kvar och genomförde implementationen.

1. Anropa controllers!?

Hur ända in i tusan anropar man en controller då det inte är via vanliga URL’s? Enligt dokumentationen finns det två sätt som man kan göra detta:

//1. Create a new controller directly:
new Todos($('#todos'));
//2. Use jQuery function
$('#todos').todos();

Det första sättet fungerade…. nästan. Controllern skapades men det blev ett javascript-fel med att ett element inte kunde hittas. Så det andra sättet (även kallat short-hand) var det enda sätt som fungerade för mig.

2. Controller init/setup

Så här kan koden se ut för en controller:

jQuery.Controller.extend('MyScribbles.Controllers.Main',
/* @Static */
{

},
/* @Prototype */
{

}

Återigen enligt dokumentationen så i den statiska delen ska man kunna (bör?) ha en init-funktion som har hand om att skapa gemensamma inställningar o.s.v. Problemet var dock att då jag hade det där så slutade shorthand-funktionen (se punkt 1) att fungera vilket gjorde att jag inte kunde anropa controllern alls. Meeen enligt dokumentationen så ska det gå – var det “skit bakom spakarna” eller brister? fortsätt läsa..

3. Vyer

JavascriptMVC har ett inbyggt system för vyer och templates som stödjer flera olika språk. Det jag körde med kallas för EJS och kan se ut på detta sättet:

<div id="<%= divid %>" title="Confirm removal" style="display:none;">
    <p>Are you sure you want to remove the group '<%= group %>'?</p>
</div>

Här kan man se att denna template lägger in två variabler som skickas till vyn (divid och group). Förutom det så är det vanlig HTML-kod givetvis. Man kan också använda javascript-funktioner i en vy så här:

<% for(var n=0; n<groups.length; n++) { %>
    <!-- do something -->
<% } %>

Så när jag glad i hågen jobbade med vyer så fick jag problem när applikationen vägrade att ladda vyn som hette “form_setname.ejs”. Felmeddelandet var bara att filen kan inte hittas. Så jag spenderade cirka 4 (!) timmar med att felsöka detta – kontrollera filnamn, läsa dokumentation och kontrollera sökväg m.m. Till slut så hittade jag orsaken (INTE med hjälp av dokumentation!); en vy kan inte heta nånting med underscore därför att det finns inbyggda regler hur namngivning ska ske som tolkar det helt åt pipskogen.

Denna namngivningen är också sammankopplad med funktionsnamn.. Shorthand-funktionen “my_scribbles_main” blir så p.g.a dessa regler. Det egentliga namnet är MyScribbles.Controllers.Main. Med en hel del tänkande inser jag att namngivning med camelcase blir tydligen avdelat med underscore som “MyScribbles” blir “my_scribbles” vilket betyder att det måste tolkats som att “form_setname” så skulle filen ha hetat “formSetname”. När jag sedan tog bort underscore så fungerade det alldeles utmärkt.

Från design till implementation

Min ursprunliga skiss hur jag skulle implementera gjorde jag med några små ändringar:

  • Ett nytt objekt som heter Scribble (prototype-baserad) för att kunna instansiera och sköta allting som har med en scribble att göra.
  • Ett statiskt hjälpbibliotek till hela applikationen med funktioner för att t.ex visa ett ok/fel-meddelande.
  • Implementerade biblioteket jQuery Window som sköter om en scribble med inbyggda funktioner för fönsterhantering helt enkelt.

Slutsats

Förutom dom tre problemen jag listade under resan så när jag skulle ladda upp projektet till mitt webhotell tänkte jag gå över ifrån development-läge till production. Vad tror ni händer då? SPLATT! Jahopp.. där dog applikationen – bara att fortsätta köra i development då.

Så jag är inte direkt imponerad utav JavascriptMVC p.g.a alla brister där den största är dokumentationen som är rörig och även delvis felaktig. Såna projekt bara SKA ha en riktigt bra dokumentation – punkt slut.

Jag tycker att hela JavascriptMVC-projektet är inte speciellt stabilt och överlag en känsla av; implementera MVC-modell i Javascript bara för att det går. Men jag blev bekant med en väldigt intressant del som jag inte kände till innan, nämligen vyer och templatesystem för Javascript. Så skulle jag göra en rekommendation så vore det att skriv på vanligt sätt med en smart uppbyggnad av objekt och använd sedan någon templatemotor. Jag såg att det finns ett flertal olika projekt och lösningar just för detta.

Först mot slutet av implementationen så kom jag in i ramverket och började känna mig bekväm samt förstod hur det fungerade. P.g.a det så kom jag aldrig in på de andra delar som finns i JavascriptMVC som automatiska tester. Jag vet sen innan att man måste kunna språket och miljön man jobbar med för att kunna skriva tester – annars tar det bara tio gånger längre tid där hälften är slöseri.

Källkod

Den aktuella källkoden som jag strippade på en del onödigt ligger under “trunk/deployment version 1.0″ – visa hos Google Code

Steg 3 – Applikationsidé och design

February 24th, 2011

App, app papegoja?

Jag tänkte att jag skulle gräva ner nosen i JavscriptMVC som ser ut att vara en vettig och intressant sak om man ska bygga en applikation som består av mestadels Javascript och massa AJAX-kommunikation.

Det finns ett flertal olika delar som default med bl.a testning så jag kommer dyka in i grunden och de delar som skickas med. Jag har även kikat på t.ex CouchDB som ser intressant ut men jag väljer att köra på en klassisk MySQL-databas via PHP som levererar data i JSON-format till applikation. Det är  något som jag redan kan vilket betyder jag får mer tid åt JavascriptMVC.

Själv applikationen blir en dela-notes-applikation med PHP och MySQL som backend då. Ingen användarautensiering utan det blir öppet för alla. Specifikation:

  • Javscript med AJAX-anrop (JSON-data)
  • Backend i PHP + MySQL
  • Frontend i JavascriptMVC + jQuery
  • Funktioner (kan komma att ändras):
    - gruppera anteckningar (även grafiskt visa/placera i en grupp)
    - CRUD anteckning(ar)
    - CRUD grupper
    - drag’n'drop av en anteckning
    - byta bakgrundsfärg på anteckning
    - spara namn via kaka eller html5 localstorage

En annan intressant sak som jag tänkt lite grann på vore om man kan exportera/impotera anteckningar eller skapa en synkning ifrån en annan instans – men det är en funktion som får hamna på kanskelistan.

Design

När jag sitter och pysslar med designen så märker jag att jag behöver sätta mig in mer i ramverket JavascriptMVC samt även testa för att förstå mig på det vilket jag ska ta tag i helgen. Dokumentationen är inte helt klockren vad jag sett hitills och den bästa sidan för att komma igång förutom Get Started (en kort tutorial bara) heter Rapid Start.

Men jag har kommit så här långt iallafall:

Intro (controller)
- hämta namn ifrån Modellen User.get (retunerar en sträng eller false)
- visa sidan “skriv in namn” vid false eller till huvudappen om det är en sträng.

Main (controller)
- vid start; hämta alla grupper och gruppernas scribbles samt rendera gränssnitt
- koppla nödvändiga events

User (model ifrån html5 localstorage eller kakor)
- get (retunerar en sträng eller false)
- save (retunerar false eller true)
- update (retunerar false eller true)

Group (model ifrån php->databasen)
- getAll (retunerar en array av objekt eller false)
- save (retunerar false eller id)
- delete (retunerar false eller true)
- update (retunerar false eller true)

Scribble (model ifrån php->databasen)
- getAll (retunerar en array av objekt eller false)
- save(retunerar id eller false)
- delete (retunerar false eller true)
- update (retunerar false eller true)

Mockups

Här är några bilder som jag satte ihop för att få en lite mer grafisk bild hur jag tänkt mig.. gränssnittet kommer med största sannorlikhet att finslipas och förbättras ;)

Så ser det ut ;) Kodskelett m.m finns att kika på här.

Steg 2 – Avancerad Javascript

February 3rd, 2011

TDD och ninjan

Jag hittade en version av boken Secrets of the JavaScript Ninja och började läsa lite i den som en kick-off för steg 2.. I början utav boken står det om TDD och en enkel testfunktion som ser ut så här:

function assert( value, desc ) {
    var li = document.createElement("li");
    li.className = value ? TEST_PASS_LI_CLASS : TEST_FAIL_LI_CLASS;
    li.appendChild( document.createTextNode( desc ) );
    document.getElementById( TEST_RESULT_ID_LIST ).appendChild( li );
}

Så jag blev sugen att testa lite grann med denna och den var riktigt nyttig tycker jag – jag har aldrig jobbat med testdriven utveckling i Javascript innan. Men med en sån funktion kan man göra det väldigt enkelt och som ändå ger resultat.  Följ denna länken för att själv se och testa funktionen.

Ninjan och function properties

Åhå!  Till en funktion kan man spara en variabel (eller property) och det ser jag som en väldigt stor nytta.. tänk scenariot att man har en funktion som ska spara status och vid nästa funktionsanrop använda den sparade statusen. Så istället för att spara till en global variabel eller en variabel för ett helt objekt så sparar man det till funktionen som har ansvaret. Niiiice =)

Som i ninja-objektet ska det sparas gamla steg som har genomförts kan man göra så här:

var ninja = {
     attack:function(steps) {
          // any history array
          if (ninja.attack.history == undefined) {
              // create one
              ninja.attack.history = new Array();
           }

           // save steps
          ninja.attack.history.push(steps);
          ...

Följ denna länken för ett att se och testa koden.

Singleton eller statiskt objekt

Vidare i min resa så läser jag om singleton i boken Pro Javascript Design Patterns eftersom det är nått jag hört om från flera håll.. har för mig nån kurskamrat nämde att nån i kursledningen pratat om singleton också. Men iaf! Det visade sig att jag visste redan var det var.. fast under namnet statiskt objekt.

Syftet med singleton eller statiskt objekt är att det bara ska finnas en instans av det. Tittar man på koden i rubriken ovan så använder jag just det =)

Recursion

Jag använder detta väldigt sällan faktiskt, oavsett programmeringsspråk, men jag vet vad det är och vad man kan göra. Brukar inte springa på situationer där det är användbart.

Men i kursen Webbprojekt II så dök det upp en användbar situation i förra veckan. Det var vid en synkning så söker koden igenom en mapp efter en inställningsfil (xml) men nu skulle en del plugins (eller widgets som vi säger) ligga i en undermapp. Då gjorde jag en liten refactoring i huvudfunktionen och la ut den kod som hämtade xml-filen så att den kan återanvändas. Sen i huvudfunktionen la jag till ett test om det var en undermapp och då kördes en inre loop som sedan kallade den nya funktionen som läste in filen.

Vid närmare eftertanke så kanske inte det är ett praktexemplar i recursion då recursion innebär att funktionen kallar sig själv och iom detta går en nivå djupare.

Men enkelt beskrivit så är recursion en bra sak om man ska skriva en intelligent funktion som ska hantera flera olika möjligheter, om funktionen ska kunna hantera flera nivåer.

Jag brukar istället hamna i situationer med nästlade loopar fast där den nästlade loopen har andra villkor än den yttre loopen – om den inre loopen haft samma villkor som yttre loopen hade man kunnat kalla funktionen igen.

Arguments

Det här visste jag faktiskt inte om i Javascript men jag vet att det finns i många andra språk.. om man skriver ett commandline-program eller ett bash-script så vet jag det är vanligt att man använder arguments för att ta in data och agerar sedan på hur det ska fungera.

Jag skulle vilja säga eller förklara att arrayen arguments är en tvist eller ett annat alternativ mot att en funktion tar en array eller en sträng/värde som parameter.

Ta en kik på koden här eller på JSFiddle.

Ser man på användningen på dom två olika sätten som ändå gör samma sak så är det beroende på kodstil och vad man föredrar. Sätter man ihop en array tidigare i koden så kan det vara fördelaktigare med att funktionen tar en sträng/värde eller en array av strängar/värden. Personligen så tycker jag nog bäst om det sistnämnda därför att då ser man i funktionen vad den har för parametrar och man kan specifiera på ett annat sätt med JSdoc eller PHPdoc.

Namespaces

Det här är en väldigt nyttig sak för javascript så att det inte bli namnkrockar. För javascript så är namnrymder helt enkelt en utökning utav singleton och det ser ut så här:

/* Namespace to put Assassins Brotherhood in */
var AssassinsBrotherhood = {};

/* Create the ninja inside the namespace */
AssassinsBrotherhood.Ninja = {
     // properties of the ninja
     isTrained: false,
     weapons: null,

     // functions that the ninja has
     attack:function(steps) {
          ...
     },

     train:function(weapon, time) {
          ...
     }
};

/* New sub-group/namespace within AssassinsBrotherhood */
AssassinsBrotherhood.Weapons = {};

/* Weapons the ninja has available */
AssassinsBrotherhood.Weapons.Shuriken = {
     // properties
     isSharp: false,

     // functions
     sharpen:function(){
          ...
     }
};

AssassinsBrotherhood.Weapons.Katana = {
     // properties
     isSharp: false,

     // functions
     sharpen:function(){
          ...
     },

     slash:function() {
          ...
     }
};

.. fast i det här exemplet vore det bättre med en kombination av singleton och prototype inheritance eftersom förmodligen vill AssassinsBrotherhood ha fler än en ninja och fler än ett vapen ;)

Prototypes

Såååå fortsättar man på coola gänget Assassins Brotherhood och bygger om till prototypes så blir det detta resultat. Alternativt ta en kik på JSFiddle.

Det jag lärde mig eller inte kom ihåg var att man måste använda  instanceof för att testa om ett objekt är av en viss typ – det funkar inte att använda typeof därför att den retunerar alltid object.

Context, scope och this

Det jag tyckte var nyttigt var att lära sig skillnaden i hur olika typer funkar.. om det är ett singleton så blir scope (this) just det här statiska objektet men om det är en global funktion så blir scope (this) samma sak som window-objektet. Detta blir även en liten fördjupning till min tidigare rubrik “Ninjan och function properties” =)

I det här exemplet eller på JSFiddle så är katana1 ett singleton och där kan man se att det inte blir globalt genom att window.isSharp blir undefined. Medans i katana2 som är en global funktion så fungerar window.isSharp.

Partial applications

Detta innebär att man skapar nya funktioner dynamiskt och sparar parametrarna som skickas till den. John Resig har en bra beskrivning med exempel på sin sida vad detta är för något men det enda jag tänker på är att det känns överkomplicerat. Det bästa en programmerare kan lära sig är KISS – Keep It Simple Stupid ;) Men vem vet.. kanske är det något som jag får användning för senare men som sagt; känns som om jag inte har nån användning för det nu.

Closures

Detta är tätt sammanbundet med context och scope. Det är en funktion med hur Javascript funkar i sig.. Genom closures kan man t.ex binda variabler genom att spara ett inkommande värde och sen skapar man en ny funktion innuti funktion som använder den nya variablen. Detta är en nödvändig sak ibland för att Javascript ska “komma ihåg” variabler. Man kan även använda closures för att skapa privata variabler som då ligger innuti en funktion i funktionen.

Här kommer ett exempel:

function addData(id) {

    jQuery.get('http://www.server.se/get.php?id=5',
        function(data) {
            // here a closure is created in the successfunction
            // that binds the variable id from addData
            jQuery('#'+id).html(data);
        }
    )};

}

// call a function with a parameter to a div
addData('div-tag');

Så det är ett vanligt exempel med hur man gör i jQuery till exempel.. och som bekant är jQuery inget nytt för mig ;)

Prototypal inheritance

A mouthful.. eh? :P Eftersom varje objekt och funktion har en egenskap som heter prototype som är ett tomt statiskt objekt så kan man byta ut detta mot ett annat objekt vilket gör att man kan skapa arv ifrån andra objekt. Säg att vi har en grundklass som heter Person och som har lite nyttiga funktioner som den nya klassen Ninja ska ärva ifrån så kan man göra som i detta exemplet; ta en kik här eller på JSFiddle.

Slutsats

Vad jag behöver komma ihåg och tänka på…. om jag jobbar på ett större javascript-projekt så ska jag komma ihåg att tänka på hur ska strukturen fungera – räcker det med ett statiskt objekt/namespace eller är det objekt som ska kunna instansieras flera gånger?

Jag tycker att det är kul att bygga ihop nån med prototypes och även med arv.. så får klura ut nånting bra där jag kan använda mig av prototypes i projektet för kursen därför att det är inte så ofta att jag kodar ihop nånting där det behövs. Vi använder prototypes nu i vårt webbprojektet men det jag skrev ifrån början så körde vi med statiska objekt.

Generellt sett tycker jag att detta steget har varit en del nytt men mycket har varit repetition med saker som jag kunde eller kände till.