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

Rift DK2 SDK – leke litt :)

Det tok faktisk under en halv dag å hacke på plass en STL-viewer for Oculus Rift. Dessverre klarte jeg ikke å motstå fristelsen til å implementere vieweren i – wait for it – STL (*) !

Puddingene der ute går sikkert for Unity eller Unreal-lisenser, men ekte programmerere benytter som kjent C++ – elleve – for å implementere sin egen virtuelle lekegrind.

Bildet under viser deler av ansiktet til InMoov. Fila er lastet ned fra Thingiverse og lest av Rift-STL-toolet mitt.

Helt villt å bevege seg tett inntil fjeset i VR og så reise seg opp, og bøye seg over kanten, for å se hvordan det ser ut bak.

Både binær- og ASCII-versjonene av STL-formatet er rimelig enkle. Fila inneholder en eller flere solids, som beskrives av et sett triangler via vertex-lister og tilhørende normalvektorer. Jeg har skrevet en liten parser som leser STL-fila som en stream og dytter data direkte inn i vertexbufferet som benyttes for rendering. En vertex består av en x,y,z-vektor, en r,g,b,a-fargekomponent, en o,u-mapindex (for textures), samt en x,y,z normalvektor.

Etter å ha bufret en vertex, så får du en indeks tilbake. Denne benytter du for å komponere triangler. Verre er det ikke. (ps. Ser ting litt hyperspace-aktig ut, så har du høyst sannsynlig blingsa på normalvektoren i forhold til rekkefølgen du dyttet data inn i vertexbufferet).

Jeg skal ærlig innrømme at jeg klæbba inn denne funksjonaliteten i demokode som distribueres med SDKen. Man må være smått syk på sinnet for å starte fra scratch, når det er enklere å fjerne stygge ting fra noe eksisterende. SDK-samplene er faktisk ganske ok, men namespaces og klassenavn er som man kan forvente. Det er helt åpenbart at spillprogrammerere har vært på ferde her.

Et par tips:

  1. Installer 0.4.2 betaversjonen av runtime hvis du har en eldre versjon. Denne løste en del problemer for min del og Oculusen fremstår nå som en god del mer stabil.
  2. Installer den siste DirectX-versjonen. Binæren du kompilerer har en avhengighet til d3dcompiler_47.dll (antar det er vertex/pixelshaderne som trenger denne). Sørg for å ha denne i path eller der du kompilerer binæren din.
  3. Smeller det under installasjonen, så avinstaller msvc2010 runtime-komponenter fra systemet. DirectX-setupen vil sanns feile hvis du har msvc2010 SP1 runtime installert
  4. Ta utgangspunkt i OculusRoomTiny-eksempelet. Dette er rimelig overkommelig.
  5. Utilityklassene i eksemplene klarer ikke å holde flere vertices enn du klarer å indeksere med 16 bit. Usikker på om dette er en kunstig begrensning eller ikke.
  6. Ikke få panikk om du støter på 4-dimensjonale vektorer her og der. Quaternions er nyttige beist.
*) STL er et populært filformat som benyttes for utveksling av filer for 3D-printing og STL er Standard Template Library i C++.

Tobacco Road – Labrapport 2

Christ, jeg er glad for at jeg ikke jobber på sigarfabrikk på Cuba. Familien ville isåfall ha sultet. Etter to kvelder, så kan jeg vise til hele 3 ferdige sigarer, samt noen små cigarilloer, laget av restene fra produksjonen av de store. Sigarene er riktignok ganske voksne, da de klokker inn på ringstørrelse 52  - dvs litt over 2 cm i diameter.

