Time Expander: slideshow photograph 1
Time Expander: slideshow photograph 2
Time Expander: slideshow photograph 3
Time Expander: slideshow photograph 4
Time Expander: slideshow photograph 5

Blog

Pakke

Oculus Rift DK2 er på vei. Puls og blodtrykk er stigende. Har utviklet restless feet syndrome og kaffeinoverdoseteamet står på standby. Jeg er klar.

Dag 1:
Teksmelding fra Bring om at pakke er lastet opp på bil. Litt senere, så viser trackingsiden ett utleveringsforsøk. Etter jobb, så myste jeg lett forventningsfullt i postkassa etter pakkelapp.
No cigar.
Jeg ringte Bring og lure på om de kunne levere den på jobb.
No cigar.
Jeg ringte Bring og spurte pent om de kunne ringe meg når de kjørte ut pakken.
No cigar.
De var betalt av FedEx for to utleveringsforsøk, så de kunne ikke levere den på posten før de hadde forsøkt å levere den til meg to ganger. At jeg ikke var hjemme var av mindre betydning. De hadde i likhet med meg konstantert at svært få faktisk er hjemme i tidsrommet 0800-1600, men en avtale var tross alt en avtale.

Dag2:
Ukjent nummer på telefon!  Budet ringte likevel ! Kunne ikke levere på jobb, men vi avtalte en date på Statoil på Nardo. Budet var bare noen hundrede meter unna møteplassen, så tiden var knapp. Jeg la på sprang ut av lokalene på jobb og slengte meg i bilen. Raskeste vei var forbi Moholt kirke. Trafikken foran gikk helvetes tregt, så jeg la meg på hornet og fektet villt med armene – til begravelsesfølget – før jeg, passe irritert, blåste forbi.

Jeg kom fram til Statoil i god tid før budet og sto klar som et egg foran bilen for å vente på pakke. Budet kom, hilste og rullet ned vinduet. Med tårer i øya, så fortalte jeg at jeg hadde ventet på denne siden 19. Mai. Jeg var lykkelig.
Han overleverte meg deretter pakken. En liten pakke. Alt for liten til å være en Oculus. Fan. Det viste seg å være en presisjonschuck til CNC’en, som jeg helt hadde glemt at jeg hadde bestilt.

Og når jeg tenker meg om, så sa vel Oculus noe om at de også leverte med UPS og ikke FedEx.

Trondheim Maker Faire 2014

…var, såvidt jeg kan forstå, lite annet enn en vanvittig braksuksess. All ære til Alf Egil Bogen, Frode Halvorsen og crewet bak Trondheim Maker Faire. Dette står det virkelig respekt av. Trondheim by fikk seg et kraftig løft opp fra fotball-myra og denne helga var jeg, for første gang på ganske lenge, ganske så stolt av byen min. Mange tusen barn og voksne må ha vært innom i løpet av de to dagene det varte. Sol i øya og glade mennesker uansett hvor man rettet blikket. Merkelig nok, så glimret byens lokale medier med sitt fravær, selv om festivalen er omtalt i USA og forhåpentligvis også snart i Japan.

(Hedda på 9 år poserer sammen med en Storm Trooper fra Nordic Garrison.)

Gutta fra Polarworks presenterte sin nye og svært så lekre 3D-printer, som snart er produksjonsklar. Simen Svale Skogsrud (til venstre) står også bak den smått legendariske gcode planneren ved navn GRBL. Svært mange 3D-printer firmwarevarianter står på skuldrene til GRBL. Selv er jeg snart 48 år, men jeg har fremdeles lov til å ha helter. Jeg bøyde meg i støvet :)

Masakazu Takasu fra TeamLab i Japan kom ens ærend til Trondheim for å delta på Maker Faire. TeamLab startet som et maker space på 5 personer. De har nå over 400 ansatte og gjør massive installasjoner. Ekstra moro at han oppsøkte Hackheim sitt telt – spesifikt, da han jobber med en internasjonal maker space guide (Hitchhiker style :)). Han måtte nøye seg med det vi kunne vise fram i teltet, siden resten måtte lagres unna i en container, etter at Sintef fant ut at de ikke hadde plass til oss i brakkeriggen sin i teknologibyen Trondheim. Håper vi kommer sterkt tilbake fra nye lokaler i Munkegata om ikke så alt for lenge.


Noen vil sikkert dra kjensel på enkelte prosjekter fra bloggen her også. Bilde fra bakveggen i Hackeim sitt telt.

Tuva (, som neeesten er 13 ) på filmoppdrag for Trondheim Maker faire.

Hackheim sitt telt. Jeg tror vi gjorde mye rett. Lyd, lys & interaksjon fungerte som magneter på de små og ungene sto som klistert foran absolutt alt. Ungene fikk lov til å klå på alt de ikke kunne brenne fingrene på. Innsiden av 3D-printerne var off limits pga temperatur og klemfare, men så lenge nesa ikke var inni kabinettet var det greit. Götterdämmerung brøt dessverre sammen på dag 2, men Thing-O-maticen gikk som ei klokke i to økter a 6 timer. Den siste printet fløyter som vi delte ut mens de enda var varme. Til de voksnes store fortvilelse, så fikk ca 100 unger med seg 3D-printet fløyte hjem fra hackheimteltet.

