Seneste WordPress opdatering introducerede en fin ny editor. Som angiveligt er helt vildt fantastisk, det nye sort, det de unge vil have og 100% hipster-kompatibel.
I have a love-hate relationship with visions and missions. The ones that companies and organizations spend a lot of time and ressources on developing. They often have a rather formulaic form:
We exist to restore intellectual capital whilst continuing to collaboratively coordinate information.
I do love the idea of missions, visions and strategies. It speaks to the engineer in me. We should define the goal we want to achieve, and then break that goal down into individual work-packages. When we have completed all of them, we have achieved our goal. The logical framework approach is a good example.
I also like values. I need consistency. Or, I don’t need it, but it is important to me. I like people and organizations to actually be consistent in their actions. Walk the talk! If you want a work environment that does not discriminate – do not discriminate. Anyone. In any way, I do not really mind that you discriminate based on gender. Go ahead. Just be honest about it. In reality, I will of course hate you if you discriminate based on gender. But the hate will take a more deep and incandecent nature if you discriminate based on gender, while claiming that you are all about equality.
So – I love strategies. I love visions. I love missions. I love values.
On the other hand. I hate them. Most of them are exactly like the example above. An example that is taken from the mission statement generator. Noone is able to explain the difference between mission and vision, and the values all falls for the negation test. And tend to end up being rather tautological. Often they are self contradictory. You can have loyalty in all situations. Or you can have honesty in all situations. But you can’t have both. Sometimes being loyal means holding back on honesty a bit. How do you prioritize your values? I have never seen a description of a hierarchy.
Usually it doesn’t matter. Most values in organizations tend to be nothing more than hot air. And as hot air, easy to dismiss when it is opportune. Try it yourself. Tell your boss that her decision is wrong, because it is in conflict the the defined values of the organization.
So – I love values. But not when they are meaningless.
And if they are – don’t bother defining them. They are just going to be a waste of time.
Et virkeligt seriøst tillidsbrud tager lang tid at komme sig over.
Der skete noget for ca. 2½ år siden. Og det har gentagne gange forbløffet mig hvor lang tid det har taget at komme over det. I fredags oplevede jeg at der var noget selvværd der var vendt tilbage.
Som hvid, cis-kønnet, hetero-præsenterende, midaldrende, akademikermand i arbejde fra den vestlige verden, er jeg utroligt priviligeret. Helt vildt priviligeret. Lønmæssigt er jeg blandt de 0.1% bedst stillede i verden. Og det er jeg selvom jeg er statsansat.
På den anden side, er det ikke specielt let. Som hvid, cis-kønnet midaldrende mand, er jeg nemlig også ansvarlig for alt dårligt i verden. Fattigdom i Afrika? Det skyldes at britene udnyttede de stakkels afro-amerikanere som slaver. Og briterne var hvide cis-kønnede, midaldrende mænd, og derfor er jeg medansvarlig for en slavehandel der fandt sted for 300 år siden. Den amerikanske præsident taler grimt om mexicanere. Og han er hvid og cis-kønnet. Det er jeg også. Og derfor er jeg, selvom jeg er dansk statsborger, og har tilbragt sammenlagt lidt under 2 måneder i USA, medskyldig.
Og kvinder! De er undertrykt. Sygeplejersker får ikke lige så meget i løn som ingeniører. Og ingeniører er mænd, mens sygeplejersker er kvinder. Og det er kvindeundertrykkende. Det er også kvinder der står for det meste af husarbejdet. Og eftersom jeg er mand, er det noget jeg er ansvarlig for. Også selvom det ikke er mig der har valgt at blive sygeplejerske. Og selvom det er mig der står for rengøring, oprydning og madlavning herhjemme (fair nok, jeg er gift med en mand. Det vil altid være en mand der står for det praktiske her i lejligheden).
Og det er selvfølgelig bare klynk. Det er et udtryk for en skrøbelig maskulinitet at man som mand gør opmærksom på at det måske ikke er ens skyld at en kvinde har valgt at læse nordisk filologi, og nu får mindre i løn end en mandlig forsikringsaktuar. Og hvis ikke det er udtryk for en skrøbelig maskulinitet, så er den formentlig toksisk. Fordi det at være mand er noget giftigt noget, der ødelægger ting. Man skal ikke som mand klynke over den slags ting. Det skal man tage som en mand. Nemlig. Og samtidig skal man være i kontakt med sine følelser og sådan noget. Men altså ikke på en måde hvor man kommer til at gøre opmærksom på at det egentlig sårer en at blive holdt ansvarlig for andres ulykke. Når man nu faktisk ikke har noget som helst med den at gøre.
Det kan også være lidt belastende at få at vide at samfundet lissom er indrettet til fordel for mænd. Specielt hvis man kommer til at bemærke, at der er tre steder i lovgivningen hvor der gøres forskel på mænd og kvinder. Mænd har værnepligt. Det vil sige at de har pligt til at lade sig slå ihjel for landets forsvar. Kvinder har ret. Hvis de beslutter sig for at de alligevel ikke har lyst, tager de bare hjem. Hvis man som mand nægter, bliver man hentet af politiet. Så er der sociallovgivningen. Kommunerne er forpligtet til at etablere tilbud til udsatte kvinder. Er du udsat mand, må du håbe at kommunen har en ledig bænk du kan sove på. Og endelig har du som mand, skulle du blive far, ret til mindre barsel end barnets mor.
Og skulle du gøre opmærksom på den slags? Så er du privilegieblind. Du er toxisk. Du klynker. Og dine oplevelser er pr. definition irrelevante.
Så. Rant delvist over. Man bør ikke blive overrasket hvis der er mænd der melder sig ud af det show. Langt hen ad vejen orker jeg ikke kønsdebatter. Mine oplevelser er fra start dømt ude. Fordi jeg er mand.
Not that advanced, but I wanted to play around a bit with plotting the raw data from Openstreetmap.
We’re going to Florence this fall. It’s been five years since we last visited the fair city, that has played such an important role in western history.
osmar provides functions to interact with Openstreetmap. ggplot2 is used for the plots, broom for making some objects tidy and dplyr for manipulating data.
top <- 43.7770
bottom <- 43.7642
left <- 11.2443
right <- 11.2661
After that, I can define the bounding box, tell the osmar functions at what URL we can find the relevant API (this is just the default). And then I can retrieve the data via get_osm(). I immediately save it to disc. This takes some time to download, and there is no reason to do that more than once.
I would like to plot the roads and buildings. For some reason there are a lot of highways, of a kind I would probably not call highways.
Anyway, lets make a list of tags. tags() finds the elements that have a key in the tag_list, way finds the lines that are represented by these elements, and find, finds the ID of the objects in “florence” matching this.
find_down() finds all the elements related to these id’s. And finally we take the subset of the large florence data-set, which have id’s matching the id’s we have in from before.
tag_list <- c("highway", "bicycle", "oneway", "building")
dat <- find(florence, way(tags(k %in% tag_list)))
dat <- find_down(florence, way(dat))
dat <- subset(florence, ids = dat)
Now, in a couple of lines, I’m gonna tidy the data. That removes the information of the type of line. As I would like to be able to color highways differently from buildings, I need to keep the information.
Saving the key-part of the tags, and the id:
I had to look it up. Semiprimes are numbers that are the product of two prime numbers. And only two, although they may be equal.
There are ten of them below 30: 4, 6, 9, 10, 14, 15, 21, 22, 25 and 26.
16 is not. The only primefactor is 2, but it occurs four times.
How many of these semiprimes are there below 108?
That should be pretty straightforward: Generate all primes below 108, make all the multiplications, and count how many uniqe numbers there are below n, where n=108.
One problem:
n <- 10**8
numbers <- primes(n)
length(numbers)
## [1] 5761455
That is a lot of numbers to multiply.
A trick: 2 times all the primes below n/2 will give all the semiprimes that have 2 as one of the primefactors (smaller than n).
3 times all the primes below n/3 will in the same way give all the semiprimes, that have 3 as one of the primefactors.
If I can figure out how many primes there are below n/2, I get the number of semiprimes that has 2 as one of the two primefactors. The same for the number of primes below n/3. If continue that to \(\sqrt(n)\), and add them all together, I should get the total number of semiprimes below n.
One issue though. The first prime below n/2 that I multiply by 2, is 3. And the first prime below n/3 that I multiply by 3 is 2. Both giving 6. I need to figure out how to only count 6 one time.
I just generated all the primes below n. The number of primes below n/2 is:
length(numbers[numbers<n/2])
## [1] 3001134
And the number of primes below n/3 is:
length(numbers[numbers<n/3])
## [1] 2050943
I do want to multiply 3 by 3. But I need to exclude 2.
I’m writing this as a function, taking a limit x. A counter is set to 0. And for all primes i less than \(\sqrt(n)\), I add the number of primes between i and < x/i.
I can test it on the example given:
n_semi_primes(30)
## [1] 10
That was the number of semiprimes below 30. And then it is just a question of running it on 108:
The cube, 41063625 (3453), can be permuted to produce two other cubes: 56623104 (3843) and 66430125 (4053). In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube.
Find the smallest cube for which exactly five permutations of its digits are cube.
Alright. I need to find five cubes, that are permutations of the same digits.
How to check if two numbers are permutations of each other?
We can generate the largest permutation of a given number. If the largest permutation of two numbers are identical, the two numbers are permutations of each other.
So I need a function, that returns the largest permutation of a number. It would be nice, if that function was vectorized.
Convert the input to character. Split at “”. That returns a list with vectors containing the individual digits of the input. lapply sorts the individual vectors in the list in decreasing order. Then lapply pastes the elements in each vector together with paste0 and “” as the separator. Then it is unlisted, and returned as numeric.
What is worth noting is a thing I was struggling with for far too long. R likes to write numbers in scientific notation. As in “1e+06”. I have not studied the phenomenon in detail. But options(scipen=5) solves the problem. It is the “penalty” used to decide when a number should be written in scientific notation. Unless I change that (trial and error, but it should be larger than whatever is default), as.character(1000000) will return “1e+06”. And the permutations of “1” “e” “+” “0” “6” are not terribly useful in this context.
I’m hazarding a guess that I don’t need to handle cubes of values of more than four digits.
Beginning with a vector of all numbers from 1 to 9999, I convert it to a dataframe. I transmute the first column to a column with the name x.
Then I mutate a second column, cube, into existence, and calculate it as the cube of the x-value. A third column, max_cube, is mutated with the result from my max_perm function above. And tha column is immediately used to group the data, so I get date grouped by identical maximum values of the permutations. I filter on the count of those groups, and only keep the groups that contain 5 elements. Then I ungroup it, and select just the cube column.
I now have a data frame with a single column containing 10 values. They are all cubes, five of them are permutations of each other. The other five are also permutaions of each other. And now I just have to take the smallest of them.
A rather popular chart type. Not really my favorite, but I can see how it makes things easier to understand for people who are not used to read and understand charts. The reason for my less than favourable view on waffle charts are probably linked to its overuse in meaningless infographics.
A waffle chart is a grid with squares/cells/icons/whatever, where each cell represents a number of something.
One annoyance: waffle wants you to spell colours wrong.
waffle takes a named vector of values, rows sets the number of rows of blocks. Default is 10.
One standard way, is to show a 10×10 grid, where each cell represents 1% of the total:
waffle(vec/sum(vec)*100)
Bloody annoying – waffle rounds the values of the vector, leading to only 98 squares. So you have to manipulate your vector to get to 100. Well, actually it is probably a minor annoyance.
What if you want something else than coloured squares?
The arguments “use_glyph” and “glyph_size” makes that possible.
First, we’ll need the library extrafont
library(extrafont)
We’ll also need to have the “awesomefonts” installed. It can be downloaded from:
This should be easier if you are on a desktop machine. As I’m running this through my own installation of RStudio on a remote server, it was a bit more difficult.
I needed to place the “fontawesome.ttf” file in the “/usr/share/fonts/truetype/fontawesome” directory.
Then, running R as superuser on the commandline, I imported the extrafont library, and then ran “font_import()”.
But then it worked!
There is now a long list of 593 different icons, that can be used. If you want a list, just run fa_list().
And now, we can make a waffle chart with the glyph of our choice.
Other people then have to pull out the data from those spreadsheets.
“Other people” tend to spend a lot of time crying into their coffee.
At the moment, I am trying to pull out data of a spreadsheet, where “something” can have a value of 1, 2 or 3. That is of course marked by an “x” in a cell. I need to convert that x to a number.
That is rather simple. What is not so simple, is that there can be two x’es. One, in black, to denote the current state of affairs. And a second x, in red, to denote what a future, state is wanted to be.
So – I need a way to get the color of an x. VBA can do that:
Function GetColour(ByVal Target As Range) As Single
Application.Volatile
GetColour = Target.Font.Color
End Function
And if I need a logical test:
Function IsBlack(ByVal Target As Range) As Boolean
Application.Volatile
If Target.Font.Color = 0 Then
IsBlack = True
Else
IsBlack = False
End If
End Function
This probably sounds like humble bragging. But I have recently – again – reailized that my biggest weakness is that I take responsibility.
Hey! How is that a weakness?
Well… It becomes a weakness when you continually take responsibility for stuff that is really not your responsibilty. To the extent that you get stress, hypertension and ulcers. And to the extent that it impacts negatively on the things that actually are your responsibility.
And I have just done it again. The ad for a meeting in the local party is not very readable. That is not my responsibility. It belongs to the chairman. Not me. I should simply notify him that it is not very readable. And trust that he will do something about it. Instead I am thinking about remaking it myself. It would not be very difficult. But I do get stressed. If I have to redesign the ad, I wont have time to cook dinner tonight. And clean the house.
This is something that I really have to get better at handling. Otherwise I’ll be a very responsible person, doing great things for people and organizations around me. While burning out very fast.