ARDevMob

The Augmented Reality Developer's Advocate

RWW Summit @ The Computer History Museum

Photo

ReadWriteWeb Mobile Summit: May 7, 2010, Mountain View, CA

To me, The ReadWriteWeb is TechCrunch without the sellout PR. Those are strong words but I believe The ReadWriteWeb to be the essential journal of our industry and RWW writers are the authentic journalists of our time. They have a mobile un-conference coming up. If I were in town I would be there the whole time. It's at the Computer History Museum in Mountain View. They sent me a message inviting my groups and a discount code to share with you. If you are involved in mobile, this event will give you the perspectives and connections to reinforce your position in the field in ways that other "un-conferences" could only aspire to. Go if you can. 

Info and Promo Code below,

SidGabriel

-----------------------------

The ReadWriteWeb Mobile Summit is literally days away!  This is a one-of-a-kind opportunity to meet, discuss and debate face-to-face the future of mobile with some fantastic individuals from Google, UrbanAirship, MIT/Stanford Venture Lab, Nokia and more! 

Richard MacManus, founder and editor of ReadWriteWeb, is giving a special keynote to kick-off the day. Expect some special prizes from Call-Fire during this session.  Alcatel-Lucent will also be giving away six free iPads to attendees. And don't forget our speed-geeking session where companies like your's demonstrate their products.  If you have something you would like to demo in the speed geeking format, let us know.

Don't miss out.  We are expecting a full house! 

As a friend of TMI/SidGabriel and in partnership with ReadWriteWeb, please use this link to register for $300 off the $595 ticket price for the next 24 HOURS ONLY :-). Total cost of entry is $295.

Save a lot by bringing five of your colleagues.  Group discounts are $995. Take advantage of the group discount by emailing summits@readwriteweb.com.

http://www.eventbee.com/view/mobilesummit/discount?code=RWWTechnologistMedia

Posted May 5, 2010 by Sid Gabriel 

Git Tips Presentation for ArDevMob

Held during the kick-off meeting, and here for popular consumption.

Shameless plug: Note the Ruby-on-Rails class discount coupon at the end, if you want to take my class at marakana.com May 17-21 in San Francisco.


Cheers,

Wolf

Git and GitHub Cheat Sheet for ArDevMob

Welcome folks. As you all know, we'll be using git and github for the ArDevMob Developer Challenge.

What does this mean for you, the developers?

You need:
1. An account on github.com.  It's free.  Just head over here and sign up free, if you don't already have one: https://github.com/signup/free
2.You will want to upload your ssh key during step #1 or right after. That way, when git talks to github, you won't need any passwords, etc.  It'll be a seamless experience.  See instructions here: https://github.com/guides/providing-your-ssh-key  This page will automatically redirect to the instructions applicable for your platform (Mac, Linux, Windows)
3. Install git on your platform: http://git-scm.com/download
4. Tell us your team name and the email address that github knows you by. See below.

Each Team in the Challenge will be issued a private repository, thanks to generous sponsoship by github.  The repository will be named after the team. And then we add the team members as collaborators. That's why we need your the email address associated with your github account.  You'll get pull and push access to that repository.  If you already have a github account, then this new repository will just show up as an additional one in your list of repositories.

All repositories are private during the competition. At the end of the competition, we'll turn them public, because we require that all code be released under an open source license. To that end, you MUST have a license.txt file in your project's root directory with the license details. Which license you choose it up to you, but it must be an open source license. We recommend the MIT license, http://www.opensource.org/licenses/mit-license.php

We'll post github URL's and Team names on this blog prior to the start of the competition.

I'll be going over the details during the kickoff event, and I'll be available for git assistance during the event.

Good git resource links:
http://www.kernel.org/pub/software/scm/git/docs/everyday.html
http://help.github.com/
http://git-scm.com/documentation

git help (from the command line)

Good luck,

Wolf

Junaio Preview For Android + Hack on it This Weekend @ARDevMob

Click here to download:
junaio_Developer.pdf (1.25 MB)
(download)

I'm excited to announce that Junaio has released a preview for Android
Developers. Get it here http://www.junaio.com/publisher/main I'm going
to download and play with it right now. *and* the Junaio platform on
Android or iPhone are admissible projects for the mobile category of
this weekend's Augmented Reality Hackathon. Funny, hack an Android to
win an iPad? Crazy. Super short free registration at
http://ardevmob.com/

Slides From Last Night

Click here to download:
Beyond Markers.pdf (2.68 MB)
(download)

Thanks for coming out. That was an awesome session. Here are my slides from the intro.

AR Beyond Markers: Wednesday @ PariSoma

