Til almen orientering

Blot så der ikke opstår misforståelser.

Uagtet at jeg er kasserer i en forening du har hørt om.

Eller engang har været kasserer i en anden forening du har hørt om.

Eller at jeg er civilingeniør.

Eller at du sådan set bare ikke kan finde ud af at bruge en computer.

Så gælder det, at det, med mindre andet er skriftligt aftalt (og det er det ikke), så er jeg ikke din private IT-supporter

Hjemmelavet tonic

I sommers – det vil sige sommeren 2016, var det næsten umuligt at finde et sted hvor man kunne købe kinabark. Det skyldtes, at Politiken havde offentliggjort en artikel, der fortalte hvordan man kunne lave sin egen tonic.

Og så skulle alle hipsterne naturligvis lave deres egen tonic, hvilket var irriterende for mig, for så kunne jeg ikke købe kinabark til at lave min egen tonic. (lad min nu være ærlig, det var ikke noget jeg gjorde før artiklen, jeg fik samme ide som hipsterne).

Men jeg har en god hukommelse, så jeg ventede, og nu er jeg gået igang med at lave min egen tonic. Hipsterne er gået videre til næste mode, og det er igen til at få kinabark.

Jeg startede – det var før jul, med Politikens standardopskrift. Den var OK, men jeg syntes at den smagte for meget af citron(græs). Så nu er jeg gået igang med at udvikle min egen opskrift.

Første forsøg var efter følgende recept:

  • 2 stilke citrongræs: 39,3 g
  • 6 allehåndebær: 0,4 g
  • 1,5 spsk kinabark: 11,3 g
  • Citronsyre: 20,0 g
  • Stjerneanis: 0,8 g
  • Fintrevet skal af 3 økoappelsiner: 16,5 g
  • Saften af samme tre appelsiner: 200 ml.
  • 1 l vand
Alle ingredienser afvejet, og klar til at komme i gryden.

Allehånde og stjerneanis knuses let i morteren. Citrongræs klippes i mindre stykker, og knuses i morteren. Alle øvrige ingredienser hældes i en gryde, der bringes i kog.

Fra gryden kom i kog, kogte den under middel varme i 21 minutter under låg.

Hele balladen blev hældt gennem en sigte, og derefter gennem min superbag. Og derefter gennem kaffefiltre. Jeg tror jeg nåede op på 15 kaffefiltre, og var nødt til at tage en tur til Fakta for at købe flere.

Og så var klokken blevet mange. Der var hældt 1,2 l væske i gryden, og nu var der 850 ml tilbage – kaffefiltrene havde taget deres del. Så det blev hældt på en bluecap flaske, og sat på køl til dagen efter.

Der var lidt snask i bunden af flasken da jeg hælde den i gryden dagen derpå. Og det var blot det der var fint nok til at komme gennem kaffefiltrene. Anyway. 751 gram sukker blev opløst under opvarmning, blandingen blev bragt i kog, der blev skummet af, og siruppen blev hældt på skoldede flasker.

Og hvordan smagte det så? Jeg fortyndede 42 ml sirup med 80 ml danskvand (fra sodastreameren). Og kunne godt fortyndes noget mere. 50 ml af det fortyndede blev fortyndet til 100 ml. Og så var den tættere på det ønskede resultat. Helt så meget skal den nu ikke fortyndes, jeg skal lande på en mellemproportional. Og så kunne den i øvrigt godt bruge noget mere citrongræs. Måske skulle en af appelsinerne erstattes med en citron. Det prøver jeg næste gang. Politiken foreslog at man kunne eksperimentere, og det er præcist hvad jeg har i sinde at gøre. Så næste forsøg får ud over citron(græs) også en sjat tørrede hyldeblomster.

Andre tip? Næste gang prøver jeg nok at skumme af inden blandingen hældes gennem kaffefiltrene. Citronsyre kan man købe i supermarkedet. Eller på nemlig.com. Der koster det 347,50 kr kiloet.
Man kan også købe det i Matas. Der koster det 137,50 kr kiloet. Jamen er det ikke farligt? Der er jo en faremærkning på! Jo, det kan give alvorlige øjenirritationer hvis man får det i øjnene. Dr. Oetkers fra supermarkedet giver nøjagtig de samme øjenirritationer. Og når man læser på bøtten fra Matas, står der i øvrigt at citronsyren er af levnedsmiddelkvalitet. Så lad være med at gøre nogen rige på at putte citronsyre i små poser.

