Jag fanns svaret på allt mitt sökande på havrefraspaketet

Var hittar vi svaret på livets mysterium? Var finner vi svaret på frågan om livets mening? Jag har studerat vetenskap och filosofi. Jag har läst bibeln, upanishaderna, bhagavad gita, koranen och tao te ching. Jag har rest runt i världen och sökt efter andlighet bortom himalayas oländiga dalgångar och glaciärer. Vad jag då inte anade var att jag skulle komma hem och hitta svaret på baksidan av havrefraspaketet.

Ett paket havrefras kostar kanske runt tjugofem spänn. Säga vad man vill om det priset men man får ett gäng jävligt fina värderingar på köpet. Vi behöver knappast längre några präster, rabbiner, imamer eller gurus. Det räcker med havrefras.

Skämt åsido. Jag letade bland gamla urklipp och hittade den här grejen. Jag tror bestämt att jag rev bort den från ett havrefraspaket för ett par år sedan.  Jag fascinerades över hur tillverkarna av dessa frukostflingor måste ha tänkt när de bestämde sig för att ta sig in i livsåskådningsnischen. 

Fyra minuter och trettiotre sekunder

Vad är filosofi? Själv föredrar jag att se på filosofi som en relativt väl definierad analytisk verksamhet. En filosofisk analys innebär i många fall att man ägnar sig åt gränsdragningsproblem. Var går gränserna för vad som är konst, poesi eller musik eller matematik, psykologi eller fysik? Ibland dyker det upp nya konstriktningar som tvingar oss att ifrågasätta givna definitioner och gränsdragningar. Hugo Ball deklamerade 1916 ett av dadaismens klassiska stycken: ”blago bung blago bung bosso fataka”. Är det poesi? En som fått oss att undra lite över vad som verkligen är musik är kompositören John Cage. På Youtube hittar man flera av hans avantgardistiska pärlor. Vad sägs om hans mästerverk 4’33” för hel symfoniorkester. Jag kan bara hålla med den underbart passionerade presentatören: ”…there really is nothing like John Cages four minutes and thirty three seconds…”

 

Separation

Ordet separation låter ödesmättat, tungt och dystert men jag slås av att sinnesstämmningen verkar vara den motsatta. Ia och jag går runt i huset och plockar med grejer som ska fixas inför visningen. Jag slås av att vi båda som vanligt halvt omedvetet godmodigt gnolar/sjunger konstant när vi är upptagna med nåt. Antingen sjunger vi helt olika saker eller så stämmer vi in i samma låt. Stämningen känns förväntansfull och lite uppspelt som det brukar göra när vi drar igång nåt nytt projekt tillsammans. Fast vi får se hur långt den stora friheten varar. Ia har redan börjat lova bort mig till diverse väninnor och arbetskamrater.

C++ suger

”Vilket programmeringsspråk är bäst?” Ofta ser man denna fråga dyka upp i olika programmeringsforum på nätet. Sen följer med stor sannolikhet en hätsk debatt utan några gråskalor. Varje debattör framhåller ofta ett enda språk som det i särklass bästa: ”Ska man programmera på riktigt så är det bara X som gäller. Allt annat är skräp”. Inte sällan ser man en tendens att betrakta krånglig lågnivåprogrammering som ”finare” är enklare högnivåprogrammering.

Själv gillar jag att tänka på olika programmeringsspråk ungefär som olika konstformer: olja, akryl, akvarell, tusch, blyerts, torrnål, etsning, keramik, glas, skulptur… Vilken konstform är bäst? Ingen konstform är naturligtvis bäst. Men sen när vi kommer till den funktionella aspekten på specifika programmeringsuppdrag så finns det givetvis viktiga faktorer att ta i beaktande. Där kan man lätt ställa upp vissa tumregler. En sådan tumregel skulle kunna vara:

Eftersom tid är pengar – välj ett språk på så hög nivå som möjligt men som ändå på ett adekvat sätt löser uppgiften.

Ibland kanske den bästa lösningen är att göra den övergripande strukturen i ett högnivåspråk och sen programmera vissa resurskritiska procedurer i nåt lågnivåspråk. Det allra bästa är förstås om man kan utnyttja att någon annan redan har gjort den tidsödande lågnivåprogrammeringen tidigare. Om nån annan reda gjort jobbet förrut – varför uppfinna hjulet en gång till?

Om man på ett smart och kostnadseffektivt sätt vill bygga ett hus – varför först sätta sig ner och i minsta detalj designa alla spikar och skruvar?

Nu ska vi jämföra tre olika språk hur de kan lösa en konkret programmeringsuppgift – att räkna ut fakulteten av en miljard.

