Posted by orre | Posted in howto | Posted on 09-01-2010
0
PHP är ett programmeringsspråk som är väldigt förlåtande och tillåter programmeraren att skriva lite hur denne vill. Det går att skriva procedural (koden körs steg för steg från början tills slutet) likväl som äkta objektorienterad (OO) kod. Även OO går att skriva i olika nivåer, allt från klasser som egentligen bara är funktionshållare, och därmed inte har någon egentlig mening (förutom för att eventuellt ha ett namespace om det finns kollisioner), till arv, implementera intefaces o.s.v.
Jag tänkte i denna serie med poster (återstår att se hur många det blir) ta upp hur jag anser att PHP bör skrivas för att vara så tydligt som möjligt så att även andra kan ta över koden utan något större problem.
1. Skilj på vad som är en entitet och vad som är en service-klass
- En Entitet är ett objekt som har ett tillstånd (state). T.ex. ett User-objekt eller ett GuestbookPost-objekt.
- En Service är ett objekt som inte har något tillstånd (state) och utför saker (algoritm). T.ex. ett UserMapper-objekt eller GuestbookPostMapper-objekt.
Ett User-objekt är t.ex. en användare som skriver i en gästbok. Denna användare har ett tillstånd (namn, mailadress etc) och ett GuestbookPost-objekt är en post i en gästbok och har också ett tillstånd (rubrik, text, id på användaren som skrivit inlägget, datum etc.).
Ett UserMapper-objekt är en service som skapar användare när de registrerar sig för att skriva i gästboken och hämtar även användare för att skriva ut författarens namn vid ett gästboksinlägg. Objektet har antagligen tillgång till en databaskoppling och kan koppla upp och mata in och hämta användarens data där.
Anledningen till att denna typ av sericeobjekt behövs är att PHP är stateless, d.v.s. när en sida laddats klart försvinner alla tillstånd som skapats. För att kunna återskapa dessa tillstånd lagras tillstånden exempelvis i en databas och ovan nämnda serviceklassers jobb är att spara nya och återskapa tillstånd för entitetsobjekt.
2. Statiska och globala objekt
Nej, man använder sig inte av globala/statiska objekt eller skapar service-objekt inuti klasser. Anledningen till detta är att det blir helt omöjligt att sätta sig in i koden om det är någon annan som skrivit den. Klasser vars beroenden inte tydligt syns får vem som helst att sucka och ge upp. Vi kommer till detta längre fram i serien.
3. Struktur på filnamn, klassnamn och klassinnehåll
Döp filerna efter klassnamn, döp klasserna efter vad de är/gör och se till så att en klass enbart har en uppgift! Detta kan ses självklart, men är alltför ovanligt. T.ex. så ska inte klassen UserMapper göra mer än att vara en hanterare av User-objekt. Den ska inte kunna formatera text eller veta hur man kopplar upp sig mot databasen. Filen ska givetvis heta UserMapper.php.
Detta får bli en snabbstart på denna serie, så ska jag till nästa gång ha med lite kod-exempel för att konkretisera bättre.
Posted by orre | Posted in Uncategorized | Posted on 26-11-2009
0
Sen jag senast skrev här har det hänt en del på utvecklingsfronten.
Jag har framförallt satt mig in designmönstret Dependency Injection för att kunna köra unit tests på min kod om det skulle bli aktuellt i framtiden. En annan av fördelarna med DI är att det blir ett väldigt tydligt API och det är enkelt att se vilka beroenden en klass har.
Tidigare använde jag mycket globala/statiska objekt för att smidigt kunna komma åt information och objekt inuti klasser. Men, det ger dolda beroenden som man måste gissa sig till och att göra tester med beroenden av statiska objekt är i stort sett omöjligt.
Att jag gått över till att skriva allt i detta mönster har medfört att jag fått ommöblera (refactor) väldigt mycket kod för vår affiliateplattform. Deadline är om ett par veckor, det borde gå ändå.
Resultatet är däremot underbart. Bra hierarki bland filer/kataloger och rena, snygga klasser som enbart utför det de är tänkta för.
Jag har blivit ett stort fan av Fabien Potencier som bl.a. ligger bakom PHP-ramverket Symphony. Därav använder jag en Dependency Injection Container han gjort, som är väldigt lättviktig och drar nytta av flera nyheter som kommer i PHP 5.3. Pimple heter denna DIC.