Hvor meget får man ud af det? Jeg målte ikke. Men der var nok til at fylde 4 kvartlitersflasker. Og så en sjat til (det var de 42 ml fra tidligere). Jeg skal have set på hvad der egentlig sker af volumenændringer når man opløser sukker i vand.

Bemærk også at jeg har vægtangivelser på her. Politiken angiver et antal stilke citrongræs. Men der er katten til forskel på sådan nogen stilke. De fortæller også at man skal bruge 1½ spsk kinabark. Men hvor meget er det? Vægt angivelser er langt mere præcise og reproducerbare.

Lige hvad kinabarken angår. Der testede jeg faktisk. Jeg tog en spsk (det er i øvrigt 15 ml) kinabark 20 gange, og vejede det. Det gav følgende resultater (alle mål i gram):

8,5 7,5 7,3 7,9 7,8
6,5 7,4 8,1 7,7 7,6
6,8 7,5 7,5 7,0 6,8
7,6 7,9 7,6 7,3 7,7

Se, det er pænt store variationer. Der er tal mellem 6,5 og 8,5 gram. Hvis Politiken brugte det mindste mål, og jeg brugte det største – så er det en forskel på vores opskrifter på 30%. Det er faktisk ret meget.

Så i stedet regnede jeg snittet ud – det er 7,5 g pr 15 milliliter. Eller 0,5 gram/ml. Og når Politiken angiver at man skal bruge 1½ spsk – hvilket så svarer til 22,5 ml, finder man ud af at der bør vejes 11,25 g kinabark af. Så præcis er min vægt ikke, så det blev til 11,3 g.

Twitternetværk

Twitter er ikke specielt stort i Danmark. Men det er der dog. Det lader til primært at være brugt af politikere, der ønsker at kommunikere til journalister, journalister og andre kommmunikationsfolk der ønsker at kommunikere med andre journalister og kommunikationsfolk. Og bibliotekarer, der desperat forsøger at kommunikere med hvem som helst. Det er i høj grad ikke et folkeligt medie, men snarere det LinkedIn godt ville være.

Ønsker man en faglig selvpromovering kan det derfor, specielt når man er i biblioteksbranchen, være en rigtig god ide at være på Twitter. Så det er jeg. Det er sat i system. Jeg sætter tid af hver weekend til kvidren – de lagres i tweetdeck, og spredes ud over ugen, og hver mandag går jeg lige efter og sikrer mig at jeg har til resten af ugen. Dertil kommer en række løse tweets i løbet af ugen. Men der kvidres hver dag.

Jeg går også semiseriøst efter flere følgere. Der er optimeringspotentialer: Hvem fulgte jeg hvornår, og hvis de ikke har fulgt tilbage, var det så ikke på tide at affølge dem. Hvem har unfollowed mig i dag? Skal jeg blive ved at følge dem? Og så videre. Jeg trækker ved hjælp af et pythonscript på en Raspberry Pi oplysninger om hvor mange følgere jeg har en gang i timen, og trækker de samme oplysninger på et antal kolleger i branchen. Skal jeg udbygge det netværk til noget der kan bruges (og det kan det!) i mit arbejde, skal jeg have et synligt mål og kunne følge udviklingen. Jeg skal have flere følgere end Knut – ikke fordi jeg konkurrerer med ham, men fordi jeg skal have et mål, gerne et der bevæger sig lidt (men ikke for meget) , som jeg kan gå efter.

Så langt så godt, der har været andre indlæg der har omtalt det. De burde opdateres, for jeg har omsider fået adgang til Twitters API, og kan nu trække data langt hurtigere, elegantere og legalt, end jeg kunne før.

Men det virker, og selvom jeg skal have migreret et script til python3.4, er det ikke noget der haster.

Så ud over de mindre potentielle indsatsområder, så er der en anden ting der kunne være interessant. Også for andre end mig. Nemlig: Hvordan ser netværkene ud? Hvordan er de danske bibliotekarer forbundet på dette, i en dansk kontekst trods alt relativt begrænsede økosystem?

