Visar inlägg med etikett datanörderi. Visa alla inlägg
Visar inlägg med etikett datanörderi. Visa alla inlägg

20 maj 2014

Om dataintrång

Häromdagen gav Amelia Andersdotter ett intressant perspektiv på olika sorters ”dataintrång” i Kvällsposten, bland annat hur Researchgruppen knäckte ett antal s.k. näthatares identiteter förra året. Det kom mothugg från Researchgruppen (trots att den inte var hennes måltavla) och hån från några som ansåg sig veta bättre. Nå, att Piratpartiets ”gräsrötter består uteslutande av datanördar medan toppen verkar helt tappade när det kommer till it-kunskap” håller jag inte med om. Andersdotter förstår säkert det tekniska perspektivet på vad Researchgruppen gjorde, men hon använder också ett annat perspektiv.

Jag kastas tillbaka till en hetsig diskussion från en tid när webben var yngre, en diskussion som handlade om ifall inlänkning av bilder på en webbsida rimligen kunde betraktas som upphovsrättsintrång. Jag deltog till en början på datanördsidan som upprört hävdade att det kunde det verkligen inte! Om jag länkar in en bild är allt jag publicerar på min webbsida nämligen html-kod, som till exempel kan se ut så här:

<img src="http://www.moma.org/collection_images/resized/928/w500h420/CRI_73928.jpg" alt="Willie" />

Det där betyder att det finns en bild (image, ”img”) att hämta, med givet ID, från en källa (source, ”src”) i form av en annan webbsajt (www.moma.org i det här fallet), där bilden ligger helt öppet. När så någon går in på min webbsida, läser hens webbläsare koden som en instruktion att hämta bilden från den andra webbsajten, och visa den tillsammans med mitt innehåll. Och det kan väl inte vara mitt ansvar! Den ligger ju på den andra sajten helt öppet och passerar över huvud taget aldrig min webbserver! Allt jag har publicerat är ju att den ligger där den ligger, och den informationen är också helt öppet tillgänglig, så fort bilden visas någonstans över huvud taget.

Juristen lyssnar förstrött på datanördens försvarstal. Hen förstår det kanske inte helt och hållet, men är heller inte särskilt intresserad. När hen surfar in på min webbsajt så ser hen ju att den finns där, bilden som inte är min, bland det övriga innehållet på min sida. Så den är inte lagrad på min ”server”? Pfft, vem bryr sig?

Okunskap? Visst, det kan man säga, men också en fråga om perspektiv. Juristen lägger vikt vid ett begrepp som saknar teknisk betydelse, men som är begripligt för en femåring, nämligen uppsåt. (Eller med femåringens språkbruk, om det var med mening.) Har jag haft för avsikt att använda bilden jag inte har rätt till som en del av min webbsida? I så fall kan det bedömas som att jag begått upphovsrättsintrång. Det behöver inte vara avgörande vilken väg bildrepresentationen tagit över nätet. Egentligen ett helt rimligt sätt att resonera. (Ta nu bara inte detta som att jag säger att det är rimligt att bildlänkning betraktas som ett brott! Det är en annan diskussion.)

Tillbaka till Researchgruppen. De identifierade anonyma nätkommentatorer genom att gå via hashvärden som användes för att knyta e-postadresser till profilbilder i kommentarfält. Hash kommer via engelskan från franskans hacher, hacka, och man tar bildligt talat fram ett hashvärde för en klump data (i detta fall en e-postadress) genom att hacka sönder den i småbitar, röra om, och sätta samman huller om buller på ett förutbestämt väldefinierat sätt. På så sätt får man fram ett sorts fingeravtryck av datamängden. Har man en viss e-postadress är det lätt att få fram dess hashvärde, precis som det är lätt att få fram en människas fingeravtryck. Men har man bara hashvärdet är det väldigt svårt att få fram e-postadressen, på samma sätt som det är svårt att ta reda på från vilken människa ett givet fingeravtryck kommer. Researchgruppen samlade in mängder av e-postadresser från internet och tog fram deras hashvärden, som de sedan matchade mot hashvärden som var relativt öppet tillgängliga från bloggkommenteringstjänsten Disqus. På så sätt kunde de gå från kommentarerna, som hade e-post-hashvärden knutna till sig, till e-postadresser.

Dataintrång? Självklart inte! utbrister datanörden. Man tog ju bara öppet tillgängliga data och matchade ihop dem, utan att tränga in någonstans. Men så behöver det inte se ut med juristens glasögon. Hashvärdena var de facto ett slags lösenord för kommunikation mellan Disqus och profilbildstjänsten Gravatar. Dessa lösenord knäckte Researchgruppen, och intervenerade alltså mellan de två tjänsterna för att uppsåtligen skaffa sig tillgång till information som systemet sammantaget var byggt för att undanhålla. Det är inte självklart att detta juridiskt skulle kunna betraktas som dataintrång, men motsatsen är inte heller självklar. Föreställ er till exempel att punkten man angripit inte tillhört en webbdiskussionstjänst, utan en myndighet, en bank, eller ett multinationellt företag. Vad hade hänt då? (Ta nu bara inte detta som att jag säger att Researchgruppen gjorde fel! Det är en annan diskussion.)