Vidare har jag sneglat lite på jQTouch vilket är ett plugin till jQuery som underlättar (och gör det på ett snyggt sätt) utveckling av webbsidor mot mobila enheter, framförallt riktiat mot Android och iPhone.
Vi får se om det blir någon web-app framöver. Kanske en portning av GPSFoto.
Jag har för övrigt ett par halv-idéer som kan ha potential att bli något större, men de behöver tänkas igenom lite noggrannare innan jag gör något mer av dem.
Mycket smådetalj i denna post, större tankar och planer kommer framöver.
Posted by orre | Posted in howto | Posted on 10-07-2009
3
På kvällarna har jag lekt lite mer med Prowl som jag tidigare skrev om och när jag tänkte göra en php-klass som kunde skicka meddelanden upptäckte jag att någon redan gjort det.
Jag har satt upp ett par bevakningar på ett par av våra servrar så det rapporterar till mig med jämna mellanrum om allt inte står rätt till. Riktigt smidigt och lite mer stressande än om det kommer ett email med samma info.
Push Notifications passar inte till allt, men till saker som är akuta anser jag att det är ett perfekt sätt att upplysa berörd person.
Jag har tidigare sagt att jag skulle sätta mig och göra ett plugin till WP för att lära mig hur det är uppbyggt och för att se vilka hooks som finns tillgängliga.
Så, jag slängde ihop ett plugin till WP som skickar notiser via Prowl och därmed Push Notifications när någon kommenterar en post i en wordpressblogg. Det fungerar bara om kommentaren automatiskt godkänns (det beror lite på inställningarna på installationen) och det inte är författaren själv som kommenterar. (på min blogg godkänns inte första kommentaren av en ny besökare, men efterföljande).
Det finns säkerligen ett par buggar, men jag har försökt att hålla den så enkel som möjligt, och det är egentligen mer gjort i utbildningssyfte för mig själv och lite POF att Prowl gjort något som kan bli stort framöver, än att vara ett nyttigt verktyg.
Vill ni prova, följ guiden nedan. Observera att ni måste köpa programmet Prowl i AppStore och skapa en användare.
INSTALLATION
1. För att installera, ladda ner denna zip-fil, packa upp och lägg katalogen i wp-content/plugins/.
2. Gå till http://code.google.com/p/php-prowl/ och ladda ner php-prowl.zip och packa upp lokalt.
3. Kopiera in class.prowl.php till katalogen comment_to_prowl i wp-content/plugins/ som du gjorde i #1.
4. Aktivera pluginet i admin i WP och fyll i dina loginuppgifter under Settings->Comments to Prowl.
Posted by orre | Posted in howto | Posted on 08-07-2009
0
Nu när Push-Notifications är igång på allvar i iPhones OS 3.0 släpps det en del intressanta program.
Ett av dessa program är Prowl som tar Growl-meddelanden från din dator och skickar dessa via PN till din iPhone.
Så, vad är det som gör detta intressant?
Jo, du kan alltså skicka exakt vilken text du vill till din telefon, när du vill. Growl har nämligen ett extraprogram som heter growlnotify som gör att du kan skicka ut Growl-meddelanden via Terminalen i OS X.
Jag använder detta t.ex. för att rapportera dagens omsättning varje timme :)
Det gör jag genom att varje timme, via crontab, logga in och hämta källkoden till vårt system via curl, rensa bort all onödig kod och skicka ut summan till growlnotify. I Growl har jag sedan ställt in att meddelanden från detta bashkommando ska skickas till Prowl.
Andra bra användningsområden för detta?
Posted by orre | Posted in howto | Posted on 03-06-2009
0
Jag har under några kvällar gjort en webbservice tar tar emot/uppdaterar/presenterar spårningar och geografiska punkter. Detta för ett projekt som jag i framtiden vill göra men som det i dagsläget inte finns hårdvara som klarar av (på ett smidigt sätt).
Och för att prova webbservicen passar det ju utmärkt att Safari i iPhone OS 3.0 har stöd för att ta fram geografiska punkter. Så jag byggde en mycket snygg(!) webapp som startar en ny spårning (= sammanhängade geografiska punkter) och även visa alla spår som hittills sparats. Ett klick på ett sparat spår presenterar detta på en karta.
Enkelt, men ändå kul att kunna testa.
Så, testa gärna om du har en webbläsare som har stöd för GeoLocation. Allt är anonymt, det enda som sparas är punkterna och div. info om dem.
På http://www.orreborre.se/geo_live/view.php visas alla spår och där står instruktionerna.
En lustig slutsats jag kommit fram till är att Safari uppdaterar positionen ca. 3 ggr/s vilket kan lyckas vara lite väl ofta, om man inte reser i ljudets hastighet. Inte svårt att lägga in ett eget intervall, men inget som behövs i detta stadie.
Posted by orre | Posted in howto | Posted on 01-06-2009
2

