Category Archives: Software

Big data Größenwahn

Quelle www.brandeins.de diskutiert eine Arbeit aus Nature 2009:

Das US-amerikanische Wissenschaftsmagazin präsentierte eine Studie von Datenwissenschaftlern in Diensten von Google und Yahoo. Die konnten plausibel nachweisen: Wenn viele Leute Suchwörter wie „Grippesymptome“ oder „Apotheke in der Nähe“ eingeben, lassen sich geografische Ausbreitungen von Seuchen nahezu in Echtzeit berechnen, ohne dass irgendjemand mit einem einzigen Arzt sprechen muss. Die Anwendung dazu nannten sie GFT, Google Flu Trends.
Mit gesundem Menschenverstand leicht nachzuvollziehen war, dass die Methode um ein Vielfaches präziser und schneller sein würde als das gängige Verfahren des amerikanischen Centers for Disease Control and Prevention. Die Beamten der Behörde sammeln Fragebögen bei Arztpraxen zu Patientenzahlen ein und rechnen mit ein bis zwei Wochen Zeitverzögerung die gesundheitliche Lage der Nation hoch.

Dann aber kam eine Arbeit in Science 2014

Rückblickend hatte sich die Vorhersagequalität von GFT als lausig erwiesen. Die Beamten mit ihren Fragebögen hatten im Durchschnitt bessere Vorhersagearbeit geleistet. Kurz darauf wurde eine Studie von Datenwissenschaftlern rund um den Harvard-Ökonom Ryan Kennedy publiziert, die den Aufstieg und Fall des Datenmusterknaben Google Flu Trends zur Parabel für Big-Data-Analytik insgesamt erklärte.

siehe auch Wired “What We Can Learn From the Epic Failure of Google Flu Trends?”


CC-BY-NC

A self-healing programming error

This is really cool – I had a long lasting error in my GPX cycle planner  where I could never find the culprit.
Basically, the system was freezing after doing a POI search. With the most recent Safari and Chrome updates everything is working now. Just needed a new API key from Google …

screen


CC-BY-NC

Eine Kulturkritik von Open Access

http://geschichtedergegenwart.ch/open_access-wie-der-akademische-kapitalismus-die-wissenschaften-veraendert/

Hagner zeigt einige Aspekte auf, wie Open Access unsere Wissenschaftslandschaft verändert. Es ist ein interessanter Essay, leider redet der Autor viel über die MINT-Fächer (Medizin, Infor­ma­ti­ons­wis­sen­schaften, Natur­wis­sen­schaften, Technik) ohne davon allzu viel zu verstehen. Die Grundaussage stimmt natürlich, dass es eine heterogene Spielwiese ist

Die Praxis von Open Access ist dominiert von einer Vielzahl unter­schied­licher Akteure mit zum Teil gegen­läu­figen Inter­essen. Dazu gehören Politiker, globale Verlags­kon­sortien, Förder­or­ga­ni­sa­tionen, Wissen­schafts­ma­nager, Biblio­thekare, digitale Aktivisten, die Compu­ter­in­dustrie und schließlich auch dieje­nigen, um die es eigentlich geht: Wissen­schaftler – aber auch hier handelt es sich keineswegs um eine homogene Gruppe.

Dabei ist völlig unklar, wohin die Entwicklung geht.  Ob die EU-Rahmenprogramme  im Wesent­lichen “über Bande gespielte Wirtschafts­för­derung” sind, ist relativ egal unwichtig in dem Zusammenhang. Es stimmt auch nur sehr begrenzt, dass man in  digitaler Zeitschriften Artikel publi­zieren kann, die man in “seriö­sen” Journalen nicht unter­bringen kann.

Dafür fehlt der wichtigste Punkt, dass Open Access lediglich die Kosten vom Leser auf die Autoren abwälzt. Die Verlag verdienen ungehindert weiter, statt an Elsevier gehen Steuergelder nun an PLoS, 36 Millionen in 2014. Und wenn Elsevier seine Strategie nur etwas modifiziert im Sinn von „we continued to make good progress on our strategy to syste­ma­ti­cally transform our business into a profes­sional infor­mation solutions“ dann haben wir ziemlich bald das Facebook Phänomen auch in der Forschung: Keiner ist wirklich überzeugt, aber de facto frisst es unsere Zeit.

Der Titel des Essays ist jedenfalls gut. Da könnte man viel  interessantes herausholen, zum Beispiel, dass Zeitschriften  keine “periodicals” mehr sind und Wissenschaft zur Dauerberieselung wird. Wenn der Zeitschriftenname nun keine Werbung für meinen Artikel mehr ist, muss ich nun selbst für jedes Paper eine Kampagne starten?


