Viser innlegg med etiketten skyvariablar. Vis alle innlegg
Viser innlegg med etiketten skyvariablar. Vis alle innlegg

21 juni, 2022

Dager siden

Eg er litt oppteken av å lage program (anten det er med blokk eller tekst), der eg brukar dei til å løyse reelle problem. Ofte kan det vera litt vanskeleg å finne passande oppgåver til dette, der prosjekta ein lagar både er overkommelege og nyttige. Eit behov dukka opp her om dagen: Korleis kan ein laga eit Scratch-prosjekt som tel talet på dagar sida noko skjedde? Det er ingen openberr innebygd kloss for dette, men ved hjelp av "Dager siden 2000"-klossen kan vi trikse til dette.

 

Denne knappen fortel oss ganske enkelt kor mange dagar det er sida år 2000. Det store talet på desimalar er uinteressant for vår bruk, så vi må runde av. Om vi velger å runde av etter vanlege reglar eller runde opp/ned, får bli ein smaksak alt etter kva ein skal bruke dette prosjektet til. Eg vel å bruke vanleg avrunding, og risikerer ikkje noko meir enn at talet på dagar vekslar midt på dagen. 

Men for at dette prosjektet skal halde styr på dagane sjølv når det ikkje køyrer så må vi bruker skyvariablar. Eg lagar meg ein knapp og legg til følgjande skript på knappen:
 


Når eg nullstiller tellaren ved å trykke på knappen, legger prosjektet inn talet på dagar sida 2000 i skyvariablen dager1. 
Kvar gong eg no køyrer programmet seinare så vil knappen seie talet på dagar sida 2000 minus dager1, som skriptet til høgre viser. Den vil altså telja opp med 1 for kvar dag som går, enten programmet køyrer eller ikkje. Trykkjer eg på knappen vil den nullstille tellaren ved å sette dager1 til det nye talet på dagar sida 2000. 

Her har eg laga ein tellar som tel kor mange dagar det er sida alle i familien har bytta tannkost! 





07 desember, 2021

"Pro tip": Lagre tekst på Scratch sine servere

Når ein registrerer seg på Scratch kan ein laga prosjekt der ein brukar variabler som høyrer til ein bestemt figur, eller til alle figurane. Omtrent som lokale og globale variable, altså. Men når ein har bidratt litt i Scratch-miljøet (litt uklårt nøyaktig kor mykje ein må bidra) så blir ein ganske raskt oppgradert til "Scratcher", som da får tilgang til ein ny type variablar,  nemlig skyvariablar. Desse blir lagra på servarane til Scratch slik at dei typisk kan brukast til dømes for å lagre highscore i eit spel ein har laga. Ein kan kun lagra tal, ikkje bokstavar eller lister. Men for ei datamaskin er det jo egentlig ikkje så stor skilnad på korleis ein bokstav eller eit tal er lagra - via ein ASCII-tabell kan ein jo omsete alle teikn til tal og tilbake. 

Hugsar ein tilbake til dei gamle arkadespela (Pac-man, Space Invaders og alt det der) så var det alltid slik at ein berre kunne lagre tre bokstavar som namnet sitt når ein fekk highscore. Dette kan vi få til i Scratch med eit lite omsetingsskript.  

For å kunne omsete att og fram brukar vi ei liste med bokstavane A-Z og ei liste med samsvarande ASCII-kodar. Slike tabellar med ASCII-kodar finn ein lett ved eit google søk, til dømes her: https://www.asciitable.com/ . Vi lagar to slike lister i Scratch, som på biletet:


I prosjektet blir brukaren spurd om tre bokstavar, og taktikken er at desse skal lagras i eitt og same tal. For å få alle tre ASCII-kodane inn i eitt tal finn vi først koden for den første bokstaven og gangar den med 1000000 (ein million). Så legg vi til koden for den neste bokstaven ganget med 1000 og så den siste koden. Da vil vi få eit nisifra tal, der dei første tre gir den første bokstaven, dei neste tre den andre bokstaven og dei siste tre den tredje bokstaven.





Dette talet lagrar vi så i ein skyvariabel. På biletet ser du at variabelen inneheld talet 216 072 076.



Dette talet er altså ei omseting av tre bokstavar, men som no kan lagrast i ein skyvariabel. Du kan jo sjølv slå opp i ASCII-tabellen for å sjå kva det står der. For å få tilbake det opprinnelige namnet (altså dei tre bokstavane) må vi plukke frå kvarandre dette talet og slå opp i lista over ASCII-verdiar igjen. 



For å få den første bokstaven må vi første kvitte oss med dei seks siste desimalane for å kunne få talet 216. Da deler vi først på 100000 og tek heiltalet (modulo) av det. Trekker vi dette frå det opprinnelege talet står vi igjen med 216 000 000. Da kan vi dele dette på ein million for å få 216. Så slår skriptet opp posisjonen av 216 i ASCII-lista, og ser at der står det 28. Til slutt finn vi det 28. elementet i den alfabetiske lista, som gir oss Ø. Tilsvarande gjer vi for dei neste to siffergruppene og sett saman resultatet for å få dei tre initialene. Skulle ikkje forundre meg om det er ein kar ved namn Øyvind som har fuska seg til highscore her.

Det er nok fleire måtar å forbedre dette skriptet på, slik eg gjorde det her er kun henta frå hukommelsen frå eit snart tredve år gammelt programmeringskurs. Mulege forbedringar av dette highscore-konseptet er at ein kan bruke tre nettvariabler for dei tre bokstavane for å gjere det litt mindre matematisk komplisert å omsete mellom tal og bokstavar. Treng ein forresten å halde seg til ASCII-kodar? Ein kan jo like gjerne dikte opp sine eigne kodar for dette. Ein kan sjølvsagt lagre lengre ord, men det blir fort ganske omstendelege scratch-kodar om ein skal skrive det ut i ei snakkeboble. Derfor vil det nok trenges eit lurare triks om ein skal skrive lengre ord. Det er vel og ei grense på kor mange skyvariablar ein kan bruke i eit prosjekt. 

Sjå inni prosjektet under for å sjå korleis dette fungerer: