Kebmans blogg

Hvordan kryptere passord i PostgreSQL

Posted in Data, Programmering, Teknologi by kebman on 26/08/2015

PostgreSQL kan med et enkelt håndgrep gjøre passordkryptering for deg. Alt du trenger å gjøre er å legge til en extension i psql, sånn her:

CREATE EXTENSION pgcrypto;

Så er det bare å lage en database for å teste litt:

CREATE DATABASE test;

Og en tabell for å lagre noen data med passord:

CREATE TABLE testusers (
	id SERIAL PRIMARY KEY,
	email TEXT NOT NULL,
	password TEXT NOT NULL,
);

SERIAL er her ekvivalenten til AUTO_INCREMENT i MySQL. Strengt tatt kunne vi sikkert brukt email-feltet som PRIMARY KEY, sånn som her:

CREATE TABLE testusers (
	email TEXT PRIMARY KEY,
	password TEXT NOT NULL,
);

…men jeg synes det er kjekt å kunne kalle opp en god, gammeldags ID, spesielt om det senere kan bli snakk om å utføre SQL joins. Istedenfor kan man gjøre sånn her for å sikre at email-feltet forblir unikt:

ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);

Men så, endelig, kan vi teste med å sette inn noe ordentlig data! For å lage skikkelig gode passord, er det ikke nok med bare en god krypteringsalgoritme. Man trenger også salt. Dette for å hindre såkalte rainbow angrep. Her er årsaken til at vi la til den extensionen i sta, for med den kan vi legge til skikkelig godt salt, sånn her:

INSERT INTO testusers(email, password) VALUES (
	'test@test.com', crypt('det_hemmelige_passordet', gen_salt('md5'))
);

Som du ser så hashes passordet med det samme det legges inn i databasen med en funksjon som heter crypt(). Denne tar to argumenter: Passordet og funksjonen gen_salt() som lager salt. For å sjekke at passordet stemmer, kan man bruke denne spørringen:

SELECT email FROM testusers WHERE id=1 AND
password=crypt('det_hemmelige_passordet', password);

Så, når dette er gjort, burde det være en smal sak å få det til å fungere med et passende serverskriptingspråk. Best av alt, skulle noen uvedkomne få tilgang til databasen, vil de uansett ikke kunne finne ut hva passordene er – ikke lett, i alle fall.

Hvordan enkelt kryptere meldinger med offentlige nøkler

Posted in Data, Internett, Konspirasjonsteorier, Programvare, Sikkerhet, Teknologi by kebman on 19/02/2014

Aldri før har kryptering vært viktigere. Derfor har jeg laget en noen jukselapper for hvordan enkelt bruke ett av de ledende krypteringsprogrammene for å sende og motta krypterte meldinger sikkert over nett. På sikt vil det komme en mer inngående tutorial, men dette burde få deg i gang.

Kryptering med offentlige nøkler fungerer sånn her: Om du vil motta filer sikkert, så oppretter du et nøkkelpar med en offentlig og en privat nøkkel. Den offentlige nøkkelen sender du til dine kompiser eller kollegaer. De kan nå bruke den til å kryptere sine meldinger til deg. Det kule her er at disse meldigene nå kun kan dekrypteres med din private nøkkel. Derfor er det selvsagt viktig at du også holder din private nøkkel hemmelig.

For å sende en fil sikkert til en venn, må du bruke din venns offentlige nøkkel til å kryptere filen før du sender den. Nå kan bare din venn dekryptere filen, og ingen andre.

Datatilsynet krever ved lov at persondata og ting som er unntatt offentligheten krypteres etter visse standarder før det sendes over nett. Det fine er at denne krypteringsmåten langt overstiger Datatilsynets krav, dermed kan du trygt bruke det til å sende slike data med.

Her er instruksjonene:

Jukselapper for GNU Privacy Guard (Kleopatra)

  1. Last ned GNU Privacy Guard fra http://www.gnupg.org/ (det er gratis)
  2. Installer programmet
  3. Hvordan opprette et privat/offentlig nøkkelpar
    1. Åpne Kleopatra
    2. I menyen, velg File > New Certificate…
    3. Velg Create a personal OpenGPG key pair
    4. Skriv inn ditt fulle navn og din e-post
    5. Skriv inn et passord. NB! Dette er det viktigste steget!
    6. Gå videre og sjekk at alt er riktig.
    7. Eksporter nøkkelen. Huk av ASCII Armor slik at den blir enklere å sende over nettet.
    8. Gjør den offentlige nøkkelen din tilgjengelig for dine venner
  4. Hvordan importere en offentlig nøkkel…
    1. …om du må merke og kopiere en offentlig nøkkel:
      1. Merk og kopier en offentlig nøkkel fra nettet eller i en e-post
      2. Lagre den i en egen fil, og pass på at filendelsen er «.gpg». NB! Husk også hvor du lagrer den!
      3. Åpne Kleopatra
      4. I menyen, velg File > Import Certificates…
      5. Finn filen legg den inn
    2. …om du laster ned eller får tilsendt en fil med en offentlig nøkkel:
      1. Lagre filen på et sted du husker (nedlastinger, f.eks)
      2. Åpne Kleopatra
      3. I menyen, velg File > Import Certificates…
      4. Finn filen og legg den inn
  5. Hvordan kryptere en fil med en offentlig nøkkel
    1. Åpne Kleopatra
    2. I menyen, velg File > Sign/Encrypt Files…
    3. Velg filen du vil kryptere (eller signere)
    4. Klopatra spør hva du vil gjøre; huk av Text Output (ASCII Armor) og trykk Next
    5. Legg til (Add) den offentlige nøkkelen du ønsker å kryptere med
    6. Du vil få en advarsel om at bare mottakeren av filen vil kunne dekryptere den. Trykk Continue.
    7. Den krypterte filen lagres med samme navn som originalen, men med filendelsen «.asc»
    8. Bare eieren av den private nøkkelen kan nå dekryptere filen så kopier innholdet i filen og send over nettet, eller legg hele filen med som vedlegg i en e-post
  6. Hvordan dekryptere en fil med din private nøkkel
    1. Lagre mottatt fil, eller opprett en ny fil, kopier det krypterte innholdet inn i den, og lagre den med filendelsen «.gpg»
    2. Åpne Kleopatra
    3. I menyen, velg File > Decrypt/Verify Files…
    4. Finn den krypterte filen
    5. Velg hvor du vil at den dekrypterte filen skal havne
    6. Trykk på Decrypt/Verify
    7. Du kan nå åpne den dekrypterte filen der du la den

SMPTE-synkronisering på GitHub

Posted in Data, Filmredigering, Internett, Programmering, Programvare, Scripting, Teknologi, Video by kebman on 13/05/2013

Endelig har jeg oppdaget GitHub og lagt ut mitt første prosjekt der. Driver på med et videoprosjekt nå, men jeg fikk noen problemer med SMPTE-koder (tidskoder for video) som ikke stemte med hverandre da jeg logget. Først sjekket jeg ut noen programmer, men de dugde ikke, så da bare satte jeg i gang å lage min egen kode.

Sjekk det ut her: https://github.com/kebman/Simple-SMPTE-class-in-PHP

Hvordan traversere JSON med PHP

Posted in Programmering, Scripting, Teknologi, Webdesign by kebman on 10/04/2013

Nå og da trenger man å traversere JSON-data med PHP. Da kan det være greit å vite hvordan man gjør det. Her er et lite eksempel.

La oss si du har fått en fil, folk.json. Her er den:

{
 "folk": [
 { "fornavn": "Ola", "etternavn": "Nordmann" },
 { "fornavn": "Kari", "etternavn": "Nordmann" },
 { "fornavn": "Lars", "etternavn": "Medelsvensson" },
 ]
}

Det du har her er for alle praktiske formål en flerdimensjonell array. Ofte kan slike by på litt hodebry, men egentlig er det ganske enkelt når man holder på med JSON. Alt du trenger å gjøre er å gjøre om innholdet i filen til et PHP-objekt, slik:

<?php
$json_object = json_decode(file_get_contents('folk.json'));
?>

Her er det som skjer i koden: For det første opprettes en variabel til å hodle objektet på plass, $json_object. Deretter må folk.json leses inn til PHP med funksjonen file_get_contents(). Og til slutt må innholdet som er lest inn gjøres om til et objekt med funksjonen json_decode() – om koden den blir servert er korrekt JSON, vel å merke.

Så OK, vi har nå et JSON objekt lagret i PHP. Hva nå? Vel, siden det er et objekt, er det veldig lett å få tak i delene det består av med foreach. Vanligvis brukes foreach til å traversere flerdimensjonelle arrays, men faktisk kan det også brukes til å traversere objekter. Bare se her:

<ul><?php
foreach ($json_object->folk as $key=>$value) {
 echo "<li>" . $value->fornavn ." ". $value->etternavn . "</li>";
}?></ul>

De vi ber foreach-løkken om å gjøre her, er å skippe direkte til objektet folk, og å dele innholdet i objektet opp i nøkler og verdier. Når det er gjort, har vi – siden det er et objekt – direkte tilgang til underobjektene. Hvert av navneparene er her underobjekter av objektet folk, og vi kan nå hver del av dem ganske enkelt med å peke til riktig underobjekt.

Resultatet er en liste, slik:

  • Ola Nordmann
  • Kari Nordmann
  • Lars Medelsvensson

Vil du nå enda dypere, må du nøste flere foreach-løkker inn i hverandre, men dette er altså den grunnleggende idéen.

Gi nye filetternavn til flere filer samtidig

Posted in Programmering, Scripting, Teknologi by kebman on 23/12/2012

Sannsynligvis har du vært borti at du trenger å gi nytt filetternavn til flere filer av samme type. Det er noe skikkelig herk, så derfor skrev jeg et lite Perl-script for å gjøre jobben raskere.
Her er det:

#!/usr/bin/perl
# ChSuff v1.0 by Kebman
# Change the suffixes of all files of a given type in a dir
use strict;
use warnings;
use File::Copy;

if ($#ARGV +1 == "2") {
	if ($ARGV[0] eq $ARGV[1]) {
		print "Sorry arguments cannot be equal.\n";
	} else {

		# -- Main Code -- #
		my $old_suffix = "." . "$ARGV[0]";
		my $new_suffix = "." . "$ARGV[1]";

		my @old_filenames = grep (-f, <*$old_suffix>); # store only files with old suffix

		if (scalar(@old_filenames) == 0) { # If there are 0 occurences of given file
			print "Sorry, there are no files with the suffix $old_suffix\n";
		} else {
			my $old_length = length($old_suffix); # Check length of input
			my $old_name;
			my $new_name;
			my $without_suffix;

			foreach $old_name (@old_filenames) { # trip trough the array of filenames
				# remove old suffix with subrstr()
				$without_suffix = substr($old_name, 0, -$old_length);
				# rename the suffix of each file
				$new_name = "$without_suffix" . "$new_suffix";
				move($old_name, $new_name);
			}
		}
		# ---- #
	}
} else {
	print "\033[2J"; # These two incantation clears the screen
	print "\033[0;0H"; # ... and resets the cursor
	print "chsuff v1.0 by Kebman\nRename the suffixes of all files of a certain type in a dir\n";
	print "---\nUSAGE: chsuff [old suffix] [new suffix]\n---\n";
	print "Example: chsuff txt html\n";
	print "Will change the old suffixes all .txt-files to .html in the directory you're in\n";
}

Så langt fungerer det på Mac OS X og dermed sikkert også på Linux-maskiner, men det er usikkert om det vil fungere på en Windows PC grunnet bruken av glob. Føl deg i så fall fri til å skrive om på kildekoden bare du husker å gi meg litt cred. 🙂

For ordens skyld, glem nå det lille programmet som på de fleste systemer kalles «rename». 😉

Norske tegn med HTML

Posted in Design, Hobby, Internett, Scripting, Teknologi, Typografi, Webdesign by kebman on 02/07/2012

Mange har problemer med å få norske tegn og bokstaver første gangen de koder HTML. Med HTML5 er løsningen enklere enn noen gang.

Basiskoden for å få gyldig HTML5 ser slik ut:

<!DOCTYPE html>
<html>
<head>
	<title>Min tittel</title>
</head>
<body>
	<p>Min første hjemmeside.</p>
</body>
</html>

Kodetabell

Men fortsatt ser de norske bokstavene skikkelig rare ut når du åpner HTML-filen i en nettleser. Det kommer av et eldgammelt problem med datamaskinene; at de var laget kun for det engelske alfabetet. For å korrigere problemet, laget produsentene ekstra kodetabeller som også inneholdt europeiske tegn – deriblant vår egen æ, ø og å – men nettleserne tar bare høyde for disse om du fysisk angir riktig kodetabell med HTML-kode.

Du angir riktig kodetabell ved å legge inn følgende HTML-kode i hodet av HTML-dokumentet ditt:
<meta charset="utf-8" />