Megahitten i teltet var banansynthesizeren. Jeg frykter at de som spekulerte i å shorte bananer på råvarebørsene kan ha gått på en liten karamell i helga. Midtbyen var tom for bananer og sitroner begynte å bli dyre ut på ettermiddagen. (Gutta måtte skifte bananer og sitron med ca 2 timers mellomrom) Av hysteriske bra øyeblikk kan nevnes:

  1. jordfeilen som medførte at vi fikk en psykedelisk loop-effekt som var fullt på høyde med det beste man kan finne i 70-talls ambient dub-scifipsychedelia. Banankeyboardet var en megahit blant store og små, og det var konstant kø for å få lov til å prøve.
  2. overgangene mellom “lisa-gikk-til-skolen”-type klimpring til noen som faktisk kunne spille keyboard. En kar leverte faktisk ganske bra akkorder på bananene. Synd vi ikke har opptak av dette, da det gikk sebrasangen en høy gang.
  3. Den lille gutten som klemte i overkant hardt på frukta, slik at gutta måtte enda en tur innom fruktdisken.
(Fra bananenes perspektiv, så var nok dette noe av det nærmeste man kunne komme et alien abduction-scenario mht probene.)
Megahit #2 var augmented reality-sandkassa. Denne var innertier for de minste. Der kunne de grave i sanda, mens en kinect og en prosjektør i taket sørget for simulert snø på sandfjellene og simulert vann i elvene som de gravde ut i sanda. Har dessverre ikke bilde av denne.

PS. For de som kjenner meg på FB, så anbefaler jeg også å ta en titt i Bjørn Borud sitt album “Maker Faire Trondheim 2014″, der vi har lagt ut enda flere bilder fra helga.

Maker Faire 2014 – Trondheim

Er du gjennomsnittlig teknisk interessert, og befinner deg i nærheten av Trondheim, så bør du definitivt holde av 29. og 30. August.

Trondheim Maker Faire vil komme til å okkupere halve torget i Trondheim i disse to dagene fra klokka 10.00 til klokka 16.00. 35 utstillere er registrert. Bruker du 10 minutter på hver stand, så trenger du 5 timer for å komme gjennom alt. I tillegg, så vil det kjøres presentasjoner og foredrag i DIGS sine lokaler.

Jeg gleder meg – veldig :)

Noen utvalgte prosjekter, som også har vært dokumentert på bloggen her kommer til å stilles ut i Hackheim sitt telt. Det ligger an til at Götterdämmerung, The Clockmaker, og Kanonstøperiet vil bli vist fram. Den gode gamle Thing-O-Matic’en får bli med for å printe småtterier som kan delers ut til besøkende. Jeg kommer også til å dra med meg noen Xenobirds. Jeg kommer sannsynligvis også å dra på meg brokk. Burde kanskje printe et brokkbind – just in case.

Det har vært hektisk aktivitet her de siste kveldene for å få Götterdämmerung og Betongklokka presentable. Firmware er oppdatert og blårøyken har ligget tett oppunder taket, men nå er alt faktisk klart. Kun bæring og rigging gjenstår.

Gleder meg voldsomt til å se POLARWORKS, Zenta, Nordic Garrison og Ultimaker 2. Funderer også på å snike meg til en scanning av Dimension 10. Billettene til Masakazu Takasu fra teamLab brenner allerede i lomma.

Bedre enn Bolia !

Har du noen gang vært på jakt etter ei bokhylle, men ikke funnet noen som passet akkurat der du vil ha den ? Jeg har vært på hver eneste interiørbutikk i Trondheim, browset på nett, og også skummet gjennom dyre designeralternativer – uten å finne det jeg trenger. Ingen lager tydeligvis bokhyller som passer der jeg har planlagt bokhylla mi.

Før i tiden, så laget de møblene sine selv. Jeg ser ingen grunn til å bryte med denne tradisjonen. I protest mot greed-drevet outsourcing, barnearbeid og grov utnyttelse av billig utenlandsk arbeidskraft, så har jeg derfor laget meg ei bokhylle – selv.

Materialkost: 278 kroner i eikeplater fra Clas Ohlsson, 25 spenn for ei gardinstang fra IKEA, En halvtimes tafsing i Fusion360 for å designe nødvendige monteringsbraketter og en liten 3D-printer.

Voila ! “Bokhylle i oljet eik, for montering ved pipe i villa” :

Code name “Götterdämmerung” – part 4

Det er alltid med hjertet i halsen at man vrir om tenningsnøkkelen på sin nyeste dommedagsmaskin. Så også med denne. Jeg lovet å publisere resultatene uansett hvordan dette prosjektet gikk, so here we go ! (again)

ABS-versjonen av printeren er ikke ferdig, men jeg har nå nådd et punkt der jeg har en fullt brukbar PLA-printer. Det er en såpass comfy milepæl at jeg tar meg tid til en liten statusrapport. Printeren er stor som en vaskemaskin og  X/Y-mekanismen er basert på 1.8A steppere. Disse er kraftige/kjappe nok til at det ikke frister å putte kotelettfingrene sine inni kammeret når den er i drift. At noe er stort, betyr ikke at det ikke kan bevege seg raskere enn refreshraten til øyet ditt.

Kort oppsummert, så kan jeg vel konkludere med at den virker over all forventning. Jeg har så langt kjørt to ganske store printjobber, som hver har tatt 4+ timer uten at noe har tatt fyr og uten at den har spist opp seg selv. Jeg ble faktisk litt satt ut av at den i det hele tatt virket, men jeg har jo i praksis ikke gjort annet enn å lage en ramme som holder litt belter og steppermotorer på plass. Alle de tunge løftene er jo gjort av andre. D.v.s. de som har bidratt inn i den åpne programvaren og maskinvaren som er i hjertet av printeren (se credit-lista på videoen til slutt).

Jeg registrerer at tilsvarende printerprosjekt har hanket inn en million USD på Kickstarter  (eks Rigidbot, som forøvrig baserer seg på en mye mindre rigid konstruksjon enn Götterdämmerung, samt har en enorm designsvakhet i form av en plattform som beveger seg i printplanet), men det er litt for mange aktører der ute til at jeg føler for å starte et slikt løp. Jeg har tross alt en dagjobb.