Där någonstans börjar Andersdotters resonemang, som inte är alldeles stendumt om ni frågar mig. Snarare ett inlägg ur en mycket intressant och ögonöppnande vinkel.


06 januari 2010

Några problem med rekommendationssystem

I den nära framtidens överflöd av musik, där praktiskt taget all musik som någonsin spelats in är tillgänglig att lyssna på var som helst och när som helst, får automatiska rekommendationssystem en avgörande roll i att hjälpa oss välja. Rasmus Fleischer ger i Det postdigitala manifestets §15–§18 en tankeväckande beskrivning av möjligheterna med rekommendationssystem, och några av dess möjliga sociala konsekvenser. Men han diskuterar inte frågan om hur systemen egentligen ska fungera – det förutsätts antagligen några medlemmar av vad som kan uppfattas som ett modernt prästerskap, datateknikerna, ta hand om.

Ganska naturligt kanske, men eftersom jag är en av medlemmarna i det där prästerskapet som förutsätts kunna leverera underverk till att ge rekommendationer, på ett sätt som förutsätts vara alltför komplext för att den genomsnittlige användaren ens ska börja försöka begripa sig på det, så börjar jag förstås omedelbart fundera över hur man egentligen ska få fram de där rekommendationerna.

Själva de algoritmiska problemen med att behandla tillräckligt mycket data på tillräckligt kort tid bekymrar mig inte nämnvärt. Det är sekundära och angenäma problem som vi löser på ett eller annat sätt med smarta beräkningar, kraftfull hårdvara eller väl valda approximationer. Nej, det svåra här är framför allt att det är så ytterligt svårt att avgöra vilket problem det egentligen är som ska lösas.

Den vetenskapliga litteraturen flödar redan över av matematiska och statistiska metoder för rekommendationer. Utan tvekan lever många av metoderna upp till förväntningarna vad gäller komplex obegriplighet. Men när man tittar på hur själva problemet egentligen beskrivs, problemet som metoden löser, matematiskt formulerat som något sorts optimeringsproblem, då blir i alla fall jag väldigt snabbt tveksam. Är det verkligen det där som är rekommendationsproblemet, och i så fall varför?

I själva verket finns ingen bra matematisk formulering av vad ett rekommendationssystem ska göra. Eller med andra ord, inget objektivt mått på om en viss rekommendation är bättre än en annan. När man visar upp en rekommendation kan nog de flesta människor säga om de tycker att den är »rätt« eller inte, och om man pressar dem kan de eventuellt ad hoc komma fram till någon sorts abstraktion av varför. Men tar man den abstraktionen och applicerar blint på tillgänglig data så vågar jag påstå att man kommer att få resultat som innehåller en hel del »fel« som många kommer att irritera sig på.

Till syvende och sist är det en smaksak vad som är rätt och fel. Detta är en mardrömssituation för en algoritmiker som vant sig vid att allt kan reduceras till binära beslutsproblem. Ett sätt att objektivifiera problemet är att säga att det gäller att förutsäga rekommendationer som man redan har empiriska data för (som i Netflix filmrekommendationstävling) men det är en forumlering som kräver ganska begränsade förutsättningar. Det enda uppenbart objektivt korrekta sättet att närma sig problemet skulle vara att försöka simulera de relevanta delarna av användarens hjärna.

Det är det ena som gör rekommenderandet svårt. Det andra är brist på data.

Visst, över tid kan man samla på sig hur mycket data som helst, men man stöter ändå alltid på situationer där de är sparsamma. Brist på data ger osäkerhet, men i många statistiska metoder ger det en illusion av säkerhet. Det kan man observera om man tittar i till exempel en nätbokhandel på en hyfsat ovanlig bok man redan köpt. Bland rekommendationerna radas då ibland upp en misstänkt stor del av ens egen bokhylla. I mitt fall kan det exempelvis vara tecknade serier av Chris Ware som påstås ha samband med böcker om databasteori. Ett illusoriskt samband, eller? Om det nu är så att den enda som köpt databasteoriboken också köpt den tecknade serien, finns det då inte ett starkt statistiskt belägg för att det faktiskt finns ett samband? Här är det ont om bra objektiva argument. Motsvarande koppling mellan två databasböcker är betydligt svårare att kritisera.

Lyckligtvis kommer man dock en bra bit på väg med ganska enkla metoder. Men det är inte självklart att framtidens system blir så fruktansvärt mycket mer sofistikerade än dagens, annat än genom att de kommer att kunna använda sig av mer data (och mycket data slår ofta sofistikerade algoritmer).

En löjligt enkel metod i musikfallet är förstås att rekommendera annan musik av samma artist. Men till och med ett så enkelt kriterium kan slå brutalt fel. För vad är egentligen samma artist?