CC-BY-NC

Research waste

Although I didn’t expect that ever in allergy research there is an editorial with the title “Research Waste in Atopic Eczema Trials – Just the Tip of the Iceberg” refering to a meta-analysis by Wilkes et al.

Clinical trials often continue to be undertaken even though the effectiveness of the intervention under consideration has already been demonstrated. In addition, vehicle- or placebo-controlled studies predominate over head-to-head comparisons, although the latter would be more informative for clinicians in guiding patient management. This creates research waste, and both investigators and funders are to blame.

 

screen


CC-BY-NC

Resize and preserve image orientation before upload

I need to downscale images on mobile phones to save bandwidth. Here is my code based on http://www.codeforest.net/html5-image-upload-resize-and-crop. No need for any complicated plugins. Take care of some security holes…

<html>
<head>
<script src="jquery-1.11.1.min.js"></script>
<?php if ($_POST) {
  $img = $_POST['image'];
  $img = str_replace('data:image/jpeg;base64,', '', $img);
  $img = str_replace(' ', '+', $img);
  $data = base64_decode($img);
  $file = 'cache/' . uniqid() . '.jpg';
  file_put_contents($file, $data);
}
?>
</head>

<body>
<form>
<input type="text" value="" name="text" id="text"/>
<input type="file" name="filesToUpload[]" id="filesToUpload" multiple="multiple" />
<input type="button" id="button" value="submit">
</form>

<script>
$('#button').click(function(){

 if (window.File && window.FileReader && window.FileList && window.Blob) {
   var files = document.getElementById('filesToUpload').files;
   for(var i = 0; i < files.length; i++) {
     resizeAndUpload(files[i]);
   }
 }
 else {
   alert('not supported');
 }
});

function resizeAndUpload(file) {
  var reader = new FileReader();
  reader.onloadend = function() {
    var tempImg = new Image();
    tempImg.src = reader.result;
    tempImg.onload = function() {
      var max_width = 500;
      var max_height = 500;
      var tempW = tempImg.width;
      var tempH = tempImg.height;
      if (tempW > tempH) {
        if (tempW > max_width) {
          tempH *= max_width / tempW;
          tempW = max_width;
        }
      }
      else {
      if (tempH > max_height) {
        tempW *= max_height / tempH;
        tempH = max_height;
      }
   }
   var canvas = document.createElement('canvas');
   canvas.width = tempW;
   canvas.height = tempH;
   var ctx = canvas.getContext("2d");
   ctx.drawImage(this, 0, 0, tempW, tempH);
   var dataURL = canvas.toDataURL("image/jpeg");
   var xhr = new XMLHttpRequest();
   xhr.onreadystatechange = function() {
     if (xhr.readyState == 4 && xhr.status == 200) {
       location.reload();
     }
   };
   xhr.open('POST', 'index.php', true);
   xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
   var input = document.getElementById("text");
   var inputData = encodeURIComponent(input.value);
   var data = 'text=' + inputData + '&image=' + dataURL;
   xhr.send(data);
   }
 }
}
</script>

</body>
</html>

The big issue when running that with multiple phones is image orientation.
To save computing power many mobiles are just save their sensor data without caring about too much about orientation as long as orientation is written in the exif tag.
Here are the 8 possible orientations

ORIENTATION
	TOP	LEFT    
1	top	left
2	top	right
3	bottom	right
4	bottom	left
5	left	top
6	right	top
7	right	bottom
8	left	bottom

I therefore added canvas rotation / flipping after getting image orientation from https://github.com/blueimp/JavaScript-Load-Image. The revised function now looks like