I likhet med 99% av de andre printerne der ute (også de fleste på Kickstarter), så er denne basert på Open Source og er designet med gratis programvare. Jeg deler derfor designet på GitHub. Skulle fan meg bare mangle.

Printeren er såpass stor at  det er vanskelig å ha alt i synsfeltet samtidig når man mekker på den. Jeg trengte bildemateriale til denne bloggposten, så jeg fyrte i gang en fire-timers printjobb uten å ha fått med meg at jeg hadde glemt å skru fast 4 idlere. Star Wars-hjelmen på bildet under fikk derfor udda striper og så ikke så bra ut. Men den var schwær, selv om jeg bare benyttet 1/8 av det totale printvolumet.

Hvis jeg vil, så får jeg faktisk plass til hele den gamle 3D-printeren min inni byggekammeret på den nye (selv om det er ren galskap å forvente å skulle printe noe som fyller hele volumet. For eksempelvis en solid kuleform, så vil byggetiden være proporsjonal med kuben av radius. Selv med en hastighet på 150 mm/s, så vokser denne funksjonen såpass raskt at en potteplante vil kunne vokse raskere enn objekter over en viss størrelse vil kunne vokse i printkammeret.

Heldigvis, så kan en for mange formål slippe unna med å printe skall, eller med svært lav infill. Det er også litt ok å kunne strekke seg ut i en eller to akser, eksempelvis hvis man går svanger med et droneprosjekt, eller vil printe bein til en strandbeest-basert walker.

(Første testprint. 15x15x15 cm. 300 mikrometer z-oppløsning – og 4 løse skruer i konstruksjonen…)

Andre testprint gikk en del bedre. Ekornet under er printet med en vertikal oppløsning på 100 mikrometer (10 lag pr mm). Jeg er overbevist om at jeg kan komme ned på 25 mikrometer, men så lenge man kan printe funksjonelle objekter med lavere oppløsning, så er det en lite meningsfylt øvelse.

(5x5x3 cm. 100 mikrometer z-oppløsning. Litt uheldig med de første lagene pga litt for stor avstand til underlaget.)

Det som jeg tror mange ikke riktig har fått med seg er at de fleste 3D-printere kan klemme ut av seg objekter med en helt avsindig bra kvalitet uten å øke oppløsninga. Ved å bruke litt tid på kalibrering av slicerparametre (hastighet, aksellerasjon, temperatur etc) , så kan man få helt akseptable resultater selv med en “standard” oppløsning på 300 mikrometer. Under har jeg printet en vase I PLA. Den er 20 cm høy og 10 cm i diameter. Veggene er 0,8 mm tykke.

(Tredje testprint. 20 x 10 x 10 cm. 300 mikrometer oppløsning)

(Nærbilde av et ca 3×3 cm stort felt på vasen på bildet over. Bildet viser hvor jevne lagene kan bli, selv ved 300 mikrometer.)

Jeg har tidligere utelukkende printet i ABS. Intensjonen med den nye printeren var å lage en ABS-printer med varmekammer. Jeg har prototypen til kammeret klar, og har printet delene til toppen av kammeret. Etter å ha lekt litt med PLA, så er jeg nesten litt usikker på hvorfor jeg trenger varmekammer – og jeg lurer voldsomt på hvorfor Makerbot sin Z18 (som er “optimalisert for PLA”) trenger varmekammer. Det jeg trengte for å printe stort med PLA var ikke varme, men kjøling.

ABS har bedre mekaniske egenskaper og er litt mer behagelig å jobbe med, men det krymper og warper når man printer over en viss størrelse. PLA er i overkant nedbrytbart og begynner gjerne å sagge ved temperaturer man kjapt kommer opp i i eksempelvis en varm bil som står i sola. Likevel, så vil jeg tro at det er helsikes mange design som kan benytte PLA istedet for ABS. Videre, så skjer det en rivende utvikling mht filamenter for FDM. Det er et digert hull i markedet for filamenter med ABS-lignende egenskaper, men som ikke krymper ved faseoverganger. Jeg er rimelig trygg på at noen der ute jobber iherdig med å fylle dette hullet.

Jeg har som sagt designet for varmekammeret rimelig klart, men det er litt knotete, da det baserer seg på en intern kasse, der drivaksler går gjennom bunnen av kassa (forsøker å holde flest mulig plastkomponenter på utsiden). Jeg funderer på om jeg skal kaste dette designet på båten og heller kanskje gå for en mindre klunky ekstern kasse (med X/Ygardin på toppen). Hvis jeg holder makstemperaturen under 70-80 grader (som _kan_ være tilstrekkelig for enkelte varianter av ABS mht å unngå warp), så bør komponentene inni overleve. Vi får se hvor det bærer hen. Det er definitivt verdt et forsøk.

Funderer du på å bygge deg din egen Götterdämmerung så bør du lese følgende punkter:

  • Alle designfiler er publisert på https://github.com/hansj66/Gotterdammerung-3D-printer. Filene er i .STP-format, slik at du kan importere dem i eksempelvis Fusion 360 og også endre dem (I motsetning til mange andre puddinger som kun publiserer STL, som er et usedvanlig crappy utgangspunkt for å gjøre tilpasninger / endringer). Du finner en liste over nødvendige materialer (som er cöse, men kanskje ikke helt komplett), designfiler, samt konfigurasjonsfil for Marlin.
  • Designer skalerer. Du kan bygge den så stor eller liten du ønsker. Kun plate og lengder på profiler, stål og drivaksler må kappes til ønsket dimensjon.
  • Alle plastdeler kan printes på en ganske liten printer. 10x10cm plattform holder. Jeg har printet alle strukturelle deler i ABS, med 30% infill og et skall.
  • Regn med å blåse ca 7000 kroner på eBay for deler til en åpen versjon som kan printe PLA og har et byggevolum på ca 35x35x35 cm.
  • Jeg gir ingen garantier for at det kommer en versjon med varmekammer i overskuelig framtid. Jeg har et ganske avslappet forhold til selvpålagte deadlines. Hoveddrivkraften min vil i såfall være å ergre kommersielle aktører, samt utfordre meg selv på å lage et minst mulig klunky design.
  • Det finnes ingen byggeveiledning – enda.
  • Ikke regn med å få spesielt mye support  :)
  • Jeg ville ventet litt før jeg satte i gang. Jeg er rimelig trygg på at jeg kommer til å forbedre designet i løpet av høsten.
  • Jeg vet enda ikke hva som er begrensingene mht hastighet og presisjon i denne printeren. Den har så langt printet 150 mm/s og den har printet med oppløsning på 100 mikrometer, men enda ikke samtidig. Det er helsikes mange parametre å skru på, så det kan ta litt tid før jeg finner et sett med optimale konfigurasjoner.
  • Ingen garantier. For alt jeg vet så har jeg designet noe som automatisk vil forsvinne inn i et parallelt univers etter 20 timer printing.

