Pan-tilt with Adafruit

I don’t usually post here in english. But I have the feeling that others might find this useful, so.

OK, I was looking for a DVB-T receiver, I would like to pick up transponder signals from passing airplanes. I went to Pimoroni, and found this: Cooooool!

Bought it, waited for it. Got it. How to control it?

Well, it uses two small servomotors. Those take a PWM-signal. And my Raspberry Pi have only one pin that can handle that.

Luckily other people have wanted to play with this. Richard Hirst have written a kernelplugin to Rasbian, that allows us to add servo control. The plugin is called ServoBlast. And I got it on my Raspberry in this manner:

First I installed Git:

sudo apt-get install git

Then I cloned the servoblaster code

git clone git://github.com/richardghirst/PiBits.git

Got into the directory:

cd PiBits/ServoBlaster

Cursed a lot, and finally found my way into the right directory:

cd user

Ran the make commando:

sudo make install

And that was it! I’ll have to talk to my husband if I want to understand what actually happened. But now I was actually able to control the servos. How did I know that? Well, there is a hardware side as well.

The servos requires 5V, and although the Pi have a 5V pin, I ran it from an Arduino. There are two cables on the assembly. One for each motor. The red lead on both is connected to 5V from the Arduino. The browns to ground. And the yellow ones, which is the data-line, to pin 7 and 11 on the Pi. One of the ground pins on the Pi was connected to the Arduino.

And now, all I have to do write this on the commandline:

sudo echo 1=120 -> /dev/servoblaster

And the servo connected to pin 11 will move. Neato.

Heres a litte Python script to control the two servos graphically:

from subprocess import call
from tkinter import *

master = Tk()

def getSlider(event):
a = “echo 1=”+str(SliderV.get())+” > /dev/servoblaster”
b = “echo 0=”+str(SliderH.get())+” > /dev/servoblaster”
call ([a], shell=True)
call ([b], shell=True)
print(SliderH.get())

SliderH = Scale(master, from_=30, to=250, orient=HORIZONTAL, command=getSlider)
SliderV = Scale(master, from_=30, to=250, orient=VERTICAL, command=getSlider)
SliderH.set(0)
SliderH.pack()
SliderV.set(0)
SliderV.pack()

mainloop()

 

Adjust the “from” and “to” numbers to suit your servos.

Done!

 

En SEP-felt generator

Nåmmen jeg har været leder i tre år. Det er jeg ikke længere. Mit lille bibliotek skulle flyttes sammen med et andet.

Det har været en lang proces, i skrivende stund har det været i støbeskeen i over et år. Og det er ikke faldet på plads endnu. Det har også været en hård proces. Noget af det første vi skulle tale om var hvordan ledelsesgruppen lissom kunne støtte mig i at stå i den håbløse situation de havde placeret mig i, så jeg ikke tabte entusiasmen og gejsten. Den snak venter vi stadig på. Men ledelsen af biblioteket er overdraget. Og nu skal jeg så slippe det, og lære at det ikke er mit bibliotek længere. Det kræver at jeg betragter problemer der som en andens problem. Det er de jo nu.

Det giver mig straks associationer til Douglas Adams SEP-felt generator. Det er den praktiske løsning på hvordan man gør ting usynlige. Man kan godt gøre et gigantisk rumskib der hænger frit i luften ved siden af en cricket-match usynligt. Det er bare besværligt og energikrævende. Det man i stedet kan gøre er, at udforme sit rumskib som en gigantisk lyserød elefant. En gigantisk lyserød elefant kan ikke eksistere, og da slet ikke frit svævende i luften. Hvis den gør, var det noget man ville være nødt til at forholde sig til. Og hvad katten stiller man op med sådan en? Så i selvforsvar bortredigerer ens bevidsthed elefanten. Den er nu for alle praktiske formål usynlig.

Vi kender det godt fra virkeligheden. Den dryppende vandhane er noget man burde gøre noget ved. Men det er besværligt. Hvis nu det er en andens problem, kan man ignorere den. Og mennesker er så gode til at ignorere besværlige ting, at den dryppende vandhane for de fleste praktiske formål reelt ophører med at eksistere.

Tilbage til Håndbog for Vakse Galakseblaffere. Der har man udnyttet konceptet. Man har simpelthen lavet en dims der genererer et “somebody-elses-problem”-felt. Tænd for den, og alt inden for dets rækkevidde bliver automatisk til en andens problem. Og dermed usynligt.

Det er sådan en jeg har brug for. Den må jeg bygge. Jeg kan naturligvis ikke bygge en rigtig. Men jeg kan bygge en symbolsk SEP-felt generator. Som en mentalhygiejnisk foranstaltning.

Hvordan skal den så se ud?

