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

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 ?

Innovasjon i etablerte bedrifter er dyrt og forbundet med risiko. At næringslivet derfor gatecrasher selskapet er nesten å forvente, men at det velger å gjøre det med en såpass utilslørt ereksjon er på grensen til skamløst.

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.

 

Set your chickens free !

Hva er dødelig for fugler og fremkaller influensalignende symptomer hos mennesker ? Riktig svar er “fugleinfluensa – og ubetenksom omgang med PTFE”  (PTFE markedsføres forøvrig av DuPont under merkenavnet “Teflon”).

I tilfelle du lurer på hva stekepanna di sannsynligvis er belagt med, så kan jeg opplyse om at det ser sånn ut i ren form:

Stoffet heter PTFE, og er en termoplast som spaltes i en del litt mindre hyggelige stoffer ved ikke spesielt  høye temperaturer. Planlegger du seriøs biffsteking eller (gud forby) lett fritering i oljer som tåler 260 grader og over, så ville jeg flyttet kakadueburet et godt stykka unna komfyren, samt satt kyllingene mine fri – samtlige kyllinger. Ikke bare løper du risikoen ved å bli fuglemorder, men du har også et helt glitrende utgangspunkt for å kunne produsere noen relativt potente drivhus- og stridsgasser kun ved hjelp av bestemors Aga og den nye stekepanna du fikk til jul.

Enkelte av spaltningsproduktene er ikke spesielt nedbrytbare. De akkumuleres i kroppen – og blir der. Tørrkoker du en teflonpanne, så er dette noen av stoffene du kan ende opp med:

“At least four of these gases are extremely toxic – PFIB, which is a chemical warfare agent 10 times more toxic than phosgene (COCl2, a chemical warfare agent used during World Wars I and II), carbonyl fluoride (COF2 which is the fluorine analog of phosgene), MFA (monofluoroacetic acid) which can kill people at low doses, and HF, a highly corrosive gas.” [1]

Dette er ganske heftige kjemikalier og DuPonts egne kjemikere hadde i 1968 mye moro med å gjennomføre eksperimenter der de tok livet av rotter med dem.

Nuhvel,

Jeg skulle egentlig skrive en oppdatering på 3D-printer-prosjektet, nå som jeg har en fet teflon-stav fra Korea liggende på pulten min. Den skal / skulle / kunne ha blitt en sentral komponent i extruderen min, men iom at høy temperatur og plast er en combo som er verdt å google før man begynner å eksperimentere, så gjorde jeg nettopp det…

Jeg registrerer at pannetemperaturen ved steking av biff er i området 200-230 grader. I teorien, så burde jeg derfor ikke eksponere meg for større risiko ved å kjøre extruderen enn det en jeg gjør ved å svinge stekepanna. I teorien.

PS. PTFE-liner er det innerrøret som du finner i 95% av alle reprap-extrudere og J-Head hotends.

PPS. Hvorfor har ingen noengang gjort en studie med tittelen “Environmental impact of cow farts vs pyrolysis of teflon coated frying pans in burger flipping joints ?”.

[1] http://www.ewg.org/research/canaries-kitchen/teflon-offgas-studies

[2] http://www.youtube.com/watch?v=HoYJh6ZRj8o (Jepp, jeg har den orginale fleksidisken :))

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

Hvis du føler for å blåse 65kNOK, så er det faktisk mulig å anskaffe seg en RepRap med varmekammer allerede nå. Denne er designet av Kühling&Kühling, har et byggvolum på 10 liter og har to ekstrudere. Håper de rekker å tjene litt penger på den før de blir saksøkt.

Det kan se ut som om jeg ender opp med et byggevolum på ca 40 liter i nåværende konfigurasjon. Om jeg lykkes med varmekammeret vil tiden vise, men resten begynner å komme sammen tålelig bra. Elektronikken blir en litt udda combo av Marlin firmware, konfigurert for RAMPS. Dette snurrer på en Arduino 2560, men uten RAMPS-shield. Istedet, så har jeg dratt sammen display, encoder, SD-kortleser og 4+ Makerbot Gen4 stepperkontrollere på et protoshield (MB-kontrollerne kan levere 2.5A pr fase og kjører fletta av Pololu-kontrollerne som ellers benyttes sammen med RAMPS).

Hvis dette ikke resulterer i en eller annen singularitet eller blåfarget atomsopp når jeg napper i power-bryteren for første gang, så antar jeg at jeg snekrer sammen et eget shield for formålet. Jeg har ikke regnet sammen deleprisen på den siste BoM’en, men jeg tror vi så langt kanskje ligger på 10% av K&K-prisen så langt. Designet skalerer også i alle retninger uten at du trenger å modifisere noen printede deler. Du kan m.a.o. printe delene og kappe til stål og alu for å lage en printer som er akkurat så stor som du måtte ønske (Under den forutsetning at kua faktisk viser seg å være flyvedyktig)

De siste dagene har gått med på å trekke kabler og montere kontakter. ca 46 meter kabling har gått med så langt.