LearnBoost

If you’ve been wondering what I’ve been up to these days, I have some compelling news to share about my company, LearnBoost

I’m excited to announce that my company has raised a seed round of $975K from several leading angels and venture capital firms. Our VC’s are Bessemer Venture Partners, Charles River Ventures, RRE Ventures, and Atlas Ventures. Our angels include Naval Ravikant, Bill Lee, James Hong, Othman Laraki, Karl Jacob, and several other fantastic angels. We’re thrilled this entire group of investors share LearnBoost’s vision for developing free and amazing software for schools.

Continue reading

This post has 3 responses

Posted in General about 1 month ago

Attribution

Like most nights, tonight I was reading the public GitHub News Feed to keep up with interesting projects that people I follow might create, follow or contribute to. One that caught my eye immediately is a project called FCBKcomplete, currently with over a 100 followers and 22 very active forks.

As I was glancing the list of files, I notice one called close.gif, which specially intrigued me: when I released the initial version of my project TextboxList (MooTools, jQuery), that’s exactly what I had called the sprite image which contained the normal, hover and active states of the boxes close buttons.

But there was a small problem: in the entire GitHub repository, I couldn’t find a single mention of my name or my website.

The early days of TextboxList

Around January 2008, I announced the first open source widget released under the MIT license intended to mimic the behavior of the Facebook tokenizer.

The header of the source file, still up today, contains two interesting bits:

Credits:
  - Idea: Facebook + Apple Mail
  - Caret position method: Diego Perini <http://javascript.nwbox.com/cursor_position/cursor.js>

I included credit for the ideas and sources of inspiration, and for a relevant key piece of source code which had been written by another developer.

The second interesting bit is my copyright message:

/* Copyright: Guillermo Rauch <http://devthought.com/> - Distributed under MIT - Keep this message! */

When I started writing this project, I was a 16-year-old high school student trying to seek some recognition for a piece of work given away for free. Today, with the message formatting unchanged we can find:

/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - Keep this message! */

The problems

  1. The file close.gif was copy-pasted
  2. The stylesheet was entirely copy-pasted.

    For the first release of the project, I wrote an article about the thought process behind the creation of the widget.

    One of the core ideas emphasized in it is that you should start by having the markup and CSS be as bullet proof as possible, as you don’t want to hinder the JavaScript development with debugging related to style, positions, floats, and you don’t want to solve problems within JavaScript that CSS alone can solve. Years later, this is still a design principle I live by for the creation of web applications

  3. At 550 lines of code, it has considerably less features than my very old version at 350 lines of code. Namely, no keyboard navigation of the boxes, one of the premises of the original Facebook tokenizer.

    Since my first release, the entire codebase was re-written, with full documentation and many more characteristics. This version wasn’t released under MIT. However, hundreds of people are using it for free, others have chosen to willingly contribute (as I have no mechanisms to prevent unfair use), and special licenses were given to open source projects, companies with dozens of subdomains and very well known web application makers.

  4. Many parts of the code show a striking resemblance, which of course is not coincidental.
  5. Even the JSON data used to feed autocompletion values, which is a collection of my favorite argentinean writers, has been blatantly reproduced. Quite interesting considering the author seems to be from Israel, and I’m sure he wasn’t just including it out of passion for good foreign literature.
  6. Under these conditions, it managed to sneak dozens of commits from people in the community, including Chris Williams. It’s left for me to wonder if they ever learned of all the effort that took me to research this particular problem and execute its solution, now shown to the world under a very intriguing brand.

Update: special thanks to Chris Williams who updated his fork to reflect proper copyright

This post has 8 responses

Posted in Blog about 1 month ago

JSConf 2010 Slides

For those of us who didn’t make it, I’ve compiled a list of slides + blog posts from the JSConf 2010 Track A speakers

Alex Russell – “Google Chrome Frame”
Post: http://alex.dojotoolkit.org/
Slides: http://alex.dojotoolkit.org/10/jsconf/gcf.html

Francisco Tolmasky – “Socratic: Documentation Done Right”
GitHub: http://github.com/tolmasky/socratic
Slides: ?

Aaron Newton – “Programming To Patterns”
Slides: http://www.slideshare.net/guest2ee5e2c/programming-to-patterns-presentation (not up-to-date)

Jed Schmidt – “A (fab) approach to web apps”
GitHub: http://github.com/jed/fab
Slides: http://www.flickr.com/photos/tr4nslator/sets/72157623883700702/show/

Dmitry Baranovskiy – “Raphaël the Great”
Slides: http://www.slideshare.net/Dmitry.Baranovskiy/raphal-js-conf

Douglas Crockford – “Really, JavaScript?”
?

Tobias Schneider – “Flash is dead, long live Flash!”
GitHub: http://github.com/tobeytailor/gordon
Slides: http://www.slideshare.net/ConfEcho/flash-is-dead-long-live-flash

Makinde Adeagbo – “Primer: Facebook’s 2k of JavaScript to power (almost) all interactions”
Slides: http://www.slideshare.net/makinde/javascript-primer

Steve Souders – “The Best of Steve”
Slides: http://www.slideshare.net/souders/jsconf-us-2010

Jenn Lukas – “JavaScript and Web Standards Sitting in a Tree”
Slides: http://www.slideshare.net/JennLukas/javascript-and-web-standards-sitting-in-a-tree

Ryan Dahl – “Less is More in Node.js”
Slides: http://nodejs.org/jsconf2010.pdf

Billy Hoffman – “JavaScript’s Evil Side”
Slides: ?

John David Dalton – “All you can leet”
Slides: http://www.slideshare.net/johndaviddalton/jsconf-all-you-can-leet

Aaron Quint – “Making Bacon / Making Code”
GitHub: http://github.com/quirkey/sammy
Post: http://www.quirkey.com/blog/2010/04/20/making-baconmaking-code-jsconf-2010/
Slides: http://swinger.quirkey.com/#/preso/aq-jsconf/display/1
Video: http://bit.ly/9j7u3L

Dion Almaer, Ben Galbraith, and Matt McNulty – “The mobile web”
Slides: http://www.slideshare.net/dion/the-mobile-web-2010-jsconf

This post has 15 responses

Posted in Blog, Client side 4 months ago

Socket.IO: sockets for the rest of us

Over at LearnBoost, I just released Socket.IO, a normalized Socket API that hides the complexity of the realtime transports.

With code as simple as this:

socket = new io.Socket('localhost');
socket.connect();
socket.send('some data');
socket.addEvent('message', function(data){
    alert('got some data' + data);
});

you’ll be leveraging:

Continue reading

This post has 9 responses

Posted in Client side 6 months ago

Accessing a MySQL database from Node.JS

I just pushed node.dbslayer.js to GitHub, a very basic and easy-to-use interface to DBSlayer.

What is DBSlayer?

The DBacesslayer aka DBSlayer is a lightweight database abstraction layer suitable for high-load websites where you need the scalable advantages of connection pooling. Written in C for speed, DBSlayer talks to clients via JSON over HTTP, meaning it’s simple to monitor and can swiftly interoperate with any web framework you choose.

Developed by the New York Times to distribute the load of their MySQL servers, DBSlayer allows us to perform queries in a non-blocking way. Running a SQL query is as simple as:

connection.query("SELECT * FROM TABLE").addCallback(function(result){
	for (var i = 0, l = result.ROWS.length; i < l; i++){
		var row = result.ROWS[i];
		// do something with the data
	}
});

Have fun!

This post has 13 responses

Posted in Blog, Server side 9 months ago

The Google GO team is working on a WebSocket server

As part of the very comprehensive suite of packages Google GO is bundled with, a WebSocket server seems to be in the works:

http://code.google.com/p/go/source/browse/src/pkg/websocket/

Makefile
client.go
server.go
websocket.go
websocket_test.go

This is how you define a handler in GO’s WebSocket:

package main
 
import (
   "http"
   "io"
   "websocket"
)
 
// echo back the websocket.
func EchoServer(ws *websocket.Conn) {
     io.Copy(ws, ws);
}
 
func main() {
  http.Handle("/echo", websocket.Handler(EchoServer));
  err := http.ListenAndServe(":12345", nil);
  if err != nil {
      panic("ListenAndServe: ", err.String())
  }
}

Using node.websocket.js, it’d boil down to starting up the server:

$ node runserver.js --port="12345"

and defining the modules/echo.js handler:

this.onData = function(data, conn){
   conn.send(data);
}

I’d be interested in seeing how well GO performs with many simultaneous, long-lived clients.

This post has 1 response

Posted in Blog 9 months ago

Node.JS and the WebSocket protocol

After reading Simon Willison’s post on Node.JS, I decided I’d give it a try myself. Today I released node.websocket.js

After a couple of months I’ve been watching the progress on the WebSocket protocol, which gives JavaScript developers full-duplex communications channels in the browser. This is a very exciting alternative to the COMET techniques we’re used to seeing.

Node.JS is a framework for networked, event-driven applications, where JavaScript has a natural fit. This particular implementation is built on top of the excellent V8 engine.

Running the server is as simple as:

$ node runserver.js

Continue reading

This post has 23 responses

Posted in Blog 9 months ago

TextboxList 0.4 for jQuery is here!

Big update for my dear jQuery users. I’m rolling out TextboxList for jQuery 0.4 with these updates:

  • [FEATURE] Autocompletion with on-demand server querying
  • [ENHANCEMENT] All classes moved to $. to avoid global namespace pollution. Please make sure to prepend $. to TextboxList if you are upgrading from an older version:

       new $.TextboxList('#element');
  • [FEATURE] Easier jQuery-friendly initialization like this:

       $('#element').textboxlist({options});

    However, if you still need to access the TextboxList instance to call additional methods (like add), you’ll have to continue to use new $.TextboxList

  • [BUGFIX] GrowingInput now works in noConflict mode

  • [BUGFIX] Fix for GrowingInput to handle special characters and correctly calculate the input length.
  • [BUGFIX] Fix for support of multiple addKeys
  • [BUGFIX] Fix for focus problem when TextboxList gains focus through focusing an editable input
  • [BUGFIX] Autocomplete search term is now trimmed (thanks Mike Feng)
  • [BUGFIX] Fix for when the max option is used
  • [BUGFIX] Fix for unique = true and autocomplete.

As usual, head to the project page for download.

This post has 47 responses

Posted in Client side 10 months ago

Integrate Google Wave into your OS X system with Fluid

My Dock

Want to have Wave as a standalone application, with a badge that reflects the number of unread waves?
Follow these steps:

  1. Download the excellent Fluid.app
  2. Run it and create a new application like this:

    Launch Fluid.app and create it like this

    Download the icon I used here and make sure to select it in the appropriate dialog dropdown.

  3. Launch the application. When Wave loads for the first time, it’ll think you’re using an unsupported browser. This is not true, since Fluid.app is Webkit-based. Disregard this message and press continue. Google will remember this setting.
  4. To get the badge count functionality, I developed this userscript. Unzip it, go to the Google Wave applications, find the plugins menu and click Browser Usersripts Folder. Drop the file there and then make sure it’s enabled.

    Plugins menu

  5. One last useful setting for any Fluid.app you create is to make sure it doesn’t unload the website when you press ⌘ + W. Make sure only hides the window is checked:

    Fluid application settings

This post has 56 responses

Posted in Desktop 11 months ago