Ja, vi ved lidt fra Adams. Vi ved at den kan køre i mange år blot med et enkelt batteri. Det egentlige arbejde udføres af vores bevidsthed, feltet skal blot overbevise os om at hvad det nu end er, er en andens problem. Vi ved også at det ikke kan slukkes. Jo formentlig fordi generatoren befinder sig inde i feltet, og dermed også bliver usynligt. Og det er egentlig hvad vi ved. Resten er op til min fantasi.

Så. En knap der tænder. Men ikke kan slukke. En lysdiode – der viser at dimsen er tændt. Og som ikke slukker igen. Der skal været et batteri. Og så skal der være et eller andet der siger “feltgenerator”. En antenne eller noget. Der må også godt være andet, der lissom signalerer teknik.

Det var kravene. I næste uge kigger vi på lidt flere detaljer.

Kunstig ældning af træ

Jeg har gang i et lille projekt af mentalhygiejnisk karakter. Det vender jeg tilbage til, men en af tingene jeg godt ville, var at få farvet en trækasse. Jeg var lidt ude efter noget der fik kassen til at se gammel ud. Der skal klart eksperimenteres lidt. Men jeg er egentlig ganske godt tilfreds med det foreløbige resultat.

Opskriften er simpel og let at gå til. Men det lugter fælt. Der er tale om en to-komponent farvning. Først males træet med te. Sort te. Når det er tørret, har træet fået en smule farve. Men den virkelige forskel kommer i andet lag. Den skal man forberede dagen før.

Man tager noget jern. Man kan vist bruge almindelige jernsøm, men jeg hev fat i en skuresvamp af ståluld, og vaskede det værste sæbe ud af den. Svampen røg i et sylteglas, og blev overhældt med eddike. Den almindelige brune sylteeddike. Og der hyggede den sig i 24 timer.

Resultatet var en gullig-grøn væske. Der lugtede aldeles hæsligt. Så det foregår passende under emhætten, eller i frisk luft. Det sidste var det lidt for koldt til. Væske males på træet, og efter kort tid, får det en frønnet grålig farve. Det kan ses her til venstre. Den første pind er ubehandlet. Nummer to har fået te. Der er ikke meget stor forskel, og slet ikke med den dårlige belysning jeg tog billedet ved. Men nummer tre er der helt klart sket ting med. Den skal have et lag eller to til, men det ønskede resultat er opnået.

Det er ikke helt klart for denne kemiker hvorfor en opløsning af jern i eddike burde lugte at ret meget andet end eddike. Men det gør den. Rester af sæbe, og den karamel der er brug til at farve eddiken kunne influere, men de steder på nettet jeg har fundet der også har eksperimenteret med det her, omtaler samstemmende at det lugter fælt. Så jeg tror ikke helt at det kun skyldes karamel og sæbe.

Hvad jeg har bedre styr på er kemien i farvningen. Årsagen til at det skal være sort te er at vi skal have et højt indhold af tanniner. De findes allerede i træet, men er ikke nødvendigvis særligt tilgængelige. Så vi tilfører noget. Og så nytter det ikke noget at bruge blomsterte der ikke har tanniner. Det er i øvrigt dem der binder kalk og lægger sig som belægninger i tekrus.

Tanniner kan også reagere med jern-ioner. Og det er dem vi laver ved at opløse jern i syre. Når jern og tanniner binder til hinanden opstår der et farvet kompleks. Det er tidligere brugt til at lave blæk med, men rester af syre, og især jern-ioner, har en kedelig tilbøjelighed til at ødelægge papiret. Det er et ret stort problem når man ønsker at bevare papir for eftertiden, så lad være med at bruge den slags blæk.

 

Hjemmelavet gin

Når man laver sin egen tonic – så bør man vel også lave sin egen gin.

Gin er basalt set en kryddersnaps, hvor den primære smagsgiver er enebær. Det er sådan set definitionen på gin. Så det er jo ikke fordi det er svært.

Jeg er i den lykkelige situation, at jeg fik en Anova precision cooker i fødselsdagsgave sidste år. Og en af de opskrifter der er i den app der knytter an til den, er på sous vide gin.

  • Det er helt enkelt:
  • 3 ounces (88 ml) vodka
  • 10 korianderfrø
  • 8 enebær
  • 2 stk tørret lavendel
  • 5 hele peberkorn
  • 2 kardemommekapsler
  • 1 laurbær

Det hele smides i en pose der sænkes i vand for at få luften ud, og forsegles. Lynlåsposer anbefales. Dernæst får posen 10 minutter i vandbadet ved 80 grader.

Nu havde jeg ikke korianderfrø i huset. Og det lavendel jeg har, er så findelt at jeg aldrig får siet det fra igen.

Så i stedet lavede jeg en tester:

Så skal der bare vodka i!
  • 90 ml vodka
  • 8 enebær
  • 1 laurbærblad
  • 2 kardemommekapsler
  • 5 peberkorn

I stedet for at komme det i en lynlåspose, kom det i et sylteglas (160 ml)

I vandet – 80 grader – 10 minutter. Og så på køl, så jeg ikke skulle prøvesmage varm gin.

Der var ærligt talt ikke så mange nuancer i det – andet end peber, som overdøvede alt andet. Så det var rimeligt givet at der skulle skrues kraftigt ned for den.

Jeg havde annonceret dagens projekt på Facebook – og min lillebror, der også er kreativ i et køkken, kommenterede at han havde prøvet. Og at man med fordel kunne fordoble antallet af enebær. Så der blev lavet ti batches med varierende indhold. Basis i dem alle var:

  • 1 laurbærblad
  • 2 kardemommekapsler
  • 16 enebær
  • 3 peberkorn
  • 90 ml vodka

Og så variationerne:

Batchnumre, og tilsætning:

  1. 1 allehåndebær
  2. 2 allehåndebær
  3. 1 nellike
  4. 2 nelliker
  5. 5 fennikelfrø
  6. 10 fennikelfrø
  7. 1 lille stjerneanis
  8. 1 stor stjerneanis
  9. 5 kommenfrø
  10. 10 kommenfrø.

Alt på glas, der lukkes og sættes på vandbadet. Et ret stort et af slagsen. Normalt bruger jeg min suppegryde til sousvidingen. Men jeg ville godt lave alle 10 glas på en gang. Jeg kunne selvfølgelig bare lave fem ad gangen. Krydderurterne skal jo filtreres fra, og det kunne jeg passende gøre mens de næste fem kom i gryden. Men bagefter havde jeg planlagt at glassene skulle i brug igen til næste uges morgenmad (man kan ane dele af det på panden i baggrunden). Og der skulle de være i vandet i en time. Og så ville det blive lidt for bøvlet. Så ned i kælderen og finde en termokasse – vi bruger dem når min vi holder fødselsdag for min mand, og hele svigerfamilien + min side er der. Og der derfor skal laves mad til 18 mennesker. Elkedlen op at koge, hælde kogende vand over låget – ja, den kan godt tåle 100 grader. Montere Anovaen, hælde vand i – hold da op hvor skulle der meget vand i. Så støbejernsgryden og et stort sylteglas kom med ned i kassen. Det endte med at se således ud. Det er strengt taget noget rod at sætte en støbejernsgryde i – den kræver ret meget energi at varme op. Der er jeg nok nødt til at finde en mere fiks løsning til næste gang.

Nå. 80 grader. 10 minutter. Alle glassene blev taget op, og indholdet filtreret over på andre glas. Og så var det sådan set bare at vente på at det var blevet så koldt, at man kunne prøvesmage. Jeg har ikke taget billeder af prøverne – de var stort set ens. Det der er pointen er egentlig, at det ligner urinprøver. Det er meget gult, og det kunne nok være interessant at teste hvor farven egentlig kommer fra. Jeg har – baseret på tidligere eksperimenter med pebersnaps – en fornemmelse af at det i ret høj grad er peberen der giver meget af farven.

Anyway. Hvordan smagte det?

Batch 1 og 2. Det var dem med allehånde. Den bliver ret kraftigt krydret. 2 allehåndebær er klart for meget. Og 1 enkelt er faktisk også i overkanten.

Nellikerne i batch 3 og 4. Nelliken er meget tydelig allerede med en enkelt nellike. Så batch nr. 4 smagte ikke overraskende alt for meget af nellike.

Så var der fenikel. Det smagte klart anderledes end de andre udgaver. 10 fennikelfrø er efter min mening ikke for meget.

Stjerneanis. Batch 7 og 8. Der skal helt klart stjerneanis i den endelige opskrift. Men ikke en hel. Den lille smagte af lidt for meget – det skal være gin, ikke ouzo. Så i hvert fald ikke en hel stor stjerneanis.

Kommen. Nixen bixen. Der var ikke meget stor forskel på batch 9 og 10. Men der skal nok ikke kommen i overhovedet.

Samtlige batches, det der var tilbage efter jeg havde prøvesmagt – blev hældt sammen. Der er stadig lidt over halvdelen tilbage. I virkeligheden er jeg mere til rødvin end gin.

Næste forsøg? Ja, jeg skal have lidt styr på hvor farven kommer fra. Jeg tror meget af det kommer fra peberen. Og når jeg egentlig ikke er så meget til peber, så kan det jo være lige meget.

