<?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/"
	>

<channel>
	<title>Mikael Brevik</title>
	<atom:link href="http://mikaelb.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikaelb.net</link>
	<description>Bloggen</description>
	<pubDate>Mon, 07 Sep 2009 20:11:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Liten innføring i foreninger (JOIN) i SQL</title>
		<link>http://mikaelb.net/2009/09/liten-innf%c3%b8ring-i-foreninger-join-i-sql/</link>
		<comments>http://mikaelb.net/2009/09/liten-innf%c3%b8ring-i-foreninger-join-i-sql/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 20:09:39 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Generelt]]></category>

		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=161</guid>
		<description><![CDATA[Denne artikkelen baserer seg mest på SQL-standarden (Oracle), men kommer også til å komme med innstikk dersom forskjellige metoder ikke fungerer i MySQL, da jeg går ut i fra at denne dialekten er den mest brukte her på forumet, men tror ikke det skal bli noe problem.
Noen ord om forening (JOIN)
En forening, eller JOIN som [...]]]></description>
			<content:encoded><![CDATA[<p>Denne artikkelen baserer seg mest på SQL-standarden (Oracle), men kommer også til å komme med innstikk dersom forskjellige metoder ikke fungerer i MySQL, da jeg går ut i fra at denne dialekten er den mest brukte her på forumet, men tror ikke det skal bli noe problem.</p>
<h2><strong>Noen ord om forening (JOIN)</strong></h2>
<p>En forening, eller JOIN som det heter på engelsk, er en rasjonell operator på lik linje som utvelgelse av kolonner eller rader som skal vises. Det er en operasjon på relasjons-databaser som brukes til å koble sammen to eller flere tabeller i en database - igjennom en felles kolonne. Dersom man bruker MySQL og InnoDB vil det som regel være primærnøkkelen og fremmednøkkelen som blir brukt som bindeledd.</p>
<p>Et lite eksempel på hva man kan oppnå med forening.</p>
<p>Jeg har to tabeller. Den ene inneholder personer i et register, den andre inneholder postnummer og poststed. Det jeg vil oppnå er å liste ut alle personer med tilhørende poststed. Tabellene ser slik ut (bruker relasjonell form).</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;">person <span style="color: #66cc66;">&#40;</span>person_id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">,</span> zip_code<span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
postal <span style="color: #66cc66;">&#40;</span>zip_code<span style="color: #66cc66;">,</span> post_place<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>De som er understreket er primærnøkler og * markerer en fremmednøkkel. Dette er hva vi kaller en en-til-mange relasjon. For å hente ut ønsket info kan jeg bruke denne spørringen.</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<p>Nå som vi har fått unna et kjapt eksempel kan vi gå over til hvilke forskjellige foreningsmetoder vi har og når vi vil bruke de.</p>
<h2><strong>De jeg kommer til å gjennomgå er </strong></h2>
<ol>
<li>INNER JOIN og NATURAL JOIN</li>
<li>LEFT OUTER JOIN</li>
<li>RIGHT OUTER JOIN</li>
<li>FULL OUTER JOIN</li>
<li>CROSS JOIN (noen kjappe ord)</li>
</ol>
<h2>INNER JOIN</h2>
<p><img class="aligncenter size-full wp-image-160" title="inner_join" src="http://mikaelb.net/wp-content/uploads/2009/09/inner_join.png" alt="inner_join" width="500" height="265" /></p>
<p>INNER JOIN, med LEFT/RIGHT JOIN, er nok den foreningen som kommer til å bli brukt mest. Det er noe som kalles equijoin, og betyr rett og slett at man henter ut informasjonen bundet sammen av to felles verdier i en kolonne/attributt. Kodene ovenfor er et eksempel på denne typen forening.</p>
<p>Det som gjør INNER JOIN forskjellig fra noen OUTER JOIN (som LEFT/RIGHT) er at vi henter kun ut de radene (også kalt «tupler») som har verdier i begge de kolonnene som vi forener om. Om vi viderefører eksemplet ovenfor vil dette si at kun personer med poststed og kun poststedene med personer i seg blir hentet ut. Vi får ikke listet ut alle poststedene som ikke er bebodd av noen medlemmer i person-tabellen vår, og vi får heller ikke listet ut personer som ikke har noe poststed registrert.</p>
<p>Eksempel på INNER JOIN finner har jeg allerede skrevet i toppen av artikkelen.</p>
<h3><strong>NATURAL JOIN</strong></h3>
<p>NATURAL JOIN er i all basis det samme som en INNER JOIN. Eneste forskjellen er at vi fjerner duplikatkolonner. Vi ser at både postal- og person-tabellene inneholder zip_code kolonnen. Dersom vi henter ut alle felt med en vanlig INNER JOIN vil begge disse hentes ut. Det er naturlig at vi ikke trenger denne informasjonen to ganger. Det er sløsing med dataplass/minnebruk. Dersom vi bruker projeksjon (en relasjonell operator som tillater oss å velge hvilke kolonner vi vil ha ut - f.eks SELECT <strong>field1, field2 [...]</strong>), er det ikke nødvendig med NATURAL JOIN.</p>
<h4><strong>Eksempel på NATURAL JOIN</strong></h4>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">NATURAL</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<p><strong></strong></p>
<h2>LEFT OUTER JOIN</h2>
<p><img class="aligncenter size-full wp-image-158" title="left_outer_join" src="http://mikaelb.net/wp-content/uploads/2009/09/left_outer_join.png" alt="left_outer_join" width="500" height="265" /></p>
<p>Nå har vi beveget oss ut på ytterforening. I motsetning til INNER JOIN vil en LEFT OUTER JOIN favorisere en side av tabellene. Det er fortsatt en såkalt «equijoin». Relatert til det eksemplet vi har brukt tidligere vil det bety at vi kan hente ut alle postkodene uavhengig av om de har personer registrert til seg eller ikke - eller motsatt; alle personer uavhengig om de har registrert postkode.</p>
<p>Her er OUTER et valgfritt nøkkelord i spørringen. LEFT JOIN er såvidt jeg vet det samme som LEFT OUTER JOIN.</p>
<h3><strong>Eksempel på LEFT [OUTER] JOIN</strong></h3>
<p>Jeg vil hente ut alle personer og dersom de har registrert poststed vil jeg også vise disse.</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<p>Du ser her at tabellen person er den tabellen som står etter FROM-nøkkelordet. Dette gjør den til en venstrestilt tabell, og det er den vi favoriserer ved å bruke LEFT JOIN.</p>
<h2><strong>RIGHT OUTER JOIN</strong></h2>
<p><strong><img class="aligncenter size-full wp-image-157" title="right_outer_join" src="http://mikaelb.net/wp-content/uploads/2009/09/right_outer_join.png" alt="right_outer_join" width="500" height="265" /><br />
</strong></p>
<p>RIGHT OUTER JOIN er i praksis veldig lik LEFT OUTER JOIN. Eneste forskjellen på disse er hvilken side vi vil favorisere. Vi ser av forrige punkt om LEFT JOIN er det person som blir favorisert. Dersom jeg bruker RIGHT JOIN er det postal-tabellen som blir hovedtabellen. Resultatet vil være en tabell over alle postkoder og tilhørende personer som er registrert. Siden vi ikke grupperer vil vi få flere resultater av samme postkode, da «tuplene» er av forskjellige kombinasjoner (forskjellige personer til samme postkode).</p>
<h3><strong>Eksempel på RIGHT [OUTER] JOIN</strong></h3>
<p>Jeg vil hente ut alle postkoder og dersom de har registrert personer vil jeg også vise alle disse.</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">RIGHT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<h2><strong>FULL OUTER JOIN</strong></h2>
<p><strong><img class="aligncenter size-full wp-image-159" title="full_outer_join" src="http://mikaelb.net/wp-content/uploads/2009/09/full_outer_join.png" alt="full_outer_join" width="500" height="265" /><br />
</strong></p>
<p>Siden dette også er en OUTER JOIN kan vi kanskje se for oss hva vi kommer til å få. Dette er en ytterforening som ikke favoriserer noen side. Den kommer til å vise poststeder med og uten personer og personer med og uten poststed.</p>
<h3><strong>Eksempel på FULL OUTER JOIN</strong></h3>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 FULL <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<h2><strong>CROSS JOIN</strong></h2>
<p>Denne foreningen er litt anderledes enn de vi har sett på til nå. På norsk kalles dette gjerne kryssprodukt eller kartesisk produkt. Her har vi en forening uten noe nøkkelord som JOIN. Vi bruker rett og slett flere tabeller adskilt av komma etter FROM. Uten noe seleksjon (i praksis WHERE-nøkkelordet) vil dette gi alle mulige kombinasjoner av de to tabellene sammenlagt.</p>
<h3><strong>Eksempel på CROSS JOIN</strong></h3>
<p>Jeg har en tabell med navn tabell1 som har kun én kolonne; tall. Denne tabellen inneholder følgende data: 1, 2, 3. Jeg har også en tabell til med navn tabell2 som inneholder akkurat samme data.</p>
<p>Dersom jeg da kjører følgende spørring:</p>

<div class="wp_syntax"><div class="code"><pre class="sql sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabell1<span style="color: #66cc66;">,</span> tabell2;</pre></div></div>

<p>Vil resultatet være følgende:</p>
<blockquote><p>[ tall | tall ]</p>
<p>[ 1 | 1 ]</p>
<p>[ 1 | 2 ]</p>
<p>[ 1 | 3 ]</p>
<p>[ 2 | 1 ]</p>
<p>[ 2 | 2 ]</p>
<p>[ 2 | 3 ]</p>
<p>[ 3 | 1 ]</p>
<p>[ 3 | 2 ]</p>
<p>[ 3 | 3 ]</p></blockquote>
<h2><strong>Referanser</strong></h2>
<p>Jeg er særdeles dårlig på norske uttrykk når det gjelder programmering og lignende. Derfor har jeg fått hjelp av boka [i]Databaser[/i] som er skrevet av Kjell Toft Hansen og Tore Mallaug.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/09/liten-innf%c3%b8ring-i-foreninger-join-i-sql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java klasse: GUIDialog</title>
		<link>http://mikaelb.net/2009/06/java-klasse-guidialog/</link>
		<comments>http://mikaelb.net/2009/06/java-klasse-guidialog/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 03:24:19 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Høynivåspråk]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=153</guid>
		<description><![CDATA[Her kommer den første i en serie av Java-koder som kan være hjelpsomme for noen. Denne klassen gjør så og si det samme som
JOptionPane.showMessageDialog() og JOptionPane.showInputDialog(), bare med mindre muligheter. Det er slik som man kan bygge ut selv. Det som er essensielt i denne koden er bakgrunnen. Gå nøye igjennom denne interne klassen, og [...]]]></description>
			<content:encoded><![CDATA[<p>Her kommer den første i en serie av Java-koder som kan være hjelpsomme for noen. Denne klassen gjør så og si det samme som</p>
<p>JOptionPane.showMessageDialog() og JOptionPane.showInputDialog(), bare med mindre muligheter. Det er slik som man kan bygge ut selv. Det som er essensielt i denne koden er bakgrunnen. Gå nøye igjennom denne interne klassen, og den skal være ganske lettforståelig.</p>
<p>Det følger også med en klasse helt i bunn som gjør at man kan bevege dialog-boksene ved å trykke hvor som helst inne i selve boksen.</p>
<p>Kodene finner du på en <a title="JavaClass: GUIDialog" href="http://mikaelb.net/javaclass-guidialog/">egen side</a>.</p>
<p><img class="size-full wp-image-155 aligncenter" title="MessageDialog" src="http://mikaelb.net/wp-content/uploads/2009/06/bilde-8.png" alt="MessageDialog" width="344" height="157" /><img class="size-full wp-image-154 aligncenter" title="InputDialog" src="http://mikaelb.net/wp-content/uploads/2009/06/bilde-7.png" alt="InputDialog" width="239" height="128" /></p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/06/java-klasse-guidialog/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Twitter-klienten Kvitter</title>
		<link>http://mikaelb.net/2009/06/twitter-klienten-kvitte/</link>
		<comments>http://mikaelb.net/2009/06/twitter-klienten-kvitte/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 01:59:05 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Høynivåspråk]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=138</guid>
		<description><![CDATA[
            function startGallery_2() { 
              var myGallery = new gallery($("myGallery_2"), {                  timed: false,  [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript">
            function startGallery_2() { 
              var myGallery = new gallery($("myGallery_2"), {                  timed: false,         showCarousel: true,         showInfopane: true,           showArrows: true,           embedLinks: false, slideInfoZoneOpacity: 0.80, textShowCarousel: "Bilder"   });
              
              document.getElementById("myGallery_2").style.display = "block";
           }
            window.addEvent("domready", startGallery_2);
          </script>
         <div style="width: 500px; height: 550px; border:0px solid; margin:0px auto; clear:both;"><div id="myGallery_2" class="myGallery" style="display:none; width: 500px !important; height: 550px !important;"><div class="imageElement">  <h3> Vanlig visning</h3>  <p style="color: #FFF000;"> Finnes to tema. HUD eller ikke HUD.</p>  <a target="_blank" href="http://mikaelb.net/wp-content/gallery/kvitter/bilde-3.png" title="open image" class="open"></a>  <img src="http://mikaelb.net/wp-content/gallery/kvitter/bilde-3.png" class="full" />  <img src="http://mikaelb.net/wp-content/gallery/kvitter/thumbs/thumbs_bilde-3.png" class="thumbnail" /></div><div class="imageElement">  <h3> Oppdater status og søk</h3>  <p style="color: #FFF000;"> </p>  <a target="_blank" href="http://mikaelb.net/wp-content/gallery/kvitter/bilde-4.png" title="open image" class="open"></a>  <img src="http://mikaelb.net/wp-content/gallery/kvitter/bilde-4.png" class="full" />  <img src="http://mikaelb.net/wp-content/gallery/kvitter/thumbs/thumbs_bilde-4.png" class="thumbnail" /></div><div class="imageElement">  <h3> Alternativer for en \"tweet\"</h3>  <p style="color: #FFF000;"> </p>  <a target="_blank" href="http://mikaelb.net/wp-content/gallery/kvitter/bilde-5.png" title="open image" class="open"></a>  <img src="http://mikaelb.net/wp-content/gallery/kvitter/bilde-5.png" class="full" />  <img src="http://mikaelb.net/wp-content/gallery/kvitter/thumbs/thumbs_bilde-5.png" class="thumbnail" /></div><div class="imageElement">  <h3> Egenskaper</h3>  <p style="color: #FFF000;"> Egenskapene er ikke fullført. Det skal komme et valg mellom HUD-display eller ikke. </p>  <a target="_blank" href="http://mikaelb.net/wp-content/gallery/kvitter/bilde-6.png" title="open image" class="open"></a>  <img src="http://mikaelb.net/wp-content/gallery/kvitter/bilde-6.png" class="full" />  <img src="http://mikaelb.net/wp-content/gallery/kvitter/thumbs/thumbs_bilde-6.png" class="thumbnail" /></div> </div></div></p>
<p>I det siste har jeg jobbet litt med et lite prosjekt i å lage en Twitter-klient. Eneste formålet med prosjektet er læring. Ikke har jeg bruk for en twitter-klient eller bruker Twitter for den saks skyld. Men det er et ypperlig prosjekt å utføre for læringens skyld.</p>
<p>For et best mulig resultat må jeg innom flere tema som er essensielle innen programmering; minnehåndtering (profilbilder, tabell-rendering, grafikk), egne utseender med Graphics2D, Synkronisering av tråder (Concurrency), JSON, OAuth-implementering og ikke minst <strong>mye</strong> GUI-programmering.</p>
<p>Kanskje det som jeg har syns mest om er hvordan lagre lekre programmer for Mac OS plattformen i Java. Mac OS X har egentlig mange muligheter for Java når det gjelder utseende, så det er ingen grunn til at Java-programmer skal skille seg mye ut fra Cocoa-applikasjoner. Det kan vel tenke seg at det er noe unyttig å jobbe med Java til Mac OS, dersom det er en plattform-avhengig applikasjon, men ingen kunnskap er unyttig.</p>
<h2>Litt om klienten</h2>
<p>Navnet er Kvitter. Egentlig et helt tilfeldig navn fra min side. Planen var å ikke kalle det noe særlig, men siden Twitter krever at du registrerer programmet for å kunne få tilgang til OAuth, mått jeg komme opp med et navn.</p>
<p>I klienten kan man gjøre det de fleste bruker Twitter til. Lese igjennom venners statuser, legge til nye venner, fjerne venner, søke etter folk, ord eller &#8220;tags&#8221;, legge til favoritter, se hvem som har skrevet til deg, se offentlige statuser og selvfølgelig da oppdatere statusen din.</p>
<p>Klienten har bygd inn Growl-støtte som gjør at dersom det kommer nye statuser vil du få beskjed om det. Så lenge du har valgt dette selv. For å kommunisere med Growl bruker jeg AppleScript. Jeg kommer til å skrive litt mer om hvordan man kan gjøre dette via Java i en senere anledning.</p>
<h2>Lansering</h2>
<p>Trenger vi en ny Twitter-klient? Nei, egentlig ikke. Men såvidt jeg har sett er dette den første helnorske klienten som finnes. Jeg er enda ikke sikker på når lanseringen skjer, eller om det blir i det heletatt. Som nevnt har dette kun vært et lære-prosjekt fra min side, og ingenting annet. Men siden jeg har jobbet en del timer med den, så blir det sikkert muligheter for å laste ned klienten fra en mørk krok her på siden.</p>
<p>Men det viktigste, etter min mening, er at i løpet av de neste ukene kommer jeg til å gi ut mye av de kodene jeg har jobbet med. Dette inkluderer HUD-vinduer med pil (som sett på bildet) (kan brukes som &#8220;popup&#8221; for visning av info), Growl for Java, tegning av finere dialog-bokser. Det var alt jeg kom på i farten.</p>
<p>Håper på litt respons på hvordan designet på programmet er og om det er noen viktige funksjoner jeg har gått glipp av.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/06/twitter-klienten-kvitte/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java programmering på Mac</title>
		<link>http://mikaelb.net/2009/04/java-programmering-pa-mac/</link>
		<comments>http://mikaelb.net/2009/04/java-programmering-pa-mac/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 23:03:08 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Høynivåspråk]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=113</guid>
		<description><![CDATA[I det siste har det blitt en del programmering i Java på Mac-plattformen. Jeg driver for tiden med et program som skal kun kjøre på OS X. Hvorfor bruke Java? Skoleprosjekt.
Det er et par ting jeg har lært under veis. Og jeg tenkte jeg skulle poste noen lenker her som jeg har hatt god bruk [...]]]></description>
			<content:encoded><![CDATA[<p>I det siste har det blitt en del programmering i Java på Mac-plattformen. Jeg driver for tiden med et program som skal kun kjøre på OS X. Hvorfor bruke Java? Skoleprosjekt.</p>
<p>Det er et par ting jeg har lært under veis. Og jeg tenkte jeg skulle poste noen lenker her som jeg har hatt god bruk for.</p>
<h3>Apples egne dokumenter:</h3>
<ul>
<li> <a href="http://developer.apple.com/documentation/Java/Conceptual/Java14Development/index.html" target="_top">Java Development Guide for Mac OS X</a> (Mye informasjon om hvordan man kan bruke OS X bibliotek for Java, KeyChain, m.m.)</li>
<li><a href="http://developer.apple.com/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGIntro/XHIGIntro.html#//apple_ref/doc/uid/TP30000894-TP6">Apple Human Interface Guidelines</a> (Ikke direkte Java-relatert, men viktig dersom du skal passe inn på plattformen.)</li>
<li><a href="http://developer.apple.com/technotes/tn2007/tn2196.html#//apple_ref/doc/uid/DTS10004439">New Control Styles available within J2SE 5.0 on Mac OS X 10.5</a> (Mye nyttig for å få knapper, vinduer, JRootPane, m.m., til å se &#8220;native&#8221; ut.)</li>
</ul>
<h3>Andre skriblerier:</h3>
<ul>
<li><a href="http://nadeausoftware.com/articles/2009/01/mac_java_tip_how_control_window_decorations">Mac Java tip: How to control window decorations</a> (Litt av det samme du finner i Apples dokumenter, bare mer utdypet)</li>
<li><a href="http://nadeausoftware.com/articles/java">http://nadeausoftware.com/articles/java</a> (Samme side som ovenfor bare at du finner mange poster om Java i OS X)</li>
</ul>
<p>En ting som er mangel av i Apples dokumentasjon er hvordan du bruker det innebygde QuickTime biblioteket til å benytte iSight til å hente video eller bilder. Dersom det er av noen interesse kan jeg poste et eksempel på hvordan du kan bruke iSight og andre QuickTime-baserte web-kamera til å ta bilde.</p>
<p>Senere er det også mulig jeg kommer med noen kode-eksempler på hvordan du kan lage din egen &#8220;divider&#8221; i en JSplitPane. Hvorfor lage egen divider? Den som er originalt i LAF-en (Look and feel) både til OS X og Windows er stygge, og noen ganger vinner man ikke JSplitPane UI-er som er fine nok, eller passer til programmet ditt. Senere kommer jeg med litt kode eksempler på hvordan du kan lage en JSplitPane noe lignende den du ser i OS X programmet µTorrent.</p>
<ul></ul>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/04/java-programmering-pa-mac/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MacHeist 3: Nytt mission</title>
		<link>http://mikaelb.net/2009/02/macheist-3-nytt-mission/</link>
		<comments>http://mikaelb.net/2009/02/macheist-3-nytt-mission/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 02:10:22 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Generelt]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=111</guid>
		<description><![CDATA[Det er en stund siden første mission av MacHeist 3 startet, men nå, i skrivende stund, er det et nytt mission som starter. Det har allerede vært to nanomissions og et fult mission og MacHeist har til nå gitt ut 10 programmer som du kan få gratis, med lisens. 
Dersom du er interessert i gratis [...]]]></description>
			<content:encoded><![CDATA[<p>Det er en stund siden første mission av <a href="http://www.macheist.com/">MacHeist 3</a> startet, men nå, i skrivende stund, er det et nytt mission som starter. Det har allerede vært to nanomissions og et fult mission og <a href="http://www.macheist.com/">MacHeist</a> har til nå gitt ut 10 programmer som du kan få gratis, med lisens. </p>
<p>Dersom du er interessert i gratis program og en oppfriskende utfordring ta turen innom <a href="http://www.macheist.com/">MacHeist</a> sine hjemmesider. </p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/02/macheist-3-nytt-mission/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Norske IT nettavisers død: kommentarer</title>
		<link>http://mikaelb.net/2009/02/norske-it-nettavisers-doed-kommentarer/</link>
		<comments>http://mikaelb.net/2009/02/norske-it-nettavisers-doed-kommentarer/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 10:27:12 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Tanker]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=109</guid>
		<description><![CDATA[Når skal jeg lære? Hver gang jeg leser en norsk IT-avis blir jeg like frustrert og forbannet over kommentarene som skrives. Når kom vi til det punktet der eneste kommentarene skal handle om er hvordan det er på andre plattformer eller hvordan en annen part ikke er noe bedre. 
Vi har tidligere hørt om diskusjoner [...]]]></description>
			<content:encoded><![CDATA[<p>Når skal jeg lære? Hver gang jeg leser en norsk IT-avis blir jeg like frustrert og forbannet over kommentarene som skrives. Når kom vi til det punktet der eneste kommentarene skal handle om er hvordan det er på andre plattformer eller hvordan en annen part ikke er noe bedre. </p>
<p>Vi har tidligere hørt om diskusjoner rundt kvaliteten på norske IT artikler. Særlig for ITAvisen. Selv mener jeg at uansett hvor dårlig innholdet er så har det ingenting å stille opp i mot det uendelige med hjerneløse kommentarer som eksisterer. </p>
<p>La oss håpe at neste gang vet jeg hvor langt jeg må scrolle for å unngå kommentar-titlene. </p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/02/norske-it-nettavisers-doed-kommentarer/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flow Charts - XKCD</title>
		<link>http://mikaelb.net/2008/12/flow-charts-xkcd/</link>
		<comments>http://mikaelb.net/2008/12/flow-charts-xkcd/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 16:31:14 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Generelt]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=81</guid>
		<description><![CDATA[Det er alt for lite livlige bilder her i bloggen. Derfor sender jeg med dette bildet som lærer dere flow charts!
]]></description>
			<content:encoded><![CDATA[<div class="wp-caption aligncenter" style="width: 750px"><span style="text-decoration: underline;"><a href="http://xkcd.com/518/"><img title="At 8 drinks, you switch the torrent from FreeBSD to Microsoft Bob.  Cmon, itll be fun!" src="http://imgs.xkcd.com/comics/flow_charts.png" alt="At 8 drinks, you switch the torrent from FreeBSD to Microsoft Bob.  Cmon, itll be fun!" width="740" height="534" /></a></span><p class="wp-caption-text">At 8 drinks, you switch the torrent from FreeBSD to Microsoft Bob.  C&#39;mon, it&#39;ll be fun!</p></div>
<p>Det er alt for lite livlige bilder her i bloggen. Derfor sender jeg med dette bildet som lærer dere flow charts!</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/flow-charts-xkcd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>En mer informativ error 404 side</title>
		<link>http://mikaelb.net/2008/12/en-mer-informativ-error-404-side/</link>
		<comments>http://mikaelb.net/2008/12/en-mer-informativ-error-404-side/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 23:18:23 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Generelt]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[error 404 håndtering]]></category>

		<category><![CDATA[feilmelding]]></category>

		<category><![CDATA[HTTP_REFERER]]></category>

		<category><![CDATA[logg]]></category>

		<category><![CDATA[referer]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=78</guid>
		<description><![CDATA[Dette skriveriet er løst basert på en ALA artikkel jeg leste her om dagen. Den omhandler hvordan du kan lage en feilmeldingsside som er mer informativ både til deg og brukeren som opplever den. ALA forfatteren har valgt å dele inn forskjellige error 404-meldinger i 4 grupper. Jeg derimot velger å sette disse til 3 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_85" class="wp-caption alignright" style="width: 238px"><img class="size-full wp-image-85" title="lenkebrudd" src="http://mikaelb.net/wp-content/uploads/2008/12/lenkebrudd.jpg" alt="Lenkebrudd" width="228" height="75" /><p class="wp-caption-text">Lenkebrudd</p></div>
<p>Dette skriveriet er løst basert på en <a title="A List Apart: A More Useful 404" href="http://alistapart.com/articles/amoreuseful404">ALA artikkel</a> jeg leste her om dagen. Den omhandler hvordan du kan lage en feilmeldingsside som er mer informativ både til deg og brukeren som opplever den. ALA forfatteren har valgt å dele inn forskjellige error 404-meldinger i 4 grupper. Jeg derimot velger å sette disse til 3 for enkelhetens skyld.</p>
<ul>
<li>Feil fra brukerens side. Gammelt bokmerke, feilskreven URL.</li>
<li>Et brudd på en lenke på din side.</li>
<li>Et brudd på en lenke fra en annen side. Enten en søkeside eller en annen side.</li>
</ul>
<ol></ol>
<p>Hovedsakelig ønsker vi som utvikler og eier av siden informasjon dersom det er brudd på en lenke i din side, men også muligens fra andres sider. Dersom det er noen som lenker til siden din (kanskje en annen blogg) så kan du sende en e-post til de og informere om lenkebruddet. Gammelt bokmerke eller feil skrevet URL trenger vi ikke så mye informasjon om.</p>
<p>For å finne hvor brukeren kom fra kan vi bruke superglobale tabellen _SERVER og hente ut verdien av HTTP_REFERER. Det er viktig å huske at HTTP_REFERER ikke er 100% nøyaktig. Den fungerer bare dersom det blir linket igjennom en a-tag, eller igjennom form-submitt og bilde-kilde. Det fungerer altså ikke dersom det er linket igjennom en e-post, med en redirect, lasting igjennom XML, bokmerke og lignende. Det er også ganske lett å endre innholdet i HTTP_REFERER, så dersom den skal skrives ut må vi ta høyde for XSS. Siden dette ikke er en veldig essensiell funksjon vi skal lage, holder HTTP_REFERER lenge som en pekepinn på hvor brukeren kom i fra. Det er også ingen reell trussel for XSS siden vi ikke trenger å skrive ut verdien eller bruke den i en database eller lignende. HTTP_REFERER kan også ikke eksistere i enkelte tilfeller, derfor er det lurt å ta en isset()-test når man setter verdien.</p>
<p>Vi setter verdien av HTTP_REFERER slik:</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$referer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">null</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;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$referer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>1. Gammelt bokmerke eller feilskreven URL</h3>
<p>Dersom $referer er null går vi ut i fra at det går under kategori 1. Vi har ingen stor nytteverdi av å vite dette i noen slags logg eller på e-post, derfor skriver vi bare ut til brukeren at de burde oppdatere bokmerkene sine, eller se etter korrekt side ved å bruke søketjenesten vi har på siden.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&lt;h2&gt;Feilmelding: 404 Fil ikke funnet!&lt;/h2&gt;
<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&nbsp;
Filen du letet etter finnes ikke her. 
&nbsp;
&quot;</span>;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$referer</span> <span style="color: #339933;">===</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;Det ser ut til at du bruker et gammelt
	bokmerke eller har skrevet inn feil URl.
&nbsp;
Prøv søkefeltet på siden eller skriv inn
korrekt URL i adressefeltet i nettleseren din.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vi skriver bare ut en enkel feilmelding til brukeren, og logger ikke eller noe i den dur.</p>
<h3>2. Et brudd på en lenke på din side</h3>
<p>Dersom det er et brudd i en lenke på vår side vil vi gjerne vite om det for å kunne korrigere feilen. Derfor kan vi velge å i tillegg til å skrive ut feilmelding så logger vi hendelsen og sender en e-post til administrator om hva som har skjedd.</p>
<p>Dersom vårt domenenavn er i $referer går vi ut i fra at det er en brudd i en lenke på siden vår. Det er ikke krise dersom noen har tuklet med HTTP_REFERER og lagt inn domenenavnet vårt. Det fører bare til en e-post som vi kan sjekke kjapt selv. Jeg tar en enkel test her for å vise konseptet.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">stristr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$referer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'SERVER_NAME'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	sendMailError404<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BROKEN_LOCAL&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span>;
	logError404<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BROKEN_LOCAL&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span>;
&nbsp;
	<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;Det ser ut til at vi har et lenkebrudd på siden
	vår. Vi vil med dette se nærmere på saken og håper
	å få fikset det i løpet av kort tid.
&nbsp;
        Prøv søkefeltet på denne siden for å finne
	en annen link til denne siden.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Her bruker jeg to pseudo-funksjoner til å vise til hvordan en kan gjøre det. sendMailError404 sender rett og slett e-post til administrator som informerer om at det er et lenkebrudd på siden som $referer viser til. Loggen lagrer bare samme informasjon i en txt-fil på root-området eller lignende.</p>
<h3>3. Et brudd på en lenke fra en annen side</h3>
<p>Ved øvrig hendelser, hvor referer er satt men ikke inneholder domenenavnet ditt kan man gå ut i fra at det er en annen side som har en brutt lenke til siden din. Her er det kanskje ikke nødvendig å sende inn en e-post hver gang dette skjer. Ofte kan det være slik at søkesider har gamle sider indeksert og da kan det være litt plagsomt å få flere e-poster hver dag med informasjon om lenkebrudd fra f.eks Google. I dette tilfellet ville jeg bare ha logget hendelsen og med jevne mellomrom sjekket loggen etter noen lenkebrudd fra f.eks bloggrollen min eller andre sider.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	logError404<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BROKEN_EXTERNAL&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;Det ser ut til at vi har et lenkebrudd på en
	ekstern side. Vi vil med dette se nærmere på saken og håper
	å få fikset det i løpet av kort tid.
&nbsp;
        Prøv søkefeltet på denne siden for å finne
	en annen link til denne siden.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Vi kan sette en komplett semi-kode på dette for å vise til hvordan det kan gjøres.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;"><span style="color: #000088;">$referer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">null</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;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$referer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'HTTP_REFERER'</span><span style="color: #009900;">&#93;</span>;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&lt;h2&gt;Feilmelding: 404 Fil ikke funnet!&lt;/h2&gt;
<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&nbsp;
Filen du letet etter finnes ikke her.
&nbsp;
&quot;</span>;
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$referer</span> <span style="color: #339933;">===</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&nbsp;
Det ser ut til at du bruker et gammelt
	bokmerke eller har skrevet inn feil URl.
&nbsp;
Prøv søkefeltet på siden eller skriv inn
	korrekt URL i adressefeltet i nettleseren din.
&nbsp;
<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">stristr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$referer</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="">'SERVER_NAME'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	sendMailError404<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BROKEN_LOCAL&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span>;
	logError404<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BROKEN_LOCAL&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span>;
&nbsp;
	<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&nbsp;
Det ser ut til at vi har et lenkebrudd på siden
	vår. Vi vil med dette se nærmere på saken og håper
	å få fikset det i løpet av kort tid.
&nbsp;
Prøv søkefeltet på denne siden for å finne
	en annen link til denne siden.
&nbsp;
<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	logError404<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;BROKEN_EXTERNAL&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span>;
	<span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;
&nbsp;
Det ser ut til at vi har et lenkebrudd på en
	ekstern side. Vi vil med dette se nærmere på saken og håper
	å få fikset det i løpet av kort tid.
&nbsp;
Prøv søkefeltet på denne siden for å finne
	en annen link til denne siden.
&nbsp;
<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Sette en PHP-fil som feilmeldingsdokument</h3>
<p>Når man har laget et PHP-dokument som inneholder koden over må man sette filen man lagrer det som til en Error 404 dokument. Dette gjør man i htaccess filen på følgende måte:</p>

<div class="wp_syntax"><div class="code"><pre class="htaccess" style="font-family:monospace;">ErrorDocument 404 /php/404.php</pre></div></div>

<p>Nå har vi en error 404 side som er mye mer informativ for både deg og brukeren. På denne måten kan vi også holde oversikt og få hjelp til å finne lenker som er brutt på andres sider som lenker til din side, eller lenker som er brutt på din egen side.</p>
<p>Som alltid setter jeg pris på tilbakemeldinger.</p>
<p>Ha en flott jul og et godt nytt år.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/en-mer-informativ-error-404-side/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Binærsøk i tabeller</title>
		<link>http://mikaelb.net/2008/12/binaersok-i-tabeller/</link>
		<comments>http://mikaelb.net/2008/12/binaersok-i-tabeller/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 04:17:24 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Datateknikk]]></category>

		<category><![CDATA[Høynivåspråk]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=71</guid>
		<description><![CDATA[De som har prøvd tabeller/matriser i språk som f.eks Java, vet at det ikke er like enkelt og smertefritt å anvende de som i f.eks PHP. I PHP har vi uendelig mange muligheter med matriser og vi kan stort sett gjøre hva vi vil med de, uten å tenke så veldig mye på konsekvensene. Slik [...]]]></description>
			<content:encoded><![CDATA[<p>De som har prøvd tabeller/matriser i språk som f.eks Java, vet at det ikke er like enkelt og smertefritt å anvende de som i f.eks PHP. I PHP har vi uendelig mange muligheter med matriser og vi kan stort sett gjøre hva vi vil med de, uten å tenke så veldig mye på konsekvensene. Slik er det ikke med høynivåspråk som Java, C++ osv.</p>
<p>Her har vi begrenset muligheter for hva vi kan gjøre og det er enda viktigere at det vi gjør burde være optimalisert og gå så kjapt som mulig. Det er da vi burde se på optimalisering av algoritmene vi gjør i programkodene.</p>
<p>La oss ta et eksempel om en matrise med tall, som ofte er tilfellet. Vi skal søke igjennom matrisen, og finne på hvilken indeks vi har tallet X. For nybegynnere eller late, vil det naturlige valget være en lineær fremgangsmåte. Det vil si vi starter på indeks 0 og går til lengden på tabellen og går igjennom hver eneste indeks og ser om denne passer til argumentet vi har gitt. Denne fremgangsmåten kan være effektiv dersom vi treffer på resultatet på en av de første indeksene og stopper løkken der ved å returnere resultatet. Men hva om vi ikke har et treff før helt i slutten av tabellen? Da ville man ha brukt mye unødvendig tid på å lete igjennom N antall indekser før man traff på den siste. Det må altså være en bedre måte og gjøre dette på.</p>
<p>Ta deg en 5-minutters tenkepause og prøv å tenk ut en bedre fremgangsmåte. Vi har flere måter å bruke en løkke-struktur på. Dersom vi har to nøstede løkker har vi en kvadratisk fremgangsmåte (n²), 3 nøstede løkker så er det n³ osv. Men vi har også noen bedre metoder som er raskere; det er logaritmiske fremgangsmåter. Og binærsøk, som vi skal se på nå, er en såkalt logaritmisk fremgangsmåte.</p>
<p>I steden for å søke igjennom alle indekser, kunne det ikke tenke seg at det er enklere å starte med en sortert tabell og gå til medianen for å så sjekke om medianen er høyere eller lavere enn tallet vi er ute etter? På den måten har vi halvert tabellen vi leter igjennom og har mindre data å lete igjennom. Om man gjør dette igjen, ved å sette medianen av den nye tabellen, og sjekke om den er høyere eller lavere enn tallet vi er ute etter. Sånn fortsetter vi til vi har kommet frem til tallet. Siden det dataen halveres for hver iterasjon er det en logaritimisk fremgangsmåte, og det er lett å se for seg at dette er en mye mer effektiv fremgangsmåte.</p>
<p>La oss se hvordan det blir utført i praksis. Vi starter med en sortert tabell som har verdiene, 2, 3, 6, 9, 12, 21, 24, 31, 33.</p>
<p>Siden den er sortert kan vi se på medianen (som er den midterste verdien) 12. Dersom tallet vi leter etter, 24, er over 12 vet vi at den eksisterer et sted mellom 21 og 33 (siden den ikke er 12), eller fra indeksen 5 til 8. Allerede har vi gått fra en datamengde på 9 tall til bare 4 tall. Dersom vi gjør dette igjen vil medianen bli indeksen 6 (avrundet) og den er hverken over eller under 24, men lik. Derfor har vi indeksen vår, altså 6. Som vi ser er dette en mye mer effektiv måte å lete igjennom en tabell på. Her brukte vi 2 gjennomganger fremfor 6 som ville ha vært nødvendig i en lineær fremgangsmåte.</p>
<p>Nå kan vi se på litt kode som gjør dette for oss. Du kan selv gjøre dette i ditt favorittspråk, men jeg foretrekker per dags dato Java, og vil gjøre det i dette språket.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BinarySearch <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> binarySearch <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> heystack, <span style="color: #000066; font-weight: bold;">int</span> needle<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">int</span> low <span style="color: #339933;">=</span> 0;
        <span style="color: #000066; font-weight: bold;">int</span> high <span style="color: #339933;">=</span> heystack.<span style="color: #006633;">length</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span>;
        <span style="color: #000066; font-weight: bold;">int</span> median;
&nbsp;
        <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>low <span style="color: #339933;">&lt;</span> <span style="color: #339933;">=</span> high<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            median <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>high<span style="color: #339933;">+</span>low<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span>;
            <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>needle <span style="color: #339933;">&gt;</span> heystack<span style="color: #009900;">&#91;</span>median<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                 <span style="color: #666666; font-style: italic;">// Vi skal ha en større verdi, så vi halverer i lengden fra bunnen</span>
                 low <span style="color: #339933;">=</span> median<span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span>;
            <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>needle <span style="color: #339933;">&lt;</span> heystack<span style="color: #009900;">&#91;</span>median<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                 <span style="color: #666666; font-style: italic;">// Vi skal ha en mindre verdi, så vi halverer i lengden fra toppen</span>
                 high <span style="color: #339933;">=</span> median<span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span>;
            <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                 <span style="color: #666666; font-style: italic;">// Vi sitter på verdien på medianen som er lik needle, så vi har verdien vår.</span>
                 <span style="color: #000000; font-weight: bold;">return</span> median;
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// Vi fant ingenting, derfor returnerer vi -1</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span>;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Dette er en måte å gjøre det på. Vi kan også gå frem på en rekursiv måte dersom vi vil unngå en løkke.</p>
</pre>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BinarySearch <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> binarySearch <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> heystack, <span style="color: #000066; font-weight: bold;">int</span> needle, <span style="color: #000066; font-weight: bold;">int</span> low, <span style="color: #000066; font-weight: bold;">int</span> high<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Vi har gått for langt, og vi har ingen verdi..</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>high <span style="color: #339933;">&lt;</span> low<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span>;
&nbsp;
        <span style="color: #000066; font-weight: bold;">int</span> median <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>high<span style="color: #339933;">+</span>low<span style="color: #009900;">&#41;</span><span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span>;
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>needle <span style="color: #339933;">&gt;</span> heystack<span style="color: #009900;">&#91;</span>median<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
             <span style="color: #666666; font-style: italic;">// Vi skal ha en større verdi, så vi halverer i lengden fra bunnen</span>
             <span style="color: #000000; font-weight: bold;">return</span> binarySearch<span style="color: #009900;">&#40;</span>heystack, needle, median<span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span>, high<span style="color: #009900;">&#41;</span>;
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>needle <span style="color: #339933;">&lt;</span> heystack<span style="color: #009900;">&#91;</span>median<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
             <span style="color: #666666; font-style: italic;">// Vi skal ha en mindre verdi, så vi halverer i lengden fra toppen</span>
             <span style="color: #000000; font-weight: bold;">return</span> binarySearch<span style="color: #009900;">&#40;</span>heystack, needle, low, median<span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>;
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Vi sitter på verdien på medianen som er lik needle, så vi har verdien vår.</span>
        <span style="color: #000000; font-weight: bold;">return</span> median;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Mange syns kanskje den rekursive metoden er bedre enn den iterasjonsmetoden, men for min del er itereringen like grei.</p>
<p>Håper dette setter litt lys på at det finnes bedre metoder å løse en ting på en den du kanskje tenker først.</pre>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/binaersok-i-tabeller/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bitwise operasjoner</title>
		<link>http://mikaelb.net/2008/12/bitwise-operasjoner/</link>
		<comments>http://mikaelb.net/2008/12/bitwise-operasjoner/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 00:31:20 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
		
		<category><![CDATA[Datateknikk]]></category>

		<category><![CDATA[Høynivåspråk]]></category>

		<category><![CDATA[bits]]></category>

		<category><![CDATA[byte]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[prosessor]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=58</guid>
		<description><![CDATA[I feiringen av fullført datateknikk eksamen, skal jeg nå sette kunnskapene mine på en siste prøve. Jeg skal nå skriv en artikkel om bitwise-operasjoner som en gjerne bruker med et høynivåspråk som f.eks Java eller C++. Før, på en tradisjonell prosessor, ble bitwise-operasjoner gjerne brukt av en CPU i steden for addisjoner og substraksjoner. Dette [...]]]></description>
			<content:encoded><![CDATA[<p>I feiringen av fullført datateknikk eksamen, skal jeg nå sette kunnskapene mine på en siste prøve. Jeg skal nå skriv en artikkel om bitwise-operasjoner som en gjerne bruker med et høynivåspråk som f.eks Java eller C++. Før, på en tradisjonell prosessor, ble bitwise-operasjoner gjerne brukt av en CPU i steden for addisjoner og substraksjoner. Dette er som regel ikke tilfellet nå i en CPUs mer moderne form, nå som addisjon og substraksjon er like rask som bitwise-operasjoner. </p>
<p>Først litt om hva en bit og en byte er. En bit er et siffer i en binær sammenheng. Et binært tallsystem (også kjent som 2-tallsystemet) er det som blir brukt internt av en datamaskin og all data og innhold i en maskin brytes ned til binære mønster for maskinen. Her er det kun 0 og 1 (høy spenning eller lav spenning) som duger.</p>
<p>Jeg nevnte at bit var et siffer i et binært mønster. En byte (som dere kanskje kjenner igjen som en størrelsesenhet på maskinen) er en samling av slike bits. 8 bits for å være helt nøyaktig. I en byte er derfor maksimalverdien 255 i ti-tallsystemet (1111 1111 i to-tallsystemet).</p>
<p>Et ord derimot er en samling av bits uten en fast størrelse. Ord er et bitmønster i en lokasjon/linje i et minne. Et ord kan derfor være på f.eks 16 bit, 32 bit, 64 bit.</p>
<h2>Bitwise-operasjoner</h2>
<p>Vi har 6 forskjellige bitwise-operasjoner.</p>
<ol>
<li><strong>AND</strong> - &amp;</li>
<li><strong>OR</strong> - |</li>
<li><strong>XOR</strong> - ^</li>
<li><strong>NOT</strong> - ~</li>
<li><strong>RIGHT SHIFT</strong> - &gt;&gt;</li>
<li><strong>LEFT SHIFT</strong> - &lt;&lt;<em></em></li>
</ol>
<p><em>(Det du ser til høyre, etter -, er tegnene som blir brukt i høynivåspråk for disse operasjonene.)</em></p>
<h2>AND</h2>
<p>AND blir brukt til å se hvilke bits som korresponderer i et bitmønster. Her tar jeg utgangspunkt i et mønster på lengden 8 bits, altså en byte. </p>
<p>Her tar jeg utgangspunkt i tallene 133 og 203. 133 er 1000 0101 og 203 er 1100 1011.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">   <span style="color: #666666; font-style: italic;">// 1000 0101 &amp; 1100 1011</span>
   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span>
   <span style="color: #cc66cc;">1100</span> <span style="color: #cc66cc;">1011</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0001</span></pre></div></div>

<p>Som du ser resulterer det i et bitmønster som har 1 hvor det er 1 på begge bytene og 0 hvor det er ulikt eller likt på 0. </p>
<p>Dette kan du f.eks bruke til å finne om en gitt bit er satt eller ikke:</p>

<div class="wp_syntax"><div class="code"><pre class="java java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Denne returnerer 0 (boolsk verdi: false) da bitverdien for 2 ikke er satt.</span>
<span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span> <span style="color: #339933;">&amp;</span>amp; 0x02<span style="color: #009900;">&#41;</span>;</pre></div></div>

<h2>OR</h2>
<p>OR blir brukt til å se hvilke to bits sammenlagt har 1. Dvs dersom en av bitene på to bitmønster har 1 vil resultatet si 1. </p>
<p>Jeg tar igjen utgangspunkt i samme tall som på AND.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">   <span style="color: #666666; font-style: italic;">// 1000 0101 | 1100 1011</span>
   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span>
   <span style="color: #cc66cc;">1100</span> <span style="color: #cc66cc;">1011</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #cc66cc;">1100</span> <span style="color: #cc66cc;">1111</span></pre></div></div>

<p>Som du ser blir det 1 hvor en av bitmønstrene har 1 i seg på den plassen.</p>
<h2>XOR</h2>
<p>Denne operasjonen er en &#8220;enten eller&#8221; operasjon. Den blir 1 hvis og bare hvis de to bitene er ulike. </p>
<p>Tar fortsatt utgangspunkt i samme tall.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">   <span style="color: #666666; font-style: italic;">// 1000 0101 ^ 1100 1011</span>
   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span>
   <span style="color: #cc66cc;">1100</span> <span style="color: #cc66cc;">1011</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #208080;">0100</span> <span style="color: #cc66cc;">1110</span></pre></div></div>

<h2>NOT</h2>
<p>NOT-operasjonen er en måte å finne det motsatte på. Eller du kan gjerne si at du vil finne negasjonen av mønsteret.</p>
<p>Tar fortsatt utgangspunkt i samme tall som før. </p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">   ~<span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #208080;">0111</span> <span style="color: #cc66cc;">1010</span></pre></div></div>

<h2>LEFT SHIFT</h2>
<p>LEFT SHIFT-operasjonen flytter alle bit-verdiene ett hakk til venstre dersom noe annet ikke er gitt. Kan også flytte flere hakk til venstre dersom nødvendig.</p>
<p>Tar utgangspunkt i det første tallet gitt fra AND-operasjonen. </p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span> <span style="color: #339933;">&lt;&lt;</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #208080;">0000</span> <span style="color: #cc66cc;">1010</span>
&nbsp;
   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #cc66cc;">2</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #208080;">0001</span> <span style="color: #208080;">0100</span></pre></div></div>

<h2>RIGHT SHIFT</h2>
<p>Samme som forrige operasjon, bare motsatt vei. Altså til høyre.</p>

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span> <span style="color: #339933;">&gt;&gt;</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #208080;">0100</span> <span style="color: #208080;">0010</span>
&nbsp;
   <span style="color: #cc66cc;">1000</span> <span style="color: #208080;">0101</span> <span style="color: #339933;">&gt;&gt;</span> <span style="color: #cc66cc;">2</span>
   <span style="color: #339933;">------------</span>
   <span style="color: #208080;">0010</span> <span style="color: #208080;">0001</span></pre></div></div>

<h2>Noen ord til slutt</h2>
<p>Håper dette skriveriet kan hjelpe noen til å forstå hvordan man skal bruke bitwise-operasjoner. I alle fall hvordan de fungerer. Disse operasjonene har mange forskjellige bruksområder. For eksempel kan &#8220;shifting&#8221; brukes til å finne den mest signifikante biten i et mønster og således finne ut om verdien er negativ eller positiv. NOT kan f.eks brukes til å finne absoluttverdien av et negativt tall osv.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/bitwise-operasjoner/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
