Forsida

Temaer

Sjangere

Hvordan en feilmelding IKKE skal se ut

Tema: Internett; sjanger: Meninger
Skrevet av Andreas Nordal den 2. mars 2014 kl 21:41:37; Kommentarer: 0

I (forhåpentligvis siste innlegg av) serien «Slutt å minn meg på at jeg ikke har Flash», skal vi se nærmere på brukerveiledningen til en kommersiell videoløsning (Brightcove), som jeg vil framheve som provoserende. Denne har vært et vanlig syn hos diverse nettaviser det siste tiåret, vel å merke hvis man ikke har hatt flash-avspiller i nettleseren. Den er fortsatt å finne, for eksempel på dagbladet.no, time.com, slate.com (husk å skru av flash for å se).

  1. Skrem brukeren: Beklag deg over brukerens system. Gi inntrykk av at brukeren har et problem. Presenter det som viktig.
  2. Skyld på brukeren: Anta at brukeren har flash-avspiller (følgelig en utdatert sådan) når flash tydeligvis ikke funker i det hele tatt. Dra en kort slutning om at brukeren ikke har noe valg.
  3. Ikke antyd noe om valgfrihet: Hvor er NEI-knappen? Link til faktiske systemkrav? Neida, Adobes flash-avspiller er den eneste i verden, og "flash-avspiller" er et egennavn.
Your System Status, WE'RE SORRY!, You need to update your Flash Player, Get Adobe Flash Player, IMPORTANT: After installing the required upgrade please reload this browser window to view the video player.
(Hentet fra http://admin.brightcove.com/viewer/upgrade_flash_player2.gif)
«Your System Status», du liksom… Din usaklige bløffmaker!

Hva er galt

Konklusjon & framtidsvisjon

Brightcoves feilmelding (egentlig: fallback content) ser for meg ut som bedrageri. Får de penger av Adobe eller? Nettsteder med respekt for seg selv burde finne seg for gode til å utsette brukerne sine for sånt.

Heldigvis ser det ut til at trenden går riktig vei —  i skrivende stund ser jeg at Dagbladet har kastet seg på HTML5 for nye videoer, VG har gjordt det for årevis siden, mens Aftenposten ennå ikke har skjønt det. I 2014 begynner man kanskje å innse urimeligheten i å kreve at hele verdens befolkning skal ha et kundeforhold med Adobe.

Når verden så har gått over til HTML5 for video på nett, gjenstår det bare 1 legitim grunn til å bruke proprietære avspillere (Flash/Silverlight) for å oppnå det samme: DRM. For å kaste en brannfakkel inn i DRM-debatten: I likhet med Tim Berners-Lee ønsker jeg faktisk DRM velkommen i HTML: Det er nettopp det Flash og Silverlight i praksis allerede er, og de brukes ofte helt unødig – ikke bare er de DRM, de er inngrodde platformer også. Dermed er det et poeng (for å hindre utilsiktet bruk av det som effektivt sett er DRM) å la disse platformene få dø. Det er kun DRM som står på kravspekken til Netflix og andre i OTT-bransjen (over the top), og hvis DRM-biten kan implementeres uten alt det andre, skulle det være større grunn til optimisme med tanke på interoperabilitet. Husk, DRM må implementeres i lukket kildekode, noe som i utgangspunktet er en katastrofe for interoperabilitet.

Dette innlegget ble for ordensskyld skrevet på en Raspberry Pi, som ikke støttes av alskens proprietær programvare.


Lyst til å lære deg spillprogrammering?

Tema: Programmering; sjanger: Meninger
Skrevet av Stig Magnus Halvorsen den 2. oktober 2013 kl 17:16:47; Kommentarer: 0

Å kunne programmere spill er er nok for mange en barndomsdrøm, som kanskje de færreste velger/tør å følge ettersom de blir eldre. Det innebærer å ha kunnskapen og evnen til å lage et interaktivt digitalt medium som er gøy å spille og som folk er villige til å bruke tiden sin på. Det er en helt fantastisk følelse når du først kommer dit. Mange skremmes muligens vekk om kravet til det tekniske behovet og å ha god logisk sans i ens natur, men dette er jo nettopp noe av det som gjør det så gøy! Er du uenig, så er du dedsverre uegnet til spillprogrammering. Spill er programvare, men spill er programvare med strenge krav til ytelse, noe som gjør de til noen av de mest ressurskrevende programmene som finnes! Da er både god logikk og gode programmeringsferdigheter nyttig for å være istand til å levere hauger av kul funksjonalitet med god nok ytelse for sanntid.

Hvor logisk sans kommer fra er ikke jeg i stand til å svare på, men dette må du nesten sørge for å skaffe deg selv, enten det er medfødt eller krever timevis med hjernetrim. Hvor gode programmeringsferdiheter kommer fra er en helt annen sak. Som med matematikk så er erfaring viktigst, programmer masse og du vil bli god. Men for å programmere må du jo lære det et sted, og da har du jo et hav av muligheter. Du kan finne noen gode bøker på Amazon, eller finne en haug av tutorials på nett om du Googler etter de riktige søkeordene. Men du må først bestemme deg for en teknologi (programmeringsspråk/verktøy), og når du først kan en så er det ingen sak å lære seg en ny! Jeg foreslår at du ikke starter med det vanskeligste og da er følgende verktøy gode som en innføring til spillprogrammering:

Velg helst en av dem, ta kun begge om du har masse tid til overs. En god start er å lage et par småspill før du går videre nedover teknologistigen. Om du finner det for vanskelig kan du vurdere å begynne med noe enklere først, som overhodet ikke er spillrelatert; webteknologier. HTML, CSS og JavaScript (HTML5). HTML5 ser ut til å bli en viktig platform innenfor casual- og indie-spill fremover, og det er absolutt verdt å bruke tid på å lære seg. Det skader heller ikke å deretter lære seg et serversidespråk som PHP, ASP, Ruby, osv. Dette ligner mer på skikkelig programmering og kan gi en mykere overgang til de tyngre teknologiene.

Deretter kan det være lurt å lære seg et faktisk programmeringsspråk. Noen mener at Java eller C# er lurt å begynne med da de er mer "nybegynnervennlige". Personlig oppfatter jeg dem som alt for avanserte språk å starte med, da de for enkelhetsskyld skjuler masse innebakt funksjonalitet. Dette kan for en nybegynner ofte oppfattes som magisk funksjonalitet som "bare er der", og det er ikke en god instilling å ha når man skal være en programmerer med god peiling på hva som skjer under "panseret" på maskinen. Dermed anbefaler jeg å gå rett på C++. Om det blir for vanskelig kan du lære deg Java eller C# som en fallback-løsning, og så lære C++ når du blir klar for det. C er også et godt alternativ, men det er ikke lenger regnet som veldig brukbart til spill (mangler objektorientering). Om du virkelig vil bli hardcore kan du vurdere å helt til slutt lære deg x86 Assembly, men innen den tid bør du først inneha en hel del erfaringer innen spillprogrammering.

Å lese alt dette er nok relativt overveldende, og det er vel få som klarer å motivere seg til å gjøre og lære seg alt dette på egenhånd. Det krever masse tid! Om du har anledning og virkelig vil bli dyktig, så anbefaler jeg høyere utdanning. Ta en bachelor eller master innefor IT, eller evt. en (sivil-)ingeniør-grad. Selv har jeg en bachelorgrad innenfor IT med spesialisering i spillprogrammering fra NITH og jeg jobber nå med en mastergrad innen programmering og nettverk på UiO.

Men, teknologien er ikke alt! Du kan forstå en teknologi både inn og ut, og samtidig ikke være istand til å lage noen som helst spillfunksjonalitet på egenhånd. Slik ender du typisk opp om du kun bruker kode fra tutorials eller bøker der det ikke forklares i detalj hva de kombinere kodesnuttene faktisk gjør. For å kunne lage ønsket funksjonalitet i et spill, så må du forstå noen grunnleggende prinsipper og du må kunne tenke riktig! Dette helt uavhengig av hvilken teknologi du bruker. Dette kan være lurt å sette seg inn i før man setter seg inn i en teknologi. Jeg avslutter dermed dette innlegget med en anbefalning om at du bør lese en annen artikkel jeg har skrevet om nettopp dette. Den er ganske lang, så jeg har delt den i tre deler og den er på engelsk. Du finner den her:

God lesing!

Postkontor i butikk takk!

Tema: Diverse; sjanger: Meninger
Skrevet av Andreas Nordal den 15. januar 2013 kl 17:54:46; Kommentarer: 1

Postkontorer har bare åpent når folk er på jobb. Det er mye bedre å ha kombinert postkontor og butikk. Aller helst kombinert med bensinstasjon!

Nå er det andre dag på rad at jeg ikke greide å komme hjem før 17.00. Samme sak skjedde rett før juleferien; etter flere mislykkede forsøk var det på hengende håret at jeg fikk henta pakkene før jeg reiste bort. Fra der jeg bodde før, er jeg vant med postkontor i butikk, og det er deilig kan jeg fortelle, hvis man handler en del på nett.

Til alle som jobber i sørvisnæringer: Bare drit i å jobbe på hverdager! Såkalte «fridager» (ikke alle har fri uansett) er jo åpenbart mer verd, for begge parter. Såpass at jeg tror du kan tjene minst like mye på å bare jobbe i helgene og ta fri resten av uka.

—  Det derre der, det er tyyypisk norsk kundebevissthet, det…

 


RJ45: En studie i dårlig design

Tema: Diverse; sjanger: Meninger
Skrevet av Andreas Nordal den 18. mars 2012 kl 15:16:55; Kommentarer: 0


(klikk på bildet for større bilde)
Øverst: frisk RJ45
Midten: offer for forsiktig bruk, ingen spenst
Nederst: ødelagt RJ45
RJ45 (eller 8P8C, som ingen vet at den egentlig heter) er altså pluggen som sitter i hver ende av ethernet-kabler. Hvilken idiot var det som fant opp RJ45?

  1. Hvorfor er den forma som en krok?
  2. Hvorfor har den et svakt punkt?
  3. Hvorfor er det svake punktet lagd av plast?

Jeg bruker bærbar PC, og plugger kontaktene mye til og fra. Det gjør at jeg fort merker hvilke kontakter som ikke tåler slitasje fra normal bruk. Etter min erfaring er RJ45-plugger fantastisk sårbare. Det neste som er dømt til å ryke er lydutgangen på selve PC-en, men også USB-porter kan bli så utslitt at det er 0 elektrisk kontakt igjen.

Hvordan ødelegge en ethernet-kabel

  1. Dra den gjennom kabelsalaten, opp av skolesekken, eller noe så uskyldig som å «trekke kabel» fra A til B, og du kan banne på at den skjøre mothaka hekter seg borti noe.
  2. På grunn av materialtretthet som oppstår under selv ekstremt forsiktig bevisst bruk, blir mothaka løsere og løsere, og bare knekke en gang. På bildet til høyre, er den midterste (blå) pluggen offer for ekstremt forsiktig bevisst bruk i snart et år, og synger på siste verset. Man kan ane en sprekk i det svake punktet.

En konsekvens av termofysikkens andre lov er at kabler blir til kabelsalat. Kan det ha vært det de tenkte på, de som fant opp RJ45? For størrelsen på krok-åpninga passer perfekt til diameteren til en typisk ethernet-kabel…

Den knekte enden kan du, hvis du er heldig, klare å bruke; du kan for eksempel holde den på plass i en veggkontakt ved å mose et bordbein inntil.

Hvordan RJ45 burde være

  1. Snu mothaka motsatt vei, så den slipper å være krok.
  2. La en lengre del av mothaka få bøye seg, ikke bare i ett (svakt) punkt.
  3. Lag mothaka av metall, takk. Det er den verd.

Ikke sånn. Rød ring markerer svakt punkt.

Men sånn. Svart U-formet metallspenne, delvis stukket inn i et spor i plasten.



Du trenger hvertfall ikke krok-funksjonaliteten til RJ45.

fsck er farlig

Tema: Programvare; sjanger: Meninger
Skrevet av Andreas Nordal den 7. oktober 2011 kl 18:13:45; Kommentarer: 0

Hvis korrupsjon i filsystemet skyldes maskinvarefeil, så vil fsck gjøre vondt verre. Det er min erfaring etter å ha mista 1,4 TB.

Fsck er programmet som skal «fikse» eventuelle feil i filsystemer, typisk i det man skrur en datamaskin på. Det skumle er at fsck er et idiotisk program som har 0 forutsetning for å gjøre de riktige valgene. Tenk deg et stavekontrollprogram som bare sletter alle setninger som ikke er grammatisk korrekte. Før du slipper fsck løs på livsverket ditt, bør du være sikker på at det er feilfritt...

Det skulle vise seg at jeg hadde en feil i SATA-koblinga mellom harddisk og hovedkort. Det hjalp ikke et fnugg å ha RAID1, for feilen skjedde selvfølgelig samtidig for koblingene til begge harddsikene, eller mer sannsynlig, at det fins en felles komponent på hovedkortet som kunne svikte. Det er statisk redundans i praksis, det.

Smartctl avslører feilen. Utklipp (min utheving):

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       0
  3 Spin_Up_Time            0x0027   147   145   021    Pre-fail  Always       -       9633
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       32
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   073   073   000    Old_age   Always       -       19734
 10 Spin_Retry_Count        0x0032   100   253   000    Old_age   Always       -       0
 11 Calibration_Retry_Count 0x0032   100   253   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       22
192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       4
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       28
194 Temperature_Celsius     0x0022   121   110   000    Old_age   Always       -       31
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   200   200   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       38935
200 Multi_Zone_Error_Rate   0x0008   200   200   000    Old_age   Offline      -       0

Ifølge smartctl er kommunikasjonen med denne harddsiken upålitelig, mens selve harddisken fungerer utmerket. I praksis merkes feilen ved at filene kan være litt forskjellige hver gang, spesielt store filer. Det betyr at dataene kan reddes hvis man kjenner sjekksummen; det er bare å lese dem om igjen til det stemmer. Men tror du fsck leser om igjen når noe ikke stemmer? Etter første runde med fsck fikk jeg ikke engang montert filsystemet.

Hva er verst:

  1. helt tapte data
  2. korrupte data
  3. data som du ikke vet om er korrupt eller ikke

Jeg har stort sett endt opp med det siste. En lærdom er at sjekksummen kan være like verdifull som dataene selv!

Man tror at «maskinvarefeil rammer ikke meg». Enda mindre hadde jeg fantasi til å mistenke denne feilkilden tilfeldigvis midt i en oppgradering av filsystemet fra ext3 til ext4, når det er minst et par andre ting som kan gå galt. Så jeg rapporterte det som en programvarefeil. Der står hendelsesforløpet utførlig beskrevet.

Hele katastrofen hadde vært en bagatell hvis jeg hadde forstått problemet med en gang. Det dummeste jeg kunne gjøre var å følge siste punkt på prosedyren, nemlig fsck. Som med de fleste katastrofer: Det er når man har uhell i uhellet at det går galt. I'm fsck'd.


Ikke partisjoner harddisken

Tema: Programvare; sjanger: Artikler
Skrevet av Andreas Nordal den 5. april 2011 kl 23:10:23; Kommentarer: 0

Hvis man likevel bare skal ha én partisjon på en harddisk, hvorfor ikke gjøre det enkelt?

Bortsett fra operativsystem-partisjonen, som faktisk være en partisjon (for at BIOS og oppstartlaster skal funke), så er det ikke nødvendig å partisjonere eventuelle andre harddisker i datamaskinen.

Eksempel

I Linux kan man:

mkfs.ext4 /dev/sdd

I stedet for:

mkfs.ext4 /dev/sdd1

Da skriver man i /etc/fstab:

/dev/sdd        /mnt/d  ext4    defaults 1 2

Framfor:

/dev/sdd1       /mnt/d  ext4    defaults 1 2

Dette funker faktisk: Denne nettsiden er lagra på to uformaterte harddisker i raid1.

Forklaring

Mens vanlig prosedyre er å formatere enkelt-partisjoner av harddisken, er det selvsagt også mulig å formatere selve harddisken. Det resulterende filsystemet vil da spenne absolutt hele harddisken, uten plass til partisjonstabell og alt det der.

Fordeler

Ulempe

Konklusjon

Skal man først ha en ekstra harddisk, typisk for å få et stort filsystem til ren datalagring, så er man ikke interessert i å partisjonere harddisken i biter. Det er heller ikke vits i å lage den ene partisjonen for BIOS eller oppstartslasterens skyld. Dessuten skaper det bare trøbbel. Teknisk sett er det veldig smart å ikke partisjonere harddisken.


Fisk i fjæra

Tema: Diverse; sjanger: Prosjekter
Skrevet av Andreas Nordal den 26. mars 2011 kl 23:53:20; Kommentarer: 0

Jeg kom i skade for å lage en film. Den heter «Fisk i fjæra». Den er i samme sjanger som Nattkjole med urin og Hatten är din. Jeg håper ingen blir provosert av den.

Det jeg har gjort er å legge på norsk tekst på en somalsk musikkvideo. Ja, også litt grafikk da.

Bare så det er sagt, så er det faktisk mulig å redigere film på Linux også. Det var ikke fryktelig vanskelig. Jeg brukte disse programmene:

Krita var egentlig uegnet til mitt formål, som var å gjøre bakgrunnen av grafikkbildene gjennomsiktig. Det hadde vært 100 ganger lettere hvis «inverter utvalg»-funksjonen hadde funka. Jeg kunne sikkert brukt Gimp.


PHP duger ikke til interaktiv skripting

Tema: Programmering; sjanger: Meninger
Skrevet av Andreas Nordal den 24. februar 2011 kl 13:31:25; Kommentarer: 0

Hvorfor monger ssh-klienten når den startes fra PHP? Ikke gjør dette hjemme:

#!/usr/bin/php
<?php
system('ssh meg@domene');
?>

Det som tilsynelatende skjer da er at ssh bufrer unna all interaktivitet. Du får ikke se hva du skriver i kommandolinja før du har trykka enter, men da er det jo for seint. Og skal du redigere tekst over ssh? Da er du kjørt...

Slik skal det gjøres:

#!/usr/bin/python
import subprocess

subprocess.call(['ssh', 'meg@domene'])

goto kan være fornuftig

Tema: Programmering; sjanger: Artikler
Skrevet av Andreas Nordal den 11. april 2010 kl 21:22:18; Kommentarer: 0

For de som ikke kjenner goto: Goto forteller datamaskinen at den skal fortsette et annet sted i programmet. Slik vi kjenner det i programmeringsspråket C, er goto en videreføring av jump-instruksjonen, fra den tiden man programmerte i assembly (eller direkte maskinkode for den saks skyld), og er dermed blant de eldste programmeringskonseptene. En vanlig oppfatning er at goto er utdatert. Det var faktisk en hovedhensikt med såkalt strukturert programmering, et konsept i høynivå-programmeringsspråk, å eliminere behovet for å bruke goto.

Kritikere hevder at bruk av goto fører til «spaghettikode», det vil si kildekode som er vanskelig å følge fra start til slutt, for å ikke nevne baklengs, man ser jo ikke hvor man "kommer fra". Dette avhenger selvsagt av hva man gjør det til, så hvis man klarer å bruke goto på en ryddig og konsekvent måte, så er det kanskje tilgivelig.

Tilgivelig eller ikke, noen ganger er det veldig praktisk å bruke goto. Ja, jeg vil gå så langt som å hevde at det kan være fornuftig! Dette har jeg prøvd å vise med kodeeksempelet nedenfor, men først en hverdagslig analogi: Forestill deg at du følger en oppskrift som består av mange steg. Hvert steg kan gå galt, og hvis noe går galt, må du avblåse hele prosjektet og rydde opp. Mengden opprydding vil avhenge av hvor langt du kom før du avbrøt. Selvsagt står ikke oppryddingsprosedyrene i oppskriften for hvert steg som kan gå galt; de er irrelevante for selve algoritmen. Det er i algoritmen utfordringa ligger, mens feilhåndtering på en måte sier seg selv og har ingen ting å si for om resultatet blir riktig i det normale tilfellet. Så hvordan kan vi separere algoritme og feilhåndtering? En måte er å håndtere suksesstilfellet der og da som et slags spesialtilfelle. Suksess på suksess vil da i kildekode få en sinnssyk indentering. Det er ikke uten grunn at programmeringsspråk som C++ og Java har "exceptions", en alternativ kontrollflyt for å avbryte, som er til for å la feilhåndteringa skje et annet sted. Det mer primitive programmeringsspråket C har ikke exceptions, men så har vi jo det gamle velkjente skitne trikset.

De to hypotetiske programsnuttene nedenfor viser feilhåndtering henholdsvis med if/else og if+goto. De gjør nøyaktig det samme, nemlig å initialisere «struct karamell»:

//Denne delen hører med til begge eksemplene.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct karamell{
	char * navn;
	void * buf;
//	    :
//	    ·
	FILE * fp;
};
//Eksempel 1: if/else
struct karamell * k_init(char * filnavn){
	struct karamell * k;