Takk skal du fan meg ha !

Eldstejenta ringte meg på jobb, med streng beskjed om å handle med isposer på tur hjem. Hun hadde tråkket over og hadde hoven ankel.

Jeg fulgte instruksjonene på baksiden av isposen, og hun fikk med seg en kald ispose opp på rommet. Jeg *visste* at det kom til å gå hull på posen – og det gjorde det – uten at hun sa fra til meg. Når jeg vandret opp for å legge mintsejenta, så var det små, hvite flekker av hvite krystaller over alt.

Sikkerhetsbevisst som jeg er, så måtte selvfølgelig sjekke hva slags kjemikalier som sørget for den magiske endoterme reaksjonen inni posen.

Og takket være dette, så har jeg sannsynligvis nå klarte å utløse flere rødflagg enn normalt hos PST.

Det viser seg at posen inneholder vann og UREA. Lettelsen var stor, og reaksjonen til eldstejenta var rimelig ubetalelig – når jeg fortalte henne at posen var harmløs. Den inneholdt jo heldigvis bare “innkokt urin” og vann. At hun hadde sølt over hele gulvet sitt og sannsynligvis også fått det på fingrene – før kveldsmaten – resulterte i et tenåringsjenteskrik som var Disney Channel verdig.

Men…

(Det er alltid et “men”)

At UREA selges over disk av vennlige apotekerdamer var nytt for meg. Det er jo tross alt bare en enkel reaksjon unna å være noe adskillig mer nasty. Jeg kunne gått i bokhylla og fått bekreftet det jeg synes å huske fra studietiden, men jeg googlet istedet. Jeg googlet:

“UREA nitrate”

Jepp, jeg husket riktig. Wikipedia omtaler UREA-nitrat som IED-ingrediens #1 i Afghanistan, Pakistan og irak.

Dette søket alene resulterte nok i minst ett løftet øyenbryn på begge sider av atlanteren. Ett sånt søk kan man sikkert slippe unna med.

Men,..

Jeg leser for tiden “Command and control – Nuclear Weapons, the Damascus Accident, and the illusion of safety” (Var ikke klar over denne før en bekjent av meg postet link til den på FB). Dette er en bok som får det til å gå kaldt nedover ryggen på deg. I tillegg, så er det en overhengende fare for at man lærer seg flere nye ord.

Jeg hadde kommet til kapittelet som omhandlet eksplosive linser og implosjonsproblematikken rundt Fat Man. Og der lærte jeg noe nytt. Det viser seg at kjemiske “initiatorer” var for upresise til å kunne benyttes. De brukte istedet noe annet. Noe oppfunnet av  Luis Alvarez and Lawrence Johnston under andre verdenskrig. Noe ikke-kjemisk man kunne initiere de eksplosive linsene rundt plutoniumsfæren i Fat Man med.

Det neste jeg googlet etter var da:

“Exploding-bridgewire detonators”

Korrelasjonen i tid tatt i betraktning, så kan jeg nesten garantere at disse to søkene resulterte i opptil flere parvis hevede øyenbryn – på begge sider av atlanteren.

Jeg trodde jeg hadde en viss oversikt over ting som var spooky ute i verden, men dette er dingser jeg faktisk ikke ante eksisterte før i går kveld. Nå får jeg ikke sove om natta og jeg heller litt i retning av at både isposer og internett bør forbys.

Kort oppsumert: I be fukd. Nice knowin’ y’all ! Antar det blir noen runder med waterboarding på meg i ukene fremover…

(Bildet er rappet fra United Nuclear. Siden jeg allerede har tråkket i salaten en gang, så kan jeg like gjerne ta rennafart og en tur til)

The Anarchist Code Book (del 2 – syntaks, semantikk og pragmatikk)

Et programmeringsspråk lar forfatteren uttrykke seg innenfor utvetydige syntaktiske og grammatikalske rammer. Semantiske regler gir mening til tekstens stukturelle elementer. Gitt syntaks, grammatikk og semantikk, så kan språket utvetydig tolkes eller oversettes til et annet språk. Dette er gyldig for alle språk – også tullespråk.

Går du svanger meg et språk, men er litt usikker på termin, så kan du enten lese 3000 sider kompilatorteknikk, eller bruke avsnittene og eksempelkoden under som utgangspunkt. Jeg anbefaler sterkt å benytte en eksisterende parser-generator (Coco/R, ANTLR, GNU Bison el.l.) for å definere syntaks og grammatikk-regler, men du må nok regne med å svømme rimelig alene m.h.t. resten av punktene. (Jeg valgte å bruke Bison, fordi det er hønngammalt – som meg)

1. Syntaks

