Dotbitme

View a .bit domain

To view a .bit domain you need to update your browser with the dotbitme plugin. More information also at dotbitme and meowbit. Namecoin client available here.

Register and set up a .bit domain

I am using Hostgator as my hosting service.

Namecoin

  1. Claim and configure .bit address with the Namecoin client

  2. Configure the domain using nameservers as I don’t have a dedicated IP address

Hostgator

  1. create add-on domain ‘public_html/lostnation.bit’

    • all content goes under this domain
    • (I put it under public_html/lostnation.bit)
  2. Redirect any .net name to this .bit directory

    • redirect lostnat.net -> lostnation.bit/lnsDFoKytr
    • redirect lostnation.bit -> lostnation.bit
  3. create ftp account for uploading files

    • lnsDFoKytr@lostnation.bit
    • provides access to /home2/myname/public_html/lostnation.bit

Hexo _config.yaml

/# Deployment
/#/# Docs: https://hexo.io/docs/deployment.html
deploy:
type: ftpsync
host: mydomain.net
user: lnsDFoKytr@lostnation.bit
pass: mypass
remote: /
port:
ignore:
connections:
verbose: true

Buy a hot domain name: crispr.bit

The other day I was reading an article about the transfer and potential worth of the crispr.com domain name and wondered “is crispr.bit available?” I fired up my Namecoin client and lo and behold it was! I claimed both crispr.bit and crisprcas9.bit. If you arrived at this page, dear Reader, because you typed crispr.bit in your browser, wondering “is crispr.bit for sale?” - yes indeed it is. \$100,000 for either crispr.bit or crisprcas9.bit or a whopping 25% discount - \$150,000 - for both. If you are interested, do the following:

  1. Transfer \$100,000 or \$150,000 worth of Bitcoin to my wallet ID 18Vvgw9bNmpwwH4pWJ646YAFVa3n6TXSfS. For your convenience a QR code is on my about page.

  2. After 6 confirmations send me an email at mbcladwell@gmail.com including your Namecoin wallet ID and the domain name you are interested in.

  3. Using the Namecoin client I will transfer the domain to you.

  4. Thank you. It was a pleasure doing business.

Share

Diet

Book review: The Hungry Brain Leptin, hyperpalatable food, lipostat, neo-Puritan asceticism, MealSquares

Share

Behavioral epistasis

A recent paper Social Epistasis Amplifies the Fitness Costs of Deleterious Mutations, Engendering Rapid Fitness Decline Among Modernized Populations provides a mathematical model to show the effects of behaviour of a subpopulation (carriers with behavioral mutations) on the total population. I was interested in playing with the parameters and so created a shiny app that would allow me to do so.

Assume co-mingling of a wild type population pop1 with a carrier population pop2. pop2 has deleterious behavioural mutation(s) that affect pop1 via social epistasis. Example behaviors that might have a negative impact on the population might be extreme altruism or free riding. The following equations from the paper describe the population growth of the two intermixed populations.

Population 1 (wild type) growth rate: $$pop1_{t+1} - pop1_t = (1 - p_{12})*birthrate1(pop1_t, pop2_t)*pop1_t - deathrate1*pop1_t$$ Population 2 (carrier) growth rate: $$pop2_{t+1} - pop2_t = birthrate2 * pop2_t - deathrate2 * pop2_t + p_{12} * birthrate1(pop1_t,pop2_t) * pop1_t$$ Birth rate of population 1: $$birthrate1(pop1_t, pop2_t) = birthsmax1* \frac{pop1_t}{pop1_t + pop2_t}$$

To convert this to R code I utilize a vector indexed by the variable i which will represent the flow of time in generations. pop1[1] is the first generation, pop[2] the second etc. and more generally pop1[i] is followed by pop[i+1]. Likewise birthrate1, which is population size dependent, will be indexed by i, with a potentially unique value for each generation.

Start by defining variables and setting their values to the defaults used in the paper. pop 1 and 2 will be vectors

1
2
3
4
5
6
7
8
9
10
11
12
13
birthrate2 <- 1
birthsmax1 <- 1.7 ##maximum birth rate
deathrate1 <- 1
deathrate2 <- 1.2
gens <- 30 ##number of generations
p12 <- 0.2 ##proportion of carrier births
pop1 <- vector( mode="integer", length=gens) ## wild type
pop2 <- vector( mode="integer", length=gens) ## carriers
birthrate1 <- vector( mode="integer", length=gens)
pop1[1] <- 10 ##initial starting population

Loop over the generations, adjusting population sizes and birthrate1’s value, which is population size dependent.

1
2
3
4
5
6
7
for( i in 1:(gens-1)){
birthrate1[i] <- birthsmax1*( pop1[i]/(pop1[i] + pop2[i]))
pop1[i+1] <- ((1 - p12)*birthrate1[i]*pop1[i] - deathrate1*pop1[i]) + pop1[i] ###wild type
pop2[i+1] <- birthrate2*pop2[i] - deathrate2*pop2[i] + p12*birthrate1[i]*pop1[i] + pop2[i] ##carriers
}

Then plot