Hele HTML-koden vil da se slik ut:

<!DOCTYPE html>
<html>
<head>
	<title>Min tittel</title>
	<meta charset="utf-8" />
</head>
<body>
	<p>Min første hjemmeside.</p>
</body>
</html>

Her er kodetabellen UTF-8 fra Unicode brukt. Dette er den kodetabellen som har har de vanligste europeiske tegnene i seg, og derfor også den kodetabellen som er mest utbredt.

Feilsøking

Om norske tegn fortsatt vises feil er det stort sett en av to grunner til det:

  1. Det er ikke angitt noen kodetabell i HTML-koden, eller feil tabell er angitt.
  2. Filen er lagret med en annen kodetabell enn den du har satt i HTML-koden i tekstredigeringsprogrammet du har brukt.

Selv om du angir riktig kodetabell i HTML-koden, hjelper det ikke om du har lagret selve datafilen med feil kodetabell i redigeringsprogrammet. Noen redigeringsprogram har en fast kodetabell de bruker, men i de fleste programmene kan du angi hvilken kodetabell selve datafilen din skal lagres med. Pass på at det da at du har valgt UTF-8, eller Unicode (UTF-8) som tegnformat før du lagrer filen. Hvor du endrer det, er forskjellig fra hvilket program du bruker, men som regel finnes det i innstillingene.

I redigeringsprogrammet jeg bruker, TextWrangler, er det angitt på barren under tekstredigeringsvinduet, og det er bare å klikke på teksten, så kommer det en liste med alle kodetabellene jeg måtte ønske.

Tegnkoding i xHTML

Med xHTML er det litt mer plunder å få norske tegn.

For det første, trenges XML-versjon sammen med kodetabell helt øverst i dokumentet, før !DOCTYPE, slik:
<?xml version="1.0" encoding="UTF-8"?>

Og endelig må det velges riktig kodetabell for HTML-koden i hodet, slik:
<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

Hvordan gjøre ordsøk i MySQL

Posted in Programmering, Programvare, Scripting, Teknologi by kebman on 25/02/2012

Så du trenger å søke etter ord i databasen din? Her er noen kjappe eksempler på hvordan du kan gjøre det.

Fulltext-søking er kanskje den greieste måten å søke etter ord i SQL-databaser. Det er veldig kjapt og fungerer bra så lenge ordet er lenger enn tre bokstaver. Grunnen til dette er at det krever ekstra kapasitet å indeksere kortere ord, spesielt om de opptrer ofte. Slik bruker du fulltext-søk:

SELECT * FROM tabell
WHERE MATCH(felt)
AGAINST('søkeord' IN BOOLEAN MODE);

Men hva om du ønsker å søke etter ord med færre enn fire bokstaver? Vel, her er noen alternativer.

Ved å bruke LIKE kan du søke etter felter som inneholder ditt søkeord, enten det er del av større ord eller ikke. Du får som regel ganske mange treff med denne, og det er ikke like kjapt som Fulltext-søk.

SELECT * FROM tabell
WHERE felt
LIKE '%søkeord%';

Eksperimenter med å fjerne prosenttegn foran eller bak. Prosenttegnet fungerer som et «wildcard» eller en joker, og betyr «hvilken som helst tegn».

Men kanskje du bare vil ha hele ord som står alene? Prøv i så fall regular expressions.

SELECT * FROM tabell
WHERE felt
REGEXP '[[:<:]]søkeord[[:>:]]';

Merk at denne vil også gi treff på ord som har bindestrek foran eller bak. En annen hake er at regular expressions kan være litt tregt fordi det krever en del ekstra prosesseringskraft. Det er ikke alltid det er så viktig, men skal du lage noe som er stort og blir hyppig brukt av svært mange brukere, risikerer du fort at forsinkelsene blir merkbare.

Vil du kun ha helt enslige ord, må du søke etter ord som har mellomrom foran og bak. Prøv i så fall denne:

SELECT * FROM tabell
WHERE Locate('søkeord ', felt) > 0
AND Locate(' søkeord', felt) > 0;

Legende:

  • tabell: Databasetabellen du ønsker å søke i
  • felt: Feltet i tabellen som du ønsker å søke i
  • søkeord: Søkeordet du ønsker å bruke

PHP kobler ikke til MySQL via localhost

