<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>orres utvecklingsblogg &#187; howto</title>
	<atom:link href="http://dev.orre.io/category/howto/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.orre.io</link>
	<description>utveckling förnöjer</description>
	<lastBuildDate>Sat, 09 Jan 2010 22:27:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OOP med ett tydligt API</title>
		<link>http://dev.orre.io/programmera-php/</link>
		<comments>http://dev.orre.io/programmera-php/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 22:21:31 +0000</pubDate>
		<dc:creator>orre</dc:creator>
				<category><![CDATA[howto]]></category>

		<guid isPermaLink="false">http://dev.orre.io/?p=85</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>PHP är ett programmeringsspråk</strong> 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.</p>
<p>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.</p>
<h3>1. Skilj på vad som är en entitet och vad som är en service-klass</h3>
<ul>
<li>En <strong>Entitet</strong> är ett objekt som har ett tillstånd (state). T.ex. ett User-objekt eller ett GuestbookPost-objekt.</li>
<li>En <strong>Service</strong> är ett objekt som inte har något tillstånd (state) och utför saker (algoritm). T.ex. ett UserMapper-objekt eller GuestbookPostMapper-objekt.</li>
</ul>
<p>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.).</p>
<p>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.<br />
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.</p>
<h3>2. Statiska och globala objekt</h3>
<p>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.</p>
<h3>3. Struktur på filnamn, klassnamn och klassinnehåll</h3>
<p>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.</p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.orre.io/programmera-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prowl och notiser från WordPress</title>
		<link>http://dev.orre.io/prowl-och-notiser-fran-wordpress/</link>
		<comments>http://dev.orre.io/prowl-och-notiser-fran-wordpress/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 09:53:42 +0000</pubDate>
		<dc:creator>orre</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prowl]]></category>
		<category><![CDATA[utveckling]]></category>

		<guid isPermaLink="false">http://dev.orre.io/?p=71</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><strong><img class="alignright size-full wp-image-75" src="http://dev.orre.io/files/2009/07/img_1035.png" alt="Push Notifications" width="320" height="480" />På kvällarna</strong> har jag lekt lite mer med <a href="http://prowl.weks.net/">Prowl</a> 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 <a href="http://code.google.com/p/php-prowl/">redan gjort det</a>.</p>
<p><strong>Jag har satt upp ett par bevakningar </strong>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.<br />
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.</p>
<p><strong>Jag har tidigare sagt</strong> 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.</p>
<p><strong>Så, jag slängde ihop</strong> 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).</p>
<p>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.</p>
<p>Vill ni prova, följ guiden nedan. Observera att ni måste köpa programmet Prowl i AppStore och skapa en användare.</p>
<p><strong>INSTALLATION</strong></p>
<p>1. För att installera, ladda ner <a href="/comment_to_prowl.zip">denna zip-fil</a>, packa upp och lägg katalogen i wp-content/plugins/.<br />
2. Gå till <a href="http://code.google.com/p/php-prowl/">http://code.google.com/p/php-prowl/</a> och ladda ner php-prowl.zip och packa upp lokalt.<br />
3. Kopiera in class.prowl.php till katalogen comment_to_prowl i wp-content/plugins/ som du gjorde i #1.<br />
4. Aktivera pluginet i admin i WP och fyll i dina loginuppgifter under Settings-&gt;Comments to Prowl.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.orre.io/prowl-och-notiser-fran-wordpress/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Prowl, Growl och egna notiser till iPhone</title>
		<link>http://dev.orre.io/prowl-growl-och-egna-notiser-till-iphone/</link>
		<comments>http://dev.orre.io/prowl-growl-och-egna-notiser-till-iphone/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 09:36:28 +0000</pubDate>
		<dc:creator>orre</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[growl]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[prowl]]></category>

		<guid isPermaLink="false">http://dev.orre.io/?p=68</guid>
		<description><![CDATA[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, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Nu när Push-Notifications</strong> är igång på allvar i iPhones OS 3.0 släpps det en del intressanta program.<br />
Ett av dessa program är <a href="http://prowl.weks.net/">Prowl</a> som tar <a href="http://growl.info">Growl</a>-meddelanden från din dator och skickar dessa via PN till din iPhone.</p>
<p>Så, vad är det som gör detta intressant?<br />
<strong>Jo, du kan</strong> alltså skicka exakt vilken text du vill till din telefon, när du vill. Growl har nämligen ett extraprogram som heter <a href="http://growl.info/extras.php#growlnotify">growlnotify</a> som gör att du kan skicka ut Growl-meddelanden via Terminalen i OS X.</p>
<p><strong>Jag använder</strong> detta t.ex. för att rapportera dagens omsättning varje timme :)<br />
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.</p>
<p>Andra bra användningsområden för detta?</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.orre.io/prowl-growl-och-egna-notiser-till-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lite mer GeoLocation för webbläsare</title>
		<link>http://dev.orre.io/lite-mer-geolocation-for-webblasare/</link>
		<comments>http://dev.orre.io/lite-mer-geolocation-for-webblasare/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 22:03:23 +0000</pubDate>
		<dc:creator>orre</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[utveckling]]></category>

		<guid isPermaLink="false">http://dev.orre.io/?p=65</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Jag har under några kvällar</strong> 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).</p>