För de som inte är så matematiskt bevandrade kan jag säga att fakulteten av ett tal x är produkten av alla hela tal från ett upp till talet x. Fakulteten av 8 är alltså 1*2*3*4*5*6*7*8. Fakulteten sticker snabbt iväg och blir ruskigt stor för större tal. Fakulteten av 63 är ett tal som är större än det beräknade antalet partiklar i universum. Min TI-83 räknare kan nätt och jämt räkna ut fakulteten av 69. Det blir ungefär 1,7112 * 10^98. Högre än så klarar den inte.

Själv har på senaste tiden kommit att bli ganska förtjust i språket C# (C sharp). Det är ett språk som ligger på en slags mellannivå och har fördelar som vanligtvis tillkommer både hög- och lågnivåspråk. Här nedan är mitt C#-program för att räkna ut fakulteten på en miljard.

 

double ax = 1;

double ay = 0;

double x;

double NumberToDivideByPower = 0;

double NumberToDivideBy = 1;

DateTime t1 = DateTime.Now;

for (double b = 2; b <= 1000000000; b++)

{

    x = b / NumberToDivideBy;

    if (x == 10)

    {

        NumberToDivideBy *= 10;

        NumberToDivideByPower++;

        x = 1;

    }

    ay += NumberToDivideByPower;

    ax *= x;

    if (ax >= 10)

    {

        ax /= 10;

        ay++;

    }

}

TimeSpan tt = DateTime.Now – t1;

MessageBox.Show(”(1*10^9)! = ” + ax.ToString() + ” * 10 ^ ” + ay.ToString()

    + ”\r\n\r\n” + ”Tidsåtgång:” + tt.ToString());

 

På min 1,2 GHz laptop tar denna beräkning c:a 48 sekunder. Jag var emellertid inte nöjd. Jag tänkte att det borde gå att göra ett snabbare program med ett annat språk. Valet föll på C++.

 

Jag gjorde alltså en C++-version av ovanstående program men programmet ser i princip identiskt ut bortsett från att jag valt att ändra vissa variabeltyper för att uppnå bättre prestanda. I slutänden visar det sig ändå att C++ och C#-programmen i princip är lika snabba. Finns det ändå en chans att göra programmet snabbare? Svaret är förstås Assembler. Assemblerversionen jobbar lite annorlunda än C#/C++-versionerna. Mycket av matematiken sker på bit-nivå.

 

 

 

TITLE BillionFactorial     (BillionFactorial.asm)

 

; This program calculates the factorial of 1 billion very fast

; with four significant hexadecimal digits

; Last update: 2008-05-17

; by Gustav Bonds

 

.code

main PROC

 

    mov     eax,1          ; mantissa of factorial

    mov     ebx,1          ; counter from 1 to 1 billion

    mov     esi,0          ; power of two (LO DWORD)

    mov     edi,1000000000 ; 1 billion loop limit

    mov     ebp,0          ; power of two (HI DWORD)

 

startloop:

    inc     ebx                                  

    mul     ebx

    jnc     K4             ; You don’t need to do shrd at all

    bsr     ecx,edx        ; Bit scan right put result in cl (ecx)

    bt      eax,ecx        ; Check highest bit among the trimmed away ones

    jc      K2             ; Jump to the procedure where we increase EAX

    inc     cl

    shrd    eax,edx,cl     ; Shift right cl number of bits from EDX to EDA

    jmp     K3

K2:

    inc     cl

    shrd    eax,edx,cl

    inc     eax

K3:

    add     esi,ecx

    jnc     K4

    inc ebp

K4:

    cmp     ebx,edi        ; do we have 1 billion yet?

    jne     startloop      ; jump if not equal to startloop

    exit

main ENDP

END main

 

 

 

På bara 16,9 sekunder får vi svaret i hexadecimal form: A59E8867 * 2 ^ 6A0079F06 vilket decimalt motsvarar  ungefär 9,904 * 10 ^ 8 565 705 522. Visserligen har de båda andra programmen större precision men vill man prioritera rå snabbhet så kan man säga att C# och C++ suger. Assembler äger!

 

ET phone home – låt din laptop ringa hem och berätta när den blivit stulen

Tanken har slagit mig flera gånger att det vore smart att låta datorn skicka ett litet meddelande och berätta var den är så fort den blir ansluten till internet. På så vis skulle en eventuellt stulen dator kunna avslöja var den befinner sig. Men det visar sig att det finns fler som tänkt på denna idé och det saknas inte kommersiella tillämpningar. För något år sedan läste jag t.ex. om en student i Lund som hade installerat ett sånt s.k. spårningsprogram på sin laptop. Datorn blev stulen och polisen kunde sedan med hjälp av IP-numret som datorn hade skickat iväg gripa tjuven på bar gärning.