Posted in Internett, Programmering, Scripting, Teknologi, Webdesign by kebman on 24/02/2012

Fikk plutselig feil da jeg prøvde å koble til MySQL-databasen via PHP i dag. Vips så ble det en aldri så liten detektivhistorie.

Koden jeg bruker for å koble til MySQL med PHP er veldig enkel, godt testet, og har fungert mange ganger før. Ikke det mest avanserte og ikke objektorientert, men den egner seg godt for testing. Her er den:

$host = 'localhost';
$user = 'root';
$pass = 'password';
$link = mysql_connect($host, $user, $pass);
if (!$link) {
   die('MySQL error '. mysql_errno() . ': ' . mysql_error());
}

Kort forklart, hvis $link klarer å koble opp til databasen går alt som det skal, mens om variablen inneholder feil, blir koblingen brutt og det blir istedenfor sendt tilbake noen feilmeldinger. Og her er den jeg fikk:

MySQL error 2002: No such file or directory

Så jeg prøvde å bytte ute passord, bruker, og byttet fra localhost og til 127.0.0.1, og heureka! Da funket det. Men likevel var jeg jo like langt i forhold til localhost. Jeg blunket litt med de våte øynene mine, og et slags mørke la seg over hjernen min. Feilmeldingen sa meg ikke en dritt, og jeg skjønte ikke hvorfor det bare funket med den lokale IP-adressen. Her var det bare å sette i gang og google.

En av tingene jeg testet var om MySQL i det hele tatt reagerte, men det visste jeg jo at den gjorde, fordi jeg kunne koble til via terminalen og via Sequel Pro. Likevel prøvde jeg å pinge den over telnet i terminale, slik:

telnet localhost 3306

Her tittet MySQL frem og sa hei som normalt, så dette var i orden, og fortsatt var jeg like lite klok.

Heldigvis kom jeg ganske snart over denne fine siden: C.5.2.2. Can’t connect to [local] MySQL server

Der sto det utrolig mye unødvendig og irrelevant, men jeg bet meg i alle fall merke i de tingene som faktisk stemte – blant annet en serie tester man kan gjøre i terminalen, disse her:

  1. mysqladmin version
  2. mysqladmin variables
  3. mysqladmin -h `hostname` version variables
  4. mysqladmin -h `hostname` --port=3306 version
  5. mysqladmin -h host_ip version
  6. mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

Da jeg kom til nummer tre på listen, skjønte jeg at noe var galt. Det gikk helt fint om jeg byttet ut `hostname` med localhost, men da jeg brukte den riktige koden, `hostname`, fikk jeg en feilmelding:

mysqladmin: connect to server at 'kebman.local' failed
error: 'Host '10.0.0.7' is not allowed to connect to this MySQL server'

Dette skjønte jeg ikke noe særlig mer utav heller, men det ante meg at det kunne være at en eller annen trodde at kebman.local var localhost, men det er jo slett ikke tilfelle. Dessuten er jo ikke 10.0.0.7 adressen til localhost heller (127.0.0.1 er adressen til localhost).

Lenger nede i dokumentet sto det noe om å finne navnet på socket-filen som brukes for å koble via localhost:

netstat -ln | grep mysql

Svaret jeg fikk, var dette:

/tmp/mysql.sock

«Hm», tenkte jeg nå. «Kan dette ha noe med denne kebman.local-greia å gjøre, tro? Feilen må jo ligge i php.ini et sted (filen man bruker til å konfigrere PHP med), men hvor?» Hadde også lest noe om det på erværdige stackoverflow.com. Jeg søkte igjennom alt som hadde med MySQL i php.ini, og endelig fant jeg det. I php.ini var det en annen adresse til mysql.sock. Jeg endret det til adressen jeg fikk opp med netstat-koden, og voila, endelig funket det å koble til MySQL via localhost med PHP igjen.

For å redigere php.ini på Mac må du først ha rot-passordet til maskinen din. Deretter er det letteste å bruke TextWrangler (gratis) til å åpne opp /etc/php.ini for redigering. Du kan også åpne filen med pico eller et annet UNIX-program for tekstredigering gjennom sudo-kommandoen (sudo gir ordre som rot-bruker).

CSS syntaks

Posted in Teknologi, Webdesign by kebman on 09/11/2011

Et lite oppslag på hvordan CSS skal skrives.

Overordnet syntaks

