Homepage of

Lauri Kainulainen

Projects

100 Dancers festival

interactive projection performance
Visuals developed for the Grande Finale of the 100 Dancers festival held in Copenhagen on 5th August 2011. See the video and more information on the Vimeo page

Raflost 2009 Performance

interactive performance
An interactive performance involving dancers, electronics, visuals and reactive sound environment. Displayed during the Raflost festival in Reykjavik, Iceland.

Here's a short video containing parts of the performance and other pieces at Raflost 2009

Penalti

collaborative mobile gaming
A game built for S60 phones. The goal is to race a ball through a course as fast as possible by tilting the phone. The real catch is the collaborative mode where the ball rolls from one phone to the next.



Took part in the Nokia Game Competition and won best of TaiK

Jorma the Skeleton

the curious undead


Jorma is the mascot-like skeleton representing Levykauppa Äx. In the past he has mostly been involved with film directing and production, but with Niko Knappe we decided to help him get more involved with the day to day affairs at the store.

Now he hangs around the shop following customers go about their business. Perhaps in the future he'll even share a few words with them.


Some of the technology to animate the undead: arduino, stepmotors, openFrameworks, Fit-PC.

Stand In Bot

remote controlled robotics
Stand-In-Bot was born from the desire to sleep late but not miss class.
It was fueled by the dream of being able to follow lectures while eating breakfast and sipping coffee. From this shared vision the team set out to build a rudimentary prototype in 2008.

Influenced by magnificent projects such as tweenbots, the design tries to keep things simple while taking advantage of the great features offered by the Nokia Internet tablet technology.

homepage: www.writebox.net/standinbot

The team: Niko Knappe, Gökce Taskan and me

Medialabbers made of medialabbers

image analysis and visuals
To experiment with an idea, I took all the images of members of Helsinki Medialab and created a python script that analyses them producing new versions created by using the images of other people.

for more information, see the blog posting.

Background Shuffler

desktop app
A GTK-based application that automatically changes your background for you. And it does it really well, allowing you to pick images from your F-Spot collection based on tags and ratings. If you loathe F-Spot you can just point BS to a local folder full of images.

For more info, see the original blog posting

Augmented Ping Pong

spiced up sports
The end result of a workshop at the Media Lab. We tricked a ping pong table with some sensors and a web camera accompanied by some custom computer vision code to change the soundscape of the game. Original idea was also to add visuals on top of the ball, count point and so on but we ran out of time. Anyway it was fun to play and build!

The team: Juha Salonen, Matti Luhtala and me.

Technologies used: processing, puredata, arduino, sensors

Academic

papers, articles, etc.
Making Existing Homes Smart (M.Sc thesis)

Abstract
Smart homes have been a central theme in ubiquitous computing and intelligent environments. Various research projects and adventurous companies have tried to tackle the challenge, but still smart homes are nowhere to be seen on the consumer market. So far the research has focused on new housing and laboratory prototypes instead of our current homes, and without much consideration for rented households. In my thesis I will focus on the new challenges brought by these two factors, take a look into the current state of smart home research, summarize the wishes made by potential users and write about the various themes in smart home design. I will conclude by proposing a simple design that has the potential of lifting our current homes and the homes of the future to the realm of intelligent environments.

download PDF here

Reasoning in a Smart Home

A short paper dealing with different artificial intelligence solutions around the domain of smart homes

download PDF here

Tackling Smart Home User Requirements with Agent Based Technology

A research into the suitability of agent based architectures in the building of smart home systems

download PDF here

And more...

a small assortment of older projects

gDesklets: coding, creator of main site. UI examples available here and here

Pethotel CMS: GTK + MySQL (GPL). Source

Theme I made for the Enlightenment window manager (E16).

For more smaller projects, see the blog

Blog

SHOW: ALL | BY TAG:
15.11.2011 12:55 Fetching comments

Recently it became obvious that Intgrlab, the software company we've been building since early spring, doesn't have any development work in the pipeline. Hence there is no work for me - the guy who hasn't bothered with the consulting side yet.

So I decided to start looking for new stuff! There's loads of interesting opportunities out there. For this I've finally sat down and updated this site (less clutter, contact section) to use as a portfolio and updated my CV to match my current skills. Check 'em out! Also if you happen to know anybody who needs a hardcore dev / designer.. drop me a line!


19.02.2011 18:30 Fetching comments

Why on earth would you want to do that? My reason was that I needed to draw SVG in Processing.js. So I took a simple flat SVG with filled polygons and converted it to JSON, which then is drawn by PJS. Here's the Python JSON extraction snippet.


#!/usr/bin/python
''' 
    Convert a simple svg to a bunch of javascript
    arrays that can be drawn in code
    stdout get the json
    stderr print some information helpful in the js code
    
    @author Lauri Kainulainen - lauri.sokkelo.net
'''

import sys
from xml.dom import minidom
import simplejson

if len(sys.argv) < 2:
    print "usage:", __file__, "SVG_FILE"
    sys.exit(1)
d = minidom.parse(sys.argv[1])

points = []
minx, miny = 10000, 10000
maxx, maxy = 0, 0
amount_of_polys = 0
for c in d.childNodes[1].childNodes:
    if c.nodeName != '#text' and c.tagName == 'polygon':
        coords = c.attributes.get('points').value.split(" ")
        polygon_data = {}
        polygon_points = []
        for coord in coords:
            x, y = coord.split(',')
            x, y = float(x), float(y)
            minx = min(minx, x)
            miny = min(miny, y)
            maxx = max(maxx, x)
            maxy = max(maxy, y)
            polygon_points.append((x, y))
        polygon_data['points'] = polygon_points
        if c.attributes.get('fill'):
            val = c.attributes.get('fill').value
            if val.startswith('#'):
                r, g, b = int(val[1:3], 16), int(val[3:5], 16), int(val[5:], 16)
                polygon_data['fill'] = (r, g, b)
            else:
                polygon_data['fill'] = c.attributes.get('fill').value
        amount_of_polys += 1
        points.append(polygon_data)

print simplejson.dumps(points, indent=2)
sys.stderr.write('\n ~# Wicked SVG Statz: #~\n')
sys.stderr.write('  min X,Y: %s, %s\n' % (minx, miny))
sys.stderr.write('  max X,Y: %s, %s\n' % (maxx, maxy))
sys.stderr.write('  polygons: %s\n' % (amount_of_polys))
sys.stderr.write('\n')

Then you probably want it on the screen. We used the following processingjs snippet on Helsinki New Media Locomotive site for testing:



void setup()
{
    size(300,300);
    background(255);
    noLoop();
    strokeWeight(0.5);
}

void draw(){  
    var data = YOUR_OWN_DATA_ELEMENT; // make this point to your JSON structure
    for(int i = 0; i < data.length; i++) {
        var pd = data[i];
        fill(pd.fill[0], pd.fill[1], pd.fill[2]);
        beginShape();
        for(int ii = 0; ii < data[i].points.length; ii++) {
            var point = pd.points[ii];
            vertex(point[0], point[1]);
        }
        endShape(CLOSE);
    }
}

30.01.2011 18:49 Fetching comments

Finally found the effort to move this site to the web 1.5 era by implementing an atom feed generator. Also threw in Disqus commenting to be all social and hip and stuff.

Projects got a new addition with Jorma the Skeleton. A small, fun project we did with Niko for Levykauppa Äx. And believe me - this is just the beginning for silly endeavours..


18.10.2010 11:10 Fetching comments

I decided to redo my site ages ago but as design processes go, redesigning your own site is probably one of the most painful ones. I went from several layouts finally to this one (as usual the last one is the simplest) and I'm still not entirely happy.

I wanted to share all the fun projects I've been doing here at Medialab and give them more emphasis. At the same time I wanted to go to a one page layout to better support touchscreens in tablets and other mobile devices (and to stand out from the crowd a bit ;) )

I also had some processing.js animations working in the background, but disabled them for now as the html-canvas element still seems to be quite slow.

Maybe I'll still clear out some visual noise and include some simple graphics, but for now I'll leave it as it is.


07.06.2010 08:57 Fetching comments

The need to code "something completely different" made me do Background Shuffler - a beautiful background changer for Gnome. I wanted to extend the UNIX philosophy to desktop applications so Background Shuffler only changes your background. It does not make coffee.

So I spent a few days hacking and with the help of great tools and libraries like Quickly and appindicator I managed to build this nifty little program that I'm using all the time now.

Features:

  • handle all through the indicator icon. No mysterious script running in the background, retain complete control over your desktop at all times
  • make the backgrounds change as quickly or slowly as you like
  • integrates with F-Spot, so search for certain tags or ratings
  • optionally specify a folder that will be searched with photos

But I guess screenshots explain a thousand words.


It runs in your indicator area! A more ubuntu-dark-stylish icon should added at some point.
It runs in your indicator area! A more ubuntu-dark-stylish icon should added at some point.

Preferences sum up the core of the application
Preferences sum up the core of the application

You'll probably be best running Ubuntu Lucid (10.04). To install the app just download the deb or add the ppa to your sources at: https://edge.launchpad.net/~luopio/+archive/ppa

Bugs, suggestions and patches welcome! Email at lauri(dot)kainulainen(at) gmail.com


Older posts ->

Contact

Lauri Kainulainen
Currently living in Helsinki, Finland
lauri.kainulainen@gmail.com
+358 40 722 5101

Download my CV
LinkedIn profile