Ode till något jag hittade i kylen i morse.

(Mel.: Det är en ros utsprungen)

Vår mjölk den är utgången;
den blev visst sur igår.
Så sömnen hålles stången
med besk, svart kaffetår.
Välsignat kaffe, bryggt!
Vem vaknar dig förutan?
Om än du smakar styggt.

Publicerat i Uncategorized | Lämna en kommentar

Gammal kod jag hittade på datorn – ELIZA

Någon gång i början på 90-talet fick jag tag på källkoden till Eliza, omskriven i Pascal. Eliza står beskriven i historieböckerna som ett av de första försöken att skapa en processor för naturligt språk, eller en chatbot som vi skulle säga idag. Den skrevs av Joseph Weizenbaum runt 1966 och bygger på en enkel princip: Eliza fungerar som en samtalsterapeut som helt sonika kastar tillbaka användarens kommentarer till denne. Säger man ”X”, frågar Eliza något i stil med ”Vad menar du med X?” och så vidare.

Att prata med Eliza är inte övertygande någon längre stund; användaren förstår snart att samtalspartnern är ett ganska simpelt program, inte en människa.

Hur som helst, jag kompilerade källkoden och lekte lite med programmet. Historielektion eller inte, jag tröttnade efter några minuter. Då undrade jag vad som skulle hända om man lät två instanser av Eliza prata med varandra. Resultatet är ganska roligt och säger kanske något om tidiga chatbotar. Kanske kan det också lugna någon som oroar sig för att superintelligenta robotar ska ta över världen.

Hi! I’m Eliza. I am your personal therapy computer. Please tell me your problem.
Did you come to me because you are my personal therapy computer?
What makes you think I am your personal therapy computer?
How long have you been my personal therapy computer?
We were discussing you –not me.
We were discussing you –not me.
Oh, –not you?
Oh, Oh, –not me?
Are you saying no just to be negative?
Why are you interested in whether or not I am saying no just to be negative?
Why are you interested in whether or not I am interested in whether or not you are saying no just to be negative?
What makes you think I am saying no just to be negative?
Did you come to me because you are saying no just to be negative?
Does it please you to believe I am saying no just to be negative?
How long have you been saying no just to be negative?
You’re not really talking about me, are you?
What makes you think I am not really talking about me, am me
Do you believe it is normal to be not really talking about me, are you?
Would you prefer if I were not Do I believe it is normal to be not really talking about me, am me?
We were discussing you –not me.
You’re not really talking about me, are you?
What makes you think I am not really talking about me, am me?
Do you believe it is normal to be not really talking about me, are you?
Would you prefer if I were not Do I believe it is normal to be not really talking about me, am me?
We were discussing you –not me.
Oh, –not you?
Oh, Oh, –not me?
Are you saying no just to be negative?
Perhaps in your fantasies I am saying no just to be negative?
Do you enjoy being saying no just to be negative?
You’re not really talking about me, are you?
Does it please you to believe I am not really talking about me, am me?
Do you enjoy being not really talking about me, are you?
Perhaps in your fantasies I am Do I enjoy being not really talking about me, am me?
We were discussing you –not me.
You’re not really talking about me, are you?
Does it please you to believe I am not really talking about me, am me?

Publicerat i Uncategorized | Lämna en kommentar

HTML 5 – canvas

Härom veckan skaffade jag en bok som heter A Software Engineer Learns HTML5, JavaScript & jQuery av Dane Cameron. Boken lär ut allt som behövs för att skapa en ensidesapplikation (Single page application). Mycket kände jag redan till, men en liten uppfräschning är alltid bra.

Något saknas dock i boken; den beskriver inte hur man använder de nya HTML5-taggarna för multimedia, som t.ex canvas. Men w3schools kommer till räddning.

För att träna lite HTML5 skrev jag en PacMan-klon i JavaScript.

Grafiken kommer från en annan PacMan-klon som jag skrev i Delphi på 90-talet. Äta-ljudet hittade jag på nätet nånstans. När PacMan dör skriker han; ljudet är ett uppsnabbat dödsskrik från Doom. Ljudet när PacMan äter ett piller är en inspelning av en knackning på glaset på min gamla 14″ CRT-skärm (som står i källaren).

Som ”A Software Engineer…” påpekar är JavaScript inte ett klassiskt objektorienterat språk. Det bygger på objekt-prototyper och funtionell programmering snarare än klasser. Men eftersom klassisk objektorientering är min grej, låtsas jag att JavaScript är ett klassbaserat språk. Vilket enligt Cameron bara leder till frustration, men det har jag faktiskt inte märkt.