	k = malloc(sizeof(*k));
	if(k == NULL){
		perror("malloc");
	}else{ //OK
		k->fp = fopen(filnavn, "rb");
		if(k->fp == NULL){
			perror(filnavn);
		}else{ //OK
			k->navn = strdup(filnavn);
			if(k->navn == NULL){
				perror("strdup");
			}else{ //OK
//				.
//				.
//				.
//				.........
//					.
//					.
//					.
//					.........
//						.
						if(posix_memalign(&(k->buf), 1024, 1024) != 0){
							fputs("posix_memalign failed.", stderr);
						}else{ //OK
							/* Nothing bad happened, yet
							 * we are in deep indentation!
							 * We are treating the normal
							 * case as the special case.
							 * Here is where we do our work:
							 *	:
							 *	·
							 */
							return k;
						}
						free(k->navn); //cleanup
//					.
//					.
//				.
//				.
			}
			fclose(k->fp); //cleanup
		}
		free(k); //cleanup
	}
	return NULL;
}
//Eksempel 2: if+goto
struct karamell * k_init(char * filnavn){
	struct karamell * k;

	k = malloc(sizeof(*k));
	if(k == NULL){
		perror("malloc");
		goto die;
	} //OK
	k->fp = fopen(filnavn, "rb");
	if(k->fp == NULL){
		perror(filnavn);
		goto fopenfail;
	} //OK
	k->navn = strdup(filnavn);
	if(k->navn == NULL){
		perror("strdup");
		goto noname;
	} //OK
//	    :
//	    ·
	if(posix_memalign(&(k->buf), 1024, 1024) != 0){
		fputs("posix_memalign failed.", stderr);
		goto nobuf;
	} //OK
	/* Nothing bad happened -> no extra indentation.
	 * The normal case is no special case!
	 * Here we do our work:
	 *	:
	 *	·
	 */
	return k;

	//exceptional cleanup
nobuf:
//	    :
//	    ·
	free(k->navn);
noname:
	fclose(k->fp);
fopenfail:
	free(k);
die:
	return NULL;
}

Hva er problemet med det første kodeeksempelet?

Den observante leseren vil legge merke til at disse kodesnuttene er så like at de vil kompilere ned til de samme instruksjonene. Jeg sjekka den gcc-genererte assembly-koden, og fant to ubetydelige forskjeller (en NOP og en ubrukt etikett i goto-versjonen).

Til slutt, hvis du tror jeg er den eneste som bruker goto på denne måten, og at ingen ville finne på å bruke goto like flittig som meg, ta et googlesøk på "linux/fs/ext2/dir.h", så skal du få deg en bakoversveis!


mp3 skader musikken din

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

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 høres like bra ut

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.

Nyttige orientalske middagsretter