<?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>Anders Hassis &#187; Programmering</title>
	<atom:link href="http://hassis.com/category/programmering/feed/" rel="self" type="application/rss+xml" />
	<link>http://hassis.com</link>
	<description>Did mmorpgs overwrite your common sense?</description>
	<lastBuildDate>Sun, 06 May 2012 19:07:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Att skriva en egen parser och kompilator i Ruby</title>
		<link>/2012/05/06/att-skriva-en-egen-parser-och-kompilator-i-ruby/</link>
		<comments>/2012/05/06/att-skriva-en-egen-parser-och-kompilator-i-ruby/#comments</comments>
		<pubDate>Sun, 06 May 2012 19:06:32 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">/?p=803</guid>
		<description><![CDATA[I Februari bestämde jag mig för att ta en titt på hur parsing och kompilatorer fungerar, jag valde att imlementera en i Ruby och här kan ni se resultatet. Det påminner väldigt mycket om tankesättet vi hade när vi gjorde en kalkylator i Java för några år sedan i en kurs jag hade på Uppsala [...]]]></description>
			<content:encoded><![CDATA[<p>I Februari bestämde jag mig för att ta en titt på hur parsing och kompilatorer fungerar, jag valde att imlementera en i Ruby och <a href="https://github.com/parse/boatcaptain">här kan ni se resultatet</a>.</p>
<p>Det påminner väldigt mycket om tankesättet vi hade när <a href="https://github.com/parse/Uppsala-University-Courses/tree/master/ImpOOP-Calculator">vi gjorde en kalkylator i Java</a> för några år sedan i en kurs jag hade på Uppsala Universitet. Jag implementerade allt fram tills dess att jag skulle generera den slutliga koden. Kunde inte riktigt bestämma mig för vilket språk jag ville generera, ren Rubykod, Assembler eller C.</p>
<h2>Exempelprogram</h2>
<p><a href="https://github.com/parse/boatcaptain/blob/master/nxx1.txt">Se online på GitHub</a></p>
<pre>/* PROGRAM NAME: nxx1.txt

nxx is a simple programming language that provides:
 numbers
 strings
 assignment statements
 string concatenation
 simple arithmetic operations
 print capability

comments may be enclosed in slash+asterisk .. asterisk+slash
*/
alpha = 16 ;
beta = 2 ;
resultName = "delta" ;
delta = alpha / beta ;
print "Value of " || resultName || " is: " ;
print delta ;
print "\n" ;</pre>
<p>Här är syntaxträdet som produceras av ovanstående kod:</p>
<pre>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here is the abstract syntax tree:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ROOT
    =
        alpha
        16
    =
        beta
        2
    =
        resultName
        "delta"
    =
        delta
        alpha
        /
        beta
    print
        "Value of "
        resultName
        " is: "
    print
        delta
    print
        "\n"</pre>
<h2>Lärdomar</h2>
<p>Själva implementeringen av parsern, lexern och scannern gick bra. Dock märkte jag i slutet att jag saknade en del kunskap om teorin bakom, vilket gjorde det svårt att slutföra. Dessutom fick jag annat att göra så det hamnade i skymundan.</p>
<p>I höst kommer jag läsa en kurs i kompilatorteknik, det ska bli roligt eftersom jag har gett mig på en del av begreppen tidigare och kommer förhoppningsvis ha nytta av mina tidigare erfarenheter och på så sätt ha mer nytta av kursen.</p>
]]></content:encoded>
			<wfw:commentRss>/2012/05/06/att-skriva-en-egen-parser-och-kompilator-i-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frontend med Node och Express, backend med WordPress och JSON API</title>
		<link>/2012/02/08/frontend-med-node-och-express-backend-med-wordpress-och-json-api/</link>
		<comments>/2012/02/08/frontend-med-node-och-express-backend-med-wordpress-och-json-api/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 02:14:42 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Express.js]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">/?p=784</guid>
		<description><![CDATA[I somras så fick jag tillsammans med en kollega i uppdrag att förnya en existerande webbplats. Några av sakerna vi hade i åtanke var att den skulle vara responsiv, intuitiv och byggas med något annat än bara WordPress. Vi började rota runt i Node.js och Express och tänkte att det var något vi ville använda. [...]]]></description>
			<content:encoded><![CDATA[<p>I somras så fick jag tillsammans med en kollega i uppdrag att förnya en existerande webbplats. Några av sakerna vi hade i åtanke var att den skulle vara responsiv, intuitiv och byggas med något annat än bara WordPress.</p>
<p>Vi började rota runt i Node.js och Express och tänkte att det var något vi ville använda. En av styrkorna med WordPress är ju däremot att det är väldigt enkelt att administrera innehåll i det, så vi valde att använda tillägget <a href="http://wordpress.org/extend/plugins/json-api/">JSON API</a> tillsammans med WordPress. På så sätt kunde innehållet hämtas via JSON och på så sätt kan frontenden bara vara ett skal som slussar information.</p>
<h3>Backend</h3>
<p>Som backend så rullade som sagt WordPRess och JSON API. Vi upptäckte ganska tidigt att tillägget var utdaterat när det gäller stödet för <em>custom post types</em> och <em>taxonomies</em>. Vi <a href="http://wordpress.org/extend/plugins/json-api/other_notes/#5.2.-Developing-JSON-API-controllers">byggde enkelt ut</a> vår plattform med de funktioner vi behövde. Anta att denna sida rullar på <em>http://backend.dev</em> och det aktiva temat i sig genererar ingen utdata.</p>
<h3>Frontend</h3>
<p>Basen på frontenden byggdes med hjälp av <a href="http://nodejs.org/">Node.js</a> och <a href="http://expressjs.com">Express</a>. Ett av kraven i funktionaliteten var att vi inte ville att sidan skulle laddas om. Därför använde vi:</p>
<ul>
<li><a href="http://sammyjs.org/">Sammy.js</a> för att hantera URL:er</li>
<li><a href="https://github.com/coolaj86/futures">Futures</a> för att hantera callback-röran (enligt mig) som kan uppstå och för att se till att saker och ting sker asynkront</li>
<li><a href="https://github.com/felixge/node-dirty">Node-dirty</a> för att skapa en lokal cache av JSON anropen som görs mot <em>http://backend.dev</em></li>
<li><a href="https://github.com/danwrong/restler">Restler</a> för att göra REST-anrop mot http://backend.dev</li>
<li><a href="https://github.com/nodejitsu/forever">Forever</a> för att se till att servern hålls igång.
<li><a href="http://learnboost.github.com/cluster/">Cluster</a> för att styra applikationen
</ul>
<p>Exempel på en modell som representerar en klient:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Model   <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'./model'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    API     <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'./api'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    config  <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span>__dirname <span style="color: #339933;">+</span> <span style="color: #3366CC;">'/../conf/'</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>global.<span style="color: #660066;">process</span>.<span style="color: #660066;">env</span>.<span style="color: #660066;">NODE_ENV</span> <span style="color: #339933;">||</span> <span style="color: #3366CC;">'development'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> Client<span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  Model.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">constructor</span>.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
<span style="color: #009900;">&#125;</span>
&nbsp;
Client.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Model<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
Model.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>Client<span style="color: #339933;">,</span> API<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
Client.<span style="color: #660066;">singleUrl</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>slug<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> config.<span style="color: #660066;">wordpress</span>.<span style="color: #660066;">url</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'/api/CustomTheme/get_taxonomy_posts/?taxonomy=client&amp;slug='</span> <span style="color: #339933;">+</span> slug <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&amp;custom_fields=service,type'</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
Client.<span style="color: #660066;">collectionUrl</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> config.<span style="color: #660066;">wordpress</span>.<span style="color: #660066;">url</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'/api/CustomTheme/get_taxonomy_keys/?taxonomy=client'</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
Client.<span style="color: #660066;">singleKey</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'posts'</span><span style="color: #339933;">;</span>
Client.<span style="color: #660066;">collectionKey</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'posts'</span><span style="color: #339933;">;</span>
Client.<span style="color: #660066;">model</span> <span style="color: #339933;">=</span> Client<span style="color: #339933;">;</span>
&nbsp;
Client.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">constructor</span> <span style="color: #339933;">=</span> Client<span style="color: #339933;">;</span>
Client.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">render</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>
    id<span style="color: #339933;">:</span>         <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">term_id</span><span style="color: #339933;">,</span> 
    title<span style="color: #339933;">:</span>      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data</span>.<span style="color: #000066;">name</span><span style="color: #339933;">,</span>
    slug<span style="color: #339933;">:</span>       <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">slug</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
module.<span style="color: #660066;">exports</span> <span style="color: #339933;">=</span> Client<span style="color: #339933;">;</span></pre></div></div>

<p>API är en generell klass som alla modeller använder sig av, och <em>Client.singleUrl</em> och <em>Client.collectionUrl</em> är den URL som API:t ska använda sig av, göra anropet, cacha resultatet och generera en struktur som controllern sedan använder sig av.</p>
<p>Cachen är satt på väldigt hög timeout. Det är en webbplats som inte besökaren har någon möjlighet att påverka innehållet på. Så därför behövde vi komma på en lösning att varje gång en uppdatering skett i WordPress-backenden så rensades vår cache. </p>
<p>Hela miljön deployas med hjälp av Capistrano. Där användes en Rakefile för att hantera situationer som att starta om servern, stoppa servern och rensa cachen.</p>
<h3>Summan av kardemumman</h3>
<p>En ganska krånglig lösning men oerhört kul och inspirerande att få genomföra. Tyvärr blev det tidsbrist och jag hade inte tid att slutföra projektet innan jag åkte till San Jose. Projektet gav mig absolut mersmak för Node.js och vi får se vad jag hittar på i framtiden. </p>
<p>Förra terminen här i San Jose så läste jag en kurs där ett delmoment var i Node, så där hade jag absolut försprång på de andra i klassen. Jag ber om ursäkt för att jag inte kan visa mer kod än vad jag har gjort. </p>
]]></content:encoded>
			<wfw:commentRss>/2012/02/08/frontend-med-node-och-express-backend-med-wordpress-och-json-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Att köra WordPress Multi-Site på VPS med multi domain mapping</title>
		<link>/2011/06/27/att-kora-wordpress-multi-site-pa-vps-med-multi-domain-mapping/</link>
		<comments>/2011/06/27/att-kora-wordpress-multi-site-pa-vps-med-multi-domain-mapping/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 18:19:25 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=627</guid>
		<description><![CDATA[Bakgrund Ett problem som jag haft väldigt länge är att jag kört många olika WordPress-installationer för relativt små projekt. Det är inte alls särskilt roligt att underhålla alla dessa installationer, dvs att hålla kärnan och tillägg uppdaterade. I ett tidigare projekt så skapade Tedde Lundgren ett tillägg som tillät oss att koppla flera olika domäner [...]]]></description>
			<content:encoded><![CDATA[<h3>Bakgrund</h3>
<p>Ett problem som jag haft väldigt länge är att jag kört många olika WordPress-installationer för relativt små projekt. Det är inte alls särskilt roligt att underhålla alla dessa installationer, dvs att hålla kärnan och tillägg uppdaterade. I ett tidigare projekt så skapade <a href="http://twitter.com/tedeh">Tedde Lundgren</a> ett tillägg som tillät oss att koppla flera olika domäner (inte begränsat till subdomäner) till en installation.</p>
<p>Jag är medveten om att det finns liknande tillägg som exempelvis <a href="http://wordpress.org/extend/plugins/wordpress-mu-domain-mapping/">WordPress MU Domain Mapping</a>. Det som skiljde Teddes version från denna var att vi fick tillgång till gruppering av domäner, så vi kan köra separata utvecklingsdomäner. Tillägget är för övrigt en riktig lättviktare och innehåller endast det som behövs, dvs inte bloatat. Tedde har planer på att släppa tillägget öppet senare i sommar.</p>
<p><div id="attachment_669" class="wp-caption alignnone" style="width: 310px"><a href="/static/uploads/hassis.com/2011/06/domainmapper1.jpg" rel="lightbox[627]" title="Domain Mapper"><img class="size-medium wp-image-669" title="Domain Mapper" src="/static/uploads/hassis.com/2011/06/domainmapper1-300x170.jpg" alt="" width="300" height="170" /></a><p class="wp-caption-text">Screenshot Domain Mapper</p></div><br />
&nbsp;<br />
Så förra veckan gjorde jag slag i sak och beställde en VPS hos <a href="http://ipeer.se">Ipeer</a>. Vi har använt Ipeer på många projekt hos <a href="http://populate.se">Populate</a> så jag visste sedan tidigare att det fungerar bra.</p>
<h3>Mjukvara och tjänster som används</h3>
<ul>
<li><a href="http://nginx.net/">Nginx</a> &#8211; Webbserver</li>
<li><a href="http://www.apache.org/">Apache</a>- Webbserver</li>
<li><a href="http://php.net">PHP</a> + <a href="http://php.net/manual/en/book.apc.php">APC</a> &#8211; APC används för cachning</li>
<li><a href="http://memcached.org/">Memcached</a> &#8211; Memcached används för cachning</li>
<li><a href="http://wordpress.org">WordPress</a> + <a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a> &#8211; Publiceringsverktyg samt W3 Total Cache för att cacha</li>
<li><a href="http://www.ruby-lang.org/en/">Ruby</a> + <a href="https://github.com/capistrano/capistrano">Capistrano</a> &#8211; Capistrano är en samling Rubyscript som används för att enkelt deploya till drift/utvecklingsserver</li>
<li><a href="http://git-scm.com/">Git</a> + <a href="http://github.com">GitHub</a> &#8211; Git är versionshantering av källkod, GitHub är en tjänst för att samarbeta med andra utvecklare</li>
</ul>
<h3>Webbserver</h3>
<p>Wikipedia skriver följande angående Nginx:</p>
<blockquote><p>Nginx quickly delivers static content with efficient use of system resources. It can deploy dynamic <a title="HTTP" href="http://en.wikipedia.org/wiki/HTTP">HTTP</a> content on a network using <a title="FastCGI" href="http://en.wikipedia.org/wiki/FastCGI">FastCGI</a> handlers for <a title="Scripting language" href="http://en.wikipedia.org/wiki/Scripting_language">scripts</a>, and can serve as a very capable software <a title="Load balancing (computing)" href="http://en.wikipedia.org/wiki/Load_balancing_%28computing%29">load balancer</a>.<sup id="cite_ref-1"><a href="http://en.wikipedia.org/wiki/Nginx#cite_note-1">[2]</a></sup></p></blockquote>
<p>Med detta som grund så valde jag att använda Nginx som webbserver (@port 80) för att servera allt statiskt material (JavaScript, CSS och bilder), för att sedan proxy:a alla andra anrop vidare till Apache (@port 81).</p>
<h3>Cachning och WordPress</h3>
<p>Genom att använda Memcached, APC i kombination med W3 Total Cache så har jag fått ner laddningstiden i WordPress oerhört mycket. Ett problem som jag tyvärr upplever för tillfället är att administrationen i WordPress 3.1.3 är väldigt trög, det verkar vara ett känt problem som många inte upplevde i 3.0.x-branchen. Vi får se ifall det fixas i 3.2 som borde lanseras inom en snar framtid.</p>
<h3>GitHub och Capistrano</h3>
<p>Versionshantera, snälla! <a href="http://blog.ashodnakashian.com/2011/06/git-for-personal-projects/">Även ifall du är den enda i projektet&#8230;</a> På GitHub har jag samlat all kod jag använder i mina projekt. Jag har ett betalkonto som tillåter mig att ha 10 privata repositories och en medarbetare på dessa. All utveckling sker lokalt (på exempelvis http://hassis.dev) och när jag är nöjd så laddar jag upp på GitHub och den jag arbetar med laddar ner det lokalt och tittar över det. När vi sedan är överens om att det går att släppa publikt så kör vi ut allt genom Capistrano. </p>
<p>Capistrano förutsätter att man har tillgång till SSH och använder sig av publika nycklar för att autentisera sig mot servern.</p>
<h3>Slutsats</h3>
<p>Detta är tänkt som en genomgång vad jag använder för verktyg när jag utvecklar. Vill ni se lite exempel på källkod så får ni gärna säga till.</p>
]]></content:encoded>
			<wfw:commentRss>/2011/06/27/att-kora-wordpress-multi-site-pa-vps-med-multi-domain-mapping/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WP Multi-Site: Aktivering av tillägg</title>
		<link>/2011/05/16/wp-multi-site-aktivering-av-tillagg/</link>
		<comments>/2011/05/16/wp-multi-site-aktivering-av-tillagg/#comments</comments>
		<pubDate>Mon, 16 May 2011 13:49:55 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=543</guid>
		<description><![CDATA[Inledning Stötte för någon vecka på ett nytt problem för min del. Det handlade om att jag skulle skapa ett plugin som används i multi-site. Jag har jobbat relativt lite med Multi-Sites och problemet var att tabellerna inte skapades för alla &#8221;siterna&#8221; som fanns i nätverket. Källkod register_activation_hook&#40;__FILE__, 'hass_vote_activate'&#41;; &#160; function hass_vote_activate&#40;&#41; &#123; global $wpdb; [...]]]></description>
			<content:encoded><![CDATA[<h3>Inledning</h3>
<p>Stötte för någon vecka på ett nytt problem för min del. Det handlade om att jag skulle skapa ett plugin som används i multi-site. Jag har jobbat relativt lite med Multi-Sites och problemet var att tabellerna inte skapades för alla &#8221;siterna&#8221; som fanns i nätverket.</p>
<h3>Källkod</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">register_activation_hook<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hass_vote_activate'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> hass_vote_activate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'is_multisite'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> is_multisite<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'networkwide'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'networkwide'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$old_blog</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">blogid</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000088;">$blogids</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_col</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT blog_id FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;blogs</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$blogids</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$blog_id</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				switch_to_blog<span style="color: #009900;">&#40;</span><span style="color: #000088;">$blog_id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				_hass_vote_activate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			switch_to_blog<span style="color: #009900;">&#40;</span><span style="color: #000088;">$old_blog</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>	
	<span style="color: #009900;">&#125;</span> 
	_hass_vote_activate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> _hass_vote_activate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$table_name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prefix</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'yourtable'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_var</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SHOW TABLES LIKE '<span style="color: #006699; font-weight: bold;">$table_name</span>'&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$table_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;CREATE TABLE &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$table_name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; (
			id mediumint(9) NOT NULL AUTO_INCREMENT,
     			dateadded bigint(11) DEFAULT '0' NOT NULL,
     			subject VARCHAR(255) NOT NULL,
	  		UNIQUE KEY id (id)
	  	);&quot;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span>ABSPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'wp-admin/includes/upgrade.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  		dbDelta<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ovanstående kod vandrar igenom alla dina siter som är uppsatta i nätverket och kör aktiveringsfunktionen för dessa.</p>
<p>Koden ovan raderar inte tabellerna vid inaktivering, det skapar heller inte tabellerna för nya siter som aktiveras i nätverket. Du får i sådana fall använda följande actions:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">add_action<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'wpmu_new_blog'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'your_function_activation_on_new_blog'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 		<span style="color: #666666; font-style: italic;">// For new site</span>
register_deactivation_hook<span style="color: #009900;">&#40;</span> <span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'your_deactivation_function'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		<span style="color: #666666; font-style: italic;">// For deactivation</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>/2011/05/16/wp-multi-site-aktivering-av-tillagg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Citerus Hackers Night 2011: Crazy Snake</title>
		<link>/2011/05/05/citerus-hackers-night-2011-crazy-snake/</link>
		<comments>/2011/05/05/citerus-hackers-night-2011-crazy-snake/#comments</comments>
		<pubDate>Thu, 05 May 2011 14:09:26 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=516</guid>
		<description><![CDATA[Citerus anordnade i tisdags (3/5) ett event i Stockholm där uppdraget var att programmera en ormhjärna. Din ormhjärna skulle sedan tävla mot andra ormar som andra lag programmerat. Jag, Oskar Wirén och Jim Sagevid var ett lag, vi hade inte tittat så mycket på API:t innan så vi hade ganska dålig koll på det. Tävlingen [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.citerus.se/hackers_night_snake_edition">Citerus anordnade i tisdags (3/5) ett event</a> i Stockholm där uppdraget var att programmera en ormhjärna. Din ormhjärna skulle sedan tävla mot andra ormar som andra lag programmerat.</p>
<p>Jag, <a href="http://se.linkedin.com/pub/oskar-wir%C3%A9n/33/212/986">Oskar Wirén</a> och <a href="http://jimsagevid.se">Jim Sagevid</a> var ett lag, vi hade inte tittat så mycket på API:t innan så vi hade ganska dålig koll på det. Tävlingen gick ganska dåligt för oss, vi slarvade alldeles för mycket och vi blev väldigt stressade. Istället så fick vi ihop en fungerande version på vägen hem på tåget på ca. 4-5 minuter&#8230;</p>
<p>Det lutar åt att några av de andra lagen hade lite förberett kod, då det var ganska stressigt med tid att få klar en första prototyp (~1h), eller så var de helt enkelt grymt snabba! Hade vi haft lite framförhållning så hade det nog varit en ganska smart idé, men det är alltid lätt att vara efterklok. Det var i alla fall en väldigt trevlig kväll och ett riktigt kul arrangemang!</p>
<h3>Demonstration</h3>
<p><iframe width="480" height="390" src="http://www.youtube.com/embed/_1FCyXG5Nt8" frameborder="0" allowfullscreen></iframe></p>
<p>Här kör vi mot ett annat lag som också kommer ifrån Uppsala, vi heter &#8221;Team Borm&#8221; (den kör v2) och de är &#8221;Sneaky Brian&#8221;. Vi märker tydligt att det är en del problem när båda två är väldigt nära samma frukt.</p>
<h3>Källkod</h3>
<p><a href="https://github.com/parse/borm-snake-citerus">Finns samlat på Github</a>. </p>
<p>Den första versionen <a href="https://github.com/parse/borm-snake-citerus/blob/master/java-brain/src/main/java/org/badass/snake/brain/MadBormBrain.java">finns här</a> (v1, som vi inte hann slutföra på tävlingen) och den som vi fortsatte lite på <a href="https://github.com/parse/borm-snake-citerus/blob/master/java-brain/src/main/java/org/badass/snake/brain/BormBrain.java">finns här</a> (v2).</p>
<p>Själva <a href="https://github.com/parse/borm-snake-citerus/blob/master/java-brain/src/main/java/org/badass/snake/brain/PathPlanner.java">path-hanteraren finns här</a>.</p>
<h3>Mer läsning</h3>
<p><a href="http://www.citerus.se/post/325559-lag-paxport-vann-crazy-snake">Lag Paxport vann Crazy Snake</a><br />
<a href="http://www.citerus.se/post/325558-ladda-clojure-kod-med-java-util-serviceloader">Ladda Clojure-kod med java.util.ServiceLoader</a></p>
]]></content:encoded>
			<wfw:commentRss>/2011/05/05/citerus-hackers-night-2011-crazy-snake/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>(Ytterligare en) Karusell i jQuery</title>
		<link>/2011/04/20/ytterligare-en-karusell-i-jquery/</link>
		<comments>/2011/04/20/ytterligare-en-karusell-i-jquery/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 20:35:57 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=508</guid>
		<description><![CDATA[Jag tänkte dela med mig av en karusell i jQuery, eller kanske en &#8221;infinite slider&#8221; som det så fint heter. Jag utgick ifrån en väldigt enkel slider som jag hittade, de allra flesta &#8221;färdiga&#8221; jag hittade var alldeles för stora, klumpiga och bloatade. Krav: Pilar för att navigera höger och vänster En manuell navigering för [...]]]></description>
			<content:encoded><![CDATA[<p>Jag tänkte dela med mig av en karusell i jQuery, eller kanske en &#8221;<em>infinite slider</em>&#8221; som det så fint heter. Jag utgick ifrån en väldigt <a href="http://jqueryfordesigners.com/jquery-infinite-carousel/">enkel slider som jag hittade</a>, de allra flesta &#8221;färdiga&#8221; jag hittade var alldeles för stora, klumpiga och bloatade.</p>
<h3>Krav:</h3>
<ul>
<li>Pilar för att navigera höger och vänster</li>
<li>En manuell navigering för att hoppa till valfri &#8221;slide&#8221;</li>
</ul>
<h3>Demo</h3>
<p><a href="http://dl.dropbox.com/u/500851/breakdown/index.html">Finns i min Dropbox</a>.</p>
<h3>Markup</h3>
<p>Läs först igenom <a href="http://jqueryfordesigners.com/jquery-infinite-carousel/">jQuery Infinite Carousel</a> och se till att du är med på grundkonceptet, alltså hur den visar respektive slide. Det jag lagt till är att du placerar pilarna i lista som detta:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;ul&gt;
	&lt;li&gt;&lt;a class=&quot;back&quot; href=&quot;#&quot; title=&quot;Previous&quot;&gt;&amp;lt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a class=&quot;forward&quot; href=&quot;#&quot; title=&quot;Next&quot;&gt;&amp;gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre></div></div>

<p>Samt den manuella navigeringen lägger du bara in en placeholder för:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;div id=&quot;splash-manual-nav-container&quot;&gt;&lt;/div&gt;</pre></div></div>

<h3>Källkod</h3>
<p>Allting finns samlat i <a href="https://gist.github.com/932749">en Gist på Github</a>.</p>
<p><strong>HTML</strong><br />
<script src="https://gist.github.com/932749.js?file=gistfile1.html"></script><br />
<strong>CSS</strong><br />
<script src="https://gist.github.com/932749.js?file=style.css"></script><br />
<strong>JavaScript</strong><br />
<script src="https://gist.github.com/932749.js?file=jquery-infiniteslider.js"></script></p>
<h3>Kommentarer?</h3>
<p>Jag försökte hålla det så enkelt som möjligt, samt att jag ville ha en &#8221;ren&#8221; version som jag själv kan gå tillbaka till och återanvända i andra projekt. Har ni förslag på förbättringar så tar jag gärna emot dem!</p>
]]></content:encoded>
			<wfw:commentRss>/2011/04/20/ytterligare-en-karusell-i-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Runestone 2011: WALL-E</title>
		<link>/2011/03/22/runestone-2011-wall-e/</link>
		<comments>/2011/03/22/runestone-2011-wall-e/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 17:54:37 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RMI]]></category>
		<category><![CDATA[Uppsala Universitet]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=455</guid>
		<description><![CDATA[Uppdaterad 2011-03-31 med källkod och lite mer information Vi har under de senaste 7 veckorna arbetat med ett projekt i en kurs som heter &#8221;Distribuerade system med projekt&#8221;. Vår projektbeskrivning var i korta drag detta: &#8221;You are to design and implement a complete software system that provides Internet access to semi-autonomous soft-realtime robot.&#8221; Då hälsar [...]]]></description>
			<content:encoded><![CDATA[<p><em>Uppdaterad 2011-03-31 med källkod och lite mer information</em></p>
<p>Vi har under de senaste 7 veckorna arbetat med ett projekt i en kurs som heter &#8221;Distribuerade system med projekt&#8221;. Vår projektbeskrivning var i korta drag detta:</p>
<blockquote><p>&#8221;You are to design and implement a complete software system that provides Internet access to semi-autonomous soft-realtime robot.&#8221;</p></blockquote>
<p>Då hälsar vi WALL-E välkommen!</p>
<p><a href="http://hassis.com/static/uploads/hassis.com/2011/03/Wallereal.jpg" rel="lightbox[455]" title="Runestone 2011: WALL-E"><img class="alignnone size-medium wp-image-492" src="http://hassis.com/static/uploads/hassis.com/2011/03/Wallereal-300x146.jpg" alt="" width="421" height="204" /></a><br />
<em>WALL-E med orginalet</em></p>
<h3>Introduktion</h3>
<p>WALL-E är konstruerad i Lego, den är ifrån <a href="http://mindstorms.lego.com/">Lego Mindstorms NXJ</a> och omflashad med <a href="http://lejos.sourceforge.net/">LeJOS</a> för att vi ska kunna köra Java på den.</p>
<p>Vårt projekt krävde att vi skulle kunna styra roboten från vilken klient som helst, därför valde vi att köra Java RMI mellan våra olika system.</p>
<p><a href="http://hassis.com/static/uploads/hassis.com/2011/03/System-diagram.jpg" rel="lightbox[455]" title="Runestone 2011: WALL-E"><img class="alignnone size-full wp-image-456" src="http://hassis.com/static/uploads/hassis.com/2011/03/System-diagram.jpg" alt="" width="463" height="329" /></a><br />
<em>System diagram</em></p>
<h3>Klienten</h3>
<p><a href="http://hassis.com/static/uploads/hassis.com/2011/03/walle-client.jpg" rel="lightbox[455]" title="Runestone 2011: WALL-E"><img class="alignnone size-medium wp-image-460" src="http://hassis.com/static/uploads/hassis.com/2011/03/walle-client-300x207.jpg" alt="" width="300" height="207" /></a><br />
<em>Windowsklienten</em></p>
<p>Klienten är skriven som en Java-applet och kan därför köras ifrån alla möjliga operativsystem, de vi har testat är Linux, Mac OS X samt Windows 7. Den ansluter till ett externt ip som &#8221;robotservern&#8221; körs på.</p>
<p>&nbsp;</p>
<p><a href="http://hassis.com/static/uploads/hassis.com/2011/03/manual-mode.jpg" rel="lightbox[455]" title="Runestone 2011: WALL-E"><img class="alignnone size-medium wp-image-462" src="http://hassis.com/static/uploads/hassis.com/2011/03/manual-mode-300x129.jpg" alt="" width="300" height="129" /></a><br />
<em>Dataflöde &#8211; Manuellt läge</em></p>
<p>Ovan ser ni även hur flödet ser ut när vi skickar enskilda kommandon ifrån det manuella läget i klienten.</p>
<h3>Autopiloten</h3>
<p>I projektet ingick även att vi ska samarbeta med en annan robot i Sverige och söka av ett rum. Vi satte därför upp ytterligare en service som sköter kartan, den körs via RMI och använder sig av en MySQL-databas som robotarna sedan kommunicerar med via interfaces. Kartan genereras sedan med hjälp av GD och PHP och skickas sedan till klienten.</p>
<p>Denna del är den som tagit överlägset längst tid, vår autopilot gör väldigt komplicerade beslut på egen hand. Bra jobbat <a href="http://sportfantast.se/">Julius</a>, Erik och Henrik!</p>
<p>&nbsp;</p>
<p><a href="http://hassis.com/static/uploads/hassis.com/2011/03/automode.jpg" rel="lightbox[455]" title="Runestone 2011: WALL-E"><img class="alignnone size-medium wp-image-461" src="http://hassis.com/static/uploads/hassis.com/2011/03/automode-300x280.jpg" alt="" width="300" height="280" /></a><br />
<em>Dataflöde &#8211; Autopilot</em></p>
<p>När roboten körs i autopilot-läget så gör den inga beslut själv, alla beslut sker genom robotservern och den i sin tur kontrollerar hela tiden med kartservern vilka ytor som är lediga/upptagna.</p>
<h3>Kartläggningsalgoritm</h3>
<ul>
<li>Allting baseras på en &#8221;tile map&#8221; för att förenkla algoritmen. </li>
<li>Den använder en egenkomponerad Dijkstra-algoritm med viktbaserad beslutshantering för all kartläggning. </li>
<li>Den använder även ett poängsystem för att bestämma vilken del av kartan den ska besöka härnäst. </li>
<li>Varje gång den kollar något så kollar den detta tre gånger, med små vinkelskiftningar, för att förbättra avläsningen.</li>
</ul>
<p><a href="http://hassis.com/static/uploads/hassis.com/2011/03/mapping_algorithm.png" rel="lightbox[455]" title="Runestone 2011: WALL-E"><img src="http://hassis.com/static/uploads/hassis.com/2011/03/mapping_algorithm-300x186.png" alt="" width="300" height="186" class="alignnone size-medium wp-image-502" /></a></p>
<h3>Demonstration</h3>
<p>Detta är en 40 sekunder lång demonstration, där WALL-E har kört igenom en hinderbana och håller på att slutföra kartan. Håll koll på den övre högra delen på kartan på laptopen där den monterar ut väggarna allt eftersom den flyttar på sig (jag ber om ursäkt att ljudet hackar i videon).</p>
<p><iframe title="YouTube video player" width="560" height="349" src="http://www.youtube.com/embed/add8DNRPVbw" frameborder="0" allowfullscreen></iframe></p>
<h3>Källkod</h3>
<p>Finns i <a href="https://github.com/parse/runestone2011">Runestone2011 på Github</a>. </p>
<p>Tyvärr verkar den ha tappat all commit-historik när jag flyttade över det, det var lite trist. För en fullständig historik av commitsen så har jag en lokal kopia lagrad med all information.</p>
<p>Så här i efterhand så är vi väl inte särskilt nöjda med kodresultatet, vi hade nog gjort om det mesta <a href="http://xkcd.com/844/">på ett &#8221;bättre&#8221; sätt</a>.</p>
]]></content:encoded>
			<wfw:commentRss>/2011/03/22/runestone-2011-wall-e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtuell utvecklingsmiljö med VirtualBox</title>
		<link>/2010/11/27/virtuell-utvecklingsmiljo-med-virtualbox-och-ubuntu/</link>
		<comments>/2010/11/27/virtuell-utvecklingsmiljo-med-virtualbox-och-ubuntu/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 16:53:55 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=416</guid>
		<description><![CDATA[Ett av problemen jag haft under längre tid har varit att jag trivs alldeles för bra att utveckla med min MacBook. Detta för att det är så mycket enklare att manövrera i operativsystemet mha terminalen, samt att det är så smidigt att använda Git, Ruby, Sass etc. you name it. Jag försökte för någon månad [...]]]></description>
			<content:encoded><![CDATA[<p>Ett av problemen jag haft under längre tid har varit att jag trivs alldeles för bra att utveckla med min MacBook. Detta för att det är så mycket enklare att manövrera i operativsystemet mha terminalen, samt att det är så smidigt att använda Git, Ruby, Sass etc. you name it.</p>
<p>Jag försökte för någon månad sedan att åstadkomma en liknande miljö med VirtualBox och Ubuntu, det gick åt pipan. Igår kväll så började jag nysta i det igen och fick faktiskt fart på det hela!</p>
<h2>Mitt mål</h2>
<ul>
<li>Sätta upp VirtualBox</li>
<li>Installera Ubuntu</li>
<li>Använda Ubuntu som utvecklingsserver och dela kataloger mha Samba</li>
<li>Kunna SSH:a till denna genom att denna får ett internt ip samt att den ska ha internetåtkomst</li>
<li>Sätta upp Git tillsammans med mitt Github-konto</li>
<li>Installera RVM och Rails, Padrino etc.</li>
</ul>
<h3>Sätta upp VirtualBox och installera Ubuntu</h3>
<p>Ladda ner <a href="http://www.virtualbox.org/">VirtualBox</a> och installera <a href="http://www.ubuntu.com/">Ubuntu</a> (jag valde desktop edition). Jag har en trådad uppkoppling så jag sätter min trådade anslutning som delad och noterar vilket IP denna får (192.168.56.1).  Det bör även finnas en &#8221;VirtualBox Host-Only Network&#8221;-adapter i dina nätverksanslutningar, det är denna som ska ha fått ett IP som ex. 192.168.56.1.</p>
<p>Gå in i inställningarna för VirtualBox och Ubuntu och sätt upp två anslutningar, en för NAT och en för &#8221;Endast värd-kort&#8221; (host-only-adapter). Ändra i din fil /etc/network/interfaces till detta:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">auto lo
iface lo inet loopback
&nbsp;
auto eth0
iface eth0 inet dhcp
&nbsp;
auto eth1
iface eth1 inet dhcp</pre></div></div>

<p>Kör ifconfig -a och kontrollera så att du har två olika IP:n på din eth0 (min är 10.0.2.15) och eth1 (min är 192.168.56.101).</p>
<p>Har du fått till detta så kan du förhoppningsvis SSH:a till maskinen (förutsatt att du installerat en ssh-daemon)!</p>
<h3>Sätta upp delning av kataloger</h3>
<p>(Källa: <a href="http://ubuntuforums.org/showthread.php?t=280473">Ubuntu Forums &#8211; HOWTO: Mounting SMB Shares</a>)<br />
Härligt, du har en fungerande Ubuntu som du nu kan starta upp och gömma i bakgrunden och sköta genom ex Putty. Eftersom jag fortfarande kommer sköta själva programmeringen i Windows-miljön så kommer jag vilja ha en katalog som är delad mellan Ubuntu och Windows. Jag skapade en katalog på Windows-datorn som jag kallade för VirtualUbuntu som jag satte som delad, sedan skapade jag en katalog på Ubuntu som jag planerar att montera denna nätverkskatalog i.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-t</span> cifs <span style="color: #000000; font-weight: bold;">//</span>192.168.56.1<span style="color: #000000; font-weight: bold;">/</span>VirtualUbuntu <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>mittusername<span style="color: #000000; font-weight: bold;">/</span>VirtualWin <span style="color: #660033;">-o</span> <span style="color: #007800;">iocharset</span>=utf8,<span style="color: #007800;">username</span>=mittanvandarnamn,<span style="color: #007800;">password</span>=mittlosenord,<span style="color: #007800;">file_mode</span>=0777,<span style="color: #007800;">dir_mode</span>=0777</pre></div></div>

<p>Detta monterar katalogen, nu vill jag att den ska monteras varje gång jag startar upp min virtuella Ubuntu. Så gå in i /etc/fstab och ange något liknande i slutet:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">//</span>192.168.56.1<span style="color: #000000; font-weight: bold;">/</span>VirtualUbuntu <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>mittusername<span style="color: #000000; font-weight: bold;">/</span>VirtualWin   smbfs  auto,<span style="color: #007800;">credentials</span>=<span style="color: #000000; font-weight: bold;">/</span>root<span style="color: #000000; font-weight: bold;">/</span>.credentials,<span style="color: #007800;">uid</span>=<span style="color: #000000;">1000</span>,<span style="color: #007800;">umask</span>=000,user   <span style="color: #000000;">0</span> <span style="color: #000000;">0</span></pre></div></div>

<p>Jag har även skapat en fil i /root/.credentials för att hålla mina uppgifter med följande innehåll:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">username</span>=your_smb_username
<span style="color: #007800;">password</span>=your_smb_password</pre></div></div>

<p>Sätt sedan rättigheterna på den filen med:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">600</span> <span style="color: #000000; font-weight: bold;">/</span>root<span style="color: #000000; font-weight: bold;">/</span>.credentials</pre></div></div>

<p>När du sedan startar om Ubuntu kan du enkelt montera med:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-a</span></pre></div></div>

<h3>Sätt upp Git + Github</h3>
<p>Installera Git med</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> git-core</pre></div></div>

<p>Följ sedan guiden på <a href="http://help.github.com/linux-git-installation/">Githubs hemsida om Linux-installationen</a>.</p>
<h3>Installera Ruby med RVM</h3>
<p>För att kunna ha möjligheten att köra flera olika Ruby-versioner (väldigt behändigt!) och framförallt hålla dessa separerade så använder jag RVM &#8211; <a href="http://rvm.beginrescueend.com/">http://rvm.beginrescueend.com</a>. Detta kan du installera genom att följa instruktionerna på <a href="http://rvm.beginrescueend.com/rvm/install/">http://rvm.beginrescueend.com/rvm/install/</a>.</p>
<p>Några vettiga kommandon med exempel är:</p>
<ul>
<li><em>rvm install ruby-1.9.2-p0</em> (installera 1.9.2 via RVM)</li>
<li><em>rvm list</em> (listar Ruby-variationer, indikerar även vilken som är aktiv)</li>
<li><em>rvm use ruby-1.9.2-p0</em> (välj den specifika Ruby)</li>
<li><em>rvm package install zlib</em> (mer om detta i nästa stycke)</li>
</ul>
<h3>Installera Rails</h3>
<p>Jag valde att köra Ruby 1.9.2 via RVM och då stötte jag på patrull i form av gnäll på att jag inte hade zlib och openssl, en snabb sökning gav följande resultat:</p>
<ul>
<li><a href="http://rvm.beginrescueend.com/packages/zlib/">http://rvm.beginrescueend.com/packages/zlib/</a></li>
<li><a href="http://rvm.beginrescueend.com/packages/zlib/">http://rvm.beginrescueend.com/packages/openssl/</a></li>
</ul>
<p>Följer du dessa instruktioner så borde det gå bra att få in Rails.</p>
<h3>Summan av kardemumman</h3>
<p>Detta är skrivet som en liten &#8221;kom ihåg&#8221;-post till mig själv inför nästa gång jag ska genomföra detta, förhoppningsvis har någon annan nytta av det också! Lycka till!</p>
]]></content:encoded>
			<wfw:commentRss>/2010/11/27/virtuell-utvecklingsmiljo-med-virtualbox-och-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speed me up, Scotty!</title>
		<link>/2010/11/05/speed-me-up-scotty/</link>
		<comments>/2010/11/05/speed-me-up-scotty/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 18:00:50 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=390</guid>
		<description><![CDATA[Något som jag varit besatt av den senaste tiden är att få upp hastigheten på webbplatser. Sedan Google påpekade att de kommer börja ranka sidor efter hastighet så känns det som att det är vettigt att lägga ner lite tid på att undersöka detta. Ett bra ställe att börja på är Yahoos riktlinjer och &#8221;good [...]]]></description>
			<content:encoded><![CDATA[<p>Något som jag varit besatt av den senaste tiden är att få upp hastigheten på webbplatser. Sedan <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">Google påpekade att de kommer börja ranka sidor efter hastighet</a> så känns det som att det är vettigt att lägga ner lite tid på att undersöka detta.</p>
<p>Ett bra ställe att börja på är <a href="http://developer.yahoo.com/performance/rules.html">Yahoos riktlinjer och &#8221;good practices&#8221;</a> på deras <a href="http://developer.yahoo.com">developer network</a>.</p>
<p>Jag tänkte gå igenom några av de saker som jag tycker är viktigast när det gäller att optimera laddningstider.</p>
<h3>Javascript i footern</h3>
<p>En tumregel jag har är att javascript ska läggas i sidfoten och stilmallar ska ligga i sidhuvudet. Anledningen till att jag vill ladda Javascript i sidfoten är för att undvika att blockera visningen av innehåll, ni kan läsa mer om detta på &#8221;<a href="http://developer.yahoo.com/performance/rules.html#js_bottom">Yahoo: Put Scripts at the Bottom</a>&#8221;.</p>
<h3>Undvik inline-Javascript och inline-CSS</h3>
<p>Låt mig cacha! Detta kan inte betonas nog hårt. Genom att lägga Javascript och CSS externt så får webbläsaren möjlighet att cacha filerna.</p>
<h3>Utnyttja Content Delivery Networks (CDN)</h3>
<p>Jag har de senaste dagarna testat <a href="https://support.loopia.se/wiki/Autobahn">Autobahn</a> hos <a href="http://www.loopia.se">Loopia</a> i <a href="http://blogg.loopia.se/2009/05/12/snabba-upp-wordpress-med-autobahn/">kombination med WordPress</a>. Det har fungerat väldigt smidigt och jag verkligen glad att jag provade det! </p>
<p>Vill man vara riktigt duktig kan man skapa en s.k. &#8221;cookie-free domain&#8221; på en separat domän. Det går ut på att du har en helt separat domän för ditt statiska material och då undviker du att skicka redan satta cookies till den domänen (utöver den vanliga domänen). Läs mer om detta på &#8221;<a href="http://developer.yahoo.com/performance/rules.html#cookie_free">Yahoo: Use Cookie-free Domains for Components</a>&#8221;.</p>
<p>Något jag funderat kring men ännu inte provat särskilt mycket är att använda <a href="http://docs.jquery.com/Downloading_jQuery#CDN_Hosted_jQuery">externa CDN även för ex. jQuery</a>.</p>
<p>Fördelarna är att ifall besökaren besökt en annan webbplats som använder samma CDN som du använder för jQuery-versionen så har den redan laddat ner den och cachat den, så den behöver inte laddas ner på nytt. Nackdelen är att du har lite svårare att kontrollera någon slags &#8221;fallback&#8221; ifall din CDN ligger nere.</p>
<h3>Dra ner på antalet anrop(!)</h3>
<p>Med anrop menas antalet bilder, Javascript och CSS -filer som laddas in vid en sidladdning.  Jag använder mig av Firebug för att hålla koll på mängden anrop. Jag försöker undvika att ladda för mycket, även om det är svårt att sätta en speciell gräns på vad som är &#8221;för mycket&#8221;. </p>
<p>Detta brukar kunna bli ett stort problem när man kör många WordPress-tillägg, då väldigt många använder sig av en hel del Javascript och CSS. Är jag riktigt ambitiös så redigerar jag tillägget och rycker ut de filerna som de använder för att slå ihop dem till en enda, detta för att få ner antalet anrop.</p>
<p>En metod för att hålla nere anropen av bilder är att utnyttja CSS-sprites, läs mer i &#8221;<a href="http://www.smashingmagazine.com/2009/04/27/the-mystery-of-css-sprites-techniques-tools-and-tutorials/">The Mystery Of CSS Sprites</a>&#8221;.</p>
<h3>Slutsats</h3>
<p>Ta dig tid att läsa på om ämnet och försök göra dina servrar och besökare glada genom att erbjuda korta laddningstider. Bra verktyg att använda är <a href="http://getfirebug.com/">Firebug</a> och <a href="http://developer.yahoo.com/yslow/">YSlow</a>. </p>
<p>Jag har <a href="http://hassis.com/resurser/">uppdaterat mina resurser</a> en del under de senaste veckorna, ta gärna en titt på dem.</p>
<p>Har ni några tips får ni gärna lämna en kommentar till mig!</p>
]]></content:encoded>
			<wfw:commentRss>/2010/11/05/speed-me-up-scotty/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordCamp Stockholm 2010</title>
		<link>/2010/10/16/wordcamp-stockholm-2010/</link>
		<comments>/2010/10/16/wordcamp-stockholm-2010/#comments</comments>
		<pubDate>Sat, 16 Oct 2010 08:17:01 +0000</pubDate>
		<dc:creator>Anders</dc:creator>
				<category><![CDATA[Personligt]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://hassis.com/?p=368</guid>
		<description><![CDATA[Den 23-24 oktober går Sveriges första WordCamp av stapeln. Platsen är Tekniska muséet i Stockholm, och dit kommer vi för att lära av varandra samt ha trevligt &#8211; allt i skön WordPress-anda. Jag deltog i en tävling av Binero och lyckades knipa en biljett till WordCamp Stockholm den kommande helgen (23-24 oktober). Ser ni mig [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://se.wordcamp.org/"><img src="http://hassis.com/static/hassis.com/uploads/2010/10/wordcampsthlm2010-180x300.png" alt="" width="180" height="300" class="alignright size-full wp-image-369" /></a><br />
<blockquote>Den 23-24 oktober går Sveriges första WordCamp av stapeln. Platsen är Tekniska muséet i Stockholm, och dit kommer vi för att lära av varandra samt ha trevligt &#8211; allt i skön WordPress-anda. </p></blockquote>
<p>Jag deltog i <a href="http://blogg.binero.se/2010/10/grattis-har-ar-vinnarna-i-wordcamp-tavlingen-eller-varfor-grodor-flyger/">en tävling av Binero</a> och lyckades knipa en biljett till <a href="http://se.wordcamp.org">WordCamp Stockholm</a> den kommande helgen (23-24 oktober).</p>
<p>Ser ni mig där så tveka inte att säga hej!</p>
<h3>Uppdatering 2010-10-21</h3>
<p>P.g.a. lite oplanerade studier så har jag idag tvingats avboka min biljett på WordCamp. Vi ses nästa år istället!</p>
]]></content:encoded>
			<wfw:commentRss>/2010/10/16/wordcamp-stockholm-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