Jag sitter och går igenom nya poster i Google Reader när jag ser att Safari i iPhone OS 3 ska ha stöd för GeoLocation API. Wow, vilka möjligheter detta ger! Den som är först ut med en annonsmodell som visar relevanta lokala annonser på mobila webbsidor har nog en slant att tjäna.
Kommer jag att göra det?
- Nej, dels för att det är mycket jobb med själva plattformen och dels för att införsäljning av lokala annonser är sjukt tidskrävande.
Men, jag kunde hålla mig att prova om detta verkligen stämmer så jag gjorde lite snabbt en sida som ska (om allt fungerar) ta emot koordinater från webbläsaren och via Google Maps visa en statisk kartbild med en markering där mobilen befinner sig.
Och ser man på, det fungerar!
Prova gärna själva genom att gå in på http://www.orreborre.se/geo/
Se länken till referensdokumentet ovan eller källkoden på min testsida ovan för att ta reda på hur enkelt det är. Och detta fungerar inte i Safari 4 Beta för OS X.
Posted by orre | Posted in Uncategorized | Posted on 11-05-2009
0
Alla som programmerar webapplikationer känner igen dessa steg (ordningen kan dock skilja)
1. Skapa en funktion i en klass som ska ta emot formulärdata
2. Skapa ett formulär där användaren kan fylla i data som ska till (1).
3. Skapa en fil som (2) postar till, och som sedan skickar data vidare till (1).
Det innebär att för varje formulär som görs måste en ny fil göras i (3) för att man ska få någon som helst struktur på det hela. Vidare innebär det då även att någon katalog fullkommligt kommer att svämmas över av filer som bara skickar data vidare (det kanske görs någon sorts validering också).
Säg sen att ett formulär ska ändras och ett nytt fält ska skickas vidare. Det innebär att det måste ändras på 4(!) ställen… Databasen, formuläret, klassfilen och i skicka-data-vidare-filen.
Därför tänkte jag framöver i några steg gå igenom hur jag löst (optimerat) detta så att steg (3) helt försvinner och hur en ändring bara behöver ske i formuläret och i databasen vid en ändring som i exemplet ovan.
Det blir ganska långa poster om detta, men det ska nog dyka upp någon under veckan.
Posted by orre | Posted in howto | Posted on 21-04-2009
0
Vad är dessa bookmarklets det skrivs en hel del om?
Det är egentligen vanliga bokmärken i webbläsaren, men istället för att skicka dig till en vald plats körs någon typ av instruktion istället. Det kan vara allt ifrån att byta bakgrund på webbsidan du är på just nu till att visa en adress i google maps. Små genvägar för specifika uppgifter helt enkelt.
Här kommer några exempel som jag använder relativt ofta.
Rosa bakgrund
Visa markerad text på karta
Validera HTML
Ladda ner YouTube-film
Översätt till svenska
Skapa kort url
Gör om korta url’er till långa
To Twitter – Skicka aktuell titel och url till Tweetie.
För att “installera” en bookmarklet drar du helt enkelt någon länk ovan till din verktygsrad i webbläsaren.
Posted by orre | Posted in socialt | Posted on 07-04-2009
0
När det pågår konversationer överallt blir diskussioner om sociala objekt väldigt fragmenterade. När jag laddar upp en bild på flickr och mina mikrobloggar och bloggar även uppdateras med denna bild kommer det (om nu bilden väcker känslor) att pågå diskussioner om bilden på ett flertal ställen, helt ovetande om varandra.
Många tycker inte att detta är ett problem då de anser att de har olika publik på olika ställen och att diskussionerna därmed utvecklas helt olika.
Jag tycker däremot att det är ett problem, jag vill att alla som tar del av ett socialt objekt (bilden i ovan exempel) ska kunna se vad alla tycker om detta. I alla fall kunna få chansen att veta att det pågår en diskussion någon annanstans.
Så, hur kan lösningen på detta problem se ut?
En lösning är någon sorts universalkonverserartjänst som finns tillgänglig överallt, antagligen genom ett webbläsarplugin eller liknande. Google Friend Connect är på väg åt det hållet, likaså Facebook Connect.
Det jag inte riktigt gillar med denna lösning är att någon stor aktör kommer att äga alla kommentarer.
Ett första steg på en lösning kan vara att kommenterare notifieras, där kommenteraren befinner sig, att en ny kommentar har inkommit.
Om jag kommenterar ett socialt objekt på en blogg meddelas jag via twitter att ännu en kommentar har inkommit. Detta är smidigt då jag ständigt befinner mig på Twitter och jag slipper gå till bloggen för att se om någon svarat på min kommentar. Det finns lösningar som idag notifierar via email, men jag vill hålla min mailbox ren från sånt som egentligen inte hör hemma där.
Nästa steg är att platsen där man vill att diskussionen ska hållas importerar kommentarer från andra platser. Detta har @jonasl löst på ett snyggt sätt på Bloggy.
Det jag egentligen ville säga med denna post var att det numera ligger en post på min todo-lista att börja sätta mig in i hur Wordpress Plugins fungerar och tillverka ett plugin som styr en Twitter-Bot som man tala om för kommenterare att en ny kommentar har inkommit.
Posted by orre | Posted in Uncategorized | Posted on 06-04-2009
0
I dagsläget är det fler och fler som inser att en bra dator är så mycket mer än prestanda på ett papper. Det är inte längre “längst spec för pengarna” som gäller, och jag välkomnar denna attitydändring.
I vårt företag kör nu 4 av 6 med Mac, och en av de två som fortfarande är kvar på Windows är på väg över.
Så, jag tänkte göra denna post till en liten switcher-guide!
Först lite om vad som skiljer OS X från Windows
- Oftast när man laddar ner program är det .dmg-filer. En .dmg-fil är en skivavbild (som t.ex. .iso). När man dubbelklickar på dmg-filen mountas filen som en disk och man kommer åt innehållet. När man är klar unmountar man diskavbilden genom att högerklicka och väljer “Mata ut”.
- I OS X måste man mata ut alla typer av usb-minnen och sånt innan man kan dra ut dem ur datorn.
- När man installerar ett program i OS X drar man bara ikonen till Programmappen. (Det finns undantag)
- Ett program i OS X är en katalog som innehåller alla filer som behövs. I Windows är programmet en fil med massa filer utspridda överallt.
- Samma sak när man avinstallerar ett program, man drar bara ikonen från programmappen till papperskorgen.
- I OS X är programmen inte fönsterbundna. Du kan t.ex. stänga alla fönster i Firefox men programmet är ändå igång.
- cmd+Q används för att stänga program, inte den röda knappen i fönstrets vänstra hörn (den stänger bara fönstret).
- Vill du packa ihop filer till en zip-fil är det bara att markera filerna och högerklicka->Komprimera.
- Att skapa PDF-filer i OS X är enkelt, välj bara “Skriv ut” och sedan PDF som ligger nere till vänster på dialogrutan som kommer upp. Från vilket program som helst.
- Allt ni gjorde i Windows som innefattar Ctrl-knappen är lika i OS X fast med cmd-knappen istället. cmd+c (kopiera text), cmd+v (klistra in text)
Kortkommandon som är bra att kunna
Globala
- cmd+Shift+3 – Ta screenshot på hela skärmen
- cmd+Shift+4 – Ta screenshot genom att dra en yta med musen
- cmd+Shift+4+Space – Ta screenshot på valt fönster
- cmd+h – Gömmer det aktiva programmet (Det försvinner men är igång. Mycket smidigare än att minimera fönster)
- cmd+tab – Växla mellan program (Stor skillnad från windows som växlar mellan fönster)
- cmd+q – Stäng det aktiva programmet
- cmd+w – Stäng det aktiva fönstret i programmet
- cmd+space – Sök med spotlight (funkar även som miniräknare)
I Finder (OS X filhanterare)
- Space – quicklook (Visa filen snabbt utan att öppna något program)
- cmd+backspace – Radera filen
- cmd+nerpil – Öppna markerad fil
- Enter – Byt filnamn
Program som rekommenderas
Om inget annat skrivs är programmet gratis.
Ni kommer att märka att gratisprogram till OS X är riktigt bra om man jämför med gratisprogram till Windows, de är mer välgjorda. Och att det skulle finnas färre gratisprogram till OS X är en myt.
Mailklient
Apple’s inbyggda mail är riktigt bra.
Själv kör jag
Fluid som gör webbsidor till egna applikationer. Jag klickar på ikonen så öppnas min Gmail som ett eget program.
Programmering
Coda (kostar $99 men är överlägset bäst)
Textwrangler (Gratis, men inte lika bra som Coda, dessutom ganska fult)
Dreamweaver (Kostar en slant och är onödigt om man inte håller på mycket med HTML)
RAR-upppackning
OS X packar upp det mesta direkt, men inte rar-filer.
UnrarX
MSN/GTalk/Jabber
För video, kör iChat.
Adium (Tar alla protokoll, men har inte video- eller ljud-stöd)
Mysqlklient
CocoaMysql (En betaversion som är hyfsat stabil)
Filmkonvertering/DVD-rip
Handbrake (Fixar alla format samt rippar DVD’s. Kräver VLC i vissa fall)
Filmuppspelning
VLC (Klarar det mesta)
Perian (Lägger till codec’s till Quicktime så man kan spela upp allt där)
Flip4MacWMV (Ett program från M$ som gör så att man kan se .wmv-filer på webbsidor)
Produktivitet
Quicksilver (Det viktigaste programmet på en Mac. Starta vilket program som helst på 1 sek m.m.)
RapidoWrite (Om du kommer på dig själv med att skriva samma text om och om igen är detta program riktigt bra som ger dig genvägar. Om du t.ex. ofta skriver “Hej, jag är en stekare” så kan du binda ordet “stek” till den texten. Så varje gång du skriver “stek” kommer det att bytas ut mot “Hej, jag är en stekare”.
Fotoredigering
Adobe Photoshop (kostar en slant)
Pixelmator (Grymt gratisprogram som är i klass med Photoshop. Jag som fotograferar en del använder detta, och saknar aldrig Photoshop, alls finns här.)