Før sigarene ble rullet, så burde bladene vært fermentert i mange uker og deretter lagret i flere år, men dette har jeg ikke tid til. En uke i ovnen på 55 grader får holde. Så lenge jeg ikke ødelegger enzymene i cellene, så vil sigarene modne helt fint videre, kun ved å lagres riktig. For å kickstarte fermenteringsprosessen, så benyttet jeg et tjuvtriks som sigarprodusentene velger å ikke snakke spesielt høyt om. Uansett hva produsentene påstår, så mistenker jeg at omtrent alt som omsettes av sigarer sprøytes med “betún” (som er spansk og betyr “skosverte”) før fermentering. Spekteret av aromaer i kommersielle sigarer kan ikke forklares med fermenterings- og aldringsprosesser alene.

(Apropos betún, så burde man nevne at enkelte sigarprodusenter under den store sigarboomen på tidlig 90-tall, faktisk også gikk så langt som å male wrapperne for å få den riktige, homogene og svært mørke fargetonen på maduro-sigarer (Normalt, så jukser produsentene bare “litt”, ved å dampe maduro-wrapperne). Det gikk faktisk så langt at enkelte sigarer svertet av på leppene til stakkaren som røykte sigaren.)

Til tross for den litt urovekkende oversettelsen, så er det likevel ganske uskyldige saker. Min oppskrift er basert på informasjon hentet fra “Curing and Fermentation of Cigar Leaf Tobacco” (Oscar Loew, 1899) og “Methods of Curing Tobacco.” (Milton Whitney, 1898). Man tager en kasserolle og fyller den med knuste stilker. Det tilsettes vann, nellik, mørk sirup, sur vin og jamaiaca-rom. Dette kokes – lenge (mens resten av familien er ute av huset. da det lukter død). Væsken avkjøles så noe og tilsettes deretter ammoniumkarbonat (hornsalt). Ammoniumkarbonatet regulerer pH på samme måte som natriumkarbonat gjør det i snus og det frigjør nikotin. Til forskjell fra fra natriumkarbonat, så dekomponerer rester ved ganske moderat temperatur, og da kun i ufarlige gasskomponenter. Bobler det når du tilsetter hornsaltet, så er væska for varm. Væska filtreres så og sprayes på bladene før de pakkes for fermentering.

(Tverrsnitt av stilk fra tobakksplanten. Stilken er ca 5 cm i diameter)

Cubanske sigarer har gjerne en del bakterier på bladene. Dette er indikativt for bruk av betún, da et oppkok av betún som blir stående i varmen, vil fungere som en ren dyrkningstank for bakterier.

At sigarer fra andre produsenter ikke har bakteriebelegg kan forøvrig like gjerne være en en indikasjon på at de istedet benytter enda billigere metoder og faktisk sprayer aromastoffer direkte på fillerbladene rett før de rulles – just sayin ;)

Aromaen fra en sigar kommer fra filler-bladene. Dette er ingenting annet enn et utvalg av blader fra bunnen, midten og toppen av planten. Nikotininnholdet og endelig aroma er avhengig av variant, samt hvor lenge bladene har grodd på planten. Man høster normalt blader parvis, en til to ganger i uka, fra bunnen av planten og oppover. Jo lenger bladet har grodd på planten, jo høyere nikotininnhold.

Hvert fillerblad rulles sammen og de resulterende rullene klemmes så sammen til en bunt. Totalt 3 fillerblader benyttes pr. sigar. Fillerbladene rulles så inn i to par med tilskjærte wrapperblader. Dette puttes så i en sigarform og får stå i ca en halvtime før sigarene roteres 90 grader og puttes tilbake i forma en runde til.

(Cubanske sigarer var opprinnelig helt og holdent håndrullede, men etter at de fikk konkurranse fra maskinproduserte sigarer, så introduserte de sigarformer i tre for at sigarene skulle se mest mulig identiske ut.)

Etter siste vending, så er sigarene klare for wrapperen. I motsetning til hva de fleste tror, så er wrapperen ren pynt. Hvis man ønsker, så kan man dyrke sine wrapperblader i skygge for å få pene wrappere uten kraftige årer, men det er ikke nødvendig mht aroma.

