<?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>qvister &#187; Blogg</title>
	<atom:link href="http://qvister.se/blogg/feed/" rel="self" type="application/rss+xml" />
	<link>http://qvister.se</link>
	<description></description>
	<lastBuildDate>Mon, 06 Sep 2010 12:03:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Deploy almost anything using Capistrano</title>
		<link>http://qvister.se/2010/04/06/deploy-almost-anything-using-capistrano/</link>
		<comments>http://qvister.se/2010/04/06/deploy-almost-anything-using-capistrano/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 07:33:42 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=737</guid>
		<description><![CDATA[I recently started digging into the world of Ruby on Rails and quite early came across Capistrano. The whole idea and concept of Capistrano could be explained with their own quite catchy tagline &#8220;Welcome to easyish deployment&#8220;. I&#8217;ve been doing deployment using Git for a while by now. But I find Capistrano more flexible and reliable. [...]]]></description>
			<content:encoded><![CDATA[
<p>I recently started digging into the world of Ruby on Rails and quite early came across <a href="http://www.capify.org/">Capistrano</a>. The whole idea and concept of Capistrano could be explained with their own quite catchy tagline &#8220;<em>Welcome to easy<span style="text-decoration: line-through;">ish</span> deployment</em>&#8220;.<span id="more-737"></span></p>
<p>I&#8217;ve been doing deployment using Git for a while by now. But I find Capistrano more flexible and reliable. Since Capistrano is intended to be used with Ruby on Rails it doesn&#8217;t work with other platforms &#8220;<em>out-of-the-box</em>&#8220;. But magic can still occur with a few lines of code.</p>
<p>Below you&#8217;ll a &#8220;<em>step-by-step</em>&#8221; tutorial on how the get started using Capistrano for easier deployment. The whole idea for this post came in mind during a Capistrano setup for a <a href="http://qvister.se/tag/codeigniter/">Codeigniter</a> application I did recently. But I don&#8217;t see why this deployment process wouldn&#8217;t be applicable on any other platform or framework.</p>
<p>This tutorial assumes you already got your code hosted using either SVN or Git. You preferaly have setup <a href="http://www.linuxquestions.org/linux/answers/Networking/Public_key_authentication_with_ssh">public ssh keys</a> between your computer and the server you&#8217;re deploying to. You&#8217;re using the same directory structure as below for your applications on your server (feel free to change the Capfile in order to match your existing structure).</p>
<pre>/var/www/example.com
/var/www/example.com/www.example.com
/var/www/example.com/www.example.com/logs
/var/www/example.com/www.example.com/public</pre>
<p>Start of by installing Capistrano on your computer. Capistrano is distributed as a Ruby gem.</p>
<pre>$ sudo gem install capistrano</pre>
<p>Next up clone my default Capfile (Capistrano config file) using cURL. Or use the Gist below.</p>
<pre>$ curl "http://gist.github.com/raw/353124/ceda1eccacee7604d7180b23ff20cb618cb760af/capfile.rb" &gt; Capfile</pre>
<p><script src="http://gist.github.com/353124.js?file=capfile.rb"></script></p>
<p>There are some variabels you need to change in order to make this Capfile work with your setup. Basically look through all lines that begins with &#8220;<em>set</em>&#8221; and change the corresponding value. Also make sure to change the server domain on line 10.</p>
<p>A typical Capistrano deployment is loaded with different kind of tasks. Since Capistrano is awesome it allows you to setup own tasks and even overwrite existing tasks.</p>
<p>As mentioned earlier Capistrano was invented with Ruby on Rails in mind, therefor we need to overwrite a few Rails specific tasks (<em>migrate</em>, <em>restart</em>, <em>start</em>). These default tasks are probably not compatible with your application. But feel free to rewrite them if needed.</p>
<p>As you might noticed by now the task &#8220;<em>copy_config</em>&#8221; inside Capfile isn&#8217;t a default task. My Codeigniter applications usually include some setup specific config files that shouldn&#8217;t be included in the repository by obvious reasons. For instance a config file including all necessary MySQL credentials. Therefor these files needs to be setup and edited manually in order to get the application running. But there&#8217;s one problem using this method with Capistrano.</p>
<p>Everytime you deploy using Capistrano a fresh copy of your latest application is being cloned/checkout from the repository and stored inside a new folder on the server. Since Capistrano doesn&#8217;t proceed from the previous deployed release all files that isn&#8217;t included in the repository will <strong>not</strong> be moved to the new deployed release folder. But no worries! Since Capistrano allows us to hook up our own tasks to specific events during deployment we can solve this problem with ease.</p>
<p>The task namned &#8220;<em>copy_config</em>&#8221; is being executed right after the &#8220;<em>symlink</em>&#8221; task. Right after the new release directory has been created and linked to the current directory. Since all my necessary config files are included in the &#8220;<em>.gitignore</em>&#8221; file we can use that as a reference and simply check if the file exists in the previous release folder. If so simply move the file to the newly created release folder. Capistrano provides some nifty <a href="http://www.capify.org/index.php/Variables" target="_blank">variabels</a> such as &#8220;<em>previous_release</em>&#8221; and &#8220;<em>latest_release</em>&#8221; to make this operation easier.</p>
<p>Any other needed operation to get your application up and running should probably be executed after the &#8220;<em>symlink</em>&#8221; task.</p>
<p>Once your Capfile is done it&#8217;s time to run a initial setup deploy. Start of by running the following command.</p>
<pre>$ cap deploy:setup</pre>
<p>You should end up with a similar directory structure on your server.</p>
<pre>/var/www/example.com/www.example.com/public/releases
/var/www/example.com/www.example.com/public/shared
/var/www/example.com/www.example.com/public/shared/log
/var/www/example.com/www.example.com/public/shared/pids
/var/www/example.com/www.example.com/public/shared/system</pre>
<p>It&#8217;s finally time to perform a first initial (cold) deploy of your application to your server.</p>
<pre>$ cap deploy:cold</pre>
<p>Congratulations! You just performed your first deploy using Capistrano. For future deploys the cold task isn&#8217;t necessary. Simply execute the command below.</p>
<pre>$ cap deploy</pre>
<p>Easy enough don&#8217;t you think?</p>
<p>This post should give you a brief idea of the Capistrano workflow. And show how you can hook up your own tasks in order to get your application up and running. I can&#8217;t guarantee that this method can be applicable on your application. As the title states &#8220;<em>&#8230; almost anything</em>&#8220;.</p>
<p>Interested in learning more about Capistrano? Here&#8217;s a <a href="http://delicious.com/mptre/capistrano+blog" target="_blank">few posts</a> that I stumbled across and found interesting during research for this post.</p>
<p><em>Photo credit: </em><a href="http://www.flickr.com/people/heyskinny/" target="_blank"><em>heyskinny</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/04/06/deploy-almost-anything-using-capistrano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bonnier Hack Day</title>
		<link>http://qvister.se/2010/03/14/bonnier-hack-day/</link>
		<comments>http://qvister.se/2010/03/14/bonnier-hack-day/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 20:35:51 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[Bonnier]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[mobilab]]></category>
		<category><![CDATA[stockholm]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=709</guid>
		<description><![CDATA[Torsdagen och fredagen denna vecka spenderades på Bonnier Hack Day. Det hela var ett initiativ från Bonnier R&#38;D sida med Paulina i täten. För dig som inte är bekant med Hack Day konceptet går det kort och gott ut på att skapa något under 24 intensiva timmar. Den faktiska slutprodukten är inte det viktigaste utan [...]]]></description>
			<content:encoded><![CDATA[
<p>Torsdagen och fredagen denna vecka spenderades på <a href="http://bonnierhackday.blogspot.com/" target="_blank">Bonnier Hack Day</a>. Det hela var ett initiativ från <a href="http://www.bonnier.se/sv/om-bonnier-research-development" target="_blank">Bonnier R&amp;D</a> sida med <a href="http://twitter.com/pauspling" target="_blank">Paulina</a> i täten.<span id="more-709"></span></p>
<p>För dig som inte är bekant med Hack Day konceptet går det kort och gott ut på att skapa något under 24 intensiva timmar. Den faktiska slutprodukten är inte det viktigaste utan det är mer fokus på att faktiskt åstadkomma något.</p>
<p>Bonnier Hack Day var faktiskt min tredje Hack Day i ordningen. Enda skillnaden denna var att jag inte närvarade som privatperson utan representerade <a href="http://qvister.se/tag/mobilab/" target="_blank">Mobilab</a> tillsammans med <a href="http://twitter.com/hermanolsson" target="_blank">Herman Olsson</a>, <a href="http://twitter.com/gunnarr" target="_blank">Gunnar Johansson</a> och <a href="http://twitter.com/morpac" target="_blank">Morris Packer</a>.</p>
<p>Vårt projekt med arbetsnamnet &#8220;<em>tvättmaskinen</em>&#8221; är ganska tråkigt för att vara ett Hack Day projekt men något som vi intern kommer ha stor nytta av. Hela idén grundar sig i att vi av olika skäl inte kan hämta innehåll direkt Expressens <a href="http://sv.wikipedia.org/wiki/Application_Programming_Interface" target="_blank">API</a> från klienten (t ex. en iPhone applikation). Därav byggde vi ett mellanlager som hämtar innehåll från Expressen och lagrar det slutligen på Amazons S3 plattform. På så sätt kan vi på våra kommande sajter och applikationer komma åt det innehåll som efterfrågas utan att gå direkt mot Expressens API. En annan fördel med att lagra innehållet hos Amazon S3 är att Expressen kan gå ner, vår &#8220;<em>tvättmaskin</em>&#8221; kan gå ner men alla sajter och applikationer kommer fortfarande ha tillgång till det senaste innehållet eftersom Amazon S3 är så stabilt det bara kan bli.</p>

<p>Efter 24 intensiva timmar fick alla chansen att presentera sina projekt i sann Hack Day anda. Bland publiken fanns även en jury bestående av massa kloka huvuden. Denna jury korade sedan en vinnare som inte var någon mindre än Sydsvenskans <a href="http://citypedia.se/" target="_blank">Citypedia</a> projekt med följande motivering.</p>
<blockquote><p>The jury &#8230; particularly liked the way in which team Sydsvenskan used new and vastly different sources/API:s to provide more accurate and extensive reviews.</p></blockquote>
<p>Nedan finns även en lista över mina favorit projekt utan någon specifik rangordning.</p>
<ul>
<li><a href="http://repr.is/" target="_blank">repr.is</a><br />
En tjänst som aggregerar alla s.k. play-tjänster och gör dem sökbara under ett och samma tak. En klockren idé som verkligen fyller ett behov som jag personlig har känt av. Jag hoppas verkligen att denna tjänst fortsätts utvecklas. Utvecklat av <a href="http://twitter.com/mackielinden" target="_blank">Marcus Lindén</a> och <a href="http://twitter.com/perkovich" target="_blank">Per Åström</a>, båda ifrån TV4.</li>
<li><a href="http://www.flickr.com/photos/bonnier_rd/4426656235/in/set-72157623605939816/" target="_blank">linkr</a><br />
Att förena det digitala med det analoga har gång på gång visat sig vara ett vinnande Hack Day koncept. Linkr är heller inget undantag. Vad denna röda låda gör är att visa antalet klick som besökarna genererat de senaste fem minuterna från ett visst antal fördefinierade sajter. Det hela kompletteras med en indikator som visar om antalet klick har ökat eller minskat gentemot den tidigare fem minuters perioden. Syftet är att konkretisera och öka förståelsen kring statistiken som finns tillgänglig hos främst redaktionerna som ansvarar för innehållet på sajterna. Utvecklat av <a href="http://twitter.com/perkovich" target="_blank">Per Åström</a> och <a href="http://twitter.com/moonhouse" target="_blank">David Hall</a>.</li>
<li><a href="http://www.flickr.com/photos/bonnier_rd/4427417880/in/set-72157623605939816/" target="_blank">whereitshot</a><br />
Google Maps i kombination med s.k. <a href="http://en.wikipedia.org/wiki/Heat_map" target="_blank">heatmaps</a> för att presentera data är något som på senaste tiden har intresserat mig. Vad whereitshot gör är att visa vart &#8220;<em>tweets</em>&#8221; innehållandes en viss sökterm är mest förekommande rent geografiskt. Det hela visar visserligen bara en bråkdel av alla &#8220;<em>tweets</em>&#8221; eftersom denna idé bygger på att alla &#8220;<em>tweets&#8221;</em> är geotaggade med faktiska koordinater. Hur som helst är hela genomförande väldigt snyggt och genomtänkt. Utvecklat av Anders Cserkuti och David Andersson, både ifrån Adlibris.</li>
<li><a href="http://www.henrikberggren.com/2010/03/14/pictoriala/" target="_blank">Pictoriala</a><br />
Utvecklat av Hack Day veteranerna <a href="http://twitter.com/henrikberggren" target="_blank">Henrik Berggren</a> och <a href="http://twitter.com/davidkjelkerud" target="_blank">David Kjelkerud</a>, båda ifrån Doberman. Ett oerhört grafiskt tilltalande nyhetsflöde i form av bilder är vad jag skulle kalla Pictoriala för.</li>
</ul>
<p>Så här i efterhand kan jag konstatera att detta var ännu en oerhört lyckad Hack Day. Det är kul att se att detta koncept börjar dyka upp mer och mer här hemma i Sverige. Återigen ett stort tack till alla som gjorde dessa 24 timmar till något helt fantastikt. Jag ser med glädje fram emot nästa Bonnier Hack Day!</p>
<p><em>Bilderna tillhörande detta inlägg är lånade ifrån </em><a href="http://www.flickr.com/photos/bonnier_rd/sets/72157623605939816/" target="_blank"><em>Bonnier R&amp;D</em></a><em>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/03/14/bonnier-hack-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Första dagen på Bonnier Communications</title>
		<link>http://qvister.se/2010/03/01/forsta-dagen-pa-bonnier-kommunikation/</link>
		<comments>http://qvister.se/2010/03/01/forsta-dagen-pa-bonnier-kommunikation/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 15:37:12 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[Bonnier]]></category>
		<category><![CDATA[Uppdrag]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=667</guid>
		<description><![CDATA[Sedan hösten förra året har jag haft kontakt och jobbat en del med Bonniers kommunikationsavdelning. Idag inleder vi dock ett nytt konsultuppdrag. Under våren kommer jag spendera en dag i veckan hos Bonnier Communications som konsulterande webbutvecklare. Jag kommer främst pyssla med konkreta utvecklingsuppdrag samt agera rådgivare i diverse webbrelaterade frågor. Bonnier Communications jobbar med intern- och [...]]]></description>
			<content:encoded><![CDATA[
<p>Sedan hösten förra året har jag haft kontakt och jobbat en del med Bonniers kommunikationsavdelning. Idag inleder vi dock ett nytt konsultuppdrag.<span id="more-667"></span></p>
<p>Under våren kommer jag spendera en dag i veckan hos Bonnier Communications som konsulterande webbutvecklare. Jag kommer främst pyssla med konkreta utvecklingsuppdrag samt agera rådgivare i diverse webbrelaterade frågor.</p>
<p>Bonnier Communications jobbar med intern- och externkommunikation på moderbolaget Bonnier AB och ansvarar för varumärket Bonnier i Sverige och övriga världen, både analogt och digitalt.</p>
<p>Det hela känns oerhört spännande och jag hoppas att jag kan hålla er uppdaterade på allt som händer.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/03/01/forsta-dagen-pa-bonnier-kommunikation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Server-side Google Analytics</title>
		<link>http://qvister.se/2010/02/02/server-side-google-analytics/</link>
		<comments>http://qvister.se/2010/02/02/server-side-google-analytics/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 11:49:14 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[english]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[mobil]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=624</guid>
		<description><![CDATA[In late 2009 Google announced a new Analytics SDK used for tracking events inside iPhone and Android applications. The same release also featured a new method for more accurate tracking running Analytics server-side instead of using JavaScript. This especially comes handy when developing mobile websites. Many older phones suffer from the lack of JavaScript support. [...]]]></description>
			<content:encoded><![CDATA[
<p>In late 2009 Google announced a new Analytics SDK used for tracking events inside iPhone and Android applications. The same release also featured a new method for more accurate tracking running Analytics server-side instead of using JavaScript. This especially comes handy when developing mobile websites.<span id="more-624"></span></p>
<p>Many older phones suffer from the lack of JavaScript support. Which in some cases makes it more complicated to track the user. But running the tracking service server-side will solve this problem easily.</p>
<p>As mentioned earlier Google does offer a server-side solution for Analytics. Sadly enough the documentation is almost non-existing and the only thing provided is some crappy PHP <a href="http://www.google.com/url?sa=D&amp;q=http://www.google.com/analytics/googleanalyticsformobile.zip&amp;usg=AFQjCNEzXGXLA9w0rSdNPKJT-BA0QfJ3MQ">example code</a> to get you started.</p>
<p>Therefor I wrote a simple class in PHP used for interacting with the server-side solution for Analytics. The logic and flow is provided by the existing example code. Below you&#8217;ll find a brief description of the &#8220;<em>flow</em>&#8220;.</p>
<p>A user comes to your site and the url function will generate an uri with all mandatory parameters included. This uri is will be included in the src attribute inside an img element. The browser will then request the uri believing that it&#8217;s an image. The uri will actually be pointing to a executable script. In this script the track function is called. A unique visitor id will be generated and stored inside a cookie. An HTTP-request will be sent to Analytics including all kind of parameters in order to track the user. When the request is done a 1&#215;1 GIF image will be severed in order to satisfy the browser.</p>
<p>The method described above is a quite common way of solving lack of JavaScript related problems.</p>
<p>In order to start using this tracking method you&#8217;ll need to create a new Analytics profile for your website.</p>
<ul>
<li>Create a new profile.</li>
<li>Select &#8220;tracking for a new domain&#8221; or new subdomain if applicable.</li>
<li>Click on the &#8220;Advanced&#8221; tab and choose the mobile option.</li>
<li>Copy your new Analytics ID from the textarea (MO-XXXXXX-XX).</li>
</ul>
<p>The code is available on <a href="http://github.com/mptre/php-ga">GitHub</a> so feel free to fork away! There&#8217;s also a demo included in the repository. Should be just enough to get you started.</p>
<p>To all CodeIgniter fanboys out there. The class works perfectly as a library in CodeIgniter. You just need to make sure to include the uri generated from the url function inside your view. And then point it towards a function in your controller which executes the track function. See the demo inside the repository for further reference.</p>
<p>Happy accurate tracking!</p>
<p><em>Photo credit: <a href="http://www.flickr.com/photos/manfrys/" target="_blank">Antonio Manfredonio</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/02/02/server-side-google-analytics/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Fem saker jag gillar med jQuery 1.4</title>
		<link>http://qvister.se/2010/01/15/fem-saker-jag-gillar-med-jquery-1-4/</link>
		<comments>http://qvister.se/2010/01/15/fem-saker-jag-gillar-med-jquery-1-4/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 15:39:04 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=583</guid>
		<description><![CDATA[I dagarna släpptes äntligen version 1.4 av JavaScript-biblioteket jQuery. Denna version är fullmatad med nya funktioner och förbättringar. En oerhört finslipad release om du frågar mig. Jag tog mig tiden att läsa igenom loggen med ändringar. Nedan följer en lista över mina fem favoriter. Smidigare konstruktion av element Vid konstruktion av ett nytt element kan [...]]]></description>
			<content:encoded><![CDATA[
<p>I dagarna släpptes äntligen version 1.4 av JavaScript-biblioteket jQuery. Denna version är fullmatad med nya funktioner och förbättringar. En oerhört finslipad release om du frågar mig.<span id="more-583"></span></p>
<p>Jag tog mig tiden att läsa igenom loggen med ändringar. Nedan följer en lista över mina fem favoriter.</p>
<ol>
<li>
<strong>Smidigare konstruktion av element</strong><br />
Vid konstruktion av ett nytt element kan du nu skicka med ett objekt innehållandes egenskaper.</p>
<p><script src="http://gist.github.com/278098.js?file=jquery.construct.js"></script>
</li>
<li>
<strong>Enklare attribut manipulation</strong><br />
Funktioner för att manipulera element så som .<a href="http://api.jquery.com/css">css()</a>, <a href="http://api.jquery.com/attr">.attr()</a>, <a href="http://api.jquery.com/val">.val()</a> och <a href="http://api.jquery.com/html">.html()</a> kan nu ta en funktion som andra parameter. I funktionen kan du enkelt komma åt det befintliga attributets värde.</p>
<p><script src="http://gist.github.com/278098.js?file=jquery.attr.js"></script>
</li>
<li>
<strong>Unik easing metod per egenskap</strong><br />
Det är nu möjligt att definiera en <a href="http://gsgd.co.uk/sandbox/jquery/easing/">easing</a> metod för enskilda egenskaper.</p>
<p><script src="http://gist.github.com/278098.js?file=jquery.easing.js"></script>
</li>
<li>
<strong>Äntligen en riktig delay funktion</strong><br />
Nu är du inte längre tvungen att &#8220;<em>fulhacka</em>&#8221; för att skapa en delay effekt.</p>
<p><script src="http://gist.github.com/278098.js?file=jquery.delay.js"></script>
</li>
<li>
<strong>Ajax anrop tar hänsyn till Last-Modified headern</strong><br />
Tidigare har alla ajax funktioner ignorerat Last-Modified headern. I syfte att ignorera eventuellt cache från webbläsaren. Genom att sätta ifModified till true tvingas jQuery att läsa från webbläsarens cache (förutsagt att något finns).</p>
<p><script src="http://gist.github.com/278098.js?file=jquery.ajax.js"></script>
</li>
</ol>
<p>Om du är sugen på att grotta dig ännu djupare finns en bra redovisning av de nya funktionerna och förbättringarna på kampanjsajten <a href="http://jquery14.com/day-01/jquery-14">14 Days of jQuery</a>.</p>
<p>I sedvanlig ordning tillhandahåller Google <a href="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js">jQuery 1.4</a> (minifierad och gzippad) på deras supersnabba CDN.</p>
<p><em>Bilden tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/equanimity/">Eric Miraglia</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/01/15/fem-saker-jag-gillar-med-jquery-1-4/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>4650 sidor senare</title>
		<link>http://qvister.se/2010/01/02/4650-sidor-senare/</link>
		<comments>http://qvister.se/2010/01/02/4650-sidor-senare/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 15:30:28 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[böcker]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=531</guid>
		<description><![CDATA[Ett av förra årets nyårslöfte var att läsa minst en bok per månad. Så här i efterhand visade det sig vara ett löfte som jag faktiskt höll. Inte mindre än 17 böcker klarade jag av under år 2009. Eller 4650 sidor om man vill spä på det hela med lite mer metadata. Nedan finner du [...]]]></description>
			<content:encoded><![CDATA[
<p>Ett av förra årets nyårslöfte var att läsa minst en bok per månad. Så här i efterhand visade det sig vara ett löfte som jag faktiskt höll.<span id="more-531"></span> Inte mindre än 17 böcker klarade jag av under år 2009. Eller 4650 sidor om man vill spä på det hela med lite mer metadata. Nedan finner du en sammanställning av samtliga böcker.</p>
<ol>
<li><strong>Dödens änglar</strong>, Julian Sher och William Marsden</li>
<li><strong>Free Culture</strong>, Lawrence Lessig</li>
<li><strong>What Would Google Do?</strong>, Jeff Jarvis</li>
<li><strong>Outliers</strong>, Malcolm Gladwell</li>
<li><strong>Work Hard, Be Nice</strong>, Jay Mathews</li>
<li><strong>Människor helt utan betydelse</strong>, Johan Kling</li>
<li><strong>A Practial Guide to Designing for the Web</strong>, Mark Bulton</li>
<li><strong>Predictably Irrational</strong>, Dan Ariely</li>
<li><strong>Freakonomics</strong>, Steven D. Levitt och Stephen J. Dubner</li>
<li><strong>My Early Life</strong>, William Manchester och Winston Churchill</li>
<li><strong>Glitterspray och 99 andra klintbergare</strong>, Bengt af Klintberg</li>
<li><strong>Corporate Bullshit</strong>, Lars Melin</li>
<li><strong>Free</strong>, Chris Anderson</li>
<li><strong>Positioning</strong>, Al Ries och Jack Trout</li>
<li><strong>The 22 Immutable Laws of Marketing</strong>, Al Ries och Jack Trout</li>
<li><strong>Naiv Super</strong>, Erlend Loe</li>
<li><strong>iWoz</strong>, Steve Wozniak och Gina Smith</li>
</ol>
<p>För att hålla koll på alla mina böcker använder jag tjänsten <a href="http://anobii.com/">aNobii</a> som låter dig skapa en &#8220;<em>digital</em>&#8221; bokhylla. Tjänsten är fylld med en mängd sociala funktioner och även en enkel statistikmodul som gör det möjligt att se antalet lästa böcker för ett givet år.</p>
<p>Löftet om att läsa minst en bok per månad kvarstår även detta år. På nattduksbordet finns redan idag en trave <a href="http://www.flickr.com/photos/mptre/3994351577/">intressanta böcker</a>.</p>
<p><em>Bilden tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/patrickgage/">Patrick Gage</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2010/01/02/4650-sidor-senare/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Good Old Email Templates</title>
		<link>http://qvister.se/2009/12/14/good-old-email-templates/</link>
		<comments>http://qvister.se/2009/12/14/good-old-email-templates/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 07:56:00 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[goodold]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=514</guid>
		<description><![CDATA[Tidigare i våras när jag hjälpte Good Old med sajten till Moving Images 2009 kom jag i kontakt med en smart WordPress plugin vid namn Good Old Email Templates. Utvecklad av Joel Arvidsson från just Good Old. I ett flertal projekt som jag jobbar med just nu krävs liknande funktionalitet. Därav hörde jag mig för [...]]]></description>
			<content:encoded><![CDATA[
<p>Tidigare i våras när jag hjälpte<a href="http://goodold.se/"> Good Old</a> med sajten till <a href="http://movingimagesmalmo.se/">Moving Images 2009</a> kom jag i kontakt med en smart WordPress plugin vid namn Good Old Email Templates. Utvecklad av Joel Arvidsson från just Good Old. I ett flertal projekt som jag jobbar med just nu krävs liknande funktionalitet.<span id="more-514"></span></p>
<p>Därav hörde jag mig för om jag fick &#8220;<em><a href="http://sv.wikipedia.org/wiki/Fork">forka</a></em>&#8221; plugin:en och modifiera den utefter mina behov. Givetvis vart svaret ja.</p>
<p>Good Old Email Templates är alltså en plugin till WordPress för att skapa och administrera email-mallar. Mallarna kan innehålla ett flertal variabler som kan ersättas med egna värden. Detta är framför allt smidigt när man ska göra automatiska mailutskick till ett flertal användare.</p>
<p>Koden har fått sig en rejäl översyn och större delar har skrivit om av mig. Givetvis är plugin:en släppt helt i det fria. Var så god att ladda ner plugin:en från <a href="http://github.com/mptre/wp-goodold-email-templates">GitHub</a> eller varför inte skapa en egen fork?</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/12/14/good-old-email-templates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mipi.se, frågan är fri</title>
		<link>http://qvister.se/2009/11/01/mipi-se-fragan-ar-fri/</link>
		<comments>http://qvister.se/2009/11/01/mipi-se-fragan-ar-fri/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 16:15:11 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[24hbc]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=473</guid>
		<description><![CDATA[24 Hour Business Camp är ett underbart initiativ från Ted Valentin och SSES sida. Det hela går ut på att skapa en webbtjänst på 24 timmar i Yasuragis rofyllda miljö. Förra året deltog jag på distans och skapade tillsammans med Morris Packer, Herman Olsson och Rickard Thorman moco.se på garanterat mindre än 24 timmar. Denna [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.24hbc.com/">24 Hour Business Camp</a> är ett underbart initiativ från <a href="http://www.tedvalentin.com/">Ted Valentin</a> och <a href="http://www.sses.se/">SSES</a> sida. Det hela går ut på att skapa en webbtjänst på 24 timmar i <a href="http://www.yasuragi.se/">Yasuragis</a> rofyllda miljö. Förra året deltog jag på distans och skapade tillsammans med Morris Packer, Herman Olsson och Rickard Thorman <a href="http://moco.se/">moco.se</a> på garanterat mindre än 24 timmar. Denna gång befann jag mig tillskillnad från förra gången på plats.<span id="more-473"></span></p>
<p>Idéen till projektet <a href="http://mipi.se/">mipi.se</a> spånades redan fram på konferensen <a href="http://qvister.se/2009/06/30/reboot11/">Reboot</a> av mig och Morris Packer. Grundidéen var helt enkelt att kunna skapa en frågeställning för att sedan skicka ut den till en så stor publik som möjligt. Med andra ord frågan är fri.</p>
<p>Under mina 24 timmar skapade jag ett webbaserat gränssnitt för att skapa frågor och se resultatet som uppdateras i realtid. Användningsområdena är redan så här initialt många. Tänk t. ex. om du anordnar en konferens och vill ha din deltagares svar på en viss fråga. Skapa frågan och visa resultatet en storskärm medhjälp av en projektor. Deltagarna kommer på så sätt kunna följa utvecklingen i realtid.</p>
<p>Det hela byggdes i ramverket <a href="http://codeigniter.com/">Codeigniter</a> som jag verkligen har fattat tycke för den senaste tiden. Plus en hel del JavaScript med <a href="http://qvister.se/tag/jquery/">jQuery</a> som grund.</p>
<p>Framtiden för detta projekt ser ljus ut. <a href="http://www.appcorn.se/">Appcorn</a> har sedan en tid tillbaka tagit fram en &#8220;<em>proof of concept</em>&#8221; iPhone applikation som använder sig av Push-protokollet för att skicka ut frågor.</p>
<p>Gillar mipi.se får du gärna <a href="http://www.24hbc.com/2009/10/rosta-pa-dina-favoriter-fran-24hbc.html">rösta på oss</a>. Eller läs mer om <a href="http://www.24hbc.com/2009/10/mipise.html">bakgrunden</a> till detta projekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/11/01/mipi-se-fragan-ar-fri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Använd Git tillsammans med Dropbox</title>
		<link>http://qvister.se/2009/10/19/anvand-git-tillsammans-med-dropbox/</link>
		<comments>http://qvister.se/2009/10/19/anvand-git-tillsammans-med-dropbox/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 06:19:26 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=428</guid>
		<description><![CDATA[Git har sedan en tid tillbaka varit det versionshanteringssystem som har passat mina behov bäst. Under den senaste tiden jag har undersökt olika lösningar för att kunna dela ett projekt med flera projektmedlemmar. Efter lite undersökning och testning visade sig att Dropbox var som gjort för detta. För er som inte känner till Dropbox så [...]]]></description>
			<content:encoded><![CDATA[<p>Git har sedan en tid tillbaka varit det versionshanteringssystem som har passat mina behov bäst. Under den senaste tiden jag har undersökt olika lösningar för att kunna dela ett projekt med flera projektmedlemmar. Efter lite undersökning och testning visade sig att Dropbox var som gjort för detta.<span id="more-428"></span></p>
<p>För er som inte känner till Dropbox så är det en programvara som håller dina filer i synk mellan olika datorer. Tjänsten kompletteras med ett webbgränssnitt samt en nyligen släppt iPhone applikation. Allt du behöver göra för att komma igång är att installera Dropbox på valfri dator (Mac, Windows eller Linux). Att sedan dela med sig av filer och mappar har aldrig varit enklare.</p>
<p>Git å andra sidan är ett versionshanteringssystem utvecklat av ingen mindre än <a href="http://sv.wikipedia.org/wiki/Linus_Torvalds">Linus Torvalds</a>. Systemet har ökat sin marknadsandel markant den senaste tiden. Fler och fler open source plattformar och andra tjänster har valt Git i kombination med <a href="http://github.com/">GitHub</a> framför konkurrenterna SVN och CVS.</p>
<p>Att börja använda Git tillsammans med Dropbox är bara enkla 5 steg ifrån. Så här gör du.</p>
<ol>
<li>Givetvis krävs ett Dropbox konto. Om du inte redan har ett så kan du skaffa ett alldeles gratis hos <a href="http://www.getdropbox.com/">Dropbox</a>.</li>
<li>För enkelhetens skull väljer vi att kalla vårt repository &#8220;projekt&#8221; i detta exempel. Börja med att skapa mappen &#8220;projekt&#8221;, navigera ditt och initialisera Git.
<pre>$ mkdir projekt
$ cd projekt
$ git init</pre>
</li>
<li>Klona en &#8220;<em>rå</em>&#8221; kopia av repot till valfri mapp i din Dropbox.
<pre>$ git clone --bare . ~/Dropbox/git/projekt.git</pre>
</li>
<li>Lägg slutligen till det &#8220;<em>råa</em>&#8221; repot som ett externt repository. Vi väljer att kalla det för &#8220;<em>dropbox</em>&#8220;.
<pre>$ git remote add dropbox ~/Dropbox/git/projekt.git</pre>
</li>
<li>För att pröva allt står rätt till kan vi skapa en första commit och pusha uppdateringen till vårt repository i Dropboxen. Vi väljer att lägga till en tom gitignore fil.
<pre>$ touch .gitignore
$ git add .
$ git commit -m "Initial commit."
$ git push dropbox master</pre>
</li>
</ol>
<p>Om du vill dela repot med en kollega eller vän är det så enkelt som att dela ut en mapp via Dropbox. Personen ifråga kan sedan klona repot och utföra lokala ändringar som sedan pushas till repot i Dropboxen.</p>
<pre>$ git clone ~/Dropbox/git/projekt.git
$ cd projekt
$ git remote add dropbox ~/Dropbox/git/projekt.git</pre>
<p>Notera att steg två ovan är valfritt. Per automatik kommer repot i Dropboxen döpas till &#8220;<em>origin</em>&#8220;. Dock kan du som exemplet påvisar döpa om det till något annat.</p>
<p>För att hålla din lokala kopia uppdaterad med de senaste ändringarna som finns i Dropboxen utför du följande kommando.</p>
<pre>$ git pull dropbox master</pre>
<p>För att göra denna process lite enklare så har jag satt ihop ett shellskript som skapar ett nytt lokalt Git repository och ett i Dropboxen. Se installationsprocess nedan. Notera att du måste ändra variabeln &#8220;<em>DROPBOX</em>&#8221; i skriptet på rad 3 till den absoluta sökvägen till mappen i Dropboxen där du vill spara alla Git repositories.</p>
<pre>
$ curl -O "http://gist.github.com/raw/212810/36e6320523db68618e108c4fb1add06eefeec485/git-init-dropbox"
$ chmod u+x git-init-dropbox
$ sudo mv git-init-dropbox /usr/local/bin
</pre>
<p>Nedan finns ett exempel på hur man skapar ett nytt repository medhjälp av git-init-dropbox (shellskriptet).</p>
<pre>
$ mkdir projekt
$ cd projekt
$ git init-dropbox
</pre>
<p>Inspirationen till detta inlägg är hämtat ifrån Matt Longs bloggpost <a href="http://www.cimgf.com/2008/06/03/version-control-makes-you-a-better-programmer/">Version Control Makes You A Better Programmer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/10/19/anvand-git-tillsammans-med-dropbox/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Några jQuery plugins</title>
		<link>http://qvister.se/2009/09/23/nagra-jquery-plugins/</link>
		<comments>http://qvister.se/2009/09/23/nagra-jquery-plugins/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 05:45:02 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=125</guid>
		<description><![CDATA[jQuery är ett JavaScript-bibliotek som verkligen gör allt berörande javascript-utveckling till en ren fröjd. Inte minst p.g.a. all inbyggd funktionalitet i kärnan och den uppsjö av plugins som finns. Beskrivningen på jQuerys officiella hemsida fångar det jag försöker beskriva. jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery är ett JavaScript-bibliotek som verkligen gör allt berörande javascript-utveckling till en ren fröjd. Inte minst p.g.a. all inbyggd funktionalitet i kärnan och den uppsjö av plugins som finns.<span id="more-125"></span></p>
<p>Beskrivningen på <a href="http://jquery.com/">jQuerys</a> officiella hemsida fångar det jag försöker beskriva.</p>
<blockquote><p>jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.</p></blockquote>
<p>Även jag har dragit mitt strå till stacken genom att dela med mig av några små plugins som jag har utvecklat på egenhand.</p>
<h3>jContact</h3>
<p>En plugin som kan används för att presentera kontaktinfo eller annan viktig information på ett snyggt sätt.</p>
<p><a href="http://qvister.se/wp-content/uploads/jquery/?script=jcontact">Exempel #1</a><br />
<a href="http://drip.se/">Exempel #2</a><br />
<a href="http://github.com/mptre/jcontact/tree/master">Ladda ner jContact</a></p>
<h3>jFields</h3>
<p>Låter dig ge textfält (inputs och textareas) standardvärden som beskriver vad fältet ska innehålla. Detta standardvärde försvinner så fort fältet markeras eller blir aktivt. Denna plugin är användbar om du inte vill använda dig av labels p.g.a. platsbrist eller av estetiska skäl.</p>
<p><a href="http://qvister.se/wp-content/uploads/jquery/?script=jfields">Exempel #1</a><br />
<a href="http://github.com/mptre/jquery-jfields/tree/master">Ladda ner jFields</a></p>
<h3>jCountUp</h3>
<p>Tillåter dig att räkna upp ett elements värde på ett snyggt sätt. Kan vara användbart när man bygger en årtals-navigation eller liknande. Det finns även gott om inställningar så som t ex. hastighet, värde och en callback.</p>
<p><a href="http://qvister.se/wp-content/uploads/jquery/?script=jcountup">Exempel #1</a><br />
<a href="http://vastracity.se/">Exempel #2</a><br />
<a href="http://github.com/mptre/jquery-jcountup/tree/master">Ladda ner jCountUp</a></p>
<h3>jPreloader</h3>
<p>Ersätter submit-knappen med en valfri preloader när en AJAX request utförs. I dagsläget fungerar endast denna plugin med formulär och används tillfördel med <a href="#link-me-up">jForm</a>.</p>
<p><a href="http://qvister.se/wp-content/uploads/jquery/?script=jpreloader">Exempel #1</a><br />
<a href="http://github.com/mptre/jquery-jpreloader/">Ladda ner jPreloader</a></p>
<h3>SimpleBlock</h3>
<p>Till ett kundjobb behövde jag blockera (göra dem &#8220;<em>oklickbara</em>&#8220;) några element under en bestämd tid. Det finns redan en del plugins som löser detta. Dock kändes de allt för tunga i detta fall. Därav skrev jag ihop SimpleBlock som låter dig blockera ett eller flera element under en given tid.</p>
<p><a href="http://qvister.se/wp-content/uploads/jquery/?script=simpleblock">Exempel #1</a><br />
<a href="http://github.com/mptre/jquery-simpleblock/tree/master">Ladda ner SimpleBlock</a></p>
<p>Alla plugins finns tillgängliga på GitHub och är koden är helt och hållet fri. Vilket i praktiken innebär att du har tillåtelse att använda dem och modifiera dem bäst du vill. Har du hittat en bugg eller sitter på lite feedback? Lämna då gärna en kommentar.</p>
<p>Om du själv är sugen på att börja skriva riktiga plugins till jQuery rekommenderar jag denna guide från <a href="http://net.tutsplus.com/videos/screencasts/learn-how-to-create-a-jquery-plugin/">Nettuts</a> och en från <a href="http://www.sitepoint.com/blogs/2009/07/22/how-to-develop-a-jquery-plugin/">SitePoint</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/09/23/nagra-jquery-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SoundCloud API wrapper med stöd för OAuth</title>
		<link>http://qvister.se/2009/09/18/soundcloud-api-wrapper-med-stod-for-oauth/</link>
		<comments>http://qvister.se/2009/09/18/soundcloud-api-wrapper-med-stod-for-oauth/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 18:49:39 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[soundcloud]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=408</guid>
		<description><![CDATA[Tidigare i år skrev jag ihop en API wrapper för SoundCloud i PHP. Idag kan jag med glädje meddela att denna wrapper har utökats med stöd för det nya OAuth protokollet. Öppen autentisering är hetare än någonsin. Bland de främsta i ledet står det nya protokollet OAuth, som ur ett perspektiv gör det möjligt för dig [...]]]></description>
			<content:encoded><![CDATA[<p><a style="text-decoration: none;" href="http://qvister.se/wp-content/uploads/2009/09/soundcloud_logo.gif"></a></p>
<p>Tidigare i år skrev jag ihop en API wrapper för <a href="http://soundcloud.com">SoundCloud</a> i PHP. Idag kan jag med glädje meddela att denna wrapper har utökats med stöd för det nya <a href="http://oauth.net">OAuth</a> protokollet.<span id="more-408"></span></p>
<p>Öppen autentisering är hetare än någonsin. Bland de främsta i ledet står det nya protokollet OAuth, som ur ett perspektiv gör det möjligt för dig som användare att logga in och komma åt t ex. ditt SoundCloud-konto från vilken sajt som helst (förutsagt att stöd för OAuth finns). Fördelarna är många, inte minst p.g.a. att vi slipper komma ihåg en uppsjö av användarnamn och lösenord. Ett praktiskt exempel är Twitter som tack vare sitt API med stöd för OAuth har lyckats skapa ett helt ny flora med tredjepartsutvecklade tjänster.</p>
<p>För er som inte känner till SoundCloud sen tidigare så kan jag berätta att det är fantastik tjänst utvecklad av musiker för musiker. Flickr kretsar kring bilder, Youtube kring video och SoundCloud kring musik. Tjänsten är utvecklad av två svenska smartskallar vid namn Alexander Ljung och Eric Wahlforss.</p>
<p>Att SoundCloud är en succé råder det inget tvivel om. Med drygt 300 000 användare och 2,5 miljoner euro i riskkapital ser framtiden oerhört ljus ut. Om du vill läsa mer om deras framgångsresa rekommenderar jag <a href="http://www.arcticstartup.com/2009/04/17/soundcloud-made-the-big-dream-a-reality/">ArcticStartups</a> bloggpost från i våras.</p>
<p>Timingen för releasen av denna wrapper kunde inte ha varit bättre. Ikväll inleds nämlingen <a href="http://berlin.musichackday.org">Music Hack Day</a> i Berlin där en massa musiker och utvecklare samlas under samma tak för att skapa musikrelaterade tjänster och program. Jag hoppas att min wrapper kan komma till användning!</p>
<p>API wrappern finns tillgänglig på <a href="http://github.com/mptre/php-soundcloud">GitHub</a> samt ett <a href="http://wiki.github.com/mptre/php-soundcloud/getting-started">exempel</a> på hur du kommer igång. Jag satte även ihop en liten demo applikation som finns att pröva på <a href="http://soundcloud.qvister.se">soundcloud.qvister.se</a>. SoundCloud själva har även skrivit om wrappern deras <a href="http://blog.soundcloud.com/2009/09/18/php-wrapper/">egna blogg</a>.</p>
<p><strong>Uppdatering: </strong>i ett nyligen publicerat inlägg hos självaste <a href="http://uk.techcrunch.com/2009/09/21/the-music-industry-should-learn-from-musichackday/">TechCrunch</a> länkas det till wrappern min!</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/09/18/soundcloud-api-wrapper-med-stod-for-oauth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Första dagen på Mobilab</title>
		<link>http://qvister.se/2009/08/12/forsta-dagen-pa-mobilab/</link>
		<comments>http://qvister.se/2009/08/12/forsta-dagen-pa-mobilab/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 11:28:02 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[mobilab]]></category>
		<category><![CDATA[tv4]]></category>
		<category><![CDATA[Uppdrag]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=345</guid>
		<description><![CDATA[Tidigare i våras kom jag i kontakt med Mobilab när jag var med och utvecklade Väderkanalens nya mobila sajt. Tack vare detta fick jag senare ett erbjudande att fortsätta vårt samarbete under hösten. Jag kommer under augusti och september månad sitta ett par dagar i veckan hos Mobilab under konsultbasis. Mina arbetsuppgifter kommer kretsa kring [...]]]></description>
			<content:encoded><![CDATA[<p>Tidigare i våras kom jag i kontakt med <a href="http://www.mobilab.se/">Mobilab</a> när jag var med och utvecklade <a href="http://qvister.se/2009/06/16/vaderkanalen/">Väderkanalens</a> nya mobila sajt. Tack vare detta fick jag senare ett erbjudande att fortsätta vårt samarbete under hösten.<span id="more-345"></span></p>
<p>Jag kommer under augusti och september månad sitta ett par dagar i veckan hos Mobilab under konsultbasis. Mina arbetsuppgifter kommer kretsa kring flera av TV4s befintliga mobila sajter.</p>
<p>Det hela känns oerhört roligt, inte minst p.g.a. alla kompetenta och trevligare människor som finns här. Givetvis kommer jag hålla er uppdaterade under arbetets gång.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/08/12/forsta-dagen-pa-mobilab/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bygg kampanjsajter med WordPress</title>
		<link>http://qvister.se/2009/08/06/bygg-kampanjsajter-med-wordpress/</link>
		<comments>http://qvister.se/2009/08/06/bygg-kampanjsajter-med-wordpress/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 10:05:41 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[kampanj]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=266</guid>
		<description><![CDATA[Som webbutvecklare har man med stor sannolikhet byggt en del kampanjsajter genom åren. Många kampanjsajter kretsar kring någon form av tävling eller användargenererat innehåll på ett eller annat sätt. Till min glädje har jag på den senaste tiden upptäck att WordPress fungerar som en perfekt grund till dessa sajter. I detta inlägg tänkte jag visa [...]]]></description>
			<content:encoded><![CDATA[<p>Som webbutvecklare har man med stor sannolikhet byggt en del kampanjsajter genom åren. Många kampanjsajter kretsar kring någon form av tävling eller användargenererat innehåll på ett eller annat sätt. Till min glädje har jag på den senaste tiden upptäck att WordPress fungerar som en perfekt grund till dessa sajter. I detta inlägg tänkte jag visa hur man kan gå tillväga, därav kommer det bli mycket teknisk &#8220;<em>mumbo-jumbo</em>&#8221; för den oinvigde.<span id="more-266"></span></p>
<p>Till både <a href="http://qvister.se/2009/05/11/inga-lojliga-bilresor/">inga löjliga bilresor</a> och <a href="http://qvister.se/2009/07/17/sveriges-basta-place-brand-2009/">place brand</a> har jag använt denna metod som beskrivs nedan. Visst kan man istället använda sig av t ex, <a href="http://wordpress.org/extend/plugins/tdo-mini-forms">TDO Mini Forms</a> men jag gillar att ha full kontroll över processen.</p>
<p>Jag är övertygad över att fler än jag har valt WordPress som verktyg till kampanjsajter, t ex. <a href="http://www.tubemusic.se/">Nokia Tube music</a> och <a href="http://www.telefonjacknejtack.se/">Telefonjack? Nej tack</a>. Hjälp mig gärna med att fylla på listan!</p>
<p>Principen är ganska enkel. Vad vi vill åstadkomma är att gemene besökare ska kunna posta ett inlägg (eller tävlingsbidrag) utan att behöva logga in. Detta inlägg ska sedan sparas ned som ett helt vanligt inlägg plus information om användaren. Inlägget sparas som ett utkast per automatik så att administratörerna kan granska det innan publicering. På detta vill vi gärna ha ett skydd emot elak spam och någon form av validering av datan. Så här kan flödet beskrivas.</p>

<p><strong>1. Användaren skickar in sitt bidrag.</strong><br />
Utifrån formuläret vi har skapat skickar användaren in sitt bidrag för granskning.</p>
<p><strong>2. Bidraget körs via Akismet.</strong><br />
All data vi får in ifrån användaren körs via <a href="http://akismet.com/">Akismet</a> för att avgöra om det är spam eller ej. Om det visar sig vara spam avfärdar vi helt enkelt användaren. Om inte går vi vidare till nästa steg.</p>
<p><strong>3. Spara ned bidrag som ett utkast.</strong><br />
Allt verkar stå rätt till och vi sparar slutligen ner bidraget i vår databas på servern.</p>
<p><strong>4. Meddela användaren att bidraget har tagits emot.</strong><br />
Meddela användaren att bidraget har tagits emot på ett eller annat sätt. Detta kan man göra på flera sätt, ett simpel meddelande som presenteras för användaren eller per e-post.</p>
<p>Nu när vi har en bra överbild över vad vi vill åstadkomma är det dags att skrida till verket.</p>
<p>Vad vi först behöver är ett formulär som användaren kan använda för att posta sitt bidrag. Vi behöver en titel och motivering plus lite information om användaren, som t ex. namn, e-post och telefonnummer. Formuläret nedan innehåller allt vi behöver. Tyvärr så strippar WordPress bort <a href="http://sv.wikipedia.org/wiki/Indentering">indenteringen</a>.</p>
<pre>&lt;form action="" method="post"&gt;
 &lt;fieldset&gt;
 &lt;p&gt;
 &lt;legend&gt;Ditt bidrag&lt;/legend&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_title"&gt;Titel&lt;/label&gt;
 &lt;input type="text" name="campaign[post_title]" id="campaign-post_title" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_content"&gt;Motivering&lt;/label&gt;
 &lt;textarea name="campaign[post_content]" id="campaign-post_content" rows="8" cols="40"&gt;&lt;/textarea&gt;
 &lt;/p&gt;
 &lt;/fieldset&gt;
 &lt;fieldset&gt;
 &lt;p&gt;
 &lt;legend&gt;Om dig&lt;/legend&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_author_name"&gt;Namn&lt;/label&gt;
 &lt;input type="text" name="campaign[post_author_name]" id="campaign-post_author_name" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_author_email"&gt;Email&lt;/label&gt;
 &lt;input type="text" name="campaign[post_author_email]" id="campaign-post_author_email" /&gt;
 &lt;/p&gt;
 &lt;p&gt;
 &lt;label for="campaign-post_author_phone"&gt;Telefon&lt;/label&gt;
 &lt;input type="text" name="campaign[post_author_phone]" id="campaign-post_author_phone" /&gt;
 &lt;/p&gt;
 &lt;/fieldset&gt;
 &lt;p&gt;
 &lt;input type="submit" name="campaign[submit]" value="Posta" id="campaign-submit" /&gt;
 &lt;/p&gt;
&lt;/form&gt;</pre>
<p>Postdatan som skickas när användaren klickar på &#8220;<em>Posta</em>&#8221; måste behandlas av en funktion eller dylikt. I detta fall använder vi oss av en funktion. Personligen föredrar jag att placera denna funktion i functions.php tillhörande temat. Vad funktionen gör är att kolla av om någon har fyllt i formuläret och skickat in uppgifterna. Denna kontroll utförs vid varje pageload med hjälp av WordPress egna funktion <a href="http://codex.wordpress.org/Function_Reference/add_action">add_action</a> som gör det möjligt att binda en funktion till en viss händelse (en s.k. hook). I detta fall binder vi funktionen till &#8220;<em>init</em>&#8221; som står för initialisering (pageload). Det första funktionen gör är att stämma av om postdatan vi söker verkligen har skickats eller inte. Om inte avbryter vi operationen omgående.</p>
<pre>&lt;?php
function mytheme_add_post() {
    global $micro_akismet;

    if (!isset($_POST['campaign']['submit'])) {
        return;
    }
}
add_action('init', 'mytheme_add_post');
?&gt;</pre>
<p>Om man vill kontrollera vissa uppgifter som t ex. att den ifyllda e-postadressen verkligen är en riktig e-postadress ska det ske nu. Förutsagt att man inte gör det innan formuläret skickas med hjälp av JavaScript.</p>
<p>Nästa steg är att kontrollera att uppgifterna vi har fått inte är spam. Detta görs enklast med hjälp av Akismet. Som du säkert redan vet finns det från start ett inbyggt stöd för Akismet när det gäller kommentarerna i WordPress. Dock har jag kommit fram till det är enklare att använda sig <a href="http://vanhegan.net/">Gaby Vanhegans</a> <a href="http://vanhegan.net/software/akismet/">MicroAkismet</a> klass. Jag har själv modifierat klassen lite för att göra det enklare att använda sig av den i WordPress. Denna plugin finns tillgänglig för nedladdning på <a href="http://github.com/mptre/wp-microakismet">GitHub</a>. Observera att denna plugin kräver att du har Akismet pluginen aktiverad och konfigurerad. Efter att både Akismet och MicroAkismet pluggarna är aktiverade och klara kan vi äntligen göra en bedömning om uppgifterna vi fått är spam eller ej.</p>
<pre>$post_data = $_POST['campaign'];
$vars = array(
    'comment_content' =&gt; $post_data['post_content'],
    'comment_author' =&gt; $post_data['post_author_name'],
    'comment_author_email' =&gt; $post_data['post_author_email']
);

if ($micro_akismet-&gt;is_spam($vars)) {
    // We caught a spammer.
} else {
    // Everything's alright.
}</pre>
<p>Om allt är frid och fröjd (ingen spam) kan vi spara ned uppgifterna som ett inlägg med hjälp av funktionen <a href="http://codex.wordpress.org/Function_Reference/wp_insert_post">wp_insert_post</a>. Denna funktion tar en array innehållandes en massa argument som första och enda parameter. Vi vill spara inlägget men inte publicera det på direkten för att ge administratörerna en chans att bedöma om inlägget ska publiceras eller inte. Värt att notera är att  vi inte behöver escape:a den inkommande datan eftersom wp_insert_post gör det i syfte att skydda mot <a href="http://en.wikipedia.org/wiki/Sql_injections">SQL-injektioner</a> och annat otyg.</p>
<pre>$new_post = array(
    'post_title' =&gt; $post_data['post_title'],
    'post_content' =&gt; $post_data['post_content'],
    'post_status' =&gt; 'pending',
    'post_author' =&gt; 2,
    'post_category' =&gt; array(10)
);

if ($post_id = (int)wp_insert_post($new_post)) {
    // Post inserted successfully.
} else {
    // Something went wrong.
}</pre>
<p>Det kan vara bra att sätta upp ett användarkonto som får agera skribent åt alla bidrag. Byt ut post_author värde mot användarens id-nummer. Detsamma gäller även kategorier. Man vill med stor sannolikhet tilldela inlägget kategorin Tävling eller liknande. Notera att post_category argumentet alltid måste vara en array, även fast det bara handlar om en kategori. Byt ut post_category&#8217;s värde mot id-numret på din eller dina kategorier. För en fullständig dokumentation över alla tillgängliga argument rekommenderar jag dig att läsa igenom dokumentation för funktionen hos <a href="http://codex.wordpress.org/Function_Reference/wp_insert_post">WordPress</a>.</p>
<p>Nu när inlägget är har sparats vill vi också spara ner uppgifterna om skribenten. Detta gör vi enklast med hjälp av WordPress egna <a href="http://codex.wordpress.org/Custom_Fields">custom fields</a>. På så sätt försäkrar vi oss om att uppgifterna endast tillhör vårt nyligen sparade inlägg.</p>
<pre>&lt;?php
$post_author = array(
    'post_author_name' =&gt; $post_data['post_author_name'],
    'post_author_email' =&gt; $post_data['post_author_email'],
    'post_author_phone' =&gt; $post_data['post_author_phone']
);

foreach ($post_author as $key =&gt; $val) {
    add_post_meta($post_id, $key, $val);
}
?&gt;</pre>
<p>Om du sedan i ditt tema vill visa upp t ex. skribentens namn kan du använda dig av funktionen <a href="http://codex.wordpress.org/Custom_Fields">get_post_meta</a>. Notera denna funktion måste användas innanför <a href="http://codex.wordpress.org/The_Loop">post-loopen</a>.</p>
<pre>&lt;?php echo get_post_meta($post-&gt;ID, 'post_author_name', TRUE); ?&gt;</pre>
<p>Då var det (nästan) klart! Personligen föredrar jag att &#8220;<em>ajax:ifera</em>&#8221; mina formulär för att skapa en trevligare upplevelse. Detta görs enklast med hjälp av <a href="http://jquery.com/">jQuery</a> och <a href="http://malsup.com/jquery/form/">jForm</a>. Om du bestämmer dig för att använda Ajax är det bra att skicka tillbaka en respons lätt kan tolkas med JavaScript. JSON är rätt det rätta valet för detta jobb. Så här kan en respons se ut i vår funktion.</p>
<pre>&lt;?php
$response = array(
    'status' =&gt; 1,
    'message' =&gt; 'Your post has been submitted!'
);

die(print(json_encode($response)));
?&gt;</pre>
<p>Jag har satt ihop ett demo med all kod ovan, baserat på WordPress default tema. Glöm inte heller att installera <a href="http://github.com/mptre/wp-microakismet">MicroAkismet</a> pluginen innan.</p>
<p><a href="http://qvister.se/wp-content/uploads/qvister_campaign_theme.zip">Ladda ner demot här</a></p>
<p>Det här är min första renodlade guide. Därav uppskattas all form av feedback och konstruktiv kritik. Gör gärna din röst hörd bland kommentarerna om du har synpunkter eller frågor.</p>
<p><em>Thumbnailen tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/jeremygetscash/2648946793/">jmaclynn</a>.<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/08/06/bygg-kampanjsajter-med-wordpress/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Bättre listning av kommentarer i WordPress</title>
		<link>http://qvister.se/2009/07/31/battre-listning-av-kommentarer-i-wordpress/</link>
		<comments>http://qvister.se/2009/07/31/battre-listning-av-kommentarer-i-wordpress/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 14:55:56 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=251</guid>
		<description><![CDATA[Jag gjorde nyligen en ändring av listningen av kommentarerna här på sajten. Sedan WordPress 2.7 har man haft möjlighet att ta kontroll över markupen för kommentarerna medhjälp av funktionen wp_list_comments. Denna funktion tar flera argument, en utav dem är &#8220;callback&#8221; som låter dig koppla en egen funktion som påkallas så fort en kommentar ska visas. [...]]]></description>
			<content:encoded><![CDATA[
<p>Jag gjorde nyligen en ändring av listningen av kommentarerna här på sajten. Sedan WordPress 2.7 har man haft möjlighet att ta kontroll över markupen för kommentarerna medhjälp av funktionen <a href="http://codex.wordpress.org/Template_Tags/wp_list_comments">wp_list_comments</a>.<span id="more-251"></span></p>
<p>Denna funktion tar flera argument, en utav dem är &#8220;<em>callback</em>&#8221; som låter dig koppla en egen funktion som påkallas så fort en kommentar ska visas. På så sätt kan du själv bestämma vad som ska visas och inte visas. Personligen vart jag lite inspirerad av <a href="http://disqus.com/">Disqus</a> listning av kommentarer och valde även att formatera datumet och tiden då kommentaren postades på samma sätt som Twitter. Funktionen jag använder mig av heter niceTime och hittas borta hos <a href="http://manas.tungare.name/software/twitter-php-script/">Manas Tungare</a>. Givetvis har skribentens uppgifter formaterats enligt <a href="http://microformats.org/wiki/hcard">hCard</a> standarden.</p>
<p>Om du själv vill ta kontroll över listningen av kommentarerna på din blogg rekommenderar jag dig att läsa igenom dokumentationen hos <a href="http://codex.wordpress.org/Template_Tags/wp_list_comments">WordPress</a>.</p>
<p><em style="font-size: .88em;">Thumbnailen tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/thehutch/1791627589/">thehutch</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/07/31/battre-listning-av-kommentarer-i-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ny sajt!</title>
		<link>http://qvister.se/2009/07/29/ny-sajt/</link>
		<comments>http://qvister.se/2009/07/29/ny-sajt/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 00:36:25 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=232</guid>
		<description><![CDATA[Äntligen var det dags att släppa den nya qvister sajten. Den gamla sajten var långt ifrån väluppdaterad p.g.a. ett bökigt CMS. Nu har jag istället valt att bygga sajten medhjälp av WordPress. Tanken är även den att börja skriva mer om det jag gör. Inte bara på uppdragsnivå utan även lite mer guider och annat [...]]]></description>
			<content:encoded><![CDATA[<p>Äntligen var det dags att släppa den nya qvister sajten. Den gamla sajten var långt ifrån väluppdaterad p.g.a. ett bökigt CMS. Nu har jag istället valt att bygga sajten medhjälp av <a href="http://wordpress.org">WordPress</a>.<span id="more-232"></span></p>
<p>Tanken är även den att börja skriva mer om det jag gör. Inte bara på uppdragsnivå utan även lite mer guider och annat gott. Håll tillgodo!</p>
<p>Som tidigare nämnt är sajten byggd med WordPress som grund. Nedan följer en lista över de plugins jag använder för den tekniskt intresserade.</p>
<p><a href="http://www.g-loaded.eu/2006/01/05/add-meta-tags-wordpress-plugin/">Add-Meta-Tags</a><br />
Genererar per automatik meta-taggar innehållandes keywords och description.</p>
<p><a href="http://mtekk.weblogs.us/code/breadcrumb-navxt/">Breadcrumb NavXT</a><br />
Ger en möjligheten att inkludera en klassisk &#8220;<em>breadcrumb</em>&#8221; som indikerar vart du som besökare befinner dig. Konfigureringsalternativ finns så det räcker och blir över.</p>
<p><a href="http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/">Google XML Sitemaps</a><br />
Genererar en s.k. &#8220;<em>sitemap</em>&#8221; som gör det enklare för sökmotorer som t ex. Google att få en överblick över sajten innehåll.</p>
<p><a href="http://fortes.com/projects/wordpress/top-level-cats/">Top Level Categories</a><br />
Tar helt enkelt bort &#8220;<em>category</em>&#8221; från kategoriernas permalänkar. Se exempel nedan för före och efter resultat.</p>
<pre>Före: http://qvister.se/category/blogg
Efter: http://qvister.se/blogg</pre>
<p>Om du läser detta inlägg från en rss-läsare är det hög tid att besöka sajten!</p>
<p><em style="font-size: .88em;">Thumbnailen tillhörande detta inlägg är lånad ifrån <a href="http://www.flickr.com/photos/stage88/3228637838/">stage88</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/07/29/ny-sajt/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reboot11</title>
		<link>http://qvister.se/2009/06/30/reboot11/</link>
		<comments>http://qvister.se/2009/06/30/reboot11/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 09:05:59 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[danmark]]></category>
		<category><![CDATA[konferens]]></category>
		<category><![CDATA[reboot]]></category>
		<category><![CDATA[reboot11]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=69</guid>
		<description><![CDATA[Många jag har talat med den senaste tiden har påstått att om man ska gå på en konferens under året är reboot det självklara valet. Av de föreläsningarna jag har sett från tidigare år måste jag säga att jag är mycket imponerad. Med detta i bagaget bestämde jag mig för att gå på årets reboot [...]]]></description>
			<content:encoded><![CDATA[
<p>Många jag har talat med den senaste tiden har påstått att om man ska gå på en konferens under året är <a href="http://www.reboot.dk/">reboot</a> det självklara valet. Av de föreläsningarna jag har sett från tidigare år måste jag säga att jag är mycket imponerad. Med detta i bagaget bestämde jag mig för att gå på årets reboot som enligt tradition äger rum i Kedelhallen (Köpenhamn, Danmark).<span id="more-69"></span></p>
<p>Många av namnen som stod på programmet var inte bekanta sen tidigare. Men jag måste säga att jag var oerhört positivt överraskad. Några av favoriterna var Matt Webb, Pelle Braendgaard och Thomas Madsen-Mygdal som höll en presentation i sann <a href="http://www.ted.com/">TED</a>-kvalité.</p>
<p>Så här i efterhand kan jag bara hålla med. Reboot är värt varenda krona. Inte nog med att presentationerna är riktigt bra så är nog det roligaste att träffa alla andra intressanta personer som var påplats. Mina bilder från vistelsen ligger uppe på <a href="http://www.flickr.com/photos/mptre/sets/72157620688566656/">flickr</a>.</p>
<p>Martin Källström från <a href="http://www.twingly.com/">Twingly</a> gjorde en fantastikt jobb med att fånga den underbara stämningen.</p>
<p><object width="425" height="344" data="http://www.youtube.com/v/hrLFU2RVBiA&amp;hl=sv&amp;fs=1&amp;" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/hrLFU2RVBiA&amp;hl=sv&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/06/30/reboot11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DrupalCamp Sweden</title>
		<link>http://qvister.se/2009/05/29/drupalcamp-sweden/</link>
		<comments>http://qvister.se/2009/05/29/drupalcamp-sweden/#comments</comments>
		<pubDate>Fri, 29 May 2009 16:17:06 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[goodold]]></category>
		<category><![CDATA[konferens]]></category>
		<category><![CDATA[stockholm]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=56</guid>
		<description><![CDATA[Idag besökte jag DrupalCamp Sweden. En konferens om publiceringsverktyget Drupal. Liknande konferenser har anordnats runt om i världen sedan länge. Det här var dock första gången ett renoldat DrupalCamp arrangerades i Sverige, med Dataföreningen och NodeOne som huvudarrangörer. Jag valde att endast besöka campet på lördag. Denna dag stod mer tekniska föreläsningar på agendan. Favoriterna [...]]]></description>
			<content:encoded><![CDATA[<p>Idag besökte jag <a href="http://www.drupalcamp.se/">DrupalCamp Sweden</a>. En konferens om publiceringsverktyget Drupal. Liknande konferenser har anordnats runt om i världen sedan länge. Det här var dock första gången ett renoldat DrupalCamp arrangerades i Sverige, med <a href="http://www.dfs.se/">Dataföreningen </a>och <a href="http://nodeone.se/">NodeOne</a> som huvudarrangörer.<span id="more-56"></span></p>
<p>Jag valde att endast besöka campet på lördag. Denna dag stod mer tekniska föreläsningar på agendan. Favoriterna var &#8220;<em>Frontend optimization of Drupal</em>&#8220;, &#8220;<em>Drupal theming with the 960.gs grid system</em>&#8221; och &#8220;<em>Drupal community: Participating and contributing</em>&#8220;. Det fullständiga programmet hittar du <a href="http://www.drupalcamp.se/program">här</a>.</p>
<p>Under våren har jag börjat kika lite på Drupal och även hunnit med att hjälpa <a href="http://goodold.se/">Good Old</a> med <a href="http://angavallen.se/">Ängavallens</a> nya hemsida som är byggd i Drupal. Helhetsintrycket av plattformen är gott, det känns som om det går att åstadkomma oerhört mycket med förvånadsvärt lite kod. Tanken är att börja arbeta med Drupal mer aktivt inom den närmsta framtiden.</p>
<p>Jag hoppas att fler konferenser som kretsar kring Drupal kommer arrangeras i Sverige. Gärna med lite fler workshops där man får chans att utveckla lite påplats och träffa andra duktiga utvecklare.</p>

]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/05/29/drupalcamp-sweden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excitera iPhone event</title>
		<link>http://qvister.se/2009/05/28/excitera-iphone-event/</link>
		<comments>http://qvister.se/2009/05/28/excitera-iphone-event/#comments</comments>
		<pubDate>Thu, 28 May 2009 19:59:55 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=40</guid>
		<description><![CDATA[Idag besökte jag iPhone App Event arrangerat av Excitera Mobile Cup 2009. I panelen fanns tre killar med minst sagt gediga erfarenheter kring utveckling av applikationer för iPhone. Jack Nutting Har skapat spelet Scribattle och släppte faktiskt idag hans senaste kreation Diabolotros. Aaron Ardiri Gammal linuxräv som verkar ha utvecklat för i stort sätt alla [...]]]></description>
			<content:encoded><![CDATA[<p>Idag besökte jag iPhone App Event arrangerat av <a href="http://www.mobilecup.se/">Excitera Mobile Cup 2009</a>. I panelen fanns tre killar med minst sagt gediga erfarenheter kring utveckling av applikationer för iPhone.<span id="more-40"></span></p>
<p><a href="http://www.nuthole.com/">Jack Nutting</a><br />
Har skapat spelet <a href="http://rebisoft.com/software/scribattle.html">Scribattle</a> och släppte faktiskt idag hans senaste kreation <a href="http://rebisoft.com/software/diabolotros.html">Diabolotros</a>.</p>
<p><a href="http://www.ardiri.com/index.php?redir=palm&amp;cat=lemmings">Aaron Ardiri</a><br />
Gammal linuxräv som verkar ha utvecklat för i stort sätt alla mobila plattformar genom tiderna. Han har skapat inte mindre än sju spel för iPhonen som har gjort stor succée i Japan.</p>
<p><a href="http://jrc.freality.org/">John Chang</a><br />
Jobbade tidigare på Apple med deras operativsystem Mac OS X där han bl.a. varit med och utvecklat applikationen Software Update och Time Machine. Idag jobbar han på Skype här i Stockholm och ansvarar för utvecklingen av deras iPhone applikation.</p>
<p>Alla tre delade med sig av deras egna erfarenheter kring själva utvecklingsprocessen och framförallt App Store. Den sistnämnda processen verkar vara mer omständlig och knepig än vad jag hade trott. Även om man har läst några skräckhistorier fick man en djupare förståelse kring hur det kan gå till. Det hela kan summeras att det kan ta fruktansvärt långt tid att få sin applikation publicerad i App Store.</p>
<p>Dock var inte allt inte bara negativ kritik som riktades mot Apple. Många fördelar lyftes fram och man förstod snabbt att alla tre var väldigt nöjda med det jobb Apple gjort för utvecklarna på iPhone-fronten.</p>
<p>Det hela var mycket inspirerande och jag blir verkligen sugen på att börja utveckla för iPhonen så fort som möjligt. Så nu är det hög tid att börja plöja igenom dokumentationen och läsa tutorials efter tutorials.</p>
<p>Bild lånad av <a href="http://www.flickr.com/photos/bareform/2483573213/">Bjørn Molstad</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/05/28/excitera-iphone-event/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Namnsdagsbot på twitter</title>
		<link>http://qvister.se/2009/01/17/namnsdagsbot-pa-twitter/</link>
		<comments>http://qvister.se/2009/01/17/namnsdagsbot-pa-twitter/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 14:50:34 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=115</guid>
		<description><![CDATA[På min egen namnsdag (17:e januari) slog tanken mig vilken dålig koll åtminstone jag har på allas namnsdagar. Samma dag började jag söka runt efter ett RSS-flöde eller liknande som tillhandahöll alla svenska namnsdagar. Till min glädje fann jag dagensnamnsdag.nu. Ett RSS-flöde är dock inte det ultimata sättet att hålla koll på alla namnsdagar. Varför [...]]]></description>
			<content:encoded><![CDATA[
<p>På min egen namnsdag (17:e januari) slog tanken mig vilken dålig koll åtminstone jag har på allas namnsdagar. Samma dag började jag söka runt efter ett RSS-flöde eller liknande som tillhandahöll alla svenska namnsdagar. Till min glädje fann jag <a href="http://www.dagensnamnsdag.nu">dagensnamnsdag.nu</a>.<span id="more-115"></span></p>
<p>Ett RSS-flöde är dock inte det ultimata sättet att hålla koll på alla namnsdagar. Varför inte låta informationen komma till en istället? Med detta i åtanke skrev jag ihop en enkel twitterbot som varje dag berättar om vem eller vilka som har namnsdag. Om du följer <a href="http://twitter.com/namnsdag">namnsdag</a> på twitter gratulerar den även dig på din egen namnsdag.</p>
<p>För den tekniskt intresserade är det ett skript skrivet i PHP som parse:ar RSS-flödet från <a href="http://www.dagensnamnsdag.nu">dagensnamnsdag.nu</a> och twittrar sedan via twitter egna API. Skriptet körs i en crontab som utförs 01:00 varje dag.</p>
<p>Så vill du bli kvitt alla pinsamma situationer där du har glömt bort eller helt och hållet missat dina nära och käras namnsdagar? Följ då <a href="http://twitter.com/namnsdag">namnsdag</a> på twitter!</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2009/01/17/namnsdagsbot-pa-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spåra utgående länkar med Google Analytics</title>
		<link>http://qvister.se/2008/11/12/spara-utgaende-lankar-med-google-analytics/</link>
		<comments>http://qvister.se/2008/11/12/spara-utgaende-lankar-med-google-analytics/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 08:24:37 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=106</guid>
		<description><![CDATA[Ibland kan det vara intressant eller rent ut sagt nödvändigt att se hur många som klickar på ens utgående länkar. Detta är givetvis möjligt med Google Analytics, dock är det inget som sker från start. Utan man behöver lägga till ett onClick-attribut på varje utgående länk. Att göra det här &#8220;manuellt&#8221; är inget jag vill [...]]]></description>
			<content:encoded><![CDATA[<p>Ibland kan det vara intressant eller rent ut sagt nödvändigt att se hur många som klickar på ens utgående länkar. Detta är givetvis möjligt med Google Analytics, dock är det inget som sker från start. Utan man behöver lägga till ett onClick-attribut på varje utgående länk. Att göra det här &#8220;<em>manuellt</em>&#8221; är inget jag vill ödsla tid på. Istället kan man lösa det med en liten bit JavaScript.<span id="more-106"></span></p>
<p>Personligen föredrar jag att använda mig JavaScript-biblioteket <a rel="external" href="http://jquery.com/">jQuery</a>.</p>
<p>Principen är den att varje gång någon för musen över en länk som har attributen rel=external (d.v.s en utgående länk) läggs onClick-attributen på så att den kan spåras via Google Analytics. OBS Google Analytics koden måste komma före alla utgående länkar, annars kommer inga klick registreras. Förslagsvis lägger du Google Analytics koden precis innan body:n avslutas.</p>
<pre>$(document).ready(function() {
    $('a[rel=external]').hover(function() {
        var href = $(this).attr('href');
        $(this).attr('onClick', 'javascript: pageTracker._trackPageview(\'/outgoing/' + href + '\');');

        return false;
    },function() {
    return false;
    });
});</pre>
<p>Notera att det kan upp till 24-48 timmar innan dina utgående länkar dyker upp i Google Analytics. De utgående länkarna kommer du sedan hitta under Content &gt; Top Content. T ex. kommer länken www.example.com listas som /outgoing/www.example.com i Google Analytics. Läs mer om utgående länkar hos <a onclick="javascript: pageTracker._trackPageview('/outgoing/http://www.google.com/support/analytics/bin/answer.py?hl=en&amp;answer=55527');" rel="external" href="http://www.google.com/support/analytics/bin/answer.py?hl=en&amp;answer=55527" target="_blank">Google</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2008/11/12/spara-utgaende-lankar-med-google-analytics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Korta.nu, gör dina långa länkar korta</title>
		<link>http://qvister.se/2008/11/01/korta-nu-gor-dina-langa-lankar-korta/</link>
		<comments>http://qvister.se/2008/11/01/korta-nu-gor-dina-langa-lankar-korta/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 09:59:13 +0000</pubDate>
		<dc:creator>Anton Lindqvist</dc:creator>
				<category><![CDATA[Blogg]]></category>
		<category><![CDATA[applikation]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://qvister.se/?p=176</guid>
		<description><![CDATA[Korta.nu är en URL-förkortare som fungerar precis på samma sätt som originalet TinyURL. Tjänsten är förövrigt min första renodlade och publika webbapplikation. Idéen grundade sig i frågan &#8220;Hur svårt kan det vara att bygga en URL-förkortare?&#8221; och inte minst p.g.a. avsaknaden av en bra svensk URL-förkortare. En helg senare hade jag en färdig applikation och [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://korta.nu/">Korta.nu</a> är en URL-förkortare som fungerar precis på samma sätt som originalet <a href="http://tinyurl.com/">TinyURL</a>. Tjänsten är förövrigt min första renodlade och publika webbapplikation.<span id="more-176"></span></p>
<p>Idéen grundade sig i frågan &#8220;Hur svårt kan det vara att bygga en URL-förkortare?&#8221; och inte minst p.g.a. avsaknaden av en bra svensk URL-förkortare. En helg senare hade jag en färdig applikation och domänen korta.nu visade sig vara ledig. Idag används tjänsten ganska flitigt, inte minst på <a href="http://search.twitter.com/search?q=korta.nu+filter%3Alinks">Twitter</a>.</p>
<p>Tjänsten kompletteras med en bookmarklet som gör det oerhört enkelt att förkorta länkar med en knapptryckning och en Mac OS X <a href="http://korta.nu/korta.nu-wdgt.zip">Dashboard widget</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://qvister.se/2008/11/01/korta-nu-gor-dina-langa-lankar-korta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
