Librarians as data scientists. What should we be able to do?

Data is the next big thing. Big data is even bigger. And as always when something new happens, libraries jump on the bandwagon from the beginning.

We are coming to it at bit slow this time, at least in Denmark. We might have been intimidated by the Big in big data. But we’re getting there. And as always when we do something new, we have the problem of figuring out exactly what we should be able to do. Wich competencies should we have, what is the level of support that we should provide to our patrons?

I imagine that other places trying to get into data science, would begin by hiring a data scientist. Or at least send the most qualified personel on courses and training sessions. Not so in a library. We have all the books, we’ll just read them, and then we will know how to do it. It actually appeals to me as an engineer:

BOSS: We should do some data science
ME: OK, do we have anyone on staff that knows anything about that?
BOSS: No.
ME: Hmmm. Are we going to hire someone who knows anything about data science?
BOSS: No.
ME: Are we going to invest in training or courses to learn about it?
BOSS: No.
ME: OK, lets get started.

It gives us a chance to play around with exciting and difficult stuff, without being burdened with any actural knowledge about what we are doing. That is more or less how engineers define fun!

So. What should we be able to do?

  1. We are not going to be able to advise our patrons about what statistical test to use. There are simply to many. But we should be able to ask qualified questions: “Are you sure that that data follows a normal distribution?”
  2. We are not going to be able to advise our patrons about what data, and what correlations are interesting. We have no idea whether a correlation between a biomarker and a disease is relevant. But we should be able to recognise a correlation. Take a look at this page – its hilarious.
  3. We are not going to know all the intricacies of all the software we provide access to. Theres a reason we have 79 books in our catalogue about ArcGis. But we should be able to perform a simple data analysis in each of them.
  4. And of course – we are going to provide the world class level of customer service and assistance, that make libraries famous. Now we’re just going to assist with data science.

Thats it. How are we going to get there? I’ll get back to that later – now I have a meeting on LibQual.

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.

The Mythical Man-Month

Note: I’ll be using the male pronoun. Not because there are only men in the world. But because I really like the association between Man-Month and Mothman. For a long time, Iunnamed thought that the title was inspired by the urban legend of the Mothman. It probably isn’t. I still like it.

In a previous post I discussed the Bermuda Triangle of Project Management. Or the Iron Triangle as it is properly known. I promised to return to the mythical man-month later. Lets do that.

The following thoughts are not my own. They come from a classic essay by Frederick Brooks, written in 1975. And it appears to have been completely forgotten. Well. Not forgotten, it is a classic. But apparently no-one has learned anything from it.

Think back to the ideal world of project management. In that world everyone knows, that if we cut ressources, the project will be delayed. It follows logically, that if the project gets delayed, we should assign more ressources to it. That might be a good idea. It might be a horrible idea. And in some situations, the thought of getting an extra man-month should fill the project manager with the same terror as the mothman did to the good citizens of Point Pleasant back in 1966.

The basic idea is, that if the project runs late, it should get more ressources, in order to finish on time. The observation is, that the added man-months will actually delay the project even more. Why would that happen?

First of all, in most projects, men and months are not interchangeable. We all know that some of our colleagues are more productive that others. Maybe they just have other qualifications. Just because you are a great database engineer, does not mean that you are qualified to make the userinterface. And the man-month your project is assigned does not know the project. Some of the members of the project team will have to spend time training the new guy. In a really bad scenario, Brooks describes a situation where one member of the team have to use a month to train three new team members. The project might have been assigned three man-months. But the first month uses four man-months on training. Placing a net drain of one man-month on the ressources available to the project, compared to the initial situation. After one month, the project is even more delayed. And the project manager now has to explain to his boss why. A difficult question to answer when you have just been assigned more ressources.

Secondly, the tasks performed in a project are not interchangeable. They are usually sequential in nature. First we have to do this, then we have to test it.

Project managers often refers to people who believes that if you assign nine women to the task of carrying a pregnancy to terms – you will become a father next month.

So – what to do? There is no simple answer. The task of management is to pressure the project manager to perform. As a project manager, it is easy to come to the conclusion that they dont understand anything, and that their demands are unreasonable. But maybe, just maybe, you actually could do better.

When you have done better, you are still left with the task of explaining to your boss, that he is not going to be a father next month, just because you get more womanpower. Good luck.

 

 

Hvordan taler man om hvor man er og skal hen

Den her bliver på dansk. For jeg vil skrive lidt om hvordan vi taler om hvor vi er. På dansk. Det er jeg blevet opfordret til af chefen. Så det må jeg hellere gøre.

Der var ingen tvivl. Det hedder oppe på Farma. Og nede på Nørre Alle. Sådan var det i hvert fald da jeg begyndte at arbejde på Farma. Jeg syntes det var meget enkelt. Farma ligger nord for Nørre Alle. Når man kigger på et kort, vender nord opad. Hvis lokation A ligger nord for lokation B, ligger A oppe relativt til B. Og B ligger nede. Det er i fuld overenstemmelse med hvad DRs sprogeksperter mente i 1994. Og hvad man finder på sproget.dk, drevet af Dansk Sprognævn og Det Danske Sprog- og Litteraturselskab. Og dog gav det problemer…

Nogen mente nemlig at Nørre Alle var et vigtigere sted end Farma. Og derfor var det upassende, at jeg talte om “oppe på Farma” og “nede på Nørre Alle”. Det havde vist noget at gøre med hvor de selv sad. Personligt mente jeg at geografien måtte gøre udslaget. Og skulle vi endelig tale om hvilken adresse der var vigtigst – og det kunne vi godt – så gav det samme resultat: “Oppe på Farma”.

Egentlig er det meget enkelt. Reglen for geografiske navne er, at vi siger op(pe) om det der ligger nord for os. Ned(e) om det der ligger mod syd. Og over/ovre, om steder der ligger på samme breddegrad som os selv. Når et sted ligger både nord og østligt for os, så er det i almindelighed oppe der vinder. Som i “oppe på Færøerne”.

Og hvorfor er det så vigtigt? Det er det, fordi op er godt, og ned er dårligt. Åbenbart. Op ad bakke synes jeg nu ikke er så godt. Når prisen på noget går ned er det som regel ikke dårligt, i hvert fald ikke for forbrugerne. Hvis vi bevæger os ind i fantasiens verden, er det selvfølgelig godt hvis ens løn går op, men det kan vi ikke huske hvornår sidst er sket, så det er irrelevant. Med andre ord, om op og ned er godt eller skidt er ikke helt entydigt. Altså bortset fra at det åbenbart betød noget at Farma lå oppe i forhold til Nørre Alle.

Well. Universitetsbiblioteket har mange adresser. Og jeg har siddet på en del af dem. Og hvordan taler vi om dem? Da jeg sad på Diamanten var der ingen tvivl. Alle andre steder var ude. Nogen var måske oppe, andre var vel egentlig nede. Men det ord brugte jeg ikke. Jeg skulle ud på Nørre Alle. Bagefter skulle jeg måske op på Farma – fordi jeg tog fra Nørre Alle til Farma. Men derefter skulle jeg ind på Diamanten igen. Rent geografisk giver det mening. Diamanten ligger i centrum af København. Ikke helt i den gamle middelalderby, men der er ingen tvivl om at der er steder der ligger inden for voldene. Og steder der ligger uden for. Og Diamanten ligger så afgjort indenfor. Sådan da. De andre steder ligger i hvert fald udenfor. Næsten. Så i København, og med et centrum der ligger hvor det nu ligger, var der ikke så meget at rafle om.

Men jeg har nu en fornemmelse af, at Diamanten kunne have ligget en del andre steder. Hvad nu hvis den faktisk havde ligget på Universitetsparken. Og det Farmaceutiske Bibliotek havde ligget inde på Slotsholmen?. Havde det så heddet ude på Diamanten? Jeg tror det, men jeg er ikke sikker. Min usikkerhed skyldes, at Diamanten er magtcentret i biblioteket. Det er der den høje chef sidder. Det er galaksens centrum. Jeg vil ikke helt udelukke at den betydning Den Sorte Diamant har gør at den ville kunne overrule geografien.

Og det er netop det forhold, der gjorde at der blev reageret på at jeg talte om “oppe på Farma”. Det blev forstået som “Farma er vigtigere end det der ligger syd for Farma”. Det er jo objektivt korrekt at det er tilfældet. Men det er altså også en simpel geografisk konstatering. Der var så nogen der havde den fejlagtige opfattelse, at Nørre Alle var så meget vigtigere end Farma, at det kunne overrule geografien.

Der er ingen tvivl om at der ligger en masse magtrelationer i brugen af disse relationelle ord. Jeg tror for eksempel ikke at det er et tilfælde at nord vender opad på kortene. Havde de nordeuropæiske lande ligget syd for ækvator, tror jeg nok vi hurtigt havde fået ændret enten sproget, eller konventionen for hvad der vender op og ned på et landkort.

