Friday, 17 July 2015

Feitkepsrep in perspektieF



Hierdie inskrywing fokus op IT. Deel van die blog se funksie is om rekenaar-konsepte en/of akronieme te verduidelik. Indien jy heelwat van laasgenoemde weet, lees sommer vir die lekkerte. Ek verduidelik syfers en letters in binary asook ‘n cool trick om ‘n syfer na 8-bit binary om te skakel. En ‘n paar ander goete.

Tale fassineer my eindeloos. Ek kan egter slegs Afrikaans en Engels keurig besig. Ek kan ‘n klein bietjie Duits praat, maar ek kan hom nogals lees. Binnekort gaan ek Frans leer praat, sommer doodgewone generiese Frans. Skollie-Frans gaan iets wees soos Merci, my lani. Nee dankie. Terug by my grootword-woorde. Ek verstaan die tegniese aspekte van Afrikaans en Engels baie goed. Dit het eerstens te doen met my ouers wat taalonderwysers was en tweedens met ‘n doodgewone gesonde dialektiese belangstelling. ‘n Poliglot is ek allermins. Waar my woordfontein begin opdroog en krake wil-wil verskyn, raadpleeg ek die leksikografie: Collins, Oxford, WAT, HAT, die oorspronklike Webster (so dik soos 'n basaarpoeding), ‘n tweetalige bondel of drie. Ook my geheue. Soms wonder individue waarom woordeboeke óf (moet tóg van of-of seker maak – gravis of akuut – nie heeltemal seker nie) om my gedrapeer óf binne gryp-afstand lê - ek kan die taal dan "so lekka gooi". Wel, hoekom dínk jy kan ek die taal "so lekka gooi?" 

Op vyfjarige ouderdom is ek reeds uit die nes, kieriekuite, verkeerde das, verslete leertas en al. Loop my vas teen klaskamers vol stories, ‘n uitgebreide klasbiblioteek en ‘n blonde juffrou wat van klaspartytjies hou. Die alfabet ken ek reeds teen eerste pouse. Geen boek is bestand nie. Stenig my, maar ek verstaan nie lekker wat in die Bybel staan nie. Ons word egter toegelaat om die mense wat klipgooi te teken. Teen sub-b is ek hoogs verveeld met Boet en Saartjie en verskuif my kruishaar na die dorpsbiblioteek. Begin van vooraf al wat ‘n woord is opslurp. 

Ek is trots op my taalvaardigheid. Ek krimp ineen vir foutiewe sinkonstruksie. Ek begryp die brein se werking wanneer dit by woord-herkenning kom: slegs die eerste en laaste letter moet op die korrekte plekke verskyn. Dit skeld jou NIE van spelfoute kwyt NIE.  Indien nodig, kan ek foneties skryf. Skryf, nie tik nie. Die diakritiese skryftekens wat vir laasgenoemde benodig word, veral in Afrikaans, is problematies en haas onderontwikkeld. Ek kom agter dat fonetiese spelling deesdae besonder gewild is. Die probleem is dat die sondaars nie wéét wat fonetieka is nie – dit is hoe swak hulle spel. Fonetieka help met die uitspraak van woorde, veral in Frans waar heelwat letters op grond van die kombinasie van die letters either uitgespreek of nie uitgespreek word nie. Hebreeus en Pools is ‘n kaktus. Dit is sowaar slegs Pole wat in Pools kan tel – die res van die Westerse wêreld se tonge kry stuipe as hulle verby vier probeer kom. Dit is heel maklik om in Hebreeus te tel, maar om hom te skryf is verdomp vieslik. Om van die San-mense se klapklank-kommunikasie nie te praat nie. Jy is meer as welkom om jouself met die volgende khoi-san semantiek te martel:


Ek is voorts heeltemal in staat om Afrikaans met ‘n weersinwekkende aantal uitheemse woorde te vervuil. Wat ek van hier af gaan doen. Wanneer ek IT praat, ignoreer ek my eie (verskoon die pleonasme!) purisme en met goeie rede. Verbeel jou: Die SVE se gebrek aan klokspoed asook die hoeveelheid vlugtige geheue veroorsaak gebruikerskoppelvlak-opwipkieslyste en beïnvloed die koaksiale netwerkkoppelvlakkontroleerder op die verdeelbord. Uhm. Hoe se goed nou? Die tale waarby ek dus wil kom, is rekenaartale. Nie skeltaal (lees: kom haal hierdie stuk scrap van my tafel af voor ek hom en al sy parte met ‘n koevoet kletter!!) wat met menige gebruiker op ‘n Maandag geassosieer word nie – programmeringstale. 

Daar is talle en talle en talle tale. Ek het my eerste proesel in 1991 gekry. Logo was die titel, teken was die spel. Pen up, pen down, etc. Het DOS command line geleer en gebruik vandag nog CMD. Nie kans gekry om met Pascal en Turbo Pascal te werk nie – ek was reeds uit die skool uit en het meestal met GIS (Geographic Information Systems), vernaam vir spatial analysis, gewerk. So bietjie met PL/SQL, die procedural weergawe van SQL, gespeel. Nooit regtig vreeslik into dit gekom nie. Kan myself egter heel goed met SQL help. Object-oriented (OO) tale soos Java, PHP, Visual Basic – been there, done that, got the application. HTML en CSS is nie programmeringstale nie – HTML word vir structuring en CSS vir front-end web-GUI’s gebruik – maar ek code dit sonder moeite onder die invloed. GUI staan vir Graphical User Interface, m.a.w. dit wat jy voor jou sien as jy met ‘n tafelrekenaar, slimfoon, tablet ens. werk. Javascript kan deksels intricate raak. Dit is NIE dieselfde as Java nie en juis om daardie rede loop Java-coders hulself soms bloedneus teen Javascript. As ek régtig moet, kan ek met Javascript code. Wel, ek kan hom edit. 

‘n Taal wat ek geheel en al vermy, is Perl. Ek kon destyds nie kop of gat van sy sintaks uitmaak nie. Dit is steeds ‘n teerput. Ek weet dit is powerful, maar dit is te esoteries vir my liking. Later meer hieroor. Verder is daar tale soos C, C++, Python, Ruby, C#, F#, J++, JQuery. Dele van Windows word byvoorbeeld met C++ en C geskryf. Van al die tale waarvan ek weet, is Java waarskynlik die gewildste. Java het sy issues, sure, maar die WORA-sentiment (Write Once, Run Anywhere) asook die feit dat Java die core van Android-programming vorm, maak hom baie gewild. Daar bestaan ook ongelooflike cool IDE’s vir Java, veral Netbeans, Eclipse en JavaFX. IDE = Integrated Development Environment. Dit is ‘n GUI, soms met drag-en-drop features, waarbinne jy kan code. Kinders hou nogals van Alice, ‘n drag-and-drop-commands IDE wat in Java geskryf is. Dan is daar Greenfoot waarmee 2D-games (maar first-person perspective, as jy régtig jou storie ken, is moontlik) in Java geskryf kan word. Greenfoot help om die konsep van OO-programming te verstaan. 

Watter een van die spul is die moeilikste? Moeilike vraag. Ek vind dat dit afhang van wát jy probeer achieve. Party tale, soos Javascript, is meer geskik vir interaktiwiteit op websites. SQL is jou regterhand vir databasisse en data-manipulering. Word generate ‘n XML wat siektes veroorsaak. Java en C++ het duisende libraries wat jy stelselmatig moet memoriseer. C# herinner sterk aan Java. OO-programming is vir party studente moeilik om te begryp. Ek ervaar dat aspirant-programeerders wat nog nooit aan enige taal van watter aard ookal blootgestel is nie, met enige taal sukkel wat procedural abilities het.  Sommige kandidate sukkel selfs met HTML – hulle moet sover moontlik van procedural coding af wegbly, want  êrens gaan iets breek. OO-tale benodig wat bekend staan as ‘n compiler om die bronkode na iets wat die rekenaar se CPU kan verstaan, om te skakel. Hoekom? Eenvoudig. ‘n Rekenaar verstaan nie Engels of Afrikaans of Frans of Pools nie. Okay, niemand verstaan Pools nie. ‘n Rekenaar is onnosel – dit verstaan slegs 0 en 1, beter bekend as binêr. Binary vir die res. Dit is moontlik om in binêr te code, maar, prakties gesproke, onprakties. Om my naam te vertoon, lyk in binêr as volg: 01001010 01100101 01100001 01101110 00100000 01000100 01100101 01101011 01101011 01100101 01110010. Soos jy kan sien, bestaan elke letter uit ‘n kombinasie van nulle en ene, agt in totaal. Elke digit staan as ‘n bit bekend. 

Om te verstaan hoe binary werk, is eintlik baie maklik. Kom ons begin eers by die desimale stelsel. Kyk, as jy die syfers 0 – 9 gebruik om getalle te skryf, lyk dit as volg: 001, 002, 003, ... 009, 010. Sien jy wat gebeur? Die oomblik as jy by 9 uitkom, word die syfer aan die regterkant na 0 reset en word die middelste syfer met 1 vermeerder. So gaan jy aan tot jy weer by 9 uitkom: 010, 011, 012, ... 018, 019, 020. Dieselfde gebeur: die syfer heel regs reset na 0 en die middelste syfer word met 1 vermeerder. As jy finally by 099 uitkom en vérder wil tel, moet die patroon verder verander. In hierdie geval reset ALTWEE 9’s na nul en word die syfer heel links met 1 vermeerder. Wat vir jou 100 gee. En so gaan jy aan. 999 raak dus 1000. Die 9 kan dus nie méér as 9 raak nie, aangesien dit die hoogste syfer binne die desimale stelsel is. 

Binary werk op dieselfde prinsiep, met die verskil dat jy slegs twee syfers het om mee te werk, 0 en 1. As 0 na 1 verander, gaan die 1 dadelik terug na 0 verander. Wanneer dit gebeur, word ‘n ekstra 1 by die oorspronlike syfer se linkerkant gevoeg. Kom ons begin by 0. Okay, so 0 word 1. Die oomblik as die 1 na 0 reset, add ons die 1 aan sy linkerkant:

0
1
10
11

Right, so die 0 het weer 1 geraak. Ons het dus nou 11. Dis basically dieselfde as 99, m.a.w. jou digits het opgeraak. So wat gebeur volgende? Wel, beide ene raak nulle en jy voeg nóg ‘n 1 aan die linkerkant by. Jy het dus 100. En nou? Wel, alles herhaal:

100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
10000

Die syfer 1 is 1 in binary. 31 is dus 11111 en 00011111 is ook 31. 11111111 = 255.
Daar bestaan ‘n ou trick om vinnig te bepaal hoe ‘n syfer in binary lyk. Ons hou dit eenvoudig en werk slegs tot ‘n kombinasie van 8 nulle en ene. Sien >=0 as ‘n positiewe syfer en <0 as ‘n negatief, m.a.w. minder as 0. 0 as ‘n syfer is dus steeds positief. 'n Positiewe antwoord word as 1 geskryf; 'n negatiewe een as 0. Jy nou sufficiently deurmekruis? Mooi. Let's go.

Skryf die volgende neer:

128 – 64 – 32 – 16 - 8 – 4 – 2 – 1. 

Nou kies jy ‘n getal tussen 1 en 255 (11111111 = 255, die hoogste getal wat met 8-bit binary voorgestel kan word). Ek kies sommer randomly – 133. Okay, so nou doen jy aftreksomme.
133 – 128 = 5. Dit is positief – dus 1. Nou vat jy die antwoord asook die volgende syfer in die 128 – 64 – 32 sekwens, m.a.w. 64.

5 – 64 = -59. Die antwoord is ‘n negatiewe getal – dus 0.
5 – 32 = -27. Die antwoord is ‘n negatiewe getal – dus 0.
5 – 16 = -11. Die antwoord is ‘n negatiewe getal – dus 0.
5 – 8 = -3. Die antwoord is ‘n negatiewe getal – dus 0.
5 – 4 = 1. Die antwoord is ‘n positiewe getal – dus 1.
1 – 2 = -1. Die antwoord is ‘n negatiewe getal – dus 0.
1 – 1 = 0. Die antwoord is ‘n positiewe getal – dus 1.

133 in binary = 10000101

Die trick is om op te let na jou negatiewe antwoord. Jy kan nie ‘n negatiewe antwoord gebruik in jou aftreksom nie – dit MOET ‘n positiewe waarde bly. Die enigste manier om ‘n ander getal as 5 in ons voorbeeld te gebruik, is by die 5 – 4 som. Die antwoord is 1, wat natuurlik positief is. Dan eers gebruik jy 1 om die sekwens te voltooi.

Dit is eintlik heel maklik. Dit is ‘n bietjie meer ingewikkeld om letters in binary te skryf. Maar as jy wéét hoe dit werk, is dit eenvoudig. Dit is amper soos ‘n ID-nommer: elke syfer het ‘n baie spesifieke betekenis. 

Hoofletters word as 010 geskryf, kleinletters as 011, spasies as 00100000, punte as 00101110 en kommas as 00101100. Let jy op? Vir letters is die eerste twee binary codes ALTYD 01. Die derde karakter bepaal of die letter UPPERCASE (0) of lowercase (1) is. Die vierde karakter word bepaal deur wáár in die alfabet die letter voorkom: a tot o = 0 en p tot z = 1. Twee groepe dus. Daarna moet jy uitfigure die hoeveelste letter in die alfabet die letter is. G is byvoorbeeld die 7de letter, so jy moet weet wat 7 in binary is:

0
01 (1)
010 (2)
011 (3)
0100 (4)
0101 (5)
0110 (6)
0111 (7)

So G in binary is 01000111. Waar baie ouens deurmekaar raak, is by die letters p tot z, m.a.w. die 16de letter tot by die 26ste letter. Want 16 in binary is 10000, m.a.w. 5 karakters, nie 4 nie. Dit is presies waarom p tot z met ‘n 1 in binary voorgestel word. Die 1 substitute basically die 1 in 10000. Klink weird, nê? Hehehe, I know. Kom ons vat hom van ‘n kant af.

P is die 16de letter in die alfabet en 16 in binary is 10000. Wat binary nou doen, is om die groep waarin die letter voorkom te identifiseer, m.a.w. groep 2, m.a.w. 1. Daarna neem dit 16 in binary, 10000, en gooi die 1 weg. Indien dit NIE gebeur nie, sit jy met 010110000, wat foutief is. Die 1 in 10000 word dus met die 1 van groep 2 gesubstitute. So is Z dus 01011010 en nie 010111010 nie.

Dit is completely onprakties om apps in binary te code: bloedweinig (ek sê spesifiek bloedweinig, want ék weet van niemand nie) breine, maak nie saak hóé lateraal die denkproses nie, kan genoegsaam konsentreer om permanent tred te hou nie. Windows 10 kan nie eers in die jaar 2089 uitkom nie. Which is what will happen. Kom ek stel dit verder in perspektief: indien jy die ABC-alfabet in 8-bit binary wil skryf, gaan jy 26 X 8 = 208 karakters benodig. Dan kan jy binary in binary skryf. Dit raak completely crazy. Ek dink ons het establish dat binary nie soseer moeilik is nie, maar nie gewens vir coding is nie. 

Daar is voorts derduiwels soos Assembly waar daar ‘n sterk verband tussen die taal en die argitektuur van die rekenaar se laagste vlak instruksies bestaan. Baie programmers wat met high-level tale werk, verstaan steeds hoe assembly werk en het tot gevolg dat hulle ongelóóflike efficient code kan skryf. Dit help om binary te ken asook die hexademical notasie van binary en dan weer die decimal value van beide. En jy moet verstaan hoe registers werk. Ai Japie, nie cash registers nie. Binne die konteks verwys registers na ‘n klein hoeveelheid spasie wat, o.a., binne die CPU beskikbaar is. Ek weet dit klink Pools. Dit lyk Pools. Dit is esoteries en eksentriek. Normale (ek wonder soms hieroor: normaal. Wat is normaal? Is jou normaal en my normaal normaal of abnormaal binne die normaliteit van die absurde?) mense kry ‘n restraining order teen Assembly. Want dit is ‘n mal besigheid. Nodig, maar iensyn. Indien jy jou mind wil broaden, gaan lees gerus op oor Assembly en hoe Assembly deur ‘n assembler assemble word: https://en.wikipedia.org/wiki/Assembly_language#Assembler.
Die OO-tale is, in comparison, maklik. Nee blogger, jy is getik. O nê? Gaan kyk gou weer na binary. Enter perspektief. 

Nommer 1: jy tik jou commands in Engels. Jip, die mooi rooitaal. Ag mên, dount be ‘n vierkant – English are makliks ent eks.. ekspres... presseks... man, jy kan klomp goeters sê. Granted, OO-tale is effens obskuur. Twee plusse langs mekaar, hakies (lees: loop swot jou wiskunde!), operators, twee minusse langs mekaar – ons skryf en praat immers nie so nie. Maar dit is meestal Engels.

Nommer 2: jy tik jou commands in Engels. 

Nommer 3: sekere IDE’s laat jou toe om te drag en te drop en generate baie code outomaties. 

Nommer 4: die IDE’s is grotendeels in Engels. 

Nee wat, alles klink maklik! Hoe moeilik kan dit wees? Hokaai. Daar is steeds jare en jare se logical asook lateral thinking involved. Die sintaks asook hoe en waar en onder omstandighede en watter tipe funksionaliteit jy in gedagte het, veretter die besigheid lelik. Operators, data-types, libraries – dit raak daunting. Ek het byvoorbeeld verlede jaar, toe ek weer heavily into Java gekom het, ‘n sakrekenaar geskryf. Come to think of it, ek moet hom klaarmaak – ek moet die skeinat-funksies op ‘n  stadium byvoeg en die app oor die algemeen verbeter. Elk geval, die outjie doen nie net somme nie – hy verduidelik dit ook. In Afrikaans. Vir my mooi vrou het ek finansiële berekeninge bygevoeg. Vir onderwysers skaalsomme, conversions, berekeninge met tyd, berekeninge met sirkels ens. Ek het Netbeans as IDE ingespan. So lyk die GUI:



Die gedeelte waarmee ek nogals gesukkel het, was die logic agter tydsberekeninge. Nie die suiwer Wískunde agter die berekeninge nie – dit is maklik. Kyk gou hier: dit lyk nie eers moeilik nie! En dit is nie, maar om een of ander rede het ek lekker kleigetrap:

DateFormat dateFormat = new SimpleDateFormat("HH:mm");
Calendar now = Calendar.getInstance();
String itemText = (String)EastWestFromGreenwich.getSelectedItem();
    
meridian = Integer.parseInt(String.valueOf(txtMeridian2.getText()));
if("Oos".equals(itemText))
      {
now.add(Calendar.HOUR, (int) (meridian / 15));   //jy cast na 'n int toe
txtCalculatedTime.setText(dateFormat.format(now.getTime()));

} else
{
now.add(Calendar.HOUR, (int) (-1 - (meridian / 15)));
txtCalculatedTime.setText(dateFormat.format(now.getTime()));
}
           
Soos jy kan sien, feature Engels heeltyd. En ja, dit kan tricky wees. Maar heel doable.  

En dan is daar Malbolge. Vernoem na die agste sirkel van die hel in Dante se Inferno: malebolge. Nietige verskil in spelling. Was Malbolge maar nietig. Dit is ongelukkig onmoontlik om Inferno te lees en Malbolge te verstaan. So vee daardie idee uit.

Voor ek voortgaan, moet ek aandag aan esoteriese tale gee. Ek het reeds daarvan melding gemaak: Perl is nogals esoteries. Esoteriese programmeringstale, ook bekend as esolangs (esoteric languages), bestaan vir een rede en een rede alleen: om die kranium tot die uiterste limiet van die heelal te rek, te breek en tot ‘n nul te reduseer. Om die geheelonthouer na drank te dryf. Om die passifis op en af te laat spring terwyl hy/sy aanhoudend teen ‘n muur vashol. Esoteriese tale lyk nie naastenby dieselfde as OO-tale nie. Dit bestaan gewoonlik uit slegs ‘n handjievol karakters wat instruksies op grond van die kombinasie van die karakters uitvoer. Heelparty programmers voel dit is net daar om jou lewe te versuur. Ek kan egter heeltemal verstaan waarom esolangs tóg ‘n groot aanhang geniet – dit is ‘n uitdaging. Mens voel nogals goed as mens een van hulle of ‘n algoritme om ‘n program met een van hulle te skryf, uitfigure.

Daar bestaan ‘n magdom esolangs. Ek weet van ongeveer 970. Daardie getal is egter nooit set nie aangesien daar gedurig nuwe maniere van pyniging uitgedink word. ‘n Paar voorbeelde: Ook!, Whitespace, Doorspace, DZZZZ, J--, AutoMouse,  Duck Duck Goose, /// en Half-Broken Car in Heavy Traffic. Laasgenoemde is ridiculously difficult – I’m not even gonna go there. Perl is ‘n taal wat nogals van die logika agter /// gebruik maak – een van die redes waarom Perl my kêns maak. Maybe moet ek gou ‘n klein smakie van Perl gee, dat jy ‘n idee kan kry wat my plug met die taal is: 

if(exists $pats->{$name}) {
            if($sym eq '=') { $pats->{$name} = ''; }
            while($data) {
                $pats->{$name} .= '|' if($pats->{$name});
                my $p;
                if($data =~ s|^/(.*?[^\\])/\s*||) {
                    $p = $1;
                } elsif($data =~ s|^"(.*?[^\\])"\s*||) {
                    $p = $1;
                    $p =~ s/([^a-zA-Z0-9])/\\$1/g;
                    $p = "^($p)\$";
                }

En ‘n voorbeeld van ///:

/]
/]//] /]//][//]
[/|/<-\\\\>\\\\\\/]
[/QT/]
    [|/R|N|/Q|T|/|/<-|\|\>|/<-|\|\|\|\>|\|\|\|\|/|/<|\->|/|/]
    [C|T|/C|\T|/C|T|/|/*|\
]   [|/I|\N|/|/I|\N|/**|\
]   [|/]
    [|/Q|\T|/Q|T|/R|N]
[/]
[/RN/QT//<-\\>/<-\\\\>\\\\//<\->//]
[/CT/*
/]
[/Q\T/QT/RN

Wat éintlik crazy is, is dat /// nie so moeilik is nie! Dit behels basically text strings wat vervang word, afhangende van of die sintaks ‘n / of ‘n \ is en wat ná die \ of die / voorkom. Natuurlik moet jy kophou, maar dis nie so hectic nie. Ek dink aan /// soos wat ek aan ‘n “ binne ‘n concatenate-statement binne ‘n Excel-formule dink. Observe:

=CONCATENATE("""","""",""",""","(","(","""","(","(","""","\","|","~","|","/","''",")",")",")","""",")",")","""",",","""","""","""")

Dit is nie nonsensical nie – output word actually generate - maar die output sélf is useless. Behalwe as pattern-making soos wat soms in *.txt files gesien word jou ding is.

Indien jy die cell smaller maak en die volgende tik "\\\\\\\\\\\\\\\\\\\\\\","   ","//////////////////","   "," \\\\\\\\\\\\\\\\"," //////////////"," \\\\\\\\\\\\","                     ","//////////", eindig jy met 


Let wel: bostaande is NIE ‘n esolang nie – dit is sommer bietjie pret en om my leerders te leer om te konsentreer.
Dan is daar ‘n paar esolangs wat slegs gerookte mense moeite mee sal doen om te memoriseer: WTFZOMFG (What's That Function? Zen Optimized Malicious File Gophers!) en itflabtijtslwi (ignore this fancy little acronym, because this is just that slashes language with input – dit is ‘n variasie op ///). 

Kom ons gesels bietjie oor Ook!. Ook! is gebasseer op een van Terry Prachett se Discworld-characters. Indien jy Prachett ken, cool. Indien nie, nie cool. Gaan introduce jouself. Gister. Soos jy as Prachett-kenner weet, kan die karakter slegs Ook! sê. Ook! kry sy naam van die karakter se spraak. En dit is ‘n torturous affêre. Alles hang van kombinasies van Ook!, Ook? en Ook. af. Dit is bitter complicated. Binary is ‘n ligte briesie op ‘n warm somersdag in comparison. So lyk Hello, world! in Ook!: 

Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.

En dan is daar Malbolge. 

Kyk. Ek kan baie praat. Ek kan baie skryf. Maar Malbolge laat my sprakeloos. Die logic het met die ternary number system te doen wat ek ook nie verstaan nie. Wel, ek kan so tipe van uitpluis hoe ternary werk, maar ek beskik nie oor die woordeskat om dit wat ek wél verstaan te probeer verduidelik nie. Dit het te doen met die konsep dat logika in drie states (nee, nie die united states nie, alhoewel daai lot ook maar ‘n deurmekaarspul is) kan verkeer: false, true en neutral. Jy gebruik, o.a., -1, 0 en 1 vir die verskillende states. Dit verskil van Binary: in Binary het ons, indien jy recall, slegs 0 en 1, m.a.w. slegs false en true. Die geneuk is om uit te pluis hóé Malbolge met trinary werk. Jy moet, at the absolute bare minimum, low-level programming soos ons vrinne Assembly en Binary verstaan. ‘n Bare minimum verstaan dit en die barest of bare minimums van genoemde bare minimum, verstaan ternary binne die praktýk. 

Hier is Hello, World!: 

('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#"`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>

Mamma.

Slim mense het al Malbolge probeer. Ek gee jou 'n raai hoe lank dit geneem het voor daar 'n stel instruksies was wat actually korrek gecompile het. Twee jaar. Die ergste van alles is dat die code nie eens deur 'n mens geskryf was nie, maar deur 'n algorithm gegenerate is. Dit het sewe jaar geneem voor 'n korrekte 99 Bottles of Beer on the Wall program verskyn het. Dit is ongelooflik crazy. Hier is 'n klein uittreksel: 


b'`;$9!=IlXFiVwwvtPO0)pon%IHGFDV|dd@Q=+^:('&Y$#m!1S|.QOO=v('98$65aCB}0i.Tw+QPU'7qK#I20jiDVgG
S(bt<%@#!7~|4{y1xv.us+rp(om%lj"ig}fd"cx``uz]rwvYnslkTonPfOjiKgJeG]\EC_X]@[Z<R;VU7S6QP2N1LK-I
,GF(D'BA#?>7~;:9y16w43s10)p-,l*#(i&%e#d!~``{tyxZpuXsrTTongOkdMhg`Hd]ba`_^W@[ZYXW9UNSRQPOHMLK
J-++FE''<A$?>=<;:387xw43s10/(-&m*)('&}${d!~}|^zyxwvutmVqpiRQlkjiKafedc\E`_^@\[ZYX;V9NMRQ42NG
LK.IH*F?DCBA$#>7~;{{8xx5uu2rr/oo,ll)ii&f|e"!aw`{z\r[vXnmVTpongPkNihgJ_dcFa`B^]\UZ=RWV8TSLQ4O
N0LE.IHA)E>'BA:?!7~5|38y6/v321q).-&m*)i'&%|{d!~}_{zs\wvutsUqTonPlOjiKgJedFbE`_A]@[Z<X;VU7S6Q
P22GL/JIB+FEDC%;@?>7~;:987w5v32r0)p-,+k)('~g$#"b~w|uz]xwvutsrqTinQlOjLhgfeH]bE`CB]\>ZSXWVUTS
RQPON1LE.I,+*((&&$$""~~||zzxxv4u210/(-n+l)(i&g$ddy~}`u^]\ZvutVlUjSQQOOdMKgfeG]F[DBB@@>><<:VU
T6L5JO200EJ-HG*E>'B%$9>=<|4{2y05v321r).o,mlj(igg|#d!~}`uz]x[ZotWUUjoRmlkNibKJIGGEEZ_B]\?Z=XW
PU876442NM/KD-B+))''%%##!!}}{{yyw5v32s0q.-&+l)j'hff{"caav{^yxwZutslUpSnQOOdiLgfHHcba`Y^A\?Z=
;;PU8SRQ4ONMLEJ-,+))''%%##!=<;{3z1xvvttrrppnnll#j!&g$#d!b}|{zyr[vYtsrTjShQfkNihgJedcba`Y^A\?
Z=;WV9TSRQPOHM0K.-++)ED&B;$9"~<;:z2y0wuussqqoom+ljj!&%$dzcx}`{zy\wvutsrqjSnQPNNLhgIedG\EZCA]
\[=S<Q:886644220L/JIHA*)(&&$@?!=6}4{yywwuus10/o'n%lj('&f|ezcaa__]][wvuWmVkTRnQlkNLLaJIHFbE`_
B]@U>Y<;P9775533H1/KJ,HA*?(&&$$">=<|4{2ywwu321q)p'nl*k('gg${"c~a`^z]xwvYtmrUpSRPlOMMbK`IGGEE
Z_^]?U>S<::8866442200.JIH*@)>C&A@?"=<5|{8y65vtt10/(-n+lk"'&%e{dyb``^^\\ZvutVlUjSQmlkMcLaJHHF
bECCX]\[=S<Q:886R5PON1LKJCH+F)(=BA@"8!6}{{2y0543s+r)pnnlljjhhffddbb`|_zyx[vutslUTSQQOOMihgI_
H]FDDBB@@>><XWV8N7L5331MLK-C,A*(D'BA$""=<;:927xwvt2s0/p-n+*)('~%f#dcaa__]y\ZZotsrTjShQOkjiKa
J_HFFDDBB@@>><X;99NS6QPO2MLKJIHA*E('%%:#8=~;:9z7654321*/p-,m*k(hh}$#dyb}`{zy[qZoXVVTTRnmlNdM
bKIIGGEECCAA?[>YXWP9T76K42200.JI+G@)>'%A@?!7~5|zzx654t,s*qo-n+*jj!h%fec!b}|{^s\[vYWWlqTonQlO
jchKfIHFFDDB^]\>T=R;P9NS6QPO2MLE.-,*FED&<%:#!!}}{{yyw543s+r)pnnl*kii~%f#"caa|{zsx[ZutVrkTinQ
lkNiLgfe^cFEDYBW\[=YR;P977553O200EJIH*@)>C&$$9>!<;|9z7654-tsrppnnll#('&f|ezca}|{]s\qZXtsrTjS
hQOOMihgI_H]FDDB^A\[><<WVUTSLQ43NM/KD-BG*ED'B%@?>=<5:{zy0wuussqqoomm$ki'hff{"c~}`{t]\wvuWmVk
pSnmPNNcLKfIGG\aD_^A\?T=<;99775QPO1G0E.,HG)E>'<%#?"~~5:98x0w.ussq/pnn%*k('hff#z!ba|{z\r[puXs
rUpSnglONihgI_H]FDDYBW\[Z<R;P977553311//--++))'CBA#9"7<}:9z7x54-t1rq(ommkkiiggeecca}|{]s\qZX
tsrTjShQOkjiKaJ_HFFDDB^A\[==XWVOT7R542N1LKJ-HGF?D'B%$""7~5|zzxxv43s1*q(ommk)jhh}$e"!~a|{zyr[
vYXVVTTRRPPNNLLJJHH]FD`_A]V?TY<WVU8SRQPOHM0K.-++))''%%#?"~~5:9y70w.us1r/.-n+*)('~%fedbbw`u^\
xwvXnWlUSSQQOOMMKKIIGGEa`_AW@UZ=XW:U8SRQPONG0/.C,*FED&<%:#!!}}{{yywwuussqqo-n+*k(!h%f#"!aw`u
^\\ZZoXVrqpRhQfOMMKgfeG]F[DBB@\[Z<R;P97S6QP22GL/J-,*F)DCB%:?"!~||zz1x/432r*q(ommkkiiggeeccaa
_{^yx[vYtmVqTSQQOOMMKKIeHFF[`_A]V?T=;;9977553O2MLK.IHAF)('%%##!=~||3876v.u,sq/pnn%*)(h~g|ecc
aa__]][[YuXsrUSSnmleNMhgfH^G\aD_^A\?ZYXQ:98M644220LK-IB+@)''%%#?>=}5|3zxxv4u21r/p-,+*#(i&g$#
c!~av_t][[YutsUkTiRPPNNLLJJHHFFDDB^A\[Z=XWVUTM6Q43HM0..CH+FE''BA@?>=6;|9z765u-t+0q.-,m*)('&%
|#dcb``uzy[wpYnWUUSonmOeNcLJJHHFFDDBB@\?ZY<W:UTSRQPOH1L/.,,**(D'%%:?>=}5|3zxxvvttrrppn,m*)ii
&%$#"!~}v{^y\wvuWmVkpSnmlOjihgfedc\aD_BAV[Z<XQ:OT7RQPI2M0/--++)EDC%;$9"~~||zz1xvv-trrppn,m*)
(!hg$#c!xav_]yxwYoXmVTTRRPPNjihJ`I^GEECCAA??=Y<::OT7RQ4O2G0K.-BGFE'=&;$9"7<}:98y6/4ut10/o'n%
*kii~%f#"c~a|{t]x[ZXXVrqpRhQfOMMKKIIGGEECCA]@[Z<<WVUNS6Q431M0KJI,GFE>C&%$""7~|:9y70w.us10/o'
n%ljjhhffddb~a|{^\\wvutmVUTRnQlkNiLgfed]FE`_A]V?TY<WV977RQPONMF/.I,**?D'BA$?"=<;:981x5vussq/
.-m%l#jh&%$dzcxa_{zy[qZoXVrqpRhQfOMMKgJHH]ba`BXAV?=Y<WV88SRQPONMFK.I,+)E(CBA$?>=<;:927x5vuss
qqo-,+k#j!hffddbb``^^s\qZXXVVTpSQQfkNihg`IHcbaCYBW\?==RW:UT755J321FK.IH+F)>'B%$9"~~||zzxxvvt
210p(o&mkki'&%e{dyb``^z]xwvYtmrUTSQmlkMcLaJHdcbDZCXA?[><<QVUT6L5J31MLK-C,A*((&&$$""~<}:9zxx5
4-tsrp.o,+l)j'&}f#d!~}_u^s\ZZXXVrqpRhQfOMihJf_H]FDDB^]\>T=R;99775Q4ON00KJIBG*E('%A$?>=~;:927
xwvttr0/.n,m$)('g}f{"c~}`{^yxwvoXsVUSShQOkjLhaJ_HFba`BXAV?=YX:VO8M644220L/JI++FEDCB;@#>!<;:z
2y05v321r/.-,+$)j'hgeeccaa__]][wZXXmVkTiRPPNjMhgfIdcba`_XA@?==;;9977L5J31MLK-C,A*((&BA@"8!6}
{{y765u-t+rppn,m*)j'h%$#"!~}v{^y\[YutsUkTiRPPNNLhgfH^G\ECCAA??==;;9UTS5K4IN1LKJC,G*)''%%#?>=
}5|3zxxvvttrrppnnl*k('gg|e"c~a__ty\wvuXmVUTinmlNdMbKIedFb[DYB@\?==RWVU7M6K42N1LK.,,G@E('&$@#
>=~;|927xw4uss*/.n,%l#(i&%f#d!~w`{^][[YYWWlUjonmOeNcLJJHHFFDDB^A\[==XWVOT7R542N1LKJ-HGF?D'&%
:?"=<}:3z7xwuussqqo-,+k#j!h}fddb~}_{t]r[YYWWUqpoQgPeNLLJJHHFFDDBB@@>Z=XWV9N7R54I2GLKJ,B+@)''
%%#?>=}5|3zx654t,s*qoommkkiig%f#"bb}v{^y\wvuWmVkpSnmlOjchKJIGGEaD_^A\?ZYR;V986RQP2H1F/--++))
''%%##!=~;:zz765.3t1rq(-,+k#j!&g$#"c~}|uz]x[ZXtsrTjShQOOMMKKIIGGEECCAA?[><<QV9TSR5PONMF/.-+G
FE'=&;$""~~||zzxxvvttrrp.o,+ljj'&%$#z!ba|_]]rwZutWrUponmlejMLKIIGGEECCX]\[=S<Q:8TSR4J3H1F/DI

Verstaan jy? Ek ook! nie.

Dit is nie eers náástenby die helfte van die instruksies nie. Hoe lyk dit: voel jy dom? Moenie. Die gemors het geen maniere nie.

So moenie sommer sê iets is té moeilik om te achieve nie. Sure, sekere goed is onmoontlik, soos om ‘n muggie manderyns te leer. Maar behou áltyd perspektief. Dit is ongelooflik hoe jou sig kan verbeter.


No comments:

Post a Comment