function resizeAndUpload(file) {
  var reader = new FileReader();
  reader.onloadend = function() {
    var can = document.createElement('canvas'); 
    var ctx = can.getContext("2d");
    var thisImage = new Image();
    thisImage.src = reader.result;
    thisImage.onload = function() {    
      var max_width = 1500;
      var max_height = 1500;
      var tempW = thisImage.width;
      var tempH = thisImage.height;
      if (tempW > tempH) {
        if (tempW > max_width) {
          tempH *= max_width / tempW;
          tempW = max_width;
        }
      }
      else {
        if (tempH > max_height) {
          tempW *= max_height / tempH;
          tempH = max_height;
        }
      }
      can.width  = tempW;
      can.height = tempH;
      ctx.save();
      var width  = can.width;  var styleWidth  = can.style.width;
      var height = can.height; var styleHeight = can.style.height;
      if (orientation>1) {
        if (orientation > 4) {
          can.width  = height; can.style.width  = styleHeight;
          can.height = width;  can.style.height = styleWidth;
        }
        switch (orientation) {
          case 2: ctx.translate(width, 0);     ctx.scale(-1,1); break;
          case 3: ctx.translate(width,height); ctx.rotate(Math.PI); break;
          case 4: ctx.translate(0,height);     ctx.scale(1,-1); break;
          case 5: ctx.rotate(0.5 * Math.PI);   ctx.scale(1,-1); break;
          case 6: ctx.rotate(0.5 * Math.PI);   ctx.translate(0,-height); break;
          case 7: ctx.rotate(0.5 * Math.PI);   ctx.translate(width,-height); ctx.scale(-1,1); break;
          case 8: ctx.rotate(-0.5 * Math.PI);  ctx.translate(-width,0); break;
        }
      }
      ctx.drawImage(thisImage,0,0,tempW,tempH);
      ctx.restore();
    }
    var dataURL = canvas.toDataURL("image/jpeg");
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4 && xhr.status == 200) {
        location.reload();
      }
    };
    xhr.open('POST', 'index.php', true);
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    var input = document.getElementById("text");
    var inputData = encodeURIComponent(input.value);
    var data = 'text=' + inputData + '&image=' + dataURL;
    xhr.send(data);
  }
}

CC-BY-NC

Arrange divs by row while aligning them vertically?

Seems there is a real problem ;-) even with valuable SO comments at hand. In the first instance I tried to float all divs. But even when clearing floats this always left a vertical gap. In a second attempt, I used a table but this wasn’t really responsive design. Next, I tried CSS3 multi-column layout

#container {
    margin: 0 auto; 
    column-count: 3;
    column-gap: 2px;
    width: 320px;
    background-color: white;
}

This works as expected (jsfiddle).

screen

and could be even responsive when adding some code for smaller screens

@media screen and (max-width: 1450px) {
  #inner {
    max-width:950px;
    margin: 0 auto;
    -moz-column-count: 2;
    -webkit-column-count: 2;
    column-count: 2;
  }
}
@media screen and (max-width: 950px) {
  #inner {
    max-width:480px;
    margin: 0 auto;
    -moz-column-count: 1;
    -webkit-column-count: 1;
    column-count: 1;
  }
}

jsfiddle looks great but we are soon running into another problem. Whenever adding more divs as the database is updated, the whole layout gets re-arranged column-wise which is very confusing to the viewer. The same happens with flexbox (attempt #4), currently there is no CSS solution at all. You need some JS layout cheating (codepen).


CC-BY-NC

How to switch divs on or off – a super neat trick

I want to hide a div container as it clutters my otherwise clean picture display. And I found some javascript – free, CSS only solution: the  checkbox hack. Modified it a bit while it looks now like this

<label for="t">license me...</label>
<input id="t" type="checkbox" />
<div id="buy">price</div>
input[type=checkbox] {position: absolute;
 top: -9999px; left: -9999px; }
label { border:none; cursor: pointer; }
label:hover { border-bottom:1px solid #444; }
div#buy { display:none; }
input[type=checkbox]:checked ~ div#buy
 { display: block; }

You get the idea: whenever the label of the unvisible checkbox is being clicked, the display state of the div container is changing between on to off.


CC-BY-NC

The brain is not a computer

aeon.co/essays has a a long and convincing plea

Our shoddy thinking about the brain has deep historical roots, but the invention of computers in the 1940s got us especially confused. For more than half a century now, psychologists, linguists, neuroscientists and other experts on human behaviour have been asserting that the human brain works like a computer … we are not born with: information, data, rules, software, knowledge, lexicons, representations, algorithms, programs, models, memories, images …
computers really do operate on symbolic representations of the world. They really store and retrieve. They really process. They really have physical memories. They really are guided in everything they do, without exception, by algorithms…
The idea that memories are stored in individual neurons is preposterous: how and where is the memory stored in the cell?

Indeed, all NMR studies tell us, that many brain areas are being involved in simple tasks. I just wonder why all the current research money goes into human brain mapping projects? We know, it doesn’t work and it is not just a matter of poor organization.

I particular liked the objection of aeon.co that human consciousness acts like computer software. Just bits and bytes get immoral as shown in the movie Transcendence (2014) with disastrous results for humanity. Or like with the Twitter bot Tay that had to be shut down due to its inability to recognize when it was making offensive or racist statements.


CC-BY-NC

Bacteria, vitamin D and allergy

Bacterial (and fungal) gut diversity are believed to influence primary allergic sensitization as well as early vitamin D supplementation. The question  is – again –  could there be any connection? Continue reading Bacteria, vitamin D and allergy


CC-BY-NC

owncloud 9.0.2 destroyed

Again, the recent own cloud 8 -> 9 updates remained difficult. Modifying the database helped:

update oc_appconfig set configvalue = 'dav/appinfo/v1/webdav.php' where appid = 'core' and configkey = 'remote_files';
update oc_appconfig set configvalue = 'dav/appinfo/v1/webdav.php' where appid = 'core' and configkey = 'remote_webdav';
update oc_appconfig set configvalue = 'dav/appinfo/v1/caldav.php' where appid = 'core' and configkey = 'remote_calendar';
update oc_appconfig set configvalue = 'dav/appinfo/v1/caldav.php' where appid = 'core' and configkey = 'remote_caldav';
update oc_appconfig set configvalue = 'dav/appinfo/v1/carddav.php' where appid = 'core' and configkey = 'remote_contacts';
update oc_appconfig set configvalue = 'dav/appinfo/v1/carddav.php' where appid = 'core' and configkey = 'remote_carddav';
update oc_appconfig set configvalue = 'dav/appinfo/v1/carddav.php' where appid = 'core' and configkey = 'remote_contactsplus';

But only to discover that the new calendar entries were corrupt as found by others

/* show old calendars and count */
SELECT o.calendarid, c.userid, c.displayname, c.uri, COUNT(o.calendarid)
FROM oc_clndr_objects o
JOIN oc_clndr_calendars c ON o.calendarid = c.id
GROUP BY calendarid
ORDER BY c.userid, c.displayname;
/* show new calendars and count */
SELECT o.calendarid, c.principaluri, c.displayname, c.uri, COUNT(o.calendarid)
FROM oc_calendarobjects o
JOIN oc_calendars c ON o.calendarid = c.id
GROUP BY calendarid
ORDER BY c.principaluri, c.displayname;

Maybe I give up on own cloud now.


CC-BY-NC

Irreproducibility, once more

Francis Collins wrote in a commentary

A growing chorus of concern, from scientists and laypeople, contends that the complex system for ensuring the reproducibility of biomedical research is failing and is in need of restructuring. As leaders of the US National Institutes of Health (NIH), we share this concern and here explore some of the significant interventions that we are planning.
Science has long been regarded as ‘self-correcting’, given that it is founded on the replication of earlier work. Over the long term, that principle remains true. In the shorter term, however, the checks and balances that once ensured scientific fidelity have been hobbled. This has compromised the ability of today’s researchers to reproduce others’ findings.
Let’s be clear: with rare exceptions, we have no evidence to suggest that irreproducibility is caused by scientific misconduct. In 2011, the Office of Research Integrity of the US Department of Health and Human Services pursued only 12 such cases3. Even if this represents only a fraction of the actual problem, fraudulent papers are vastly outnumbered by the hundreds of thousands published each year in good faith.

I agree, that a major part of current research output is not reproduced anymore.

Furthermore,  there are doubts that science is self-correcting anymore even on the long-term run. Who will ever assemble 500K GWAS data 50.000 asthma patients and another 50.000 controls? Sharing data is the only solution to discover any false claims. Unfortunately, I could even not even get within an EU FP 5 project the genotype data from my own probands.

And let’s be clear: was is scientific misconduct? Just fraud or the long slippery slope?

According to the FDAAA, failure to comply with its provisions may result in civil penalties of as much as $10 000 per day.

Maybe the EU should implement a similar policy like the FDAAA??


CC-BY-NC

Aber wir sind doch alles Tiroler

Am Brenner heute morgen im Fernbus von Bozen nach München. Zwei österreichische Polizeibeamte gehen durch die Reihen und kontrollieren die Ausweise. Eine alte Frau ganz vorne in der ersten Reihe ganz entsetzt zu dem doch recht jovialen Polizisten: Aber wir sind doch alle Tiroler!

20160402_160528__DSC4998

gesehen in Wien / Josefstadt Anfang April


CC-BY-NC

Raspberry Infrared: Just 50€ to detect a frame motor?

At the recent bike festival Sattelfest here in Munich, I had the chance to try out an in frame electric motor Vivax Assist. The wheel was spinning slowly leading to a seat stay temperature difference of at least 5 degree Celsius compared to the top tube. There was also a clear gradient towards to the bottom bracket that should be visible with conventional thermography.
You could use the Seek Thermal Smartphone add ons for thermography (249€) while also Raspberry just released an updated camera sensor with no IR filter (23€). Unfortunately 1um wave length is way ahead from the 3um IR wavelength required for thermal imaging but there is also a 16×4 array sensor MLX90620 from Melexis that could work. Could anyone take some pictures of race bikes next week during the start of the Giro?


CC-BY-NC