1: Download Processing from http://www.processing.org/ 2: Copy the code below and paste it into a blank sketch 3: Hit Play

// SGH2010
// This is ARQanoide the AR Arkanoid Clone

/**
 * a arkanoid clone by guru
 * adjusted by SidGabriel to use a webcam and a colorful object of your choice. 
 * Sid's additions marked SGH
 */

//SGH
import processing.video.*;
// Variable for capture device
Capture video; 
// A variable for the color we are searching for.
color trackColor; 
// variables for toggles
boolean showImage;
boolean acquireColor;
boolean testColor;
// Global tracking coordinates
int wrX;
int wrY;
PFont myFont;
///sgh

int px, py;
int vx, vy;

boolean paused = true;
boolean done = true;
int[][] stones; 

void setup() {
  size(300,300);
  noCursor();
  px = width/2;
  py = height/2;

  vx = int(random( 10, 18 ));
  vy = 20;

  stones = new int[7][4];
  for( int x = 0; x < 7; x++) {
    for( int y = 0; y < 4; y++ ) {
      stones[x][y] = y + 1;
    }
  }  

  //SGH
  myFont = createFont("Arial", 18);
  textFont(myFont);
  video = new Capture(this,width,height,15);
  // Start off tracking
  trackColor = color(255,255,255);
  smooth();
  ///SGH
}

void draw() {
  //background(50);
  //SGH Get Camera Controller Info
  // Capture the video
  if (video.available()) {
    video.read();
  }
  video.loadPixels();
  image(video,0,0);
  ///SGH
  stroke(255);
  strokeWeight(2);

  // update postion of the ball 
  if (!paused) update();

  // draw all stones that are not removed yet
  // check if all are gone
  done = true;
  for( int x = 0; x < 7; x++) {
    for( int y = 0; y < 4; y++ ) {
      if ( stones[x][y] > 0 ) {
        done = false;
        // fill( 128 + 10 * stones[x][y] );
        rect( 10 + x * 40, 10 + y * 20, 40, 20 ); 
      }
    }
  }

  // no stone remaining - display yippie message
  if ( done ) {
    paused = true;
    fill(255);
    textSize( 48 );
    text( "JIPPIE!", 50, 200 );
  }

  // display text if paused
  if ( paused ) {
    textSize( 16 );
    fill(128);
    text( "pres 's' to start/stop 't' to train a controller", 10, 270 );
  }

  fill(128);
  // draw ball
  ellipse(px,py,20,20);

  // Before we begin searching, the "world record" for closest color is set to a high number that is easy for the first pixel to beat.
  float worldRecord = 1500; 

  // XY coordinate of closest color
  int closestX = 0;
  int closestY = 0;

  // Begin loop to walk through every pixel
  for (int x = 0; x < video.width; x ++ ) {
    for (int y = 0; y < video.height; y ++ ) {
      int loc = x + y*video.width;
      // What is current color
      color currentColor = video.pixels[loc];
      float r1 = red(currentColor);
      float g1 = green(currentColor);
      float b1 = blue(currentColor);
      float r2 = red(trackColor);
      float g2 = green(trackColor);
      float b2 = blue(trackColor);

      // Using euclidean distance to compare colors
      float d = dist(r1,g1,b1,r2,g2,b2); // We are using the dist( ) function to compare the current color with the color we are tracking.

      // If current color is more similar to tracked color than
      // closest color, save current location and current difference
      if (d < worldRecord) {
        worldRecord = d;
        closestX = x;
        closestY = y;
      }
    }
  }

  // We only consider the color found if its color distance is less than 10. 
  // This threshold of 10 is arbitrary and you can adjust this number depending on how accurate you require the tracking to be.
  //  if (worldRecord < 10) { 
  //    // Draw a circle at the tracked pixel
  //    fill(trackColor);
  //    strokeWeight(4.0);
  //    stroke(0);
  //    ellipse(closestX,closestY,16,16);
  //  }
  if (worldRecord < 20) { 
    // Draw a circle at the tracked pixel
    //fill(trackColor);
    //strokeWeight(4.0);
    //stroke(255);
    wrX = closestX;
    wrY = closestY;
    // draw paddle
    fill(trackColor);
    rect( closestX - 35, 270, 70, 20 );
  } 
  else {
    fill(128);
    rect( 150 - 35, 270, 70, 20 );
  }
  // ready target mode
  if(showImage) {
    set(0, height - video.height, video);
    fill(trackColor);
    stroke(trackColor);
    ellipse(mouseX,mouseY,8,8);
    textSize( 16 );
    fill(128);
    text( "'a' to acquire a color", 10, 260 );
    text( "'c' to test control color", 10, 250 );

  }
  if(acquireColor) {
    fill(trackColor);
    ellipse(closestX,closestY,16,16);
    int loc = mouseX + mouseY*video.width;
    trackColor = video.pixels[loc];
    textSize( 16 );
    fill(128);
    text( "Acqire an object by moving the mouse over it and pres 'a'", 10, 240 );
  }
  if(testColor) {
    fill(trackColor);
    ellipse(closestX,closestY,16,16);
    text( "confirm read 'c' when done", 10, 240 );
  }
}

