Category Archives: Software

2.225074e-308

I have recently read in a dataset with p<10e343 that has been set to zero. So here is what the R documentation says

.Machine
# the smallest non-zero normalized floating-point number, a power of the radix, i.e., double.base ^ double.min.exp.
$double.xmin
2.225074e-308
# the largest normalized floating-point number. Typically, it is equal to (1 - double.neg.eps) * double.base 
# ^ double.max.exp, but on some machines it is only the second or third largest such number, being too small 
# by 1 or 2 units in the last digit of the significand
$double.xmax
1.797693e+308

 

CC-BY-NC Science Surf accessed 24.11.2025

Under fire

These messages look innocent but they are a constant invasion into privacy. Google tries to match all devices to a single person.

 

CC-BY-NC Science Surf accessed 24.11.2025

Live votes during presentation (reveal.js)

I have revised now the setup of my “live vote” presentation as the bespoke.js framework had several glitches where plugins did not work correctly. I am using now reveal.js that allows also to embed external pages (like zenpen), zoom effects and slide overview in a nice graphic layout.

The graphics engine was also replaced. d3.js is an extremely versatile but it takes hours for doing minor changes. So I switched to Kendo UI charts that are much easier to program, making some fancy live statistics :-)

Individual response times in seconds from 15 students (anonymized names on the right). Students can respond to a question as long as the question is on display. The stacked bar shows the time being faster than the slowest responder with the first to last question from right to left end of the bar. The individual  in the middle was extremely fast following my initial explanation. The two individuals at the bottom responded only to the same two questions probably talking to each other. Individuals were identified by their their mac address while all data had to be corrected for double entries.

I also thought to setup a socket.io server to push new pages to the clients (currently they initiate their own refresh) but at the end I found it too time consuming as spending time on  content is being more important. Right now I am sending out an ajax request to store the actual presentation slide for the clients.