Klasser

ImageList Lista av ikoner som ligger i en horisontell bild
Board Innehåller celler av väggar, piller och punkter.
Pacman Representerar vår huvudperson
Ghost Representerar en fiende

Att göra: Spökena är för närvarande ganska korkade. De slumpvandrar i stället för att jaga efter PacMan. Jag jobbar på en bättre algoritm. Dessutom behöver spelets hastighet snabbas upp efter varje level.

Spela
Källkod

Publicerat i Uncategorized | Etiketter , | Lämna en kommentar

Gammal kod jag hittade på datorn – Visual BrainF*ck

Av alla esoterska programmeringsspråk som konstruerats, hör BrainFuck nog till de mer udda. Urban Müller skrev det 1993 för att testa hur simpelt man kunde göra ett språk som ändå är Turing-komplett. Som namnet antyder är koden inte helt lätt att skriva eller läsa.

Ett BrainF*ck-program använder sig av en lång array av heltal som man kan göra olika operationer på. Själva språket består av endast 8 olika kommandon:

< Minskar aktuell position i arrayen med 1
> Ökar aktuell position i arrayen med 1
+ Ökar värdet vid aktuell position med 1
Minskar värdet vid aktuell position med 1
. Skriver ut värdet vid aktuell position i arrayen som ett ASCII-tecken
, Läser in ett tecken till aktuell position i arrayen
[ Om värdet vid aktuell position är 0, hoppa till nästa matchande ’]’
] Om värdet vid aktuell position inte är 0, hoppa tillbaka till matchande ’[’

Minimalistiskt så det förslår, alltså. Allt som inte är något av dessa 8 tecken räknas som en kommentar. Ett ”Hello, World”-program kan se ut så här:

Klart som korvspad, eller hur?

Det gamla projekt jag hittade på datorn är ett IDE som jag döpte till Visual Brainf*ck, eller VB (på den här tiden, 2001, var Visual Basic 6 mitt främsta hatobjekt). Det är skrivet i C++ med MFC. Koden till kompilatorn lånade jag från Ben Olmsteads kompilator bfcc, och de dockande fönstren ärver från en kontroll av Cristi Posea.

Testprogram

test.b Skriver ut en bit av ascii-tabellen.
quine.b Ett Quine-program som jag hittade någonstans. Skriver ut sig själv till konsolen.
hello.b Hello, World
99brainf.b Ben Olmsteads version av 99 Bottles of Beer

Windowsprogram
Källkod

Publicerat i Uncategorized | Etiketter , | Lämna en kommentar

Gammal kod jag hittade på datorn – Othello

Ibland sätter jag mig och tittar på gamla personliga projekt som ligger och skräpar på hårddisken. Här är ett som är lite kul: Ett Othello-spel som jag skrev 2003, under min tid på DSV, för att testa algoritmen minimax. Programmet försöker inte göra något särdeles listigt; den använder bara minimax rakt av. Heuristiken är enklast möjliga: Antal brickor i rätt färg. Ändå fungerar det ganska bra.

Applikationen har några begränsningar som jag aldrig brydde mig om att fixa. T.ex kan man inte välja färg. Inte heller kan man ställa in svårighetsgrad – den är hårdkodad för att kolla max 5 drag framåt.

Det här programmet slår mig varje gång jag spelar mot det. Nu är jag iofs en ganska kass Othello-spelare, men ändå. Det är en intressant känsla att bli överlistad av sin egen kod.

Programmet är skrivet i C++/Win32.

Windowsprogram
Källkod

Publicerat i Uncategorized | Etiketter , | Lämna en kommentar

Experiment med Bullet

För ett tag sen snubblade jag över Bullet Physics, en öppen fysikmotor för C++. Med den kan man simulera en värld befolkad av objekt som beter sig (hyfsat) realistiskt. Som i ett bowlingspel där klotet träffar käglor som flyger omkring och kolliderar mot varandra. Eller i ett spel som handlar om en smått oetisk affärsman som kör bil hellre än bra.

Bullet används bl.a i 3D-programmet Blender och i en del kommersiella spel (GTA IV). Versionen är uppe i 2.80; version 3 ska visst innehålla en del intressanta nyheter, som bibliotek för Android. Dokumentationen är utmärkt och det kommer med många kodexempel. Exempelkoden är kanske inte alltid så organiserad och lättläst, men å andra sidan finns det ett aktivt community som gärna svarar på dumma frågor (jag har provat).

Efter att ha lekt lite med studsande bollar och fallande dominobrickor, skrev jag ett enkelt bilspel med det lagom fantasifulla namnet Racer. Det är långt ifrån ett komplett spel, men det duger till att experimentera med Bullet. Det är inte heller helt buggfritt, men låtsas bara att guppen i vägbanan är farthinder.

Kontroller
  • Piltangenter: Gasa, styr, bromsa
  • Mellanslag: Paus
  • C: Växla kameravy
  • Escape: Flytta tillbaka bilen till startläget.

Översikt

Bullet

Bullet innehåller klasser för att simulera tyg, rep, deformerbara objekt, m.m. Den här demon begränsar sig till rigid body dynamics, dvs kroppar som behåller sin form vid kollisioner. Den demonstrerar också klassen btRaycastVehicle som simuerar ett fordon bestående av flera kroppar (chassi och hjul).

Racer

Klasser

RacerApp
Applikationens huvudklass. Ärver från OpenGlApp. Några metoder att titta på är
  • InitScene() Applikationen startas. Läser in resurser och initialiserar spelvärlden.
  • OnTimer() Anropas med jämna mellanrum och uppdaterar världen.
  • RenderScene() Renderar alla objekt i spelvärlden.
  • KillScene() Anropas när applikationen avslutas. Rensar upp minnet.
OpenGlApp

Basklass för OpenGL-applikation. Gömmer undan det mesta av Win32-koden, initialisering av OpenGL och lite annat.

Track

Klass för att generera bilbanan. Banan byggs upp utifrån en spline-kurva (Spline) som används för att generera två Mesh: ovansida och undersida av banan. Den övre meshen används för att skapa en btTriangleMesh, som Bullet använder för att beräkna kollisioner mellan bilen och vägbanan. Undersidan är bara till för syns skull.

Spline

Representerar en spline-kurva. Kurvan består av ett antal noder (Spline::Node) som i sin tur har varsin position (x, y, z), ”styrka” och rotation (en glw::Quaternion).

SplineMesh

Ärver från glw::Mesh. Skapar en Mesh utifrån en Spline och ett tvärsnitt av banan. Tvärsnittet ”sveper” längs kurvan och skapar trianglar allt eftersom.

Vehicle

Kapslar in btRaycastVehicle och lite övrigt krafs som behövs för att simuera ett fordon.

VehicleCamera

En virtuell kamera som följer efter bilen.

AboutDlg

Dialogruta med About-info.

glw

glw är ett hemmagjort klassbibliotek (har glömt vad ”glw” står för) som innehåller diverse osorterade bra-att-ha-klasser för OpenGL, t.ex för att ladda texturer och 3D-objekt. En vacker dag ska jag dokumentera dem och städa upp lite i röran. De klasser som används är i alla fall:

glw::DynamicsWorld

Världen enligt Bullet. Håller bl.a ordning på alla btRigidBody i världen, alltså stela objekt som kan kollidera med varandra. Ärver från btDiscreteDynamicsWorld och kapslar in initialiseringen.

glw::RigidBody

Ärver från btRigidBody och kapslar in initialiseringen.

glw::Mesh

Beskriver geometrin för ett objekt. Består av en uppsättning vertex och trianglar som skickas till OpenGL för rendering. Äger också en glw::Surface som definierar färg, textur, reflektion osv för trianglarna.

glw::Model

En samling av glw::Mesh som hänger ihop.

glw::Lwo2Decoder

Läser in ett LightWave2-objekt (från fil eller resurs) och skapar en glw::Model.

glw::GdiTexture

Läser in en bild (med hjälp av GDI+) och skapar en OpenGL-textur av den.

Kompilera

Projektet är utvecklat i Visual Studio 2010. Det kan nog gå att kompilera med något annat också, men inte utan en del meckande.

  1. Ladda ner och installera Bullet
  2. Ladda ner och packa upp glw till någon lämplig mapp.
  3. Ladda ner källkoden till Racer och packa upp.
  4. Projektet Racer behöver följande sökvägar:
    Sökvägar för include
    • <Sökväg till Bullet>\src
    • <Sökväg till Bullet>\Demos\OpenGL
    • <Sökväg till glw>
    Sökvägar för länkning
    • <Sökväg till Bullet>\lib
    • <Sökväg till Bullet>\Glut

Länkar

Publicerat i teknik | Etiketter , | Lämna en kommentar

Demo – Effektfull webbkamera

Nu är det möjligt att få fatt i strömmen av bilder från en användares webbkamera, utan att använda flash eller andra plugins till webbläsaren. Jag har testat det i Chrome webbläsare. Dock är tekniken än så länge experimentell, och stöds inte av alla webbläsare.

I min demo så ser man högst upp bildflödet från webbkameran i sin råa form. I den stora bildramen nedanför syns bildflödet från webbkameran igen, men denna gång filtrerad genom effektfilter för vinjettering, exponering, nyans och mättnad. Dessa effektfilter kan man själv ställa in ”styrkan” på genom att använda videokontrollen till höger om den stora videoytan.

Så långt själva demon, men vad kan man använda tekniken till?

Här kommer några förslag:

  • Bygga ännu mycket mera sociala platser på nätet, där man ser och interagerar med personer live.
  • Robotar vilka till exempel reagerar på människors ansiktsuttryck och rörelser.
  • Övervakning av hem, bebisar och husdjur.
  • Coola spel.
  • E-handel, prova kläder etc.

Den stora grejen är dock inte tekniken i sig, utan det handlar om teknikens tillgänglighet. För konsumenter krävs i framtiden inga plugins, vilka inte alltid fungerar så bra på mobiler. Utvecklare, vilka kan vanliga webbtekniker som htmlcss och javascript, kan utnyttja tekniken. Tröskeln för att använda tekniken sänks både för konsumenter och producenter. Är du utvecklare och sugen på att testa att bygga något själv redan nu? Titta på länkarna längst ned på sidan.

Du är också välkommen att testa min demo.  Tekniken är som sagt än så länge experimentell. Du måste använda Chrome webbläsare, samt aktivera en inställning som heter ”MediaStream” i webbläsarens inställningar. Det gör du genom att skriva följande i adressfältet i Chrome -”chrome://flags” och bläddra ned tills du hittar MediaStream, aktivera och starta om Chrome.


De viktigaste tekniker, bibliotek jag använt i min demo är dessa:

Hör gärna av dig om du har frågor eller synpunkter, via mail eller lämna en kommentar!

Publicerat i teknik | Etiketter , , , | Lämna en kommentar

Fejs orakel

Face.com har ett webb API vilket man kan skicka en bild på ett ansikte till och så får man reda på saker om personen på bilden. Det som sker hos face.com är att programmet först letar efter ansikten i en bild, och därefter olika egenskaper för funna ansikten. Egenskaper som kön, ålder, glasögon, etc. En maskinell bildanalys sker. Ganska fascinerande, eller hur?

Webb API:er finns det numera ganska gott om, faktiskt så många att det är praktiskt att det finns en sajt – http://www.mashup.se/, vilken håller reda på de mest användbara utifrån ett svenskt perspektiv.

Systembolaget har till och med ett API, vilket har information om deras  sortiment och butiker. Det innebär att tredje-parts utvecklare kan skapa exempelvis en iPhone App med vägbeskrivning till närmaste affär. Det kostar inte Systembolaget en spänn. Fler företag borde kunna utnyttja API:er på ett liknande vis, kan tyckas. Varför inte H&M eller IKEA?

Nu åter till face.com och deras API, vilket tillhandahåller en bildanalys av ansikten. För att testa API:et byggde jag in  det i webbläsaren Chrome, via en extension. På så vis kan jag enkelt högerklicka på en bild i en webbsida, och se vad face.com:s api säger om kön, ålder, med mera. (Se klippet, nedan, vilket jag lagt upp på youtube och som visar när jag surfar på aftonbladets sida med fejs orakel)

Tycker du att det verkar funka, med ett program som gör en bildanalys? Själv blev jag imponerad, efter att ha testkört det ett par dagar. Förresten, när jag testade att visa upp mitt hack för ett par kompisar, så ville de direkt kolla på online bilder på sig själva. De ville se hur gamla de såg ut 🙂 .

Publicerat i teknik | Etiketter , , , , | 1 kommentar

Hundar är bäst!

För ett tag sedan dök Henerator upp, en extension till webbläsaren Chrome. En extension används för att utöka en webbläsares funktioner med funktionalitet som skapats av en tredje-part. Extensions fungerar  i princip som app:ar, vilka man kan installera i sin webbläsare.  Exempel på populära extensions som finns idag till Chrome är ”Adblock Plus”, vilket blockerar internet annonser på webbsidor, samt ”Hover Zoom”, vilket gör att en bild på en webbsida förstoras upp när man ”hovrar” över den med muspekaren.

Men nu tillbaks till Henerator,  genom att installera denna extension i Chrome, så kommer orden ”han” och ”hon” i texten på en webbsida – vilken som helst,  att ersättas med det kösneutrala ordet ”hen”.

Kul, tänkte jag!

Jag blev sugen på att testa att bygga något liknande, mest för att lära mig tekniken, men också för att det slog mig att det skulle kunna vara användbart i media och reklam, som jag ofta arbetar på uppdrag av. Jag spånade kring att man skulle kunna göra om designen i webbläsaren så att den till exempel har ett Hammarby tema, eller varför inte skapa en knapp i menyn som vid tryck visar senaste nyheterna om ett företag man vill följa?  Du kan säkert själv komma på både fler och bättre exempel, dela gärna med dig här i så fall!

Nu skulle jag som sagt testa tekniken bakom Henerator specifikt och då valde jag att bygga en Chrome extension,  där ordet ”katt”  i texten på en webbsida – vilken som helst,  ersättas med  ordet ”hund”. Varför? Därför att hundar är bäst – förstås! Om du vill testa direkt, och inte är intresserad av att veta hur man skapar i kod, så kan du installera ”Hundgenerator” nu och sluta att läsa vidare. (Du måste dock ha Chrome webbläsare installerad först.)

Här följer en genomgång av koden, och mina tankar kring den:

Först måste man skapa en manifest fil, vilken ska vara i JSON format därav namnet på filen manifest.json. Manifest filer är i det här sammanhanget en sorts installationsfil, eller en fil med meta information om andra filer – en programförklaring. Filen ser i Hundgenerator fallet ut så här:

{
  "name": "Katt blir hund",
  "version": "1.1",
  "manifest_version": 2,
  "description": "Katt blir automatiskt hund",
  "content_scripts": [
    {
	  "matches": ["http://*/*", "https://*/*"],
      "js": ["doggie.js"]
    }
  ]
}

Texten i manifest.json beskriver närmast sig själv, vilket alltid är trevligt! Ett par saker är värda att notera:

	  "matches": ["http://*/*", "https://*/*"],

Det betyder att denna extension användas för alla webbsidor som en användare av Chrome surfar på. Man kan alltså om man vill begränsa en extension till en specifik webbadress, exempelvis ett visst företags hemsida.

	  "js": ["doggie.js"]

Här hakas koden in som gör själva jobbet med att byta ut ord. Det är en javascript fil vilken heter doggie.js. så här ser den ut:

function doggie(node) {
  if (node.nodeType== 3) { // text
	node.data = node.data.replace(find,
		function (me) {
		 return (me.charAt(0) == 'k') ? 'hund' : 'Hund'
		});
  } else {
    for(var i=0; i<node.childNodes.length; i++)
      doggie(node.childNodes[i]);
  }
}

var find = /[kK]att/g;

if (document.readystate == "complete") {
    doggie(document.documentElement);
} else {
    window.addEventListener(
	  "DOMContentLoaded",
	  function(e) { doggie(document.documentElement); },
	  false
	);
    window.addEventListener(
	  "load",
	  function(e) { doggie(document.documentElement); },
	  false
	);
}

Javascriptet innehåller en funktion, ett reguljärt uttryck och ett par händelselyssnare. Det är allt som behövs = nice!.  Ansvarsfördelningen ser ut så här:

  1. Händelselyssnarna ansvarar för att se till att Chrome har laddat in hela webbsidans innehåll. Det är det första steget och det görs för att annars kan vi missa ord som vi vill byta ut.
  2.  Funktionen ”doggie” letar upp ord som ska bytas ut genom att gå igenom hela webbsidan. Löv för löv  rekurseras hela dokumetträdet igenom, med början vid roten. Innan ordet byts ut kollas om det börjar med stor bokstav ”K”  eller liten ”k”. Om det är liten bokstav ”k” så blir början på hund med liten bokstav annars Hund.
  3. Det reguljära uttrycket /[kK]att/g , bestämmer vad som ska bytas ut, i det här fallet är vi intresserade av  alla delar av ett ord som innehåller antingen ”Katt” eller ”katt”.
Det var det hela! Lämna gärna en kommentar, eller skicka ett mejl till mig om du kommer på något särskilt listigt som du vill ha hjälp med att skapa, så tar vi en fika. (Något som du kanske inte vill dela med andra som läser denna blogg. )
Publicerat i teknik | Etiketter , , , | Lämna en kommentar