Der har været nogen optællinger. Nu tæller vi ned. Der sker noget glædeligt. Noget er slut. Sådan ca. pr. midnat nytårsaften. Det sker noget andet. Det er ikke sikkert at det er bedre. Men dog er det en glædelig begivenhed.
Uncategorized
Stress. Depression. Help.
Just a simple point:
If you get stressed to the point of spending time in the restroom crying, get help. Please. And do it now. Not a year after your call for help was ignored. Now. Right now.
Severe stress can lead to depressions. Stress in itself can be crippling. Depression is even worse.
Learn to recognize the signs. Not just in yourself. Also in your colleagues. If you are a manager it might be a good idea to learn about them as well.
And remember, it is not your fault that you get a stress induced depression. You may be expected to take the blame for being stressed. You may be expected to keep soldiering on until you break.
But no one is ever going to thank you for it.
Ever.
Those civil war monuments in the US
I once saw a video suggesting that the US should choose Canada as their next president. They would solve the race-problem. As soon as they figured out why there still was a race-problem. It’s one of those things that are pretty hard to understand for europeans. And apparently for canadians as well.
Anyway, there is a problem, and lately it’s been manifesting in protests against monuments celebrating confederate war-“heroes”. Thats another thing that is difficult to understand from across the atlantic. Those monuments must certainly have been standing there for a very long time. After all, the war ended in 1865. They may be celebrating the losers, but seriously, what’s the problem? Well… Actually there is a problem. Most of the monuments were not erected to commemorate fallen soldiers just after the war. They were erected to show those n******, who was still in charge when they started to organize for rights. And again when those rights were granted (to some degree). There’s a lot more information in this report. And suddenly even europeans begin to understand what all the fuss is about. But still. Seriously? Get over it, you lost, be nice, and treat people like, you know, Jesus said you should.
Okay – that was the introduction. And now for the data. Somewhere in there, there is an interesting datavisualization. The data is here:
https://data.world/datadanlarson/confederatemonument/workspace/file?filename=CivilWarMamorials.csv
What do I want to do with it? I want an animated GIF. Each frame in that gif should represent a year, and show a map of the US, with all the monuments erected up to and including that year. Preferably it should be noticable what monuments where erected that year. A graph showing the development of the number of monuments would be nice as well.
Okay, lets get coding. The data comes from data.world, and they have their own R-package:
devtools::install_github("datadotworld/data.world-r", build_vignettes = TRUE, force = TRUE)
In order to get to the data, You will need a token. There is excellent help to get at data.world.
data.world::set_config(data.world::save_config(auth_token = "redacted"))
It is a horrible token. Anyway, lets plod on. Load their library, and get the data
library(data.world)
dataset_key <- "https://data.world/datadanlarson/confederatemonument"
tables_qry <- data.world::qry_sql("SELECT * FROM Tables")
tables_df <- data.world::query(tables_qry, dataset = dataset_key)
sample_qry <- data.world::qry_sql(sprintf("SELECT * FROM `%s`", tables_df$tableName[[1]]))
sample_df <- data.world::query(sample_qry, dataset = dataset_key)
This is a simple copy-paste from the examples at data.world. The net result is, that we have all the data in the dataframe sample_df.
We are interested in the year a monument was erected. Not all years are known. And this is of course a serious flaw in the following visualization. Patterns may not be what they appear, when approx. half the data is missing.
Anyway, lets get rid of the rows with missing data:
newdata <- sample_df[complete.cases(sample_df),]
complete.cases returns a logical vector. True if the row is free from NAs, eg. is complete, False if there is an NA in it. newdata is now a dataframe with only the complete cases.
We need coordinates. Google is our friend, however, I’m not going to run that geocoding again. Google allows 2500 calls to their API every day from a given IP-number. It is easy to run out of calls.
library(ggmap)
newerdata <- data.frame(city=character(), state = character(), year = numeric(), status = character(), lat = numeric(), lon = numeric(), stringsAsFactors = FALSE)
for (row in 1:nrow(newdata)){
result <- geocode(paste(newdata[row,2]$city, newdata[row,1]$state, sep=", "), output="latlon", source="google")
newerdata[nrow(newerdata) + 1,] = c(newdata[row,2]$city,newdata[row,1]$state, as.numeric(newdata[row,5]$year), newdata[row,6]$civilwarstatus, result$lat, result$lon)
}
save(newerdata, file="newestdata.rda")
What happens? We call ggmap, which provides the function geocode. A new dataframe, newerdata, is defined. For each row in newdata, I call geogode on the city and state, separated with a “,”, and saves the result in “result”. And then I add the rows I want to the newerdata dataframe. There is probably a better way to do that. But it works. Here there is another thing that should probably be handled. Sometimes Google is not able to determine exactly what location we give it. There may be more than one place in a US state with the same name. I’m just taking the first result google gives me. A bit sloppy, I know. make some plots.
Finally I save the data. Now we should be ready to We are going to need some libraries for that:
library(grid)library(gganimate) library(animation) library(ggplot2) require(cowplot)
I’ll just make absolutely sure that the data is in the form I need it to be:
load("newestdata.rda")
newestdata <- newestdata[complete.cases(newestdata),]
newestdata <- na.omit(newestdata)
newestdata$year <- as.numeric(newestdata$year)
newestdata$lat <- as.numeric(newestdata$lat)
newestdata$lon <- as.numeric(newestdata$lon)
The coordinates and the year should be numeric. Any rows with missing values should be gone forever.
I get a map to plot on:
us <- get_map("USA", zoom = 4)
And, lets make the first plot:
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata, color="red")
g
Theres a lot of red there. I would like to make an animation. The standard way to do it here, or at least the way I usually do it, would be to define a function, that plots what I want to plot as a function of the year. Like this:
singleyear <- function(ye){
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year<(ye)),], color="red")
g
}
Now, when I make this function call, I should get a map with all the monuments erected before 1890:
singleyear(1890)
I’m missing the monuments erected in 1890. That is because I would like those to be a different color. Lets add to the function, and call it again:
singleyear <- function(ye){
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year<ye),], color="red")+
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year==ye),], color="blue")
g
}
singleyear(1890)
Now, when I plot the map for a given year, all monuments from that year will appear as blue. And for the next year they’ll turn red.
Lets back up a bit here.
What I’m doing is this: I take the map I retrieved from Google, and plots it with the ggmap function. Then I add points with the geom_point function. I tell the function that the data is “newestdata”, and that the points should be placed at position x,y where x is the longitude, and y the latitude. The color should be red. I am however also telling that the data should be the part of newestdata, where year is smaller than the ye-value I provide to the function. In the next line, I add the same point, just for the part of the data where year is equal to the ye-value i provide to the function. And that the color should be blue.
What I am going to do later, is to call this function for all years from 1860 to 2017, and show those plots one after another. We will get at small movie, where new monuments turn up as blue spots. And then turn red in the next frame.
Everything becomes very red. One way to do something about this, would be to make the dots transparent. Let them fade out. When the monument is just erected, let the dot be blue. The year after, let it be a transparent red dot, the year after that, make it more transparent. Areas with a lot of monuments will still be pretty red, but the new monuments will be more visible. We’ll get at sort of heatmap, where the very red areas are places with at lot of monuments, and the not so red areas have fewer.
I’ll need to have a maximum and a minimum for the transparency. Defined as af function of the year I am plotting, and the year a monument was erected. I’m gonna add it to the dataframe before I plot it. This is the line:
maxp <- 0.8
minp <- 0.3
newestdata$alpha <- (maxp - minp)/(ye-1861)*(as.numeric(newestdata$year)-ye)+maxp
A new column, alpha, is added to the dataframe, and the difference between the year I am plotting, and the year of the row is normalised to the range 0.3 to 0.8. The point begins as blue, turns red with a transparency of 0.8, and will fade to 0.3.
I’m not sure the range is perfect. I’m gonna go with it for now.
Lets add it to the function:
maxp <- 0.8
minp <- 0.3
singleyear <- function(ye){
newestdata$alpha <- (maxp - minp)/(ye-1861)*(as.numeric(newestdata$year)-ye)+maxp
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year<ye),], alpha=newestdata[which(newestdata$year<ye),]$alpha, color="red")+
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year==ye),], alpha=1, color="blue")
g
}
singleyear(1890)
What I also added, was this: “alpha=newestdata[which(newestdata$year<(aar)),]$alpha”. Alpha is the transparency. So each point is plottet with the transparency I calculated.
What next? Lets adjust the plot a bit:
maxp <- 0.8
minp <- 0.3
singleyear <- function(ye){
newestdata$alpha <- (maxp - minp)/(ye-1861)*(as.numeric(newestdata$year)-ye)+maxp
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year<ye),], alpha=newestdata[which(newestdata$year<ye),]$alpha, color="red")+
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year==ye),], alpha=1, color="blue") +
theme(plot.title=element_text(hjust=0)) +
theme(axis.ticks = element_blank(),
axis.text = element_blank(),
panel.border = element_blank()) +
labs(title="Confederate memorials", subtitle=ye, x=" ", y="")
g
}
singleyear(1890)
Labels are left aligned (hjust=0), tickmarks and text is removed (all the element_blank parts). And a title “Confederate memorials” is added, with a subtitle indicating the year we have reached in the plot.
Nice. What more? The interesting part, at least I think it is interesting, is the fact that the number of these memorials increase at certain times. That can be seen on the map. But a line-plot would probably make it more visible. It would also be nice to have it side-by-side with the map. How to do that?
To begin with, I’ll need a set of data with the cumulative count of monuments:
linedata <- as.data.frame(table(newestdata$year), stringsAsFactors = FALSE)
colnames(linedata) <- c("year", "cumsum")
linedata$year <- as.numeric(linedata$year)
linedata$cumsum <- cumsum(linedata$cumsum)
I make a new dataframe, linedata. The content is table(newestdata$year). The table function summarizes the data in newestdata. It gives me a table with all the years, and the number those years occur. Eg. that there are 7 occurences of the year 1870. That corresponds to 7 monuments erected in 1870. I save that as a dataframe. Then I change the names of the colums, and make sure that the years are saved as numeric. And then I call cumsum. That is a function that calculates the cumulative sum. Ie in 1861 2 monuments where erected. None where erected before that. The cumulative sum of all monuments until 1861 was 2. In 1862 3 monuments were erected. The cumulative sum for 1862 is 5. The sum of the 3 monuments erected that year, and all the monuments erected before that.
That in itself is an interesting plot:
ye = 2017
h <- ggplot(linedata[which(linedata$year<=ye),]) +
geom_line(aes(x=year, y=cumsum))
h
Something happens in 1910 and again in 1950. Or somewhere close to those years. At least that is where the graph changes shape.
Lets adjust it a bit:
ye=2017
h <- ggplot(linedata[which(linedata$year<=ye),]) +
geom_line(aes(x=year, y=cumsum))+
xlim(1860,2017) +
ylim(0,850) +
ylab("Number of confederate memorials") +
xlab("")
h
Nothing fancy, just freezing the axes, adding a label for the y-axis, and removing it from the x-axis.
Now I can add it to the original plot. I loaded the library cowplot earlier. That gives us the function plot_grid.
i <- plot_grid(g,h,align='h')i
I have two plots, g and h, and combine them in a newplot, horizontally (thats the h in align), to a new plot i. And then I plot i.
Lets add that to the function:
singleyear <- function(ye){
newestdata$alpha <- (maxp - minp)/(ye-1861)*(as.numeric(newestdata$year)-ye)+maxp
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year<ye),], alpha=newestdata[which(newestdata$year<ye),]$alpha, color="red")+
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year==ye),], alpha=1, color="blue") +
theme(plot.title=element_text(hjust=0)) +
theme(axis.ticks = element_blank(),
axis.text = element_blank(),
panel.border = element_blank()) +
labs(title="Confederate memorials", subtitle=ye, x=" ", y="")
h <- ggplot(linedata[which(linedata$year<=ye),]) +
geom_line(aes(x=year, y=cumsum))+
xlim(1860,2017) +
ylim(0,850) +
ylab("Number of confederate memorials") +
xlab("")
i <- plot_grid(g,h,align='h')
i
}
singleyear(1890)
Now I’m getting there! Almost ready for the animation. I would like some annotation on the h-plot. A couple of arrows. And I would like them to show up in the animation. As in, from year 1910 there should be text at a certain place. But not before. It’s not that difficult.
If I add this:
if(ye>1908){
h <- h + annotate(“text”, x =1980, y = 200, label=“NAACP established”) + geom_segment(aes(x=1950, y = 200, xend=1909, yend = 200), size=1, arrow=arrow(length=unit(0.5, “cm”))) }
to the function, every plot, for a year after 1908, will have an annotation on the h-plot, at position 1980,200, with the text “NAACP established”. The next line, geom_segment, will add an arrow, with a size defined by the size and length parameters, beginning at 1950,200 and ending at 1909,200.
It took quite a bit of time to fiddle with those positions!
That is not the only annotation I want. So the complete function is as follows:
singleyear <- function(ye){
newestdata$alpha <- (maxp - minp)/(ye-1861)*(as.numeric(newestdata$year)-ye)+maxp
g <-ggmap(us) +
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year<ye),], alpha=newestdata[which(newestdata$year<ye),]$alpha, color="red")+
geom_point(aes(x=lon, y=lat), data=newestdata[which(newestdata$year==ye),], alpha=1, color="blue") +
theme(plot.title=element_text(hjust=0)) +
theme(axis.ticks = element_blank(),
axis.text = element_blank(),
panel.border = element_blank()) +
labs(title="Confederate memorials", subtitle=ye, x=" ", y="")
h <- ggplot(linedata[which(linedata$year<=ye),]) +
geom_line(aes(x=year, y=cumsum))+
xlim(1860,2017) +
ylim(0,850) +
ylab("Number of confederate memorials") +
xlab("")
if(ye>1908){
h <- h + annotate("text", x =1980, y = 200, label="NAACP established") +
geom_segment(aes(x=1950, y = 200, xend=1909, yend = 200), size=1, arrow=arrow(length=unit(0.5, "cm")))
}
if(ye>1910){
h <- h + annotate("text", x = 1870, y = 500, label="Coincidence?") +
geom_segment(aes(x=1870, y=490, xend=1905, yend=240), size=1, arrow=arrow(length=unit(0.5, "cm")))
}
if(ye>1955){
h <- h + annotate("text", x =1960, y = 400, label="Beginning of civil rights movement") +
geom_segment(aes(x=1950, y = 450, xend=1955, yend = 640), size=1, arrow=arrow(length=unit(0.5, "cm")))
}
if(ye>1960){
h <- h + annotate("text", x= 1866, y=515, label="Another") +
geom_segment(aes(x=1882, y=500, xend=1955, yend=680), size=1, arrow=arrow(length=unit(0.5, "cm")))
}
i <- plot_grid(g,h,align='h')
print(i)
}
singleyear(2017)
## Warning: Removed 1 rows containing missing values (geom_point).
OK. It looks like hell. But! In just a moment, it will look. Well, not exactly perfect, but at least much better.
The way to animate is this: Define a function that gives you the frames you want, as a function of an iterable. That’s already done. Call this:
saveGIF({
for (ye in 1860:2017){
singleyear(ye)
}
}
, interval=0.3, ani.width=1280, ani.height=720)
Enjoy. Oh, and note, that it will crash if you try to animate it a notebook.
Hvor blev jeg af?
Tja. Godt spørgsmål. Der har været meget stille her i et stykke tid.
Det har der været før. Det bliver der sikkert igen. Denne gang har det nok været som reaktion på ændringer på min arbejdsplads. Der jo nok, hvis vi virkelig skal kigge dybt i sjælen, udløste noget der kunne ligne en depression. Ikke noget alvorligt. Afgjort ikke nok til at udløse piller. Men bare en længere periode med – “Fuck. Var det det?” tanker. Og ikke specielt systematiske overvejelser om hvad katten jeg så skulle bruge tiden på.
Det er jeg så nogenlunde ude af. Der begynder at være fod på tingene på hjemmefronten. Arbejdet er, nåja, arbejde. Det virker ikke så håbløst som det har gjort. Og jeg er nok ved at vænne mig til, at identitet er noget der skal findes andre steder end på jobbet. Ligesom anerkendelse og respekt.
Så med lidt held kommer der til at ske lidt mere her. Der er nørdeprojekter undervejs, faktisk godt i gang. Der er køkkenteknikker der skal afprøves. Der er politiske kæpheste der skal luftes. Og så er det fredag, og lige om lidt skal jeg i biografen og se præsentationen af noget et af de projekter jeg har gang i har kastet af sig.
Der findes ikke problemer
Kun udfordringer.
Det har jeg i hvert fald ladet mig fortælle. Og det handler jo om at man skal italesætte tingene på den rigtige måde. Problemer er negativt ladede. Måske endda så meget, at de ikke kan løses. Så det ord må vi ikke bruge. I stedet skal vi bruge ordet udfordring, der ikke er negativt ladet. Ordet udfordring, i stedet for udfordring, skal lissom signalere, at det er noget vi løser. Vi skal bare tage os sammen, så viser det sig at udfordringen slet ikke er en udfordring, men i stedet en udfordring.
Jeg tror bare der er en udfordring med at sige udfordring i stedet for udfordring. Udfordringen består i at vi gør sproget upræcist. Vi skaber en udfordring, når vi mener at skulle bruge et andet ord end udfordring, fordi udfordring er negativt. Du skal ikke komme med udfordringer, du skal komme med løsninger. Ja, selvfølgelig, men hvis jeg havde løsningen på den her udfordring, så ville jeg ikke have behov for at komme med den til dig. Så var det jo ikke en udfordring længere. Det kunne være at der så var en udfordring ved at gennemføre løsningen på udfordringen. Men det ville jo være en anden udfordring.
Udfordringen ved ikke at måtte kalde udfordringer for udfordringer er dobbelt.
Dels er der udfordringen ved at skulle kalde udfordringer for udfordringer i stedet for udfordringer. Det mudrer sproget. Hvis du har læst hertil, vil du vide hvad jeg mener. Det er faktisk udfordrende at skrive udfordring i stedet for udfordring hver gang, og det gør sikkert også at man er ret udfordret når man skal læse teksten. Det spænder ben for udfordringsløsningen hvis man ikke må kalde en udfordring for en udfordring. Det fjerner fokus på, at når vi løser denne udfordring, så er det faktisk fordi det er en udfordring, som er negativ, og derfor skal løses. Vi forfladiger udfordringsstillingen, og dermed bliver det også udfordrende at gennemskue hvori udfordringen egentlig består. Er det overhovedet en udfordring? Er vi sikre på at det ikke bare er en udfordring i stedet? Udfordringer er også noget man kan vælge at tage imod. Det ligger i ordet. Men ikke alle udfordringer er så u-udfordringsatiske, at man kan ignorere dem. Nogen udfordringer er så udfordrende, at man bliver nødt til at gøre noget ved dem.
Den anden udfordring er, at en udfordring jo ikke holder op med at være udfordrende, blot fordi vi kalder det for en udfordring i stedet for en udfordring. Det er lidt ligesom oprindeligt neutrale betegnelser for folk med høj koncentration af melanin i huden. De er ikke længere neutrale (altså betegnelserne), de er blevet negativt ladede. Det er de blevet på grund af racisme. Så nu bruger vi et andet ord, der er neutralt. Men racismen er ikke forsvundet, så om lidt er det nye, neutrale, ord lige så negativt ladet som det gamle, oprindeligt neutrale, men nu negative ord. Udfordring er et pænt nyt ord, som vi kan bruge i stedet for det grimme gamle ord, udfordring. Men fordi virkeligheden nu engang er sådan at udfordringer jo sjældent rent faktisk er positive – hvis de var det, var de jo ikke udfordringer, så virker det kun en kort tid. Inden vi ser os om, er udfordringer noget lige så negativt ladet som udfordringer oprindeligt var. Og så begynder vi at tale om muligheder i stedet for udfordringer.
Har du fået konstateret kræft? Det er ikke en udfordring. Det er nu en mulighed. Den skal du bare gribe. Og så bliver sproget endnu mere absurd. Når man ikke må sige udfordring, men skal sige mulighed i stedet for mulighed, så går det helt galt. Muligheder lyder pænt. Pænere end muligheder. Men fordi vi kalder det for en mulighed, er det jo ikke holdt op med at være en mulighed. Muligheden er stadig negativ. Nu er vi blot begyndt at bruge et ord der i endnu højere grad implicerer en valgmulighed. Så når jeg står med en mulighed, det kunne være at der er et vandrør der er sprunget, så skal jeg forsøge at se mulighedsløsninger i den mulighed jeg har fået fordi gulvet sejler. Min underbo har også fået en mulighed, idet der drypper vand ned fra hans loft. Der må han jo bare se det positive i at han nu har fået mulighed for at løse en mulighed.
Der er også den mulighed, at folk der får at vide at de skal sige mulighed i stedet for mulighed, muligvis begynder at føle sig lidt til grin. De betragter det som muligt at muligheder faktisk er muligstiske, og at de ikke bliver mindre negative af at vi siger mulighed i stedet for mulighed. Jeg er ret sikker på at min underbo vil kigge mærkeligt på mig når jeg fortæller ham at han har en mulighed når hans gulvtæppe er blevet vådt fordi jeg har en mulighed med en oversvømmelse i køkkenet. Muligvis er der en mulighed for at folk der bruger ordet mulighed i stedet for bare at kalde tingene ved deres rette navn, bliver lidt til grin. Eller at de ikke længere bliver taget seriøst. Jeg er ikke helt overbevist om at HR-chefen vil betragte det som en mulighed, hvis hans medarbejdere betragter ham med skepsis hver gang han siger mulighed.
Muligvis skal vi i virkeligheden forsøge at skære udfordringerne ind til benet, og erkende at det ikke kan afvises, at der faktisk er tale om et problem. Hive fat i værktøjskassen med redskaber til problemløsning. Og i stedet for bare at italesætte tingene på en måde der er i overensstemmelse med den sidste managementmode, rent faktisk løse problemerne.
Hjemmelavet Gin del II. Hvor kommer farven fra?
Jeg fik ikke rigtigt vist et billede af hvordan resultatet så ud i mit opslag om at lave sin egen gin. Lad os bare sige at det ligner en urinprøve.
Nu er gin normalt ikke farvet. Så hvor kommer farven fra? Fra tidligere eksperimenter med pebersnaps – de gentages ikke – ved jeg at peber kan farve ret godt. Men der kunne være tale om andre ting også. Så det måtte prøves.
Jeg skulle lave sous vide cheesecake alligevel, og det skal gøres ved samme temperatur som når der laves gin. Så det var oplagt lige at køre et lille eksperiment. Bare lidt hurtigt, for jeg var kommet lidt sent igang.
Fra venstre mod højre, 2 enebær, 2 peberkorn og 2 allehånde bær. Dertil 50 ml vodka. Det hele i mine små henkogningsglas, låg på, i vand (80 grader, 10 minutter). Det var i hvert fald planen. Noget gik galt med tidtagningen i appen til Anovaen. Så de fik snarere et kvarter end 10 minutter.
Det gør ikke noget. Det jeg er ude efter er at identificere hvilket krydderi der giver farven. Hvis det allehånde farver mere end de andre efter 15 minutter, så gør allehånde det også efter 10 minutter. Det er den relative forskel jeg er ude efter. Ja, der kan være forskelle hvis det egentlige farvestof ligger dybt i bærret, og først trækker ud sent i forløbet. Men det er så korte tidsrum vi har gang i her, at det næppe gør en forskel.
Og hvordan så det så ud? Således: 
Allehånde – stort set ingen farvning. Peber – en smule. Farven kommer helt klart fra enebærrene. Og da der skal ret mange af dem i, er der nok ingen vej uden om at min gin kommer til at ligne en urinprøve.
Hvorfor er gin så ikke farvet? Det er der også nogen mærker der er. Den primære forskel er nok, at det meste gin vi køber, er destilleret gin. Den rå sprit trækker med de urter der tilsættes. Og så destilleres den igen. Smagsstofferne følger med. Og hvis farvestofferne er tilstrækkeligt “tunge” og ikke følger med, ja så er der ikke meget farve på slutresultatet.
Klistermærker
I kender dem godt – i hvert fald hvis I er nørder. De der klistermærker man får i forskellige sammenhænge, til at sætte bag på sin computer.
Det er bare ikke altid man lige kan få dem man har brug for. Men så må man jo selv bestille dem. Så det gjorde jer. Inkscape hjalp med designet. Nemprint.dk hjalp med trykket (mod betaling). Og forleden kom de. Ret godt timet, men det er en anden historie, der ikke hører hjemme i et offentligt rum.
Lidt dyrt (3,42 stykket) men det var fordi jeg kun bestilte 100. OK kvalitet, ikke helt så tykke som de rigtig lækre, men så afgjort et sted jeg kunne finde på at bestille igen.
Det næste projekt
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:

