flo's lifestream - imported from blog.flo.cx http://lifestream.flo.cx/feed en-us http://blogs.law.harvard.edu/tech/rss Sweetcron florian@klien.cx word clouds in javascript… http://lifestream.flo.cx/items/view/3593

i’ve been waiting for this since i first used wordle. wordle was great. it has a great design and is easy to use, but the java plugin mess was horrible. it worked unter mac os x but linux support is just not there when you want to export a word cloud as vector graphic. now jason davies did a similar thing but in javascript; it’s open source and on github. thank you jason! your effort is very much appreciated
greets from graz:

via flowingdata.com. No related posts.

]]>
Tue, 14 Feb 2012 11:03:00 +0000 http://lifestream.flo.cx/items/view/3593
fish… http://lifestream.flo.cx/items/view/3592

i finally got the time to cut a fish video i did in august:

http://www.youtube.com/watch?v=_xlI26UxgWA

think of it more as a music video than an action packed short film. watch in high quality! Related posts: Cory Doctorow – The coming war on general computation…

]]>
Mon, 13 Feb 2012 20:36:00 +0000 http://lifestream.flo.cx/items/view/3592
Cory Doctorow – The coming war on general computation… http://lifestream.flo.cx/items/view/3458

cory doctorows talk at the 28c3 is great! you should watch it. it really makes you think what kind of society we live in and if one should support companies that do censor their hardware.

http://www.youtube.com/watch?v=HUEvRyemKSg

the video is licensed under CC-BY and so is the audio stream. so – for those of you who want just the audio stream for a long trip and their mp3 player, i did extract the audio from the high quality video and put up a torrent here: http://tors.in/corydoctorow28c3 – here is the magnet link. i will seed
No related posts.

]]>
Fri, 30 Dec 2011 14:07:00 +0000 http://lifestream.flo.cx/items/view/3458
close one… http://lifestream.flo.cx/items/view/3427

yet another game @ KGS. this is a rather close one. but i won yay [Embedded SGF File] Related posts: the game of go…

]]>
Mon, 19 Dec 2011 14:59:00 +0000 http://lifestream.flo.cx/items/view/3427
Quiche… http://lifestream.flo.cx/items/view/3428

Quiche (Symbolfoto) by ImipolexG ich wurde die letzten tage öfter nach meinem quiche rezept gefragt, also halte ich das hier auch noch einmal für die nachwelt fest: Teig: 125g Butter 250g Mehl (glatt) etwas Wasser Belag: 250ml Schlagobers 3 Eier 50-100g Bergkäse oder einen anderen nicht zu milden Käse Muskatnuss Verschiedenes * den teig durch starkes kneten vermengen. beim mürbteig nur ganz wenig wasser verwenden, das kann sehr bröselig sein und lange dauern. danach kühl stellen, oder wenn der teig trotz warmer hände noch kühl ist gleich ausrollen und in eine quiche-form geben. ich schneide immer dünne scheiben auf und presse diese dann mit den fingern in die form bis ein durchgängiger boden entsteht. * als belag eignet sich fast alles: jedes gemüse, schwammerl, speck, etc. alles am besten aber vorher in der pfanne anschwitzen, damit es nicht in der quiche zu viel wasser lässt. ausserdem nur zutaten verwenden die schon durch gekocht sind. weiters die eier im schlagobers versprudeln und etwas muskat hinzufügen. den hauptbelag in die quiche-form auf den teig legen, den schlagobers mit den eiern darübergiessen und zum schluss den geriebenen käse drüberstreuen. dann das ganze für etwa 20 minuten bei 200°C in den ofen. der klassiker ist die quiche loraine: gleiches rezept wie oben und als belag nur ausgelassene speckwürfel (150g). hier empfiehlt es sich in teig und schlagobers mit salz zu sparen, da der speck recht viel mitbringt. guten appetit No related posts.

]]>
Wed, 07 Dec 2011 13:12:00 +0000 http://lifestream.flo.cx/items/view/3428
ipod nano IV… http://lifestream.flo.cx/items/view/3420

6 jahre nachdem ich meinen ipod bekommen habe durfte ich ihn gestern an apple zurückschicken. sie haben 6 jahre nach dem herausbringen herausgefunden dass es sein kann dass die akkus zu warm werden können (sprich: explodieren könnten). da man nach der zeit sowieso nicht mehr von einem brauchbaren akku reden kann hab’ ich mich entschlossen meinen ipod zurückzuschicken. fotos des abschieds unten: Rücksende Formalitäten Anleitung zum Zurückschicken Playlists Rückseite ich hoffe der neue wird mir weiter ein paar jahre gute dienste leisten. einmal abwarten wie lange das braucht bis der kommt

No related posts.

]]>
Sat, 03 Dec 2011 17:27:00 +0000 http://lifestream.flo.cx/items/view/3420
wieder eine partie go… http://lifestream.flo.cx/items/view/3404

obwohl ich mit etwa 100 punkten verloren habe hat mir diese partie spass gemacht. ich hab’ wenig falsch gemacht und gegen einen 6. kyu ist das nicht so schlecht finde ich einzig zug 172 hätte wohl besser auf Q 16 sein sollen. [Embedded SGF File]

