Inkonsistens

Der er pride. Eller, det var der da jeg gik i gang med at skrive det her. Jeg bliver nok ikke færdig inden det er slut. Men jeg tror indholdet vil være gyldigt nogle år endnu.

Vi har et par udfordringer i år. Det er der hvert år. Denne gang er en af sagerne følgende: En kunstner skulle have været på scenen. Hun udtalte at Priden ikke gjorde sit arbejde, og at det er bullshit at Infernal er blevet booket som hovednavn. Infernal er nemlig ikke et LGBT-band. Kunstnerne er ikke LGBT-personer. Og Priden burde, efter hendes mening, kun have LGBT-kunstnere som hovednavne. Hvorefter hun opremser en række LGBT-kunstnere, som jeg aldrig har hørt om. Ikke at mit begrænsede kendskab til musikbranchen skal lægge dem til last, men definitionen på et hovednavn er lidt at det er kunstnere som folk kender.

Og så kom hun ikke på scenen alligevel. Man kan læse mere her.

Hvorfor er det et problem? Ja, det giver uro i miljøet, det tager opmærksomhed fra festlighederne, og det politiske indhold. Men den overordnede problemstilling dukker op igen og igen:

LGBT-separatismen. Den strømning, der argumenterer for at kun LGBT-kunstnere må komme på scenen. Og for en masse andre ting i samme grundlæggende retning.

Og det giver knaster, for separatisterne ønsker at udelukke heteroseksuelle kunstnere. Kritikken bliver ofte intersektionel. For det er også “problematisk” at det overvejende er hvide cis-kønnede kunstnere der er på scenen.

Det er selvfølgelig en kritik der har noget for sig. Det er en LGBT-festival. Så hvorfor skal heteroseksuelle kunstnere på scenen? Det er en mangfoldighedsfestival, så hvorfor kun, eller altovervejende, hvide kunstnere? Og hvorfor ikke også flere transkønnede kunstnere? Og her opstår den første modstrid, den første inkonsistens, der giver problemer. Kan en mangfoldighedsfestival bevidst udelukke heteroseksuelle kunstnere? Afhængig af opgørelsesmetoder, er ca. 90% af befolkningen heterosexuelle. Hvor mangfoldig er en festival hvis den bevidst fravælger 90% af befolkningen? Alene baseret på deres seksuelle orientering?

Lige her finder vi, efter min knap så ydmyge holdning, en af årsagerne til at LGBT-bevægelsen bliver udsat for hån, spot og latterliggørelse. Argumentet er: “I kræver mangfoldighed, men vælger selv at udelukke størstedelen af befolkningen alene på grund af deres seksuelle orientering. Det hænger jo ikke sammen.”

Den mere radikale udlægning af separatismen klager også over at der ikke er flere farvede personer, eller Persons Of Color (POC) på scenen. Det er jo også et reelt argument. En mangfoldighedsfestival kan naturligvis ikke være ensfarvet. Men argumentet udarter ofte til en kritik af at der er “hvide mennesker” på scenen. Definitionen af racisme er normalt at man forskelsbehandler på baggrund af hudfarve. Når (dele af) LGBT-bevægelsen bruger ordet “hvid” pejorativt, lyder det for en traditionel opfattelse af racismebegrebet ret, nåja, racistisk.

Så LGBT-separatisterne mødes naturligvis med hån, spot og latterliggørelse. Argumentet er “I kæmper mod forskelsbehandling af mennesker baseret på deres hudfarve. Og dog udtaler I jer negativt om folk på baggrund af deres hudfarve – så længe den hudfarve er hvid. Det hænger jo ikke sammen.” Og det gør det jo ikke.