- 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 allehåndebær- 2 allehåndebær
- 1 nellike
- 2 nelliker
- 5 fennikelfrø
- 10 fennikelfrø
- 1 lille stjerneanis
- 1 stor stjerneanis
- 5 kommenfrø
- 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.
Fake News. And the importance of numbers
Or rather, the importance of all the numbers.
This is not a political blog. On the other hand, I am a firm believer in facts. There is an objective truth out there. And the world can, more or less, be explained by numbers. And when facts and numbers are weaponized in political struggles, well, it’s hard to avoid wandering in to dangerous territory.
And with that disclaimer out of the way. Recently I saw a graphic making the rounds on
Facebook. A simple table listing median household income in the US by race. The numbers are said to come from the US Census Bureau.
The idea is to document that “white privilege” does not exist. “See all the people that are not white, who makes more money than whites”.
Could this be true? As a european, my expectation would be, that white, caucasian, americans are in general terms better off than, for lack of a better word, non-whites, in the US (see, this is dangerous territory, what words do I dare to use?).
One of the great things about US federal institutions is that they generally provides quite free access to their data. I did not have the patience to learn how to navigate their website. Someone at Wikipedia did. And have made this nifty table.
I’m not going to copy all the data. There’s a LOT. But there is three tables. Median household income by race, by ancestry, and by native american tribe. Let us take a look at the first:
| Rank | Race | Median household income (2015 USD) |
| 1 | Asian-American | 91,440 |
| 2 | White | 59,698 |
| 3 | Native Hawaiian and other pacific islander | 55,607 |
| 4 | Some other race | 42,461 |
| 5 | American Indian and Alaska Native | 38,530 |
| 6 | Black or African American | 36,544 |
The numbers does not quite match. But “white” at 59,698 USD compares OK with the 60,256 USD in the graphic. The graphic claims that the numbers are from 2014. The Wikipedia numbers are from 2015. Small differences should not throw us off course.
That is more in sync with my expectations. But are the numbers in the table cooked?
Nope. They are actually correct. The next table on Wikipedia lists median household incomes by ancestry. Indian American in the graphic: 101,561 USD. Indian American on Wikipedia: 101,591 USD. Same with Taiwanese. And the others. There is a small detail. The numbers by ancestry appears to come from the 2014 data from the US Census Bureau, and not the 2015. Again, this is a detail. The main point of the graphic is not that Indian Americans make 41,335 USD more than whites, but rather that they make more money. And that Taiwanese Americans do, and that Filipino Americans do and that… well you get the point.
All right, so what is wrong with that table? The thing that is wrong, is that it cherrypicks the data. Let us take a look at the table of median household income by ancestry. Just the first six rows:
| Rank | Ancestry | Income |
| 1 | Indian American | 101,591 |
| 2 | Taiwanese American | 85,566 |
| 3 | Filipino American | 82,389 |
| 4 | Australian American | 81,452 |
| 5 | Israeli American | 79,736 |
| 6 | European American | 77,440 |
I will NOT be dragged into the battles about what constitutes a race, how white you should be to be considered white or the whole topic of trans-racialism.
But in the context of the original table, “European American” is rather white. And when we get to “Danish American” (median income 68,558 USD) we are, statistically speaking, talking about people who are very white.
Conclusion: It is not enough to check that the numbers are correct. You also need to check that you have all the numbers.