Der er nogle trin på vejen. Nogen af dem har jeg styr på.

Jeg skal bruge oplysninger om hvem der følger hvem. Lad os bare nøjes med Knut og mig. Hvem følger mig? Hvem følger Knut? Hvem følger vi hver især? Er der nogen vi begge følger? Hvor er de gensidige forbindelser?

Det er trivielt. Der er lidt udfordringer i at jeg ikke kan trække mere end 200 følgere ad gangen, og at jeg ikke kan gøre det mere end en gang i minuttet. Det er der veje uden om.

Hvad jeg har lidt flere problemer med, er at få styr på hvordan jeg vil visualisere det. Der er fine frameworks derude. Det ender nok med D3 til det her formål, den kan også lave fine animationer. Traditionelt gøres den slags med bobler, og det er vel oplagt at min bobbel i grafen har en størrelse der er proportional med det antal følgere jeg har. Derfor vil Knuts også være større.

Så har jeg nogen der følger mig, uden at jeg følger dem. Der skal være en linie af en eller anden art mellem deres bobbel, og min bobbel. Det betyder også at jeg skal have en ide om hvor stor deres bobbel er – jeg skal have trukket oplysninger om hvor mange følgere de har.

Så er der dem som jeg følger, og som også følger mig. der skal også være en linie af en art mellem os.

Endelig er der dem jeg følger, som ikke følger mig. Der skal ligeledes være en linie.

Boblerne er simple. Eller, det er de nok ikke, men det er ikke det jeg har svært ved at folde hjernen om. Det der udfordrer mig er linierne (eller kanterne) i netværket. Der er tre typer. Hvordan skelner jeg mellem dem?

Farver? Det ender det nok med.

Man kunne også overveje om det kunne gøres enklere. Der findes værktøjer derude til den slags. Twecoll for at være mere præcis.

Well. D3. Farver på de forskellige kanter. Så skal der trækkes data. I et eksempel jeg har fundet, tager D3 en JSON fil, med nodes og links. Disse nodes har en source og et target. Det giver god mening for alle andre end de links der er gensidige.

Jeg tager lige et kig på denne her: http://bl.ocks.org/mbostock/4062045

Det er en lidt kølig visualisering af hvilke karakterer der optræder sammen i Les Miserables. Selve koden tror jeg at jeg starter med at kopiere. Så skal jeg generere en JSON-fil. Den har en source et target og en value i link-delen. Hvad der forvirrer mig er, at dens nodes liste har navne og “gruppe”. Gruppe kan man lege med. Men der er ikke et ID der matcher source i links. Der lader det til at være således, at ID’erne matcher positionen i listen i nodes. Hm. Jeg ville klart foretrække at ID’et var et sted i Nodes. Det skal jeg nok tænke lidt mere over.

Rambling on. Vi gør det som D3 vil ha’ det. Så skal jeg bare have det genereret.

Jeg har en liste i json-formatet med de enkelte nodes. De har et navn. Og kan have andre atributter også. I det eksempel jeg tager udgangspunkt i, har de en gruppe. Og det er det. Jeg skal bruge deres index i en liste. Så det første jeg skal er at få genereret den. Jeg trækker alle som følger Knut. Og alle som følger mig. Det giver to lister med twitter-id. Dem gemmer vi i hver sin fil. Hvert eneste ID i den liste er karakteriseret af at de følger Knut eller mig.

Det ville altså være lettere hvis jeg kunne bruge twitter-ID direkte. Det sparer et opslag i node-listen hver gang.

Og det kan man: http://plnkr.co/edit/20t4F02vsM1U55ktCv66?p=preview

Også:

http://stackoverflow.com/questions/23986466/d3-force-layout-linking-nodes-by-name-instead-of-index

Godt. Så vender vi tilbage til at generere listen over edges… Helt så trivielt er det heller ikke.

Visualisering af diverse data

Nørd-nørd-nørd. Og den mere detaljerede beskrivelse er, af hensyn til min faglige selvpromovering, publiceret andetsteds. Så her napper vi bare en gauge på noget data der ligger i et Google Spreadsheet. Mest for lissom at have det liggende så jeg kan finde koden igen.




Mere web automatisering – LinkedIn og Twitter

