<?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>David Steinsland - informatikkstudent og webutvikler &#187; php</title>
	<atom:link href="http://davidsteinsland.net/emneord/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://davidsteinsland.net</link>
	<description>Personlig blogg om programmering og andre uinteressante emner</description>
	<lastBuildDate>Thu, 26 Apr 2012 10:49:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Vise hvor lang tid nettsiden laster</title>
		<link>http://davidsteinsland.net/2012/02/vise-hvor-lang-tid-nettsiden-laster/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vise-hvor-lang-tid-nettsiden-laster</link>
		<comments>http://davidsteinsland.net/2012/02/vise-hvor-lang-tid-nettsiden-laster/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 11:45:02 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5.4]]></category>

		<guid isPermaLink="false">http://davidsteinsland.net/?p=770</guid>
		<description><![CDATA[I PHP 5.4 har det kommet en ny SERVER-variabel som heter REQUEST_TIME_FLOAT og gir oss tiden da nettsiden begynner å laste (i millisekunder). Denne muliggjør at vi slipper å definere en konstant helt i begynnelsen av koden vår, som inneholder verdien av microtime(true). Nå kan vi i stedet for gjøre hele prosessen slik: Koden kan [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-734" title="PHP tips og triks" src="http://davidsteinsland.net/wp-content/uploads/2012/02/php-banner.png" alt="" width="650" height="170" /></p>
<p>I PHP 5.4 har det kommet en ny SERVER-variabel som heter <var>REQUEST_TIME_FLOAT</var> og gir oss tiden da nettsiden begynner å laste (i millisekunder). Denne muliggjør at vi slipper å definere en konstant helt i begynnelsen av koden vår, som inneholder verdien av <var>microtime(true)</var>. Nå kan vi i stedet for gjøre hele prosessen slik:</p>
<pre class="brush: php; title: ; notranslate">
register_shutdown_function (function ()
{
	$s = $_SERVER['REQUEST_TIME_FLOAT'];
	$e = microtime (true);

	echo &quot;\n\nPage Rendered: &quot;, sprintf (&quot;%0.5f&quot;, ($e - $s)), &quot; seconds&quot;;
});
</pre>
<p>Koden kan ligge hvor som helst i koden din (men legg den helst litt langt oppe &#8230;). Poenget med å dra nytte av <var>register_shutdown_function()</var> er at metoden blir kalt selv om nettsiden avslutter uventet, for eksempel via <var>exit</var> og <var>die</var>.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2012/02/vise-hvor-lang-tid-nettsiden-laster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uavhengige cronjobber i PHP</title>
		<link>http://davidsteinsland.net/2012/02/uavhengige-cronjobber-i-php/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=uavhengige-cronjobber-i-php</link>
		<comments>http://davidsteinsland.net/2012/02/uavhengige-cronjobber-i-php/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 20:41:53 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Åpen kildekode]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[cronjob]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://davidsteinsland.net/?p=718</guid>
		<description><![CDATA[Cron er et ganske nyttig verktøy som gjør deg istand til å utføre spesielle oppgaver på et gitt tidspunkt, men er uheldigvis kun tilgjengelig på UNIX-systemer. I Windows har man noe som heter planlagte oppgaver, som også går an å anvende. Men hva er dette godt for, når mange webhotell-tilbydere ikke engang har funksjonen(e) aktivert? [...]]]></description>
			<content:encoded><![CDATA[<p><em><img class="alignright size-full wp-image-720" title="Cron for PHP" src="http://davidsteinsland.net/wp-content/uploads/2012/02/cron-for-php.gif" alt="" width="246" height="192" />Cron</em> er et ganske nyttig verktøy som gjør deg istand til å utføre spesielle oppgaver på et gitt tidspunkt, men er uheldigvis kun tilgjengelig på UNIX-systemer. I Windows har man noe som heter planlagte oppgaver, som også <a title="Dagens tips: Cronjobber på Windows med Wget" href="http://davidsteinsland.net/2010/10/dagens-tips-cronjobber-pa-windows-med-wget/">går an å anvende</a>.<br />
Men hva er dette godt for, når mange webhotell-tilbydere ikke engang har funksjonen(e) aktivert?</p>
<p>Det eneste alternativ som står igjen, er å lage en <em>cron-emulator</em> med PHP (eller lignende). Vi ønsker altså å lage et system som selv kan utføre oppgaver på gitte tidspunkt.</p>
<p>Ved et par Google-søk er det mulig å finne utallige slike eksempler, men personlig har jeg alltid følt de har manglet noe. Jeg ønsker det skal være enkelt og lett forståelig, samt enkelt å integrere i andre systemer.</p>
<p>I stedet for å bruke mye tid på å finne &laquo;det perfekte scriptet&raquo;, så satte jeg av en liten time til å utvikle noe slikt selv.</p>
<p>Jeg endte opp med noe jeg selv mener er ganske enkelt å forstår seg på, samtidig som det er ganske enkelt å utvide også.</p>
<h3>Hvordan koden fungerer</h3>
<p>Totalt inneholder applikasjonen tre klasser:</p>
<ul>
<li><var>Scheduler</var> &#8212; inneholder de ulike handlingene, og bestemmer hvilke som skal kjøres</li>
<li><var>SchedulerEvent</var> &#8212; egen klasse for hver handling. Her lagres informasjon om hvilken kommando som skal kjøres, og hvor mange sekunder det går mellom hver gang</li>
<li><var>SchedulerInterval</var> &#8212; en bitteliten klasse som bestemmer intervallet en handling skal kjøres i.</li>
</ul>
<p>Scheduler tar i bruk Singleton-mønsteret, slik at du kan få tak i klasseinstansen hvor som helst, uten å miste data som objektet lagrer.</p>
<p>Jeg har benyttet meg av et par ukjente triks for å oppnå ønsket resultat:</p>
<ul>
<li>For å sikre meg om at koden skal utføres, uansett hva brukeren velger å gjøre, har jeg tatt i bruk <var>ignore_user_abort()</var></li>
<li>For at data er lagret til neste sidevisning, har jeg tatt i bruk <var>register_shutdown_function</var>. Der utføres det en kode som lagrer de ulike handlingene i en fil, som blir hentet opp ved neste sidevisning</li>
<li>Til slutt lar jeg <var>SchedulerEvent</var>-klassen implementere <var>Serializable</var>. På den måten kan jeg lagre hele objektet i eksempelvis en tekstfil, og så gjenopprette det igjen</li>
</ul>
<h3>Opprette handlinger</h3>
<p>Koden under legger til en handling, som bestemmer at filen <var>cron_scripts/my_file.php</var> skal kjøres hver time. En gyldig URL <em>må</em> gis.</p>
<pre class="brush: php; title: ; notranslate">
$scheduler = Scheduler::getInstance ();

$event = new SchedulerEvent (&quot;http://example.com/cron_scripts/my_file.php&quot;,
    new SchedulerInterval (SchedulerInterval::HOURLY));
$scheduler-&gt;addEvent ($event);
</pre>
<h3>Kjøre handlinger</h3>
<p>Koden for å kjøre handlinger er nødt til å ligge i en fil som blir kjørt på hver sidevisning, eksempelvis <var>index.php</var>.<br />
Dette gjør vi for å være sikker på å utføre handlingene med best mulig presisjon.</p>
<pre class="brush: php; title: ; notranslate">
// Sørger for at koden under blir utført uansett.
ignore_user_abort(true);

include_once 'class.scheduler.php';
include_once 'class.schedulerevent.php';
include_once 'class.schedulerinterval.php';

// sørger for at objektene blir lagret til neste sidevisning.
register_shutdown_function ('Scheduler::shutdown');

$scheduler = Scheduler::getInstance ();

foreach ($scheduler-&gt;getEvents() as $event)
{
	// utfører handlinger som ennå ikke har blitt utført,
    // eller som skal utføres basert på tiden gitt av metoden
	if ($event-&gt;getNextRunTime() &lt;= new DateTime() )
    {
        $event-&gt;run ();
    }
}
</pre>
<p>Når en handling skal utføres, blir det sendt et separat <em>POST-request</em> til den valgte filen. Dette er for å unngå at handlingen ikke skal trekke ned hastigheten på siden.</p>
<h3>Last ned</h3>
<p><img src="http://davidsteinsland.net/wp-content/themes/eikeland/images/download_icon.png" alt="Last ned" class="icon" /> <a href="http://davidsteinsland.net/filer/php_scheduler-1.0.zip">PHP Scheduler</a> (49 nedlastninger)   (krever PHP &gt;= 5.2.2)</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2012/02/uavhengige-cronjobber-i-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Datoer i PHP &#8211; på den enkle måten</title>
		<link>http://davidsteinsland.net/2011/03/datoer-i-php-pa-den-enkle-maten/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=datoer-i-php-pa-den-enkle-maten</link>
		<comments>http://davidsteinsland.net/2011/03/datoer-i-php-pa-den-enkle-maten/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 16:53:20 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[datetime]]></category>
		<category><![CDATA[dato]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=486</guid>
		<description><![CDATA[I en verden med rundt 25 ulike tidssoner, kan datoer og klokkeslett bli et mareritt. Hvordan skal vi lagre datoene, og hvordan skal vi vise dem? Følg med, og lær om PHPs nye DateTime-bibliotek!]]></description>
			<content:encoded><![CDATA[<p>Å jobbe med datoer kan være riktig slitsomt til tider. Hvor mange ganger har du ikke klødd deg litt i bakhodet, og tenkt hvordan i huleste du kan formatere datoer som enten er formatert forskjellig, er fra ulike tidssoner eller som du må trekke fra / legge til dager/uker/måneder &#8230; ?</p>
<p>Ja, det <span style="text-decoration: underline;">har</span> vært et problem. Med det mener jeg at løsningen er på plass, og at du kan slappe ekstra godt av. Dette innebærer <em>selvfølgelig</em> at du har en PHP-installasjon tilsvarende 5.3.x.</p>
<h3>Alle dager i mars måned</h3>
<p>Tidligere har vi måttet brukt PHPs datofunksjoner (date/strtotime/strftime &#8230;), men siden PHP 5.3 kan vi nemlig dra nytte av de nye <a href="http://no2.php.net/manual/en/book.datetime.php">DateTime</a>-klassene og godene som medfølger.<br />
Se bare hvor enkelt det er å skrive ut alle dagene i Mars 2011:</p>
<pre class="brush: php; title: ; notranslate">
$march = new DateTime ('March 2011');

$days = new DatePeriod (
    $march,
    new DateInterval ('P1D'),
    $march-&gt;modify ('first day of next month')
);

foreach ($days as $day)
{
    echo $day-&gt;format ('Y-m-d'), &quot;\n&quot;;
}</pre>
<p>Årsaken til at jeg valgte å skrive &laquo;first day of next month&raquo; fremfor &laquo;last day of&raquo; er på grunn av at siste datoen blir ekskludert, som hadde betydd at 31. mars ikke hadde blitt skrevet ut.</p>
<p>I eksempelet mitt har jeg benyttet meg av alle klassene som inngår i <a href="http://no2.php.net/manual/en/book.datetime.php">DateTime-biblioteket</a> (med unntak av <a href="http://no2.php.net/manual/en/class.datetimezone.php">DateTimeZone</a>) hvor:</p>
<ul>
<li>DateTime lager et objekt med 1. mars 2011 utifra &laquo;March 2011&#8243;</li>
<li><a href="http://no2.php.net/manual/en/class.dateperiod.php">DatePeriod</a> lager et objekt som inneholder alle datoer fra 1. mars til 1. april (eksklusivt) hvor det er 1 dag mellom hver instans (dette bestemmes av <a href="http://no2.php.net/manual/en/class.dateinterval.php">DateInterval</a>)</li>
</ul>
<h3>Antall dager mellom to datoer</h3>
<p>DateTime-klassen har et stort bruksområde, og kan for eksempel brukes til å finne differansen mellom to datoer:</p>
<pre class="brush: php; title: ; notranslate">

$january = new Datetime ('January 2011');

$diff = $january-&gt;diff ( new DateTime ('April 2011') );

echo 'Difference between January and April: ',
$diff-&gt;format ('%R%a days');  // 90 days
</pre>
<p><em>%a</em> fungerer slik at den skal gi meg det totale antallet dager mellom de to datoene. Denne funksjonaliteten fungerer dessverre ikke optimalt på Windows, og kan skape endel frustrasjoner. Men i lag med PHP 5.3 kan du også sammenligne to DateTime-instanser ved bruk av &laquo;<a href="http://no2.php.net/manual/en/language.operators.comparison.php">comparison operators</a>&raquo; (større/mindre enn, osv.) Dette gjør oss istand til å lage en &laquo;work-around&raquo; til Windows-problematikken:</p>
<pre class="brush: php; title: ; notranslate">

$january = new DateTime ('January 2011');
$april = new DateTime ('April 2011');

// clone variable to keep $january clean..
$currdate = clone $january;

for ($days = 0; $currdate-&gt;modify ('+1 day') &lt;= $april; ++$days);

echo &quot;Difference between January and April: {$days} days&quot;;
</pre>
<h3>Utvide DateTime med støtte for MySQL Datetime</h3>
<p>Det er også ganske tilfredsstillende å benytte seg av DateTime ilag med MySQL DATETIME. I dette eksempelet har jeg valgt å utvide DateTime-klassen:</p>
<pre class="brush: php; title: ; notranslate">
class MyDateTime extends DateTime
{
    const MYSQL = 'Y-m-d H:i:s';

    public static function createFromMySQL ($datetime)
    {
        return self::createFromFormat (self::MYSQL, $datetime);
    }
}

// date from MySQL
$date = MyDateTime::createFromMySQL ($row['my_date']);

$timestamp = $date-&gt;getTimestamp ();

echo &quot;Date: {$date-&gt;format ('d.m.Y H:i')}\n&quot;;
</pre>
<p>Poenget mitt var ikke å utvide klassen for å legge til en enkel funksjon, men heller illustrere at det kan være lurt å gjøre det (DateTime-klassen har tross alt ikke tatt høyde for absolutt alt).<br />
Kanskje det kunne vært en idé å gjøre Windows work-arounden min til en funksjon som utvider DateInterval ?</p>
<p>Som regel er det kun DateTime du har behov for i det daglige, men du kan også få god nytte av både DateInterval og DatePeriod om du for eksempel skal jobbe med kalendere.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/03/datoer-i-php-pa-den-enkle-maten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cache PHP-sider: kort og enkelt</title>
		<link>http://davidsteinsland.net/2011/01/cache-php-sider-kort-og-enkelt/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cache-php-sider-kort-og-enkelt</link>
		<comments>http://davidsteinsland.net/2011/01/cache-php-sider-kort-og-enkelt/#comments</comments>
		<pubDate>Thu, 20 Jan 2011 18:32:03 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=450</guid>
		<description><![CDATA[Når man skriver nettsider med PHP er det mye som kan være med på å dra opp lastetiden. For ikke å snakke om alle CSS- og JavaScript-filer som også må lastes ned. Hva kan man så gjøre? Om du jobber med databaser kan du for eksempel skru på MySQL Query Cacher, samtidig som du kan [...]]]></description>
			<content:encoded><![CDATA[<p>Når man skriver nettsider med PHP er det mye som kan være med på å dra opp lastetiden. For ikke å snakke om alle CSS- og JavaScript-filer som også må lastes ned. Hva kan man så gjøre?</p>
<p>Om du jobber med databaser kan du for eksempel skru på <a href="http://davidsteinsland.net/2010/12/mysql-query-cache/">MySQL Query Cacher</a>, samtidig som du kan mellomlagre resultatet i HTML-, JSON eller XML-format. Men alt dette krever igrunn litt arbeid, samt at noen koder her og der må endres.</p>
<pre class="brush: php; title: ; notranslate">
$lastModified = filemtime (__FILE__);
$etagFile = md5_file (__FILE__);
$ifModifiedSince = isset ($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : FALSE;
$etagHeader = isset ($_SERVER['HTTP_IF_NONE_MATCH'] ? trim ($_SERVER['HTTP_IF_NONE_MATCH']) : FALSE;

header(&quot;Last-Modified: &quot; . gmdate(&quot;D, d M Y H:i:s&quot;, $lastModified) . &quot; GMT&quot;);
header(&quot;Etag: $etagFile&quot;);
header('Cache-Control: public');

//check if page has changed. If not, send 304 and exit
if (@strtotime ($ifModifiedSince) == $lastModified || $etagHeader == $etagFile)
{
       header (&quot;HTTP/1.1 304 Not Modified&quot;);
       exit;
}

//your normal code below
</pre>
<p>Om du limer inn koden ovenfor i starten på de PHP-filene du ønsker å mellomlagre, merker du forskjellen med én gang. Jeg har selv testet koden i flere prosjekter, og den fungerer utmerket. Det som er verdt å merke seg, er at den ikke fanger opp endringer i dynamisk innhold med én gang.<br />
Den merker så klart endringer på seg selv, men dersom du henter innhold fra en database så kan det ta noen minutter før det vises.</p>
<p>Denne prosessen kan, så vidt jeg vet, ikke fremskyndes siden mellomlageret ligger i nettleseren, og det er ikke mulig å fjerne det (dette må sluttbruker gjøre manuelt).</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/01/cache-php-sider-kort-og-enkelt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RecursiveIterator med egne filtre</title>
		<link>http://davidsteinsland.net/2010/11/recursiveiterator-med-egne-filtre/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=recursiveiterator-med-egne-filtre</link>
		<comments>http://davidsteinsland.net/2010/11/recursiveiterator-med-egne-filtre/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 15:45:30 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[recursiveiterator]]></category>
		<category><![CDATA[spl]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=386</guid>
		<description><![CDATA[Er det noe jeg virkelig elsker med PHP, må det være Standard PHP Library, eller SPL som det også heter. Det er en samling av innebygde klasser som gjør deg istand til for eksempel å kjøre (iterere) gjennom arrays, filer, mappestrukturer (endimensjonalt) eller flerdimensjonalt (rekursiv). Alt dette ved en solid OOP-struktur! Scenario: du skal iterere [...]]]></description>
			<content:encoded><![CDATA[<p>Er det noe jeg virkelig elsker med PHP, må det være <a href="http://no2.php.net/manual/en/book.spl.php">Standard PHP Library</a>, eller SPL som det også heter. Det er en samling av innebygde klasser som gjør deg istand til for eksempel å kjøre (iterere) gjennom arrays, filer, mappestrukturer (endimensjonalt) eller flerdimensjonalt (rekursiv). Alt dette ved en solid OOP-struktur!</p>
<p><strong>Scenario</strong>: du skal iterere rekursivt gjennom en mappestruktur, og ønsker kun å hente ut filer med endelsen &laquo;txt&raquo;.</p>
<p>Hva gjør du? Du kunne brukt en kombinasjon av scandir() og din egen rekursive funksjon, eller glob(), eller, eller&#8230;</p>
<p>Hva dersom du ønsker å bruke kodene senere, flere ganger, bare med små endringer? Det er virkelig en grense for hvor fleksibelt et system kan være når det er satt til å utføre én bestemt oppgave. Utnytter du OOP, kan du snu på dette.</p>
<p>I koden nedenfor henter jeg ut <em>alle</em> filer (uansett nivå) som befinner seg inni mappen filer/.</p>
<pre class="brush: php; title: ; notranslate">
foreach (new RecursiveIteratorIterator(
	new RecursiveDirectoryIterator('filer')
) as $file
)
{
    echo $file-&gt;getFilename();
}
</pre>
<p>Men skulle ikke jeg filtrere bort enkelte filer? Hvordan gjør jeg det?</p>
<p>Det vi trenger å gjøre, er å lage en klasse i PHP som arver egenskaper fra <a href="http://no2.php.net/manual/en/class.filteriterator.php">FilterIterator</a>. Den må fyre i gang <a href="http://no2.php.net/manual/en/class.recursivedirectoryiterator.php">RecursiveDirectoryIterator</a> og <a href="http://no2.php.net/manual/en/class.recursiveiteratoriterator.php">RecursiveIteratorIterator</a>, i tillegg må den ha metoden <var>accept()</var>.</p>
<p>Her har jeg skrevet enda et enkelt eksempel, hvor jeg kun henter ut filer med endelsen &laquo;txt&raquo;.</p>
<pre class="brush: php; title: ; notranslate">
class RecursiveFilter extends FilterIterator
{
	protected $_extensions = array ();

	public function __construct ($path, array $extension = array ())
	{
		$this-&gt;_extensions = $extensions;

		parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
	}

	/**
	 * Bestemmer hvilke filer som skal bli godtatt
	 * Metoden må returnere FALSE eller TRUE, alt ettersom
	 * om filen er godtatt eller ei.
	 */
	public function accept ()
	{

		// get the file that are being iterated
		$item = $this-&gt;getInnerIterator ();

		return in_array ( pathinfo ($item-&gt;getBasename(), PATHINFO_EXTENSION), $this-&gt;_extensions);
	}
}

$iterator = new RecursiveFilter ('filer', array ('txt'));

foreach ($iterator as $item)
{
	echo $item-&gt;getBasename();
}
</pre>
<p>Så enkelt kan det gjøres. I teorien har vi igrunn fjernet sjekken ut av foreach-løkken, og inn i egen klasse. Det virker unødvendig, men med tanke på gjenbruk og abstraksjon så er dette en meget god idé.</p>
<p>Om du ønsker alle filer som ikke har endelsen &laquo;txt&raquo;, så snur du bare på sjekken som utføres i <var>accept()</var> til:</p>
<pre class="brush: php; title: ; notranslate">
return ! in_array ( pathinfo ($item-&gt;getBasename(), PATHINFO_EXTENSION), $this-&gt;_extensions);
</pre>
<p>Du kan selvfølgelig utvide <var>accept()</var> til så mye du vil, og ta høyde for alt du ønsker. <var>$item</var> inneholder et <a href="http://no2.php.net/manual/en/class.splfileinfo.php">FileInfo</a>-objekt, så da kan du bare slå deg løs!</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2010/11/recursiveiterator-med-egne-filtre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Daglig backup av MySQL med PHP (Windows)</title>
		<link>http://davidsteinsland.net/2010/10/daglig-backup-av-mysql-med-php-windows/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=daglig-backup-av-mysql-med-php-windows</link>
		<comments>http://davidsteinsland.net/2010/10/daglig-backup-av-mysql-med-php-windows/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 22:08:35 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=377</guid>
		<description><![CDATA[Hva er det som er så viktig med sikkerhetskopier? Hvordan kan man ta sikkerhetskopi uten noe stress? I dette innlegget viser jeg deg hvordan du kan ta sikkerhetskopi av MySQL ved å bruke PHP, og automatisere det med en planlagt oppgave i Windows.]]></description>
			<content:encoded><![CDATA[<p>Dersom du drifter din egen server eller har en utviklingsserver på PC-en din, har du nok vært i situasjoner hvor du tenker: &laquo;Hvor er sikkerhetskopien når jeg trenger den?&raquo;.</p>
<p>Jeg var der selv for omtrent en úke siden, hvor jeg ved en feiltakelse kjørte en gammel PHP-fil som overskrev hele <a href="http://davidsteinsland.net/2010/03/komplett-databasesett-over-norges-postnummer-med-koordinater/">Postnummer-databasen min</a>. Heldigvis hadde jeg mange sikkerhetskopier av databasen, så det gikk bra.</p>
<p>Men hva om jeg ikke hadde hatt kopier? Da hadde faktisk hele arbeidet mitt vært ødelagt! Mangfoldige timer bortkastet, bokstavelig talt.</p>
<p>Hver dag (midnatt) blir livredderen utført: en planlagt oppgave i Windows kjører et PHP-skript som tar backup av MySQL.</p>
<p>I mine siste artikler har jeg skrevet litt om planlagte oppgaver i Windows, og vist flere ting du kan gjøre.</p>
<h3>Teori</h3>
<p>Når du installerte MySQL, fikk du med et program som heter <a href="http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html">mysqldump</a>. Programmet brukes til å ta backup av MySQL; du kan selv spesifisere én eller flere databaser, eller om du ønsker å ta backup av alle.</p>
<p>Videre kommer jeg til å ta i bruk  <a href="http://php.net/manual/en/features.commandline.php">PHP fra kommandolinjen</a>, som muliggjør at vi kan bruke PHP-tolkeren til å kjøre en bestemt PHP-fil. Dette programmet ligger i installasjonsmappen til PHP, og heter <var>php.exe</var></p>
<p>Jeg refererer til disse programmene som henholdsvis <em>mysqldump</em> og <em>php</em> fra kommandolinjen. Dette er fordi jeg har lagt til PHPs installasjonsmappe og <em>bin</em>-mappen til MySQL til miljøvariabelen PATH. Dette forteller Windows at når du skriver inn et program i CMD, skal den også leite etter det programmet i de plasseringene.</p>
<p>Dersom du ikke har gjort dette, må du spesifisere til programmene med full sti, eks: c:\php\php eller skrive inn følgende i CMD:</p>
<pre class="brush: plain; title: ; notranslate">SET PATH = %PATH%;C:\PHP;C:\MySQL\bin</pre>
<p>(jeg antar PHP og MySQL er installert i C:\).</p>
<p>Ved default ligger &laquo;.EXE&raquo; i miljøvariabelen PATHEXT, som medfører at du slipper å skrive &laquo;.exe&raquo; bak programnavnet.</p>
<h3>PHP-filen</h3>
<p>Gjør klar en PHP-fil som du navngir <em>backup.php</em> og plasser denne utenfor <em>ServerRoot</em> (altså en plass den ikke kan nåes via en nettleser).</p>
<p>ServerRoot hos meg er \www\public_html\, slik at jeg har plassert PHP-filen ett steg opp, i \www\ (Med baklengs-skråstrek foran stien, tolker Windows dette som C:\).</p>
<p>Lag så en mappe du kaller for <em>backup</em> i samme mappe hvor du har plassert PHP-filen. Dette er plassen hvor backupene våre kommer til å ligge.</p>
<p>Det første vi gjør i PHP-filen vår er å definere et par runtime-innstillinger, som databasetilkoblingen, plasseringen til backup-filene og hvordan filnavnet skal utformes.</p>
<pre class="brush: php; title: ; notranslate">
// MySQL host
define ('HOST', 'localhost');
// MySQL username
define ('USER', 'username');
// MySQL password
define ('PW', 'password');

define ('DUMP_FILENAME', date ('Y-m-d-H-i') . '.sql'); // i.e. 2010-10-30-23-00.sql

define ('SELF_DIR', __DIR__ . DIRECTORY_SEPARATOR);
define ('BACKUP_DIR', 'backup' . DIRECTORY_SEPARATOR);
</pre>
<p>Backupfilene våre får navnet sitt basert på dagens dato og tidspunktet for når filen blir kjørt.</p>
<p>Neste steg er å kalle opp <em>mysqldump</em>:</p>
<pre class="brush: php; title: ; notranslate">passthru (sprintf ('mysqldump -h %s -u %s -p%s -A -r &quot;%s&quot;', HOST, USER, PW, SELF_DIR . BACKUP_DIR . DUMP_FILENAME));</pre>
<p>Her trenger du ikke endre noe, bortsett fra stien til <em>mysqldump</em> om du ikke har endret PATH i Windows.</p>
<p>Argumentforklaring:</p>
<dl>
<dt>-h</dt>
<dd>Spesifiserer host-adressen til MySQL</dd>
<dt>-u</dt>
<dd>Brukernavnet til MySQL</dd>
<dt>-p</dt>
<dd>Passordet ditt MySQL-brukeren (-p og passordet skal ikke ha mellomrom mellom hverandre).</dd>
<dt>-A</dt>
<dd>Spesifiserer at vi skal ta backup av alle databasene. Alternativt <em>&#8211;all-databases</em>.</dd>
<dt>-r</dt>
<dd>Den fulle stien (plassering + filnavn) til hvor backupen ligger</dd>
</dl>
<p>Det neste jeg har valgt å gjøre, er å komprimere SQL-filen i et Zip-arkiv, som medfører at filstørrelsen blir endel mindre (noe som er bra!).</p>
<pre class="brush: php; title: ; notranslate">
$Zip = new ZipArchive;
$Zip-&gt;open (SELF_DIR . BACKUP_DIR . DUMP_FILENAME . '.zip', ZipArchive::CREATE);
$Zip-&gt;setArchiveComment ('This database dump was automatically taken at ' . date ('H:i, d.m.Y') . ' by a Windows Scheduled Task');
$Zip-&gt;addFile (DUMP_FILENAME, SELF_DIR . BACKUP_DIR . DUMP_FILENAME);
unlink (SELF_DIR . BACKUP_DIR . DUMP_FILENAME);
$Zip-&gt;close();
</pre>
<h3>Den planlagte oppgaven</h3>
<p>Det siste steget vårt, er å opprette oppaven som skal kjøre PHP-skriptet. Jeg har valgt å kjøre denne oppgaven hver dag ved midnatt.</p>
<p>Opprett den planlagte oppgaven ved å skrive dette inn i CMD:</p>
<pre class="brush: plain; title: ; notranslate">SCHTASKS /Create /SC DAILY /MO 1 /ST 00:00 /TN &quot;MySQL Backup&quot; /TR &quot;php \www\backup.php&quot;</pre>
<h3>Tips</h3>
<h4>Uten PHP</h4>
<p>Dersom du ikke ønsker å komprimere filene med Zip, trenger du heller ikke anvende PHP til denne jobben. Da kjører du rett og slett bare <em>mysqldump</em> direkte i oppgaven:</p>
<pre class="brush: plain; title: ; notranslate">SCHTASKS /Create /SC DAILY /MO 1 /ST 00:00 /TN &quot;MySQL Backup&quot; /TR &quot;mysqldump -h &lt;host&gt; -u &lt;brukernavn&gt; -p&lt;passord&gt; -A -r \www\backups\database_dump.sql&quot;</pre>
<p>Husk at det ikke skal være mellomrom mellom <em>-p</em> og passordet!</p>
<h4>Én eller flere databaser istedenfor alle</h4>
<p>Erstatt <em>-A</em> i mysqldump-kommandoen med:</p>
<pre class="brush: plain; title: ; notranslate">--database &lt;database&gt;</pre>
<p>eller</p>
<pre class="brush: plain; title: ; notranslate">--databases &lt;database 1&gt; &lt;database 2&gt; ... &lt;database N&gt;</pre>
<h3>Garbage Collector</h3>
<p>Det tar ikke lange tiden før backup-mappen blir full av filer; og strengt talt så trenger du ikke backups som ble tatt for måneder siden. Derfor kan det være lurt å sette opp en søppelsamler, som sletter gamle filer.<br />
Da oppretter du en planlagt oppgave som kjører for eksempel <em>\www\garbage.php</em> hver uke. Innholdet i PHP-filen er å <em>loope</em> gjennom backup-mappen, og sjekke datoen på når filene sist ble modifisert (opprettet). Slik har jeg gjort det:</p>
<pre class="brush: php; title: ; notranslate">
// How long we are keeping each file, since its creation date
// (in seconds)
define ('MAX_FILE_AGE', (60 * 60 * 24 * 7)); // 7 days

$data = glob (__DIR__ . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR . '*.zip');

foreach ($data as $file)
{
	if (time() - filectime ($file) &gt; MAX_FILE_AGE)
	{
		unlink ($file);
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2010/10/daglig-backup-av-mysql-med-php-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sikkerhet i PHP gjort lettere</title>
		<link>http://davidsteinsland.net/2010/07/sikkerhet-i-php-gjort-letter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sikkerhet-i-php-gjort-letter</link>
		<comments>http://davidsteinsland.net/2010/07/sikkerhet-i-php-gjort-letter/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:54:55 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sikkerhet]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=354</guid>
		<description><![CDATA[Når du utvikler en nettside, enten det er en applikasjon, rammeverk, bibliotek &#8212; hva som helst &#8212; er det desidert viktigste sikkerhet. Likevel er det mange som tar snarveier, og slurver seg unna. Om du vil unngå å stå med skjegget i postkassen den dagen du blir angrepet via XSS, CSRF eller SQL injections bør [...]]]></description>
			<content:encoded><![CDATA[<p>Når du utvikler en nettside, enten det er en applikasjon, rammeverk, bibliotek &#8212; hva som helst &#8212; er det desidert viktigste sikkerhet. Likevel er det mange som <a href="http://en.wikipedia.org/wiki/Security_by_obscurity">tar snarveier</a>, og slurver seg unna. Om du vil unngå å stå med skjegget i postkassen den dagen du blir angrepet via <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a>, <a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery">CSRF</a> eller <a href="http://en.wikipedia.org/wiki/SQL_injection">SQL injections</a> bør du følge med nå.</p>
<h3>Hvorfor?</h3>
<p><strong>Du skal aldri stole på brukerne dine</strong>. Selv om det er familien eller vennene dine. Årsaken er at enkelte personer kan utnytte sårbarhetene i systemet ditt, som kan resultere i at sensitiv informasjon blir samlet, slettet eller endret. Det kan resultere i at noen tar fysisk kontroll over nettsiden din.</p>
<h3>Hva kan man gjøre?</h3>
<p>Ved å følge prinsippet ovenfor, må du sørge for å <em>validere</em> all data du skal hente inn fra brukerne. Du bør også <em>sanitere</em> data.</p>
<p><em>Validering</em>: sjekke om data er av riktig type, for eksempel en ordentlig E-postadresse eller postnummer.<br />
<em>Sanitering</em>: manipulasjon av data, som for eksempel å fjerne enkelte tegn/bokstaver/tall og så videre.</p>
<p>I PHP får vi tilgang til brukerdata via super-globalene <var>$_GET</var>, <var>$_POST</var>, <var>$_COOKIE</var>, <var>$_SERVER</var> og <var>$_SESSION</var>.</p>
<p>Her kan brukere bokstavelig talt skrive hva de vil, og det kan betyr store følger om du ikke sjekker dataene ordentlig.</p>
<h3>Løsningen</h3>
<p>Jeg har skrevet et bibliotek i PHP kalt &laquo;<a href="http://php.davidsteinsland.net/php-security-wrapper">PHP Security Wrapper</a>&laquo;. Dette biblioteket tar seg av brukerdata fra GET, POST, SERVER og COOKIE, samtidig som du får muligheten til både å validere og sanitere dem.</p>
<p>Biblioteket er selvfølgelig gratis, og oppdateres hyppig. Om du ønsker å lære mer om dette biblioteket kan du lese <a href="http://norskwebforum.no/viewtopic.php?f=50&amp;t=43806">forumtråden</a> jeg postet på <a href="http://norskwebforum.no/">Norsk Webforum</a>, <a href="http://php.davidsteinsland.net/php-security-wrapper/">sjekke ut nettside</a>n og <a href="http://php.davidsteinsland.net/php-security-wrapper/documentation/">lese dokumentasjonen</a>.</p>
<p>Det er ikke meningen at dette blogginnlegget skulle ta for seg hvordan du kan sikre deg mot angrep, men om du ønsker å lese videre på emnet kan du sjekke ut følgende linker:</p>
<ul>
<li><a href="http://phpsec.org/projects/guide/">http://phpsec.org/projects/guide/</a></li>
<li><a href="http://ilia.ws/files/phpworks_security.pdf">http://ilia.ws/files/phpworks_security.pdf</a></li>
<li><a href="http://www.symantec.com/connect/fr/articles/securing-php-step-step">http://www.symantec.com/connect/fr/articles/securing-php-step-step</a></li>
<li><a href="http://www.phparch.com/2010/07/08/never-use-_get-again/">http://www.phparch.com/2010/07/08/never-use-_get-again/</a></li>
<li><a href="http://www.phpfreaks.com/tutorial/php-security">http://www.phpfreaks.com/tutorial/php-security</a></li>
<li><a href="http://articles.sitepoint.com/print/php-security-blunders">http://articles.sitepoint.com/print/php-security-blunders</a></li>
<li><a href="http://php.net/manual/en/security.php">http://php.net/manual/en/security.php</a></li>
<li><a href="http://php-security.org/category/articlesandtools/index.html">http://php-security.org/category/articlesandtools/index.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2010/07/sikkerhet-i-php-gjort-letter/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Yr.no &#8211; vise værdata direkte på nettsiden din</title>
		<link>http://davidsteinsland.net/2010/03/yr-no-vise-vaerdata-direkte-pa-nettsiden-din/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=yr-no-vise-vaerdata-direkte-pa-nettsiden-din</link>
		<comments>http://davidsteinsland.net/2010/03/yr-no-vise-vaerdata-direkte-pa-nettsiden-din/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 21:59:12 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Åpen kildekode]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[værdata]]></category>
		<category><![CDATA[yr]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=257</guid>
		<description><![CDATA[Siden den norske nettbaserte værtjenesten Yr.no frigir sine værdata gratis, er det mange som er i stand til å vise været fra sin hjembygd på nettsidene sine. Men hvordan gjør dem det? Jeg skrev for en stund tilbake siden en PHP-klasse som gjorde akkurat dette: hentet frem værdata basert på et norsk postnummer. Funksjonen mellomlagrer [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://davidsteinsland.net/wp-content/uploads/2010/03/yr-e1268685790227.jpg"><img class="aligncenter size-full wp-image-270" title="Yr.no" src="http://davidsteinsland.net/wp-content/uploads/2010/03/yr-e1268685790227.jpg" alt="" width="575" height="379" /></a></p>
<p style="text-align: left;">Siden den norske nettbaserte værtjenesten Yr.no frigir sine værdata gratis, er det mange som er i stand til å vise været fra sin hjembygd på nettsidene sine. Men hvordan gjør dem det?</p>
<p>Jeg skrev for en stund tilbake siden en PHP-klasse som gjorde akkurat dette: hentet frem værdata basert på et norsk postnummer.</p>
<p>Funksjonen mellomlagrer værdataene i ti minutter, slik at belastningen på Yrs servere skal minimeres, og at lastetiden hos brukeren skal oppleves raskere.</p>
<p>Kort fortalt er det kun fem linjer med kode du bør konsentrere deg om:</p>
<pre class="brush: php; title: ; notranslate">define ('PATH_WEATHER_ICONS', 'img/weather/');
define ('PATH_CACHE', 'cache/');
define ('CACHE_EXPIRATION', 600);
// How many days we are going to show
define ('DAYS_TO_SHOW', 3);

// The Zip code to which place we will fetch information about
// Defaults to 5440
$zip = isset ($_GET['zip']) ? intval ($_GET['zip']) : 5440;
</pre>
<p>Først av alt må du fortelle hvilken mappe bilde-ikonene ligger i, og hvor PHP-klassen skal mellomlagre dataene. Deretter spesifiserer du hvor lenge dataene skal bli mellomlagret (600 sekunder = 10 minutter), samt hvor mange dager fremover i tid du skal vise.</p>
<p>Sist, men ikke minst må du spesifisere fra hvor du skal hente værdata fra. Du må endre &laquo;5440&#8243; til det postnummeret du vil scriptet skal vise ved default. Dersom du vil se værdata fra et annet postnummer, skriver du følgende i adressefeltet:</p>
<p><code>index.php?zip=&lt;nytt postnummer her&gt;</code></p>
<h3>Laste ned</h3>
<p>PHP-klassen er tilgjengelig via <a href="http://tillegg.yr.no/medlemmer/davidsteinsland/php5-vaertjeneste-1">tillegg.yr.no</a>, og er som vanlig lisensiert under <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons</a>.</p>
<h3>Tips</h3>
<p>Du kan meget lett integrere PHP-klassen min med databasesettet mitt over alle norske postnummer. Slik kan du også finne ut om postnummeret brukeren ønsker å vise, faktisk finnes. Mer informasjon om databasesettet finner du i <a href="http://davidsteinsland.net/2010/03/komplett-databasesett-over-norges-postnummer-med-koordinater/">egen artikkel</a>.</p>
<h3>Tilbakemeldinger</h3>
<p>Som vanlig setter jeg pris på tilbakemeldinger, som du kan dele i kommentarfeltet!</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2010/03/yr-no-vise-vaerdata-direkte-pa-nettsiden-din/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Database med Norges postnummer, poststeder, fylker og kommuner (med koordinater)</title>
		<link>http://davidsteinsland.net/2010/03/komplett-databasesett-over-norges-postnummer-med-koordinater/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=komplett-databasesett-over-norges-postnummer-med-koordinater</link>
		<comments>http://davidsteinsland.net/2010/03/komplett-databasesett-over-norges-postnummer-med-koordinater/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 21:49:51 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Åpen kildekode]]></category>
		<category><![CDATA[Guider]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[adresser]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[fylker]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[kommuner]]></category>
		<category><![CDATA[koordinater]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postnummer]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=259</guid>
		<description><![CDATA[Behøver du en database med alle Norges postnummer? Bruker du et kart på nettsiden din? Har du behov for å sjekke hvilket sted postnummeret peker mot? Jeg har samlet alle dataene, i tillegg til koordinater til hvert eneste postnummer!]]></description>
			<content:encoded><![CDATA[<p>Her kommer det er oversikt over absolutt alle postnummer i Norge med tilhørende fylke, kommune og poststed. Hvert postnummer har også en lengde- og breddegrad tilknyttet seg. På denne måten kan du koble opp postnummeret til f.eks Google Maps.</p>
<p>Databasesettet er generert med hjelp av <a href="http://www.erikbolstad.no/geo/noreg/postnummer/">Postnummer-dugnaden</a> <a href="http://yr.no">Yr.no</a> arrangerte sommeren 2009.</p>
<p>Ved hjelp av lengde- og breddegradene kan du jo også regne deg frem til avstanden mellom to steder, eller finne nærmeste postkontor til en bruker.</p>
<p>For å få lett oversikt over alle postkoder, kjører du følgende spørring:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT
 postnummer, fylkeNavn, kommuneNavn, poststedNavn, kategoriNavn, lat, lon
FROM `postnumre`
INNER JOIN poststed
USING(poststedID)
INNER JOIN kommuner
USING(kommuneID)
INNER JOIN fylker
USING(fylkeID)
INNER JOIN kategorier
USING(kategoriID)
ORDER BY
 postnummer ASC, fylkeNavn ASC, kommuneNavn ASC, poststedNavn ASC</pre>
<p>Med enhver sak kan det forekomme feil, så om dere kommer over noe som skulle vise seg til å være en bug: si i fra.<strong></strong></p>
<h3>Oppdateringer</h3>
<p><strong>Versjon 1.4<br />
</strong>- Har innført alle endringer gjort av posten pr. 1. februar 2012<br />
- Det er nye navn på tabeller og kolonner (norsk)<br />
- Koordinater er synkronisert med <a href="http://www.erikbolstad.no/geo/noreg/postnummer/">listene til Erik Bolstad</a></p>
<p><strong>Versjon 1.3</strong><br />
- Tabellene er gjort om til InnoDb med nødvendige indekser og fremmednøkler<br />
- Jan Mayen og Svalbard er nå plassert inn i to fylker (med samme navn), i henhold til ISO 3166-2:NO. På grunn av at områdene ikke har noe de facto fylke, måtte det gjøres slik.<br />
- Enkelte justeringer på koordinater<br />
- Kommunesentre for hver kommune er lagt inn</p>
<p><strong>Versjon 1.2</strong><br />
- Jan Mayen og Svalbard har klart å falle ut fra oversikten. Det er pga. områdene ikke er del av noen fylker, og det har dermed blitt opprettet et &laquo;Svalbard og Jan Mayen&raquo;-fylke.</p>
<h3>Last ned (versjon 1.4)</h3>
<p><img src="http://davidsteinsland.net/wp-content/themes/eikeland/images/download_icon.png" alt="Last ned" class="icon" /> <a href="http://davidsteinsland.net/filer/norske_postnummer_20120209.zip">Norske postnummer</a> (2183 nedlastninger) , lisensiert under <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2010/03/komplett-databasesett-over-norges-postnummer-med-koordinater/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>LaTeX på nett: matematiske formler til bilder</title>
		<link>http://davidsteinsland.net/2010/03/latex-pa-nett-matematiske-formler-til-bilder/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=latex-pa-nett-matematiske-formler-til-bilder</link>
		<comments>http://davidsteinsland.net/2010/03/latex-pa-nett-matematiske-formler-til-bilder/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 17:58:54 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Åpen kildekode]]></category>
		<category><![CDATA[Guider]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[latex]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=240</guid>
		<description><![CDATA[Innenfor realfagene matematikk, fysikk og kjemi skriver jeg alt av rapporter og øvinger i LaTeX, som er et typesettingssystem for dokumentproduksjon. Det er spesielt egnet for matematisk litteratur, og blir definert av den engelske Wikipedia slik: A document-typesetting system derived from TeX and used mainly to create scientific and mathematical literature. LaTeX er originalt skrevet [...]]]></description>
			<content:encoded><![CDATA[<p>Innenfor realfagene matematikk, fysikk og kjemi skriver jeg alt av rapporter og øvinger i <a href="http://no.wikipedia.org/wiki/LaTeX">LaTeX</a>, som er et typesettingssystem for dokumentproduksjon. Det er spesielt egnet for matematisk litteratur, og blir definert av den engelske Wikipedia slik:</p>
<blockquote><p>A document-typesetting system derived from TeX and used mainly to create scientific and mathematical literature.</p></blockquote>
<p>LaTeX er originalt skrevet for Linux, men er per i dag tilgjengelig på alle plattformer gjennom ulike distribusjoner. Personlig bruker jeg distribusjonen <a href="http://miktex.org">MikTeX</a> med versjonsnummer 2.8. Redigeringsprogrammet jeg bruker heter <a href="http://www.latexeditor.org/">LaTeX Editor</a> &#8212; forkortet LEd.</p>
<p style="text-align: center;"><a href="http://davidsteinsland.net/wp-content/uploads/2010/03/led.png"><img class="size-large wp-image-241  aligncenter" title="LaTeX Editor" src="http://davidsteinsland.net/wp-content/uploads/2010/03/led-e1268686172110.png" alt="" width="575" height="348" /></a></p>
<p>Det er tusenvis av fordeler for å bruke LaTeX kontra såkalte <em>What You See Is What You Get</em>-program (Microsoft Office, OpenOffice, Lotus Symphony etc.). Den største er at i LaTeX så er det du som har kontrollen: What You See Is What You Mean.  Ting blir faktisk slik du sier det skal være!</p>
<p>Du har vel sett noen matematiske formler på Wikipedia? Der anvender de nemlig  LaTeX, og ser omtrent slik ut:</p>
<p><img class="alignnone" title="ABC-formel" src="http://upload.wikimedia.org/math/3/e/a/3ea647783b5121989cd87ca3bb558916.png" alt="" width="179" height="44" /></p>
<p>Det er nemlig dette jeg har tenkt å ta tak i, i denne posten: nemlig forklare deg hvordan du også kan få slike deilige formler på din nettside!</p>
<h2>Hva må gjøres klart?</h2>
<p>For å skrive LaTeX på PC-en din, og for at alt skal gå optimalt, krever det en rekke program som f.eks MikTeX (LaTeX-distro), LEd (redigering) og GhostScript / Ghost View (postscript-støtte). For å skrive LaTeX på nett krever jeg derimot at du kun har MikTeX installert!</p>
<p><em>PS: Jeg tar som utgangspunkt at webserveren din er din egen PC. Veldig få webhotell-leverandører som installerer LaTeX&#8230;<img class="alignright" title="MikTeX Installasjon" src="http://davidsteinsland.net/wp-content/uploads/2010/03/miktex-install-300x178.png" alt="" width="300" height="178" /></em></p>
<p><strong>Last så ned siste versjon av <a href="http://miktex.org/">MikTeX</a> og installer denne på PC-en din</strong>. For din egen del er det nok lurest å velge &laquo;Basic Installer&raquo;. Her vil kun de mest nødvendige pakkene bli installert (pakker kan oversettes som plugins). Om du ønsker å installere alle pakker tilgjengelig, velger du &laquo;Complete MikTeX System&raquo;.</p>
<h2>La oss begynne!</h2>
<p>Det aller første du må gjøre rede for er følgende:</p>
<ol>
<li>Hvor installerte du MikTeX?</li>
</ol>
<p>La oss si du installerte programmet i <code>C:\Programfiler\MikTeX 2.8\</code></p>
<p>Da må du leite frem til <code>miktex\bin\latex.exe</code> og <code>\miktex\bin\dvipng.exe</code>.</p>
<p>Dersom disse programmene ikke er tilstede, vil du ikke være i stand til å gjennomføre denne guiden: prøv da å re-installere MikTeX.</p>
<p>Har du lokalisert programmene? Flott &#8212; da går vi videre.</p>
<p>Finn frem til root-mappen på serveren din (bruker du WampServer er dette <code>C:\wamp\www\</code>). Opprett en mappe som du kaller for &laquo;latex&raquo;.<br />
Inni den nye mappen, oppretter du så følgende mapper:</p>
<ul>
<li><code>images</code></li>
<li><code>tmp</code></li>
</ul>
<p>«Images» er mappen hvor de endelige formlene kommer til å bli plassert, og «tmp» er mappen hvor produksjonsfilene våre ligger. Når du kompilerer et dokument i LaTeX vil det bli opprettet totalt 4 filer per prosjekt. Disse er respektivt .tex, .aux, .log og .dvi. Tex-filen inneholder selve dokumentet vårt, og <a href="http://en.wikipedia.org/wiki/Device_independent_file_format">DVI-filen</a> er selve outputen etter kompilering. Disse to er essensielle.</p>
<h2>PHP-klassen</h2>
<p>Jeg har allerede skrevet klassen ferdig, som du skal få. Før jeg overrekker den, vil jeg ta tiden til å forklare litt hva den gjør.</p>
<p>Det er to ting du umiddelbart må få i stand etter at du har lastet ned klassen:</p>
<p>- Øverst i klassen er det deklarert to variabler: <code>_latex_path</code> og <code>_dvipng_path</code>. Disse må du endre til hva du fant ut i punkt #1 (under «La oss begynne!»). Det er veldig viktig at du følger denne regelen når du endrer sti: <strong>Variabelen må være omgitt av to enkle apostrofer, og selve stien til programmene må være omgitt av gåseøyne.</strong></p>
<p>Dette er fordi at dersom det er mellomrom en plass i stien (i <code>C:\Program Files\MikTeX\</code> er det mellomrom i &laquo;Program Files&raquo;) må teksten være omgitt av gåseøyne, som forteller at teksten skal tolkes som én sti, og ikke to.</p>
<p>Dersom stien til latex.exe på PC-en din er følgende: <code>C:\Program Files\MikTeX 2.8\miktex\bin\latex.exe</code> skal <code>_latex_path</code> være formet slik:</p>
<pre class="brush: php; title: ; notranslate"> $_latex_path = '&quot;C:\Program Files\MikTeX 2.8\miktex\bin\latex.exe&quot;';</pre>
<p>Utover dette, skal klassen fungere ut-av-boksen (dersom du har opprettet de korrekte mappene).</p>
<h2>Laste klassen ned</h2>
<p><a href="http://davidsteinsland.net/wp-content/uploads/2010/03/latex.zip">PHP5 LaTeX Renderer</a>, lisensiert under <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons</a>.</p>
<h2>Hvordan fungerer klassen?</h2>
<p>I seg selv er den ganske liten, og rett frem. Det er en innebygget cache-funksjon som lagrer bildene ved hjelp av:</p>
<ul>
<li>den matematiske formelen</li>
<li>tekst-størrelsen</li>
</ul>
<p>Om du vil endre tekst-størrelse, gjør du slik:</p>
<pre class="brush: php; title: ; notranslate"><img src='http://s0.wp.com/latex.php?latex=%3D+new+LaTeX%28%29%3B++++&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='= new LaTeX();    ' title='= new LaTeX();    ' class='latex' />latex-&gt;set ('font_size', 16); // 16 is the font size, measured in &quot;points&quot;</pre>
<p>Dersom du vil endre artikkel-klassen for dokumentet, gjør du slik:</p>
<pre class="brush: php; title: ; notranslate">$latex-&gt;set ('article_class', 'article'); </pre>
<p>Ved default er det «scrartcl» som fungerer som dokumentets klasse, men dette er en tilleggspakke som må installeres. Derfor kan du anvende «article» som kommer ferdig-installert via MikTeX.</p>
<p>&#8230; og slik setter du innholdet:</p>
<pre class="brush: php; title: ; notranslate">$latex-&gt;set ('tex_content', '\frac{1}{2}');</pre>
<p>For å rendere dokumentet, og vise den endelige formelen som et bilde, gjør du slik:</p>
<pre class="brush: php; title: ; notranslate">$data = $latex-&gt;render ();
echo '&lt;img src=&quot;' . $data['img'] . '&quot; alt=&quot;' . $data['tex'] . '&quot; /&gt;';</pre>
<p>Klassen støtter naturligvis linking, og kan brukes slik:</p>
<pre class="brush: php; title: ; notranslate"><img src='http://s0.wp.com/latex.php?latex=%3D+new+LaTeX%28%29%3B++++&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='= new LaTeX();    ' title='= new LaTeX();    ' class='latex' />data = $latex-&gt;set ('font_size', 16)-&gt;set ('tex_content', 'ax^2 + bx + c = 0')-&gt;render ();</pre>
<p>Dersom du ønsker å skrive ABC-formelen (som jeg viste lengre oppe i artikkelen), skriver du den slik:</p>
<pre class="brush: plain; title: ; notranslate"> x = \frac{ -b \pm \sqrt{b^2 - 4ac}}{2a}</pre>
<h3>Flyteskjema</h3>
<p>For de av dere som er interessert i flowcharts (meg inkludert): slik er fremgangsmåten i klassen:</p>
<p style="text-align: center;"><a href="http://davidsteinsland.net/wp-content/uploads/2010/03/flowchart.png"><img class="aligncenter size-full wp-image-284" title="Flyteskjema - application flowchart" src="http://davidsteinsland.net/wp-content/uploads/2010/03/flowchart-e1268685107832.png" alt="" width="575" height="378" /></a></p>
<h2>Det var det!</h2>
<p>Nå er du i bunn og grunn ferdig, og kan begynne å eksperimentere selv. Det rådes selvsagt at du har noen kunnskaper innen LaTeXs måter å skrive ting på. Om du vil lese deg opp på emnet, er det mange gode ressurser for det:</p>
<ul>
<li><a href="http://www.ctan.org/tex-archive/info/lshort/english/lshort.pdf">The Not So Short Introduction to LaTeX</a></li>
<li>Wikipedia (<a href="http://no.wikipedia.org/wiki/LaTeX">norsk</a> / <a href="http://en.wikipedia.org/wiki/LaTeX">engelsk</a>)</li>
<li>LaTeX guide på <a href="http://www.eksamensoppgaver.org/guider/latex-guide/10/">Eksamensoppgaver.org</a></li>
</ul>
<p>Om det er noen spørsmål om hjelp, tips til forbedringer etc, kan dette tas opp i kommentarfeltet.</p>
<p>PS: LaTeX uttales Lah-tek. Vil ikke høre om noen som sier det rett ut..</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2010/03/latex-pa-nett-matematiske-formler-til-bilder/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