No related posts.

]]>
Wed, 30 Nov 2011 16:20:00 +0000 http://lifestream.flo.cx/items/view/3404
Video: Lisbon Airport Fake Tilt Shift… http://lifestream.flo.cx/items/view/3304

http://www.youtube.com/watch?v=wgZ0VX9C0dY

Related posts:miniature time-lapse with fake tilt shift (howto)… [video] Tilt Shift Miniature…

]]>
Sun, 06 Nov 2011 23:40:00 +0000 http://lifestream.flo.cx/items/view/3304
channel.conf ORF Sport + und ORF III… http://lifestream.flo.cx/items/view/3279

morgen startet ORF III (ORF 3) und ORF Sport + (ORF Sport Plus). da ich nirgendwo eine aktuelle channel.conf für dvb-t gefunden habe, hab’ ich sie selbst für Graz erstellt:

PULS 4:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3050:3051:10121 3SAT:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3055:3056:11302 ORF SPORT +:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3060:3061:11303 ServusTV:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3064:3065:11304 ORF III:490000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:3070:3071:11305 ORF1:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5010:5011:10101 ORF2 St:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5020:5021:10112 ATV:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5040:5041:10120 ORF2 B:514000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_AUTO:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:5020:5021:10132 WKK:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1101:1102:1 Steiermark 1:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1201:1202:2 Soundportal:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:1401:1402:4 Radio West:538000000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_1_2:QAM_16:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_4:HIERARCHY_NONE:0:0:5

in anderen regionen österreichs wird diese klarerweise variieren. mit einem USB dvb-t empfänger und linux startet man den VLC so:

vlc channel.conf

viel spass.

No related posts.

]]>
Tue, 25 Oct 2011 10:57:00 +0000 http://lifestream.flo.cx/items/view/3279
RFID Door Opener… http://lifestream.flo.cx/items/view/3277

http://www.youtube.com/watch?v=j9NV7lZxK08 recently i finished my latest project: a RFID Door Opener. besides the fun while hacking it, it improves the security of the door. since it’s not an outside door but the door to the garage, it’s construction does not allow to mount a more secure lock. so locking it from the outside when leaving is a bit bothersome. the new auto-lock feature, which allows the door to auto-lock itself, saves some time and works around the lazy user, who wouldn’t have locked it. additionally it is now easy to add or remove the right of access by adding or deleting the RFID’s unique number from the system. revoking someone’s right of access is far more difficult with a normal key. beside an arduino i’m using an easydriver to drive the stepper and a RFID reader from seeedstudio. below you can see the schematics of the setup. the ends marked with Ard X go to a port of the arduino, which is the brain of the lock: Schematics for the build

/** * door lock application (c) 2011 Florian Klien * some code parts are borrowed from different authors thx */

include <NewSoftSerial.h>

define rxPin 2

define txPin 3

// door defs

define DOOR_SENS 3 // analog

define DRIVER_SWITCH 6

define DOOR_SW 2 // analog

// motor defs

define DIR_PIN 7

define STEP_PIN 8

define ledIN 5

define ledOUT 11

NewSoftSerial rfid = NewSoftSerial( rxPin, txPin );

// The tag database consists of two parts. The first part is an array of // tag values with each tag taking up 5 bytes. The second is a list of // names with one name for each tag (ie: group of 5 bytes). char* allowedTags[] = { "AABBCCDDEE", // Tag 1 "AABBCCDDEE", // Tag 2 };

// List of names to associate with the matching tag IDs char* tagName[] = { "User1", // Tag 1 "User2", // Tag 2 };

// software version number: char* software_version = "1.1";

// Check the number of tags defined int numberOfTags = sizeof(allowedTags)/sizeof(allowedTags[0]);

int incomingByte = 0; // To store incoming serial data

boolean locked = true; int door_open = 0; // pseudo digital boolean prev_status = false; boolean auto_lock = true; //unsigned long auto_lock_time = 0; int auto_lock_delay = 5; // in seconds int auto_lock_switch_time = 2; // in seconds int status_led = 0; unsigned long status_led_time = millis(); boolean status_led_on = false;

unsigned long status_breathe_time = millis(); int breathe_delay = 10; boolean breathe_up = true; int breathe_i = 15;

unsigned long last_successful_rfid_read = 0; int rfid_success_timeout = 5000; // millis

float lock_speed = 1;

/** * Setup */ unsigned long time_door = millis(); unsigned long time_switch = millis(); long debounce = 500;

void setup() { pinMode(ledIN, OUTPUT); pinMode(ledOUT, OUTPUT); digitalWrite(ledIN, HIGH); digitalWrite(ledOUT, HIGH); delay(300); digitalWrite(ledIN, LOW); digitalWrite(ledOUT, LOW);

pinMode(DRIVER_SWITCH, OUTPUT); digitalWrite(DRIVER_SWITCH, LOW); pinMode(DIR_PIN, OUTPUT); digitalWrite(DIR_PIN, LOW); pinMode(STEP_PIN, OUTPUT); digitalWrite(STEP_PIN, LOW); pinMode(DOOR_SENS,INPUT); pinMode(DOOR_SW,INPUT);

Serial.begin(9600); // Serial port for connection to host rfid.begin(9600); // Serial port for connection to RFID module

Serial.println("RFID reader starting up"); delay(1000); Serial.println("done"); Serial.print("Software Version no: "); Serial.println(software_version); Serial.print("door locked: "); Serial.print(locked, DEC); Serial.print("\n"); Serial.print("door closed: "); Serial.print(!door_open, DEC); Serial.print("\n"); }

/** * Loop * non-blocking version of each function! */ void loop() { readRFID(); doorSensor(); doorSwitch(); statusLed(); }

void doorSensor(){ // pseudo digital door_open = analogRead(DOOR_SENS); if(millis() - time_door > debounce){ if (door_open <= 500 && prev_status == false){ Serial.println("Door: opened"); prev_status = true; locked = false; }else if(door_open > 500 && prev_status == true){ Serial.println("Door: closed"); prev_status = false; if(auto_lock){ Serial.println("locking door automatically..."); delay(auto_lock_delay*1000); lock(); locked = true; } } time_door = millis(); } }

void doorSwitch(){ int dstimer = 0; int door_switch = analogRead(DOOR_SW); // pseudo digital if(millis() - time_switch > debounce && door_switch >= 300){ while (analogRead(DOOR_SW) >= 300) { delay(100); dstimer++; } Serial.println(door_switch,DEC); Serial.println(dstimer,DEC); if (dstimer < auto_lock_switch_time*10) { //button has been pressed less than 2 seconds = 1000/100 if (locked == false){ Serial.println("door locked"); locked = true; lock(); }else if(locked == true){ Serial.println("door unlocked"); locked = false; unlock(); } }else { // auto_unlock off/on if(auto_lock == true){ Serial.println("auto_lock off"); auto_lock = false; }else{ Serial.println("auto_lock on"); auto_lock = true; } analogWrite(ledIN, 0); // resetting output

}
time_switch = millis();

} }

// breathing status led on the inside void statusBreathe(){ if( (status_breathe_time + breathe_delay) < millis() ){ analogWrite(ledIN, breathe_i/1.5); status_breathe_time = millis(); if (breathe_up == true){ if (breathe_i > 150) { breathe_delay = 4; } if ((breathe_i > 125) && (breathe_i < 151)) { breathe_delay = 5; } if (( breathe_i > 100) && (breathe_i < 126)) { breathe_delay = 7; } if (( breathe_i > 75) && (breathe_i < 101)) { breathe_delay = 10; } if (( breathe_i > 50) && (breathe_i < 76)) { breathe_delay = 14; } if (( breathe_i > 25) && (breathe_i < 51)) { breathe_delay = 18; } if (( breathe_i > 1) && (breathe_i < 26)) { breathe_delay = 19; } breathe_i += 1; if( breathe_i >= 255 ){ breathe_up = false; } }else{ if (breathe_i > 150) { breathe_delay = 4; } if ((breathe_i > 125) && (breathe_i < 151)) { breathe_delay = 5; } if (( breathe_i > 100) && (breathe_i < 126)) { breathe_delay = 7; } if (( breathe_i > 75) && (breathe_i < 101)) { breathe_delay = 10; } if (( breathe_i > 50) && (breathe_i < 76)) { breathe_delay = 14; } if (( breathe_i > 25) && (breathe_i < 51)) { breathe_delay = 18; } if (( breathe_i > 1) && (breathe_i < 26)) { breathe_delay = 19; } breathe_i -= 1; if( breathe_i <= 15 ){ breathe_up = true; breathe_delay = 970/2; } } } }

void statusLed(){ if(auto_lock == false){ status_led = 150; }else{ // set this to > 0 if you want the status led to blink in default mode status_led = 0; if(status_led == 0){ statusBreathe(); } } if(millis() - status_led_time >= status_led && status_led != 0){ status_led_on = !status_led_on; digitalWrite(ledIN,status_led_on); status_led_time = millis(); } }

void readRFID(){ byte i = 0; byte val = 0; byte checksum = 0; byte bytesRead = 0; byte tempByte = 0; byte tagBytes[6]; // "Unique" tags are only 5 bytes but we need an extra byte for the checksum char tagValue[10];

if(rfid.available()>0){ if((val = rfid.read()) == 2) { // Check for header bytesRead = 0; while (bytesRead < 12) { // Read 10 digit code + 2 digit checksum val = rfid.read(); Serial.print(val,BYTE); // Append the first 10 bytes (0 to 9) to the raw tag value if (bytesRead < 10) { tagValue[bytesRead] = val; }

  // Check if this is a header or stop byte before the 10 digit reading is complete
  if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) {
    break;                          // Stop reading
  }

  // Ascii/Hex conversion:
  if ((val &gt;= '0') &amp;&amp; (val &lt;= '9')) {
    val = val - '0';
  }
  else if ((val &gt;= 'A') &amp;&amp; (val &lt;= 'F')) {
    val = 10 + val - 'A';
  }

  // Every two hex-digits, add a byte to the code:
  if (bytesRead &amp; 1 == 1) {
    // Make space for this hex-digit by shifting the previous digit 4 bits to the left
    tagBytes[bytesRead &gt;&gt; 1] = (val | (tempByte &lt;&lt; 4));

    if (bytesRead &gt;&gt; 1 == 5) {                // If we're at the checksum byte,
      checksum ^= tagBytes[bytesRead &gt;&gt; 1];   // Calculate the checksum... (XOR)
    };
  } else {
    tempByte = val;                           // Store the first hex digit first
  };

  bytesRead++;                                // Ready to read next digit
}

// Send the result to the host connected via USB
if (bytesRead == 12) {                        // 12 digit read is complete
  tagValue[10] = '&#92;&#48;';                        // Null-terminate the string

  Serial.print(&quot;Tag read: &quot;);
  for (i=0; i&lt;5; i++) {
    // Add a leading 0 to pad out values below 16
    if (tagBytes[i] &lt; 16) {
      Serial.print(&quot;0&quot;);
    }
    Serial.print(tagBytes[i], HEX);
  }
  Serial.println();

  Serial.print(&quot;Checksum: &quot;);
  Serial.print(tagBytes[5], HEX);
  Serial.println(tagBytes[5] == checksum ? &quot; -- passed.&quot; : &quot; -- error.&quot;);

  // Show the raw tag value
  //Serial.print(&quot;VALUE: &quot;);
  //Serial.println(tagValue);
  Serial.print(&quot;door_open: &quot;);
  Serial.println(door_open,DEC);
  // Search the tag database for this particular tag
  int tagId = findTag( tagValue );

  // Only fire the strike plate if this tag was found in the database
  if( tagId &gt; 0 )
  {
    Serial.print(&quot;Authorized tag ID &quot;);
    Serial.print(tagId);
    if(door_open &gt; 500 &amp;&amp; (last_successful_rfid_read + rfid_success_timeout) &lt; millis() ){
      Serial.print(&quot;: unlocking for &quot;);
      Serial.println(tagName[tagId - 1]);   // Get the name for this tag from the database
      unlock();
      last_successful_rfid_read = millis();
      delay(2000);
    }
  } else {
    Serial.println(&quot;Tag not authorized&quot;);
    //failSound();
    for (int i=0;i&lt;7;i++){ // FIXXME nonblocking version?
      digitalWrite(ledOUT, HIGH);
      digitalWrite(ledIN, HIGH);
      delay(100);
      digitalWrite(ledOUT, LOW);
      digitalWrite(ledIN, LOW);
      delay(80);
    }
  }
  Serial.println();     // Blank separator line in output
}

bytesRead = 0;

} } }

/** * Fire the relay to activate the strike plate for the configured * number of seconds. */ void unlock() { digitalWrite(ledOUT, HIGH); digitalWrite(ledIN, HIGH); delay(100); // if your stepper is powerful enough you can use full speed rotateDeg(-800, 0.6); digitalWrite(ledIN, LOW); digitalWrite(ledOUT, LOW); locked = false; }

void lock(){ digitalWrite(ledOUT, HIGH); digitalWrite(ledIN, HIGH); delay(100); rotateDeg(800, 1); digitalWrite(ledIN, LOW); digitalWrite(ledOUT, LOW); locked = true; }

void rotate(int steps, float speed){

// power driver digitalWrite(DRIVER_SWITCH,HIGH); delay(200); //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement) //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger int dir = (steps > 0)? HIGH:LOW; steps = abs(steps);

digitalWrite(DIR_PIN,dir);

float usDelay = (1/speed) * 250;

for(int i=0; i < steps; i++){ digitalWrite(STEP_PIN, HIGH); delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);

}

// unpower driver delay(200); digitalWrite(DRIVER_SWITCH,LOW); }

void rotateDeg(float deg, float speed){ // power driver digitalWrite(DRIVER_SWITCH,HIGH); delay(200); //rotate a specific number of degrees (negative for reverse movement) //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger int dir = (deg > 0)? HIGH:LOW; digitalWrite(DIR_PIN,dir);

int steps = abs(deg)*(1/0.225); float usDelay = (1/speed) * 250;

for(int i=0; i < steps; i++){ digitalWrite(STEP_PIN, HIGH); delayMicroseconds(usDelay);

digitalWrite(STEP_PIN, LOW);
delayMicroseconds(usDelay);

} // unpower driver delay(200); digitalWrite(DRIVER_SWITCH,LOW); }

/** * Search for a specific tag in the database */ int findTag( char tagValue[10] ) { for (int thisCard = 0; thisCard < numberOfTags; thisCard++) { // Check if the tag value matches this row in the tag database if(strcmp(tagValue, allowedTags[thisCard]) == 0) { // The row in the database starts at 0, so add 1 to the result so // that the card ID starts from 1 instead (0 represents "no match") return(thisCard + 1); } } // If we don't find the tag return a tag ID of 0 to show there was no match return(0); }

Related posts:Non-blocking breathing led for arduino… pin garage door opener… DIY time-lapse timer…

]]>
Sat, 22 Oct 2011 15:25:00 +0000 http://lifestream.flo.cx/items/view/3277
Non-blocking breathing led for arduino… http://lifestream.flo.cx/items/view/3275

i needed a version of the ‘breathing led’ for a project which would not block everything else. button presses and the actual application should run without delay. after all it would just be cosmetics
the result looks like this:

http://www.youtube.com/watch?v=TjzFo63svmM here is my non-blocking code for a breathing led with arduino:

/* "Breathing non-blocking sleep LED." Florian Klien 2011 blog.flo.cx based on work from Jeremy Saglimbeni (thecustomgeek.com) */

define LED 5 // any PWM led will do

unsigned long status_breathe_time = millis(); int breathe_delay = 10; boolean breathe_up = true; int breathe_i = 15;

void setup() { // bring the LED up nicely from being off for(i = 0 ; i <= 15; i+=1) { analogWrite(11, i); delay(5); } }

void loop() { nonBlockingBreathe(); otherImportantNonBlockingStuff(); }

void nonBlockingBreathe(){ if( (status_breathe_time + breathe_delay) < millis() ){ analogWrite(LED, breathe_i); status_breathe_time = millis(); if (breathe_up == true){ if (breathe_i > 150) { breathe_delay = 4; } if ((breathe_i > 125) && (breathe_i < 151)) { breathe_delay = 5; } if (( breathe_i > 100) && (breathe_i < 126)) { breathe_delay = 7; } if (( breathe_i > 75) && (breathe_i < 101)) { breathe_delay = 10; } if (( breathe_i > 50) && (breathe_i < 76)) { breathe_delay = 14; } if (( breathe_i > 25) && (breathe_i < 51)) { breathe_delay = 18; } if (( breathe_i > 1) && (breathe_i < 26)) { breathe_delay = 19; } breathe_i += 1; if( breathe_i >= 255 ){ breathe_up = false; } }else{ if (breathe_i > 150) { breathe_delay = 4; } if ((breathe_i > 125) && (breathe_i < 151)) { breathe_delay = 5; } if (( breathe_i > 100) && (breathe_i < 126)) { breathe_delay = 7; } if (( breathe_i > 75) && (breathe_i < 101)) { breathe_delay = 10; } if (( breathe_i > 50) && (breathe_i < 76)) { breathe_delay = 14; } if (( breathe_i > 25) && (breathe_i < 51)) { breathe_delay = 18; } if (( breathe_i > 1) && (breathe_i < 26)) { breathe_delay = 19; } breathe_i -= 1; if( breathe_i <= 15 ){ breathe_up = true; breathe_delay = 970; } } } }

original code came from thecustomgeek.com

Related posts:DIY time-lapse timer…

]]>
Wed, 19 Oct 2011 21:49:00 +0000 http://lifestream.flo.cx/items/view/3275
how to catch 336 twitter bots in 12 hours… http://lifestream.flo.cx/items/view/2945

yesterday our API (the API of qr.cx) returned rubbish for about 12 hours. i apologize for that, this will not happen again. we are working on a reimplementation which should be far more reliable. however the thing had an upside. we were able to expose twitter bots who published this rubbish without checking. in total we found 336 twitter bots who did so. they included Notice: Undefined variable: [...] in /[...]/qr.cx/htdocs/api/index.php[...]" in their tweets. a human being would not do that. firstly the API is made for automated use, so why would one use that on a regular basis; secondly the error is apparent to a human user. one would not publish a tweet with the full nonsense. the bots did. so now we can search twitter for this perfidious string and see which account is a bot. this is good, this could help twitter™ to identify malicious users/bots and protect their normal human users.

but it also helps us, the urlshortener, to safeguard the system. we can identify spam links. we can search the twitter bot’s stream for links it has shortened before. those links are most likely links to spam or fraudulent pages. disabling those would be no harm. i’m looking forward to implementing these security features. it will definitely require a little more thinking to setup a nice safe system.

Related posts:Twitter vs. RSS…

]]>
Sat, 09 Jul 2011 08:27:00 +0000 http://lifestream.flo.cx/items/view/2945
Air Power 11… http://lifestream.flo.cx/items/view/2922

this saturday we went to see the “Air Power 11“. apparently the biggest air show in europe, and it really was huge. it started on friday, with about 140.000 people. on saturday there were about 160.000. let’s just say: it was really crowded! i did take some photos:

the full selection can be found in my picasa album.

Related posts:nook power adapter sugrufied…

]]>
Sun, 03 Jul 2011 14:33:00 +0000 http://lifestream.flo.cx/items/view/2922
Big Bang Theory Relationship Diagram… http://lifestream.flo.cx/items/view/2893

not 10 days ago meisterluk posted a graph of relationship data he collected wathing The Big Bang Theory . i was not quite happy with his visualization. so i redid it, here it is: Big Bang Theory Relationship Diagram i hope it is self explanatory. in case it is not, here is how it works: the series starts in the center of the circle. each season has a ring around the center (season 4 on the outside). in case of a relationship (relationship, sex) between characters there is a line for each character which corresponds in color between the characters. e.g. Shelodon and Amy have a long relationship in season 4. the shortest lines are relations that only occur in one episode. double colored lines show a dual relation for that character. let me know what you think in the comments.

