Your SlideShare is downloading. ×
How to build Great Stuff
     (using Web Technologies)
How do I know?
• I am a natural coder
• I am a natural coder
• I LOVE coding!
• I am a natural coder
• I LOVE coding!
• I HOPE you feel the same way.
• I am a natural coder
• I LOVE coding!
• I HOPE you feel the same way.
• We have our own language. It changes fast.
• I am a natural coder
• I LOVE coding!
• I HOPE you feel the same way.
• We have our own language. It changes fast.
• We ...
• I am a natural coder
• I LOVE coding!
• I HOPE you feel the same way.
• We have our own language. It changes fast.
• We ...
Eye Candy Intro:
     100 Tweets
http://9elements.com/io/projects/html5/canvas/
                 by 9elements
“Somebody set up us
  the bomb DOM!”
“Somebody set up us
     the bomb DOM!”

<script type="text/javascript" />
“Somebody set up us
     the bomb DOM!”

<script type="text/javascript" />

<audio />
“Somebody set up us
     the bomb DOM!”

<script type="text/javascript" />

<audio />

<canvas />
<script />
<script />
<audio>
<script />
          • Find out supported audio format
<audio>
<script />
          • Find out supported audio format
<audio>   • OGG vs mp3
<script />
          • Find out supported audio format
<audio>   • OGG vs mp3
          • Set <audio> src accordingly
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
<script />
                          • Find out supported audio format
       <audio>            • OGG vs mp3
            ...
Selected quotes
 from right before launch
Selected quotes
          from right before launch

• “Nah. It’s not ready.”
Selected quotes
          from right before launch

• “Nah. It’s not ready.”
• “Look at the code.”
Selected quotes
        from right before launch

• “Nah. It’s not ready.”
• “Look at the code.”
• “I mean, LOOK AT THE CO...
Selected quotes
         from right before launch

• “Nah. It’s not ready.”
• “Look at the code.”
• “I mean, LOOK AT THE C...
Selected quotes
          from right before launch

• “Nah. It’s not ready.”
• “Look at the code.”
• “I mean, LOOK AT THE ...
Selected quotes
          from right before launch

• “Nah. It’s not ready.”
• “Look at the code.”
• “I mean, LOOK AT THE ...
Not showing what you created
is the single biggest mistake
you can possibly make.
Because you never know.
Because you never know.
Because you never know.




   A quarter million. In four days.
Because you never know.




     A quarter million. In four days.
For an HTML5 Canvas Audio Experiment.
Because you never know.




     A quarter million. In four days.
For an HTML5 Canvas Audio Experiment.

             Not ...
Because you never know.




     A quarter million. In four days.
For an HTML5 Canvas Audio Experiment.

             Not ...
Self-referential Praise
Nearly all of the 100 Tweets linked back to ourselves.
                      It felt good.
Reason for Success?
 Made developers see what is possible.
Purpose
Make developers see what is possible.
Lessons learned
Lessons learned

• Know and love your tools
Lessons learned

• Know and love your tools
• Be enthusiastic about an idea
Lessons learned

• Know and love your tools
• Be enthusiastic about an idea
• Enthusiasm is what will drive you!
Lessons learned

• Know and love your tools
• Be enthusiastic about an idea
• Enthusiasm is what will drive you!
• Do it i...
“The future is here.
It's just not evenly distributed yet.”
- William Gibson
So what is our job?
Distribute future.
Future ==== Technology




  Operator of super-convenient equality
ActiveRecord, anyone?

class Future
  has_many :innovations, :through => :technologies
end
It is too easy ;-)
It is too easy ;-)

• Free technology
It is too easy ;-)

• Free technology
• Open technology
It is too easy ;-)

• Free technology
• Open technology
• Mostly based open standards
It is too easy ;-)

• Free technology
• Open technology
• Mostly based open standards
• Widely adopted technology
It is too easy ;-)

• Free technology
• Open technology
• Mostly based open standards
• Widely adopted technology
• So ple...
Let’s do that right now.
Four technologies,
 explained briefly.
One.
WebSockets API
WebSockets API

• Full-duplex communication channel
WebSockets API

• Full-duplex communication channel
• Between Browser and Server
WebSockets API

• Full-duplex communication channel
• Between Browser and Server
• API is simply awesome
WebSockets API

• Full-duplex communication channel
• Between Browser and Server
• API is simply awesome
• I can’t possibl...
WebSockets API

• Full-duplex communication channel
• Between Browser and Server
• API is simply awesome
• I can’t possibl...
Using WebSockets
Using WebSockets
// Setup
var socket = new WebSocket("ws://www.example.com");
Using WebSockets
// Setup
var socket = new WebSocket("ws://www.example.com");

// Sending messages
socket.send("Feel so fr...
Using WebSockets
// Setup
var socket = new WebSocket("ws://www.example.com");

// Sending messages
socket.send("Feel so fr...
Using WebSockets
// Setup
var socket = new WebSocket("ws://www.example.com");

// Sending messages
socket.send("Feel so fr...
Two.
Canvas 2D API
Canvas 2D API
// Setup
var canvas   = document.getElementById('ze-canvas'),
Canvas 2D API
// Setup
var canvas = document.getElementById('ze-canvas'),
    context = canvas.getContext('2d');
Canvas 2D API
// Setup
var canvas = document.getElementById('ze-canvas'),
    context = canvas.getContext('2d');

// Drawi...
Canvas 2D API
// Setup
var canvas = document.getElementById('ze-canvas'),
    context = canvas.getContext('2d');

// Drawi...
Canvas 2D API
// Setup
var canvas = document.getElementById('ze-canvas'),
    context = canvas.getContext('2d');

// Drawi...
Canvas 2D API
// Setup
var canvas = document.getElementById('ze-canvas'),
    context = canvas.getContext('2d');

// Drawi...
Canvas 2D API
// Setup
var canvas = document.getElementById('ze-canvas'),
    context = canvas.getContext('2d');

// Drawi...
Three.
# Hey,
# Hey,
# realizing bullets are great for informal bits,
# Hey,
# realizing bullets are great for informal bits,
# and not wanting to break my promise from before,
#   Hey,
#   realizing bullets are great for informal bits,
#   and not wanting to break my promise from before,
#   I hac...
#   Hey,
#   realizing bullets are great for informal bits,
#   and not wanting to break my promise from before,
#   I hac...
#   Hey,
#   realizing bullets are great for informal bits,
#   and not wanting to break my promise from before,
#   I hac...
#   Hey,
#   realizing bullets are great for informal bits,
#   and not wanting to break my promise from before,
#   I hac...
#   Hey,
#   realizing bullets are great for informal bits,
#   and not wanting to break my promise from before,
#   I hac...
#   Hey,
#   realizing bullets are great for informal bits,
#   and not wanting to break my promise from before,
#   I hac...
# Start redis server
$ redis-server redis.conf &
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK

# Retrieve value by key
$...
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK

# Retrieve value by key
$...
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK

# Retrieve value by key
$...
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK

# Retrieve value by key
$...
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK

# Retrieve value by key
$...
# Start redis server
$ redis-server redis.conf &

# Set value by key
$ redis-cli set foo bar
OK

# Retrieve value by key
$...
Four.
“Hey Apache, here are 5000 concurrent
   requests I need you to handle.”
“Hey Apache, here are 5000 concurrent
   requests I need you to handle.”

      “And keep them all open!”
It cannot work due to the way Apache httpd’s request handling is designed.
                 (Admitted, at least not out of...
# The heart of Google Chrome?
# The heart of Google Chrome?
#
# - V8, of course!
# The heart of Google Chrome?
#
# - V8, of course!
#
# By opening up V8, Google made not only the client better.
#   The heart of Google Chrome?
#
#   - V8, of course!
#
#   By opening up V8, Google made not only the client better.
#
#...
#   The heart of Google Chrome?
#
#   - V8, of course!
#
#   By opening up V8, Google made not only the client better.
#
#...
#   The heart of Google Chrome?
#
#   - V8, of course!
#
#   By opening up V8, Google made not only the client better.
#
#...
#   The heart of Google Chrome?
#
#   - V8, of course!
#
#   By opening up V8, Google made not only the client better.
#
#...
So I hacked something together
 It’s not great, it’s just a demo.
      Started today at 5pm
      Got it running at 6pm
 ...
We lay the foundation.
We lay the foundation.




         Our Ideas
       Raw concepts
        Frameworks
We lay the foundation.



      Useful Applications
        Early Adoption
       Real world usage


          Our Ideas
 ...
We lay the foundation.
                   Manifestations
Yay :-) Geo Metadata, Mobile Focus, $awesome
        Nay... “2.0”...
Do. Not. Hesitate.
     MAKE!
> thanks && this
{
    "author": new Person("Stephan Seidt", {twitter: "evilhackerdude"}),
    "date": new Date(2010, 2, 2...
Building Great Stuff Using Web Technologies
Building Great Stuff Using Web Technologies
Building Great Stuff Using Web Technologies
Building Great Stuff Using Web Technologies
Building Great Stuff Using Web Technologies
Building Great Stuff Using Web Technologies
Building Great Stuff Using Web Technologies
Upcoming SlideShare
Loading in...5
×

Building Great Stuff Using Web Technologies

8,790

Published on

Published in: Technology

Transcript of "Building Great Stuff Using Web Technologies"

  1. 1. How to build Great Stuff (using Web Technologies)
  2. 2. How do I know?
  3. 3. • I am a natural coder
  4. 4. • I am a natural coder • I LOVE coding!
  5. 5. • I am a natural coder • I LOVE coding! • I HOPE you feel the same way.
  6. 6. • I am a natural coder • I LOVE coding! • I HOPE you feel the same way. • We have our own language. It changes fast.
  7. 7. • I am a natural coder • I LOVE coding! • I HOPE you feel the same way. • We have our own language. It changes fast. • We do abstract things.
  8. 8. • I am a natural coder • I LOVE coding! • I HOPE you feel the same way. • We have our own language. It changes fast. • We do abstract things. • “Normal” people think of it as “magic”
  9. 9. Eye Candy Intro: 100 Tweets http://9elements.com/io/projects/html5/canvas/ by 9elements
  10. 10. “Somebody set up us the bomb DOM!”
  11. 11. “Somebody set up us the bomb DOM!” <script type="text/javascript" />
  12. 12. “Somebody set up us the bomb DOM!” <script type="text/javascript" /> <audio />
  13. 13. “Somebody set up us the bomb DOM!” <script type="text/javascript" /> <audio /> <canvas />
  14. 14. <script />
  15. 15. <script /> <audio>
  16. 16. <script /> • Find out supported audio format <audio>
  17. 17. <script /> • Find out supported audio format <audio> • OGG vs mp3
  18. 18. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly
  19. 19. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. “html5+love”
  20. 20. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love”
  21. 21. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love” • On click, display tweet’s text
  22. 22. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love” • On click, display tweet’s text • Instruct dot to move
  23. 23. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love” • On click, display tweet’s text • Instruct dot to move <canvas>
  24. 24. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love” • On click, display tweet’s text • Instruct dot to move • On every frame, draw dots <canvas>
  25. 25. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love” • On click, display tweet’s text • Instruct dot to move • On every frame, draw dots <canvas> • Animations are manual
  26. 26. <script /> • Find out supported audio format <audio> • OGG vs mp3 • Set <audio> src accordingly Twitter Search API Req. • Search for 100 tweets “html5+love” • On click, display tweet’s text • Instruct dot to move • On every frame, draw dots <canvas> • Animations are manual • Beat animation is precoded
  27. 27. Selected quotes from right before launch
  28. 28. Selected quotes from right before launch • “Nah. It’s not ready.”
  29. 29. Selected quotes from right before launch • “Nah. It’s not ready.” • “Look at the code.”
  30. 30. Selected quotes from right before launch • “Nah. It’s not ready.” • “Look at the code.” • “I mean, LOOK AT THE CODE!”
  31. 31. Selected quotes from right before launch • “Nah. It’s not ready.” • “Look at the code.” • “I mean, LOOK AT THE CODE!” • “Let’s add some more... Stuff?”
  32. 32. Selected quotes from right before launch • “Nah. It’s not ready.” • “Look at the code.” • “I mean, LOOK AT THE CODE!” • “Let’s add some more... Stuff?” • “We did similar things with Flash...
  33. 33. Selected quotes from right before launch • “Nah. It’s not ready.” • “Look at the code.” • “I mean, LOOK AT THE CODE!” • “Let’s add some more... Stuff?” • “We did similar things with Flash... • ...10 years ago.”
  34. 34. Not showing what you created is the single biggest mistake you can possibly make.
  35. 35. Because you never know.
  36. 36. Because you never know.
  37. 37. Because you never know. A quarter million. In four days.
  38. 38. Because you never know. A quarter million. In four days. For an HTML5 Canvas Audio Experiment.
  39. 39. Because you never know. A quarter million. In four days. For an HTML5 Canvas Audio Experiment. Not so bad.
  40. 40. Because you never know. A quarter million. In four days. For an HTML5 Canvas Audio Experiment. Not so bad. (We’re not a porn site)
  41. 41. Self-referential Praise Nearly all of the 100 Tweets linked back to ourselves. It felt good.
  42. 42. Reason for Success? Made developers see what is possible.
  43. 43. Purpose Make developers see what is possible.
  44. 44. Lessons learned
  45. 45. Lessons learned • Know and love your tools
  46. 46. Lessons learned • Know and love your tools • Be enthusiastic about an idea
  47. 47. Lessons learned • Know and love your tools • Be enthusiastic about an idea • Enthusiasm is what will drive you!
  48. 48. Lessons learned • Know and love your tools • Be enthusiastic about an idea • Enthusiasm is what will drive you! • Do it in your spare time
  49. 49. “The future is here. It's just not evenly distributed yet.” - William Gibson
  50. 50. So what is our job?
  51. 51. Distribute future.
  52. 52. Future ==== Technology Operator of super-convenient equality
  53. 53. ActiveRecord, anyone? class Future has_many :innovations, :through => :technologies end
  54. 54. It is too easy ;-)
  55. 55. It is too easy ;-) • Free technology
  56. 56. It is too easy ;-) • Free technology • Open technology
  57. 57. It is too easy ;-) • Free technology • Open technology • Mostly based open standards
  58. 58. It is too easy ;-) • Free technology • Open technology • Mostly based open standards • Widely adopted technology
  59. 59. It is too easy ;-) • Free technology • Open technology • Mostly based open standards • Widely adopted technology • So please, just do it.
  60. 60. Let’s do that right now.
  61. 61. Four technologies, explained briefly.
  62. 62. One.
  63. 63. WebSockets API
  64. 64. WebSockets API • Full-duplex communication channel
  65. 65. WebSockets API • Full-duplex communication channel • Between Browser and Server
  66. 66. WebSockets API • Full-duplex communication channel • Between Browser and Server • API is simply awesome
  67. 67. WebSockets API • Full-duplex communication channel • Between Browser and Server • API is simply awesome • I can’t possibly handle more bullets
  68. 68. WebSockets API • Full-duplex communication channel • Between Browser and Server • API is simply awesome • I can’t possibly handle more bullets • In fact, from now on, no more bullets
  69. 69. Using WebSockets
  70. 70. Using WebSockets // Setup var socket = new WebSocket("ws://www.example.com");
  71. 71. Using WebSockets // Setup var socket = new WebSocket("ws://www.example.com"); // Sending messages socket.send("Feel so free without HTTP!");
  72. 72. Using WebSockets // Setup var socket = new WebSocket("ws://www.example.com"); // Sending messages socket.send("Feel so free without HTTP!"); // It rhymes! Please, make a websockets song! socket.send("There’s no HTTP ‘round me!");
  73. 73. Using WebSockets // Setup var socket = new WebSocket("ws://www.example.com"); // Sending messages socket.send("Feel so free without HTTP!"); // It rhymes! Please, make a websockets song! socket.send("There’s no HTTP ‘round me!"); // Receiving messages socket.onmessage = function(e) { alert(e.data); }
  74. 74. Two.
  75. 75. Canvas 2D API
  76. 76. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'),
  77. 77. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'), context = canvas.getContext('2d');
  78. 78. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'), context = canvas.getContext('2d'); // Drawing shapes context.fillRect(x, y, width, height);
  79. 79. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'), context = canvas.getContext('2d'); // Drawing shapes context.fillRect(x, y, width, height); // Or images (image being successfully loaded) context.drawImage(image, 25, 25);
  80. 80. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'), context = canvas.getContext('2d'); // Drawing shapes context.fillRect(x, y, width, height); // Or images (image being successfully loaded) context.drawImage(image, 25, 25); // Animations? (ohh, SUSPENSE!)
  81. 81. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'), context = canvas.getContext('2d'); // Drawing shapes context.fillRect(x, y, width, height); // Or images (image being successfully loaded) context.drawImage(image, 25, 25); // Animations? (ohh, SUSPENSE!) window.setTimeout(function() { }, 1000/max_fps);
  82. 82. Canvas 2D API // Setup var canvas = document.getElementById('ze-canvas'), context = canvas.getContext('2d'); // Drawing shapes context.fillRect(x, y, width, height); // Or images (image being successfully loaded) context.drawImage(image, 25, 25); // Animations? (ohh, SUSPENSE!) window.setTimeout(function() { context.clearRect(0, 0, canvasWidth, canvasHeight); context.fillRect(x++, y++, width, height); }, 1000/max_fps);
  83. 83. Three.
  84. 84. # Hey,
  85. 85. # Hey, # realizing bullets are great for informal bits,
  86. 86. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before,
  87. 87. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before, # I hacked the format and put bullets into code comments!
  88. 88. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before, # I hacked the format and put bullets into code comments! # Here we go :D
  89. 89. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before, # I hacked the format and put bullets into code comments! # Here we go :D # # <3 Redis <3
  90. 90. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before, # I hacked the format and put bullets into code comments! # Here we go :D # # <3 Redis <3 # # A persistent key-value database # # // OR: //
  91. 91. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before, # I hacked the format and put bullets into code comments! # Here we go :D # # <3 Redis <3 # # A persistent key-value database # # // OR: // # # 21st century malloc() # (via @hungryblank)
  92. 92. # Hey, # realizing bullets are great for informal bits, # and not wanting to break my promise from before, # I hacked the format and put bullets into code comments! # Here we go :D # # <3 Redis <3 # # A persistent key-value database # # // OR: // # # 21st century malloc() # (via @hungryblank) # # It can do some very useful things, # and it does those things very good.
  93. 93. # Start redis server $ redis-server redis.conf &
  94. 94. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK
  95. 95. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK # Retrieve value by key $ redis-cli get foo bar
  96. 96. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK # Retrieve value by key $ redis-cli get foo bar # Redis values can also be:
  97. 97. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK # Retrieve value by key $ redis-cli get foo bar # Redis values can also be: # - lists
  98. 98. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK # Retrieve value by key $ redis-cli get foo bar # Redis values can also be: # - lists # - sets
  99. 99. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK # Retrieve value by key $ redis-cli get foo bar # Redis values can also be: # - lists # - sets # - ordered sets
  100. 100. # Start redis server $ redis-server redis.conf & # Set value by key $ redis-cli set foo bar OK # Retrieve value by key $ redis-cli get foo bar # Redis values can also be: # - lists # - sets # - ordered sets # - hashes (HEAD)
  101. 101. Four.
  102. 102. “Hey Apache, here are 5000 concurrent requests I need you to handle.”
  103. 103. “Hey Apache, here are 5000 concurrent requests I need you to handle.” “And keep them all open!”
  104. 104. It cannot work due to the way Apache httpd’s request handling is designed. (Admitted, at least not out of the box)
  105. 105. # The heart of Google Chrome?
  106. 106. # The heart of Google Chrome? # # - V8, of course!
  107. 107. # The heart of Google Chrome? # # - V8, of course! # # By opening up V8, Google made not only the client better.
  108. 108. # The heart of Google Chrome? # # - V8, of course! # # By opening up V8, Google made not only the client better. # # Somebody put V8 on the server!
  109. 109. # The heart of Google Chrome? # # - V8, of course! # # By opening up V8, Google made not only the client better. # # Somebody put V8 on the server! # # Together with a quality non-blocking infrastructure.
  110. 110. # The heart of Google Chrome? # # - V8, of course! # # By opening up V8, Google made not only the client better. # # Somebody put V8 on the server! # # Together with a quality non-blocking infrastructure. # # Now, what do we have?
  111. 111. # The heart of Google Chrome? # # - V8, of course! # # By opening up V8, Google made not only the client better. # # Somebody put V8 on the server! # # Together with a quality non-blocking infrastructure. # # Now, what do we have?
  112. 112. So I hacked something together It’s not great, it’s just a demo. Started today at 5pm Got it running at 6pm http://github.com/evilhackerdude/beergarden
  113. 113. We lay the foundation.
  114. 114. We lay the foundation. Our Ideas Raw concepts Frameworks
  115. 115. We lay the foundation. Useful Applications Early Adoption Real world usage Our Ideas Raw concepts Frameworks
  116. 116. We lay the foundation. Manifestations Yay :-) Geo Metadata, Mobile Focus, $awesome Nay... “2.0”, “SEO”, “Social Media” Useful Applications Early Adoption Real world usage Our Ideas Raw concepts Frameworks
  117. 117. Do. Not. Hesitate. MAKE!
  118. 118. > thanks && this { "author": new Person("Stephan Seidt", {twitter: "evilhackerdude"}), "date": new Date(2010, 2, 22), // wtfjs: january = 0 "license": new License.CC("by", "sa"), "url": "http://www.slideshare.net/evilhackerdude/", "sources": [ "http://en.wikipedia.org/wiki/File:SouthParkChef.png", "http://dev.w3.org/html5/websockets/", "http://dev.w3.org/html5/canvas-api/canvas-2d-api.html", "https://developer.mozilla.org/en/Canvas_tutorial", "http://code.google.com/p/redis/", "http://github.com/antirez/redis", "http://nodejs.org/", "http://s3.amazonaws.com/four.livejournal/20091117/jsconf.pdf", "http://github.com/guille/node.websocket.js/", "http://github.com/fictorial/redis-node-client" ] } // thanks == true and honest!

×