Söker man på Spotify efter Aphex Twin, vilket är den mest kända pseudonymen som den (i brist på bättre term) elektroniske musikern Richard D. James har använt sig av, då får man bland annat träff på plattan Reverse the Trend som James förefaller ha gett ut 2003 under den alternativa pseudonymen AFX. Men det har han inte alls. AFX är i detta fall ett kaliforniskt gitarrband med kristna texter, ljusår från Aphex Twins genialiskt respektlösa synthexperiment.

Uppenbarligen använder Spotify data som anger att Aphex Twin och AFX är synonymer, och det är svårt att säga att det är fel. Det är också svårt att säga vad man skulle kunna göra åt det – annat än att gå in och handeditera när man upptäcker problem. Visst skulle man kunna ha till exempel kollat skivbolagsetiketter, men det skulle precis lika gärna ha kunnat bli fel åt andra hållet, eftersom James inte bara använt sig av ett otal artistalias utan också gett ut skivor på en mängd olika bolag.

Än intressantare blir det när man söker upp Reverse The Trend på Amazon och kollar rekommendationerna. Det är idel Aphex Twin-relaterade titlar bland »customers also bought«, vilket lätt ger det felaktiga intrycket att det handlar om samma artist. Men – och detta är det riktigt intressanta – vad Amazon faktiskt säger är förmodligen helt sant!

Kundrecensionerna är underhållande; det finns 14 stycken och samtliga handlar om en enda sak: detta är ju inte Aphex Twin! Alla har lägsta betyg utom en som har högsta, och den sammanfattar fenomenet väl:

this is by far the funniest thing on amazon.com. i cant believe poeple accually bought this thinking it was aphex twin.

"Customers who bought this item also bought

* Hangable Auto Bulb ~ AFX
* Analogue Bubblebath ~ AFX Featuring Schizophrenia
* Analogue Bubblebath, Vol. 3 ~ AFX
* Surfing on Sine Waves ~ Polygon Window"

hahaha you silly people.

Amazon använder sig av användardrivna kopplingar, vilket borde vara idiotsäkert. Kunder som köpt det här har också köpt det där. Det är en koppling som är obestridligt sann i all sin objektivitet. Men det kan, som i detta fall, bli till en självförstärkande felaktig rekommendation. Varje kund som blir lurad av den synbara kopplingen, och köper skivan i tron att det är Aphex Twin, bidrar till att förstärka den.


16 november 2009

Slarvas öppen e-förvaltning bort av duperade politiker?

Uppdatering: Ministermötet jag skriver om nedan är förbi, och tack och lov verkar det som att våra farhågor inte besannades just den här gången. Men det mesta av de bekymmersamma förhållanden jag beskriver i inlägget kvarstår.

Mats Odell har kommit till Malmö för ministermöte om e-förvaltning, och i söndagens Sydsvenskan (hittar tyvärr inte artikeln på webben) talar han entusiastiskt om rivna murar och revolution med teknikens hjälp. Samtidigt kan vi läsa i ett pressmeddelande från FFII Sverige om ett läckt dokument som får en att undra i vilken omfattning det ministrarna beslutar om i själva verket kommer att innebära resta murar.

Jag är rädd att inte många utom de närmast sörjande förstod avslöjandet som ligger bakom pressmeddelandet, och det är en grupp som blir alltmer sorgsen och resignerad över det håll utvecklingen går.

Informationstekniken styr allt fler delar av våra liv, men inte många lagstiftare och jurister förstår dess grundläggande begrepp. Då menar jag inte att de skulle behöva hänga med i elektroniksnack om kretsar och ettor och nollor (att säga att digital information handlar om ettor och nollor är egentligen lika upplysande som att säga att text handlar om färgerna svart och vitt); nej, det som behövs är förståelse för högnivåbegreppen som man faktiskt beslutar om, som exempelvis vad som är maskin, vad som är program och vad som är format eller protokoll.

Jag misstänker att den förkrossande majoriteten av de som dagligen använder datorprogram har en ytterst vag aning om vad ett program egentligen är. Jag har ibland stort besvär att förklara vad egentligen gör i mitt programmeraryrke för släktingar och vänner, även för intelligenta personer som är ytterst bildade inom de flesta områden. Den här förståelseluckan är ett växande problem, eftersom den utnyttjas av mäktiga ekonomiska intressenter till att lobba igenom lagstiftning och praxis som förefaller helt bisarr för praktiskt taget alla tekniskt insatta.

Jag vet förstås inte exakt vad som har hänt i European Interoperability Framework när man släppt igenom formuleringar som öppnar för att slutna standarder i offentlig verksamhet, men vad jag vet är att Microsoft och andra med intresse att förhindra fri konkurrens inom programvarumrådet oavbrutet gör allt de kan för att påverka i den riktningen.

Jag misstänker också att begreppsförvirring om program och format bidrar. »Öppna standarder« nämns ofta i samma andetag som »öppen källkod«, och även om båda dessa är bra saker, och till stor del förordas av samma grupper, kan det vara förödande att de blandas samman, vilket de uppenbarligen gör om man ska tro vad Patrik »paf« Fältström skrivit om det (och det ska man).

