<?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</title>
	<atom:link href="http://davidsteinsland.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://davidsteinsland.net</link>
	<description>Personlig blogg om programmering og andre uinteressante emner</description>
	<lastBuildDate>Sun, 19 Feb 2012 14:21:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Oppdatert postnummerdatabase</title>
		<link>http://davidsteinsland.net/2012/02/oppdatert-postnummerdatabase/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oppdatert-postnummerdatabase</link>
		<comments>http://davidsteinsland.net/2012/02/oppdatert-postnummerdatabase/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 02:12:11 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Generelt]]></category>

		<guid isPermaLink="false">http://davidsteinsland.net/?p=743</guid>
		<description><![CDATA[Jeg har gått igjennom hele databasen på nytt, og lagt inn alle endringer gjort av posten pr. 9. februar 2012. For mer informasjon, går innom det originale blogginnlegget.]]></description>
			<content:encoded><![CDATA[<p>Jeg har gått igjennom hele databasen på nytt, og lagt inn alle endringer gjort av posten pr. 9. februar 2012.</p>
<p>For mer informasjon, går innom <a title="Database med Norges postnummer, poststeder, fylker og kommuner (med koordinater)" href="http://davidsteinsland.net/2010/03/komplett-databasesett-over-norges-postnummer-med-koordinater/">det originale blogginnlegget</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2012/02/oppdatert-postnummerdatabase/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> (2 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>Lagre og hente frem objekter i Java (cache)</title>
		<link>http://davidsteinsland.net/2012/02/lagre-og-hente-frem-objekter-i-java-cache/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lagre-og-hente-frem-objekter-i-java-cache</link>
		<comments>http://davidsteinsland.net/2012/02/lagre-og-hente-frem-objekter-i-java-cache/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 12:28:12 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[serializable]]></category>

		<guid isPermaLink="false">http://davidsteinsland.net/?p=701</guid>
		<description><![CDATA[Noe ganske essensielt med et program er egenskapen å huske innstillinger til neste oppstart. Men hvordan skal vi få til dette? Skal vi bruke en database eller XML? Eller finnes det andre metoder? I Java har vi en interface som heter &#171;Serializable&#187;. Klasse som implementerer den, har muligheten til å bli lagret på disk til senere [...]]]></description>
			<content:encoded><![CDATA[<p>Noe ganske essensielt med et program er egenskapen å huske innstillinger til neste oppstart. Men hvordan skal vi få til dette? Skal vi bruke en database eller XML? Eller finnes det andre metoder?</p>
<p>I Java har vi en <em>interface</em> som heter &laquo;Serializable&raquo;. Klasse som implementerer den, har muligheten til å bli lagret på disk til senere bruk ved bruk av <var>ObjectOutputStream</var> og <var>ObjectInputStream</var>.</p>
<p>Helt enkelt, kan vi gjøre slik:</p>
<pre class="brush: java; title: ; notranslate">
MyObject myObj = new MyObject (); // MyObject implementerer Serializable

try
{
    FileOutputStream fos = new FileOutputStream (&quot;myObject.ser&quot;);
    ObjectOutputStream oos = new ObjectOutputStream(fos);

    oos.writeObject(myObj);

    oos.flush();
    oos.close();
}
catch (Exception e)
{
    e.printStackTrace();
}
</pre>
<p>Objektet vårt er nå lagret i filen <var>myObject.ser</var>, og vi kan hente det frem igjen slik:</p>
<pre class="brush: java; title: ; notranslate">
try
{
    FileInputStream fis = new FileInputStream(&quot;myObject.ser&quot;);
    ObjectInputStream ois = new ObjectInputStream(fis);

    // myObj er nå av samme instans som i eksempelet ovenfor
    MyObject myObj = (MyObject) ois.readObject();

    ois.close();
}
catch (Exception e)
{
    e.printStackTrace();
}
</pre>
<p>Som du kanskje ser, så er det ikke så veldig komplisert. Men hva dersom applikasjonen inneholder mange flere objekter? Å lagre alle objektene manuelt er både tidkrevende og unødvendig.</p>
<p>Vi kan nemlig anvende oss av programmeringsparadigmet <em>Registry. </em>Essensielt er det en klasse som inneholder alle andre objekter som brukes i en applikasjon. Registeret anvender også gjerne <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton-mønsteret</a> slik at objektene kan nås overalt.</p>
<p>Når vi har et register trenger vi bare lagre register-objektet. Alle objekter som måtte være i registeret vil da også bli lagret.</p>
<p>Et eksempel på et slik register:</p>
<pre class="brush: java; title: ; notranslate">
class Registry implements Serializable
{
	private static final long serialVersionUID = 7422025143560909873L;
	private static final Registry instance = new Registry();

	private HashMap registry = new HashMap();

	private Registry ()
	{ }

	public static Registry getInstance ()
	{
		return instance;
	}

	public void addObject (String k, Object v)
	{
		this.registry.put (k, v);
	}

	public Object getObject (String k)
	{
		return this.registry.get (k);
	}
}
</pre>
<p>Du har kanskje lagt merke til datafeltet <var>serialVersionUID</var>, og lurer på hva det er?</p>
<blockquote><p>serialVersionUID er en universell versjonsindikator for en klasse som støtter serial-handling. Deserialiseringa bruker dette ID-nummeret for å sikre at klassen er i samsvar med det serialiserte objektet.</p></blockquote>
<p>I praksis betyr dette at Java bruker serienummeret til å sjekke om det objektet du henter <em>frem</em> fra filen er i samsvar med det objektet du la <em>inn</em>. Det høres kanskje litt diffus ut fortsatt, men ta følgende scenario:</p>
<p>- Du oppretter et objekt av typen <em>MyObject</em> (som i kode #1), og lagrer dette til en fil<br />
- I mellomtiden endrer du på klassestrukturen til MyObject, og legger til flere datafelt<br />
- Når du henter frem objektet igjen, etter klasseendringene, hva tror du skjer?</p>
<p>Java kjenner nemlig ikke igjen klassene, og tror de er forskjellige. Du vil derfor få en feilmelding om at det er en ugyldig klasse. Dersom du hadde implementert <var>serialVersionUID</var>, hadde Java forstått at objektene likevel var like.</p>
<p>Verdien er unik per klasse, og blir generert av Java selv. For å finne ut hvilket nummer du skal legge inn i hver klasse, må du ta ibruk <var>serialver</var>-programmet (følger med Java-installasjonen).</p>
<p><a href="http://davidsteinsland.net/wp-content/uploads/2012/02/serialver-java.png"><img class="aligncenter size-full wp-image-702" title="Java: serialver" src="http://davidsteinsland.net/wp-content/uploads/2012/02/serialver-java.png" alt="" width="586" height="109" /></a></p>
<p>Du åpner opp kommandolinjen og endrer mappe til hvor klassefilene dine ligger. Deretter utfører du kommandoen:</p>
<pre class="brush: plain; title: ; notranslate">
serialver Registry
</pre>
<p>Bytt ut <em>Registry</em> med hva klassenavnet er i ditt tilfelle.</p>
<h3>Et eksempel på bruk</h3>
<pre class="brush: java; title: ; notranslate">
class Program
{
    public static void main (String[] args)
    {
        Registry reg = Registry.getInstance();

        reg.addObject (&quot;myObj&quot;, new MyObject (&quot;Something&quot;));
        reg.addObject (&quot;foo&quot;, new MyObject (&quot;bar&quot;));

        // lagre objektene ved avslutning
        try
        {
            FileOutputStream fos = new FileOutputStream (&quot;registry.ser&quot;);
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            oos.writeObject(reg);

            oos.flush();
            oos.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        // ... så kan vi hente dem frem igjen
        try
        {
            FileInputStream fis = new FileInputStream(&quot;registry.ser&quot;);
            ObjectInputStream ois = new ObjectInputStream(fis);

            reg = (Registry) ois.readObject();
            ois.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        // do something..
        MyObject myObj = (MyObject) reg.getObjet (&quot;myObj&quot;);
    }
}
</pre>
<h3>Oppsummering</h3>
<ul>
<li>Alle klasser som skal lagres <strong>må</strong> implementere <var>Serializable</var>, og <strong>bør</strong> inneholdet  <var>serialVersionUID</var></li>
<li>Et felles register med alle objekter vil spare deg for tid og ressurser, for eksempel ved lagring av objekter</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2012/02/lagre-og-hente-frem-objekter-i-java-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kompilere Java-prosjekter med Apache Ant</title>
		<link>http://davidsteinsland.net/2012/02/kompilere-java-prosjekter-med-apache-ant/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kompilere-java-prosjekter-med-apache-ant</link>
		<comments>http://davidsteinsland.net/2012/02/kompilere-java-prosjekter-med-apache-ant/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 14:52:54 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[apache ant]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notepad++]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://davidsteinsland.net/?p=678</guid>
		<description><![CDATA[Når en jobber med store Java-prosjekter som inneholder mange klasse- og kildefiler, kan det være et mareritt å holde styr på alle disse. For ikke å snakke om å sørge for å kompilere alle, én etter én. Apache Ant ble laget for akkurat dette formålet, og har mange likhetstrekk med Make (for de som er [...]]]></description>
			<content:encoded><![CDATA[<p>Når en jobber med store Java-prosjekter som inneholder mange klasse- og kildefiler, kan det være et mareritt å holde styr på alle disse. For ikke å snakke om å sørge for å kompilere alle, én etter én. <a href="http://ant.apache.org/">Apache Ant</a> ble laget for akkurat dette formålet, og har mange likhetstrekk med <em>Make</em> (for de som er kjent med Unix). Ant er et <em>automatisert kompileringsverktøy</em> som kan brukes for å kompilere hele Java-prosjekter med én kommando.</p>
<p>Programmet tar utgangspunkt i en konfigurasjonsfil som er formatert i XML, og styrer hvilke filer som kan kompileres og hvor klassefilene skal ligge. Du kan også velge om du skal opprette JAR-filer for hele prosjektet.</p>
<h3>Installasjon</h3>
<p>Gå til <a href="http://ant.apache.org/bindownload.cgi">nedlastningssiden for Apache Ant</a> og last ned siste versjon. Pakk ut mappen til for eksempel <var>C:\ant\</var>.</p>
<p>Sørg deretter for at du har en miljøvariabel kalt <var>JAVA_HOME</var> med verdien tilsvarende mappen som inneholder JDK. For eksempel slik:<br />
<var>c:\Progra~1\Java\jdk1.7.0\</var></p>
<p>Du må også huske å inkludere <var>C:\ant\bin\</var> i miljøvariabelen <var>PATH</var>.</p>
<h3>Forberedelse</h3>
<p>Opprett en helt enkelt Java-klasse med en <em>main</em>-metode, som du lagrer i en mappe kalt <var>src</var>.</p>
<p>Deretter oppretter du en XML-fil som du kaller <var>build.xml</var> med følgende innhold:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;project name=&quot;MySQL&quot; default=&quot;compile&quot;&gt;

	&lt;!-- Configuration --&gt;
	&lt;property name=&quot;src.dir&quot;     value=&quot;src&quot;/&gt;
    &lt;property name=&quot;build.dir&quot;   value=&quot;build&quot;/&gt;
    &lt;property name=&quot;classes.dir&quot; value=&quot;${build.dir}/classes&quot;/&gt;
    &lt;property name=&quot;jar.dir&quot;     value=&quot;${build.dir}/jar&quot;/&gt;
    &lt;property name=&quot;main-class&quot;  value=&quot;Test&quot;/&gt;
	&lt;!-- End Configuration --&gt;

	&lt;target name=&quot;clean&quot;&gt;
        &lt;delete dir=&quot;${build.dir}&quot;/&gt;
    &lt;/target&gt;

   &lt;target name=&quot;compile&quot;&gt;
        &lt;mkdir dir=&quot;${classes.dir}&quot;/&gt;
        &lt;javac srcdir=&quot;${src.dir}&quot; destdir=&quot;${classes.dir}&quot;/&gt;
    &lt;/target&gt;

	&lt;target name=&quot;jar&quot; depends=&quot;compile&quot;&gt;
        &lt;mkdir dir=&quot;${jar.dir}&quot;/&gt;

		&lt;jar destfile=&quot;${jar.dir}/${ant.project.name}.jar&quot; basedir=&quot;${classes.dir}&quot;&gt;
            &lt;manifest&gt;
                &lt;attribute name=&quot;Main-Class&quot; value=&quot;${main-class}&quot;/&gt;
            &lt;/manifest&gt;
        &lt;/jar&gt;
    &lt;/target&gt;

	&lt;target name=&quot;run&quot; depends=&quot;jar&quot;&gt;
		&lt;java jar=&quot;${jar.dir}/${ant.project.name}.jar&quot; fork=&quot;true&quot;/&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>
<p>I starten trenger du ikke tenke på mer enn å endre &laquo;TestApp&raquo; til prosjektets navn, samt endre &laquo;main-class&raquo; til den klassen som inneholder main-metoden.</p>
<p>De ulike <em>target</em>-blokkene utgjør kommandoene du kan gjøre med Ant. For eksempel vil vi med denne filen ha følgende kommandoer tilgjengelige:</p>
<pre class="brush: plain; title: ; notranslate">
ant compile
ant jar
ant run
ant clean
</pre>
<p>Dersom du legger merke til linje nummer to, så står det blant annet <var>default=&raquo;compile&raquo;</var>. Dette gjør at dersom vi kjører kommandoen:</p>
<pre class="brush: plain; title: ; notranslate">
ant
</pre>
<p>Så vil den kjøre <em>compile</em>-oppgaven.</p>
<p>Konfigurasjonsfilen skal lagres i prosjektmappen, slik at du ender opp med følgende mappestruktur;</p>
<pre class="brush: plain; title: ; notranslate">
TestApp
+ src/
|	Test.java
+ build.xml
</pre>
<h3>Gjennomføring</h3>
<p>Nå er det lille prosjektet vårt klar til å kompileres.<br />
Start opp kommandolinjen og endre mappe til prosjektet.</p>
<p>For å kompilere prosjektet, skriver du inn kommandoen:</p>
<pre class="brush: plain; title: ; notranslate">
ant
</pre>
<p>Denne kommandoen gjør oppgaven som er spesifisert under <var>&lt;target name=&raquo;compile&raquo;&gt;</var>.<br />
Den oppretter mappen <var>build\classes</var> og lagrer klassefilene der.</p>
<p>For å lage en JAR-fil for videre distribusjon, utfører vi kommandoen:</p>
<pre class="brush: plain; title: ; notranslate">
ant jar
</pre>
<p>Denne er avhengig av at prosjektet først er kompilert, men dette sørger Apache Ant for å gjøre dersom du ikke har gjort det.<br />
Det vil si at vi faktisk ikke trenger å utføre kommandoen <var>ant compile</var> på forhånd.</p>
<p>For å teste at JAR-filen fungerer, kan vi bruke kommandoen <var>ant run</var>.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2012/02/kompilere-java-prosjekter-med-apache-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Skrive og kompilere LaTeX i Notepad++</title>
		<link>http://davidsteinsland.net/2011/12/skrive-og-kompilere-latex-i-notepad/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=skrive-og-kompilere-latex-i-notepad</link>
		<comments>http://davidsteinsland.net/2011/12/skrive-og-kompilere-latex-i-notepad/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 17:25:15 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[latex]]></category>
		<category><![CDATA[notepad++]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[postscript]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=620</guid>
		<description><![CDATA[Flere ganger har jeg skrevet om Notepad++ og hvordan du enkelt kan utvide funksjonaliteten til programmet. Forrige gang skrev jeg om hvordan du kunne kompilere og kjøre Java-applikasjoner. Denne gangen handler det om LaTeX og hvordan du kan skrive LaTeX-dokumenter i Notepad++, samt hvordan du får dem over til PDF- eller PostScript-format. Før vi går [...]]]></description>
			<content:encoded><![CDATA[<p>Flere ganger har jeg skrevet om <a href="http://notepad-plus-plus.org/">Notepad++</a> og hvordan du enkelt kan utvide funksjonaliteten til programmet. Forrige gang skrev jeg om <a title="Java: Kompiler og kjør, direkte fra Notepad++" href="http://davidsteinsland.net/2011/09/java-kompiler-og-kjor-direkte-fra-notepad/">hvordan du kunne kompilere og kjøre Java-applikasjoner</a>.<br />
Denne gangen handler det om <a href="http://www.latex-project.org/">LaTeX</a> og hvordan du kan skrive LaTeX-dokumenter i Notepad++, samt hvordan du får dem over til PDF- eller PostScript-format.</p>
<h3>Før vi går i gang &#8230;</h3>
<p>For at ting skal gå knirkefritt for deg så bør du helst leste artikkelen jeg skrev om <a title="Java: Kompiler og kjør, direkte fra Notepad++" href="http://davidsteinsland.net/2011/09/java-kompiler-og-kjor-direkte-fra-notepad/">kompilering av Java i Notepad++</a>, spesielt om hvordan du installerer <em>NppExec.<br />
</em>Deretter må du sørge for at du har installert <a href="http://miktex.org/">MiKTeX</a>, som er nødvendig for å kunne kompilere LaTeX.</p>
<h3>Steg 1: Opprette batch-filer</h3>
<p>Innstikket <em>NppExec</em> gir oss muligheten til å kjøre kommandoer direkte i Notepad++, og gjerne med en hurtigtast. Vi skal bruke dette innstikket til å kjøre to forskjellige batch-filer, som skal stå for å kompilere LaTeX til PDF eller PostScript.</p>
<p><strong>Opprett en batch-fil med navnet «latex-pdflatex.bat»</strong>. I denne filen skriver du inn følgende kode:</p>
<pre class="brush: vb; title: ; notranslate">
cd %1
pdflatex.exe %2
</pre>
<p>Denne batch-filen har som oppgave å kompilere et TeX-dokument direkte til PDF.</p>
<p>Deretter må du <strong>opprette en ny batch-fil med navnet «latex-postscript.bat»</strong>. Denne filen skal brukes dersom LaTeX-dokumentet inneholder vektorgrafikk, for da må dokumentet gjøres om til PostScript først (PostScript-filer kan enkelt konverteres til PDF senere).</p>
<p>Filen må inneholde følgende kode:</p>
<pre class="brush: vb; title: ; notranslate">
cd %1

latex.exe -src-specials %2.tex
dvips.exe %2
</pre>
<p>Dette programmet sørger for at LaTeX-dokumentet blir gjort om til en <a href="http://en.wikipedia.org/wiki/.dvi">.dvi-fil</a>, for så til PostScript.</p>
<h3>Steg 2: Opprette makroer i Notepad++</h3>
<p>For å finne ut hvordan du oppretter makroer i Notepad++, anbefaler jeg deg å lese<a title="Java: Kompiler og kjør, direkte fra Notepad++" href="http://davidsteinsland.net/2011/09/java-kompiler-og-kjor-direkte-fra-notepad/"> forrige artikkel jeg skrev om emnet</a>. Du følger samme prosedyre som beskrevet der, bare du bytter ut navnet på makroen samt kommandoen. Det er også beskrevet hvordan du kan tilegne tastatursnarveier til makroene.</p>
<p>LaTeX: til PDF</p>
<pre class="brush: vb; title: ; notranslate">
latex-pdflatex.bat &quot;$(CURRENT_DIRECTORY)&quot; $(NAME_PART)&quot;
</pre>
<p>LaTeX: til PDF (grafikk)</p>
<pre class="brush: vb; title: ; notranslate">
latex-postscript.bat &quot;$(CURRENT_DIRECTORY)&quot; $(NAME_PART)&quot;
</pre>
<p>Dersom du har fått alt på plass, så er det bare til å begynne å skrive!</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/12/skrive-og-kompilere-latex-i-notepad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java: Primtallgenerering og -faktorisering</title>
		<link>http://davidsteinsland.net/2011/10/java-primtallgenerering-og-faktorisering/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java-primtallgenerering-og-faktorisering</link>
		<comments>http://davidsteinsland.net/2011/10/java-primtallgenerering-og-faktorisering/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 21:41:10 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Generelt]]></category>
		<category><![CDATA[diskret matematikk]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[matematikk]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=592</guid>
		<description><![CDATA[Hvordan kan man finne alle primtall mindre enn k? Hvordan sjekke om et gitt heltall n er primtall? Hvordan kan vi primtallsfaktorisere ethvert tall? Først av alt må man etablere et par matematiske sannheter: Et primtall er et helt tall større enn 1 som bare er delelig med seg selv og med 1 Et heltall k er også [...]]]></description>
			<content:encoded><![CDATA[<p>Hvordan kan man finne alle primtall mindre enn <em>k</em>? Hvordan sjekke om et gitt heltall <em>n</em> er primtall? Hvordan kan vi primtallsfaktorisere ethvert tall?</p>
<h3>Først av alt må man etablere et par matematiske sannheter:</h3>
<ol>
<li>Et primtall er et helt tall større enn 1 som bare er delelig med seg selv og med 1</li>
<li>Et heltall <em>k</em> er også primtall dersom det ikke er delelig med andre primtall mindre enn eller lik kvadratrota til <em>k</em>.</li>
<li>Et hvert heltall større enn 1 kan skrives som produktet av ett eller flere primtall.</li>
</ol>
<h3>Så, hvordan kan man finne et primtall?</h3>
<ol>
<li> Gitt et heltall <em>k</em>, begynner vi å sjekke om tallet er delelig med det minste primtallet, 2.</li>
<li>Om det er delelig, kan vi trekke konklusjonen om at tallet ikke er primtall.</li>
<li>Dersom det ikke er delelig, går vi videre til 3. Dette gjentar vi for alle primtall <img src='http://s0.wp.com/latex.php?latex=%5Cleq+%5Csqrt%7Bk%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;leq &#92;sqrt{k}' title='&#92;leq &#92;sqrt{k}' class='latex' /><em>.</em></li>
<li>Om ingen tall er delelige, er tallet et primtall.</li>
</ol>
<p>Vi kan nå begynne å skrive Java-koden vår, og en kan for eksempel ende opp med noe slikt:</p>
<pre class="brush: java; title: ; notranslate">

public boolean isPrime (int n)
{
	int q = (int) Math.sqrt (n);

	boolean isPrime = true;

	for (int i = 2; i &lt; q; i++)
 	{
		if (n % i == 0)
		{
			return false;
		}
	}

	return true;
}
</pre>
<p>Det første vi gjør er å ta kvadratrota til heltallet vårt. Deretter kjører vi gjennom alle heltall <img src='http://s0.wp.com/latex.php?latex=2+%5Cleq+i+%5Cleq+%5Csqrt%7Bn%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='2 &#92;leq i &#92;leq &#92;sqrt{n}' title='2 &#92;leq i &#92;leq &#92;sqrt{n}' class='latex' />. Dersom tallet skulle være delelig med et annet, da er det ikke et primtall. Når løkken er gjennomført, vet vi at ingen tall er delelige og at heltallet vårt er primtall.</p>
<h3>Primtallsfaktorisering</h3>
<p>Ved aritmetikkens fundamentalteorem vet vi at et heltall større enn 1 er enten et primtall, eller et produkt av ett eller flere primtall.</p>
<p>For eksempel er: <img src='http://s0.wp.com/latex.php?latex=7007+%3D+7+%5Ccdot+7+%5Ccdot+11+%5Ccdot+13&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='7007 = 7 &#92;cdot 7 &#92;cdot 11 &#92;cdot 13' title='7007 = 7 &#92;cdot 7 &#92;cdot 11 &#92;cdot 13' class='latex' /></p>
<pre class="brush: java; title: ; notranslate">

public Integer[] primeFactorization (int a)
{
	ArrayList factors = new ArrayList();

	// fetch primes less than or equal to sqrt(a).
	// if no primes are returned, the number itself is a prime.
	Integer[] primes = primes ((int)Math.sqrt(a));

	int i = 0;
	while (i &lt; primes.length)
 	{
 		int p = primes[i];
 		if (Arrays.asList (primes).contains(a) || isPrime (a))
 		{
 			// the remaining number is now a prime.
 			break;
 		}
 		if (a % p == 0)
 		{
 			// add the prime to our list, and execute the division
 			factors.add (p);
 			a = a / p;
 		}
 		else
 		{
 			// Continue to next prime, if the current one does not
 			// divide
 			i++;
 		}
 	}
 	// The number than remains should be a prime itself.
 	if (a &gt; 1)
	{
		factors.add (a);
	}

	return (Integer[]) factors.toArray(new Integer[factors.size()]);
}
</pre>
<p>Her ble det kanskje litt komplisert med det første, men prosessen er igrunn ganske enkel:</p>
<ol>
<li><em>primes</em>() til å gi oss et int-array med primtall (bruker funksjonen <em>isPrime</em>())</li>
<li>Deretter går vi gjennom alle primtallene, og sjekker om tallet <em>a</em> er delelig med <em>p</em>. Dersom det er delelig, så legger vi primtallet <em>p</em> i samlingen vår og utfører divisjonen <img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7Ba%7D%7Bp%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;frac{a}{p}' title='&#92;frac{a}{p}' class='latex' />.</li>
<li>I neste runde tester vi enten det samme primtallet som i forrige runde, eller så tester vi det neste primtallet. Det er først når det gjeldende primtallet ikke er delelig, at vi går til neste.</li>
<li>Til slutt skal det resterende tallet selv være et primtall, men vi ønsker ikke å inkludere tallet 1 som faktor.</li>
</ol>
<h3>Eksempel</h3>
<p>Om vi bruker tallet 7007 om igjen, så vil vi i Java-funksjonen få følgende primtall:</p>
<p><img src='http://s0.wp.com/latex.php?latex=%7B2%2C+3%2C+5%2C+7%2C+11%2C+13%2C+17%2C+19%2C+23%2C+29%2C+31%2C+37%2C+41%2C+43%2C+47%2C+53%2C+59%2C+61%2C+67%2C+71%2C+73%2C+79%2C+83%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83}' title='{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83}' class='latex' />. Det er alle primtall som er mindre enn kvadratroten til 7007.</p>
<p>Deretter tester vi først om 2 er delelig med 7007. Det er det ikke, så vi går videre til neste primtall. Det er først når vi kommer til 7 at vi finner et primtall som er delelig med 7007.</p>
<p>Vi legger da til tallet 7 i listen vår, og utfører divisjonen <img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B7007%7D%7B7%7D+%3D+1001&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;frac{7007}{7} = 1001' title='&#92;frac{7007}{7} = 1001' class='latex' />. I neste runde tester vi tallet 7 en gang til, og igjen så er det delelig. Vi utfører da <img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B1001%7D%7B7%7D+%3D+143&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;frac{1001}{7} = 143' title='&#92;frac{1001}{7} = 143' class='latex' />.</p>
<p>Når vi i påfølgende runde tester 7 igjen, finner vi ut at det ikke lengre er delelig. Men det er primtallet 11! Det siste primtallet vil da være 13.</p>
<p>Dette gir oss følgende i resultat: <img src='http://s0.wp.com/latex.php?latex=%7B7%2C+7%2C+11%2C+13%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='{7, 7, 11, 13}' title='{7, 7, 11, 13}' class='latex' /> som forteller oss hvilke primtallsfaktorer som gir 7007.</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/10/java-primtallgenerering-og-faktorisering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kompilere og kjøre Java i Notepad++</title>
		<link>http://davidsteinsland.net/2011/09/java-kompiler-og-kjor-direkte-fra-notepad/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java-kompiler-og-kjor-direkte-fra-notepad</link>
		<comments>http://davidsteinsland.net/2011/09/java-kompiler-og-kjor-direkte-fra-notepad/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 16:06:38 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[Programvare]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[notepad++]]></category>
		<category><![CDATA[nppexec]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=575</guid>
		<description><![CDATA[Kompiler og kjør Java-kode direkte fra Notepad++! Ingen grunn til å bytte til en IDE nå lengre!]]></description>
			<content:encoded><![CDATA[<p>Da jeg startet på Informasjonsteknologi ved HiOA, ble mange anbefalt å skrive Java i en IDE som Eclipse eller Netbeans fremfor teksteditor. Dette ble nok godtatt av de fleste, men for de av oss som har sverget troskap til Notepad++ er det vanskeligere å godta.</p>
<p>Etter litt søking rundt om, fant jeg frem til en løsning som lar deg kompilere og kjøre Java-kode direkte i fra Notepad++ med et par tastetrykk!</p>
<h3>1. Installer NppExec</h3>
<p>NppExec er en plugin til Notepad++ som lar deg kjøre kommandoer, og du vil finne denne i <em>Plugin Manager</em>. Gå til: <var>Plugins → Plugin Manager → Show Plugin Manager</var>.</p>
<p>I denne listen vil du finne NppExec. Huk av i avkryssningsboksen og trykk Install.</p>
<h3>2. Opprett batch</h3>
<p>For å kunne kjøre Java-applikasjoner måtte jeg opprette en egen batch-fil for dette. Lag en fil som heter RunJava.bat, og lim inn dette:</p>
<pre class="brush: vb; title: ; notranslate">

cd %1
java -cp . %2
pause
</pre>
<h3>3. Lage makroer</h3>
<p><em> <img class="alignright" title="nppexec_1" src="http://davidsteinsland.net/wp-content/uploads/2011/09/nppexec_1.png" alt="" width="499" height="258" /></em></p>
<p><em> Makroer</em>  er små miniprogrammer egnet for å utføre små oppgaver, som du kan lage med NppExec.</p>
<p>Trykk <var>F6</var>, lim inn følgende kommando:</p>
<pre class="brush: plain; title: ; notranslate">
D:\bin\JavaRun.bat &quot;$(CURRENT_DIRECTORY)&quot; $(NAME_PART)
</pre>
<p>Trykk så <var>Save</var>, og kall makroen for <em>Java Run</em>.</p>
<p>For å kompilere Java-kode behøver du ingen batch-filer, bare en spesiell kommando.</p>
<p>Trykk <var>F6</var>, velg &lt;temporary script&gt; fra nedtrekksmenyen, og lim inn kommandoen:</p>
<pre class="brush: plain; title: ; notranslate">
cd $(CURRENT_DIRECTORY)
javac &quot;$(FILE_NAME)&quot;
</pre>
<p>Lagre den som <em>Java Compile</em>.</p>
<h3>4. Plassere makroene i meny</h3>
<p><img class="alignright" title="nppexec_2" src="http://davidsteinsland.net/wp-content/uploads/2011/09/nppexec_2.png" alt="" width="264" height="480" /></p>
<p>Gå til <var>Plugins → NppExec → Advanced Options</var></p>
<p>I listen under &laquo;Associated Script&raquo; velger du <em>Java Run</em>. I boksen inder &laquo;Item name&raquo; skriver du: <em>Java Run Application</em>. Trykk så på <var>Add/modify</var>.</p>
<p>Gjenta samme prosedyre én gang til, bare denne gangen velger du <em>Java Compile</em> og skriver inn <em>Java Compile Application</em> under &laquo;Item name&raquo;.</p>
<p>Trykk <var>OK</var>, og finn frem <var>Macro</var> i hovedmenyen. Du vil nå se dine makroer i listen nederst.</p>
<h3>5. Tilegne tastatursnarveier</h3>
<p>Det er greit å kunne ha en tastatursnarvei for disse makroene, spesielt fordi de vil bli benyttet ofte.</p>
<p>I hovedmenyen velg <var>Run → Modify Shortcut/Delete Command</var>. Deretter velger du &laquo;Plugin Commands&raquo;, og finn frem til <em>Java Run Application</em> og <em>Java Compile Application</em>. Dobbeltklikk på hver av dem, og du vil få mulighet om å tilegne makroen en tastatursnarvei.</p>
<p>OBS! Pass på at det ikke oppstår konflikt med andre snarveier. Notepad++ håndterer slikt dårlig, og du vil derfor måtte fjerne en eksisterende snarvei før du kan bruke den på ny.</p>
<p>Gå til</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/09/java-kompiler-og-kjor-direkte-fra-notepad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tips: Enkle feilmeldinger med animasjon</title>
		<link>http://davidsteinsland.net/2011/07/tips-enkle-feilmeldinger-med-animasjon/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tips-enkle-feilmeldinger-med-animasjon</link>
		<comments>http://davidsteinsland.net/2011/07/tips-enkle-feilmeldinger-med-animasjon/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 13:34:33 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Guider]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[feilmelding]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=563</guid>
		<description><![CDATA[Her følger en liten kodesnutt som viser en feilmelding i ca. fem sekunder før den fjernes igjen. I dét feilmeldingen vises, blir bakgrunnsfargen forsterket for å få en &#171;se her!&#187;-opplevelse. Dersom musen blir holdt over feilmeldingen, blir den ikke fjernet før etter musepekeren er fjernet fra den. For å få koden til å fungere trenger [...]]]></description>
			<content:encoded><![CDATA[<p>Her følger en liten kodesnutt som viser en feilmelding i ca. fem sekunder før den fjernes igjen. I dét feilmeldingen vises, blir bakgrunnsfargen forsterket for å få en &laquo;se her!&raquo;-opplevelse. Dersom musen blir holdt over feilmeldingen, blir den ikke fjernet før etter musepekeren er fjernet fra den.</p>
<p>For å få koden til å fungere trenger du jQuery og jQuery UI.</p>
<h3>JavaScript:</h3>
<pre class="brush: jscript; title: ; notranslate">
$(function ()
{
	$('div.message').hide().effect ('highlight', {
		color:'#ff8a8a'
	}, 2000).delay(3000).animate({
		height: 'toggle',
		opacity: 'toggle'
	}, 'slow').hover (function ()
	{
		$(this).stop(true, true);
	}, function ()
	{
		$(this).delay(2000).animate({ height: 'toggle', opacity: 'toggle' }, 'slow');
	});
});
</pre>
<p>Om du studerer JavaScript-koden, vil du se at vi bruker effekten &laquo;Highlight&raquo;. Effekten angir feilmeldingsboksen med angitt bakgrunnsfarge, før den fader tilbake til bakgrunnsfargen som er satt i CSS. Alternativt kan en benytte seg av &laquo;pulsate&raquo;, som også gir en ganske behagelig animasjon:</p>
<pre class="brush: jscript; title: ; notranslate">
 $(function() {
    $('div.message').hide().effect('pulsate', {
        times: 2
    }, 450).delay(4000).animate({
        height: 'toggle',
        opacity: 'toggle'
    }, 'slow').hover(function() {
        $(this).stop(true, true);
    }, function() {
        $(this).delay(2000).animate({
            height: 'toggle',
            opacity: 'toggle'
        }, 'slow');
    });
});
</pre>
<p><em>Pulsate</em>-effekten her veksler mellom å skjule/vise feilmeldingsboksen iløpet av 450 millisekunder.</p>
<h3>CSS:</h3>
<pre class="brush: css; title: ; notranslate">
div.message
{
    display:none;
    border:1px solid;
    padding:10px;
    color: #D8000C;
    background-color:#FFBABA;
}

div.message h4
{
    font-weight:bold;
    font-size:14px;
}

div.message p
{
    padding:5px 0;
    font-size:12px;
}
</pre>
<h3>HTML:</h3>
<pre class="brush: xml; title: ; notranslate">
&lt;div class=&quot;message&quot;&gt;
    &lt;h4&gt;An Error has Occured!&lt;/h4&gt;
    &lt;p&gt;
        There was a problem while editing the article. Your data has been saved, and you can go &lt;a href=&quot;#&quot;&gt;back&lt;/a&gt; to continue editing.
    &lt;/p&gt;
    &lt;p&gt;
        Error ID: #1337
    &lt;/p&gt;
&lt;/div&gt;
</pre>
<h3>Resultatet:</h3>
<p>Klikk på &laquo;Result&raquo; i vinduet under.<br />
<iframe style="width: 100%; height: 400px;" src="http://jsfiddle.net/davidsteinsland/y96kw/3/embedded/" width="320" height="240"></iframe><br />
<a href="http://jsfiddle.net/davidsteinsland/y96kw/3/embedded/result/">Eget vindu</a></p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/07/tips-enkle-feilmeldinger-med-animasjon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Løsningsforslag R2 eksamen våren 2011</title>
		<link>http://davidsteinsland.net/2011/06/losningsforslag-r2-eksamen-varen-2011/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=losningsforslag-r2-eksamen-varen-2011</link>
		<comments>http://davidsteinsland.net/2011/06/losningsforslag-r2-eksamen-varen-2011/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 02:07:41 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Skole]]></category>
		<category><![CDATA[eksamen]]></category>
		<category><![CDATA[løsningsforslag]]></category>
		<category><![CDATA[r2]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=519</guid>
		<description><![CDATA[Jeg har laget et løsningsforslag til R2 eksamen våren 2011 som du kan laste ned her: Løsningsforslag V11 [PDF, 391 KB] Eksamen V11 [PDF, 198 KB] Ta forbehold om feil: trykk- og regnefeil kan forekomme den beste &#8230;]]></description>
			<content:encoded><![CDATA[<p>Jeg har laget et løsningsforslag til R2 eksamen våren 2011 som du kan laste ned her:</p>
<p><img src="http://davidsteinsland.net/wp-content/themes/eikeland/images/download_icon.png" alt="Last ned" class="icon" /> <a href="http://davidsteinsland.net/eksamen-rea3024/REA3024_Matematikk_R2_V11_Losningsforslag.pdf">Løsningsforslag V11</a> [PDF, 391 KB]<br />
<img src="http://davidsteinsland.net/wp-content/themes/eikeland/images/download_icon.png" alt="Last ned" class="icon" /> <a href="http://davidsteinsland.net/eksamen-rea3024/REA3024_Matematikk_R2_V11.pdf">Eksamen V11</a> [PDF, 198 KB]</p>
<p>Ta forbehold om feil: trykk- og regnefeil kan forekomme den beste &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/06/losningsforslag-r2-eksamen-varen-2011/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Komprimere CSS og JavaScript</title>
		<link>http://davidsteinsland.net/2011/04/komprimere-css-og-javascript/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=komprimere-css-og-javascript</link>
		<comments>http://davidsteinsland.net/2011/04/komprimere-css-og-javascript/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 08:19:39 +0000</pubDate>
		<dc:creator>David Steinsland</dc:creator>
				<category><![CDATA[Åpen kildekode]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[compress]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[komprimering]]></category>
		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://blog.davidsteinsland.net/?p=496</guid>
		<description><![CDATA[Sliter du med store CSS- og JavaScript-filer? Føler du at det drar opp lastetiden din? Jeg skriver om en god metode for å korte ned filstørrelsene, og dermed redusere lastetiden.]]></description>
			<content:encoded><![CDATA[<p><a href="http://davidsteinsland.net/wp-content/uploads/2011/04/yui-compressor.png"><img class="alignright size-full wp-image-499" title="YUI Compressor" src="http://davidsteinsland.net/wp-content/uploads/2011/04/yui-compressor.png" alt="" width="349" height="370" /></a>Jeg har ved et par anledninger skrevet om hvordan du kan dra opp ytelsen i nettsidene dine, ved å for eksempel introdusere mellomlagring (cache) <a title="MySQL Query Cache" href="http://davidsteinsland.net/2010/12/mysql-query-cache/">på databasen din</a> eller <a title="Cache PHP-sider: kort og enkelt" href="http://davidsteinsland.net/2011/01/cache-php-sider-kort-og-enkelt/">i applikasjonen</a>.</p>
<p>I dag tenkte jeg å dekke litt om &laquo;minifisering&raquo; av JavaScript og CSS-kode.</p>
<p>Først av alt: hva er det for noe, og hva betyr det for meg?</p>
<p>Når du skriver CSS- og JavaScript-kode (og alle andre typer..) så pleier mange å skrive på en slik måte at det er mest mulig lesbart og forståelig. Dette kan være aktivt bruk av whitespace, TAB, newlines, variabel- og funksjonsnavn blant annet.</p>
<p>Resultatet er da at koden blir lang, noe som er unødvendig: en maskin bryr seg ikke om hvor fint koden er skrevet når den skal tolke koden. Et menneske bryr seg, derimot.</p>
<p>Og som vi alle vet: dess flere bytes, dess lengre lastetid. Og på Internett har dette en stor betydning, spesielt for brukere med lav Internetthastighet (ikke alle har fått gleden av fiber ennå).</p>
<p>Det er derfor et godt tips å gjøre koden så liten som overhodet mulig, ved å fjerne whitespace og gjøre funksjonsnavn og variabelnavn kortere. Denne prosessen kalles gjerne &laquo;komprimering&raquo; eller &laquo;minifisering&raquo; (eng. <em>minify</em>).</p>
<p>Om du har lastet ned for eksempel en jQuery-plugin før, har du ofte fått to filer presentert: en &laquo;vanlig&raquo; fil, og en som slutter med &laquo;.min&raquo;.</p>
<p>Her er to eksempler på dette:</p>
<p>jquery.js<br />
jquery.min.js</p>
<p>Forskjellen her er at <em>jquery.min.js</em> er en miniversjon av <em>jquery.js</em>, og er dermed mindre i filstørrelse.</p>
<p>jquery.min.js er egnet til produksjonsbruk, mens jquery.js er egnet til videre utvikling. Det vil si at dersom du skal gjøre endringer i koden din, må du gjøre dette i kildefilen for så og lage en komprimert versjon av den etterpå.</p>
<div id="attachment_503" class="wp-caption aligncenter" style="width: 585px"><a href="http://davidsteinsland.net/wp-content/uploads/2011/04/javascript-minified-non-minified.png"><img class="size-large wp-image-503 " title="JavaScript: komprimert og vanlig" src="http://davidsteinsland.net/wp-content/uploads/2011/04/javascript-minified-non-minified-575x357.png" alt="" width="575" height="357" /></a><p class="wp-caption-text">Forskjell mellom vanlig og komprimert JavaScript</p></div>
<h3>Hvilke program er tilgjengelige?</h3>
<p>Det finnes mange gode verktøy for å minifisere CSS- og JavaScript-filer, hvor de mest brukte er <a href="http://developer.yahoo.com/yui/compressor/">Yahoo! Compressor</a> og <a href="http://code.google.com/intl/no/closure/">Google Closure</a>. Dette er to Java-filer som du må kjøre lokalt på PC-en via kommandolinjen. Kanskje ikke det beste alternativet for alle, som er årsaken til at det finnes mange gode nettbaserte verktøy også.</p>
<h3>Egenutviklet program</h3>
<p>Jeg har utviklet et program for Windows basert på Yahoo! Compressor, som gjør at du slipper å benytte kommandolinjen for å minifisere filer.</p>
<p>Programmet er skrevet i C#, og fungerer derfor kun på Windows (som jeg vet om). Det er likevel et nyttig verktøy som er lett å bruke!</p>
<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/YuiCompressor.zip">YUI CSS- og JavaScript Compressor</a> (0 nedlastninger)</p>
]]></content:encoded>
			<wfw:commentRss>http://davidsteinsland.net/2011/04/komprimere-css-og-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.494 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-23 02:33:40 -->
<!-- Compression = gzip -->