Syntaksen definerer språkets vokabular. Hvilke ord kan man bruke for å uttrykke seg i språket ? Ord kan være tall, nøkkelord, navn etc.

En scanner leser kildekoden tegn for tegn og forsøker å matche tekststrømmen mot et sett kjente mønster. Hvis scanneren drar kjensel på et gyldig ord, så returneres dette til parseren for å se om det passer inn i de grammatikalske reglene.

Scanning og parsing er en form for mønstergjenkjenning / klassifisering. En parser kan klassifisere et tekstfragment som om det er produsert av de grammatikalske reglene i språket – eller ikke.

Forskjellige parser-generatorer kan ha litt forskjellig syntaks for å definere lexer- og parser-regler, men er du noenlunde dus med regulære uttrykk og BNF, så kommer du rimelig kjapt i gang.

2. Semantikk

Når parseren klarer å matche tegn- og ord-sekvenser som kommer fra scanneren til en grammatikalsk regel, så vet vi lite annet enn at teksten er produsert i henhold til kjente grammatikalske regler. Gitt eksempelfragmentet “int a = 2 * x;”, så vil de fleste lese dette som “Deklarer en variabel a av type int og initialiser denne til to ganger x”. Dette vet parseren absolutt ingenting om – enda.

Parser-generatorer lar deg spesifisere semantiske handlinger som kan knyttes til de grammatikalske reglene. Det er nå språket får mening. En semantisk handling er er gjerne et kort kodefragment som utfører en handling, eller eksempelvis bygger et node i et abstrakt syntaks-tre.

3. Pragmatikk

Dette punktet omfatter, eh – “resten”. D.v.s. implementasjonen av alt du ikke får mer eller mindre gratis av parser-generatoren din. Har parseren din funnet ut at programmet er et gyldig program, (og du har instruert den om det) så har den også bygget opp et syntaks-tre for deg. Dette er et av flere mulige mellomformat som kan være nyttige, litt avhengig av veien videre. Du kan eksempelvis tolke ASTen direkte, oversette til din egen lille virtuelle maskin (som du også må implementere), eller en eksisterende målplattform.

En AST lar seg rimelig enkelt tolke programmet på dette stadiet. Skal du oversette til et annet språk, så må du være forberedt på litt mer hoop jumping, håndsøm og behov for enlightenment.

Har språket ditt variable, så vil du trenge en symboltabell. Når det deklarereres en variabel i språket, så vil den få et innslag i symboltabellen. Når variabelen får en verdi, så holdes denne verdien i symboltabellen. Når variabelen referes, så hentes verdien herfra. Tabellen kan også inneholde metainformasjon, som eksempelvis typeinformasjon.

Uansett hvilket høynivå programmeringsspråk du liker å like, så vil absolutt alle abstraksjoner du er vant til, elegant skrelles bort under oversettelse til noe mer metall-nært. Den eneste abstraksjonen som overlever er en du sannsynligvis ikke liker å like. Dette er “prosedyre-abstraksjonen”. En prosedyre/funksjon er som kjent ikke noe annet enn programkode du kan overføre parametre til og så starte eksekveringen av. For å kunne kalle en funksjon, så må du overføre parametre til den. Dette gjøres ved å dytte argumentene på en stack. Hvordan du velger å gjøre dette kalles gjerne for kallkonvensjon, og er noe du sannsynligvis kjenner igjen fra C.

Siden du i funksjonen kanskje deklarerer lokale variable med potensielt samme navn som i den kallende koden, så må du også ha et forhold til scopes. Et scope har sin egen symboltabell, og evt tilhørende metainformasjon. Informasjonen kalles gjerne for et activation record, eller en stack frame. Kaller du en funksjon, så dytter du det gjeldende activation record på stacken, oppretter et nytt og definerer og initialiserer de overførte argumentene som lokale variable i dette. Når prosedyren/funksjonen returneres, så popper du gjeldende activation record fra stacken. Easy.

Er du ungsau, så liker du sannsynligvis dynamiske språk, der du kan beregne sinus til en streng uten å få feil før applikasjonen din har vært i drift en tid. Tilhører du den eldre garde, så liker du sannsynligvis statisk typede språk, der kompilatoren sørger for at du ikke får telefon klokka 0300 på natta fordi applikasjonen din har eksplodert. La kompilatoren gjøre jobben for deg, så kan du drite i 95% av testene dine ;) Typesjekking kan du gjøre ganske enkelt når du oppretter noder i ASTen din.

Alle slike eksempler, også dette, ender gjerne i noe som er et dysfunksjonelt subsett av C. For å gjøre det litt mindre traurig, så har jeg derfor gått motsatte vei av Haskell og gjort syntaksen mer ordrik enn det er behov for.

Enter…

Scripture 1.0

Scripture er et tullespråk, implementert som en repetisjonsøvelse for egen del, men det virker – sort of.

Variable og typesystem

Syntaksen er ganske enkel. Språket har tre typer; “numeral”, “text” og “eternal void”. Følgende scripture-kode deklarerer tre variable og initialiserer dem.

numeral one is now 2;
numeral two is now 1;
text three is now "three";

Den eksplisitte initialiseringen er frivillig, men følger samme syntaks som tilordning for å holde det rimelig oversiktlig. Eksempelsyntaks for å bytte om innholdet i to variable med hjelp av en hjelpevariabel .

numeral three;
three is now one;
one is now two;
two is now three;

Argumenter og funksjonskall

Et script vil starte eksekveringen fra funksjonen du har valgt å kalle “create”. Denne kan ha et vilkårlig antall argumenter som hentes fra kommandolinja, men må returnere type “numeral”. Forsøk på å returnere annet vil resultere i en “No such operating system – yet…”-feil. Eksempel på et enkelt script som tar to argumenter fra kommandolinja og skriver dem ut:

numeral create with text praise and also numeral magic
Praise the lord!
    let praise and " " and magic be written;
