1. Socket.IO (http://socket.io/)
It lets you use websockets and automatically fall back to flash sockets, long polling, or several other real-time communication methods if websockets aren't supported by the client. There's a JS client and node-compatible server, as well as in-progress server implementations in a few other languages. Node is nice by itself, but it's with things like Socket.IO that it really shines.
2. Coffeescript (http://jashkenas.github.com/coffee-script/)
Coffeescript is a nice-looking and nice-to-type syntax on top of JavaScript. It's made JS development a lot friendlier, and I now miss things about it every time I'm programming in Python and Ruby. I now use it whenever I'm doing any significant amount of coding in JS.
3. Node.js (http://nodejs.org/)
Node should, by this point, need no introduction. Server-side JS. Plays very nicely with websockets thanks to Socket.IO, making it very easy to write the server-side part of real-time webapps. I've also found it very useful when trying to quickly prototype simple non-webapp things that have to communicate over a network.
I haven't had a chance to check out Backbone.js (http://documentcloud.github.com/backbone/) yet beyond a very quick look, but I expect to use it (or something like it) next time I'm developing something that uses a significant amount of client-side JS.
I'm also very excited by the continued development on (and Yehuda Katz's participation in) SproutCore (http://www.sproutcore.com/).
One client makes a change to a model -> changes are synced to the server -> other clients that currently reference that model have its attributes updated -> all the UI that displays the model is automatically re-rendered.
It's not critical for most applications, but is a really nice, nice-to-have for any JS app that displays the same editable data to more than one user at a time. Built-in conflict resolution mechanism for bonus points.
The code is 'out there' but private, so if you want to take a peek at it, please contact me directly.
Thanks for a great framework.
Replacing Backbone.sync is totally legit -- and is indeed what having Backbone.sync in a single place is intended for. There are many good paths to data persistence: REST/CRUD, RPC, aggregated JSON, CouchDB or Mongo, LocalStorage, and so on. Backbone.sync is just the default implementation for the common case.
I think that one of the more exciting things about JS development these days, is how open and flexible the patterns still are.
Varnish is cool because it is very fast. It was written by Poul-Henning Kamp, who has a lot of experience in FreeBSD kernel development. He makes effective use of virtual memory, is careful to avoid memory operations that result in expensive bus transactions on mutli CPU systems, and knows how many system calls it takes to serve up a cache hit. All of this work has paid off. Varnish can turn a plodding CMS into a site that screams, and your profiling tools (siege, apache ab) will fall over before the site does.
Of course it helps if your CMS supports cache control headers, and isn't utterly laden with cookies, but that's where the VCL language comes in. You can write code to strip bogus cookies (like google analytics) coming from both the client and the server which vastly improves your cache hit ratios.
I like the way Varnish uses a shared memory pool for statistics and logging -- a wealth of information about the system is available to you but it doesn't generate a ton of I/O logging it to a file unless you ask it to. I love how you can use the telnet admin interface to compile new VCL code into a running system and then switch to it, while keeping old named configurations around in case you need to revert back.
Varnish has really helped me make slow sites fast this year, although it hasn't happened without some VCL coding effort and some understanding of how the sites operate.
Squid can do what varnish does, but it's 2x slower by my measurements, and it has a gigantic config file. (Squid can do things that varnish can't, so you may have to use it anyway.)
> turned out to be substantially better than anyone imagined
By anyone you mean analysts, right?
The iPad is cool, but it's only cool because it went the extra mile and released something polished and thoroughly thought-out from a user experience perspective, whereas its progenitors of like form factor targeted specialists (serious digital artists, et al) and they basically worked, but they just required more work, as one might expect when comparing a high-end specialist's tool with what is essentially a portable document, web, game and movie player.
It's all about repackaging the technology in a format that appeals widely to the general mass of consumers and allows them to do things consumers want to do.
I mean like a kids computer, and a socially acceptable computer, as I said so. The physical form factor isn't what's new, the implementation, software, use cases, and the whole experience is what's new.
By anyone you mean analysts, right?
By anyone, I mean everyone who I've shown an iPad to. Most people don't get it, initially, but after a few minutes of playing with it, seeing their kids play with it, watching funny youtube videos together etc, everyone basically admits they didn't think it would be as good as it is.
Actually. I want to explain why I was so vicious before. What made Wieser's ideas about computing so fantastic wasn't physical form factors. It was about a new age of computing where the way that people use computers would be significantly different to what we had then. It's taken more than 20 years for that to /start/ happening. The iPhone/iPad is the start of a Wieserian world because it bought the idea to people, not because they invented it.
The iPad really is an extension of the pad idea from Ubiquitous Computing. End of story. There's no counter argument. It's irrelevant who you've shown your ipad to, or how novel you think it is. You're wrong. End of story.
In fact, the iPhone and iPad are two great examples of what Wieser talked about so often in his work. The only core difference is that Wieser, the optimist he was, believed that devices should be like note pads in the office and not owned by a distinct person. Computers should transend the need for us to serve them, but instead they should serve us. Pads would be used like note pads are today, but with the power of computing facilitating our contextual needs.
But just because it's new to you, and your group of friends is irrelevant. The idea is old. Even from an implementation point of view.
The one thing that Apple can be congratulated for is bringing that idea into a marketable position. That's no small feat there, they deserve recognition. However, they didn't invent the idea. Just a marketable implementation.
He also thought that there should be more computers, everywhere, that pads/tabs/boards interlink with.
(I still use postgres and sqlite for other database needs, but I'm strongly considering moving a few of those over to redis if I have time.)
1. Mongodb -- This year it really hit its stride and have been able to use it without worry for storing test results and experimental data. This is much nicer than the textfile logs -> sql -> processing datapath I was using previously.
2. flask: this little framwork is in my sweetspot. It does all the annoying crap of webby stuff, without all the "use our orm/routing model/way of thinking of http" so common in the space
3. mongrel2: I like it because it uses 0mq as the backend and sanely integrates some components in a way I feel could be better for many use cases than traditional stacks.
4. 0mq: This gets special mention, because it has been around for a while and I was actively using it, but 0mq 2 came out sometime this year, and is different enough from the first round, that it could be considered a separate technology. It isn't revolutionary in the MOM space, but it is a cool lightweight approach, and the core team has the type of dedication I like to see in OSS projects.
5. ABSOLUTELY NOT NEW: Haskell -- this year is the first year I've had time to sit down with Haskell for real, and start understanding the weird FP thing. This has made everything I do feel shiny and new, because even though I never actually use Haskell, I find myself writing very short hsskell programs in python and c and the other languages I use in my day job. When I started coding I remember thinking "This must be what a wizard feels like!", Haskell has brought back that feeling for me.
ETA: `zmq_poll()` is nice, but some way to make it play nicely with other event loops (like libev's) would be even better.
zmq_getsockopt(socket, ZMQ_FD, ¬ify_fd, ¬ify_fd_size)
Then just pass notify_fd to libev, or libevent, or epoll, or whatever event library you prefer. Very pleasant and easy, but not yet officially documented last time I checked.IIRC, you can't do this in pre-2.1.0 ZMQ; hence, using your own event loop is experimental.
(I suppose it is also possible to see if you get EWOULDBLOCK during an IO operation, and then create the IO watcher, regular-socket-style.)
I'm loving flask + mongo in combination; they make prototyping webapps almost effortless.
The really cool part came when I realized that with F# I was programming at the language level -- that I could effectively and easily write my own languages. So I decided I would like rails-like entities, where the entity reads the structure of the table and then conforms itself to whatever is in the table.
Couple hundreds of lines of code later, and presto chango, I could simply say "give me a list of customers" and point it to the table and I had a list of customers. This totally disconnected the database data structure from the code. Add a new field in the database and there was nothing to change in code. Or add a new field in the type and have it percolate out to the database. Change database providers and it was only a few function changes. Very cool. The kind of simple fix Microsoft should have done with data access instead of writing ODBC/ADO/OleDb//EF/etc
Then I had a blast with mailboxes, er monads, agents, and threads. Ended up writing a small app that was purely functional and all ran in the background. It was so automatic, at first I couldn't figure out how to start the dang thing!
This led to a venture into MPI and other technologies which has just begun. I'm also trying to wrap up my language work with a full DSL sometime soon (if I have a project that needs it). Looking forward to parsing and setting up trees and walking them. I also broke out of windows and started working in a linux environment using Mono, Apache, and MySQL.
Incredibly fun stuff. Looking back, I really had a blast this past year. Next year should be even better.
DocumentCloud really dropped some bombs this year. backbone.js, underscore.js are really great.
Socket.io saved my ass. I promised some big clients that I could make websockets driven apps for the iPad and then apple pulled websockets support without saying anything. So I was able to get socket.io for the win.
2. CoffeeScript language is an amazing replacement for Javascript. I can't see myself going back to pure JS at any point in the future.
3. Rails 3 finally feels like a stable and maintainable web framework. All the web frameworks now all seem to work together using Rack. The ruby web development world is really a nice place to be at the moment.
4. Bundler really nailed the gem dependency management issue (though the journey to 1.0 was very painful)
5. Sass / SCSS / Compass got really good. It feels unimaginable to go back to regular CSS.
Wow, now that I think about it, way too many great technologies to list. 2010 was an insanely good year for ruby web developers.
miniKanren - logic programming w/o the Warren Abstract Machine. Has opened my eyes to a ton of incredible literature on this under appreciated programming paradigm.
First touched it two months ago just to tinker with but didn't really do anything with it. Then after numerous frustrations with my current blogging setup, I spent the last 5 days hacking on it over the holidays and I think it's almost ready to launch. Had to do some custom stuff that I'll write about in a post. It's extremely hackable and I love it. The only thing that doesn't work for me is LSI for related posts. Even with a fast computer and gsl/rb-gsl it still takes 10+ hours with my 1,000+ posts. Anyways, having a super fast site is going to be a breath of fresh air. Google was saying 88% of sites loaded faster than mine ( http://paulstamatiou.com ), though likely due to the images in many of my reviews.
Also installed Google mod_pagespeed and all is well so far.
* Though to be fair most of that is just my redesign that is more minimal, less ads, etc, but there's something extremely attractive about simple, flat files. No worrying about if your database will get corrupted. Everything is in git..
Feel free to email me if you need any help getting the last bits figured out. I use jekyll for blog.danieljackoway.com and danieljackoway.com, and I've done some weird stuff with it (like pages that are generated purely through the layout + YAML frontmatter--no "content"). Plus I'd just like to see the redesign early :)
The other thing which impressed me is kvm, in contrast to Xen.
GPU-accelerated VLC on my netbook has been amazing.
I got a Canon T2i / 550D this year. It shoots some amazing HD video and will only get better as I spend more on lenses and develop better techniques.
The Kindle 3 (brighter display and cheap price) have me reading books I've been putting off for years. It's great to have a device that's great at one thing and not very good at random browsing, Facebook, Twitter, HN, etc.
Using those tools has helped me to really enjoy writing JavaScript and to start doing it in a much more organized manner. They have been a huge catalyst for my growth as a JavaScript developer.
Also, using MongoDB has been awesome!
(Not that I mind writing in Python of course! It would just be nice to have similar options when python might not be an option)
I am also really excited by socket protocol tech advancements in the browser. I was able to pull off seriously cool stuff using http://pusherapp.com/ and also http://faye.jcoglan.com/ which is a nifty JS implementation of the Bayeux protocol.
1. Groovy - a programming language, it rocks because it less verbose and more powerful than Java and I can fall back onto standard Java syntax when I don't care to figure out how to do something in the 'Groovy' way. (http://groovy.codehaus.org)
2. Gaelyk - a groovy framework that runs on Google App Engine. Google App Engine is great for launching apps. It's free until it gets traction. (http://gaelyk.appspot.com)
3. Objectify - The simplest convenient interface to the Google App Engine datastore. Takes a lot of the pain out of using Bigtable. (http://code.google.com/p/objectify-appengine)
These all pack a mean punch and let me work on my night/weekend projects quite productively after overcoming a small learning curve.
I built http://icusawme.com and http://chatroulettespy.com with all three.
I'm looking forward to diving deeper into Appcelerator Titanium Mobile in early 2011.
2) Kohana - I love working with this framework. I never really worry about the ugly warts in PHP, because honestly? I'm not programming in PHP any more. I'm programming in Kohana, and I only occasionally fall back to PHP for "low-level" stuff.
Not what you would call cool technology, but definitely the best technology I have used this year. Protobufs get out of the way so you can get work done.
libev (http://software.schmorp.de/pkg/libev.html) was also a lot of fun to use for multiplexing sockets, plus it has a whole pile of other useful watchers that can use its event loop.
- All the Amazon offerings. They are innovating like crazy and improving and expanding all their offerings all the time.
- Compass/SASS/SCSS - All the pain gone from CSS
- Capistrano - All the pain gone from software deployment
- Apple laptops & OS X. A bit on the clichéd side now but it really makes my life easier.
- SSDs. Damnit I really need to buy one of these things. After having tried them out it's hard to go back to spinning platters.
Also things I wish I'd worked with but haven't had the chance yet:
- anything in the CNC milling, laser cutting, desktop fabrication and 3d printing fields. This is a huge area to watch.
Despite being responsible for Monkeybars, I actually hadn't used JRuby that much this past year, being mostly caught up in a Rails gig (which I thought might run under JRuby, but is not).
However, having gotten a Kintect I'm hooking into the C libs via JRuby and some nice JNI wrappers some smart Kinect hackers have written. So I can use JRuby + Monkeybars for the GUI.
Other than that, the stuff I did this year that was merely "new to me" was mostly about Groovy and Grails. I spent a ton of time working with Grails, and I'm really liking it.
Smalltalk - What a powerful language. This is what OOP should look like.
Object Oriented Databases - Gemstone and db4o. Not having to deal with the OO and Relational mismatch is a breath of fresh air.
2. AndroidOS - It came out few years back but it really took off in 2010. I can’t wait to see the new features for 2011 and how it’ll fare against iOS.
3. Python - even though I’ve been using python for several years I’m still constantly surprised by it’s core features (recently coroutines) and it's plethora of awesome third-party libraries.
I've finally gotten to experience the Kindle 3 (Christmas gift) and the Google CR-48 is pretty sweet too. I believe the Kindle will change the amount I read. I have so many books on deck. My biggest challenge is balancing development time with watching movie time and more reading time.
#3 - new to me: Twisted as a server framework; more specific Cyclone which is a Twisted-based clone of the Tornado server framework.
http://github.com/fiorix/cyclone/
Comes with built-in MongoDB (TxMongo) and Redis (TxRedisAPI) support too! :)
Others would be Sproutcore, Rails3, Coffeescript, Erlang.
2010 was a year of discoveries for me. I started learning and using technologies like Ruby, Rails, Sinatra, HAML, Google Maps API v3. I started reading HN. Just in the end of the year I've discovered that with technologies like Rhodes framework, Appcelerator or Phonegap I can create iPhone/Android applications with HTML/Javascript or Ruby without knowing objective C. And this is just the most recent excitement I got.
Type theVar;
if (theFunction(theVar)
{ /*do something with theVar*/ }
theFunction returns true if it set theVar, false otherwise.
The problem is that theVar's visibility extends beyond our interest in it. The ZQ template lets me write this: if (ZQ<Type> theQ = theFunction())
{ /*do something with theQ.Get()*/}
and all of a sudden I don't have to come up with anywhere near as many meaningful names as before.To me it's neat because I've found many unanticipated uses for it e.g. wrapping the values in option-specifying structures where a default is cleanly indicated with a default-inited (or subsequently Clear()ed) ZQ, rather than having a separate 'use default' boolean, or 'set default' function.
http://zoolib.svn.sourceforge.net/viewvc/zoolib/trunk/zoolib...
node.js for HTTP-related activities. (I needed a rate-limiting proxy that returned a special HTTP code when the rate limit was exceeded. 20 lines of node.js later...)
0MQ: the way network messaging should be. (Did you know that the same socket can be bound and connected multiple times? Amazingly flexible.)
Anyone who says MongoDB without having a proper use will get a very angry stare from me. Seriously...
Ruby 1.9.2: It was time to move up from 1.8.7.
MongoDB: I introduced this new technology to the company I work at which has now adopted it for two significant projects. One was the project I researched it for initially, which handles millions of writes per week, and the other is a rewrite of something we used to use MySQL for. It currently has a hundred million or so documents and is going strong. It's new and fun. My collection uses dynamic sharding; I think the other one does as well. One is hosted in our data center, the other is in the cloud. Both are in production and running with 100% uptime so far.
I've worked with MongoDB, Cassandra, and a host of other tools, libraries, databases, and frameworks, but beanstalk is the only one to never fail me. It's not a full swiss army knife like Redis or the sexy app of the year like MongoDB: beanstalk does 1 job and does it, as far as I can tell, perfectly.
· Rails 3 became everything I wanted Rails to be — I've come from Django and am really loving the ecosystem and the way the documentation has matured.
· Varnish — just an awesome piece of software. Fantastic job of caching, from small sites to large, without having to write mountains of config files. It's something you can drop it from an early stage with little cost in time, and know it'll be ready to help an application as it grows/scales.
· SSD's: didn't realise how good they were until I got a machine with one. I don't think I can buy a new machine without one now.
It's a really great core library for building web applications, takes the 1389408103 functions in PHP and produces a nice modular library that gives you everything you need and nothing you don't.
- PostGIS raster capabilities (at last some raster storage and computing inside the database).
- Devon:Think / Bookends / Nisus Writer : Scientific papers and books intelligent storage, bibliography management and scientific writing.
It was an on again off again sort of project mostly off, but i finished it up a week or two ago. Now I can print plastic in any shape i can draw in art of illusion. It's satisfying fiddling at the computer for a while then printing and having a real 3d thing.
cnc is so much fun. I think i'm going to have to get a cnc mill. this is just to tempting. http://lcamtuf.coredump.cx/guerrilla_cnc1.shtml
In the near term i'll probably just print some brackets and containers for stuff.
It makes cross-platform native app development easy, and is a huge leg up for audio work.
I only started using about a week or so ago, but, hey, that;s still 2010.
I was trying to manipulate Kinect data in JRuby, but it was too slow. However, I may be able to use Mirah instead, and if all goes well get Rawr to auto-compile Mirah files as part of the build process. Mirah's still a bit rough, but knowing Charlie I expect it to rock.
I'm pretty excited about 2011. Which should be starting in about 30 minutes for me ...
Happy new year, all!
1.Haskell or "how I learned to stop worrying (about monads) and just do io." Still fighting with the type system occasionally but I think it's getting better.
2.Erlang - I so love this language. The concurrency support makes me think about programming the way I want to think about programming. I also like that's it's most of the fun of functional programming (Haskell style) but without having to deal with types.
From reading this thread I see Java doesn't get much love, but for us poor saps that spent 10 years using and learning it and can't give it up yet, Play is great.
While my area is currently graphics/simulation I'm wondering how effective adding GPUs as accelerators to large scale web problems would be. It's really taking of in the Super Computing area, so I'm sure there is room for it!
LCDS, WebORB specifically and Flex 3 RoR Lift Web Framework
And in the Q4 of the year i used all my time to learn Android and a lot of cool API's:
Overlay-Manager to recognize gestures in Android AndEngine Geocoding and reverse geocoding Notifications by vibrating SMSManager
I really enjoyed developing Android stuff, and i'm keeping up with these for a while.
MVC.NET 3 + Entity Framework 4 + OpenRasta + Membership Framework + MEF + LINQ + dojo has been a good experience so far.
* Mopub - mix and match ad networks, server side - open source SDK (brand new start-up that just got funded, out of AngelPad)
* ASIHTTP - makes networking easy
* TouchJSON - the fastest JSON library, AFAIK
* Appirater - easy drop-in widget for prompting for reviews
...kidding :)
2011 we will see in-browser video editing
Ok, perhaps not what you were asking, but they made a big difference for me. I have two, raid0 in my desktop, and a sandforce in my MBP. What a difference. Compiling, linking, copying, everything not just faster, but almost instantaneous. Yum.
I returned it. And before some is implying I am dumb: Yes, I had a fast and quick SSD and my system was setup to use it well.
Also, there really is a difference between SSDs available right now. My Kingston SSDs have blocksizes of 120k (!). My OCZ Vertex2 has blocksize of 4k. Its 4k write speed is off the chart. Like 40x faster than some SSDs.
I'm on OSX (2 cores), Windows (8 cores) and CentOS (4 cores).
#2: MongoDB
#3: iPad
though I have not used them significantly, I have sort of drooled from afar over: Twilio, Redis, Node.js, Clojure and Kindle
(ok some of the above are not super new-new, but new enough to me)