Det låter ju smart, eller hur. Varför har inte alla det på sin laptop, undrar man. Jag undersökte marknaden och fann att Dustin Home t.ex. säljer 3-års abbonemang på en produkt som kallas Smart Tracer. Det som fick mig att hicka till var priset: 4595 kr eller 187 kr i månaden! Visserligen så kunde man använda produkten till 5 datorer, men ändå! Vad är det man betalar för? Varför ska man betala 187 kr/mån för att ha en liten process på datorn som då och då skickar några bytes med info till en hemsida. Hutlöst. Jag vill inte betala något alls så varför inte göra ett eget hack. I går kväll skred jag till verket. C Sharp kändes som ett bra val av språk. Det borde vara en lätt match eftersom jag flera gånger tidigare skapat program som utbyter information med hemsidor. En viktig pusselbit fattades dock.

Alla program jag skapat tidigare har man varit tvungen att logga in först för att köra men i det här fallet vore det en väldig fördel om programmet skulle kunna ”ringa hem och skvallra” redan innan någon loggat in på datorn. Hur skulle det gå till? Eftersom jag kör Windows på datorn så ligger lösningen i att packetera programmet som en s.k. Windows Service. En sådan Windows Service kan ställas in att startas ”Automatic” vilket betyder att den startas direkt i samband med datorns uppstart. Ingen användare behöver logga in för att den ska funka. Nu, tjugofyra timmar senare, sitter jag här med min egen färdiga Windows Service som jag kallar ETPhoneHome. Nu är det bara att vänta på att datorn blir stulen så ska tjuvarna få se på andra bullar. Om internetuppkoppling för tillfället skulle saknas så försöker programmet om och om igen ända tills det får kontakt. Denna process är helt osynlig. Ingen märker något.

Ingen riktig hacker utan det riktiga språket.

Leder just nu på skolan en kurs i programmering. Vi skriver i C-sharp (C#). Det är kul att se ett gäng nybörjare som dag för dag blir alltmer självgående. Fast det klart, det är ju en bit kvar innan de blir några riktiga hackers. En essentiell del som saknas är det rätta språket, hackerjargongen, de rätta uttrycken. Därför så borde jag egentligen ge dem i läxa att plugga på ”Svenska Hackademins Ordlista”. Här nedan har jag gjort ett litet urval av en del viktiga uttryck och begrepp: =)

DYKA
Totalt systemsammanbrott i en dator. Kännetecknas av att systemet inte längre gör någonting. Innebär för det mesta att mycket arbete går förlorat. ”Datorn dök i går kväll”. Kallas även för att KRASCHA, STÖRTA, GÅ NER. När datorn är riktigt seg kraxar olycks- korparna ”Nu är den på väg ner.”, ”Nu dyker den snart.”.


Programmet stannar.

DÖD

Om utrustning, ej fungerande.

FISKMÅS
Namn på tecknet { eller } (vänster respektive höger fiskmås). Även kallade måsvingar.

FUCK ME HARDER
Brukar skrikas om datorn verkligen jävlas med en.

FULT
Används om ett program som gör något på ett (inte nödvändigtvis intelligent men) oväntat eller kraftfullt sätt. Kallas även att SMARTKODA, motsats till att RAKKODA som tar hand om saker på enklast sett med hjälp av ren, rå datorkraft.

HACKA
Att programmera. ”Vad gör du?” –”Jag hackar AMIS”.

HACKVÄRDE
Anledningen till att göra något till synes meningslöst, bara för att resultatet är en snygg hack. T.ex. är kommandot ”M-X Phase of the moon” i AMIS inlagt enbart för sitt höga hackvärde.

HALLÅ!
Vanligt utrop av hackers då systemet är trögt, dvs. det tar lång tid innan man får svar.

HISTORISKA SKÄL

Vanligt uttryck för att förklara varför t.ex. saker har så konstiga namn (t.ex. CAR och CDR i LISP: Contents of Address Register resp. Contents of Decrement Register, namn på halvord i en gammal IBM-dator), eller varför saker beter sig så kostigt.

HÅRIG
Onödigt invecklad, obegriplig. ”Kommandona till CHANGE är otroligt håriga!”

JAG SKA BARA
Vanligt utrop då en hacker blir avbruten av ett gäng andra hackers på väg att gå och äta. (Det är inte så lätt att bara avbryta mitt i en jättehack).

REKURSION

Se REKURSION.

Källa: Svenska Hackademins Ordlista