No related posts.

]]>
Mon, 27 Jun 2011 08:29:00 +0000 http://lifestream.flo.cx/items/view/2893
UPC schläft in der witzkiste… http://lifestream.flo.cx/items/view/2874

es muss leider wirklich von schlafen die rede sein. so wenig wie sich da tut, die können nur schlafen. wir haben seit langem einen internetanschluss bei inode, einer UPC tochter. der grund zum wechsel von der telekom war die möglichkeit 2 telefonleitungen (telefon, fax) auf einen anschluss zu nehmen und mittels durchwahl auch das faxgerät getrennt vom telefon zu erreichen. das paket das wir genommen haben hatte satte 20 mbit down und etwa 2 mbit upstream. nur dass die leitung von anfang an diese leistung nicht bringen konnte. angeblich liegt zwischen ein und zwei (die angaben sind widersprüchlich) kilometer kupfer zwischen uns und dem nächsten schaltkasten oder dem wählamt an dem das verstärkt wird. wie dem auch sei; seit anfang an haben wir nur 6 der 20 (30%) der leistungsbandbreite. es wurde uns zwar vorgeschlagen auf ein günstigers paket umzusteigen (kleinere bandbreite), da wären aber nicht die gleichen telefoniepreise ins festnetz vorhanden gewesen. naja. das war vor knapp fünf jahren, im oktober/november 2006. seither lief unsere leitung ganz passabel. vor einem jahr fing es an dass das netz mitunter seeeeeehr langsam wurde und ein neustart des modems das problem wieder kurzzeitig gelöst hat. vor 3 monaten war es dann soweit dass das alle 48 stunden immer schlimmer wurde. es waren die paketverluste auf bis zu 33% angewachsen. ein anruf bei der hotline hat das bestätigt und wir haben das modem getauscht. bis dahin alles ok. ich habe das modem selbst im UPC shop in graz abgeholt, da der postweg etwa 5 tage länger gedauert hätte, dabei liess ich mir auch gleich die zugangsdaten zur konfiguration nochmal ausdrucken. nach dem aufbau des neuen modems fand ich nun aber keine logindaten für unsere zweite telefonnummer – die faxnummer. die gabs nicht mehr. ein anruf bei der hotline hat das bestätigt. die nummer sieht er nicht – und er kann sie auch nicht mehr hinzufügen. na ganz toll. alles was wir machen könnten wäre eine email an die UPC zentrale in wien zu schreiben und uns dort zu beschweren. das haben wir noch nicht getan. das ist meiner meinung nach eine einseitige vertragsänderung! das kann sich die UPC nur erlauben weil sie die stärkeren sind und man von ihnen abhängig ist. das darf es nicht geben, sei es durch schlecht geschultes personal, die einfach anschlüsse löschen, durch schlamperei oder einfach durch vorsatz (den ich hier aber nicht unterstellen will). zu diesem ärger kommt jetzt noch eine email die uns heute erreicht hat:

Sehr geehrter Herr X!
In den letzten Jahren hat UPC seine Netzinfrastruktur laufend ausgebaut, um schnellstes Internet durch den Einsatz modernster Hard- und Software anbieten zu können. UPC stellt sich als einer der führenden Anbieter von Telekommunikationslösungen in Österreich dem Anspruch, seinen Kunden auch in Zukunft eine versorgungssichere Dienstleistung in höchster Qualität zur Verfügung zu stellen. Als Folge ersuchen wir um Verständnis, dass nun ein Internet-Service-Entgelt in Höhe von EUR 15,- pro Jahr und Vertrag mit einem Internet-Produkt eingeführt wird. Die Verrechnung erfolgt im Voraus - erstmalig ab August 2011 - und wird danach jährlich jeweils im August eingehoben. In diesem Zusammenhang freuen wir uns Ihnen abermals weitere, neue Service-Verbesserungen mitteilen zu können, welche in Kürze verfügbar sind: -- Steigerung Ihres E-Mail-Speicherplatzes von bisher 200 MB auf 500 MB pro E-Mail-Adresse -- Erhöhung Ihres Webspace von bisher 10 bzw. 30 MB auf 250 MB -- Im Herbst: erneute Steigerung Ihres E-Mail-Speicherplatzes auf riesige 5.000 MB Für allfällige Rückfragen stehen wir Ihnen gerne online unter to http://irs.cmt.upc.biz/emessageirs/servlet/XXXXXX zur Verfügung. Bitte beachten Sie Ihr Recht zur kostenlosen Vertragsbeendigung, das bis zum Inkrafttreten der Änderung (31.07.2011) schriftlich ausgeübt werden kann. Wir wünschen Ihnen weiterhin gute Unterhaltung mit Ihren UPC-Diensten. Mit freundlichen Grüßen Ihr UPC-Team Bitte antworten Sie nicht auf dieses Mail. Falls Sie Fragen zu UPC oder unseren Produkten haben, finden Sie mehr unter http://www.upc.at. Impressum Dieses Mailing ist ein Service der UPC Telekabel Wien GmbH im Auftrag aller UPC Gesellschaften in Österreich. Wolfganggasse 58-60, 1120 Wien. Firmenbuchnummer: 84116a, Handelsgericht Wien. Unternehmensgegenstand: TV-, Digital TV-, Breitband Internet- und Telefon-Dienstleistungen, in den Gebieten Wien, Graz, Klagenfurt, Wiener Neustadt, Region Baden sowie im Raum Purkersdorf und Reichenau an der Rax.

dieses mail teilt einem mit dass sie der meinung sind zu wenig geld für ihr tolles service zu bekommen. dem möchte ich widersprechen! in erster linie zahlen wir für ein internetpaket bei UPC weil wir einen anschluss haben wollen. der umstand dass ein telefon mitkommt ist nett, aber teilweise auch unpraktisch, weil es halt ‘nur’ VOIP ist und über die gleiche leitung geschliffen wird. dieser anschluss hat seit 5 jahren (!) die unveränderte bandbreite von 30% des eingekauften wertes! was soll das? und dann kommen die her und schreiben einem wie toll sie ihre infrastruktur aufbauen und erweitern? entschuldigung aber neue platten im rechenzentrum in den server zu stecken und die mailquotas raufzuschrauben ist standard. das ist keine infrastrukturverbesserung! infrastrukturverbesserung ist es neue leitungen zu legen und/oder die bandbreiten zu erhöhen. wieso gibt es in graz nur vereinzelt fiber to the home? und das nicht mal von UPC? des weiteren interessiert mich der webspace nicht den ihr bei jedem anschluss mitverschenkt. behaltet den bitte und gebt mir den anschluss um ein paar euro weniger. der zeitpunkt des einhebens der pauschale im august kann auch kein zufall sein. entweder hoffen sie auf geduldige gemüter, dank urlaubsgeld, oder auf ein simples übersehen des betrages, weil alle gerade auf urlaub sind. wenn jemand einen guten kleinen provider kennt der in graz eine brauchbare bandbreite (≥8Mbit) zusammenbringt, lasst mich das bitter per kommentar wissen. ich bin reif für einen wechsel. allerdings fürchte ich dass es UPC da wieder mangels alternativen bleiben wird.

No related posts.

]]>
Wed, 22 Jun 2011 09:47:00 +0000 http://lifestream.flo.cx/items/view/2874
Bday Pie Chart… http://lifestream.flo.cx/items/view/2843

having had my birthday recently i was curious about the channels via which people would wish me a happy birthday. so i counted. and here is the resulting pie chart – what’s better than a pie chart for a birthday wish statistic? Birthday wishes pie chart it is not surprising that facebook has the biggest piece of the pie. people seem to like facebook, i certainly have a bigger contact list than on skype plus facebook knows my birthday and people get reminded. that sums up to a high count. suprisingly for me was the second place: the telephone. it beat skype by 1.4% to the second place. it has no auto reminder and it’s the only medium that is synchronous. third place goes to skype (just text messages) with 11.9%. fourth to SMS. the last place is shared by twitter and e-mail. twitter is not that much of a surprise to me. on the other hand e-mail suprised me. a few years ago this statistic would have looked totally different without facebook, and e-mail would not be in the last place. what’s your birthday wishes statistic like?

Related posts:Twitter vs. RSS…

]]>
Fri, 10 Jun 2011 09:20:00 +0000 http://lifestream.flo.cx/items/view/2843
barcamp graz 2011… http://lifestream.flo.cx/items/view/2676

City of Dust heute war der zweite und letzte tag des barcamp graz (aka #bcg11). es war wieder ein super barcamp mit sehr interessanten vorträgen zu diversen themen: opendata, foursquare, vorratsdatenspeicherung, tagstore, visualisierungen von daten, wordpress blogging, cloud storage, photographie und auch url shorening, zu dem ich vorgetragen habe:

Url shortener – good, bad, ugly View more presentations from Florian Klien

links zum thema: qr.cx, qr.cx API, 301works.org, slideshare folien. links zum barcamp: meine fotos vom barcamp auf flickr, mehr fotos auf flickr. danke an die organisatoren vom barcamp graz! es war wieder ein super event.

No related posts.

]]>
Sun, 08 May 2011 15:07:00 +0000 http://lifestream.flo.cx/items/view/2676
HAL chromium icon II… http://lifestream.flo.cx/items/view/2645

for the last chromium icon i made HAL version. chrome and chromium got new logos. so i have an update for the HAL icon:

this time i’m providing the svg file and of course you can get the png from above.

Related posts:chromium icon hal edition… quick fix for version problems with firefox addons…

]]>
Tue, 03 May 2011 15:34:00 +0000 http://lifestream.flo.cx/items/view/2645
privatsphäre – unbekannt… http://lifestream.flo.cx/items/view/2602