var i = Reveal.getCurrentSlide().children[0].id;
Reveal.addEventListener( 'slidechanged', function( event ) {
  i = $("span").eq(event.indexh).attr("id");
  $.ajax({
    url: "server.php",
    type: "GET",
    data: {"k":event.indexh}
  );
  return i;
});

 

CC-BY-NC Science Surf accessed 24.11.2025

Altersbestimmung von Minderjährigen

Das Alter von Kindern und Jugendlichen wird medizinisch immer noch so wie vor 50 Jahren bestimmt, es hat sich seit den Tanner Kriterien 1969 nicht viel geändert, so zdf.de:

Wie das Alter im Einzelfall bestimmt bzw. geschätzt wird, ist sehr unterschiedlich. Die Praxis zur Altersfeststellung ist nicht bundeseinheitlich geregelt, unterscheidet sich also von Bundesland zu Bundesland. Meist werden die Migranten von Mitarbeitern der Jugendämter anhand eines Leitfadens befragt. Zusätzlich wird das Erscheinungsbild des Flüchtlings betrachtet wie etwa Bartwuchs oder körperliche Entwicklung. Sexualorgane dürfen nicht untersucht werden.

Sofern daraus keine eindeutige Einschätzung hervorgeht, können eine Untersuchung des “Zahnalters” sowie des “Knochenalters” durchgeführt werden. Dazu werden sogenannte “Panorama-Aufnahmen” des Gebisses gemacht, sowie Röntgenaufnahmen der Handgelenke bzw. der Brustbein-Schlüsselbeingelenke.

Über diese Methoden der Altersfeststellung bzw. Schätzung besteht jedoch Uneinigkeit: In einer gemeinsamen Stellungnahme lehnen der Bundesfachverband unbegleitete minderjährige Flüchtlinge, das Deutsche Kinderhilfswerk und der ippnw e.V. die Rufe nach der Altersfeststellung als “Symbolpolitik und gefährliche Stimmungsmache” ab. Es sei medizinisch nicht möglich, das Alter von Jugendlichen bzw. jungen Erwachsenen genau festzustellen. Daher bestehe die Gefahr, Jugendliche fälschlicher Weise zu Erwachsenen zu erklären, was für sie erhebliche negative Folgen hätte.

Das stimmt natürlich, aber gibt es wirklich keine besseren biologische Methoden der Altersfeststellung? Röntgen der Handwurzel, des Schlüsselbeins, den Altersringen von Zähnen  oder dem Dentin (D-D/L Asp) Index ? Vorstellbar wäre auch die Messung der Telomere. Aber sowohl mitochondriale als auch somatische Mutationen sind nur schwer auf ein genaues Alter zu kalibrieren, ebensowenig wie die T Zell Ringe (TRECs) oder Genexpression in der Haut.

Die Bestimmung der DNA Methylierung hat dagegen mehr Potential, etwa bei Vidaki 2017 oder auch Horvath 2013 der sogar einen online Rechner anbietet. Bei Vidaki  (450K) lag  bei einer Altersspannweite von 2–90 Jahren die Genauigkeit bei 4 Jahren. Vorstellbar also, dass man mit einen 800K Datensatz von 15-20jährigen auf eine Genauigkeit auf 1 oder 2 Jahren kommen könnte. Sicher ist das aber nicht, das Problem dabei dürfte der logarithmische Verlauf der DNA Methylierung in dieser Altersgruppe sein, die hohe Variabilität (sichtbar auch am sehr individuellen Pubertätseintritt), sowie noch weitgehend unbekannte ethnische Faktoren oder auch dem aktuelle Ernährungszustand.

 

 

CC-BY-NC Science Surf accessed 24.11.2025

millumin osc controller

I need to control two machines running both an instance of millumin and have even more lights that will understand OSC control commands.

screenshot

In a first attempt, I tried a mobile app called TouchOSC to get everything under one hood. It turned out to be cumbersome to create display templates, install an OSC splitter.

The second option were millumin plugins (MLSync_1_1 and SimpleSync) that were good for keeping everything in sync but not for sending out different signals to different IPs.

The third option, an OSC data track inside a master millumin installation, tended to be confusing after 5 minutes.

Unfortunately some javascript based solution will not work as OSC is sent via UDP (which is not possible in desktop browsers), therefore I combined an old php library  with a modern bootstrap/material template using a black design for use in darkened rooms.

Here is the script index.php for download. It is quite basic but a useful starting point for any other OSC command, and an infinite number of machines as long as you know their IP address and can increase any of the 3 loops in the script.

For non Millumin computers, I am using node.js with node-osc as receiver.

 

CC-BY-NC Science Surf accessed 24.11.2025

p-value of 0.05 (1925-2017)

Ronald Fisher dominated the science world with his 0.05 p value. A new paper of renowned scientists now claim for 0.005.

The lack of reproducibility of scientific studies has caused growing concern over the credibility of claims of new discoveries based on ‘statistically significant’ findings. There has been much progress toward documenting and addressing several causes of this lack of reproducibility (for example, multiple testing, P-hacking, publication bias and under-powered studies). However, we believe that a leading cause of non-reproducibility has not yet been adequately addressed: statistical standards of evidence for claiming new discoveries in many fields of science are simply too low.

Of course also 0.005 doesn’t prevent from systematic errors.

According to scientists familiar with the paper, the neutrinos raced from a particle accelerator at CERN outside Geneva, where they were created, to a cavern underneath Gran Sasso in Italy, a distance of about 450 miles, about 60 nanoseconds faster than it would take a light beam. That amounts to a speed greater than light by about 0.0025 percent (2.5 parts in a hundred thousand).

which was corrected, as a GPS was not in sync…

 

CC-BY-NC Science Surf accessed 24.11.2025

IL1RL1 / ST2 and asthma

The association of IL1RL1 and asthma is usually attributed to our 2009 nature genetics paper, sometime also to the later NEJM paper 2010. We described the association in the IL1 cluster, however, already 6 years earlier  in Gohlke et al. 2004. The resolution wasn’t so good at that time as we thought more of IL1RN than IL1RL1. And even  in 2004, the IL1 cluster was well known. Why is the temporal order of events so unimportant?

 

CC-BY-NC Science Surf accessed 24.11.2025

Why replication is important

A nice explanation at honestuniverse.com

One of the most important principles of the scientific method is reproducibility. A valid result should be able to be replicated independently, whereas an invalid result (originally achieved due to some error or perhaps just chance) will not be able to be consistently reproduced […] The reason why this is the case has to do with researcher degrees of freedom. In an original experiment, the experimenters have the freedom to make certain choices. Some choices may have been made beforehand, whereas others are made after the study has been started. These choices may not all be made consciously, or they may be made consciously with only unconscious bias, but the fact that the choices are made at all after the experiment has begun affects the reliability of the results.

which basically means that the kind of replication nature genetics demands for an association, is not a replication at all, but some extended or repeated study.

 

CC-BY-NC Science Surf accessed 24.11.2025

How to merge local and remote data in the browser

In a first step reconfigure your browser

Safari
Enable the develop menu using the preferences panel, under Advanced -> “Show develop menu in menu bar”.
Then from the safari “Develop” menu, select “Disable local file restrictions”.
Chrome
Close all running Chrome instances first. Then start the Chrome executable with a command line flag:
chrome –allow-file-access-from-files
On Mac OSX terminal you can do this with
open /Applications/Google\ Chrome.app –args –allow-file-access-from-files
Firefox
In the address bar, type about:config Find the security.fileuri.strict_origin_policy parameter and set it to false

 

Here is the script, loosedly based on https://www.html5rocks.com/en/tutorials/file/dndfiles and https://stackoverflow.com/questions/7346563/loading-local-json-file that loads json1 from the server, json2 from the local harddrive and merges both by id

<html>
<input type="file" id="files" name="files[]" />
<output id="list"></output>
</html>

<script src="jquery-1.11.1.min.js"></script>

<script>
// read local comma delimited file with id and name
function readTextFile(file) {
  var rawFile = new XMLHttpRequest();
  rawFile.open("GET", file, false);
  rawFile.onreadystatechange = function () {
    if(rawFile.readyState === 4) {
      if(rawFile.status === 200 || rawFile.status == 0) {
        rider = rawFile.responseText.split("\n");
        return rider;
      }
    }
  }
  rawFile.send(null);
}

// read server data in json format
var url = 'merge.json';
var json2;
$.ajax ({
    url: url,
    async: false,
    dataType: "json",
    cache: false,
    success: function(data) {
        json2 = data;
    },
    error: function(err) {
        console.log(JSON.stringify(err))
    }
});

// function to join by id
function joinObjects() {
  var idMap = {};
  for(var i = 0; i < arguments.length; i++) { 
    for(var j = 0; j < arguments[i].length; j++) {
       var currentID = arguments[i][j]['id'];
       if(!idMap[currentID]) {
          idMap[currentID] = {};
        }
      for(key in arguments[i][j]) {
          idMap[currentID][key] = arguments[i][j][key];
      }
    }
  }
  var newArray = [];
  for(property in idMap) {
    newArray.push(idMap[property]);
  }
  return newArray;
}

// selection of local fiel starts it all
function handleFileSelect(evt) {
  var files = evt.target.files; // FileList object
  // files is a FileList of File objects. List some properties.
  var output = [];
  for (var i = 0, f; f = files[i]; i++) {

  readTextFile( "file:///Users/wjst/Desktop/"+escape(f.name) );
  for(var i = 0; i < rider.length; i++) {
    rider[i] = rider[i].split(",");
  }
  json1 = rider.map(function(x) {
    return {    
      "id": Number(x[0]),
      "name": x[1]
    }
  })
  console.log(json1);
  console.log(json2);
  console.log( JSON.stringify( joinObjects(json1, json2) ));
 }
}

document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

 

CC-BY-NC Science Surf accessed 24.11.2025

Treg and transplant rejection

Yesterday evening I heard an interesting talk here about lung transplant rejection where one of the best prognostic marker
was the (pre transplantation) Treg count.

I wonder if there are some preexisting patient conditions, like allergy, that are responsible for this phenomenon?
At least it is already known since 2008 that Treg function is important. Current Treg therapies are exploiting this. Another allergy hallmark the IL33/ST2 axis is actively tested at the moment in transplant rejection.

In contrast transplant acquired allergy is something different – a side effect of tacrolimus? Or any other ingredient of the cocktail of steroids, mycophenolate, and IL-2 receptor inhibitors such as basiliximab?

 

CC-BY-NC Science Surf accessed 24.11.2025

Exports OSX ratings to XMP ratings

for FILE in *.jpg
do
  FN=$(echo $FILE | sed -e "s/jpg/xmp/")
  RATE=$(mdls "$FILE" | awk '/kMDItemStarRating/' |  awk '{print $NF}' )
  OR=$(mdls "$FILE" | awk '/kMDItemOrientation/' |  awk '{print $NF}' )
  exiftool "$FILE" -xmp:rating=$RATE -n -xmp:orientation=$OR -o "$FN"
done

 

CC-BY-NC Science Surf accessed 24.11.2025

Keep your Excelsheet updated ;-) or how to bind Kendo UI for jquery on a Synology to websocket

This is not really about Excel but about Kendo Grid’s ability to update grid data in the browser.  This is already my second attempt as a Mosquitto based MQTT solution did not work properly.

Demo Grid

Installing node.js on the Synology is straightforward – just use the package manager. We also need some local packages. Change into the target directory and type

npm install express
npm install typescript
npm install ws

Copy also app.js from https://github.com/telerik/kendoui-ws-demo into that directory. Unfortunately app.js breaks in line 5 (we need another port as 5000 is already occupied in the Synology). It also crashes in line 6, as the node.js V4 version needs full extension. So use the following lines

var WebSocketServer = require("ws").Server;
var http = require("http");
var express = require("express");
var app = express();
var port = process.env.PORT || 5050;
var products = require("./products.js");

Then start the server by

/usr/local/bin/node /volume1/web/kendoui-ws-demo-master/app.js &

Get the client script in kendoui.for.jquery.2017.3.1018.trial/examples/grid/web-socket.html and change the host. Take care to use ws (Websocket), not wss (Websocket secure) unless you know what you are doing.

//var host = "wss://kendoui-ws-demo.herokuapp.com";
var host = "ws://myserver:5050";

That’s it.

 

CC-BY-NC Science Surf accessed 24.11.2025