Att programmen man använder görs läsbara för alla, och att alla tillåts att sprida förbättrade versioner av dem, har goda effekter för samhället (som de som använder termen »fri programvara« framhåller) och för den tekniska utvecklingen (vilket betonas av dem som föredrar termen »open source«), men att sträva efter detta är inte ur alla ekonomiska synvinklar helt självklart.

Att däremot förespråka slutna standarder, för hur program ska passas ihop, kan däremot bara syfta till att skapa monopolställning för enskilda företag, vars effekter blir självklart skadliga både för ekonomisk (för alla utom den som får monopolställning) och teknisk utveckling.

För att slippa gå in på tekniska förklaringar, låt oss ta en analogi från ett annat område: Kontorsmateriel såsom papper, pärmar, plastfickor etc. följer ett begränsat antal standarder. En standard specificerar vissa specifika pappersstorlekar (A4, A5, …), motsvarande kuvertstorlekar, avståndet mellan hålen man gör för att sätta in papper i pärmar osv. Vem som helst kan tillverka papper och prylar som följer standarden, och man kan köpa saker från vilken tillverkare som helst, förvissad om att de kommer att passa ihop med produkter från andra tillverkare. Detta är en öppen standard.

Tänk nu istället att pappersstorlekarna och det andra vore specificerade av ett visst företag, och hölls hemliga för alla andra. Vidare hade endast detta företag makten att ändra måtten när som helst.

Det är kanske inte helt lätt att föreställa sig för pappersmått, eftersom det är lätt att idka »reverse engineering« genom att mäta upp de färdiga pappren. I princip kan man också göra motsvarande med programvara, men det är inte lika lätt eftersom formaten som gör att programvara passar ihop är mycket mer komplexa, och programmens beteende kan ligga dold inuti maskinkod som är svår att tolka (förutsatt att programmen inte har »öppen källkod«), och det är dessutom inte ens alltid självklart tillåtet enligt lag att försöka tolka vad program gör. Programvaruföretagen kan åberopa immaterialrättslig lagstiftning för att förhindra att andra skapar program som fungerar tillsammans med deras. Det förekommer till och med att företag anses äga delar av en standard (Microsofts OOXML-format myglades trots alla protester igenom som en internationell standard.)

Att man binder sig till en sluten standard i offentlig förvaltning innebär i praktiken ett beslut om att ett visst företag ska få rätt att skattebelägga den offentliga verksamheten. Ett företag som lyckats få igenom detta har garanterad inkomst för lång tid framöver utan att behöva utveckla eller utvecklas alls. Det är förståeligt att företag ägnar sig åt att försöka skaffa sig sådan ställning, och när de väl fått den använder vilka metoder som helst för att behålla den.

Men att politiker och offentliga tjänstemän godtar slutna standarder som ram för sin verksamhet måste innebära att de är antingen mutade eller missledda.


28 april 2008

Kroppen, själen, rummet

Det verkar ha blivit lite inne med Descartes-bashing bland tänkare med vetenskapliga ambitioner. Det handlar för tillfället inte om att angripa den gamla fånigheten »cogito, ergo sum«, utan hans indelning av den mänskliga existensen i två väsensskilda substanser: en själslig och en kroppslig. Jag vet inte hur rättvist det är att beskylla Descartes för det missgreppet, han var definitivt inte först med det. Redan de gamla grekerna hade ju en liknande uppdelning.

Kropp Det är en modell som förstås för länge sedan har avfärdats som fullständigt oanvändbar av medicinare och biologer, men nu verkar det som att även mer humanistiskt orienterade delar av vetenskapssamfundet har lyckats slita sig från den. Den materialistiska insikten att tankar faktiskt är rent kroppsliga fenomen har dessutom börjat tränga in i mer populära sammanhang.

Henrik Fexeus raljerar till exempel en del över Descartes dumhet i vardagspsykologipraktikan Konsten att läsa tankar. Vill man se på människor vad de tänker går det ju nämligen inte att betrakta tanken som frikopplad från kroppen som producerar den.

Kroppen som vårt fängelse

Omvärderingen av själ-kropp-uppdelningen har förstås inte slagit igenom överallt. Göran Roseberg är en som inte tagit till sig den, att döma av hans kolumn i Dagens Nyheter förra veckan. Där skriver han, lätt oroad, om den minskade tendensen att av ideologiska skäl förkasta biologiska förklaringar till människors beteende. Han sammanfattar med att »[b]iologin tycks kort sagt åter ha blivit vårt öde och kroppen åter vårt fängelse«.

Att betrakta kroppen som vårt fängelse förutsätter förstås att vi är någonting annat än vår kropp. Vad skulle det i så fall vara? Det går Rosenberg inte in på, men det är säkert den gamla själsliga substansen som spökar. Sista stycket innehåller en antydan till intressant reflektion: »Dessutom är det så med föreställningen om människans andliga frihet, att om den inte fanns skulle vi vara tvungna att uppfinna den.«

