Forsida

Temaer

Sjangere

mp3 skader musikken din

Tema: Programvare; sjanger: Meninger
Skrevet av Andreas Nordal den 22. november 2009 kl 01:00:48; Kommentarer: 4

mp3 vs FLAC (audacity)
Dette skjer med musikken din når du lagrer den som mp3: Forskyvning fra starten og pause i overgangen mellom sangene. Det er lett å se og lett å høre!

Ryktene skal ha det til at det i praksis er vanskelig å høre kvalitetsforringelsen som oppstår når man lagrer lyd i mp3-formatet. De som mener dette har tydeligvis ikke tatt i betraktning mp3-formatets akilleshæl. Hvis du tester dette selv, tror jeg du vil være enig med meg i at man skal være 100% døv for å ikke høre forskjellen. Jeg forutsetter da at mp3-dekoderen ikke prøver å maskere problemet ved å mikse overgangene sammen.

Slik testet jeg

  1. Kjøpte Goliath 12 på CD.
  2. Rippet hvert spor av CD-en til FLAC.
  3. Hentet ut slutten av spor 8 (Rank1 - It's up to you) og starten av spor 9 (Thrillseekers - Synaesthesia) med Audacity og lagret som 8.wav og 9.wav.
  4. lame -b 128 -f 8.wav -o 8.mp3
    lame -b 128 -f 9.wav -o 9.mp3
    oggenc -q -1 8.wav -o 8.ogg
    oggenc -q -1 9.wav -o 9.ogg
  5. Satte sammen 8.wav og 9.wav i Audacity. I et nytt stereospor under satte jeg sammen 8.mp3 og 9.mp3. Etikettesporet nederst markerer hvor mp3-filene skjøtes sammen. Skjermbildet ser du til høyre.
  6. Zoomet inn på overgangen mellom 8.wav og 9.wav og Tok skjermbilde. Gjorde det samme med 8.ogg og 9.ogg. Disse skjermbildene la jeg oppå hverandre med det øverste vinduet gjennomsiktig, og tok skjermbildet FLACerBestOgVorbisErLikeBra.png.

Forklaring til bildene

Bildene er skjermskudd fra lydredigeringsprogrammet Audacity, og viser skjøten mellom 2 sanger i forskjellige lydformater. All lyd i denne testen er i stereo, det vil si at hvert par av det som kanskje likner på separate lydspor, egentlig henger sammen som ett stereospor, der øverste spor styrer venstre høyttaler. At de henger sammen er synlig i det høye bildet til høyre (som er snudd på høykant for å få plass). Stereosporet som her var øverst er originalen, mens mp3 var under (nå: venstre).

FLAC er best, men Vorbis like bra

Som bildet nedenfor viser, passer lydbølgene fra slutten av den første sangen sammen med lydbølgene til den neste. Jeg kan forsikre at det også hørtes slik ut, dvs. overgangen var umerkelig. Det gjelder både wav- og ogg-filene. Nå lurer du kanskje på hvorfor jeg omtaler wav som flac, men wav-filene er bare ekstrakter av flac-filene som jeg rippa. Siden det er kvaliteten vi snakker om, er disse formatene ekvivalente (Wav er ukomprimert og FLAC er en tapsfri kodek). Siden alt stammer fra flac-filene, kan jeg konkludere med at overganger mellom sanger blir perfekt bevart når man ripper en CD til FLAC.

overgang mellom 2 sanger, FLAC vs Vorbis
Nærbilde av overgangen, fra øverst til nederst:
Venstre kanal, FLAC
Venstre kanal, Vorbis
Høyre kanal, FLAC
Høyre kanal, Vorbis

Den store over­raskelsen var Ogg Vorbis' over­legenhet over mp3. Mens mp3-filene ble kodet med 128 kb/s, noe som er ganske typisk, ble ogg-filene kodet med laveste kvalitetsnivå (-1), noe som resulterte i henholdsvis 54,4 og 56,2 kb/s. Ingen ville finne på å kode mp3 med så lav bitrate (bortsett fra youtube tenker jeg), og jeg skal innrømme at kvaliteten ble hørbart dårligere, men like fullt: Ikke en plancktid glipp i overgangen mellom sangene med Ogg Vorbis. Med tanke på at både Vorbis og mp3 bygger på diskret kosinustransformasjon, ble jeg litt overrasket, selv om alle vet at Ogg Vorbis er bedre enn mp3. Uansett er det viktigste for meg å unngå glipp i over­gangen mellom sangene. Det er, i motsetning til all annen snikk­snakk om lydkvalitet, så påfallende at man skvetter til selv om man ikke hører godt etter eller er i støyende omgivelser.

mp3-formatets akilleshæl

  1. Tidspunkt for start og slutt er udefinert
  2. Pre-ekko og post-ekko skaper grums henholdsvis på starten og slutten. Dette skyldes at komprimeringsalgoritmen, diskret kosinustransformasjon, ikke takler skarpe kontraster. Det er også derfor skarpe kontraster i et JPG-bilde blir grumsete.

Resultatet er at hele lydfila blir lenger enn den skulle vært, og at det er umulig å gjette presist hvor den egentlig skulle ha starta og slutta. Noen dekodere er bedre til å gjette enn andre; det som høres bra ut på musikkspilleprogrammet ditt, er kanskje noe annet for CD-brenneprogrammet for eksempel. Heldigvis for meg, gjettet Audacitys dekoder dårlig nok til at jeg fikk demonstrert fenomenet med disse bildene.

OPPDATERING 13. desember 2009 05:20
Fenomenet har (tydeligvis) ikke noe med bitrate å gjøre: Jeg ville undersøke hvordan mp3 med grisehøy bitrate takler overganger mellom sanger. Bitraten ble dessverre maksimalt 320 kb/s med lame (selv om jeg ba om 1000 kb/s). Den største filstørrelsen lame ville gi meg, fikk jeg med "lame --preset insane". Resultatet ble at med 320 kb/s mp3, fikk pre- og post-ekkoene stort sett så lave amplituder at de ikke syns på bildet (lavere enn et piksel), men like fordømt: Glippen i overgangen har akkurat like lang varighet.

Trykk på bildene nedenfor for å kikke nærmere på saken:

Audacity post-ekko (mp3) pre-ekko (mp3)

Derfor skal du rippe til FLAC

FLAC er tapsfritt, så ripper du en CD til FLAC, kan du trygt knekke den etterpå. FLAC tar vare på metadata, i motsetning til wav. Hvis tapsfri kompresjon ikke er tingen for deg, husk at alt (unntatt mp2) er bedre enn mp3. Som eksempel har jeg vist at Ogg Vorbis fungerer fortreffelig i overgangen mellom to sanger, mens mp3 er totalt udugelig på dette. Hvis du skulle finne på å brenne en lyd-CD, sørg for å bruke "disc at once"-modus (DAO), og ikke "track at once" (TAO). Det siste fører til 2 sekunders pause mellom hvert spor.


Raskeste måte å bytte to tall

Tema: Vitenskap; sjanger: Artikler
Skrevet av Andreas Nordal den 12. oktober 2009 kl 03:47:21; Kommentarer: 8

Å bytte om verdiene på to tall er en problemstilling som man ofte kommer over når man programmerer. Det er en viktig del av mange algoritmer, særlig sorteringsalgoritmer, og selvfølgelig en masse andre som man ikke skulle tro hadde noe med bytting av tall å gjøre. Dessuten er det en typisk operasjon som dataprogrammet kanskje gjør veldig mange ganger. Dette er så enkelt og viktig at det fins liten unnskyldning for å gjøre det feil.

Testprogram

Jeg har testet de 4 metodene i C/C++ som jeg syns var mest aktuelle (i håp om å finne den raskeste), samt 3 assembly-modifikasjoner av disse. Til sammen 7 tester nummerert fra 0 til 6. Følgende kildekode i C/C++ vil, som vi straks skal se, kunne kompileres til 4 forskjellige programmer.

/* testbenk.c */

#include <stdio.h>
#include <inttypes.h>
#ifdef __cplusplus
# include <algorithm> //std::swap
#endif


int main(){
#ifdef SWAP
        int a=666, b=13;
        register int32_t i=0;
        do{//Bytt om a og b 2^32 ganger
# if SWAP==0
                a ^= b;
                b ^= a;
                a ^= b;
# elif SWAP==1
#  ifndef __cplusplus
#  error "Dette er C++"
#  endif

                std::swap(a, b);
# elif SWAP==2
                int temp = a;
                a = b;
                b = temp;
# elif SWAP==3
                register int temp = a;
                a = b;
                b = temp;
# endif
        }while(++i);
        printf("%d %d\n", a, b);
#endif //defined SWAP
        return 0;
}

Gransking av assembly

Når vi kompilerer, la oss gå veien om assembly, og titte på hva den stakkars prosessoren plages med:

gcc -S -DSWAP=0 testbenk.c -o swap0.s
g++ -S -DSWAP=1 testbenk.c -o swap1.s
gcc -S -DSWAP=2 testbenk.c -o swap2.s
gcc -S -DSWAP=3 testbenk.c -o swap3.s

Her ser vi utdrag av hva kildekoden koker ned til av instruksjoner i hvert av de 4 tilfellene. Merk at assemblykode er forskjellig fra maskin til maskin; disse utdragene er fra den første testen (se resultater). Det som har med tallbytting å gjøre er markert med feit skrift.

Utdrag fra swap0.s:

        movl    $666, -8(%rbp)
        movl    $13, -4(%rbp)
        movl    $0, -20(%rbp)
.L2:
        movl    -4(%rbp), %eax
        xorl    %eax, -8(%rbp)
        movl    -8(%rbp), %eax
        xorl    %eax, -4(%rbp)
        movl    -4(%rbp), %eax
        xorl    %eax, -8(%rbp)

        addl    $1, -20(%rbp)
        cmpl    $0, -20(%rbp)
        jne     .L2

Utdrag fra swap1.s:

_ZSt4swapIiEvRT_S1_:
        pushq   %rbp
        movq    %rsp, %rbp
        movq    %rdi, -24(%rbp)
        movq    %rsi, -32(%rbp)
        movq    -24(%rbp), %rax
        movl    (%rax), %eax
        movl    %eax, -4(%rbp)
        movq    -32(%rbp), %rax
        movl    (%rax), %edx
        movq    -24(%rbp), %rax
        movl    %edx, (%rax)
        movq    -32(%rbp), %rdx
        movl    -4(%rbp), %eax
        movl    %eax, (%rdx)

        leave
        ret
        movl    $666, -4(%rbp)
        movl    $13, -8(%rbp)
        movl    $0, -20(%rbp)
.L4:
        leaq    -8(%rbp), %rsi
        leaq    -4(%rbp), %rdi

        call    _ZSt4swapIiEvRT_S1_
        addl    $1, -20(%rbp)
        cmpl    $0, -20(%rbp)
        setne   %al
        testb   %al, %al
        jne     .L4

Utdrag fra swap2.s:

        movl    $666, -12(%rbp)
        movl    $13, -8(%rbp)
        movl    $0, -20(%rbp)
.L2:
        movl    -12(%rbp), %eax
        movl    %eax, -4(%rbp)
        movl    -8(%rbp), %eax
        movl    %eax, -12(%rbp)
        movl    -4(%rbp), %eax
        movl    %eax, -8(%rbp)

        addl    $1, -20(%rbp)
        cmpl    $0, -20(%rbp)
        jne     .L2

Utdrag fra swap3.s:

        movl    $666, -8(%rbp)
        movl    $13, -4(%rbp)
        movl    $0, -20(%rbp)
.L2:
        movl    -8(%rbp), %edx
        movl    -4(%rbp), %eax
        movl    %eax, -8(%rbp)
        movl    %edx, -4(%rbp)

        addl    $1, -20(%rbp)
        cmpl    $0, -20(%rbp)
        jne     .L2

Optimalisering av assembly

swap4.s: Når det fornuftstridig viste seg under testene at såkalt registerswap var treigere enn vanlig temp-swap, tydet det på at koden i swap3.s ikke var optimal. Like fullt, det er mulig å se at swap3.s burde ha vært raskere enn swap2.s. Et bevis for dette er at ved å gjøre om "-8(%rbp)" til "-12(%rbp)" og "-4(%rbp)" til "-8(%rbp)" i swap3.s, og å variere bruken av registere litt i swap2.s, oppnår vi at den eneste forskjellen mellom disse 2 filene er 2 linjer ekstra i swap2.s, samtidig som virkemåten til begge programmene er bevart:

; swap2.s (modifisert)
movl    -12(%rbp), %edx
movl    %edx, -4(%rbp)
movl    -8(%rbp), %eax
movl    %eax, -12(%rbp)
movl    -4(%rbp), %edx
movl    %edx, -8(%rbp)
; swap3.s (modifisert) aka swap4.s
movl    -12(%rbp), %edx

movl    -8(%rbp), %eax
movl    %eax, -12(%rbp)

movl    %edx, -8(%rbp)

Den modifiserte swap3.s ble lagret som swap4.s.


5: En skulle kanskje tro at xchg (exchange) hørtes ut som en ideell instruksjon for vårt formål. Med utgangspunkt i swap4.s lagde jeg swap5.s:

; swap5.s
movl    -12(%rbp), %eax
xchgl   -8(%rbp), %eax
movl    %eax, -12(%rbp)

6: Ved hjelp av "inc" i stedet for "add" og å bruke registeret eax som tellevariabel, ble swap4.s forbedret til swap6.s:

        movl    $666, -12(%rbp)
        movl    $13, -8(%rbp)
        movl    $0, %eax
.L2:
        movl    -12(%rbp), %edx
        movl    -8(%rbp), %ebx
        movl    %ebx, -12(%rbp)
        movl    %edx, -8(%rbp)
        incl    %eax
        cmpl    $0, %eax
        jne     .L2

Testprosedyre

gcc -s swap0.s -o swap0
g++ -s swap1.s -o swap1
gcc -s swap2.s -o swap2
gcc -s swap3.s -o swap3
gcc -s swap4.s -o swap4
gcc -s swap5.s -o swap5
gcc -s swap6.s -o swap6
gcc -s swap7.s -o swap7

Hadde det ikke vært for at vi må bruke g++ i ett tilfelle:

for i in *.s; do gcc -s $i -o ${i%.?}; done

bash$ time ./swap1
666 13 #Uinteressant: Programmet virker.

real 0m27.270s #Uinteressant: Så lang tid det faktisk tok.
user 0m27.226s #Interessant: CPU-tid i user-mode.
sys 0m0.040s #Interessant: CPU-tid i protected-mode.

Kjøretiden ble målt som i eksempelet over. Som antydet, er det summen av CPU-tid som teller, altså user + sys. Når det står flere tall i samme celle i tabellen, er det fordi jeg har testet flere ganger. Tiden er i sekunder.

Resultater

Maskin0: XOR-swap1: std::swap2: temp-swap3: register­swap (gcc)4: register­swap (fiksa)5: xchg-swap6: Så bra jeg kan i assembly
ny laptop: Intel Core 2 Duo T8100 2,1GHz (2 kjerner), GCC 4.3.2, Linux 2.6.27.29 x86_6434,226s 34,066s27,266s 27,306s11,629s 11,805s12,485s 12,565s9,737s 9,781s72,569s 72,817s9,465s 9,397s
gammel stasjonær: AMD Athlon XP 2600+ 1,9GHz, GCC 4.3.0, Linux 2.6.27.25 i68639,19s47,20s14,16s16,17s12,41s49,47s8.93s
ny server: Intel Xeon 3,2 GHz (4 prosessorer), GCC 4.2.4, Linux 2.6.24-24 i68620,48s 20,35s40,77s 40,44s10,61s 10,72s8,18s 8,26s6,92s 7,13s
gammel server: Intel Pentium III Copper­mine 936MHz (2 prosessorer), GCC 4.1.1, Linux 2.6.18 i68687,34s 87,38s111,22s 109,07s36,85s 36,83s23,39s 23,79s18,41s 18,40s
gammel laptop: Intel Pentium 4 2,0GHz, GCC 4.3.2, Linux 2.6.27 i686116,471s 116,219s105,799s 100,218s40,050s 37,802s28,274s 27,65022,333s 21,786s
server: Intel Xeon 2,83 GHz, GCC 4.2.4, Linux 2.6.2428,12s23,88s10,16s8,74s7,71s

Diskusjon

0 (XOR-swap): Så elegant, men akk så treigt. XOR-swap fører til stans i prosessorens samlebånd, fordi hver instruksjon må vente på resultatet av den forrige. Grunnen til at moderne prosessorer kan ha klokkefrekvenser over et par hundre MHz er bruken av samlebånd.

1 (std::swap): Et funksjonskall tar ekstra tid, og indirekte adressering gir lang kode. Programmet swap1 ble forresten 8 byte større enn hver av de andre. Std::swap er rett og slett dømt til å være treig.

2-4 (temp-swap vs registerswap): Jeg kan ikke kåre noen vinner mellom disse 2. Selv om all fornuft sier at det skal være raskere å bruke et register til mellomlagring framfor å bruke RAM, stemte det ikke med mitt program i C. Jeg har vist at dette skyldes GCCs ugunstige plassering av variablene på stakken, og at registerswap faktisk ble raskere enn temp-swap ved å plassere variablene som i temp-swap. Ikke vet jeg om fenomenet skyldes cache-kollisjon eller hva det er. Det ser ut til å være reproduserbart på flere maskiner, men det hele kan jo være en tilfeldighet ved akkurat mitt program.

5 (xchg): Er dette en ubrukelig instruksjon?

6 (Så bra jeg kan i assembly): Dette vil funke i alle fall på i386.


Ring gratis med mobilen

Tema: Programvare; sjanger: Artikler
Skrevet av Stig Magnus Halvorsen den 3. oktober 2009 kl 03:31:48; Kommentarer: 0

Statistikk fra etter lansering av den første iPhone viser at det har vært en liten eksplosjon i bruken av internett på mobiltelefoner. Spesielt nå som de fleste nye telefoner kommer med innebygd WiFi og flere leverandører gir mye eller ubegrenset mobilnett for pengene. Hvorfor ikke da utnytte dette fullt ut? Gjør en det, vil det å ringe og å sende SMS bli nesten eller helt gratis!

Skype er et program som brukes til IP-telefoni og direktemeldinger. Ligner på MSN, men fokuset har ligger på funksjonen om å kunne ringe hverande gratis. Programmet har eksistert for datamaskin siden 2003, men er i senere år også blitt lansert for mobiltelefoner og bærbare håndholdte enheter. Dette i tillegg til å skaffe deg en skypekonto på skype.com er mer eller mindre alt du trenger!

Skype for mobil fungerer på iPhone, telefoner med Windows Mobile, Nokia N800/N810 og PSP. Skype er også til en rekke andre telefoner, sjekk om din telefon kan ha Skype Lite

Det er noen bakdeler med dette. En må installere et ekstra program på mobilen, en må enten ha et internettvennlig abonnement eller være innenfor WiFi-sone og de du vil ringe må også ha skype og være pålogget. Men om dette hadde blitt en standard med tiden, så vil det kun være til gode for almennheten. Det betyr bedre gratis kommunikasjon til folket og at abonnementstilbudene blir betraklige bedre pga konkurranse.


En genial hyllest til Michael Jackson

Tema: Internett; sjanger: Tullprat
Skrevet av Stig Magnus Halvorsen den 20. juli 2009 kl 11:39:50; Kommentarer: 0

Eternal Moonwalk

Eternal Moonwalk er en nettside som viser hvordan kreativitet kan brukes til å gi en skikkelig hyllest. Det er noe personlig som får en til å ønske å delta selv. Siden går ut på at hvem som helst kan laste opp en Moonwalk der man går fra høyre til venstre over skjermen. Siden som starter med Michael Jackson som går over skjermen, laster hele tiden inn nye filmklipp og dansen fortsetter inn i evigheten.

Michael Jackson er en av de største (om ikke den største) artistene som har hvert. Hans nylige død har som hendelsene i slutten av hans karriere, skapt et stort mediakaos! Siden hans død har han så og si vært i nyhetene hver eneste dag. Det blir heller ikke noe bedre av at det lanseres teorier om legedrap og om at han iscenesatte sin egen død (som noen fans håper på) for å slippe unna. Det har også dukket opp to mistenkelige videoer som har skapt stor oppsikt. Den ene videoen inneholder noe som kan være Michael Jacksons spøkelse i Neverland og den andre om at likposen setter seg opp i luftambulansen.

Personlig mener jeg ikke noen av videoen er spesielt aktuelle og jeg synes vi skal gi mannen fred. Han er død, og jeg synes virkelig at hans familie og venner burde slippe å få se stadige nye "skandalenyheter" og "nye funn" rundt hans død. Dermed ser jeg på denne siden som en motsetning til resten av medieoppstyret, faktisk noe positivt:

http://eternalmoonwalk.com/


nerdMail v1.0.2 - Mailklasse med vedlegg

Tema: Diverse; sjanger: Prosjekter
Skrevet av Stig Magnus Halvorsen den 18. juni 2009 kl 15:21:52; Kommentarer: 3

nerdMail v1.0.2 - mailclass with attachments

Ettersom jeg ved gjentatte ganger har måtte sende epost med mine PHP-skripts, så bestemte jeg meg til slutt for å skrive en klasse for å gjøre hverdagen enklere. Jeg skrev den i hovedsak for å selv spare tid, men jeg tenkte også på andre da jeg skrev klassen; at den er brukervennlig. Klassen er ikke kun for å sende vanlige tekstepost, du kan også sende eposten som html, eller sende både en tekst- og htmlversjon. Den har også støtte for alle typer vedlegg, flere mottakere (også cc og bcc), en kraftig emailverifisering, anti-injectionfunksjon og det er enkelt å legge til/modifisere headere i eposten.

Etter å ha blitt fornøyd med førsteutkastet, så spurte jeg om tilbakemelding på Norsk Webforum. Der fikk jeg god konstruktiv kritikk og etter flere endringer virket det som koden er stabil og brukerne fornøyde. Så da lanserte jeg den som versjon 1.0.

Trykk her for å se kildekoden
Trykk her for å laste ned kildekoden (zip)

Lisens

Alle har lov til å bruke den til hva dere vil uten å gi meg creds, men dere har ikke lov til å oppgi koden som egen. Det betyr at den er OpenSource, at dere kan bruke den i alle slags prosjekter og hva en nå dere måtte ønske å benytte den til. Unntaket er at dere ikke har lov til å si at dere skrev den originale klassen (blir litt drøyt å kalle det kjernen) og dere har ikke lov til å selge koden individuelt. Altså dere kan selge systemer som benytter klassen, men å selge selve klassen som et eget produkt er forbudt.

Ved å bruke koden godtar du at jeg ikke tar noe ansvar for og gir ingen garanti for andres eller egen bruk av koden. Jeg tar ikke på meg noe ansvar og skal ikke bli beskyldt om koden på et mystisk vis skal skape noen form for skade, feilmeldinger eller om den simpelthen ikke virker. Dette sier jeg ikke fordi koden er farlig, men kun for å fraskrive meg alt ansvar.

Dokumentasjon

Hent inn klassen og sett standard variabler require_once("mail_class.php");
$mail = new nerdMail;

$mail->subject = "The New PHP Mail"; // Meldingens emne, ikke obligatorisk
$mail->sender = "Nerdvar <no-reply@nerdvar.com>"; // Avsender, kan også kun være en epostadresse
$mail->returnPath = "bounce@nerdvar.com"; // Ikke obligatorisk, lurt for å ikke bli kategorisert som spam

Legg til mottakere $mail->addMail("to", "enfyr@domene.com"); // Vanlig mottaker
$mail->addMail("to", "enannenfyr@domene.com", true); // Enda en mottaker med epostverifisering, returnerer false om ugyldig
$mail->addMail("cc", "kopi@domene.com"); // Legg til en kopimottaker
$mail->addMail("bcc", "blindkopi@domene.com", true); // Verifiser epost og legg til en blindkopimottaker, returnerer false om ugyldig

Definer epost body (meldingen), html eller text må defineres (kan også være begge). $mail->text = "Hei\n\nAt du ser dette betyr at din epostklient ikke støtter eller har deaktivert html. Det var synd!\n\nJaja, du får ihvertfall eposten i klartekst og kanskje en link til online-versjon\n\nHils!";

$mail->html = "Din klient støtter HTML! Her kan du legge inn alle mulige HTML-koder...";

Legg ved noen vedlegg (attachments) og endre noen headere: $mail->attach("mockup.jpg", "image/jpeg");
$mail->attach("http://no.php.net/images/php.gif", "image/gif");
$mail->attach("myapp/readme.txt"); // Om du ikke definerer metatype (filtype) blir den satt til application/octet-stream
$mail->attach("myapp/readmetoo.txt", "text/plain", BIT7); // Om du ønsker BIT7-enkoding på attachment istede for base64, unormalt
/* Har valgt å bruke url istede for noe annet, da fungerer den på både å legge til nyopplasta filer og eksisterene filer */

//Modifiser noen headere
$mail->addHeader("Message-Id", "kodenr@mittdomene.com");
$mail->addHeader("List-Unsubscribe: <http://dittdomene.com/unsubscribe.php>");
/* Denne funskjonen vil også overskrive de standard headerne som blir satt av klassen om du definerer de med addHeader
Standard definerte headere er: mime-version, content-type, from, reply-to, cc, bcc, to (De fem siste blir satt av tidligere nevnte funskjoner) */

Send eposten: $mail->send(); // Returnerer true / false

Tilleggsfunksjoner $mail->parseMail($email);
/* Kan også brukes slik nerdMail::parseMail($email) (om du ikke har satt $mail) Den tar både "dittnavn@domene.no" og "Ditt Navn <dittnavn@domene.no>" Den sjekker eposten med regExp og sjekker om mailserveren "domene.no" eksisterer Fin til å bruke feks i et kontaksskjema hvor avsender skriver inn sin epostadresse */

$mail->antiInjection($field);
/* De som har erfaring med å sende mail fra PHP vet at det er en fare ved iputfelter som inkluderes i mailen. Om man ikke sjekker dette kan andre bruke ditt simple epostskjema til å spamme andre. Denne funskjonen sjekker om noen prøver dette. Burde settes på input subject, input eposter og evt. input headerinformasjon. Kan også brukes slik: nerdMail::antiInjection($email) (om du ikke har satt $mail)

Gir true hvis injectionforsøk blir oppdaget */