har inte något att säga
tänkte bara säga att jag inte har något att säga
bert
2010-03-29
2010-03-21
Botnät på iPad
Sjukt nördig helg-läsning om att simulera botnät på superdatorer. Perfekt för att läsa på iPadden i hängmattan på tomten, det säger jag nu yo!
2010-03-20
Process för framställande av en specifik matprodukt
- Krossa en liten vitlök, hacka två lagom starka chilifrukter och två schalottenlökar.
- Häll olja i gryta och grunda med lite curry, garam masala och koriander.
- Ha i ovan nämnda hackade och krossade objekt i ovan nämnda gryta.
- Hacka ett gäng tomater och ha i grytan när det känns rätt.
- Krydda med senap, salt, chiliflingor och mer curry, garam masala, koriander och lite vatten.
- Riv i ett par morötter och en bit ingefära.
- Koka i typ en halvtimme.
- Koka en mängd röda linser i separat kärl i sådär 10 minuter.
- Häll av linserna och dra ner i grytan.
- Tillsätt en mängd kikärter och del cocosmjölk.
- Låt puttra tills riset är färdigt.
För att få den där riktigt indiska känslan så vill man kanske ha en lassi till, men jag hade ingen, utan tog ett glas Carlshamns blåbärssoygurt istället, vilket väl typ är som en svensk lassi.
2010-03-17
Vilket VM då?
En sak jag såg på en reklamskylt idag är att det tydligen inte heter "fotbolls-VM" längre, utan "FIFA fotbolls-VM". FIFA tycker tydligen inte att de är tillräckligt synliga, och väljer att branda sitt största evenemang med sitt eget namn. Perfekt, för det är väldigt knöligt att säga, så syftet de kan tänkas uppnå är att folk antingen skiter i det eller blir så trötta på att säga det att de helt enkelt slutar prata om fotboll och går över till curling istället. Det vore i och för sig ganska vettigt, med tanke på att Sverige faktiskt brukar vinna i curling. Sen är det ju väldigt praktiskt om någon annan organisation skulle välja att starta sitt eget fotbolls-VM, t.ex. UEFA. Då kan man skilja på dem genom att tala om FIFA-VM och UEFA-VM. Så där som i boxning, där det finns tre världsmästare.
2010-03-15
Träd, gräs och stenar
Det blir en del programmering här just nu, men jag kanske är periodare. Eftersom jag är periodare så skriver jag inte kod tillräckligt ofta för att vara speciellt bra på det. Därför kan jag bli entusiastisk över idéer som smarta människor, som DU, tycker är bisarrt uppenbara.
Idag skulle jag skriva en funktion för att kolla hur djupt och brett ett träd är, där varje nod i trädet kan ha ett godtyckligt antal barn. Enligt KISS-principen så delade jag upp den i två, och skrev den enklaste först. Det enklaste är djupet, där man helt enkelt gör en rekursiv djupet-först-sökning (ah, direktöversättningar av datatermer, jag borde söka jobb på IDG) och adderar ett till djupet för varje steg i rekursionen och returnerar det största värdet.
Sen skulle jag göra bredd-funktionen (the bread function), och då tänkte jag först breadth first search. Det är lite jobbigt, man måste hålla i listor med noder så att man inte doppar tårna för djupt innan man har promenerat igenom alla syskon, kusiner, sysslingar, bryllingar, tremänningar etc. Och loopar i koden, känns inte det som att det ökar den cyklomatiska komplexiteten och är allmänt 60-tal sådär? Jo.
Alltså gjorde jag så här istället: jag skrev en rekursiv djupet-först-funktion, till vilken jag skickade med en noll-initialiserad int-array och det aktuella djupet. För varje nod som besöks så ökar jag numret på djupets index i arrayen med ett, och för varje rekursivt anrop så ökar jag djupet med ett. När det första rekursiva anropet returnerar så har jag en array med antalet noder på varje djupnivå, så det är bara att gå igenom den och plocka det största numret i arrayen, som är trädets största bredd. Eller på ren svenska:
Det mest komplicerade i den här funktionen är typ att jag använde ordet "breadth" som det är lite jobbigt att skriva och uttala. Om jag har gjort något misstag i pseudo-koden så blir det extra pinsamt, eftersom det här är så sjukt enkelt.
Idag skulle jag skriva en funktion för att kolla hur djupt och brett ett träd är, där varje nod i trädet kan ha ett godtyckligt antal barn. Enligt KISS-principen så delade jag upp den i två, och skrev den enklaste först. Det enklaste är djupet, där man helt enkelt gör en rekursiv djupet-först-sökning (ah, direktöversättningar av datatermer, jag borde söka jobb på IDG) och adderar ett till djupet för varje steg i rekursionen och returnerar det största värdet.
Sen skulle jag göra bredd-funktionen (the bread function), och då tänkte jag först breadth first search. Det är lite jobbigt, man måste hålla i listor med noder så att man inte doppar tårna för djupt innan man har promenerat igenom alla syskon, kusiner, sysslingar, bryllingar, tremänningar etc. Och loopar i koden, känns inte det som att det ökar den cyklomatiska komplexiteten och är allmänt 60-tal sådär? Jo.
Alltså gjorde jag så här istället: jag skrev en rekursiv djupet-först-funktion, till vilken jag skickade med en noll-initialiserad int-array och det aktuella djupet. För varje nod som besöks så ökar jag numret på djupets index i arrayen med ett, och för varje rekursivt anrop så ökar jag djupet med ett. När det första rekursiva anropet returnerar så har jag en array med antalet noder på varje djupnivå, så det är bara att gå igenom den och plocka det största numret i arrayen, som är trädets största bredd. Eller på ren svenska:
void checkBreadthRec(Node node, int currDepth, int breadths[])
Node curr = GetFirstChild(node)
breadths[currDepth]++
while(curr)
checkBreadthRec(curr, currDepth+1, breadths)
curr = GetNextSibling(curr)
Det mest komplicerade i den här funktionen är typ att jag använde ordet "breadth" som det är lite jobbigt att skriva och uttala. Om jag har gjort något misstag i pseudo-koden så blir det extra pinsamt, eftersom det här är så sjukt enkelt.
2010-03-14
Om att vilja springa iväg
Jag tittade lite på OCTest, ett unittest-framework för Objective C, som är integrerat i Xcode. Det lät inte så dumt, och det var lätt att komma igång med, även om artikeln på Apples developer-sajt verkade vara runt 8 år gammal och helt inaktuell.
Jag skrev lite tester och skrev lite kod och det funkade alldeles utmärkt, tills ett av testerna failade och det inte var uppenbart för mig hur jag skulle fixa det. Jag testade att sätta en breakpoint. Inget resultat. Testerna körs som ett steg i bygg-fasen av en separat app, så breakpoints man sätter i Xcode funkar givetvis inte.
"Tänk om någon annan på internet har haft samma problem som jag", tänkte jag. Mycket riktigt, det hade någon, som dessutom har bloggat om hur man får det att funka. Synd då att svaret är typ "gör 3000 inställningar, med kommandoradsparametrar och environment-variabler och annat jobbigt".
Som någon skriver i en kommentar: "This makes you want to run away from unit testing. Thanks for the write-up, Chris. But this so should be easier." Svårt att inte hålla med där. Och svårt att förstå hur man kan välja att integrera ett unittesting-framework i ett IDE och inte göra det möjligt att på något smidigt sätt debugga. Men när man hamnar under den polerade ytan på OSX så brukar det vara så här: det liknar väldigt mycket hur det var att köra Linux för 10 år sedan.
Dessutom är det trist om man försöker printf-debugga och råkar hamna i en oändlig loop. Det går inte att avbryta körningen med mindre än att man dödar test-processen. Om man sen försöker titta på utskrifterna så är det givetvis så ansträngande att Xcode antingen går in i badbolls-läge för evigt eller lägger sig ner och dör.
Jag skrev lite tester och skrev lite kod och det funkade alldeles utmärkt, tills ett av testerna failade och det inte var uppenbart för mig hur jag skulle fixa det. Jag testade att sätta en breakpoint. Inget resultat. Testerna körs som ett steg i bygg-fasen av en separat app, så breakpoints man sätter i Xcode funkar givetvis inte.
"Tänk om någon annan på internet har haft samma problem som jag", tänkte jag. Mycket riktigt, det hade någon, som dessutom har bloggat om hur man får det att funka. Synd då att svaret är typ "gör 3000 inställningar, med kommandoradsparametrar och environment-variabler och annat jobbigt".
Som någon skriver i en kommentar: "This makes you want to run away from unit testing. Thanks for the write-up, Chris. But this so should be easier." Svårt att inte hålla med där. Och svårt att förstå hur man kan välja att integrera ett unittesting-framework i ett IDE och inte göra det möjligt att på något smidigt sätt debugga. Men när man hamnar under den polerade ytan på OSX så brukar det vara så här: det liknar väldigt mycket hur det var att köra Linux för 10 år sedan.
Dessutom är det trist om man försöker printf-debugga och råkar hamna i en oändlig loop. Det går inte att avbryta körningen med mindre än att man dödar test-processen. Om man sen försöker titta på utskrifterna så är det givetvis så ansträngande att Xcode antingen går in i badbolls-läge för evigt eller lägger sig ner och dör.
2010-03-12
Rondellhundar
Det är intressant hur folk försöker göra Lars Vilks-grejen till en fråga om yttrandefrihet. Uppenbarligen så begränsas han inte av yttrandefriheten. Det är tillåtet att förolämpa religiösa idéer i de flesta sammanhang. Men det man får ha klart för sig är att om man förolämpar någon, eller i det aktuella fallet hundratals miljoner människor med ganska bestämda åsikter, så får man räkna med att det kan komma surt tillbaka. Det är inte samma sak som en brist på yttrandefrihet. Yttrandefriheten förhindrar att man förföljs av staten för sina åsikters skull.
2010-03-07
Objekt och abstrakta datatyper
Jag har funderat lite mer på det här med objekt-orienterad programmering. När jag lärde mig att programmera på riktigt så tog det ganska lång tid innan jag såg fördelarna med objekt-orientering, trots att folk försökte övertyga mig. När jag läste eller skrev objekt-orienterad kod så kände jag att den blev krånglig och svår att följa.
Men eftersom det är allmänt erkänt att objekt-orientering är bra, och att det faktiskt är ett enkelt sätt att strukturera kod man skriver på, så lät jag mig övertygas. Att abstrakta datatyper är vettigt kan alla vara överens om, och det är lätt att tro att objekt-orientering i första hand handlar om att strukturera sin data i abstrakta datatyper. Men en abstrakt datatyp ska inte vara mer än inkapslad data. I typisk objekt-orienterad programmering blir datatyperna mycket fetare än vad de borde vara, eftersom man måste klämma in all funktionalitet i dem, även om den inte hör hemma där.
De största problemen jag ser med typisk objekt-orienterad design är:
1. Kontrollflödet blir svårt att följa, eftersom det sprids ut över en massa klasser. Algoritmer passar inte in i objekt-orienterad programmering.
2. Det är lätt att hemfalla åt bristfälliga vanor, där medlemsvariabler används istället för metodparametrar. Att använda medlemsvariabler på det här sätter är i stort sett lika illa som att använda globala variabler: metoder tenderar att ha sidoeffekter i onödan.
Den gemensamma roten till båda de här problemen är att objekt-orienterad programmering prioriterar data över algoritmer på ett sätt som gör att man måste använda skohorn för att få in algoritmerna i objekten. Algoritmer hör typiskt inte till ett visst objekt, utan sprids ut på ett mer eller mindre godtyckligt sätt mellan olika klasser. En viss bit funktionalitet hamnar i en viss klass för att den verkar höra hemma där mer än i någon annan klass, även om den inte egentligen hör hemma där.
Klasser blir typiskt mycket tyngre än de hade varit om metoder bara hade använts till vad de är menade att göra: att manipulera lokal data i det objekt de tillhör. Men algoritmerna måste in i något objekt, även om de egentligen inte hör hemma i något objekt, vilket gör att en klass som kanske egentligen skulle ha haft 10 vettiga metoder, kommer bestå av 10 vettiga metoder och 40 ovettiga.
Jag tror att det i de flesta fall är mer vettigt att dela upp sin kod i abstrakta datatyper, som man kan kalla för klasser om man vill, och gammal god strukturerad imperativ kod, som inte tillhör en viss klass. Då får man klasser som är enkla att förstå, eftersom de inte gör mer än vad de borde göra, och kontrollflöden som är enkla att förstå, eftersom de inte är utspridda över 10 olika klasser.
Enligt det här resonemanget så är språk som Objective C, Python och C++ mer vettiga än t.ex. Java, där allt är objekt. För allt är inte ett objekt. Sen finns det givetvis problem där objekt-orientering kan hjälpa, typiskt för att arv är bra i vissa situationer.
Bygger man stora system ska man titta närmare på t.ex. Component Oriented Programming, som ser ut att vara ett sätt att avhjälpa ovan nämnda problem, på ett sätt som känns överdrivet i små eller medelstora program.
Vill man läsa mycket text om det här och andra relaterade problem så finns det en hel del schyssta rants på den här sidan. Geocities, yo! Jag gillar t.ex. avsnitten under rubrikerna Granularity Problem och Do the Noun Shuffle. Kommunist-analogin är väldigt söt också.
Men eftersom det är allmänt erkänt att objekt-orientering är bra, och att det faktiskt är ett enkelt sätt att strukturera kod man skriver på, så lät jag mig övertygas. Att abstrakta datatyper är vettigt kan alla vara överens om, och det är lätt att tro att objekt-orientering i första hand handlar om att strukturera sin data i abstrakta datatyper. Men en abstrakt datatyp ska inte vara mer än inkapslad data. I typisk objekt-orienterad programmering blir datatyperna mycket fetare än vad de borde vara, eftersom man måste klämma in all funktionalitet i dem, även om den inte hör hemma där.
De största problemen jag ser med typisk objekt-orienterad design är:
1. Kontrollflödet blir svårt att följa, eftersom det sprids ut över en massa klasser. Algoritmer passar inte in i objekt-orienterad programmering.
2. Det är lätt att hemfalla åt bristfälliga vanor, där medlemsvariabler används istället för metodparametrar. Att använda medlemsvariabler på det här sätter är i stort sett lika illa som att använda globala variabler: metoder tenderar att ha sidoeffekter i onödan.
Den gemensamma roten till båda de här problemen är att objekt-orienterad programmering prioriterar data över algoritmer på ett sätt som gör att man måste använda skohorn för att få in algoritmerna i objekten. Algoritmer hör typiskt inte till ett visst objekt, utan sprids ut på ett mer eller mindre godtyckligt sätt mellan olika klasser. En viss bit funktionalitet hamnar i en viss klass för att den verkar höra hemma där mer än i någon annan klass, även om den inte egentligen hör hemma där.
Klasser blir typiskt mycket tyngre än de hade varit om metoder bara hade använts till vad de är menade att göra: att manipulera lokal data i det objekt de tillhör. Men algoritmerna måste in i något objekt, även om de egentligen inte hör hemma i något objekt, vilket gör att en klass som kanske egentligen skulle ha haft 10 vettiga metoder, kommer bestå av 10 vettiga metoder och 40 ovettiga.
Jag tror att det i de flesta fall är mer vettigt att dela upp sin kod i abstrakta datatyper, som man kan kalla för klasser om man vill, och gammal god strukturerad imperativ kod, som inte tillhör en viss klass. Då får man klasser som är enkla att förstå, eftersom de inte gör mer än vad de borde göra, och kontrollflöden som är enkla att förstå, eftersom de inte är utspridda över 10 olika klasser.
Enligt det här resonemanget så är språk som Objective C, Python och C++ mer vettiga än t.ex. Java, där allt är objekt. För allt är inte ett objekt. Sen finns det givetvis problem där objekt-orientering kan hjälpa, typiskt för att arv är bra i vissa situationer.
Bygger man stora system ska man titta närmare på t.ex. Component Oriented Programming, som ser ut att vara ett sätt att avhjälpa ovan nämnda problem, på ett sätt som känns överdrivet i små eller medelstora program.
Vill man läsa mycket text om det här och andra relaterade problem så finns det en hel del schyssta rants på den här sidan. Geocities, yo! Jag gillar t.ex. avsnitten under rubrikerna Granularity Problem och Do the Noun Shuffle. Kommunist-analogin är väldigt söt också.
2010-03-03
Missuppskattad
Design pattern för verkligheten: missuppskattat geni.
Ludwig Wittgenstein filosoferade på ett magiskt och sällan skådat djupsinnigt sätt kring kunskapens gränser. Positivistiska akademiker tog till sig små delar av hans budskap, feltolkade dem och utnämnde honom till profet. Tractatus förvandlades till ett manifest för språklig atomism. Var det när han bjöds in att tala på ett av Wienkretsens möten som han istället för att prata om logik läste poesi av Tagore? Filosofiska undersökningar förvandlades av ivriga analytiker till privatspråksargumentet.
Greven spelade gitarr och sjöng på ett sätt som förnyade och omformade black metal, trots att kopplingen till Bathory och Celtic Frost var stark. Om den första skivan hade släppts 2010 så hade den fortfarande varit ett under av originalitet. Mot sin vilja skapade han subgenre på subgenre, där hans musik urlakades och specialiserades, och ingen av epigonerna ville ta i galenskapen som kännetecknade de två första skivorna. Det var så enkelt att plocka upp tremolo-riffandet och skrikandet, och lämna det sårbara bakom sig.
Sen finns det säkert en massa andra exempel som skulle kunna passa, men som jag inte känner att jag riktigt kan ta ansvar för. Open source-rörelsen gjorde samma sak med Linux, nykantianerna hyllade Kant utan att ta sig an djupet och komplexiteten i hans tänkande, världseliten i längdskidåkning tog till sig skating-tekniken utan att följa upp Gunde Svans vansinniga experimentlusta, 80- och 90-talens klassorientering följde på Smalltalks radikala omformning av mjukvarudesign.
Kanske är det så det måste vara när man är alltför nyskapande. De flesta har förmågan att ta till sig en idé, eller kanske två, men kan inte vända sig om och se att det är dags att lämna allt gammalt bakom sig.
Det är sådant man kan diskutera när man promenerar mellan Guomao och Dawanglu.
Ludwig Wittgenstein filosoferade på ett magiskt och sällan skådat djupsinnigt sätt kring kunskapens gränser. Positivistiska akademiker tog till sig små delar av hans budskap, feltolkade dem och utnämnde honom till profet. Tractatus förvandlades till ett manifest för språklig atomism. Var det när han bjöds in att tala på ett av Wienkretsens möten som han istället för att prata om logik läste poesi av Tagore? Filosofiska undersökningar förvandlades av ivriga analytiker till privatspråksargumentet.
Greven spelade gitarr och sjöng på ett sätt som förnyade och omformade black metal, trots att kopplingen till Bathory och Celtic Frost var stark. Om den första skivan hade släppts 2010 så hade den fortfarande varit ett under av originalitet. Mot sin vilja skapade han subgenre på subgenre, där hans musik urlakades och specialiserades, och ingen av epigonerna ville ta i galenskapen som kännetecknade de två första skivorna. Det var så enkelt att plocka upp tremolo-riffandet och skrikandet, och lämna det sårbara bakom sig.
Sen finns det säkert en massa andra exempel som skulle kunna passa, men som jag inte känner att jag riktigt kan ta ansvar för. Open source-rörelsen gjorde samma sak med Linux, nykantianerna hyllade Kant utan att ta sig an djupet och komplexiteten i hans tänkande, världseliten i längdskidåkning tog till sig skating-tekniken utan att följa upp Gunde Svans vansinniga experimentlusta, 80- och 90-talens klassorientering följde på Smalltalks radikala omformning av mjukvarudesign.
Kanske är det så det måste vara när man är alltför nyskapande. De flesta har förmågan att ta till sig en idé, eller kanske två, men kan inte vända sig om och se att det är dags att lämna allt gammalt bakom sig.
Det är sådant man kan diskutera när man promenerar mellan Guomao och Dawanglu.
Etiketter:
burzum,
gunde svan,
Linux,
objektorientering,
wittgenstein
Pang på pungen i Peking
Tjenare, tjenare, hej!
Nu är jag hemma igen. Har varit i Kina ett par dagar och hälsat på Olof och Moxhuan i deras för tillfället kackerlackshemsökta lägenhet i Dawanglu. I Kina är internet-tillgången lite taskig, exempel på sajter som är blockerade är Facebook och Blogger, vilket gör att mitt internet krymper till ungefär hälften.
Men vi börjar med lite överblivna bilder från Korea, tycker jag, här är en tomte:
Här är en typ av lampa som jag såg på två olika barer:
Jävligt hitech lås på TAT-kontoret. Allt man behöver göra för att ta sig in där är alltså att hugga av mig mitt högra pekfinger och använda det som nyckel. Jag uppmanar inte till den typen av beteende!
Den här grejen fanns på hotellrummet. Jag har inte en aning om vad det är.
Men från Korea åkte jag alltså till Kina. Det var i lördags. Jag var som vanligt sparsam med att dokumentera mina äventyr i fotografisk form, men här är något av ett guldkorn från Dawanglu, en bild av mig och en lika glad kanin:
Här är det som blev över när vi ätit upp allt ätbart ur den här skålen:
Den här bilden kräver eftertanke. Vad menas? Friserar de behåringen mellan skinkorna, eller klipper de åsnor? Kanske tycker de bara att "ass" är ett coolt ord. Det tycker jag. Jag gillar att loggan är så avskalad och allmänt smakfull. Oavsett vad så är det här i Sihui, där jag puttrade runt igår.
I övrigt vet jag inte. Jag gick upp 7.30 i morse. Nu är klockan nästan 05.00 kinesisk tid. Jag borde gå och lägga mig.
Nu är jag hemma igen. Har varit i Kina ett par dagar och hälsat på Olof och Moxhuan i deras för tillfället kackerlackshemsökta lägenhet i Dawanglu. I Kina är internet-tillgången lite taskig, exempel på sajter som är blockerade är Facebook och Blogger, vilket gör att mitt internet krymper till ungefär hälften.
Men vi börjar med lite överblivna bilder från Korea, tycker jag, här är en tomte:
Här är en typ av lampa som jag såg på två olika barer:
Jävligt hitech lås på TAT-kontoret. Allt man behöver göra för att ta sig in där är alltså att hugga av mig mitt högra pekfinger och använda det som nyckel. Jag uppmanar inte till den typen av beteende!
Den här grejen fanns på hotellrummet. Jag har inte en aning om vad det är.
Men från Korea åkte jag alltså till Kina. Det var i lördags. Jag var som vanligt sparsam med att dokumentera mina äventyr i fotografisk form, men här är något av ett guldkorn från Dawanglu, en bild av mig och en lika glad kanin:
Här är det som blev över när vi ätit upp allt ätbart ur den här skålen:
Den här bilden kräver eftertanke. Vad menas? Friserar de behåringen mellan skinkorna, eller klipper de åsnor? Kanske tycker de bara att "ass" är ett coolt ord. Det tycker jag. Jag gillar att loggan är så avskalad och allmänt smakfull. Oavsett vad så är det här i Sihui, där jag puttrade runt igår.
I övrigt vet jag inte. Jag gick upp 7.30 i morse. Nu är klockan nästan 05.00 kinesisk tid. Jag borde gå och lägga mig.
Prenumerera på:
Inlägg (Atom)