<p><strong>Och för att prova</strong> 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.<br />
Enkelt, men ändå kul att kunna testa.</p>
<p><strong>Så, testa gärna</strong> 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.<br />
På <a href="http://www.orreborre.se/geo_live/view.php" target="_blank">http://www.orreborre.se/geo_live/view.php</a> visas alla spår och där står instruktionerna.</p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.orre.io/lite-mer-geolocation-for-webblasare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GeoLocation API i Safari för iPhone</title>
		<link>http://dev.orre.io/geolocation-api-i-safari-for-iphone/</link>
		<comments>http://dev.orre.io/geolocation-api-i-safari-for-iphone/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 09:45:03 +0000</pubDate>
		<dc:creator>orre</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[safari]]></category>

		<guid isPermaLink="false">http://dev.orre.io/?p=56</guid>
		<description><![CDATA[
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 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-57" src="http://dev.orre.io/files/2009/06/bild.jpg" alt="GeoLocation" width="320" height="480" /></p>
<p><strong>Jag sitter och går igenom</strong> nya poster i <a href="http://www.google.com/reader">Google Reader</a> när jag ser att Safari i iPhone OS 3 ska ha stöd för <a href="http://www.w3.org/TR/geolocation-API/">GeoLocation API</a>. 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.</p>
<p>Kommer jag att göra det?<br />
- <strong>Nej</strong>, 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.</p>
<p><strong>Men, jag kunde hålla mig</strong> 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.</p>
<p>Och ser man på, det fungerar!<br />
Prova gärna själva genom att gå in på <a href="http://www.orreborre.se/geo/">http://www.orreborre.se/geo/</a></p>
<p>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.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.orre.io/geolocation-api-i-safari-for-iphone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bookmarklets</title>
		<link>http://dev.orre.io/bookmarklets/</link>
		<comments>http://dev.orre.io/bookmarklets/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 20:12:40 +0000</pubDate>
		<dc:creator>orre</dc:creator>
				<category><![CDATA[howto]]></category>
		<category><![CDATA[bookmarklets]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://dev.orre.io/?p=37</guid>
		<description><![CDATA[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. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Vad är dessa bookmarklets</strong> det skrivs en hel del om?<br />
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.</p>
<p><strong>Här kommer några</strong> exempel som jag använder relativt ofta.</p>
<p><a href="javascript:(function()%7Bdocument.body.style.background%20=%20'%23d799af';%7D)();">Rosa bakgrund</a><br />
<a href="javascript:d=%22%22+(window.getSelection?window.getSelection():document.getSelection?document.getSelection():document.selection.createRange().text);d=d.replace(/%5Cr%5Cn%7C%5Cr%7C%5Cn/g,%22%20,%22);if(!d)d=prompt(%22Enter%20the%20address:%22,%20%22%22);if(d!=null)window.open(%22http://maps.google.com?q=%22+escape(d).replace(/%20/g,%22+%22));void%200">Visa markerad text på karta</a><br />
<a href="javascript:void(document.location='http://validator.w3.org/check?uri='+escape(document.location))">Validera HTML</a><br />
<a href="javascript:if%20(document.getElementById('download-youtube-video')==null%20&amp;&amp;%20!!(document.location.href.match(/http:%5C/%5C/%5Ba-zA-Z%5C.%5D*youtube%5C.com%5C/watch/)))%20%7Bvar%20yt_mp4_path='http://www.youtube.com/get_video?fmt=18&amp;video_id='+swfArgs%5B'video_id'%5D+'&amp;t='+swfArgs%5B't'%5D;%20var%20div_embed=document.getElementById('watch-embed-div');div_embed.innerHTML=div_embed.innerHTML+'%3Cbr%20/%3E%20%3Cspan%20id=%5C'download-youtube-video%5C'%3E%3Ca%20href=%5C''+yt_mp4_path+'%5C'%3EDownload%20as%20MP4%3C/a%3E%20(right-click%20and%20select%20%3Ci%3ESave%20'+%20(navigator.appName=='Microsoft%20Internet%20Explorer'?'target':'link')%20+'%20as%3C/i%3E)%3C/span%3E';%7Dvoid(0);">Ladda ner YouTube-film</a><br />
<a href="javascript:var%20t=((window.getSelection&amp;&amp;window.getSelection())||(document.getSelection&amp;&amp;document.getSelection())||(document.selection&amp;&amp;document.selection.createRange&amp;&amp;document.selection.createRange().text));var%20e=(document.charset||document.characterSet);if(t!=''){location.href='http://translate.google.com/translate_t?text='+t+'&amp;hl=en&amp;langpair=auto|en&amp;tbb=1&amp;ie='+e;}else{location.href='http://translate.google.com/translate?u='+escape(location.href)+'&amp;hl=sv&amp;langpair=auto|sv&amp;tbb=1&amp;ie='+e;};">Översätt till svenska</a><br />
<a href="javascript:void(location.href='http://tinyurl.com/create.php?url='+encodeURIComponent(location.href))">Skapa kort url</a><br />
<a href="javascript:void(function(){if(typeof%20jQuery%20==%20'undefined'){var%20s=document.createElement('script');s.src='http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(s);}var%20l=document.createElement('script');l.src='http://www.longurlplease.com/js/jquery.longurlplease.js';document.getElementsByTagName('head')[0].appendChild(l);function%20runIfReady(){try{if($.longurlplease){%20$.longurlplease();%20clearInterval(interval);}}catch(e){alert('sadsda')}};%20var%20interval%20=%20window.setInterval(runIfReady,100);}())">Gör om korta url&#8217;er till långa</a><br />
<a href="javascript:window.location='tweetie:'+document.title+'%20'+window.location">To Twitter</a> &#8211; Skicka aktuell titel och url till Tweetie.<br />
För att &#8220;installera&#8221; en bookmarklet drar du helt enkelt någon länk ovan till din verktygsrad i webbläsaren.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.orre.io/bookmarklets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