Så skal jeg have styr på kvantificeringen af stjerneanisen. Det er ikke specielt præcist at angive “lille stjerneanis”. Jeg skal have fundet ud af hvordan jeg får skruet ned for nelliken. og allehånden. Og så skal det naturligvis overvejes hvilke andre smagsgivere jeg kan komme i.

 

 

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.

Videre nørd i R

Nå. Jeg har høstet data fra Twitter ved hjælp af Python.
Og jeg har visualiseret ved hjælp af Googles visualiserings API. Lækkert.
Jeg har endda fundet ud af kombinere det basale forespørgsels sprog i samme API med Highcharts, så jeg kan lave
live-visualiseringer. Der er lidt der skal pusles med endnu før jeg vil vise det frem. Og det giver også mest
mening i et eksempel hvor der opsamles live-data.

Men kan jeg også visualisere i R? Det er jo også et nyttigt værktøj, som jeg skal lære at kende.

Vi starter med at exportere data i CSV-formatet fra Google spreadsheet.
Dernæst importerer jeg det i R:

twitterdata <- read.csv(file="C:\\Users\\mrk718\\Desktop\\twitterdata.csv",head=FALSE, sep = ",")

Der er dobbelt backslashs fordi backslash bruges til at escape tegn med i R. Derfor skal backslash escapes med et
backslash. \\.
Jeg har ikke kolonneoverskrifter i regnearket. Det skal der nok være fremadrettet, da det gør det lettere at opstarte
en ny dataindsamling. Men derfor: head=FALSE. Og det er komma-separeret, så sep=",".

Så er det inde. Der kan let laves et plot af punkterne.

plot(twitterdata$V1,twitterdata$V2)

Kedeligt plot. primært fordi datoerne ikke er der, så de står som et eller andet i 12.

Efter en hurtig googling af hvordan man konverterer sådan et timestamp til en dato:

plot(as.POSIXct(twitterdata$V1, origin = "1970-01-01" ), twitterdata$V2)

Nu står der mindre, men stadig mærkelig datoer i X-aksen. 48138, 48140 osv.

Men hov! Mon ikke as.POSIXct tager udgangspunkt i UNIX-tidsstempler?
Javascript bruger millisekunder, UNIX nøjes med sekunder.

plot(as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01" ), twitterdata$V2)

Meget bedre. Nu står der godt nok "to" og "fr" på X-aksen. Det passer, men er ikke helt optimalt. I det mindste
har R her styr på at vi er i Danmark, og finder selv ud af at torsdag skal forkortes til to.

Navngivningen af x-aksen er heller ikke helt optimal. Der står

as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01" 

Y-aksen er ikke meget bedre.
plot(as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01" ), twitterdata$V2, xlab = "Tid", ylab = "Antal")

Hep, xlab="hvad jeg vil kalde min x-akse"

Så ylab = "Antal"

type = "l", og jeg har et line-plot. Ikke de pæne splines fra mine tidligere visualiseringer, men vi nærmer os.

Så tilføjer vi format="%d-%m %H:%M:%S" til POSIXct delen:

plot(as.Date(as.POSIXct(twitterdata$V1/1000, origin = "1970-01-01", format="%d-%m %H:%M:%S" )), twitterdata$V2, xlab = "Tid", ylab = "Antal")

Og så crasher det... Jeg får at vide at "need finite 'xlim' values". der er nok noget der har vanskeligt ved at
håndtere max og min af datoer...

Hm. Jeg kunne sagtens får "to" og "fr" på akserne. Men så snart jeg begynder at formattere det - så går det galt. hvorfor mon det.

Google viz 2


lorem ipsum

Det er formentlig den her vi skal have fat på. var formatter = new google.visualization.PatternFormat( '{0}' ); formatter.format(data, [0]);

Google visualiseringstest.

OK. Vi kom et stykke ad vejen. Der er lang vej igen.

  1. Pythonscriptet skal gøres mere robust overfor netudfald. Også gerne strømudfald.
  2. Setuppet skal kunne håndtere at jeg lige pludselig på arbejdet finder på at et hashtag skal følges og visualiseres. Uden at jeg skal hjem og kode først.
  3. Visualiseringerne skal generelt gøres lækrere.

Vi starter med 3.

Nu med klikbare navne! (åbner i enten ny fane eller vindue, afhængig af din browser opsætning)
Jeg har søreme også fået styr på problemerne med at wordpress gør grimme ting ved javascriptet. Der skal "blot" installeres et plugin (text control), der kan slå den automatiske karakterencoding fra.

Jeg har fået styr på farverne. Jeg har fået gjort navnene klikbare. Og så faldt jeg over at det her:

var formatter = new google.visualization.PatternFormat( '{0}' );
formatter.format(data, [0]);

ville kunne bruges til at gøre endnu mere avancerede ting med indholdet af de enkelte kolonner i datasættet.

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.