Här närmar vi oss hemligheten bakom kroppsig-andlig-uppdelningen. Den mänskliga kulturen har uppfunnit den – gång på gång – och det är inte alldeles svårt att förstå varför. Bilden av oss själva som någonting som ligger utanför kroppen, en av fysiken oberoende observatör, hänger samman med vår förmåga att tänka oss andra situationer än den vi just nu kroppsligt befinner oss i. Att »objektivt« kunna reflektera över vår omgivning, abstrahera, generalisera och förutsäga. Det är förstås en fantastiskt kraftfull förmåga, förmodligen den som – enligt vårt eget sätt att se det – gör oss människor till högre stående varelser än alla andra vi kan uppfatta.

Föreställningen av oss själva som betraktare stannar nämligen inte exakt vid den egna kroppen. Och varför skulle den göra det? Huden är trots allt en ganska godtycklig gräns för vad som är vi själva. Alltså ser vi också vår egen kropp som en del av den omgivning vi betraktar – inklusive själva de synapser i hjärnan där just den tanken kommer till.

Vill man dra en gräns för vad som är vi själva är det alltså lätt att lockas göra det bortom det fysiska, att uppfinna en andlig nivå som ligger utanför biologin. Det är en modell som fungerar utmärkt i många sammanhang, men glömmer man att själen trots allt är en abstraktion, ett program som är implementerat i den fysiska kroppen, då får man problem när man vill analysera sina egna tankar och rötterna till dem.

Mentala byggstenar

Det är logiskt att de här insikterna slår igenom parallellt med att föreställningen om ett tydligt gap mellan den mentala förmågan hos människan och andra djur får stryka på foten allt mer. Indikationerna är många på att åtminstone våra närmaste släktingar bland primaterna delar en hel del av de tankar och känslor man tidigare tagit för definitionsmässigt mänskliga. Jag är inte förvånad. Att våra tankemönster plötsligt skulle ha dykt upp som en bisarr mutation känns mycket mindre sannolikt än att utvecklingen satt samman dem efter hand, med hjälp av byggstenar som fanns hos förfäderna. Därför är det högst rimligt att gränsen mellan oss och våra släktingar är allt annat än skarp.

I ett av årets första nummer av New Scientist fanns ett perspectives-uppslag av Mark Johnson (tyvärr kan man bara läsa början av artikeln på webben om man inte har prenumerantprivilegier) som fyllde i ett gap jag inte visste att jag hade i min uppfattning just av ursprunget till människans mentala modeller. Johnson har påvisat kvarvarande rester av byggstenarna till vårt sätt att ge mening åt abstrakta begrepp. Forskningsresultat som han tydligen tidigare publicerat tillsammans med George Lakoff i boken The Meaning of the Body.

Rum Utgångspunkten är hur nervsystemet fungerar hos en organism utan mänskliga abstraktionsbegrepp. Signalerna från sinnesorganen behandlas till att ge oss en upplevelse av den egna kroppen, och dess plats i rummet. Där finns begrepp som upp och ner, nära och långt borta, inuti, ovanpå och så vidare. Johnson och Lakoffs tes är att vi återanvänder de här begreppen för att skapa mening i våra tankar, och att kommunicera denna mening till andra. De har identifierat ett antal kroppsliga mönster som de kallar »image schemas«, som sägs vara direkt neurologiskt representerade. Dessa bildscheman appliceras, hävdar de, även på tankar som inte är direkt kroppsliga.

Språket är fullt av indikatorer. Johnson tar exemplet »vi har långt kvar innan teorin är slutförd«. Varför använda uttrycket »långt kvar«, ett uttryck som egentligen handlar om att färdas genom rummet? Jo, därför att vi tänker på en målinriktad aktivitet som en resa. Resan är ett begrepp vi lånar från den fysiska världen och använder som metafor för att göra den mentala abstraktionen begriplig. Ett »image schema« alltså.

Eller varför inte kalla det ett design pattern – termen som ursprungligen handlar om fysisk arkitektur, men också används av programmerare för att beskriva mönster i datorprogram.

För att fundera vidare kan man undra vilken betydelse valet av metaforer har för vårt sätt att förhålla oss till det de beskriver. Om man säger »John got into trouble« aktiverar man enligt Johnson tankematriser som har att göra med uppfattningen av rörelse från utsidan till insidan av ett slutet rum. Om man då, som en svenskspråkig person hellre skulle göra, istället säger »John fick problem« aktiverar man förmodligen helt andra mentala mönster. Rimligtvis påverkar det på något sätt ens förhållande till John och hans problem.

Metaforer i datorprogram

De som sysslar med människa-dator-interaktion talar ofta om metaforer som byggstenar i modeller, och deras betydelse för utformningen av användarkontakt i datorprogram. Jag har allt mer kommit att inse hur betydelsefulla metaforer är inte bara för användargränssnitt, utan i all slags programmering. En så enkel sak som valet av ett namn på en variabel kan innebära ett kritiskt val av tankemodell för vad variabeln representerar, som får en enorm betydelse för ens egen mentala bild av sin programkod. Det i sin tur påverkar ifall man hittar det rätta sättet att formulera koden enkelt och koncist. Programmerare skapar oupphörligen gränssnitt, för sig själv att använda om inte annat.