Engelsk: selectors {declarations}
Norsk: velgere {deklarasjoner}

CSS består av velgere og deklarasjoner. Velgeren består av de  HTML-elementene man ønsker å velge. Deklarasjonene består av de designforandringene man ønsker å gjøre på valgte element, avgrenset av krøllparenteser.

HTML-elementer man kan velge er alle taggene, samt visse attributter og pseudoklasser.

Underordnede HTML-elementer arver design laget for overordnede HTML-elementer, så gjør du tekstfargen til body rød, vil også tekstfargen til p og h1 bli rød.

Generell syntaks

Engelsk: selector {property: value;}
Norsk: velger {egenskap: verdi;}

Som du kan se består hver deklarasjon av en egenskap og en påfølgende verdi. Hver deklarasjon skal avsluttes med semikolon.
Det finnes mange egenskaper du kan forandre design til. Farge (color) er bare én av dem. Sjekk ut W3Schools for mer om det.

Eksempel

h1, h2 {color: red; font-family: verdana, sans-serif;}

Her er elementene h1 og h2 valgt. Deretter er egenskapene «farge» (color) og «font familie» valgt og gitt en nye verdier. Som du ser kan man velge flere HTML-elementer, og velge flere egenskaper man gir nye designverdier.

Krøllparentes

På Mac trykker du shift+alt+( for å få krøllparentesen {. På PC trykker du AltGr+(.

NB! CSS skrives på American English, og derfor brukes f.eks egenskapen color (am. eng.) og ikke colour (brit. eng.).

Gåseøyne på nett

Posted in Teknologi, Typografi, Webdesign by kebman on 14/10/2011

Det er en del ting som skiller norsk typografi fra andre lands typografi, og spesielt engelsk og amerikansk typografi. Kanskje den viktigste tingen her er vår bruk av gåseøyne fremfor hermetegn. Likevel bruker folk flest hermetegn, men det er faktisk feil.

Grunnen til at hermetegnet («») kom i bruk, har nok med import av en og annen skrivemaskin å gjøre, og sist men ikke minst ignorant kulturimperialisme fra Microsoft. Skriveprogrammet deres, Word, skriver nemlig hermetegn som standard istedenfor gåseøyne («»).

Så, hvordan fikser vi dette på nett?

NB! Etterfølgende avsnitt er foreldet. Nå holder det å skrive inn riktig tegn, gitt at du har satt riktig kodetabell. Mer om det i tilleggsavsnitt nederst. Bare les mer om du er spesielt interessert i hvordan bruke det ikke anbefalte Q-elementet innen HTML.

Det finnes faktisk et eget HTML-element for setningssitater, det såkalt Q-elementet, men bruker du det uten CSS-design, vil du fortsatt få amerikanske hermetegn som standard.

Sånn funker det i HTML: Q-melk er bedre enn Tine melk.

Og slik blir resultatet, uten CSS-design: Q-melk er bedre enn Tine melk.

Du må kalle opp Q-elementet i CSS og bruke noen smarte pseudoklasser for at det skal bli korrekt, slik:

q:before {content: "«";}
q:after {content: "»";}

Så blir det endelig seende slik ut i nettleseren: «Q-melk er bedre enn Tine melk.»

Problemet er bare at dette ikke fungerer i eldre versjoner av Microsoft Explorer (MSIE eller bare IE), noe vi Mac-brukere selvfølgelig driter i. Heldigvis gjelder dette bare versjoner frem til IE7, og disse versjonene brukes bare av noen veldig få nå for tiden. Anyway, skulle du være spesielt interessert, så sjekk disse mulige løsningene:

Er du bare interessert i å få gåseøyne kjapt på Mac-en din, trykk shift+alt+V eller B.

Etter å ha gjort litt mer research, kan jeg ikke anbefale å bruke Q-elementet i det hele tatt. Grunnen er ganske enkelt at gåseøyne er helt spesifikke tegn, så å løse slik tegnsetting med en tagg er like dårlig som å bruke en escape-kode, slik som &laquo; og &raquo;. Istedenfor bruk riktig tegnkoding (eng: encoding) i din HTML. I HTML5 kan du for eksempel sette inn denne taggen i hodet <meta charset="utf-8" /> så kan du bruke både gåsøyne og æ, ø og å i teksten din helt uten problemer. I XHTML er det bittelitt mer jobb, men det lar seg også fint gjøre der.