En af de ting der ser ud til at ske er, at dele af LGBT-miljøet importerer retorik og problemstillinger fra primært USA. Og selvom vi har rigeligt at kæmpe med i Danmark, så er der en noget større pulje af problemer for LGBT-personer i USA. Men det bliver ofte lidt mærkeligt, når aktivister i Danmark begynder at bekæmpe problemer der i det væsentlige ikke, eller kun i meget begrænset omfang, relativt set, faktisk findes i Danmark. Mit pt foretrukne eksempel er fokus på BIPOC-personer. De er særligt undertrykte i Danmark. BIPOC står for “Black, Indigenous & People of Color”. Og ja, personer i Danmark der har en anden hudfarve end hvid møder mange udfordringer, ikke mindst regulær racisme. Men indegenous. Det betyder indfødte. Indfødte personer er efter den logik særligt undertrykte og udsatte i Danmark. Hvis vi definerer Danmark som rigsfællesskabet er der lidt om det. Grønlændere er vitterligt undertrykte og udsatte i Danmark.

Men går man ud i offentligheden, og taler om hvor hårdt indfødte i Danmark har det, lyder det ærligt talt lidt underligt. De indfødte i Danmark er danskerne. I hvert fald i Syddanmark, den del der ikke er Grønland og Færøerne. Uanset hvor meget oprindelige amerikanere, i daglig tale indianere, måtte have af udfordringer, så er de ikke indfødte i Danmark. Det bliver, måske ikke overraskende, opfattet som meget besynderligt i den brede befolkning her til lands. Hvad værre er, man taler om det på en måde, hvor man fodrer den højreekstreme, etno-nationalistiske bevægelse i Danmark. Den mener jo netop at de indfødte i Danmark er udsatte og truede. En del af dem hiver faktisk fat i indianernes udfordringer i USA. “Se hvad der skete med den oprindelige befolkning i Nordamerika da der kom indvandrere til kysterne. Det samme kommer til at ske med os danskere, når muhammedanerne invaderer os.” er fortællingen.

Vi kommer ikke i LGBT-bevægelsen til at undgå kritik. Vi har nogle dagsordener, der udfordrer det etablerede og sætter spørgsmålstegn ved normer. Det vil naturligt medføre en reaktion. Men vi kan vælge at lade være med at gøre det vanskeligere for os selv, ved at åbne flanker for angreb. Når der er selvmodsigelser i vores argumentation, gør vi det for let for vores modstandere. Ovenstående er bare et meget lille udvalg af inkonsistenserne. Vi kan heller ikke både argumentere for at køn udelukkende er socialt konstruerede, men samtidig så endogene og medfødte som det logisk følger af retorikken om transkønnede. Eller at det er meget urimeligt at store virksomheder ikke viser deres støtte til LGBT-miljøet, samtidig med at vi kritiserer den når de så gør det. Eller at forskelsbehandling på grund af køn er meget forkert, samtidig med at “mænd” bruges som skældsord. Eller at det på den ene side er meget vigtigt at der ikke er nogen der sætter etiketter på andre, og at folk selv skal have lov at definere hvad de er, samtidig med at vi kritiserer Simon Emil Ammitzbøll-Bille og Tommy Ahlers for ikke at kalde sig selv panseksuelle.

Eller. Selvfølgelig kan vi argumentere for både det ene og det andet. Men vi skal holde op med at mene, at når modstriden bliver eksponeret og problematiseret, så er det fordi de der gør det er onde og reaktionære. Det er de sikkert også. Men det skyldes også at vores argumenter ikke altid hænger specielt godt sammen. Det første er en lang kamp at gøre noget ved. Det tager tid at flytte folks holdninger, og det er grundlæggende kun dem selv der kan flytte sig.

Men det andet. Det kan vi gøre noget ved.

 

 

Tracking temperature and humidity in our cellar

So we got to rent a new room in the cellar. It is a bit exposed, and we are not absolutely sure that it is actually frost-free. Or how humid the room is for that matter. How to track that? An arduino with a digital thermometer? With an SD-card reader? Or a Raspberry Pi?

The problem is that the room is too far from our appartment ruling out something connected to the internet – unless I want to go full IoT and set up something with a mobile connection.

