Category: General

  • SQL Server Dependency Browser

    SQL Server Dependency Browser

    SQL Server Dependency Browser for 2012 or later is made open source here.

    Installation: Sql2012DepSetup.exe

  • Föreläsning om Commodore 64

    Föreläsning om Commodore 64

    Tisdagen den 27 september kl. 18:00 bjuder ABF i Örebro på en föreläsning om Commodore 64, i ABF:s lokaler på Fredsgatan 18 i Örebro.

    Commodore 64 är fortfarande världens mest sålda hemdator, och trots att det gått 34 år sedan den introducerades på marknaden, släpps fortfarande nya spel till systemet, som fortfarande imponerar när det gäller grafik och ljud. Commodore 64 slog inte bara konkurrenterna Sinclair, Texas Instruments och Atari på fingrarna under 80-talet, utan lyckades överleva dem alla. Vad var det som gjorde att just Commodore 64 engagerade så många användare, programmerare, grafiker och musiker? Vad kunde datorn som inga andra system klarade av? Och vad är det som fortfarande lockar med just Commodore 64?

    Föreläsare är Anders Hesselbom som har varit hemdatoranvändare sedan 1982 och idag är en inbiten programmerare och Commodore-entusiast.
    I denna föreläsning berättar han varför just Commodore 64 sticker ut i jämförelse med andra system.

    Hörselslinga finns.
    Fika finns till försäljning

    Facebook-event finns här. Föreläsningen är gratis och öppen för allmänheten. Välkommen!

  • Commoflage 69

    Commoflage 69

    Jag hade den stora äran att bli inbjuden till podcasten Commoflage avsnitt 69, där vi bl.a. pratar Ghostbusters. Och som vanligt spelas det en hel del bra C64-musik. Klicka här för att komma till avsnittet.

    12116295_1507265992904073_867537746_o

    Jag kommenterar även den infekterade Ghostbusters-debatten på min blogg.

  • Captured (Lars Hård)

    Captured (Lars Hård)

    An attempt to cover the C64 classic Captured soundtrack by Lars Hård.

    Om du vill höra mer musik, mitt album från 2004 (tillsammans med Tommy Deile) finns på nätet här: Single Point of Failure – This time we are both

    Mina C64-covers finns här: http://www.remix64.com/act/anders-hesselbom/

    Dessutom, om du vill lyssna på mitt sommarprat i podcasten Kvack, om bl.a. min musik, så finns den här: http://kvackyou.se/2016/07/kvacksnack-sommar-2016-anders-hesselbom/

  • Freddie Mercury – Mr. Bad Guy (1985)

    Freddie Mercury – Mr. Bad Guy (1985)

    En kort recension av Freddie Mercurys “Mr. Bad Guy” från 1985.

  • Hur kan vi utnyttja evolutionen?

    Hur kan vi utnyttja evolutionen?

    Tack vare den ofrånkomliga utveckling som följer från förändring över tid, med selektion, och tack vare att vem som helst idag har tillgång till starka datorer, kan vi tämja evolutionen till att göra lite vad vi vill. Låt säga att jag t.ex. vill skapa ett korsord från en lista av ord. Antingen sätter jag mig ner och flätar orden manuellt, vilket kan vara nog så svårt. Eller så använder jag min PC för att skapa en algoritm som beskriver hur orden ska flätas ihop, vilket inte heller är speciellt enkelt.

    Fördelen med evolutionära algoritmer är att jag bara behöver veta vad jag vill åstadkomma – jag behöver inte tänka på hur något görs. Om det är ett korsord som ska byggas, så skulle jag kunna tänka mig att mitt indata är t.ex. 20 – de ord som ska flätas ihop till ett korsord. Om jag kan definiera vad ett bra korsord är, så kan jag göra ett urval. Och kan jag göra ett urval, så kan jag låta slumpen göra jobbet. Jag behöver även ha två regler: en regel som säger att t.ex. ordet ASKA inte får korsas med ordet PILBÅGE, och en regel som säger att om ordet ASKA ska korsas t.ex. med ordet MATROS, så måste det ske på någon av de gemensamma bokstäverna (vilket är S eller A).

    En tänkt initiering av korsordet skulle kunna vara att skapa 15 giltiga korsord genom att låta slumpen avgöra om ett ord ska vara vågrätt eller lodrätt, och sedan placera ut ordet på en tänkt matris, på en slumpvis utvald plats. Om ordet inte kan placeras på den plats som tilldelas, så slumpar vi fram en ny plats, så att reglerna upprätthålls. Detta upprepas för varje ord till dess att alla ord ligger på en giltig plats, vilket innebär att vi har ett giltigt korsord, om än förmodligen ett väldigt spretigt sådant.

    Dessa 15 korsord kan vi betrakta som en lista av föräldrar. Jag brukar jobba med två generationer – en föräldrageneration och en barngeneration. Och det är från någon av dessa 15 korsord som det perfekta korsordet ska komma.

    Nästa steg blir att låta varje korsord få 3 barn. Ett barn i detta fall är en kopia av ett korsord, med en slumpmässig förändring. Man kan låta slumpen avgöra om man ska positionera om ett ord, två ord eller tre ord. Man kan låta slumpen avgöra om något eller alla av dessa ord ska förvandlas från vågrätt till lodrätt, eller tvärt om. Vi som bygger evolutionära algoritmer har lånat en biologisk term för detta skeende, nämligen mutation. Barnen, 45 stycken, lagras i listan som representerar barngenerationen.

    Varje barn poängsätts efter hur väl det är anpassat till sin miljö (där miljö egentligen är mina kriterier). En liten area ger högre poäng än en stor area, antal intersektioner mellan ord ger poäng, en mer rektangulär form ger högre poäng än en mer långsmal form, och så vidare. När alla 45 barnkorsord är poängsatta, sparar jag de bästa 15 i föräldragenerationen, tömmer barngenerationen, och upprepar processen.

    Över tid kommer kvalitén (alltså likheten med mina kriterier) att förbättras, men om tillräckligt lång tid får passera så upphör förbättringen. Man kan tänka sig ett tröskelvärde som säger att om inte något korsord har förbättrats på, säg, 10 000 generationer, så är vi nöjda med vårt korsord – det korsord som har högst poäng.

    Och därmed har jag skapat ett korsord utan att själv vara förmögen att varken placera ut orden på egen hand eller beskriva den algoritm som skulle göra detta. Allt samman bygger på att nästan var och varannan person idag, i sin ficka, förvaltar något som för 20 år sedan skulle betraktas som en superdator.

  • Shadow of the Beast

    Shadow of the Beast

    My cover version of the soundtrack to the Amiga version of Shadow of the Beast, written by David Whittaker.

  • Pengar är ingen motivator

    Pengar är ingen motivator

    Arbetslösheten i Sverige har ökat stadigt sedan början av 70-talet, då den var 2%. Idag får vi räkna med att staten kostar pengar, att kommunerna kostar pengar, och att varje medborgare dessutom måste försörja 1/10 av en medmänniskas utgifter. Mycket få arbetslösa blir motiverade av betald utbildning och löfte om anställning – de som finner detta attraktivt återfinns bland den redan arbetande skaran.

    Till en viss grad kan man lösa problem med statens finanser genom att höja skatten. T.ex. anser rikspolischef Dan Eliasson att vi har för få poliser, vilket rimligtvis är ett problem som kan lösas med skattehöjningar, om inte omprioriteringar.

    Jag är själv anhängare av hypotesen att skatt kan vara ett styrmedel, vilket innebär att högre beskattning ger lägre konsumtion. I Sverige praktiseras detta på bensin, tobak och alkohol, men jag vet att idén inte är helt okontroversiell. Det finns dem som anser att hög skatt odiskutabelt leder till ökade inkomster för stat eller kommun. Rimligtvis anser alla att det finns en gräns, om inte annat när man passerar 100% inkomstskatt, och måste betala mer än man tjänar. Men de som kritiserar denna idé anser att man i alla tillstånd under 100% kan öka statens intäkter genom att höja skatten. Hur det än ligger till med denna sak, så är vi tvungna att förhålla oss – pengar är inte alltid en motivatör.

    Som invånare i Mellansverige kan jag konstatera att en arbetssökande “hen” här, har anmält till diskrimineringsombudsmannen (DO) att hen kallats för hon. Jag försvarar hens rätt att bli kränkt till döden, men om en kränkning ska anmälas till DO, har jag svårt att se vilket jobb som är lämpligt för hen. Det ligger i sakens natur att en anställning följer till att göra saker man kanske inte alltid vill göra, och att man utsätter sig för saker man inte alltid vill utsätta sig för. Även jag själv kan ibland sitta och skriva kod som visualiserar affärslogik medan jag drömmer om att bygga ett actionspel där rymdskepp jagas av laserkanoner. Och jag tänker inte låta mig övertalas att det finns någon hen i hela världen som har haft en mindre komplicerad uppväxt än vad jag själv har haft – jag råkar bara ha en omodern könsidentitet.

    Aftonbladet: Kallade “hen” för “hon” – anmäls för diskriminering

  • Hur hittar spöket Pac-Man?

    Hur hittar spöket Pac-Man?

    En mycket enkel men mycket effektiv algoritm som används i Pac-Man.

  • Gosbust 0.9.8

    Gosbust 0.9.8

    I have uploaded the latest version of Gostbust (0.8.9). The next thing to do is to build a proper tokenizer, and I thought I would publish the current version before starting that.

    Download it here.

  • Förberäknade spritebanor på Commodore 128

    Förberäknade spritebanor på Commodore 128

    Med anledning av hur långsam Commodore 128 var på att beräkna multiplikation och division, detta klipp visar hur man kan förberäkna banor för sprites.

  • AND, OR och EOR på MOS 6502

    AND, OR och EOR på MOS 6502

    Eftersom det är fredagskväll så kan jag bjuda på lite “fyllekodning”. AND, OR och EOR på MOS 6502 , mycket nöje!

  • Apple I

    Apple I

    There are an estimated six working Apple 1 machines in the world today. When sold, around 1976, the manual were more detailed on how the chips work than how to update ones Facebook status.

  • Lathund XAML: Reflektera förändringar vid data binding

    Lathund XAML: Reflektera förändringar vid data binding

    En enkel databindning (alltså databindning av en post) åstadkommer man i WPF genom att tilldela ett objekt till DataContext för containern av kontrollerna som ska bindas. Här har jag tilldelat ett namn till Grid-elementet som ligger på huvudfönstret från början, och placerat en TextBox däri som jag binder till propertyn FirstName.

    <Grid Name="theGrid">
       <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="283,103,0,0"
       TextWrapping="Wrap" VerticalAlignment="Top" Width="120"
       Text="{Binding FirstName}" />
    </Grid>

    Givet att programmet har tillgång till klassen Employee (förra exemplet) och att fönstret har en medlemsvariabeln (emp) av den typen, så kan vi i t.ex. Initialized-eventet göra tilldelningen till DataContext.

    this.emp = new Employee() { FirstName = "Sven" };
    this.theGrid.DataContext = this.emp;

    Om vi under resans gång försöker läsa av propertyn FirstName, så kommer eventuella ändringar som användaren gjort i det bundna textfältet att ha reflekterats tillbaka till propertyn. Om vi är intresserade av att validera inmatat data behöver vi kunna registrera valideringsregler från programmet på kontrollens container. I mitt lilla exempelprojekt heter root-namnrymden WpfApplication1.

    <Grid Name="theGrid" xmlns:val="clr-namespace:WpfApplication1">

    Klassen som sköter valideringen måste ärva från klassen ValidationRule. Notera att jag kallar valideringsklassen för NameValidationRule.

    class NameValidationRule : System.Windows.Controls.ValidationRule
    {
       public int MinLength { get; set; }
       public string ErrorMessage { get; set; }
    
       public override ValidationResult Validate(object value, CultureInfo cultureInfo)
       {
          var s = (value as string == null ? "" : value as string).Trim();
          if (s.Length < this.MinLength)
             return new ValidationResult(false, this.ErrorMessage);
          return new ValidationResult(true, null);
       }
    }

    Därefter använder jag den XML-namnrymd jag tidigare registrerade (val) när jag registrerar klassen NameValidationRule.

    <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="283,103,0,0"
       TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
       <Binding Path="FirstName">
          <Binding.ValidationRules>
             <val:NameValidationRule MinLength="2" ErrorMessage="Fel!" />
          </Binding.ValidationRules>
       </Binding>
    </TextBox>

    Slutligen, om jag vill använda kod för att detektera att inmatningen inte validerar så finns det flera metoder. Den enklaste är att använda kontrollens funktion GetBindingExpression som ger ett objekt som helt enkelt har en property som heter HasError.

    var binding = textBox.GetBindingExpression(TextBox.TextProperty);
    if (binding.HasError)
       return;

    Detta kan göras t.ex. när användaren klickar OK.

  • Grovhet

    Grovhet

    För många står oregelbundenhet i motsats till regelbundenhet, men i den matematiska världen står regelbundenhet i motsats till grovhet. Tänk dig att du ska mäta omkretsen på denna figur, en kochkurva:

    koch1

    Ju finare passare du använder för att mäta omkretsen, desto längre är omkretsen.

    passare

    En grov inställning på passaren kommer att ge mätvärden vars summa är mycket lägre, vilket innebär att den grova inställningen på mätinstrumentet ger ett resultat som beskriver en mindre grov figur.

    koch2

    En finare inställning på passaren kommer att ge mätvärden vars summa är mycket högre, vilket innebär att den fina inställningen på mätinstrumentet ger ett resultat som beskriver en grövre figur.

    koch3

    Denna egenskap gäller inte bara för kochkurvan utan även för en kustlinje eller en bergssiluett. Se gärna Benoît Mandelbrots föreläsning på TED. Mandelbrot är en fransk matematiker som givit namn åt mandelbrotfraktalen.

  • Delta

    Delta

    This is the result of today’s recording sessions. Delta, originally written and performed by Rob Hubbard, 1987.

  • Stora tal

    Stora tal

    Det finns ett mycket roligt klipp med karaktären Ali G där han ställer sig frågan om en dator någonsin kan räkna ut ett väldigt stort godtyckligt tal. Han får svaret att alla räkneövningar han kan nämna, kan räknas ut av en modern dator. Din miniräknare kommer förmodligen slå i taket när talen blir för stora, men en vanlig PC med Windows kan ge dig precis vilket svar som helst. Det krävs lite trixande under skalet för att få detta att fungera.

    Heltal representeras normalt av en bit-struktur, alltså ett antal ettor och nollor. Ett 32-bitars heltal är ett heltal som beskrivs av 32 bitar (4 bytes). Bitrepresentationen är liknar binärrepresentationen av ett tal, vilket innebär att både bitrepresentationen av talet 8 och binärrepresentationen av talet 8 är 1000. Ju större tal man vill beskriva, desto fler bitar behöver man ha, och förr eller senare slår man i taket.

    Men det finns en struktur i Windows som heter BigInteger som inte har någon begränsning när det kommer till heltalsrepresentationer och heltalsberäkningar. Det beror på att talen internt lagras som en teckensekvens istället för som ett bitmönster, där varje tecken i sin tur representeras av ett begränsat bitmönster. Då blir det hela en fråga om hur många tecken som får plats i minnet, vilket är väldigt många. För att få se vad BigInteger-strukturen kan göra, kan man skriva in en enkel kod i PowerShell som dubblerar ett tal ett antal gånger. Om jag börjar med talet 1 och dubblar det så får jag 2. Dubblar jag det så får jag 4, 8, 16, 32, 64, 128, 256, och så vidare. Ganska snart blir talet väldigt stort. Redan efter blott 100 dubbleringar landar man på talet 2 535 301 200 456 458 802 993 406 410 752 vars binära representation skulle bli väldigt stor. Men i en BigInteger-struktur är detta bara att betrakta som 31 tecken som avkodas till värden i turordning när beräkningar ska göras.

    Så utrustade med BigInteger-strukturen kan vi se vad som händer när vi dubblerar ett tal 500 gånger. För att göra detta, skriv:

    $x = New-Object System.Numerics.BigInteger 1; for ($i = 0; $i -le 500; $i++) { $x *= 2; Write-Output $x }

    PowerShell levererar svaret på ett ögonblick. Talet 1 dubblat 500 gånger ger oss talet 6 546 781 215 792 283 740 026 379 393 655 198 304 433 284 092 086 129 578 966 582 736 192 267 592 809 349 109 766 540 184 651 808 314 301 773 368 255 120 142 018 434 513 091 770 786 106 657 055 178 752, vilket är ett så stort tal att det nästan är omöjligt att läsa ut och förstå. För att underlätta kan man använda scientific notation. Istället för att skriva ut föregående tal i sin fulla längd, kan man skriva:

    6,55 * 10150

    Eller:

    6,55E150

    Båda varianterna säger oss att talet börjar på 6 och innehåller 150 siffror till därefter, varav de första nästkommande är 55 (avrundat). Det totala antalet siffror i talet är alltså antalet siffror till vänster om decimalavgränsaren plus talet till höger om E. 151 stycken.

    Så hur står sig en etta dubblerad femhundra gånger mot andra stora tal?

    Vårt observerbara Universum uppskattas innehålla 1,7 * 1011 (eller 1,7E11) galaxer. Uppskattningsvis finns 1024 (1E24) stjärnor i Universum.

    Båda dessa tal är alltså relativt små i jämförelse med den etta vi dubblade femhundra gånger. Hur är det med antalet atomer i vårt observerbara Universum? Faktum är att även det är ett relativt litet tal i detta sammanhang, nämligen 4 * 1080 (4E80), alltså en fyra följt av åttio nollor. 400 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000.

    Så låt oss dubbla vår etta femtusen gånger. Även det räknas fram kvickt av PowerShell. Svaret är 282 493 406 427 885 207 367 041 933 403 229 466 733 779 235 036 908 223 362 737 617 171 423 633 968 541 502 511 617 825 263 342 305 274 671 206 416 862 732 165 528 407 676 139 958 676 671 942 371 453 279 846 862 103 555 703 730 798 023 755 999 290 263 414 138 746 996 425 262 647 505 106 222 430 745 688 071 901 801 071 909 721 466 836 906 811 151 133 473 603 131 174 810 929 399 280 998 101 699 398 944 715 801 811 235 142 753 236 456 432 868 426 363 041 983 113 354 252 997 303 564 408 348 123 661 878 478 353 722 682 766 588 036 480 451 677 385 451 192 294 010 288 486 562 150 551 258 990 678 187 626 397 933 471 267 212 659 382 047 684 908 251 671 777 313 746 267 962 574 481 960 017 676 147 336 443 608 528 865 821 788 061 578 040 438 881 156 396 976 534 679 536 477 744 559 804 314 840 614 495 141 020 847 691 737 745 193 471 783 611 637 455 592 871 506 037 036 173 282 712 025 702 605 093 453 646 018 500 436 656 036 503 814 680 490 899 726 366 531 275 975 724 397 022 092 725 970 923 899 174 562 238 279 814 456 008 771 885 761 907 917 633 109 135 250 592 173 833 771 549 657 868 899 882 724 833 177 350 653 880 665 122 207 329 113 965 244 413 668 948 439 622 163 744 809 859 006 963 982 753 480 759 651 997 582 823 759 605 435 167 770 997 150 230 598 943 486 938 482 234 140 460 796 206 757 230 465 587 420 581 985 312 889 685 791 023 660 711 466 304 041 608 315 840 180 083 623 903 760 913 411 030 936 698 892 365 463 484 655 371 978 555 215 241 419 051 756 637 532 976 736 697 930 030 949 995 728 239 530 882 866 713 856 024 688 223 531 470 672 787 115 758 429 874 008 695 136 417 331 917 435 528 118 587 185 775 028 585 687 114 094 178 329 752 966 233 231 383 772 407 625 995 111 380 343 784 339 467 510 448 938 064 950 157 595 661 802 643 159 880 254 674 421 388 754 566 879 844 560 548 121 596 469 573 480 869 786 916 240 396 682 202 067 625 013 440 093 219 782 321 400 568 004 201 960 905 928 079 577 408 670 605 238 675 195 724 104 384 560 742 962 264 328 294 373 028 338 181 834 383 818 752.

    I scientific notation skrivs detta tal 2,82 * 101505 eller 2,82E1505. Med tanke på att vi ännu inte närmat oss någon bortre gräns, så kan man lugnt konstatera att den som äger en vanlig PC förvaltar en svindlande räkningskapacitet.

  • Gosbust 0.9.2

    Gosbust 0.9.2

    Version 0.9.2 av Gosbust finns nu att ladda hem. Tillåt mig presentera några exempel på vad aktuell version kan göra.

    Det stora tillskottet handlar om stödet för arrayer. Kommandot ARRY tar ett namn (A-Z, A#-Z#, A$-Z$ eller A?-Z?) samt önskat antal element. 5 ger fem element med index 0-4.

    ARRY A 5

    Detta kolliderar inte med en eventuell enskild buffer som heter A. R$ och R$[3] lagras i olika minnesstrukturer. För att nå individuella element används hakparenteser. Detta skapar ett slumptal i arrayen A’s första element:

    RAND A[0]

    Om jag läser av element 0 borde jag se ett heltal, vilket som helst men troligen inte 0.

    <<A[0]

    Element 1 borde däremot fortfarande ha värdet 0, eftersom ingen tilldelning gjorts än.

    <<A[1]

    Om jag skulle önska ha ett slumptal i samtliga element i arrayen A, kan jag ersätta indexet med tre punkter:

    RAND A[...]

    Nu kan jag läsa av vilket element som helst (0-4) och få ett värde. Om jag skulle önska se samtliga element så kan jag skriva följande:

    <<A[...]

    Modulus kan inte appliceras på samtliga element i en array, så skulle jag önska att alla slumptal ska ligga mellan 0 och 9 kan jag skriva följande:

    0>>I Mod: A[I]%10>>A[I] I++ I<10>>R? GOTO R? Mod

    Om du använvänder konsollen så skulle bubbelsortering av 10 tal mellan 0 och 99 skulle se ut så här:

    10 ARRY A 10 RAND A[...]
    20 0>>I Mod: A[I]%100>>A[I] I++ I<10>>R? GOTO R? Mod
    30 <<"Ej sorterat:" <<A[...]
    40 0>>I 0>>J
    50 Repeat: A[I]>A[J]>>S? GOSB S? Swap
    60 I++ I>9>>I? GOSB I? NextOuter GOTO 1 Repeat
    70 ShowResult: <<"Sorterat:" <<A[...]
    80 QUIT 0
    90 (Swap A[I]<>A[J] )
    100 (NextOuter 0>>I J++ J>9>>J? GOTO J? ShowResult )

    Notera att QUIT 0 lika gärna kan ersättas med RTRN. Om callstacken är tom har dessa två kommandon samma betydelse. Men om man skulle vilja avsluta med en felkod så kan QUIT n användas.

    (Om du läser in en fil istället för att använda konsollen behövs inte radnumren.)

    Mycket nöje!

  • Konsollen i Gosbust 0.9.1

    Konsollen i Gosbust 0.9.1

    En liten förhandstitt på vad som är på gång i Gosbust.

  • Lite roliga skivor

    Lite roliga skivor

    Medan jag städade och sorterade skivor så hittade jag några roliga som jag ville visa upp för världen. Mycket nöje!

  • Två nya podcastavsnitt

    Två nya podcastavsnitt

    I avsnitt 130 av Radio Houdi pratar vi bl.a. om nationaldagsfirande, gudomlig healing, rasism och Queen. Lyssna här!

    Och i avsnitt 57 av Commoflage gräver vi i vanlig ordning ner oss i den underbara C64-musiken. Lyssna här!

  • Nytt kodexempel – Gissa ett tal

    Nytt kodexempel – Gissa ett tal

    Gosbust finns i ny version (0.9) och med ett nytt exempelprogram. Följande fungerar med version 0.9 eller senare av Gosbust som finns att ladda ner här.

    0>>X
    /* Trolla fram ett slumptal mellan 1 och 100. */
    RAND C C%100>>C C++
    
    Restart:
    /* Fråga användaren efter ett tal mellan 1 och 100. */
    <<"Skriv ett tal mellan 1 och 100."
    X++ ->A$ A$>>A>>I? !I? GOTO I? Restart
    
    /* Sätt flaggor som beskriver om gissningen
    var rätt, för liten eller för stor. */
    A>C>>S? A<C>>L? A=C>>C?
    
    GOSB S? TooHigh
    GOSB L? TooLow
    GOTO C? Correct
    GOTO 1 Restart
    
    (TooHigh <<"För stort!" )
    (TooLow <<"För litet!" )
    Correct: <<"Rätt!" <<X

    guess

    Om du vill fuska, komplettera med <<C på raden före Restart: så ser du det rätta svaret på skärmen.

  • Excel-SM avgjort

    Excel-SM avgjort

    Då var första Excel-SM avgjort hos Microsoft i Akalla.

    11329978_1456121171351889_6754263162152353179_n

    Vinnaren Patrik Von Knorring (nedan) körde faktiskt Excel på svenska, lite som extra utmaning.

    10411080_1456128681351138_2790449441832854668_n

  • Introduktion till Gosbust

    Introduktion till Gosbust

    Efter mycket om och men så kan nu mitt programmeringsspråk Gosbust laddas hem. Ladda hem filen Gosbust.zip och packa upp innehållet, Gosbust.exe, på lämplig plats. Om du bara vill testa lite, duger skrivbordet bra. Om du vill köra ett eget program så kan du använda t.ex. Anteckningar för att skriva programmet, spara det och skicka det som argument till Gosbust.exe. Men om du bara vill titta på språket och labba lite, kan du starta Gosbust genom att dubbelklicka på Gosbust.exe. Du möts då av detta:

    gosbust

    Jag vill igen betona att detta programmeringsspråk är utvecklat lite som ett terapiprojekt, och är absolut inget jag förespråkar användning av, även om jag förmodligen kommer implementera något skarpt i detta bara-för-att… 😉

    Konsolen förstår några enkla kommandon och dessa presenteras för användaren när han startar Gosbust. Om man skriver något som konsolen inte förstår så skickas det vidare till kompilatorn som försöker exekvera. Om du vill testa något av de medföljande tre exempelprogrammen, skriv namnet på programmet. Gosbust visar källkoden för programmet och frågar om du vill köra. Varje gång du skriver RESET eller kör ett exempelprogram så töms minnet och du förlorar alla dina variabler.

    Gosbust version 0.8 känner till fyra olika datatyper. Heltal (32-bit), flyttal, bitar och strängar. För att skriva ut ett värde på skärmen, t.ex. ett heltal, skriv << direkt åtföljt av värdet som du vill skriva ut. Detta skriver ut talet 5:

    <<5

    Heltal känns igen av Gosbust på att de endast innehåller tecknen 0-9. Flyttal innehåller en punkt, bitar är en nolla eller en etta (0/1) och strängar är allt annat. Om du vill att Gosbust ska skriva Hej!, skriv:

    <<Hej!

    Däremot, om du vill att Gosbust ska skriva ut Hej världen! kan du inte skriva så här:

    <<Hej världen!

    Det bror på att Gosbust tror att du har skickat två instruktioner, och den andra (världen!) känns inte igen av kompilatorn. Om Hej världen! kapslas in av citattecken, så fungerar det som förväntat.

    <<"Hej världen!"

    Gosbust är typsäkert. När man lagrar data i en variabel, måste variabeln vara av den typ som datat man försöker lagra. Variablernas namn är i denna version begränsat till en bokstav och en eventuell typmarkör. Detta lagrar heltalet 10 i variabeln A:

    10>>A

    Du kan läsa av värdet av A genom att skriva <<A. Variabler som lagrar bitar heter A? till Z?, flyttal lagras i A# till Z# och strängar lagras i A$ till Z$. Det är inte tillåtet att läsa av en variabel som inte är initierad. Detta ger ett fel:

    <<A$

    Men om du först skriver t.ex. “Hej!”>>A$ kommer <<A$ att fungera. Om du vill radera minnet, skriv reset.

    gosbust2

    Provkör gärna testprogrammen genom att skriva fibonacci, fizzbuzz eller primes. Mycket nöje!

  • SKYpe? Apple?

    SKYpe? Apple?

    Knappt har vi vant oss att säga OneDrive istället för SkyDrive om Microsofts molnlagringstjänst innan DN meddelar att Microsofts telefontjänst Skype inte får heta Skype, eftersom det är för likt mediebolaget Sky.

    “Det är inte bara namnen med ordet “Sky” som liknar varandra utan även Skypes logotyp, med en molnformad kant runt namnet Skype, som skapar associationer till ordet “Sky”, menar domstolen.”

    Ja, vad är det egentligen som är vad här?

    Även Apple och Apple har bråkat om att namnen har varit lika, men eftersom Apple och Apple var i olika branscher – Apple säljer musik och Apple säljer datorer – så gjordes en överenskommelse om att så länge Apple håller sig borta från musikbranschen så kan man leva med förväxlingsrisken. När Apple sedan gav sig in i musikbranschen så valde Apple 2006 att stämma Apple. Apple vann. Apple fick använda sin logga för att lansera sin musiktjänst.

  • Fem nyheter i VB.NET 2015

    Fem nyheter i VB.NET 2015

    Nu när Visual Studio 2015 CTP finns att ladda hem, går det bra att testa vad som är nytt i senaste versionen av Visual Basic. Och i ärlighetens namn är det inte speciellt mycket som hänt i språket, men här är fem stycken guldkorn.

    Enterslag i strängar
    I tidigare versioner av VB.NET fanns inget sätt att ange att en sträng skulle innehålla radbryten. För att skapa en sträng med radbryten var man tvungen att t.ex. konkatenera in ControlChars.CrLf eller använda StringBuilder-objektets AppendLine. Men nu är det fullt tillåtet att skriva enterslagen direkt i källkoden. Detta exempel skapar en sträng innehållande tre textrader:

    Dim X = "Jag
    är en
    sträng med tre rader!"

    Stränginterpolering
    Och apropå strängar så stöder nu VB.NET stränginterpolering. Tidigare när man infogade variabla värden i en sträng använde man funktionen String.Format. I detta exempel är X och Y flyttal:

    Dim S =
       String.Format("Värdet av X är {0:n1} och y är {1:n1}",
       X, Y)

    Notera hur jag först anger mina platshållare i strängen, för att sedan låta övriga parametrar fylla dessa platshållare. Med prefixet $ kan jag stoppa in referenserna direkt in i strängen. Så istället för att först ange plats 0 och sedan fylla ut den med X, så kan jag direkt säga att jag vill ha in värdet av X i strängen. Och editorns IntelliSense hänger med!

    Dim S = $"Värdet av X är {X:n1} och y är {Y:n1}"

    Null propagation
    Tänk dig att du har en variabel som representerar en anställd (klassen Employee). Du vill läsa av dess property FirstName, så här:

    Dim N = E.FirstName

    Problemet är bara att variabeln E kan vara oinitierad, och i så fall uppstår NullReferenceException i programmet. Men du kanske vill ha ut förnamnet om det finns ett Employee-objekt i E, annars en tom sträng. Detta brukar VB-programmerare hantera så här:

    Dim N = If(E Is Nothing, "", E.FirstName)

    Med hjälp av null propagation kan man nu skriva så här:

    Dim N = E?.FirstName

    Om E är oinitierad (Nothing i VB), så är nu N en oinitierad strängvariabel.

    NameOf
    Igen, tänk dig att jag har en klass som heter Employee och att den har en property som heter FirstName. Om jag vill att en strängvariabel ska innehålla namnet på propertyn FirstName, kanske för att jag vill använda reflection mot ett objekt av typen Employee, skulle jag kunna göra så här:

    Dim S = "FirstName"

    Problemet med ovanstående kod är givetvis att om jag ger min property ett nytt namn så slutar koden att fungera, eftersom strängkonstanten “FirstName” inte längre delar namn med propertyn i fråga. Det har inte funnits något bra sätt att göra detta på i VB. Om jag t.ex. vet att FirstName är den första propertyn, kan jag förvisso skriva så här:

    Dim S = GetType(Employee).GetProperties()(0).Name

    Men detta är precis lika instabilt eftersom koden nu rasar om någon lägger till en ny property före FirstName. Men i VB.NET 2015 kan jag kort och gott skriva så här:

    Dim S = NameOf(E.FirstName)

    Nu kommer värdet “FirstName” lagras i S, och om vi refaktorerar koden, kommer ovanstående rad att följa efter.

    Kommentarer i LINQ
    Den sista språkliga förbättringen ger oss möjlighet att skapa kommentarer i en LINQ-fråga. Tänk att vi har en lista av Employee-objekt enligt följande:

    Dim X As New List(Of Employee)()
    X.Add(New Employee("Sven"))
    X.Add(New Employee("Gunnar"))

    Om jag vill ha en fråga som hämtar de objekt vars förnamn börjar på G, kan jag uttrycka mig så här:

    Dim Svar = From E In X
               Where E.FirstName.StartsWith("G")
               Select E

    Men om jag skulle få för mig att kommentera mitt i programsatsen, t.ex. efter X på rad 1, efter (“G”) på rad två eller efter E på rad 3, skulle programmet rasa.

    Dim Svar = From E In X                       'Men nu kan jag
               Where E.FirstName.StartsWith("G") 'kommentera
               Select E                          'vart jag vill!

    Avslutningsvis vill jag kommentera att kodeditorn fått sig ett rejält lyft, där det som sticker ut mest är en referensräknare på alla objekt man skapar – gissningsvis ett mycket efterfrågat tillägg.

  • Vad ska språket heta?

    Vad ska språket heta?

    Uppdatering 2015-05-02: Språket kommer att heta Gosbust – ett genialt namn med referenser både till andra språk, populärkultur och till nyckelord i detta språk. Upphovsmannen till namnet är anonym, men har fler fyndigheter på sin meritlista, t.ex. ordet som bättre än något annat beskriver kristendomens gud Jahve – UMO (Undetectable Mythological Object).

    Uppdatering 2015-05-03: Under ett tidigt stadium av språkets utveckling så skrev man A>>1 för att lagra 1 i variabeln A. Nu när Gosbust går att ladda hem är detta ändrat. Numera skriver man istället 1>>A för att lagra 1 i variabeln A. Uttrycket A>>1 ger ett kompileringsfel idag. Detta gäller för alla datatyper, och även för de underliggande instruktionerna. PUTI A 1 ska nu skrivas PUTI 1 A, där 1 är värdet som ska lagras och A är variabeln den ska lagras i.

    Först och främst vill jag betona att detta språk är lite av ett terapiarbete för mig – det kommer absolut inte lösa världsproblemen eller frälsa några programmerare. Parsern är inte hierarkisk och upplägget är inspirerat av Assembler på Commodore 128. Detta innebär att språket består av instruktioner, där varje instruktion alltid tar samma antal argument. Det innebär att man inte behöver ha olika separatorer mellan argumenten och mellan programsatserna. Om ett kommando tar två argument kommer kompilatorn att läsa två argument och sedan anta att det nästa som påträffas är nästa kommando. Som separator används whitespace (blanksteg, tabb eller enterslag), och det går bra att infoga flera whitespaces efter tycke, men endast på de platser där det ska vara whitespaces. Det går inte att undvika whitespaces där whitespaces förväntas.

    Följande kod placerar värdet 1 i heltalsvariabeln A, följt av en kommentar:

    PUTI A 1 /* Sparar 1 i A */

    Detta däremot kommer inte att fungera eftersom uttrycket 1/* inte är en giltig heltalskonstant:

    PUTI A 1/* Sparar 1 i A */

    Notera att variablernas datatyp härleds från deras namn. Variabler utan postfix, t.ex. A, B eller C antas vara 32-bitars heltal. Variabler vars namn slutar med $, t.ex. A$, B$ eller C$ antas vara strängar. Frågetecken betyder bit (t.ex. A?) och korsbrygga betyder flyttal (t.ex. A#).

    Det finns ett enkelt syntaxlager ovanpå instruktionerna som syftar till att öka läsbarheten. PUTI A 1 kan kortas ner till 1>>A. Detta program visar de 20 första talen i Fibonacci-sekvensen (utom 0):

    PUTI 1 A
    GETI A
    PUTI 1 B
    GETI B
    PUTI 0 X
    PROC Run
       ADDI A B C
       GETI C
       INCI X
       SWPI A B
       SWPI B C
       LETI X 18 J?
       GOTO J? Run
    GETS "Done!"

    Första raden placerar 1 i variabeln A. GETI A presenterar värdet av A. PROC Run markerar starten av en subrutin som kort och gott heter Run – subrutiner kan heta vad som helst, men om namnet består av något annat än bokstäverna A-Z måste namnet kapslas in av citattecken. Subrutiner körs även om de inte blir anropade, så efter PUTI X 0 (rad 5) kommer ADDI A B C (rad 7) att köras (fallthrough). ADDI A B C sparar summan av A och B i C, vilket kan kortas ner till A+B>>C. INCI X ökar X med 1, vilket kan kortas ner till X++. SWAPI A B låter värdet av A hamna i B och värdet av B hamna i A, vilket kan kortas ner till A<>B. LETI X 18 J? testar huruvida X är mindre än 18, och lagrar i så fall 1 i J?, annars 0. Detta kan kortas ner till X<18>>J?. Motsvarigheten heter GRTI. GOTO J? Run anropar subrutinen Run (i detta fall rekursivt) om värdet av J? är 1.

    Så här ser den korta versionen av mitt lilla Fibonacci-program ut:

    1>>A <<A 1>>B <<B 0>>X
    Run: A+B>>C <<C X++ A<>B B<>C X<18>>J?
    GOTO J? Run
    <<"Done!"

    Apropå anrop så finns två nyckelord för att anropa subrutiner: GOTO och GOSB. Skillnaden mellan dessa är att GOTO egentligen bara ändrar nuvarande exekveringspunkt, medan GOSB (“go sub”) dessutom lagrar vilken plats man lämnar i en enkel callstack. Subrutiner som anropas med GOSB kan lämna tillbaka kontrollen till den anropande koden genom instruktionen RTRN (“return”) som plockar ett värde från callstacken. Om RTRN används när callstacken är tom avslutas programmet.

    Trots att språket varken är färdigt eller släppt så finns redan konceptet som en Ruby DSL. Tack Jonas Elfström!

    Jag återkommer med fler kodsnuttar, och tar tacksamt emot tips på namn! (Dawkins är upptaget eftersom eftersom den berömde biologen Richard Dawkins faktiskt också har designat ett programmeringsspråk.)

    Uppdatering: Tidigare idag publicerade Roger Alsing en Fizz Buzz på Facebook. Finessen med hans Fizz Buzz var att den saknade tester, utan utnyttjade objektorienteringen i C# för att få till serien. Mitt språk är tyvärr inte objektorienterat, men så här ser en fungerande Fizz Buzz ut:

    1>>I
    Run:
       1>>C? I%3>>F F=0>>F? I%5>>B B=0>>B? F?&B?>>X?
       GOSB X? FizzBuzz
       GOSB B? Buzz
       GOSB F? Fizz
       GOSB C? NoFizzBuzz
       I++ I<101>>J?
       GOTO J? Run
    /* Quit! */
    RTRN
    
    /* Sub routines... */
    FizzBuzz: 0>>F? 0>>B? 0>>C? <<"Fizz Buzz" RTRN
    Buzz: 0>>F? 0>>C? <<"Buzz" RTRN
    Fizz: 0>>C? <<"Fizz" RTRN
    NoFizzBuzz: <<I RTRN
  • Sci-Fi World

    Sci-Fi World

    Det är ännu inte för sent att besöka Sci-Fi World i Stockholm, som har öppet även imorgon söndag. Jag spenderade lördagen där, och nördade loss rejält bland Magic-kort och D&D-tärningar. Väldigt mycket kretsade kring Stjärnornas Krig. Dragplåstren var Robert Patrick, Ray Park, Samantha Fox, Joe Cantillo och Sam Jones.

    Sam J. Jones spelade Flash Gordon 1980 (som Queen gjorde soundtracket till) och sig själv i filmen Ted.

    WP_20150425_008

    Detta är bilen Kit från tv-serien Knight Rider med David Hasselhoff:

    WP_20150425_027

    Har tar min dotter kort på mig och Samantha Fox (som sjöng in en låt till Terror på Elm Street 5):

    WP_20150425_011

    Detta är Robert Patrick som spelade T-1000 i filmen Terminator 2 och John Doggett i Arkiv X:

    WP_20150425_019

  • Betydelsen av ordet “nörd” är justerat

    Betydelsen av ordet “nörd” är justerat

    Mattias Boström twittrade (följ!) detta igår:

    “Nörd” har fått ändrad definition i nya SAOL-upplagan (upptill på bilden).

    Han bifogar två bilder föreställande den tidigare och den reviderade definitionen från Svenska Akademiens ordlista, där den tidigare lyder “enkelspårig och löjeväckande person, tönt” och den nya lyder “person som har ett stort specialintresse och som därför kan verka något enkelspårig“.

    Eventuellt kan min syn på ordet vara färgad av hur vi använde ordet på 80-talet eftersom jag knappt använt ordet sedan dess, men då var “nörd” svengelska för “nerd” som fortfarande är en nedsättande beskrivning av någon som är lite töntig. Men de som beskriver sig själva som nördar idag, väljer alltså inte ett negativt ord för att påvisa självdistans, utan ett ord som betraktas som relativt neutralt.

    Den som vill ta sig an kulturskatten av college- och high school-filmer från 80-talet kommer fortfarande komma i kontakt med “nördar” i ordets gamla bemärkelse, men dessa kanske vi ska benämna som “nerdar” idag för att visa kopplingen till det engelska ordet “nerd”.

    Vad sägs om höjdarfilmen “Nördarna kommer!” (Revenge of the nerds) från 1985:

    Eller klassikern “Drömtjejen” (Weird Science), också från 1985:

    Mycket nöje!

  • Commoflage 54

    Commoflage 54

    Lyssna gärna på Commoflage avsnitt 54 när Henrik Andersson och jag diskuterar bl.a. lagringshastigheter på Commodore 64. Mycket nöje!

    11083657_1436862563277750_203473098906490422_n

  • Färger i datorer

    Färger i datorer

    Under knappt hälften av den tid vi haft datorer, har dessa varit oförmögna att visa färggrafik. De har presenterat sitt utdata med tända eller släckta bildelement. De första datorerna hade ingen bildskärm alls. Datamaskinen ENIAC (1946) levererade sitt utdata i form av hål i pappskivor, och en av de första hemdatorerna, Altair 8800 (1974), hade några röda lysdioder. Rätt snabbt ansåg man att den mest effektiva metoden att presentera utdata var att visa “tecken” på en tv-skärm, som t.ex. Commodore PET (1977) gjorde. En svart skärm visade 40 x 25 gröna tecken som byggdes av 8 x 8 bildelement (pixlar), alltså 64 punkter per tecken och 320 x 200 punkter totalt. Datorer med bildskärm var alltså som regel monokroma på 70-talet, vilket betyder att de skiljer på tända eller släckta bildelement utan att lägga någon annan aspekt i bildelementens färg. Grafiken kostade bara en bit per pixel, alltså 8 kilobytes totalt (320 x 200 / 8 = 8000).

    År 1980 fick vi uppleva den första hemdatorn som kunde visa grafik i färg – TRS-80 Color Computer 1. Just färgen var så pass viktig att själva operativsystemet, en BASIC-interpretator, fick namnet Color BASIC 1.0. Om det är tillåtet att uttrycka sig i moderna mått: Datorn var utrustad med en processor på knappt 0,0009 gigahertz, vilket är klent jämfört med dagens mobiltelefoner som klarar kring 2,0 gigahertz (iPhone 6 har en processor på 1,6 GHz och Nokia Lumia 930 har en processor på 2,2 GHz). TRS-80 var utrustad med ett minne på 0,000004 GB (vilket kan jämföras med dagens standard på 8 GB) och den var helt utan sekundär lagring, vilket idag kan handla om hårddiskar på terabytes.

    Personligen stannade jag vid monokroma datorer ganska länge. Jag gick från Sinclair ZX81 till Luxor ABC80. När mina vänner började använda Vic 20, Sinclair Spectrum och Commodore 64, så harvade jag vidare med min ZX81 ända fram till år 1986 då jag fick tillgång till en Commodore 128 med en 1571:a som sekundär lagringsenhet, vilket både innebar att jag kunde avbryta mitt arbete på kvällen, och återuppta gårdagens arbete dagen efter, genom att återkalla det från sekundärminnet.

    På den tiden använde man alltså en bit per bildelement. Varje bildelement (eller pixel) utgör en punkt i den matris som utgör skärmbilden, och varje bildelement beskrevs av en bit. Commodore 64 hade en palett av på 16 olika färger, men en bild på 200 x 320 pixlar kunde bara visa två av dessa färger: En förgrundsfärg och en bakgrundsfärg. Varje bildelement kunde fortfarande bara vara tänt eller släckt. Men C64:an hade dessutom ett flerfärgsläge.

    Genom att para ihop två pixlar, fick man helt plötsligt två bitar per pixel. Förvisso var dessa pixlar större, vilket gjorde att grafiken blev kantigare, men nu kunde varje pixel (totalt 160 x 200 avlånga pixlar) beskriva ett värde av fyra tillgängliga (00, 01, 10 eller 11) istället för bara 0 eller 1. Därmed kunde C64 visa fyra av sina 16 färger på skärmen, om än på bekostnad av antalet pixlar. De fyra färgerna valdes från listan av 16 tillgängliga färger.

    Sedan har datorerna succesivt utrustats med mer grafikminne och större färgpalett. På 90-talet fanns persondatorer som med nästan fem gånger så hög upplösning (640 x 480 pixlar) kunde 256 färger ur en palett på 16,8 miljoner färger, vilket kräver 1 megabyte grafikminne. Varje pixel beskrevs av en byte istället för en bit, och varje byte var en referens till en palett.

    Idag har man dels betydligt fler bildelement på skärmen, och dessutom kostar man på sig hela tre bytes per bildelement. Detta ger oss 24 bitar per pixel, vilket ger oss möjlighet att ha 16,8 miljoner kombinationer av tända och släckta bitar per pixel. Därmed har vi eliminerat behovet av att ha en palett att hänvisa till – varje pixel kan beskriva en färg istället för bara en position i en palett, där de första 8 bitarna av 28 beskriver färgens röda del, de nästa 8 beskriver färgens gröna del och de sista 8 beskriver färgens blå del. Utifrån dessa tre färger kan vi få fram alla tänkbara färger genom additiv färgblandning.

    Att förstå additiv färgblandning är enkelt om man tänker sig att man befinner sig i ett vitt rum utan fönster eller belysning. Trots att rummet är vitt så ser vi bara svart, eftersom inget ljus kommer in i våra ögon. Men om du lyser med en röd ficklampa på den vita väggen, kommer åtminstone rött ljus att komma in i dina ögon. Den vita väggen reflekterar alla frekvenser, och eftersom endast rött ljus strålar mot väggen, är det endast rött ljus som kommer in i våra ögon. Men om vi samtidigt lyser med en grön ficklampa på samma punkt på väggen, kommer både röda och gröna strålar att reflekteras från väggen, vilket vi uppfattar som gul färg.

    Om vi låter varje pixel beskriva sin egen färg, men tänker oss att varje pixel endast består av tre bitar där den första representerar röd, den andra grön och den tredje blå, kan vi visa åtta olika färger.

    000 skulle vara svart, eftersom ingen av färgerna lyser.

    100 skulle ge röd färg, eftersom den första representerar röd. Av samma skäl skulle 010 vara grön och 001 vara blå.

    bild1

    Om vi istället för tre bitar (en per grundfärg) skulle ha sex bitar per pixel (två per grundfärg), behöver inte röd bara vara tänd eller släkt (0 eller 1). Nu kan vi säga att 00 betyder släckt, 01 betyder 33% röd, 10 betyder 67% röd och 11 betyder 100% röd.

    bild2

    Detta öppnar som synes för möjligheten att visa mörkröd, du kan nu skapa ljusröd (eller rosa) genom att visa mycket röd och lite grön och blå. Vi kan visa lite av alla färger och få grå, vi kan visa en färg som är på väg att bli lila utan att bara fullt lila. Vi kan även visa lite av varje färg, med övervikt på grön för att få en grågrön nyans.

    bild3

    Ju fler bitar vi avsätter för varje pixel, desto fler färger kan vi visa, men minnesåtgången blir såklart större. Och någonstans vid åtta bitar per färg, alltså 24 bitar, finns en bra kompromiss mellan minnesåtgång och bra återgivning. Det kan finnas anledningar att avsätta ännu fler bitar per pixel för den som vill göra avancerade manipulationer som drar ner bildens kvalité, så att man har en bild som tål att tappa kvalité utan att betraktaren märker något, men då drar man oftast ner bilden till 24 bitar när bilden är färdigmanipulerad och ska betraktas.

  • Nokia och SJ? Windows Phone och SJ?

    Nokia och SJ? Windows Phone och SJ?

    Vissa som kör Windows Phone, särskilt de som kör Nokia, får erfara att det är omständligt för SJ att läsa SMS-biljetten automatiskt, om det ens går. SJ’s personal brukar spekulera om orsaken, mest i form av artighetskonversation, men ingen verkar ha koll. Är Nokias skärm för blank? Är bakgrundsfärgen fel? Svaret är valet av typsnitt.

    SJ’s app letar efter en rektangel som består av fyra sifferrader. Beroende på vilka dessa siffror är, är inte marginalen alltid jämn, vilket syns på denna bild:

    wp_ss_20150319_0002

    En lösning på problemet skulle kunna vara att hålla ner fingret över SMS:biljetten så att context-menyn visas, välja att kopiera, och klistra in biljetten i OneNote, som av en händelse har ett typsnitt som visar alla siffror i samma bredd:

    wp_ss_20150319_0001

    Därför kan SJ läsa av biljetten på ett kick, om du först lägger den i OneNote.

  • Kom igång med C128 Assembler

    Kom igång med C128 Assembler

    Idag finns en hel del produkter för att utveckla program till Commodore 64 eller 128 på en modern PC, vilket är betydligt enklare än att göra det direkt på målmaskinen. Följ dessa steg för att komma igång med Assembler i Commodore 128.

    1. Ladda hem Vice. Vice emulerar de flesta Commodore-maskinerna, vilket förutom C64/C128 även innefattar Pet, Vic 20 och Commodore +4.

    2. Ladda hem CBM .prg Studio. Detta är en fullfjädrad integrerad utvecklingsmiljö för valfri Commodore-maskin.

    3. Starta CBM .prg Studio. Välj Tools -> Options. Klicka på fliken Emulator Control. Bocka för C128 och peka C128-emulatorn från Vice (filen x128.exe).

    4. Välj File -> New Project. Kryssa i C128, klicka Next. Vid Project Location, klicka Browse och välj var du vill spara din källkod. Därefter, klicka Next och Create.

    5. I fönstret Project Explorer, högerklicka på Assembly Files och välj Add New File. Tillhandahåll ett filnamn med filändelsen .asm.

    6. Det sista du måste göra för att komma igång, är att ange ditt programs startadress. Först i din .asm-fil, skriv:

    *=$2000

    Symbolen * representerar programmets start och $2000 är den hexadecimala representationen av 8192. Detta betyder alltså att ditt program startas med SYS 8192. När du väl börjar koda ditt program måste du tänka på att CBM .prg Studio antar att en indragning betyder att du vill göra en programsats. Låt säga att du vill förändra borderfärgen vars minnesadress är 53280 (D020 i hex), kan du skriva följande program (och notera indragningarna):

    *=$2000
            inc $D020
            brk

    Instruktionen inc ökar värdet med 1 på angiven minnesadress och brk avbryter programmet. Nu har du ett fungerande program. Öppna programmet genom att trycka på F5. Stäng fönstret som visar disassemblyn (Assembly Dump) och notera hur Vice visar en C128 med ditt program inläst i minnet. Om du vill kontrollera värdet av $D020, skriv:

    PRINT PEEK(53280)

    Notera värdet som står där, t.ex. 253. Starta ditt program genom att skriva:

    SYS 8192

    Och direkt därefter, tryck X följt av Enter för att lämna Commodore 128:ans maskinkodsmonitor. Eftersom programmet ökar värdet av 53280 med 1, borde borderfärgen nu vara ljusblå, eftersom ljusblå ligger som nästa färg efter ljusgrön. Och mycket riktigt, upprepa PRINT PEEK(53280) och konstatera att värdet har ökat med 1, till t.ex. 254.

    bild1

    Kör programmet igen genom att skriva SYS 8192 igen. Nu har vi ökat 53280 med 1 igen, vilket ger ljusgrå borderfärg. Om du vill kan du titta på disassemblyn innan du lämnar monitorn genom att skriva D2000 och sedan X.

    bild2

    När du är färdig kan du stänga emulatorn (eller emulatorerna) – en ny öppnas varje gång du kör programmet.

  • Lorenz-attraktionen

    Lorenz-attraktionen

    Läs gärna min text om Loernz-attraktionen, med tillhörande PowerShell-implementation, på Humanistbloggen!

    Uppdatering 2015-01-02: Jonas Elfström har översatt PowerShell-koden till Swift.

  • Färgpaletten i Acorn Electron

    Acorn Electron kan förvisso visa 16 olika färger, men kan bara visa 8 olika nyanser. Dessa unika nyanser ligger på position 0 till 7 på färgpaletten.

    0 – Svart
    1 – Röd
    2 – Grön
    3 – Gul
    4 – Blå
    5 – Lila
    6 – Turkos
    7 – Vit

    De resterande färgerna återanvänder dessa nyanser i blinkande form.

    8 – Blinkande svart/vit
    9 – Blinkande röd/turkos
    10 – Blinkande grön/lila
    11 – Blinkande gul/blå
    12 – Blinkande blå/gul
    13 – Blinkande lila/grön
    14 – Blinkande turkos/röd
    15 – Blinkande vit/svart

    För att se hur blinkande svart/vit ser ut bredvid blinkande vit/svart, testa gärna detta program:

    10 MODE 1
    20 VDU 19, 0, 0, 0, 0, 0
    30 VDU 19, 1, 8, 0, 0, 0
    40 VDU 19, 2, 15, 0, 0, 0
    50 GCOL 0, 1
    60 MOVE 50, 50
    70 DRAW 100, 50
    80 GCOL 0, 2
    90 MOVE 60, 60
    100 DRAW 110, 60

    Rad 10 anger 320 * 256 pixlar med fyra färger. Rad 20 anger att den virtuella färgen 0 betyder svart. Rad 30 anger att den virtuella färgen 1 betyder blinkande svart/vit. Rad 40 anger att den virtuella färgen 2 betyder blinkande vit/svart. Därefter (rad 50-70) ritas en kort horisontell linje i undre vänstra hörnet med färg 1 (blinkande svart/vit). Sist (rad 80-100) ritas en till kort horisontell linje strax ovanför till höger. Detta ger illusionen att linjen hoppar fram och tillbaka, eftersom när den ena är vit är den andra svart.

    Den första nollan i GCOL (rad 50 eller rad 80) betyder att pixlarna ska ritas, men genom att sätta andra värden där, kan man använda logiska operationer på pixlarna, som t.ex. OR, AND, EOR eller INVERT. Den andra siffran i GCOL är val av logisk färg.

    För att få bort de blinkande linjerna, rensa grafikminnet med kommandot CLG.

  • Grafiklägen i Acorn Electron

    Vissa av er kanske minns Acorn Electron från 1983. På den tiden var PC-datorer både relativt dyra och oförmögna att visa grafik. Företaget Acorn hade en billigare maskin i sortementet, Electron, som kunde avsätta 20 kb för grafik, vilket kunde innebära monokrom grafik 640 * 256 pixlar, eller så mycket som 16 färger i lågupplöst läge (160 * 256 pixlar).

    Acorn Electron  - Foto: Oscar Orallo
    Acorn Electron – Foto: Oscar Orallo

    Den som vill programmera sin Electron kan använda den inbyggda BBC Basic-tolken, där kommandot MODE 0 ger monokrom högupplöst grafik (första bilden) och MODE 2 ger lågupplöst grafik med 16 färger (andra bilden). Den som förväntar sig sexton olika nyanser kommer att bli besviken, och bör välja ett läge med färre färger – Electron kan bara visa 8 nyanser.

    bild1

    bild2

    För den som inte är beredd offra tjugotusen bytes för grafik kan använda sin Electron i text only-läge (40 * 25 tecken) för endast 8 k genom att skriva MODE 6. Givet att du väljer läge 2 så kan du använda alla 16 färger, vilket tyvärr handlar om svart (0) röd (1), grön, gul, blå, lila, turkos och vit (7), samt blinkande svart/vit (8), röd/cyan (9), grön/lila, gul/blå och deras omvända (12-15). Om du inte tror mig, bör du köra detta program som använder 320 * 256 pixlar med 4 färger (läge 1):

    10 MODE 1
    20 VDU 19, 0, 9
    30 PRINT "NU BLINKAR ROD OCH CYAN"
    40 PRINT "TRYCK ENTER."
    50 INPUT A$
    60 VDU 19, 0, 14
    70 PRINT "NU BLINKAR CYAN OCH ROD."

    Inte nog med att detta program illustrerar det bisarra med att avsätta minne för bit-kombinationer som egentligen inte är speciellt unika, programmet belyser dessutom något som ser ut som en bugg.

    Kommandot PRINT “TJOHEJ” ger utdatat TJOHEJ, såvida det inte föregås av VDU 19 – då tappar Electron bort tre bytes och ger HEJ, vilket illustreras av följande program, som förutom en massa vackra färger ger TJOHEJ och HEJ som utdata:

    10 PRINT "TJOHEJ"
    20 VDU 19, 0, 2
    30 PRINT "TJOHEJ"

    bild3

    Detta beror på att även om du inte behöver fler parametrar, lyssnar VDU 19 efter ytterligare tre bytes, och tar vad den kan få. Man löser problemet t.ex. genom att fylla upp med nollor.

    10 PRINT "TJOHEJ"
    20 VDU 19, 0, 2, 0, 0, 0
    30 PRINT "TJOHEJ"

    Ovanstående kod ger verkligen TJOHEJ följt av TJOHEJ.

  • Word 5.5 under DosBox

    DosBox är en DOS-emulator som fungerar under bl.a. Windows 8.1 som ger utmärkt stöd för att köra DOS-program i fönster eller i helskärmsläge (växla med Alt+Enter). Jag tror att det primära syftet är att kunna spela de gamla favoritspelen från 90-talet på sin moderna PC, men emulatorn öppnar även för andra tillämpningar.

    Jag laddade hem Microsoft Word 5.5 för DOS, och placerade den packade filen i en undermapp till mappen jag använder som hårdisk i DOS, i mitt fall C:\DosBox\Word\word.exe. Tänk på att DosBox ska vara startad när du ändrar i filsystemet.

    Med filen på plats kan man starta DosBox och göra mappen till sin C-disk genom följande kommando:

    MOUNT C C:\DosBox

    Sedan är det bara att skriva C: för att komma dit, och påbörja installationen. Installationen sker i två steg. Först ska Wd55_ben.exe köras, så att filerna packas upp. Därefter ska installationsprogrammet köras. Låt inte installationsprogrammet ändra i några inställningar eftersom DosBox redan styr upp allt som behöver styras upp.

    Efter installationen märkte jag att muspekaren inte reagerade som den skulle, men efter att ha avslutat Word och DosBox, och sedan startat dem igen, har jag inte märkt av det felet. Sen är det bara att flyga in i inställningarna och göra önskvärda inställningar, och börja skriva. Mycket nöje!

    För att hitta länken till installationsfilen Wd55_ben.exe, besök denna sida och sök reda på textstycket “If you just want to get your free Word for DOS, click this link and the almighty Microsoft download deity will cause it to appear on your PC”.

  • EaseUS Partition Master

    If a hard disk partition suddenly disappears and shows up in Disk Manager as unallocated space, the program EaseUS Partition Master solve the problem. The program can repair the partition and assign a drive letter to it, so that your files become available again.

    The program is free to use, but the installer would like to put a lot of junk in your computer. Also, the program will remain running after use, so remember to uninstall from the control panel when the program is no longer needed.

  • Installera GitHub på Windows

    Dessa steg installerar GitHub på Windows 8.1, och sjösätter ett projekt.

    1. Ladda hem GitHub för Windows.

    2. Installera genom att köra GitHubSetup.exe.

    3. Under tiden GitHub installerar, passa på att skaffa ett konto på github.com/join. När kontot är registrerat, måste det aktiveras.

    4. När installationen är klar, logga in i klientapplikationen.

    5. Ett repository motsvarar ett projekt. För att skapa ett repository, klicka på symbolen + i klientapplikationens dashboard, högst uppe till vänster. Ge projektet ett lämpligt namn, och välj var du vill ha källkodsfilerna lagrade. Därefter, klicka Create repository.

    6. För att börja arbeta mot GitHub, skapa ett nytt Visual Studio-projekt inuti mappen som utgör ditt repository, alternativt flytta in ett existerande Visual Studio-projekt i mappen som utgör ditt repository.

    7. GitHub reagerar genom att presentera texten Uncommitted changes. För att skicka filerna till GitHub, klicka Show bredvid texten Uncommited changes, fyll i fältet Summary och om så önskas även Description, och klicka Commit to master.

    8. Publicera projektet genom att klicka Publish Repository längst uppe till höger, och sedan Publish [namn på repository].

    9. Slutligen ska de övriga programmerarna anges. Öppna projektets hemsida genom att högerklicka på repositoryts namn till vänster, och välj View on GitHub.

    10. På projektets hemsida klicka + uppe till höger och välj New collaborator. Fyll en annan programmerares användarnamn och klicka Add collaborator. Upprepa så många gånger som behövs.

    Projektet är nu tillgängligt för de som pekats ut som collaborators.

  • SQL 2012 Dependency Browser

    SQL 2012 Dependency Browser is a simple application for viewing what database objects that depends on a specific object, for example what tables that are used by a view.

    Setup program for version 1.0 with build date 2014-11-24 can be downloaded using this link. Click here to download the executable only.

    SQL 2012 Dependency Browser