apple hat es wieder mal in meinen blog geschafft geschafft! diesmal allerdings nicht im positiven sinne. wie es aussieht zeichnet apple mit dem iOS4 die positionsdaten des besitzers (oder des telefons) auf und speichert diese in einer datenbank am rechner ab. diese daten sind nicht gerade spärlich. es lassen sich deutliche bewegungsprofile erstellen und sehr schön darstellen (siehe bild). iPhone Tracking Data on a Map (quelle) golem und engadget haben hierzu schöne videos in ihren bericht eingebunden.

wieso speichert apple diese daten? werden diese beim ‘anonymen’ feedback mitgeschickt? derzeit schaut es nicht so aus als wären diese daten irgendwem zugänglich. dennoch. wenn diese daten gespeichert werden, können sie gestohlen, misbraucht und verwertet werden; und das nicht immer vom rechtmässigen eigentümer. wer immer diese daten in die hände bekommt kann alles damit tun. ich bin hier zwigespalten zwischen datenschutz und datamining. die daten aller iphone nutzer wären ein wundervoller datensatz. das muss man apple lassen: sie wissen wie man an tolle daten kommt
der artikel vom o’reilly radar ist lesenswert. wer ein iphone sein eigen nennt kann auch die software ausprobieren und nachsehen wo es sich die letzte zeit aufgehalten hat. UPDATE 110422 1910: android nutzer kamen sich schon fast benachteiligt vor; aber es stellt sich heraus google macht mit android genau das gleiche! Android Location Data (erstellt mit android-locdump viewer) aus obigem bild sieht man, dass ich in graz das linke murufer (rechts im bild) vorziehe. bei android geräten liegen die daten im folder “/data/data/com.google.android.location/files” und heissen “cache.cell” und “cache.wifi”. sie lassen sich mit einem kleinen python script von @packetlss extrahieren und verwerten. google schickt sich wlan daten (sprich BSSIDs von accesspoints mit entsprechender peilung) selbst zu und verwertet sie in einer datenbank die dann herangezogen wird um andere geräte genauer zu positionieren. ein kleines webtool von @samykamkar greift auf googles datenbank zu und hilft dabei mac adressen bestimmten koordinaten zuzuordnen. gebt dort mal die mac adresse eures eigenen wlan hotspots ein! UPDATE 110426 1220: ich habe die letzten tage die option ‘standort&sicherheit -> drahtlosnetzwerke’ abgestellt gehabt und tatsächlich. das android gerät loggt nichts mehr mit. am iphone soll das ja nicht der fall sein – stellt man dort das loggen ab, passiert es trotzdem…

No related posts.

]]>
Wed, 20 Apr 2011 20:03:00 +0000 http://lifestream.flo.cx/items/view/2602
privatsphäre – unbekannt… (update) http://lifestream.flo.cx/items/view/2582

apple hat es wieder mal in meinen blog geschafft geschafft! diesmal allerdings nicht im positiven sinne. wie es aussieht zeichnet apple mit dem iOS4 die positionsdaten des besitzers (oder des telefons) auf und speichert diese in einer datenbank am rechner ab. diese daten sind nicht gerade spärlich. es lassen sich deutliche bewegungsprofile erstellen und sehr schön darstellen (siehe bild). iPhone Tracking Data on a Map (quelle) golem und engadget haben hierzu schöne videos in ihren bericht eingebunden.

wieso speichert apple diese daten? werden diese beim ‘anonymen’ feedback mitgeschickt? derzeit schaut es nicht so aus als wären diese daten irgendwem zugänglich. dennoch. wenn diese daten gespeichert werden, können sie gestohlen, misbraucht und verwertet werden; und das nicht immer vom rechtmässigen eigentümer. wer immer diese daten in die hände bekommt kann alles damit tun. ich bin hier zwigespalten zwischen datenschutz und datamining. die daten aller iphone nutzer wären ein wundervoller datensatz. das muss man apple lassen: sie wissen wie man an tolle daten kommt
der artikel vom o’reilly radar ist lesenswert. wer ein iphone sein eigen nennt kann auch die software ausprobieren und nachsehen wo es sich die letzte zeit aufgehalten hat. UPDATE 110422 1910: android nutzer kamen sich schon fast benachteiligt vor; aber es stellt sich heraus google macht mit android genau das gleiche! Android Location Data aus obigem bild sieht man dass ich in graz das linke murufer vorziehe. bei android geräten liegen die daten im folder “/data/data/com.google.android.location/files” und heissen “cache.cell” und “cache.wifi”. sie lassen sich mit einem kleinen python script von @packetlss extrahieren und verwerten. google schickt sich wlan daten (sprich BSSIDs von accesspoints mit entsprechender peilung selbst zu und verwertet sie in einer datenbank die dann herangezogen wird um andere geräte genauer zu positionieren. ein kleines webtool von @samykamkar greift auf googles datenbank zu und hilft dabei mac adressen bestimmten koordinaten zuzuordnen. gebt dort mal die mac adresse eures eigenen wlan hotspots ein!

No related posts.

]]>
Wed, 20 Apr 2011 20:02:00 +0000 http://lifestream.flo.cx/items/view/2582