After a couple of hours considering this, I came up with this basic plan:

  • Connect a digital thermometer and hygrometer to a Raspberry Pi Zero.
  • Write something that reads the values, and collect the data.
  • Write something else, that tries to connect to a mobile hotspot from my cell-phone.
  • When the connection is made – dump the collected data somewhere.
  • Make sure that you pass the room on a regular basis with the mobile hotspot active.

How to do that? I already had a Raspberry Pi Zero v 1.1 lying around. It has build-in wifi. First step is to set it up with a fresh SD-card:

  1. Download the Raspbian Buster Lite image from https://www.raspberrypi.org/downloads/raspbian/
  2. Inset the sd-card in the computer, and follow the instructions on https://www.raspberrypi.org/documentation/installation/installing-images/README.md. I already had Balena Etcher installed.

Next, it would be nice to connect to it via USB, rather than connecting the Pi to a screen and work directly on it. In order to be able to do that, I go to the boot-folder on the newly flashed SD-card. There I do this:

  1. add the line “dtoverlay=dwc2″ at the very bottom of config.txt
  2. Open the file cmdline.txt, locate the parameter “rootwait” and immediately after that, add this “modules-load=dwc2,g_ether”.
  3. Make af file called “ssh”

Now, in principle, you move the sd-card to your Pi, connect it to the UBS-port on your computer, and you should be able to ssh into pi@raspberrypi.local, using raspberry as the password.

However, it is not quite that simple. When the Pi has been connnected to the laptop, go to settings, choose the wired connection, choose IPV4, and change the “method” to only link-local (do the same for IPV6). And under Identity, change the name to raspberrypi.local.

And now we can ssh into it.

Next step is to get some temperature and humidity readings.

For that purpose, I’m using a DHT22 sensor. More specifically an already wired up sensor. It has four connections, but I’m only using three. The red wire, power is connected to a 3.3V, the black wire to ground, and the yellow data-wire to any GPIO pin. I’m using pin 2

Next – after the Pi is again connected to power, and I have SSH’ed into it, some packages need to be installed.

Before that can be done, I need to get it connected to wifi.

As I am going to use my cell-phone for that I set that up to provide a hotspot. The ssid (or name of the hotspot) is set to NusseMobil, and the password to 3.141592653.

Then I edit the file /etc/wpa_supplicant/wpa_supplicant.conf file on the Pi:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

And add this to the end of the file:

network={
ssid=”NusseMobil”
psk=”3.141592653″

Then I run this command:

wpa_cli -i wlan0 reconfigure

to get the Pi to take in the new network configuration.

Testing: Unplug the Pi from the laptop, and connect it to a separate power source. Does the Pi connect to the hotspot? If so, stuff is working, and I plug it into the laptop again.

Now I ssh into the Pi, make sure that there is live connection to the web (ping www.dr.dk is the standard way in Denmark to test that)

Now the necessary packages can be installed:

sudo apt-get update

sudo apt-get install build-essential python-dev python-openssl git

Lets see if it works

cd examples

sudo ./AdafruitDHT.py 22 2

22 because I am working with the DHT22 sensor, 2 because it is connected to GPIO 2 on the board.

Neat. Currently the temperature is 27.2 and the humidity is 55.1%

I have not compared with other thermometers, but it seems plausible.

The sensors in this package is only ready every two seconds. That should be plenty, but I should take that into consideration in the following steps.

I want to save data to a google spreadsheet. In order for that to work, I need an API-key. I follow the instructions on this page:

https://gspread.readthedocs.io/en/latest/oauth2.html

More or less – small changes appears to have crept in. Anyway, I create a new service account caled newcellar, and give it the role of editor.

I get at json file contain interesting and incomprehensible stuff.

I transfer it to the Raspi using ssh:

sudo rsync /path/to/local/file username@PCB:/path/to/remote/destination

Within the file is a mail-adress. I make a new google drive sheet, and share it with that mailadress.

editing the example from the package:

sudo nano google_spreadsheet.py

I add json filename and spreadsheet name

And try to run it:

sudo ./google_spreadsheet.py

Nope! A couple of packages are still missing:

pip install gspread

pip install –upgrade oauth2client

And then I can run it. I get an error telling me that I have forgotten to activate the API. Luckily the error provides the link I need to go to.

And after a couple of minutes the change has propagated through Googles servers, and things are working. The spreadsheet are now steadily being populated with temperature and humidity readings every 30 seconds.

Nice!

How long can I run it on batteries?

That depends on how much power is drawn by the Pi.

This site:

Raspberry Pi Power Consumption Data

has measured the power consumption by a Pi Zero w to about 250 mA. Battery capacity is measured in Ah (amp hours, usually as mAh).

The powerbank I am going to use initially, is 15.000 mAh, giving me 15000/250 60 hours of operation.

Hykleri

Hykleri er at foregive at have en særlig tro, holdning, værdisæt, følelse, kvalitet eller standard, som man ikke har.

Dobbeltmoral: indstilling der fordømmer visse forhold og samtidig accepterer visse andre, lige så forkastelige forhold

Og jeg hader begge dele.

Weird behavior of is.numeric()

An interesting observation. Please note that I have absolutely no idea about why this happens. (at least not at the time of first writing this)

In our datalab, ingeniuously named “Datalab” (the one at KUB-North, because contrary to the labs at the libraries for social sciences, and for the humanities, we are not allowed to have a name), we were visited by at student.

She wanted to make a dose-response plot. Something about the concentration of something, giving some clotting of some blood. Or something…

Anyway, she wanted to do a 4-parameter logistic model. Thats nice, I had never heard about that before, but that is the adventure of running a datalab, and what makes it fun.

Of course there is a package for it, dr4pl. After an introduction to the wonderful world of dplyr, we set out to actually fit the model. This is a minimal working example of what happened:

library(tidyverse)
library(dr4pl)

data <- tibble(dose= 1:10, response = 2:11)

dr4pl(data, dose, response)
## Error in dr4pl.default(dose = dose, response = response, init.parm = init.parm, : Both doses and responses should be numeric.

WTF? “Both doses and responses should be numeric”?. But they are!

is.numeric(data$dose)
## [1] TRUE
is.numeric(data$response)
## [1] TRUE

The error is thrown by these lines in the source:

if(!is.numeric(dose)||!is.numeric(response)) {
    stop("Both doses and responses should be numeric.")
  }

Lets try:

if(!is.numeric(data$dose)||!is.numeric(data$response)) {
    stop("Both doses and responses should be numeric.")
  } else {
    print("Where did the problem go?")
  }
## [1] "Where did the problem go?"

No idea. Did it disappear? No:

dr4pl(data, dose, response)
## Error in dr4pl.default(dose = dose, response = response, init.parm = init.parm, : Both doses and responses should be numeric.

Looking at the data might give us an idea of the source:

str(data)
## Classes 'tbl_df', 'tbl' and 'data.frame':    10 obs. of  2 variables:
##  $ dose    : int  1 2 3 4 5 6 7 8 9 10
##  $ response: int  2 3 4 5 6 7 8 9 10 11

Both dose and response are integers. Might that be the problem?

data <- tibble(dose= (1:10)*1.1, response = (2:11)*1.1)
dr4pl(data, dose, response)
## Error in dr4pl.default(dose = dose, response = response, init.parm = init.parm, : Both doses and responses should be numeric.

Nope. Both dose and response are now definitely numeric:

str(data)
## Classes 'tbl_df', 'tbl' and 'data.frame':    10 obs. of  2 variables:
##  $ dose    : num  1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 11
##  $ response: num  2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 11 12.1

But the problem persists.

Might this be the reason?

head(data,2)
## # A tibble: 2 x 2
##    dose response
##   <dbl>    <dbl>
## 1   1.1      2.2
## 2   2.2      3.3

It is a tibble. And the variables are reported to be doubles.

But according to the documentation:

“numeric is identical to double (and real)”

That should not be a problem then.

However. In desperation, I tried this:

c <- data %>% 
  as.data.frame() %>% 
  dr4pl(dose, response)

And it works!

Why? Absolutely no idea!

Or do i?

The problem is that subsetting a tibble returns a new tibble. Well, subsetting a dataframe returns a dataframe as well?

It does. Unless you subset out a single variable or observation.

In a dataframe, df$var returns a vektor, containing the values of var in df.

If, however, df is a tibble, df$var will return a tibble, with just one variable.

Project Euler 61

Project Euler 61

OK, this was a bit of a challenge.

Find six four-digit numbers that are cyclical. As in: The last two digits of the first number is equal to the first two digits of the second number, the last two digits for the second number is equal to the first two digits in the second number. Etc. The last two digits in the final sixth number must be equal to the first two digits in the first number.

Also, one number must be triangle, one square, one pentagonal, one hexagonal, one heptagonal and on octagonal.

Lets begin by making lists of the different kinds of numbers:

Four-digit triangle-numbers:

P3 <- function(x){
  x*(x+1)/2
}
L3 <- P3(45:140)

Square numbers:

P4 <- function(x){
  x*x
}
L4 <- P4(32:99)

Pentagonal:

P5 <- function(x){
  x*(3*x -1)/2
}
L5 <- P5(26:81)

Hexagonal

P6 <- function(x){
  x*(2*x-1)
}
L6 <- P6(23:70)

Heptagonal:

P7 <- function(x){
  x*(5*x-3)/2
}
L7 <- P7(21:63)

Octagonal:

P8 <- function(x){
  x*(3*x-2)
}
L8 <- P8(19:58)

Lets get them all into a list:

values <- list(L8, L7, L6, L5, L4, L3)

And this is where it gets complicated.

I take each value in L8, which is now values[[1]]

For each of them, I run through each of the other elements of values, 2:6.

For each values[[i]], I check if there are any of the numbers, where the first two digits is equal to the last two in the element in L8 I’ve come to.

If there is, I run through all of them (the ones where the first two digits is equal to the last two in the element in L8 I’ve come to.)

For each of these, I run through each of the remaining list elements, setdiff(2:6, b), where b is the iterator in 2:6

For each of those, I check that there are numbers where the first two digits etc etc etc.

When I get to the last number, I check that the last two digits are the same as the first two digits in the number in the first loop. Then I sum the numbers I’ve found, and get the answer.

It is not difficult. As such. But there are a lot of nested for-loops, and I have to check that there is a possible next number, and, if not, go to the next element.

It took quite a lot of time to get it right…

for(i in values[[1]]){
  for(b in 2:6){
    if(length(values[[b]][(values[[b]] %/% 100) == (i %% 100)])==0){
        next()
      }
    for(j in values[[b]][(values[[b]] %/% 100) == (i %% 100)]){
      for(c in setdiff(2:6, b)){
       if(length( values[[c]][(values[[c]] %/% 100) == (j %% 100)]  )==0){
         next()
       }
       for(k in values[[c]][(values[[c]] %/% 100) == (j %% 100)]){
         for(d in setdiff(2:6, c(b,c))){
           if(length( values[[d]][(values[[d]] %/% 100) == (k %% 100)]  )==0){
         next()
       }
           for(l in values[[d]][(values[[d]] %/% 100) == (k %% 100)]){
             for(e in setdiff(2:6, c(b,c,d))){
               if(length( values[[e]][(values[[e]] %/% 100) == (l %% 100)]  )==0){
         next()
       }
               for(m in values[[e]][(values[[e]] %/% 100) == (l %%100)]){
                  for(f in setdiff(2:6, c(b,c,d,e))){
                    if(length( values[[f]][(values[[f]] %/% 100) == (m %% 100)]  )==0){
                    next()
                     } else{
                    for(n in values[[f]][(values[[f]] %/% 100) == (m %% 100)]){
                          if((n %% 100) == (i %/% 100)){
                        answer <- sum(i,j,k,l,m,n)
                        break()
                      }}
                    }
                  }   
               }
             } 

           }
          }
       }
     }
    }
  }
}

Neat. But there must be an easier way.

Statistik er svært

Eller, det er svært at blive enige om. Eller også er det svært at acceptere konsekvenserne.

Danmark er, ifølge Wikipedia, 86,3% etnisk dansk. I 1980 var tallet 97%. Så hvis magthaverne, virksomheds- og organisationslederne etc. i Danmark overvejende er hvide DJØF-mænd, så bør det ikke overraske. Jo, det med mænd. Det er skævt. Men at ledende stillinger overvejende er besat af personer der har taget en uddannelse der er målrettet de stillinger, bør ikke overraske. Og at de overvejende er hvide, i et land der stadig er overvejende hvidt. Det bør slet ikke overraske.

De personer der sidder i disse ledende stillinger, begyndte den uddannelse der ledte til stillingen for 30-40 år siden. Så ledende stillinger i Danmark er besat med personer der nogenlunde bør afspejle befolkningssammensætningen for 30-40 år siden. Var den hvid? Ja, det var den. Hvis man ønsker en anden sammensætning af hudfarver på de ledende poster i Danmark, må man arbejde på at ændre sammensætningen af hudfarver i Danmark i dag, og så tålmodigt vente på at de bliver gamle nok, har fået uddannelse nok, og ancinnitet nok til at nå de ledende poster.

 

Racisme. Sexisme. Eksklusion. Diversitet

Det er aldrig ok at forskelsbehandle folk på grund af deres hudfarve.

Det er aldrig ok at forskelsbehandle folk på grund af deres køn.

Det er aldrig ok at forskelsbehandle folk på grund af deres alder.

Eller – undertiden er det. Hvis folks hud er blå, har de adgang til andre sundhedstilbud, end folk hvis hud har en normal farve. Kvinder skal også have betydeligt bedre adgang til screening for livmoderhalskræft end mænd. Og pensioner udbetales altså ikke til folk under en vis alder.

Men hvis man vil slå sig op som en inkluderende organisation, så går det ikke at udtale sig negativt om folk på grund af deres køn, alder eller hudfarve. Eller kønsidentitet. Eller seksuel orientering. Og en lang række andre ting.

Du må ikke udskamme folk på grund af deres hudfarve. Heller ikke når de er hvide. Du må ikke udskamme folk på grund af deres køn. Heller ikke når de er mænd. Du må ikke udskamme folk på grund af deres alder. Heller ikke når de er midaldrende. Du må ikke udskamme folk på grund af deres seksuelle orientering. Heller ikke når de er bøsser. Du må ikke udskamme folk på grund af deres kønsidentitet. Heller ikke når de er ciskønnede.

Du må i øvrigt heller ikke udskamme folk for at spise småkager og drikke rose-vin.

StarLog – The main character. Enterprise!

In what ways does the U.S.S. Enterprise function as a character, not just a vehicle in Star Trek? Does “she” have a personality? Do the other ships in the Star Trek universe have the same level of character development?

To be honest I do not think that the starships actually can be viewed as characters. Yes, Enterprise is named, gendered, and the “real” characters talk to her. And the computer responds. But as a general rule, the computer has no selfawareness, does not solve problems (only at the prompt of the real characters), and only has a personality to the extent that the real characters project their own perceptions and ideas on to the ship.

We like to talk about Enterprise as a character. And Star Trek would not have been Star Trek without Enterprise. But I flatly dismiss the idea that Enterprise is actually a character in her own right.

StarLog – the future of propulsion

Where do you think ion propulsion and future engine technology will take us? What are the dangers? Are there other applications?

It will take us further out in space! But where it will also take us is not places far out in space. But also to more local spaces. Solving problems related to it, will give us new technology. And we have no idea where that will take us, in the same way that we did not know how the general theory of relativity and quantum mechanics would bring us GPS-navigation.

The dangers? Hard to say. I would claim that we should be mindful of not using all our reserves of Xenon for this. Other than that. Probably none. Unless it turns out that ion propulsion damages subspace in some way.

Finally. All four pips: