MakerLab Blog » love http://blog.makerlab.com Go on, be curious Thu, 14 Mar 2013 06:30:21 +0000 en-US hourly 1 http://wordpress.org/?v=3.9.15 @kissmehere and there! and there! and there! Kissing Booths FTW! http://blog.makerlab.com/2009/04/kissmehere_silly_a_new_twitterbot/ http://blog.makerlab.com/2009/04/kissmehere_silly_a_new_twitterbot/#comments Mon, 13 Apr 2009 22:19:32 +0000 http://blog.makerlab.com/?p=675 makerlab we were talking about dating sites a bit - commenting on how strange it was that they didn't leverage social networks. For fun today I threw a fun idea together as a test of how to make dating more social. It isn't terribly serious but perhaps amusing. I like to combine talk with praxis. Here it is:]]> Last night at makerlab we were talking about dating sites a bit – we had some fun thinking about the different ways that we could imagine designing a simple tool for twitter. We decided we wanted it to be really really simple.

Like REALLY REALLY simple. Like this:

twitter.com/kissmehere

Kinda like a kiss. Yeah, just like that. Like a kissing booth! JUST like a Kissing Booth!

kisses!

kisses!

The way this all works is that when you send a message to @kissmehere on twitter and you include the name of some people, it will send a kiss to all those people. For example:

@kissmehere go kiss @paigesaez @zephoria @soycamo @semaphoria @anselm

Kissmehere is no prude, you can kiss more than one person at the same time – or kiss only one person – it is up to you.

Kissmehere maps your kisses too!

MakerLab Kiss Map!

@kissmehere

@kissmehere

How did I build it? This is just a riff on the same twitter code I have been using before. There are a few twists. First we have some pre-amble and we have a geocoding engine – thanks MetaCarta!!!:


require 'rubygems'
require 'dm-core'
require 'twitter'
require 'net/smtp'
require 'net/http'
require 'uri'
require 'json'
require 'dm-core'

#
# passwords
#
TWITTER_USER_NAME = "kissmehere"
TWITTER_PASSWORD = ""
METACARTA_USERID = ""
METACARTA_PASSWORD = ""
METACARTA_KEY = ""

#
# a very very nice metacarta utility to brute force discover location in text
#
def geolocate(location)
  location = URI.escape(location, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
  # location = URI.escape(location)
  host = "ondemand.metacarta.com"
  path = "/webservices/GeoTagger/JSON/basic?version=1.0.0"
  path = "#{path}&doc=#{location}"
  data = {}
  begin
    req = Net::HTTP::Get.new(path)
    req.basic_auth METACARTA_USERID, METACARTA_PASSWORD
    http = Net::HTTP.start(host)
    #if response.is_a?(Net::HTTPSuccess)
      response = http.request(req)
      puts response.body
      data = JSON.parse(response.body)
    #end
  rescue Timeout::Error
    # DO SOMETHING WISER
    return 0,0
  rescue
    return 0,0
  end
  begin
    lat = data["Locations"][0]["Centroid"]["Latitude"]
    lon = data["Locations"][0]["Centroid"]["Longitude"]
    return lat,lon
  rescue
  end
  return 0,0
end

We have a simple data model as usual to track our activity… again using datamapper which is a favorite of mine.


#
# Only send out 10 tweets at a time
#
twittercap = 10

#
# Grab a database
#
DataMapper.setup(:default, {
    :adapter  => 'postgres',
    :database => "kissmehere",
    :username => '',
    :password => '',
    :host     => 'localhost'
})

#
# here is our schema
#
class Kiss
  include DataMapper::Resource
  property :id,          Integer, :serial => true
  property :provenance,  Text
  property :uuid,        Text
  property :title,       Text
  property :link,        Text
  property :description, Text
  property :screenname,  Text
  property :userid,      Text
  property :location,    Text
  property :lat,         Float
  property :lon,         Float
  property :secret,      Integer, :default => 0
  property :friended,    Integer, :default => 0
  property :kissed_at,   DateTime
  property :created_at,  DateTime
end


We have the usual twitter gem code to peek at the twitter state. I am really starting to wonder how the heck twitter even stays up with the amount of traffic it is getting… In any case mine is not to worry but to do!


#
# Remember kiss requests
#
twitter = Twitter::Base.new(TWITTER_USER_NAME, TWITTER_PASSWORD )
twitter.replies().each do |twit|
  uuid = "#{twit.id}"
  kiss = Kiss.first(:provenance => "twitter", :uuid => uuid)
  next if kiss
  secret = 0
  secret = 1 if twit.text[/ secret/] != nil
  lat = 0
  lon = 0
  if twit.user.location && twit.user.location.length > 1
    lat,lon = geolocate(twit.user.location)
  end
  kiss = Kiss.create(
             :provenance => "twitter",
             :uuid => uuid,
             :title => twit.text,
             :link => nil,
             :description => nil,
             :screenname => twit.user.screen_name,
             :userid => twit.user.id,
             :location => twit.user.location,
             :lon => lon,
             :lat => lat,
             :secret => secret
          )
  kiss.save
  puts "Saved a kiss on twitter! #{kiss.userid} #{kiss.title} #{kiss.lat} #{kiss.lon}"
end



Next we want to respond to kisses in an intelligent way; telling everybody, friending new friends and all that kind of fun stuff.


#
# Pass new kisses onwards ( only do twittercaps worth )
#
@kisses = Kiss.all(:order => [:created_at.desc],
                   :limit => twittercap,
                   :kissed_at => nil
              ).each do |kiss|

  # tease each kiss apart for multiple receivers
  kisses = kiss.title.scan(/\@\w+/)
  kisses.each do |luckyduck|
    next if luckyduck == "@kissmehere"
    if kiss.secret == 0
      kiss.link = "http://twitter.com/#{kiss.screenname}/statuses/#{kiss.uuid}"
      gossip = "#{luckyduck} got a kiss from @#{kiss.screenname} - see #{kiss.link} "
      # if kiss.lat != 0 && kiss.lon != 0
      #  gossip = " - #{gossip} near #{kiss.location}"
      # end
    else
      kiss.link = nil
      gossip = "@#{luckyduck} got a kiss from an anonymous admirer!"
    end
    kiss.description = gossip
    result = twitter.post(gossip)
    puts "Told everybody #{result} of #{gossip}"
  end
  if kisses.length == 0
    puts "No love from #{kiss.screenname}"
  end
  kiss.kissed_at = DateTime.now
  kiss.save

  # friend everybody - could improve this
  begin
    twitter.create_friendship(kiss.screenname)
  rescue
  end
  kisses.each do |luckyduck|
    begin
      #if twitter.friendship_exists(TWITTER_USER_NAME,luckyduck)
      twitter.create_friendship(luckyduck)
    rescue
    end
  end

end

Finally we write out an RSS feed for Google Maps – thanks @ajturner for the quick tip. I wasn’t able to get ruby rss maker to do anything useful such as allow me to specify custom namespaces for the geo:lat and geo:long attributes so I wrote everything by hand! By doing this we can then make a map page which has all the kisses on it just for fun. I guess I won’t show this blob because it breaks the layout engine in wordpress… I will link to the original file however at agent.txt

That’s it. Have fun out there in the twitter verse!

]]>
http://blog.makerlab.com/2009/04/kissmehere_silly_a_new_twitterbot/feed/ 2
Lazy Sundays http://blog.makerlab.com/2008/11/lazy-sundays/ http://blog.makerlab.com/2008/11/lazy-sundays/#comments Tue, 25 Nov 2008 22:49:19 +0000 http://blog.makerlab.com/?p=123 Our Sunday skill-share this week involved eating copious amounts of superlicious breadfruit, shoveling compost, doing crafty activities and talking about the implications of place and place sharing.

Greg from http://ecoroofseverywhere.com came over and we spent about an hour talking through his site – as a prelude to migrating it away from flash into ordinary html with javascript.  We ran into a horrible problem with the networking support under Windows – somehow his bios turned off the networking and we could not get the card to show up. @reidab spent about an hour on this and I spent a good 30 minutes on this as well.This marred our ability to complete the first rev of his site – he’ll return hopefully with something less sad-sauce.

As a long time Windows user, and finally making the switch to MacOSX – I know well how much the Windows OS is problematic – and in so many ways.  Windows is not built by people who care – the tool chains and solutions they offer are bad enough that it becomes increasingly difficult to actually make forward progress.  I personally reached a point where I was losing a day every day in dealing with performance and networking issues and it was a big motivator for my leap over to MacOSX.  I had shied away from the Ubuntu and FreeBSD solutions for my desktop for a variety of reasons, mostly that I figured that Windows would be “good enough”.  Now that I am on a *BSD system I realize what a mistake that was.  Metaphorically using Windows is like living in the suburbs – don’t surround yourself with people or practices that are mediocre because only mediocrity will result from it.  Perhaps we are not good at finding excellence, but we can avoid what we know is bad.

In any case then I personally took a peek at the problem with http://graffiti.org . This was brought to us as a real urgency and a real need.  The entire site is static, and hand-built.  But in need up systemic upgrades and improvements. What I’ve done is build a scraper using hpricot from why the lucky stiff which walks each page of the site – turning into a document tree and then pruning and injecting new layout details – to generate a new site.  Fun.  This worked well and I think we have a first rev of the site redesign done.

Matthew Stadler dropped by as well,
Matthew Stadler at work and play

We took shovels to the compost that the neighbor needed moved – and we talked about place.  There are resonances between us.  Matthew is extremely interested in how people perceive spaces, how we can reclaim urban space.  He hosts the http://thebackroompdx.com/thebackroom_future.php event which brings artists and designers together to talk about space – usually involving copious amounts of food.  Not quite sure how he knows so many people in fact.  Amber Case – our cyber anthropologist in residence – also has a similar fascination witih place recently; she’s asking the lazy web for a way to have geo-local rss feeds so that as you walk around the city you are subscribing to different feeds that reflect that part of the city.  I too am interested in place, and would like to find a way to build technology to solve this puzzle, and also bring in folks like Matthew to bring critical analysis to it.

Finally at 9 or so Paige Saez and Amber Case both showed back up in town after being at MIT.  Bram and I fetched them from the aeropuerto. We had to talk them down from their hyper-kinetic mental mode ( after a few days at an intense conference they were definitely at top speed ) – and we just hacked late into the night – played music and ate food.  I put on a movie in the corner ( Totoro ) and a good time was had by all.

We’ve all been doing a skillshare on Sundays for many weeks now.  It has somewhat replaced our initial focus in the year of Tuesday and Friday nights – the approach we used to build http://imagewiki.org .  While not as work focused it is more diverse. Paige has a large community of artists, anarchists and creatives who’ve been bringing their diversity to our events.  What seems to be the most fun for us hearing about problems and issues from people and then helping them solve their problems.  The crowds are diverse, and we swarm over issues, talk about them, eat food, and generally have a pretty good time.  Sometimes we do this at my house ( 4804 North Borthwick ) and sometimes at either Paige’s Gallery or Ben’s Gallery ( IGLOO and ON Gallery respectively ).

Remember to checkout cyborgcamp coming up btw!  It is looking to be full of that special Portlandia people hacking magic – a good place to get futurized!

]]>
http://blog.makerlab.com/2008/11/lazy-sundays/feed/ 0