Men alt det ændrer ikke på at det hedder oppe på Farma. Fordi Farma ligger længst mod nord. Og hvis der er mere brok, vil jeg bare gøre opmærksom på, at Nørre Alle 49 ligger 13,00 meter over havets overflade. Og Universitetsparken 4 ligger 15 centimeter højere.

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.




Harvesting and visualizing data

OK. The datalab should know how to harvest data. And we should know how to visualize them. Otherwise – how will we be able to help our users?

Libraries should have HUGE amounts of data. Unfortunately, we have not been able to make much headway making them publicly accessible. What to do? Get some data from another source. Twitter appears to be a very important way to communicate. I do. Why not harvest the number of tweets I tweet, and visualize them?

The correct way to do this, would be to harvest the data from Twitters API. That requires a developer account, which requires a regular account that has been verified by SMS. My phone company does not support this feature. However – the data is freely available on the web. Just go to my twitterprofile, and take a look.

And how do I get this data? Enter Python. Use the urllib2 library to harvest the site:

import urllib2 
page = urllib2.urlopen('http://www.twitter.com/chrbknudsen')

Then convert it to something that we can work with:

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(page.read())

page.read() returns the content of the site we read. BeautifulSoup converts that content into an object with a lot of nifty methods. Take a look:

tweets = soup.find('li', {'class' : 'ProfileNav-item ProfileNav-item--tweets is-active'}).find('span', {'class' : 'ProfileNav-value'})

BeautifulSoup lets us find content that is enclosed by specific tags. The number of tweets is in a LI-tag, with the class “ProfileNav-item ProfileNav-item–tweets is-active”. But there is more under that tag than just the number of tweets. Therefore we use the method “find” twice, now with the tagt SPAN, and the class “ProfileNav-value”.

Now we have the number of tweets (the moment I reach a thousand tweets, we will have to do something – twitter shows two thousand tweets as 2,000. And if I have even more, they might show 14563 tweets as 14.6td. Simple conversions to remove punctuation and changes 14,6td to 14600. We loose some precision, but nevermind).

OK. Now we have a Python script, that can access a twitter-profile, and harvest the number of tweets. On a Raspberry Pi (or other *nix-boxes) we can run a cron-job to harvest once every hour. Note that this method of harvesting is not exactly approved by Twitter.

We need to save the data. Enter Google Spreadsheets. I wont go into details about how to aquire the json-file that is used to authorize your use of Google Spreadsheets. Maybe I’ll get back to it. But we need some libraries:

import json
import gspread
import ssl
from oauth2client.client import SignedJwtAssertionCredentials
Those are used by this code:
json_key = json.load(open('client_secret_2.json'))
scope = ['https://spreadsheets.google.com/feeds']

ssl._create_default_https_context = ssl._create_unverified_context

credentials = SignedJwtAssertionCredentials(json_key['client_email'], json_key['private_key'].encode(), scope)

gc = gspread.authorize(credentials)

wks = gc.open("twitterdata").sheet1

Note that you will need to provide a full path to the json-file in order to run the cron-job. That fact gave me an ulcer yesterday…

We have connected to Google Spreadsheets through the Google API, and we have opened the spreadsheet “twitterdata”, and the first worksheet. We now have an object “wks”, that we can manipulate.

We use this method:

wks.append_row(rowToAdd)

That appends a row with some data to the active sheet. The data is contained in a list, “rowToAdd”. Now we just have to make sure that there is some data there. Before calling rowToAdd, we populate the variable:

rowToAdd = [time.time()]
rowToAdd.append(tweets)

Yeah, we need to import time as well.

That was it. Not exactly a working example, but a pretty accurate description of my thought processes writing it.

So far so good. Theres a cronjob running on an RPi back home, it harvest the number of tweets once every hour, and writes it to a google spreadsheet.

Now we need to visualize it.

Enter Highcharts. It’s free, its written in javascript and it can be embedded.

<div id="chart_container">
</div>
<script src="//code.highcharts.com/adapters/standalone-framework.js"></script>
<script src="//code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/data.js"></script>

<script>
new Highcharts.Chart({
 "chart":{
 "backgroundColor":"#fefefe",
 "renderTo":"chart_container",
 "type":"spline"
 },
 "title":{
 "text":"Title"
 },
 "colors":["#476974","#3ca1c1","#4ccbf4","#96dff6","#c9e8f6"],
 "legend":{
 "enabled":true,
 "margin":30
 },
 data: { googleSpreadsheetKey: '[enter spreadsheetkey here]', 
 googleSpreadsheetWorksheet: 2, 
 },
 });