Jag kom att tänka på Johnson rumsliga scheman igen när jag förberedde en presentation om relationsmodellen för databaser. I en relationsdatabas ska data uppfattas som sanningar, uttalade om verkligheten utanför, och representerade på ett sätt som ligger nära predikatlogik.

Men, i det eländiga databasspråket SQL – som är så dominerande i branschen att det tyvärr ofta uppfattas som synonymt med idén för relationsdatabaser – deklarerar man en sådan sanning på ett högst missledande sätt: insert into table. Det ger naturligtvis ingen känsla av att deklarera en sanning. Istället aktiveras ett rumsligt schema som har att göra med att man tar en sak (inte ett faktum) och stoppar in den i en behållare. Jag är övertygad om att detta och andra dåligt valda sätt att uttrycka logiken i SQL bär en stor del av ansvaret för den allmänt utbredda missförståelsen av relationsmodellen – oförmågan att skilja modellen från implementationen. Språket får en att omedelbart tänka på lagring av data – ett begrepp som över huvud taget inte finns i relationsmodellen.

Konsten och viljan

Johnson har också idéer om konst och estetik och deras betydelse för våra mentala processer: »When the arts are regarded only as non-practical, subjective matters of taste, their essence as exemplars of human meaning is completely overlooked […] the arts are seen as luxuries or mere entertainments, rather than as essential to full fuman development.« Att jag citerar detta istället för att referera måste jag erkänna beror på att jag inte helt greppar vad han menar, men jag tror att han kan vara något mycket intressant på spåren. Om jag förstår rätt handlar detta om nya tankar även för Johnson, nyare än vad som kommit med i boken med George Lakoff.

För att återgå till Göran Rosenberg så berör han också begreppet fri vilja, och ifall »biologismen« vill ta den ifrån oss. Det är en annan mem som når allt större spridning: att man påstår (eller påstår att någon annan påstår) att det är mer eller mindre bevisat att den fria viljan är en illusion. Det får bli ett ämne jag sparar till ett kommande inlägg, men jag vill förbereda för det med en ny liten enkät. I högermarginalen ombeds ni nu svara på frågan ifall den fria viljan är verklig eller inte. Jag skulle uppskatta om några fler ville delta än i förra undersökningen, även om ni naturligtvis är fria att avstå. Eller om ni möjligen inte är det.

Uppdatering: Enkäten har följts upp i ett senare inlägg.

intressant? om kropp, själ, fri vilja, mening, design patterns, SQL, Descartes, Göran Rosenberg, Mark Johnson. Kroppsfoto av Max Olivares (some rights reserved). Rumsfoto av Tim Williams (some rights reserved).


03 maj 2007

Bloggping i Javakod

Ping server När jag hade lagt ut mina första blogginlägg undrade jag hur i all världen någon skulle kunna hitta min blogg. Jag frågade min bekant Håkan Kjellerstrand, som tog på sig rollen som min bloggningsmentor och gav mig ett antal länkar, bland annat till några servrar som han själv brukade »pinga« för att sprida kunskapen om sin blogg. Jag hade inget problem att förstå vad detta innebar i teorin, men hur jag rent praktiskt skulle göra för att pinga var inte uppenbart. Efter en stunds jagande efter pingverktyg konstaterade jag att det enklaste för mig nog var att själv skriva ett litet Javaprogram för att ta hand om det.

Blog Ping

Att pinga innebär i bloggsammanhang att man skickar ett litet meddelande som upplyser en pingserver om att man skrivit något på sin blogg, samt om bloggens adress. Servern kan då så snart den får tid hämta ner inlägg från bloggen och lagra data om den, indexera innehållet etc., för att göra informationen tillgänglig för dem som utnyttjar servern till att bevaka bloggosfären.

Googles Blogger som jag numera använder låter en välja att pinga Weblogs.com automatiskt, och informationen går därifrån vidare till en del andra tjänster. Men vill man pinga fler servrar, Nyligen.se till exempel, får man ingen hjälp av Blogger.

Tekniskt

Ping görs med ett XML-RPC-anrop, vilket som namnet antyder är ett remote procedure call-protokoll uppbyggt som XML, ovanpå HTTP. Metoden man anropar är antingen weblogUpdates.ping eller den utvidgade versionen weblogUpdates.extendedPing.

Parametrarna till den ursprungliga pingmetoden är bloggens namn, dess adress och eventuellt ett kategorinamn. Den utvidgade versionen tillåter tre adresser: en basadress, en direktadress till en sida som ska kollas för uppdateringar (i många fall densamma som basadressen), och en för flödet i RSS- eller Atom-format. Den bästa beskrivningen av parametrarna jag har hittat är den hos Weblogs.com. Exakt vilka parametrar som krävs och hur de tolkas verkar dock tyvärr variera lite mellan implementationerna på olika servrar.

Det vore inte särskilt svårt att skriva ett program i Java som satte ihop XML för anropet och matade ut den på en socket. Men ännu lättare är förstås att använda ett bibliotek med färdiga klasser för XML-RPC-anrop, exempelvis Apache XML-RPC.