Hallelujah!

Output:

$./scripture hello.scripture Dude 42
Dude 42

Uttrykk

Scripture støtter selvfølgelig matematiske uttrykk. De grunnleggende aritmetiske operasjonene selvforklarende og heter:

  1. <expr> “without” <expr>
  2. <expr> “and” <expr>
  3. <expr> “added” <expr> “times”
  4. <expr> “subtracted” <expr> “times”
  5. “-” <expr>

Alle (utenom “-”) er venstreassosiative og presedensen er gitt av rekkefølgen over.

numeral create with
Praise the lord!
    numeral a is now 10;
    numeral b is now 1;
    numeral c is now 42;
    numeral d is now 666;
    let (a and 33) without b be written;
    let d added 2 times and 5 be written;
    let d subtracted 10 times be written;
Hallelujah!

Output:

$./scripture expressions.scripture
42
1337
66.6

Relasjonsoperatorer

Scripture definerer følgende relasjonsoperatorer. Disse er selvforklarende. (Scripture har et litt simplistisk forhold til operatorer. Logiske operatorer (Hmm, disse har jeg glemt…), relasjonsoperatorer og matematiske operatorer behandles rimelig likt (pga forfatterens latskap & bloggspreng))

  • “is the equal of”
  • “is a different beast than”
  • “is superior to or the equal of”
  • “is inferior to or the equal of”
  • “is inferior to”
  • “is superior to”

Loops

Looping i Scripture gjøres med “as long as”. Denne tar et uttrykk som argument og vil iterere over kodeblokka mellom “Praise the Lord!” og “Hallelujah!” så lenge uttrykket ikke er lenger unna false enn double precision tillater (You may be in for a surprise…)

numeral create with numeral limit
Praise the lord!
    numeral counter;
    as long as counter is inferior to limit
    Praise the lord!
        let counter be written;
        counter is now counter and 1;
    Hallelujah!
Hallelujah!

Output:

$./scripture loop.scripture 5
0
1
2
3
4

Kontrollstrukturer

I et forsøk på å oppnå status som Turing complete, så har Scripture implementert sin variant av “if”. Syntaksen er “given that” <expression> “…but…but… what if… ?”

numeral create with numeral one
Praise the lord!
    given that one is the equal of 1
    Praise the lord!
      let "One !" be written;
    Hallelujah!
    ...but, but... what if... ?
    Praise the lord!
        let "Not one !" be written;
    Hallelujah!
Hallelujah!

Output:

$./scripture given.scripture 2
Not one !

Funksjonskall

I eksempelet under, så har vi tre funksjoner. “create” er entrypunkt og forventer ett argument.

{{ This is a method that prints the argument times 5 }}
eternal void Scribe with numeral magic
Praise the lord!
    let "Scribe:" and magic added 5 times be written;
Hallelujah!

{{ This is a method that calls scribe with argument2 if  the argument1 is equal to 2 }}
{{ It then returns the sum of the arguments to caller }}
numeral Apostle with numeral number1 and also numeral number2
Praise the lord!
    given that number1 is the equal of 2
    Praise the lord!
        call upon Scribe, please accept number2 as an offering;
    Hallelujah!
    return number1 and number2;
Hallelujah!

{{ Entry point. Loops form 0 to the argument value and calls apostle with each value and 23 as arguments. }}
numeral create with numeral bound
Praise the lord!
    numeral iterator is now 0;
    as long as iterator is inferior to bound
    Praise the lord!
        let "Return value: " and call upon Apostle, please accept iterator and also 23 as an offering be written;
        iterator is now iterator and 1;
    Hallelujah!

   let "DUDE !" be written;
Hallelujah!

Output:

$./scripture functions.scripture 5
Return value: 23
Return value: 24
Scribe:115
Return value: 25
Return value: 26
Return value: 27
DUDE !

Parseren er basert på Flex og Bison. Du trenger ikke disse for å kompilere prosjektet, men du trenger dem hvis du skal endre syntaks. Jeg har brukt flex 2.5.35 Apple(flex-31) og GNU Bison 3.0.Håndsømmen er begått av meg i løpet av noen kvelder og klokker inn på ca 1000 linjer c++ inkludert headere (hvorav mesteparten går med i implementasjonen av AST-noder.). Kildekode og eksempelfiler finner du her: https://github.com/hansj66/Scripture

(PS. Dette er eksempelkode, som er ment å leke med. Den har ikke produksjonskvalitet. ASTen lekker litt, men “new” er litt lettere å lese enn “std::make_shared<Ugly type>(something)” – og jeg har, som ungene, ikke giddet å rydde opp etter å ha lekt meg.)

Scripture er nå interpreterende, men jeg ser for meg at det burde være ganske grei skuring å bygge om koden til å kunne kompilere til intel hex-filer som enkelt kan flashes til en mikrokontroller. The Internet of things and all that.

Egentlig, så var det jo behovet for lett parametriserbart tannhjuldesign som sporet meg av fra forrige prosjekt. Jeg innser nå at Scripture er nok en avsporing, men jeg har hatt et intenst behov for å lage noe litt vimsete og språkaktig siden jeg så Guy Steele og Richard gabriel sin 50-in-50-talk på JAOO i 2008. Det klødde og nå har jeg klødd tilbake. M.a.o. på tide å fortsette med det jeg egentlig holdt på med.

PS. Selv om syntaksen er litt surrete, så er det rimelig greit å skru om dette til å bli ganske C-likt i .l og .y-fila(, hvis man er på utkikk etter et litt mer sobert eksempel.) Navngiving fra token-nivå og inn i C++-koden er non-insane. Du trenger Qt for å bygge Scripture (Jeg kjører fremdeles med 4.8.4, men nyere Qt bør fungere). Kjør “qmake -t vcapp” fra bin-folderen i din toolkjede for å få laget prosjekt for andre plattformer. Det skal være relativt uproblematisk å kompilere dette med eks MS Visual Studio eller gcc.