void update() {
  // check if ball dropped out of the lower border
  if ( py + vy > height - 10 ) {
    px = width/2;
    py = height/2;
    vx = int(random( 0, 16 ));
    vy = 2;
    paused = true;
  }


  // check if the ball hits a block
  for( int x = 0; x < 7; x++) {
    for( int y = 0; y < 4; y++ ) {
      if ( stones[x][y] > 0 ) {
        if ( px + vx + 10 > 10 + x * 40 && px + vx - 10 < 10 + x * 40 + 40 &&
          py + vy + 10 > 10 + y * 20 && py + vy - 10 < 10 + y * 20 + 20 ) {
          stones[x][y] = 0;

          // change the velocity in y direction if the block has been hit 
          // on the bottom or on the top 
          if ( px + 10 > 10 + x * 40 && px - 10 < 10 + x * 40 + 40 ) vy = -vy;
          // change the velocity in the x direction if the block has been hit on the side
          if ( py + 10 > 10 + y * 20 && py - 10 < 10 + y * 20 + 20 ) vx = -vx; 
        }
      }
    }
  }

  // change the direction if the ball hits a wall
  if (px + vx  < 10 || px + vx > width - 10) {
    vx = -vx;
  }

  if (py + vy  < 10 || py + vy > height - 10) {
    vy = -vy;
  }

  // check if the paddle was hit
  if ( py + vy >= 266  && px >= wrX - 35 && px <= wrX +35 ) {
    vy = -vy;
    vx = int(map( px - wrX, -35, 35, -8, 8 ));
  }  

  // calculate new postion
  px += vx;
  py += vy;
}

void mousePressed() {
  if (done) {
    for( int x = 0; x < 7; x++) {
      for( int y = 0; y < 4; y++ ) {
        stones[x][y] = y + 1;
      }
    }
    done = false;
    px = width/2;
    py = height/2;
    vx = int(random( -8, 8 ));
    vy = -2;
  }

}
//SGH Target Mode Toggle
// t = show camera to target color
// a = acquire the color directly under the mouse + show all other pixels with the color
// c = confirm camera color tracking by tagging all pixels of the target range
// s = start or stop the game 

public void keyPressed(){
  switch (key){
  case 't': 
    showImage = !showImage; 
    break;
  case 'a': 
    acquireColor = !acquireColor; 
    break;
  case 'c': 
    testColor = !testColor; 
    break;
  case 's': 
    paused = !paused;
  }
}


// SGH2010

 

 

Original Interfaces For This Saturday's Hackathon

This is a great example of an original interface application that
would be admissible for the event this weekend. The only limits on
interface are the limits of your own range of expression. I think
updating this project is a great way to spend a weekend.

http://code.google.com/p/ideo-multitouch/

For the weekend, I'll supply 3 kits for teams that want to explore
this project or do something new with it this weekend.

Each kit has a netbook with webcam, Processing 1.1, Flash Builder 4
and a mini projector. I'm not sure what to do about the frosted glass.
I'm sure we'll figure something out.

The first step is to register at http://open.ardevmob.com

(download)

AndroidMakers Open House Tonight 7p @PariSoMa

Looks like it's going to be a fun night. I have some friends coming by
and one that I haven't seen for a few years. I'll have some rare demos
out and I'm really excited to host a free-form agenda in a social and
relaxed environment with lots of networking/talking and face time. See
you all 'round 7.

>Hands on w/Android, ChromeOS, Augmented Reality & more #elc2010 welcome http://bit.ly/dcNtq8

Tonight: ARDevMob @ SilVaFUG North

SilvaFUG North (SF)
Tuesday April 13th
6:30 Pizza, 7pm Meeting

sponsored by Universal Mind

Adobe - Kojak Room
601 Townsend Street
San Francisco, CA 94103

(bike cage available in the garage)

rsvp | map

Tonight: ARDevMob @ SilvaFUG San Jose

 
SilvaFUG (SJ)
Thursday April 8th
6:30 Pizza, 7pm Meeting

Adobe HQ - East Tower
345 Park Ave
San Jose, CA 95110

rsvp | map