Hvordan får man automatisk trukket data ud om hvor mange følgere man har på Twitter?

Hvordan får man automatisk trukket data ud om hvor mange kontakter man har på LinkedIn?

<indsæt plidder-pladder om hvorfor det er vigtigt at have en tilstedeværelse på sociale medier og betydningen af hvor meget man har det og hvorfor nørder vil automatisere det ret kvantificerbare mål>

Med andre ord det skal ske automatisk. Hvordan?

Selenium to the rescue!

Og her er koden:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get(“http://dk.linkedin.com/in/cbknudsen”)
content = driver.find_element_by_class_name(‘member-connections’)
print content.text
driver.close()

driver = webdriver.Firefox()
driver.get(“http://twitter.com/nusse”)
content = driver.find_element_by_class_name(‘ProfileNav-item–followers’)
print content.text
driver.close()

 

Man indsætter naturligvis de rette links til rette sider. Det her er dem jeg interesserer mig for. Der skal naturligvis suppleres med noget der fanger tallene. Lige nu får jeg følgende ud:

247
forbindelser
FOLLOWERS
44

Og jeg kan godt nøjes med de to tal. Der så skal sendes til et eller andet sted, og plottes og sådan.

Rotoscoping

I ved godt hvad det er – I så det i A-HAs hit “take on me”.

Her er en katte-gif. I gamle dage var GIF bare et grafikformat. De kunne godt nok animeres, men det var lidt tungt, filer fyldte for meget og sådan. Og så blev de primært brugt til at lave hjemmesider der ikke var til at holde ud at se på.

I dag er de på mode igen – så meget at folk ikke tror at GIF også bare er et billedformat, men at de fuldstændigt er associeret med animerede gifs.

Men det var ikke det der var den egentlige pointe. Pointen var at lave en rotoscopet animeret gif.

Man starter med at finde en gif. Her er en god en, der fint illustrerer hvordan jeg har oplevet de sidste ca. 24 timer (nu er der kun fem kvarter til det er weekend. Yay!)

giphy

Og her er så resultatet af en rotoscoping:

t00zm

Nå. Hvad gjorde jeg så?

  1. Jeg startede med at lede efter et billede der udtrykte min sindstilstand. Egentlig var det et hamsterhjul med en hamster jeg ledte efter. Men det passede sgu meget godt at katten havde fået skåret halen af (stakkels kat). Giffen blev downloaded.
  2. I IrfanView (enestående fantastisk program!!!) splittede jeg filen af i dens enkeltbilleder.
  3. Hvert enkelt billede fik følgende behandling:
    1. CTRL-E – vælg edgedetection. Det finder “kanterne” på billederne, der hvor der er overgange mellem forskellige farver.
    2. ALT-I (for image), vælg negative – alle kanaler.
    3. Gem.
    4. Egentlig burde hvert enkelt billede også konverteres til gråtoner, det ville få det endelige resultat til at fylde mindre. Det var jeg for doven til.
  4. Herefter skulle billederne samles til en animeret gif igen. Det skete på ImgFlip. Der er andre værktøjer. Jeg har bare ikke fået downloadet GIMP endnu, efter min forlovede har opgraderet computeren til windows something (10?). Så jeg hoppede på nettet og fandt noget.
  5. Vupti! Der er et vandmærke der irriterer og sådan. Og næste gang laver jeg øvelsen under punkt 3 i ImageMagick i stedet. Den kan nemlig automatiseres. Det kræver en særligt desillusioneret hjerne at sidde og gøre det i hånden for par-og-firs billeder.

Hep! Sådan.

Smartphone del IV – A New Hope

Da vi forlod den adskilte telefon sidst, var kredsløbet lavet. Drejeskiven skulle blot forbindes med det, og Arduinoen ligeså. (OK, jeg sprang selve fremstillingen af kredsløbet over. Det var en rask lille loddeøvelse med et strip-board, to modstande og tre to-polede skrueterminaler).

Nu lader vi så som om at kredsløb, Arduino og telefon er forbundet. Så skal der kodes. Som tidligere nævnt er der stjålet med arme og ben fra den her Instructable.  Det er koden, med et par tilretninger, også.


int needToPrint = 0;
int count;
int in = 7;
int lastState = LOW;
int trueState = LOW;
long lastStateChangeTime = 0;
int cleared = 0;

// constants

int dialHasFinishedRotatingAfterMs = 100;
int debounceDelay = 10;

void setup()
{
Serial.begin(9600);
pinMode(in, INPUT);
}

void loop()
{
int reading = digitalRead(in);

if ((millis() – lastStateChangeTime) > dialHasFinishedRotatingAfterMs) {
// the dial isn’t being dialed, or has just finished being dialed.
if (needToPrint) {
// if it’s only just finished being dialed, we need to send the number down the serial
// line and reset the count. We mod the count by 10 because ‘0’ will send 10 pulses.
Serial.print(count % 10, DEC);
needToPrint = 0;
count = 0;
cleared = 0;
}
}

if (reading != lastState) {
lastStateChangeTime = millis();
}
if ((millis() – lastStateChangeTime) > debounceDelay) {
// debounce – this happens once it’s stablized
if (reading != trueState) {
// this means that the switch has either just gone from closed->open or vice versa.
trueState = reading;
if (trueState == HIGH) {
// increment the count of pulses if it’s gone high.
count++;
needToPrint = 1; // we’ll need to print this number (once the dial has finished rotating)
}
}
}
lastState = reading;
}
Det er rimeligt velkommenteret.  Så det vil jeg ikke give mig i kast med.

Når programmet er kompileret og sendt til Arduinoen, åbner man sin Serialmonitor, drejer på skiven. Og så får man det drejede tal på skærmen. Fikst.

Star Trek – i kronologisk orden

Vi skulle have aftenen til at gå.

Foran flimmeren.

Jeg foreslog at vi skulle se DS9-afsnittet “Trials and Tribble-actions”.

Så fik vi lyst til at se hele Star Trek kanon igen. Det var en af vores bonding-øvelser da vi startede med at date. Nu er vi blevet forlovede. Sidst nåede vi at se det hele, inden vi tog til Star Trek con i London. Det er ikke sikkert vi når at se det hele inden vi skal giftes.

Men så skulle vi jo se det på en anden måde. Man kunne se det baglæns, men det jeg personligt elsker ved Star Trek, er at der er en kanon. At der er en historie der strækker sig fra 1947 (1937?) til 2378. Eller deromkring. Og at der sådan i det væsentlige er intern konsistens.

Der er også en tidslinie. Kalendersystemet er baseret på Stardates. Mange afsnit indledes med “Kaptajnens kævle, stjernedato 47474.2”, eller noget i den stil. Så… Hvorfor ikke se dem i stardate orden?

Det er så en udfordring. Indtil TNG var det der med stardates en lille smule rodet. Mildest talt. Og der er også uorden i TNG. Det er sådan set først fra omkring sæson 5-6 stykker af TNG, at der er orden i systemet. Og når vi når dertil. Ja, så er der overlap, fordi TNG og DS9 kører samtidig. Og DS9 og VOY overlapper også.

I ENT er der styr på det. Der bruger de så ikke stardates…

Den side de allesammen henviser til når man leder efter en liste over Star Trek i kronologisk stardate orden, er The Star Trek Chronology Project (TSTCP). Der er arbejdet gjort grundigt, der tages hensyn til de lange historiefortællinger. Der er styr på problemet med Tasha Yar, der, efter stardates at dømme, først er levende, så død, og så levende igen.

Men de har ikke TAS med! TAS betragtes af mange som non-kanon. Den er animeret og falder udenfor. Jeg mener (og derfor er det sandheden), at TAS må være en del af kanon. Hvis du møder en trekkie der ikke mener at TAS er kanon – så spørg hvad kaptajn Kirks fulde navn er. Hvis han siger James Tiberius Kirk, kan du råbe HA! og pege fingre af ham eller hende. I det der traditionelt betragtes som kanon, film og serier, eksklusive TAS, får vi at vide at han hedder James T. Kirk. Vores viden om hvad T’et står for, stammer fra TAS. Så deeet.

Anyway, jeg hygger mig lidt med at få skrabet kronologien, få indsat alle TAS-afsnit med stardate. Og så sorterer vi. Resultatet skal nok komme op her.

Og så skal vi have fundet ud af om vi vil se det i streng stardate orden, eller om vi vil følge de krumspring folkene bag TSTCP har lavet for at få enderne til at mødes.

Smartphone del 3

Godt. Da vi slap føljetonen sidst, havde jeg udbredt mig om at drejeskiven sendte pulser. Det er lidt mere kompliceret.

Drejeskiven er en såkaldt Normal-On kontakt. Det vil sige, at når vi påvirker den, så slutter kontakten. Der er forbindelse gennem ledningerne. Hvis man drejer 3 på skiven, så afbrydes forbindelsen tre gange. Det er altså ikke tre pulser hvor der pludselig er strøm vi skal tælle. Men tre tilfælde af at “nu-er-der-ikke-strøm-længere” vi skal tælle.

Det kan man naturligvis programmere sig ud af. Men det forekommer ulogisk. I stedet laver vi et lille kredsløb.

Det ser sådan i grove træk sådan ud.

rotphon

Vi ser kredsløbet i den situation hvor drejeskiven har nået et af de punkter hvor forbindelsen afbrydes. D7 er den pin på Arduinoen jeg ønsker at læse pulser på. Der går nu 5V ind i kredsløbet, det kan ikke komme til jord, så de går til D7. Som Arduinoen læser som HIGH. hvis vi slutter kontakten – det er altså drejeskiven når den er mellem pulser, er der mindre modstand til jord end gennem modstanden før D7. Og dermed ikke megen spænding på D7. Og dermed går den LOW. Når der drejes 3 på drejeskiven, og forbindelsen gennem drejeskiven derfor afbrydes 3 gange, kommer der tre “HIGH” pulser på D7. Dem kan vi tælle.

Det vender vi tilbage til.

Jeg skylder at nævne at inspirationen er fundet på denne side hos Instructables.

Smartphone del 2

OK. Så låget kom af, der blev målt igennem. Og jeg opgav at bruge røret til noget. (Det sidste passer ikke helt, det var først senere, men det her er et indlæg der samler op på et par ugers arbejde med den).

Som man kan se, er der ikke meget elektronik i sådan en telefon. De fleste der er lidt ældre end 30 har set sådan en grå drejeskivetelefon. Det var den første model der for alvor fik seriøs udbredelse i Danmark. Og i virkeligheden i resten af verden. Før da var der ikke mange der havde telefon. Og mange delte dem. Der er en udmærket side her, der omtaler telefonsystemet tilbage i 60’erne og 70’erne. Før min mor begyndte at læse til hospitalslaborant, var hun faktisk beskæftiget som telefonist. Jeg tror stadig hun har sin gamle kittel et sted derhjemme. Længere tid siden er det faktisk ikke.

Den model telefon jeg har gang i her, blev fremstillet af Kirk i Danmark, på licens fra Ericsson – de lavede engang mobiltelefoner. Det går ikke så godt i dag. Men dengang var de store. Telefoner var ved at få deres gennembrud, og der skulle fremstilles millioner af telefoner til en voksende middelklasse i hele den vestlige verden. I mange hjem – rigtigt mange hjem – var det den første telefon der kom i hus. Så svenskerne var grundige. Telefonen var gennemdesignet, der var sågar tænkt over hvor meget lys der slap ind i telefonen – det betyder nemlig noget for hvor mange insekter der kan finde på at kravle ind i den. Og insekter i nærheden af elektromekanik er en dårlig ide.

Med andre ord, det er rigtigt godt og solidt kram, der stadig virker. Nerdgasm!

Måden det fungerede på var, kort fortalt, at telefonen, ved bevægelse af drejeskiven, sendte et antal elektriske pulser til centralen. Hver puls bevægede et elektromekanisk relæ. Når centralen havde fået 8 pulser, var relæet skiftet til position 8. Så drejede man det næste ciffer, eksempelvis 4. Centralen modtog 4 elektriske pulser, og skiftede det næste relæ til 4. Og når man havde drejet nok cifre, var der forbindelse.

Det betyder, at drejeskiven giver et antal pulser på et par af de tre ledninger der går fra selve drejeskiven. Det er dem der er skruet løs på billedet her:

telefon

Kan man nu på en eller anden måde forbinde de ledninger til en Arduino kan man få den til at tælle pulserne. Og så har man det tal der blev drejet.

Det vender vi tilbage til.