The Anarchist Code Book (del 1)

Jeg er i overkant lett å distrahere, så behovet for å designe et tannhjul til den nye 3D-printeren har nå resultert i at jeg har kommet i skade for å begå et aldri så lite statisk typet og interpreterende språk. Det er ikke et spesielt elegant, nyskapende eller esoterisk språk. Det vil neppe bli omtalt på noen konferanser. Det er rimelig ubrukelig til alle praktiske formål.

Men,…

Det har kontrollstrukturer, loops, funksjoner, et lite typesystem, basic I/O, operatorer og uttrykksevaluering.

Formålet med å lage dette var å, en gang for alle, bli komfortabel nok med GNU Bison, til at jeg kunne lage noe annet.  Jeg har lekt med andre parser-generatorer tidligere, men det har som regel endt i blindveier eller stygge grisehack der vakre syntaks-trær istedet burde vært dyrket fram.

Jeg føler at jeg har lært ganske mye gjennom implementasjonen av dette, til tross for at jeg kun har produsert noen hundrede kodelinjer over noen få kvelder.

La meg understreke at dette ikke er fanboy-/-rockstar-hot materie. Dette er pensum. Jeg burde lært det på skolen, men jeg var dessverre i overkant lett å distrahere den gangen også.

Jeg har lenge lekt med ideen om et språk, skreddersydd for å kunne generere visse typer organiske objekter, tidligere kun for visualisering, men nå for 3D-printing. Jeg er fullstendig klar over at man uten problem kan programmere dette på tradisjonelt vis, eller til nød lage seg en liten DSL under et mer tradisjonelt språk, men hva er morsomt med det ?

Å designe et fullverdig programmeringsspråk er en relativt heftig materie, og opplevelsen man får ved å gi seg i kast med noe marginalt mer komplekst enn en enkel kalkulator kan minne ganske mye om å svømme i en ikke-newtonsk væske. Tar du i litt for mye  så blir du sittende bom fast. Tar du i litt for lite, så synker du til bunns. En akkurat passe porsjon av mindfulness må til. Forvent en lavere knotting-til-”hmm…”-ratio enn du kanskje er vant til.

Men,…

I likhet med kjemi, så trenger man heldigvis ikke kunne hele pensum for å ha det moro. Man trenger bare kunne nok til at man nesten havner på akutten.

Jeg ble overrasket over hvor lite kode som faktisk skulle til for å spesifisere et enkelt språk og deretter implementere en parser med tilhørende interpreter for det (Når jeg tenker etter, så trenger du faktisk ikke implementere en interpreter for å implementere et en interpreter, men de kan vi komme tilbake til senere)

Å kjøre programmer skrevet i sitt eget språk er et geek-rush fullt på høyde med å forbedre meat-space med 3D-printing.

Dere aner kanskje hvor det bærer. Jeg er i ferd med å legge hodet på blokka og er svanger med et nytt epos. Jeg skal forsøke å holde det rimelig plattform og kompilator-agnostisk, men sluttproduktet kan nok inneholde spor av Qt og C++11.

For 3D-printerprosjektet sin del, så håper jeg at jeg klarer å avslutte denne serien før jeg begynner å leke med tanken på å emitte kode til CILJava bytecodeLLVM IR eller en eller annen udda mikrokontroller.

For å komme i mål, så var det nødvendig å dra fram Drageboka mi [1] fra 1986, lese manualer og tutorials [2][3] samt oppsøke  Stack Overflow litt hyppigere enn vanlig. Det beste A-Å-eksempelet jeg har sett så langt er faktisk en av samplene til boost::spirit, men jeg har valgt å ikke bruke det som utgangspunkt, siden boost-gjengen åpenbart befinner seg på ei grein over meg i evolusjonstreet. De har også rappet alt tankegodset fra yacc, bare gjørt det enda litt hæsligere å implementere. Boost makes my head hurt – really, really bad. Merkelig nok, så blir jeg warm & fuzzy all over når jeg tenker på generics i C#, men templakåtskap i C++ resulterer gjerne i kuldegysninger og akutt higen etter sterke psykofarmaka.

Bortsett fra nevnte spirit-eksempel, så er det tynt med gode eksempler der ute. Det meste er gammelt C-ræl. Mye må derfor suges fra egen pupp eller utledes fra kommentarfeltene til “Hvordan i hule?”-poster på StackOverflow. Det kan bety en av to ting:

  1. Det er litt vanskelig.
  2. Det er veldig, veldig enkelt. Faktisk så banalt at normalt oppegående utviklere ikke vil nedverdige seg, eller risikere å besudle nett-tilstedeværelsen sin ved å skrive om det.

Jeg håper på “1″, frykter vel kanskje “2″ , men er heldigvis såpass gammel at jeg egentlig gir blanke. Hvis en av leserne finner det nyttig, så er det verdt å dumme seg litt ut for min del.

[1] “Compilers Principles, Tehniques and Tools”, Aho, Seti, Ullman. Addison-Wesley, 1986 (Vurder kanskje en litt nyere versjon enn min ;))

[2] “Lex & Yacc Tutorial”, Tom Niemann

[3] “Lex & Yacc”, Levine, Mason, Brown. O’Reilly

Lost in Translation / Brønnpissing 101

“Oppfinnerfestivalen” Maker Faire har kommet til Trondheim. Jeg har myst litt på sidene til Trondheim Makers og medlemslista. Jeg har lest artikkelen i Adresseavisa, og jeg burde hoppet i taket av glede over at festivalen endelig var kommet til Trondheim. Jeg vil så inderlig gjerne laike dette, men så leser jeg følgende:

“Vår oppgave blir blant annet å skape idoler av gründere og entreprenører.” [1]

Jawohl… ?

Jeg har tidligere hatt en forestilling om at maker-bevegelsen var tuftet på verdier som læring, deling, skaperglede og mangfoldiggjøring av kunnskap – gjerne i en sosial kontekst. Punktum. Jeg er åpen for at jeg kan ha tatt feil. Det er isåfall ikke første gang jeg har misforstått noe.

Jeg har ingen problemer med å forstå kommersielle interesser og motiv. Penger er bra å ha. Penger gir trygghet og muligheter. Vi trenger gründere og entrepenører. Vi trenger nye arbeidsplasser. Er man heldig nok til å bli invitert inn i en startup, så er den økonomiske oppsiden stor. Har du en produktide ? For all del – go for it ! Kanskje er du en av de heldige som klarer å slå mynt på det som var din ide.

Jeg kan godt forsøke å lære ungene mine hva slags ballast de vil trenge for å kunne bli gründere og entrepenører. Isåfall kan de kanskje ta vare på sin gamle far om noen år. Isåfall må jeg også være komplett idiot hvis jeg pakker bagasjen for dem – og putter det jeg trodde var maker-verdier oppi.

Skal de lykkes som entrepenører og gründere, så må de ha kunnskap om hvordan de skal beskytte sine intellektuelle rettigheter, hvordan de skal utforme kontrakter til egen fordel, hvordan de finner sweet-spotten der de kan få klemt mest mulig ut av sine ansatte og partnere uten at de blir sure nok til å finne seg nye utfordringer. Jeg må sørge for at de forstår hva ord som “konkurrenter”, “dekningsbidrag”, “risiko” og “resultatgrad” faktisk betyr. De må lære seg å kunne sno  seg smidig gjennom aksjelovens og arbeidsmiljølovens hinderløyper uten å snuble. De lære seg hvordan de kan bli kvitt vanskelige personer på et objektivt grunnlag, og de må for guds skyld være klar over at innsidehandel er helt ok, så lenge man ikke er børsnotert. Fremfor alt, så må de bli dus med begrepet “exit”.

Men,…

Ungene mine er såpass glade i å lage ting at jeg sannsynligvis vil måtte banke inn i dem at alt det de lager er irrelevant crap, så lenge det ikke finnes et marked for det de klemmer ut av seg. Jeg driter i at det er pent, at er laget for å glede noen, eller at de har lært seg noe nytt mens de forsøkte å lage det. Jo raskere de lærer seg at det eneste de noensinne vil bli målt på, er vekstrate og bunnlinje, jo bedre. Jeg betviler likevel at dette vil resultere i spesielt mye nyskapning i heimen.

Hvis vi presenterer dette som idealene til ungene våre, så ender vi opp med enda en generasjon blåruss og bønnetellere  som motiveres av penger og hindrer innovasjon ved å bygge salgbar IP i form av patenter. Er det det som er målbildet ? Er det det samfunnet virkelig trenger ? Hva skjedde med DIY ?

Til slutt vil jeg nevne at ordet “Maker” ikke er et synonym for “oppfinner”. Det er en betegnelse på en person som lager noe. Jeg frykter at det kanskje ikke er det eneste som forsvant i oversettelsen.

[1]  http://www.adressa.no/nyheter/okonomi/article9297167.ece

Hey Biff, you’re up!

For lenge, lenge, lenge, lenge siden, så kjøpte jeg et flipperspill – usett – for 2800 kroner. Tilstanden var omtrent som man kunne forvente, prisen tatt i betraktning. D.v.s. slitent og tysktalende.

For lenge, lenge, lenge siden, så ringte Ole fra P4P og lurte på om jeg var villig til å “låne ut” en Funhouse playfield til noen karer i USA som skulle reprodusere disse (Innbiller meg at det kan ha vært Illinois Pinball Company). Jeg strippet ned hele maskina på et par dager, rev ut playfielden og sendte den til Sandefjord for videre transport til det store utland.

Noen år etterpå, så kom det faktisk en splitter ny playfield i posten. I mellomtiden, så hadde jeg rukket å handle litt deler. Ny sideart, nye ramper, ny plast, en sekk med bolter, T-nuts, noenhundrede lyspærer og flashere og diverse hard-to-get-parts fra slaktede maskiner via eBay. Da det krever litt albuerom og en viss dedikasjon for å få satt sammen en sånn maskin igjen, så ble alle delene stående i pappesker i 4-5 år til. Jeg var drita lei av å flytte rundt på alle delene, som nå hadde stiftet familie med ymse hybelkaniner og jeg vurderte i perioder å selge det som en prosjektflipper (“den virket sist jeg testet !!!”) til første og beste forbipasserende.

Heldigvis etablerte Hackheim seg rett rundt hjørnet, og jeg og Øyvind (som også har en FH å skru sammen) okkuperte et rom der, lempet inn maskiner og skred til verket. Jeg har skrudd på flipperen et par timer et par ganger i uka i litt under et halvår nå. Antar at det kan ha gått med 60-80 timer inkludert jabbing med nysgjerrige hackheimere :) Playfielden måtte drilles og deretter måtte alle deler dras fram fra kasser, identifiseres og monteres på nytt på over og undersiden.

I dag slo jeg på strømmen for første gang.

Jeg var forberedt på brann og massive mengder blårøyk, men den bootet og passerte nesten alle testene. Det eneste som jeg har funnet av større feil så langt, relaterer seg til klassikerne. D.v.s. gjennomkorrodert batteriholder og en svært lite samarbeidsvillig coil som styrer øyelokkene til Rudy. Coiler, switcher, lamper og flashere ser ellers ut til å oppføre seg bra, men jeg må gå over en tur til for å stramme til litt skruer her og der.