Om man laddat ner Apache XML-RPC 3.0, exempelvis från Sunet, packat upp, och lagt JAR-filerna som finns i lib-katalogen på sin classpath kan man kompilera och köra följande program. Den första parametern till programmet är pingserverns adress, och de följande 2–5 är parametrarna till pingmetoden. Har man minst fyra pingparametrar antar programmet att man ska köra den utvidgade pingmetoden, annars den enkla.

import java.net.*;
import java.util.*;
import org.apache.xmlrpc.client.*;
import org.apache.xmlrpc.XmlRpcException;

public class PingBlog {
    public static void main(String[] args)
        throws MalformedURLException, XmlRpcException
    {
        XmlRpcClientConfigImpl conf = new XmlRpcClientConfigImpl();
        conf.setServerURL(new URL(args[0]));
        XmlRpcClient client = new XmlRpcClient();
        client.setConfig(conf);
        Object[] param = new Object[args.length - 1];
        for (int i = 1; i < args.length; ++i)
            param[i - 1] = args[i];
        Map result = (Map) client.execute(
            (param.length < 4 ?
             "weblogUpdates.ping" :
             "weblogUpdates.extendedPing"),
            param);
        Iterator it = result.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println(e.getKey() + ": " + e.getValue());
        }
    }
}

Exempelvis kan det se ut så här om man har en blogg av den nyare typen hos Blogger och vill pinga Nyligen.se med den enkla pingen:
java PingBlog http://nyligen.se/ping/                                \
              'Tjoff?'                                               \
              http://gashplutzga.blogspot.com/

Eller med den utvidgade pingvarianten:
java PingBlog http://nyligen.se/ping/                                \
              'Tjoff?'                                               \
              http://gashplutzga.blogspot.com/                       \
              http://gashplutzga.blogspot.com/                       \
              http://gashplutzga.blogspot.com/feeds/posts/default    \
              ''

Den tomma strängen på slutet finns där på grund av att vissa pingservrar kräver att man har med en kategoriparameter till extendedPing, även om de tillåter att den är tom.

Om allt går bra med pingen skriver programmet ut flerror: false och eventuellt ett trevligt meddelande från pingservern. Blir det något fel på servern får man flerror: true och ett felmeddelande.

Uppdatering 2015: Det här med bloggpingande är nu en historisk kuriositet, men jag låter både detta inlägg och länkarna till Nyligen.se och Bloggar.se längst ner i gamla inlägg ligga kvar, för det historiska intressets skull, och länkarna verkar häpnadsväckande nog fortfarande fungera.

intressant? om pinga, Java bloggande


30 mars 2007

Digital musik och mp3-avkodningens mysterier

Kalla mig gärna bakåtsträvare (även om det är fel), men jag tycker fortfarande att cd-skivor är det bästa mediet för musik. Fast sörjer att Internet och nedladdningen dödar skivbutikerna gör jag inte, jag köper numera nästan alla skivor över Internet. Man får tag på allting där ute, av de mest varierade artister och i de mest obskyra genrer, som inte ens en aldrig så entusiastisk ägare till en aldrig så dammig skivbutik skulle få för sig att importera. Spännande skivletande på obskyra ställen får man också utlopp för på nätet.

Är man vinylentusiast bör man också trivas bäst på nätet. Där går det att hitta gamla plattor likväl som nysläpp för DJ-bruk. Själv har jag länge velat åt den där housemusiken som bara släpps på vinyl, men jag är som sagt cd-konsument, bollar inte med plattor och och mixar ihop, och jag känner mig inte hemma i butikerna där stans DJ-elit hänger, och då är Internet räddningen.

Avbräck för hi-fi

Mycket som inte ges ut på cd utan tidigare bara fanns på vinyltolvor går nu ofta att köpa i digital form någonstans där ute.

Beatports logga Tråkigt nog är det mesta i mp3-format. Hi-fi-utvecklingen har alltså fått ett förhoppningsvis tillfälligt avbräck i och med att man numera ofta avsiktligt försämrar ljudkvaliteten för att minska lagringutrymme och överföringstider. Lyckligtvis finns Beatport, som låter en välja att köpa det mesta i wav-format med äkta cd-kvalitet så att man kan bränna sina egna skivor. Visserligen svindyrt, eftersom de lägger till en dollar per spår i förhållande till förlustkomprimerade format, så jag får punga ut mer per musikminut än i skivbutiken, men det är jag beredd att göra för musik jag annars skulle vara utestängd ifrån.

Allt finns dock inte på Beatport, och inte ens där finns allt i förlustfritt format. Så för ett tag sedan satt jag där med två mp3-filer, i någorlunda acceptabla 320 kb/s, som jag ville bränna ner på cd. Allt jag behövde nu var ett program att omvandla detta till cd-formatets 16 bitar i 44,1 kHz.

Avkodningsbekymmer

Att omvandla ljud till mp3-format kan göras med olika parametrar för olika kvalitet kontra komprimeringsgrad. Att omvandla från mp3 tillbaka till någonting som man kan skicka in i en DA-omvandlare borde däremot bara vara frågan om rätt eller fel. Man får förstås inte tillbaka exakt vad man hade före komprimeringen, mp3-kodning innebär ju en kvalitetsförlust, men man borde åtminstone kunna använda all information man har kvar och avkodningen ska alltså vara deterministisk.

En snabb test av tre olika program, varav två redan fanns på min dator, visade dock att det inte var så enkelt. Programmen gav ganska olika resultat. Jag provade inte om jag kunde höra någon skillnad, men jag kunde se på innehållet i avkodad data att de skiljde sig ganska mycket åt. Faktum är att alla tre till och med hade olika längd!

Så vad beror detta på och vad kan man göra åt det?

Compliance

I grunden beror problemet på avrundning under avkodningen. Olika avkodare är olika noggranna. Oftast kompromissar de med noggrannheten för att inte ta för mycket datorkraft. Lyssnar man på musiken direkt från mp3-filer vill man ju nämligen gärna kunna göra något annat på datorn samtidigt med avkodningen – spela upp musiken om inte annat. När jag bara vill koda om filerna en gång struntar jag i det, jag vill att programmet har största möjliga noggrannhet.

Till ISO-standarden för mp3-avkodning hör en referensbitström för att testa compliance med standarden. Referensdata är i 24 bitars upplösning. Om det finns någon gräns i själva mp3-formatet som gör att det är omöjligt eller meningslöst att ge utdata med fler bitars upplösning än så, eller om man bara valt 24 bitar för att det råkar vara standard för precisionsljudkort, har jag inte lyckats utröna. Hur som helst kan man i alla fall testa avkodare för att se hur mycket de avviker från referensen, och man kan förstås hitta resultatet från någon som gjort det på nätet.

Föga förvånande visar jämförelsen att det är produkten Libmad, från företaget Underbit vars webbplats visar undersökningen, som ger bäst compliance, åtminstone kompilerad med parametrar för att optimera för noggrannhet. Libmad är en fri produkt och den fanns redan på min dator eftersom jag har installerat Sox som använder den. Dock inte kompilerad för att vara maximalt noggrann, men det gick bra att hämta ner källkoden, kompilera med parametern --enable-accuracy, och sedan fixa så att Sox använder det nykompilerade resultatet. Så nu kan jag använda Sox för konverteringen och få utdata med bästa tillgängliga noggrannhet. Allt frid och fröjd, eller?

Dithering

Inte riktigt, jag vill som sagt ha utdata med 16 bitars upplösning till min cd. Hur gör Sox när den går från Libmads 24 till 16 bitar? Det verkar som att den avrundar till närmaste 16-bitarstal, vilket ju känns högst rimligt – och är det bästa man kan göra om man vill få bra värden i compliance-tester. Men, det är inte det bästa om man vill att det ska låta bra.

Enkel avrundning gör nämligen att signalen blir full av skarpa 90-graderskanter, vilket akustiskt innebär att man får in obehagliga övertoner. För bästa ljud bör man använda något som kallas dithering, vilket innebär att man före avrundningen adderar ett högfrekvent brus i de lägsta åtta bitarna. På så vis höjer man slumpmässigt vissa värden och sänker andra, och resultatet efter att signalen jämnats ut av elektronik och öron blir rundare och mer harmoniskt.

Det är inte lätt att ta reda på vilka avkodare som gör dithering och inte, men Underbits egen frontend till Madlib, Madplay, gör det om man inte explicit säger åt den att låta bli. Jag testade den, och när jag jämförde resultatet med det från Sox kunde jag konstatera att Sox inte använder dithering, så jag bestämde mig för att i fortsättningen använda Madplay tillsammans med en noggrannhetskompilerad libmad.

Perfektionister och musiker

Men kanske är det bara teoretiska perfektionister som jag som bryr sig. Jag hittade en wiki som hävdade att det har varit viktigare med tidigare bristfälliga kodare och avkodare, och det stöds av det faktum att alla hetsiga diskussioner jag kunde hitta om ämnet på nätet var minst fem år gamla. Fast jag undrar vad påståendet att skillnaderna är betydelselösa grundar sig på. Man vill ju, eller åtminstone vill jag, att även sista biten av de 16 ska vara vettig (annars har man ju bara 15 bitars upplösning!), även om det kan vara svårt att upptäcka skillnaden när man lyssnar.

På en företagsfest ett tag senare hade jag tillfälle att diskutera ämnet med en musiker som råkar vara ena halvan av Malmös hetaste namn på just Beatport, och även han var helt inne på linjen att alla bitarna har betydelse och att dithering är önskvärt, vilket gjorde mig lite nöjd.

Men så kom han också med den för mig något otillfredsställande nyheten att det finns olika rön om vilken sorts brus man ska lägga på för att få bäst resultat av dithering. Jag vet inte om jag ska försöka ta reda på fakta i den diskussionen också. Lyckligtvis har jag kunnat hålla mig till wav-format sedan dess.

intressant? om mp3, musik