cache_dir != '') { $cache_file = $this->cache_dir.'/rsscache_'.md5($rss_url); $timedif = @ (time() - filemtime($cache_file)); if ($timedif < $this->cache_time) { // cached file is fresh enough, return cached array $result = unserialize(join('', file($cache_file))); // set 'cached' to 1 only if cached file is correct if ($result) $result['cached'] = 1; } else { // cached file is too old, create new $result = $this->Parse($rss_url); $serialized = serialize($result); if ($f = @ fopen($cache_file, 'w')) { fwrite($f, $serialized, strlen($serialized)); fclose($f); } if ($result) $result['cached'] = 0; } } // If CACHE DISABLED >> load and parse the file directly else { $result = $this->Parse($rss_url); if ($result) $result['cached'] = 0; } // return result return $result; } // ------------------------------------------------------------------- // Modification of preg_match(); return trimed field with index 1 // from 'classic' preg_match() array output // ------------------------------------------------------------------- function my_preg_match($pattern, $subject) { // start regullar expression preg_match($pattern, $subject, $out); // if there is some result... process it and return it if (isset ($out[1])) { // Process CDATA (if present) if ($this->CDATA == 'content') { // Get CDATA content (without CDATA tag) $out[1] = strtr($out[1], array (' '', ']]>' => '')); } elseif ($this->CDATA == 'strip') { // Strip CDATA $out[1] = strtr($out[1], array (' '', ']]>' => '')); } // If code page is set convert character encoding to required if ($this->cp != '') //$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]); $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]); // Return result return trim($out[1]); } else { // if there is NO result, return empty string return ''; } } // ------------------------------------------------------------------- // Replace HTML entities &something; by real characters // ------------------------------------------------------------------- function unhtmlentities($string) { // Get HTML entities table $trans_tbl = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES); // Flip keys<==>values $trans_tbl = array_flip($trans_tbl); // Add support for ' entity (missing in HTML_ENTITIES) $trans_tbl += array (''' => "'"); // Replace entities by values return strtr($string, $trans_tbl); } // ------------------------------------------------------------------- // Parse() is private method used by Get() to load and parse RSS file. // Don't use Parse() in your scripts - use Get($rss_file) instead. // ------------------------------------------------------------------- function Parse($rss_url) { // Open and load RSS file $urlParts = parse_url($rss_url); $host = $urlParts['host']; $uri = $urlParts['path']; if (strcmp($urlParts['query'], '') != 0) { $uri .= '?'.$urlParts['query']; } if (strcmp($urlParts['fragment'], '') != 0) { $fragment = $urlParts['fragment']; $fragment = substr($fragment, 4, strlen($fragment) - 3); $uri = $uri.$fragment; } if ($f = fsockopen($host, 80, $errno, $errstr, $this->connection_time)) { $rss_content = ''; fputs($f, "GET $uri HTTP/1.0\r\nHost: $host\r\n\r\n"); while (!feof($f)) { $rss_content .= fgets($f, 512); } fclose($f); // Parse document encoding $result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content); // if document codepage is specified, use it if ($result['encoding'] != '') { $this->rsscp = $result['encoding']; } // This is used in my_preg_match() // otherwise use the default codepage else { $this->rsscp = $this->default_cp; } // This is used in my_preg_match() // Parse CHANNEL info preg_match("'(.*?)'si", $rss_content, $out_channel); foreach($this->channeltags as $channeltag) { $temp = $this->my_preg_match("'<$channeltag.*?>(.*?)'si", $out_channel[1]); if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty } // If date_format is specified and lastBuildDate is valid if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !== -1) { // convert lastBuildDate to specified date format $result['lastBuildDate'] = date($this->date_format, $timestamp); } // Parse TEXTINPUT info preg_match("']*[^/])>(.*?)'si", $rss_content, $out_textinfo); // This a little strange regexp means: // Look for tag with or without any attributes, but skip truncated version (it's not beggining tag) if (isset ($out_textinfo[2])) { foreach ($this->textinputtags as $textinputtag) { $temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)'si", $out_textinfo[2]); if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty } } // Parse IMAGE info preg_match("']*>(.*?)'si", $rss_content, $out_imageinfo); if (isset ($out_imageinfo[1])) { foreach ($this->imagetags as $imagetag) { $temp = $this->my_preg_match("'<$imagetag.*?>(.*?)'si", $out_imageinfo[1]); if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty } } // Parse ITEMS preg_match_all("'(.*?)'si", $rss_content, $items); $rss_items = $items[2]; $i = 0; $result['items'] = array (); // create array even if there are no items foreach ($rss_items as $rss_item) { // If number of items is lower then limit: Parse one item if ($i < $this->items_limit || $this->items_limit == 0) { foreach ($this->itemtags as $itemtag) { $temp = $this->my_preg_match("'<$itemtag.*?>(.*?)'si", $rss_item); if ($temp != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty } // Strip HTML tags and other bullshit from DESCRIPTION if ($this->stripHTML && $result['items'][$i]['description']) $result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description']))); // Strip HTML tags and other bullshit from TITLE if ($this->stripHTML && $result['items'][$i]['title']) $result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title']))); // If date_format is specified and pubDate is valid if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !== -1) { // convert pubDate to specified date format $result['items'][$i]['pubDate'] = date($this->date_format, $timestamp); } // Item counter $i ++; } } $result['items_count'] = $i; return $result; } else { return False; //die("Network error: $errstr ($errno)"); } } } ?> blog:ludens » Blog Archive » Fablab workshop March 27th


Fablab workshop March 27th

~ studio:ludens @ April 1st, 2009

Last Friday we held a workshop at Little Mountain for design students and professionals in Eindhoven. Our goal was to explore the possibilities of the Fablab concept for designers. Results for this day included three (mostly) working prototypes and a lot of inspiration on what a Fablab should be, Eindhoven Style. Read on for an account of the day, with lots of pictures.

The day started at around 9.00 with a welcome from Alexander and an explanation of the day. We would design and make three products during this day.


First stage was the brainstorm. We did it in the form of a group discussion, so everybody could participate and share their ideas together. This helped to get people into the mindset for a crazy day of speed-designing. There was some skepticism amongst the participants, especially about the technology aspects of the design brief (‘I have never used electronics before in my life, how can I ever make it work in one day??’). This faded away fast however when people got excited about the results of the brainstorm.

fablab_workshop_2_studio_ludens-2Next step involved the selection of concepts. We let everybody rate their three favourite ideas and made three groups, each group in charge of working out one of the popular ideas.


Just before lunch the groups were given the chance to finalize their design and make a plan on their approach. While everybody was filling their stomachs with food goodness, ideas on the use of electronics, lasercutting and presentation were thrown around.


After lunch things really started to speed up. While one team was working on lasercut wings for their design, the other was making a press-fit box as a container, while other people were going out for visual inspiration. Wires were soldered, holes were drilled, constructions were conceived, visuals were drawn, materials were combined, machines were abused and results started to show.


At 5pm we reached the presentation deadline and while everybody was still fixing up their soldering, making last-minute changes to their presentation and trying to get that nifty program to work we set up the presentation area.fablab_workshop_2_studio_ludens-10fablab_workshop_2_studio_ludens-11

All three groups had worked their asses off to give us three amazing concepts.


First, there was the group of Jens Dyvik, Kristina Jervell-Pettersen and Richard Beumer, who designed a ludic flying USB-stick, the ‘FlyingStick’. With no prior knowledge with programming, they still managed to build a working prototype with flapping wings that would eject itself from the USB-port when you were getting too caught up in your work (showing you that it is amazing to be free from your computer after a while…). Construction, working mechanics and creative use of the laser engraving made it a very eclectic design.


Second to present was team ‘Curious Cup’ — Bastiaan Ekeler, Peter Hermans and Luuk van den Broek — who presented a nifty system where objects record ‘memories of their usage’. The system tracks cups around the office and home and gives all people visual feedback on their usage of the cups. In that way, they want to raise awareness of the social interactions in a space that happen through the use of products. Eventually they presented a working system where a cup holder can record the different people that have been using the cup and put visuals of that on the screen.fablab_workshop_2_studio_ludens-14Last but not least team ‘eyeJuice’ — Yves Florack, Ovilier van Herpt, Rik Runge and Sander Wassink — who presented their product, after trying frantically to get their colorful mesh of wires and sensors to work. Their concept was simple and elegant: a physical version of the eyedropper used in Photoshop to ‘suck up’ colours from your surroundings.  You can take the eyeJuice with you and when you see a nice color you can record it for later use in your favourite design application. Getting the electronics to work proved to be harder than expected, but the team made up for it with a very convincing presentation.


After a hard day of inspiring design work a cold beer tastes delicious and everybody had time to reflect on their effort. The participants and the organizers were unanimously positive and everybody is already looking forward to the workshops to come!

More updates, including the presentations, soon…

We would like to thank the sponsors of this workshop for their contribution:

Trotec, for lending us a lasercutter (and Deonet for providing it!),

Kubra, for supplying us with materials,

EZ-tronics, for supplying us with electronics,

and last but not least Little Mountain, for providing us the space to do the workshop.

Bookmark and Share

One Response to “Fablab workshop March 27th”

[...] free to read the in-depth review (with many pictures!) of the whole day at woensdag, april 1st, 2009 [...]

feel like responding?

* = required