1
2
3
4
5
6
7
8
plot(1:gens, pop1, type="l", xlab="Generation", ylab="Population size", main="Assess mutation load")
points(1:gens, pop2, type="l", col="red")
legend(x = 0.75*par("usr")[2], y = 0.75*par("usr")[4],
legend = c("Wild type","Carrier"),
col = c("black","red"),
pch=16)

I would like to make this a Shiny app where I can dynamically change the variables and see the effect in the plot. Take the constants and wrap them into a reactive function. Here is server.R:

server.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
shinyServer(function(input, output) {
p12func <- reactive({
input$slider1
})
br1maxfunc <- reactive({
input$slider2
})
br2func <- reactive({
input$slider3
})
dr1func <- reactive({
input$slider4
})
dr2func <- reactive({
input$slider5
})
genfunc <- reactive({
input$slider6
})
output$plot1 <- renderPlot({
birthrate2 <- br2func() ## 1
birthsmax1 <- br1maxfunc() ##1.7 maximum birth rate
deathrate1 <- dr1func() ##default 1
deathrate2 <- dr2func() ##1.2
gens <- genfunc() ##30 number of generations
p12 <- p12func() ##proportion of carrier births
pop1 <- vector( mode="integer", length=gens) ## wild type
pop2 <- vector( mode="integer", length=gens) ## carriers
pop1[1] <- 10
birthrate1 <- vector( mode="integer", length=gens)
for( i in 1:(gens-1)){
birthrate1[i] <- birthsmax1*( pop1[i]/(pop1[i] + pop2[i]))
pop1[i+1] <- ((1 - p12)*birthrate1[i]*pop1[i] - deathrate1*pop1[i]) + pop1[i] ###wild type
pop2[i+1] <- birthrate2*pop2[i] - deathrate2*pop2[i] + p12*birthrate1[i]*pop1[i] + pop2[i] ##carriers
}
plot(1:gens, pop1, type="l", xlab="Generation", ylab="Population size", main="Assess mutation load",ylim=c(0, max(max(pop1),max(pop2))))
points(1:gens, pop2, type="l", col="red")
legend(x = 0.75*par("usr")[2], y = 0.75*par("usr")[4],
legend = c("Wild type","Carrier"),
col = c("black","red"),
pch=16)
})
})

And the interface:

ui.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
shinyUI(fluidPage(
title = "Assess mutation load",
plotOutput('plot1'),
hr(),
fluidRow(
column(3,
h4("General"),
sliderInput("slider1", label = h3("Proportion of carrier births"), min = 0, max = 1, step=0.1, value = 0.2),
sliderInput("slider6", label = h3("Number of generations"), min = 10, max = 100, value = 30, step=10)
),
column(4, offset = 1,
h4("Population 1 - Wild type"),
sliderInput("slider2", label = h3("Pop1 max birth rate"), min = 1, max = 3, value = 1.7, step=0.1),
sliderInput("slider4", label = h3("Pop1 death rate"), min = 1, max = 3, value = 1, step=0.1)
),
column(4,
h4("Population 2 - carriers"),
sliderInput("slider3", label = h3("Pop2 birth rate"), min = 1, max = 3, value = 1, step=0.1),
sliderInput("slider5", label = h3("Pop2 death rate"), min = 1, max = 3, value = 1.2, step=0.1)
)
)
))

Here is a reproduction of Figure 1 from the paper:

graph.png

Here is the app on shinyapps.io. There is a monthly limit of free hours on shinyapps.io so you may have to come back if I have surpassed my limit.

Share

Universal Basic Income

This article argues that money should be given directly to the needy, and all foreign aid agencies should be dismantled.

…One estimate, generated by Laurence Chandy and Brina Seidel of the Brookings Institution, recently calculated that the global poverty gap — meaning how much it would take to get everyone above the poverty line — was just $66 billion. That is roughly what Americans spend on lottery tickets every year, and it is about half of what the world spends on foreign aid….

Share

coffee

george-howell-extras-illo1-print.gif

The Coffee Shaman discusses the genesis of the Coffee Connection and George Howell’s quest for the perfect cup of coffee.

Share

Work

Darwin was a slacker and you should be too So if there is so much evidence that shorter hours, naps, walks improve efficiency, why hasn’t some forward looking company offered these as benefits? Shouldn’t said company be able to attract and retain top talent? Personally I am much more productive working two 3 hour shifts with a lunch/nap in between. Try that in today’s corporate setting.

Asceticism of the wage cuck “The underlying bureaucratic key is the ability to deal with boredom… If you are immune to boredom, there is literally nothing you cannot accomplish.” David Foster Wallace

Happy Ambition: Striving for Success, Avoiding Status Cocaine, and Prioritizing Happiness

Why do we work so hard?

Who screwed the American worker?

You really don’t need to work so much.

Chicago: the semi-elite city If I want to live in NH does that mean I am not ambitious?

The happy state The decommodification of work as a path to societal happiness.

Why don’t we work less and have more sex?

The Sliding Scale of Bullshit Jobs

First, Let’s Get Rid of All the Bosses A radical experiment at Zappos to end the office workplace as we know it. Self organization chaos at Zappos. Amazing the tyranny CEOs can wreak over their servants.

Share

Investment advice

Get rich slowly Common sense advice on investing.

Share

Equal pay for equal work

Audacious Epigone does a nice takedown of the feminist’s unequal pay trope.

Share