</script>

That was it. This is the result:

Some work still needs to be done. The UNIX-time is not formatted as dates – it needs to be converted to javascript-time. This is not actually live data. And theres a bunch of other details I would like to tinker with. But I’m still rather satisfied.

Disrupting access to scholarly journals III

OK, part 3. Here is part 1 and part 2.
I made the rookie mistake of not following the ICanHazPDF etiquette: I did not provide a DOI for the article I requested.
No surprise – two weeks later, I have still not received a PDF.

This morning I tried again. Tweetdeck was supplied with a tweet containing the DOI, the hash-tag and my mailadress, and tasked to tweet at 9.00 AM local time.

9.03 my tweet was retweeted by @shecanhazpdf.

9.31 I recieved an e-mail with the subject “Yes, you can haz :)” – and the PDF. Please note: This is a paper that I have co-authored and that I have legal access to, through my work.

Where did it come from? Good question. The first rule of Fightclub is that you do not talk about Fightclub. Similarly, you do not reveal who fulfilled your request. Odds are that whoever helped me, is breaking a license agreement. The e-mailadress I got the PDF from is rather anonymous, but it is a good guess that the owner is a night elf hunter from the same timezone as Denmark. Not that it matters, but it would be interesting to hear what motivation there is behind the mail.

Anyway. Our Inter-Library-Loan department is quick, but probably not that quick. This was a test. The result is clear: Make your request in the proper way, and it is fulfilled in 30 minutes.

Is this going to disrupt the access to scholarly journals, provided by libraries?

While I’m waiting for a Twitter API-Key

I’m working on a series of posts about the ICanHazPDF phenomenon. You can find the latest here. What I would really like to do, is to harvest tweets with the hash-tag, and analyze the data. That requires an API-Key from Twitter. And for some reason, that is a bit difficult.

Anyway, what other data could be interesting to harvest from social media sites? Data that would actually reveal things that are not common knowledge.

LinkedIn perhaps. If activity from persons employed at a given workplace was harvested – could that data, or rather changes in that data, be used to tell something about that place?

In other words: If the data was available, would we see an increase in activity from employees at The Royal Library after the latest cutbacks were announced?

And could trends like that be used to reveal when it would be a good idea to buy or sell stock in a company?

Disrupting access to scholarly journals

What happens when scholars bypass the library? In new and probably illegal ways?

Why would you want to pay 30 USD for a 20 year scientific article?

It’s nothing new. Scholars have always exchanged information. In olden days, before the deluge of videos shaming cats for silly behaviour, scientist regularly needed access to papers that were not available through their university library. When that happened, they asked their secretary to write the author of the paper, and request a copy.

It was institutionalized. When you submitted a paper to a journal, you were expected to buy a number of preprints of the paper from the journal. That  covered some of the cost of printing the journal, and you were welcome to distribute the preprints among your colleagues. You were annoyed that you had to buy them, but you actually needed them, to promote your own work, so that was OK.

Then the internet happened. Scholarly journals became digital, information suddenly had the potential to become very free. Scholars had instant access to huge numbers of scientific papers. Information could travel around the globe almost instantly. What also happened, was that the cost of subscribing to the journals went through the roof. No university library today can afford to subscribe to all the journals that researchers want access to. The publishers still want to be paid for the access, so they erect paywalls around their content. If your university library does not subscribe to the journal you want to read, you can pay to get access.

Okay. The scene is set. We have scholars, who believes that information should be free. We have information with a very high potential for being set free. And most of that information is hidden behind paywalls, where some scholars have access, and others dont.

Solution? Write to a colleague that has access, and ask him to email you a pdf.

Again, nothing new. We’ve seen it before. If we could gain access to the emails, we could describe the networks exchanging pdfs.

It might even be possible to describe this situation with nice formulas. It is probably analogous to the potential energy harnessed by cells, then there is a difference in the concentration of sodium ions across a cell membrane.

But now something interesting has happend (it actually happened a couple of years ago).

Researchers have begun using Twitter to request copies of papers they otherwise wouldnt have access to. They tweet the hash-tag “#ICanHazPDF, along with a reference and an email-adress. And kind people around the world, with access to the paper, send a pdf-copy of it. Quick. Easy. Free.

That was a very long introduction, inspired by this post. Whats next? In the next couple of posts, I’ll try to analyze what the consequences of this new-ish phenomenon might be. Maybe we’ll even get some numbers.

 

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.