Den virkelige biatchen mht produksjonav sigarer er ikke rullingen. Det er endecappen. Heldigvis finnes sigarlim. Dette får du faktisk kjøpt på din lokale matvarebutikk (pectin, syltepulver).

Jeg lot også i år to planter stå i igjen i drivhuset for å produsere frø. Det går ca 950 frø pr gram. En enkelt plante klarer fint å produsere mange hundrede tusen frø.

Siden plantene som skulle produsere frø, nødvendigvis også trengte noen blader for å holde seg i live, så lot jeg disse henge igjen inntil de var strågule / neste hvite. Frøkapslene var da modne og bladene hadde fargemodnet på planten. Jeg måtte nesten forsøke å lage det enkleste av alle tobakksprodukter helt til slutt. Dvs vanlig røyketobakk. Man tager noen blader, ruller dem sammen og snitter dem pent med en kniv. Deretter settes de i ovnen på 110-130 grader i en halvtime. Da får du “toasted” tobakk. På bildet under, så ser du den pipetobakken, som bestefaren din sannsynligvis laget under krigen.

Nesten litt synd at man har sluttet å røyke…

Tobacco Road – Labrapport 1

Gentlemen, prepare your hipster pipes !

Jeg er innbitt ikke-røyker, men det betyr ikke at jeg ikke har lov til å dyrke tobakk – tror jeg. Noen må tross alt ta ansvar for å holde kulturarven levende mens byråkrater og lovgivere danser i ring rundt bokbålene sine. For min del kan de danse i vei. Jeg har svart belte i kultivering av trass. Jeg har også oppdaget archive.org.

Jeg føler at jeg har foredlingsprosessen for snus sånn noenlunde under kontroll, så i år får derfor pipetobakk og sigarer prioritet.

Å avdekke esoteriske foredlingsprosesser, bedrive mythbusting, samt lete i over hundrede år gammel litteratur er utrolig morsomt. Faktisk mer så enn å slenge seg ned på sofaen for å se på politikerdebatter om tobakkslovgivingen etter endt arbeidsdag.

Plantene ble i år dyrket på samme måte som året før. Jeg gikk i år utelukkende for Havana Gold Leaf og frøene som gikk i jorda var høstet fra en av plantene i fjor.

Takket være den fantastiske sommeren og høsten vi har hatt, så nådde plantene mannshøyde i juli, og  fargemodningen gikk ganske radig unna etter innhøsting. Bladene fikk likevel henge mørkt og under tak i ca 8 uker.

Den enkleste pipetobakken du kan lage er “Cavendish”. Dette er en tobakk som gir en lett mild røyk, og som er svært lett å smakssette. Du kan benytte en hvilken som helst tobakksplante, da navnet kun referer til foredlingsprosessen og skjæringen av tobakken.

De modnede bladene ble dampet i 7 timer. Plantene skal ikke være i kontakt med vannet under dampingen. Aromaer kan tilsettes vannbadet. I dette tilfellet, så valgte jeg vaniljestang og jamaica-rom. Etter endt prosess, så har de skiftet farge til mørkt brune eller, hvis du har dampet lenge nok, helt svarte. Konsistensen er omtrent som kokt spinat.

Bladene ble så tørket og rullet sammen til en ball før de ble presset til en blokk mellom to eikeplanker med help av tvinger. Etter noen timer, så ble blokken skjært opp og snittet.

Produktet under lukter vanilje og tørket frukt. Over en gassflamme, så produseres en mild røyk som lukter som tradisjonell handelsvare.

Hvis jeg tar inn arbeidstimer og lesetid i kostnadskalkylen, så er det du ser på bildet over sannsynligvis en god del dyrere enn safran. Tenker den skal få lagres i et luftett glass og luktes på fra tid til annen. Man er jo tross alt ikke-røyker.

Next: Sigarer – slik de egentlig lages.

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.