© 2012 Darren DeRidder |
Saturday, December 31, 2011
Monday, December 12, 2011
Thursday, December 8, 2011
Checking In
Hard to believe the month of November flew by without so much as a peep out of 51 Elliot. Between getting my boat put away for the winter, removing stain from my porch and cleaning the wood, spending too many hours on floorplanner.com and various architectural websites, and raking up about 87 bags of autumn leaves, it just happened.
And, instead of posting my usual techo / philosophical points of view, the last couple of months have been mainly a time to sit back and observe. The Occupy movement has been in the news a lot, the OpenMedia.ca campaign in Canada has been building momentum, and businesses of the digital economy are speaking out against the abuse of copyright by media conglomerates as manifest in the much-hated SOPA and Protect-IP proposals. I'm looking forward to seeing how it all plays out, and I hope it results in a better world for everyone. A Christmas wish, a bit early.
I did manage to accumulate a fairly big back log of interesting articles, so here to make up for my recent silence is the second ever web-dump of nifty things I found interesting:
US Big Brother wholesale spying aka. the PATRIOT Act is taking a bite out of the US cloud computing market. Business are choosing not to use the products and services of companies like Microsoft and Amazon, who are bound by the laws of a government that has created what is considered an "indemic surveillance society".
Fabian Pascal has a very good paper on database normalization, integrity and performance.
The first in a series of posts on damn cool algorithms... this one's on BK Trees.
This was the year for Javascript. Javascript on the client, Javascript on the server, everywhere you look Javascript. This is great! Why? Because JavaScript Is Not Java. Thank goodness.
This year Node.js, the server-side Javascript engine based on Google's blazing-fast V8 Javascript engine, took off like wildfire. Node.js modules you should know about is a series of posts on... um, Node.js modules you should know about.
I know that Chrome is what all the cool kids are using. But, given the aforementioned reference to Big Brother, I still use Firefox frequently. For web developers, there are a ton of great web developer plugins for Firefox, and this post covers a half-gazillion of them.
Paper.js is a neat little Javascript graphics library for programmers of neat little Javascript graphics.
Or perhaps you want to try doing face detection in Javascript?
One of my biggest complaints about any library-heavy language is poor curation. Java suffers terribly from this, and so do jQuery and Node.js to a degree. That's why I thought The Hand-picked jQuery Plugins Repo was pretty interesting.
Mozilla Popcorn hasn't been generating the same amount of buzz as some of the other web debutantes, but it looks interesting for the future of web video. In particular the National Film Board's project "One Millionth Tower" is... really cool to watch and play with.
It was about a year ago I predicted a rise in popularity of darknets or mesh networks. So I was delighted to find a solitary article detailing the rise in popularity of darknets. Well, there were a couple, actually. This is going to happen sooner or later because politicians and corporate fascists are too technologically illiterate to understand the way their old-school strategies are pushing new-school innovation forward. As a colleague of mine says, the Internet views censorship as a failure and routes around it.
The JavaScript PC Emulator by Fabrice Bellard is mind-numbingly jaw-droppingly cool. If you're into that sorta thing. Bellard is one amazing researcher.
I really like the Crescent Road House. It's beautiful.
We have it pretty good in Canada. Canadians are officially richer than Americans. We have better privacy laws. We have a great health care system. But, what keeps high tech innovation from happening here on a larger scale. According to this post, it might be because Canadian laws would have made starting up Facebook or Youtube impossible in Canada.
Do you feel like taking a course in Machine Learning from Stanford University? It's free. As should all education be in this information age... and will be. Oops, I guess that's my prediction for this post. Watch for a movement around free higher education based on meritocratic principles.
Oh, here's that other article on the rise of darknets / mesh networks that I was talking about. Why are people doing this? Fear of repression. Yes, even in America, once known as "the land of the free".
How many mobile frameworks could a woodchuck chuck, if a woodchuck could chuck mobile frameworks? He'd chuck all the mobile frameworks on this page and then probably end up using Phonegap.
I can't resist one last JavaScript item, a truly incredible and beautiful work by Mr. Doob... yep, it's three.js. I used to say that web technology was poised to do everything traditional desktop software programming environments could do, with the exception of 3D video games. That is no longer the case. I for one, welcome our new JavaScript overlords!
Happy reading and have a great week.
And, instead of posting my usual techo / philosophical points of view, the last couple of months have been mainly a time to sit back and observe. The Occupy movement has been in the news a lot, the OpenMedia.ca campaign in Canada has been building momentum, and businesses of the digital economy are speaking out against the abuse of copyright by media conglomerates as manifest in the much-hated SOPA and Protect-IP proposals. I'm looking forward to seeing how it all plays out, and I hope it results in a better world for everyone. A Christmas wish, a bit early.
I did manage to accumulate a fairly big back log of interesting articles, so here to make up for my recent silence is the second ever web-dump of nifty things I found interesting:
US Big Brother wholesale spying aka. the PATRIOT Act is taking a bite out of the US cloud computing market. Business are choosing not to use the products and services of companies like Microsoft and Amazon, who are bound by the laws of a government that has created what is considered an "indemic surveillance society".
Fabian Pascal has a very good paper on database normalization, integrity and performance.
The first in a series of posts on damn cool algorithms... this one's on BK Trees.
This was the year for Javascript. Javascript on the client, Javascript on the server, everywhere you look Javascript. This is great! Why? Because JavaScript Is Not Java. Thank goodness.
This year Node.js, the server-side Javascript engine based on Google's blazing-fast V8 Javascript engine, took off like wildfire. Node.js modules you should know about is a series of posts on... um, Node.js modules you should know about.
I know that Chrome is what all the cool kids are using. But, given the aforementioned reference to Big Brother, I still use Firefox frequently. For web developers, there are a ton of great web developer plugins for Firefox, and this post covers a half-gazillion of them.
Paper.js is a neat little Javascript graphics library for programmers of neat little Javascript graphics.
Or perhaps you want to try doing face detection in Javascript?
One of my biggest complaints about any library-heavy language is poor curation. Java suffers terribly from this, and so do jQuery and Node.js to a degree. That's why I thought The Hand-picked jQuery Plugins Repo was pretty interesting.
Mozilla Popcorn hasn't been generating the same amount of buzz as some of the other web debutantes, but it looks interesting for the future of web video. In particular the National Film Board's project "One Millionth Tower" is... really cool to watch and play with.
It was about a year ago I predicted a rise in popularity of darknets or mesh networks. So I was delighted to find a solitary article detailing the rise in popularity of darknets. Well, there were a couple, actually. This is going to happen sooner or later because politicians and corporate fascists are too technologically illiterate to understand the way their old-school strategies are pushing new-school innovation forward. As a colleague of mine says, the Internet views censorship as a failure and routes around it.
The JavaScript PC Emulator by Fabrice Bellard is mind-numbingly jaw-droppingly cool. If you're into that sorta thing. Bellard is one amazing researcher.
I really like the Crescent Road House. It's beautiful.
We have it pretty good in Canada. Canadians are officially richer than Americans. We have better privacy laws. We have a great health care system. But, what keeps high tech innovation from happening here on a larger scale. According to this post, it might be because Canadian laws would have made starting up Facebook or Youtube impossible in Canada.
Do you feel like taking a course in Machine Learning from Stanford University? It's free. As should all education be in this information age... and will be. Oops, I guess that's my prediction for this post. Watch for a movement around free higher education based on meritocratic principles.
Oh, here's that other article on the rise of darknets / mesh networks that I was talking about. Why are people doing this? Fear of repression. Yes, even in America, once known as "the land of the free".
How many mobile frameworks could a woodchuck chuck, if a woodchuck could chuck mobile frameworks? He'd chuck all the mobile frameworks on this page and then probably end up using Phonegap.
I can't resist one last JavaScript item, a truly incredible and beautiful work by Mr. Doob... yep, it's three.js. I used to say that web technology was poised to do everything traditional desktop software programming environments could do, with the exception of 3D video games. That is no longer the case. I for one, welcome our new JavaScript overlords!
Happy reading and have a great week.
Tuesday, October 11, 2011
Wednesday, September 28, 2011
Monday, September 19, 2011
Himeji-jo Corridor
Himeji-jo Corridor
© 2010 Darren DeRidder. Originally uploaded by soto voce
A room within one of the outer walls of Himeji Castle, Himeji, Japan.
Tuesday, September 13, 2011
Himeji-jo no Kabe
Himeji-jo no Kabe
© 2010 Darren DeRidder. Originally uploaded by soto voce
Himeji castle wall, Himeji, Japan
Monday, September 5, 2011
Japanese Craftsmanship
In his wonderful and comprehensive book, "Japanese Homes and Their Surroundings", first published in 1885 and now available from Google Books, Edward S. Morse writes the following delightful description of Japanese home-building craftsmanship.
Within these houses there are often to be seen marvels of exquisite carving, and the perfection of cabinet work; and surprise follows surprise, as one becomes more fully acquainted with the interior finish of these curious and remarkable dwellings.
... as to altering the present plan of housebuilding... If such changes are effected, then will perish many of the best features of true Japanese art, which has been the surprise and admiration of Western nations, and of which in the past they have been the unwitting cause of modification and degradation it has already undergone.
A somewhat extended experience with the common everyday carpenter at home leads me to say, without fear of contradiction, that in matters pertaining to their craft the Japanese carpenters are superior to American. Not only do they show their superiority in their work, but in their versatile ability in making new things. It is a notorious fact that most of the carpenters in our smaller towns and villages are utterly incompetent to carry out any special demand made upon them, outside the building of the conventional two-storied house and ordinary roof. They stand bewildered in the presence of a window-projection or cornice outside the prescribed ruts with which they and their fathers were familiar. Indeed, in most cases their fathers were not carpenters, nor will their children be; and herein alone the Japanese carpenter has an immense advantage over the American, for his trade, as well as other trades, have been perpetuated through generations of families. The little children have been brought up amidst the odor of fragrant shavings, -- have with childish hands performed the duties of an adjustable vice or clamp; and with the same tools which when children they have handed to their fathers, they have in later days earned their daily rice.
When I see one of our carpenters' ponderous tool-chests, made of polished woods, inlaid with brass decorations, and filled to repletion with several hundred dollars' worth of highly polished and elaborate machine-made implements, and contemplate the work done with them, -- with everything binding that should go loose, and everything rattling that should be tight, and much work that has to be done twice over, with an indication everywhere of a poverty of ideas, -- and then recall the Japanese carpenter with his ridiculously lights and flimsy tool-box containing a meager assortment of rude and primitive tools, -- considering the carpentry of the two people, I am forced to the conviction that civilization and modern appliances count as nothing unless accompanied with a moiety of brains and some little taste and wit.
It is a very serious fact that now-a-days no one in our country is acquiring faithfully the carpenter's trade. Much of this lamentable condition of things is no doubt due to the fact that machine-work has supplanted the hand-work of former times. Doors, blinds, sashes, mouldings are now turned out by the cord and mile, and all done in such greedy haste, and with the greenest of lumber, that if it does not tumble to pieces in transportation it is sure to do so very soon after entering into the house-structure. Nevertheless, the miserable truth yet remains that any man who has nailed up a few boxes, or stood in front of a circular saw for a few months, feels competent to exercise all the duties of that most honorable craft, -- the building of a house.
Sunday, September 4, 2011
Thursday, August 4, 2011
Monday, July 25, 2011
Friday, July 22, 2011
jQuery, Data-link, Knockout.JS and Microsoft
In may 2010 Microsoft contributed the template and datalink plugins to jQuery. The announcement was made on Scott Guthrie's blog:
http://weblogs.asp.net/scottgu/archive/2010/05/07/jquery-templates-and-data-linking-and-microsoft-contributing-to-jquery.aspx
On October 4 Scott G, Boris Moore and John Resig all announced these as official jQuery plugins.
http://www.borismoore.com/2010/10/jquery-templates-is-now-official-jquery.htmlhttp://blog.jquery.com/2010/10/04/new-official-jquery-plugins-provide-templating-data-linking-and-globalization/
http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization-accepted-as-official-jquery-plugins.aspx
One of the comments in Scott's post suggested that his team should be working with Steve Sanderson as well. Sanderson is the guy behind the Knockout.js templating and data-binding library.
http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization-accepted-as-official-jquery-plugins.aspx#7624049
In November 2011 Steve Sanderson announced he was joining Microsoft's ASP .NET team in the Web Platform and Tools (WPT) Developer Division. http://blog.stevensanderson.com/2010/11/
From this, and taken together with their recent Windows 8 preview, it appears that Microsoft has an interest in promoting advance templating and data-binding for application development on the web stack of Javascript / HTML / CSS, and may put their weight behind Knockout.JS in spite of the "official" status of the jQuery Templates and Data-Link plugins.
There is significant overlap between these libraries. In fact, Knockout.JS works closely with the jQuery Template plugin. However, it provides features that are missing from the jQuery data-link plugin and seems more well-suited to the new features of HTML5. It looks like Knockout.JS used together with jQuery Templates could become a leading contender in client side templating, with jQuery and Microsoft's support.
There are many others that also look promising, including AngularJS, BackboneJS, and some that are still in development such as batman.js from Shopify. It will be interesting to see how these shake out over the next year or so.
http://weblogs.asp.net/scottgu/archive/2010/05/07/jquery-templates-and-data-linking-and-microsoft-contributing-to-jquery.aspx
On October 4 Scott G, Boris Moore and John Resig all announced these as official jQuery plugins.
http://www.borismoore.com/2010/10/jquery-templates-is-now-official-jquery.htmlhttp://blog.jquery.com/2010/10/04/new-official-jquery-plugins-provide-templating-data-linking-and-globalization/
http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization-accepted-as-official-jquery-plugins.aspx
One of the comments in Scott's post suggested that his team should be working with Steve Sanderson as well. Sanderson is the guy behind the Knockout.js templating and data-binding library.
http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization-accepted-as-official-jquery-plugins.aspx#7624049
In November 2011 Steve Sanderson announced he was joining Microsoft's ASP .NET team in the Web Platform and Tools (WPT) Developer Division. http://blog.stevensanderson.com/2010/11/
From this, and taken together with their recent Windows 8 preview, it appears that Microsoft has an interest in promoting advance templating and data-binding for application development on the web stack of Javascript / HTML / CSS, and may put their weight behind Knockout.JS in spite of the "official" status of the jQuery Templates and Data-Link plugins.
There is significant overlap between these libraries. In fact, Knockout.JS works closely with the jQuery Template plugin. However, it provides features that are missing from the jQuery data-link plugin and seems more well-suited to the new features of HTML5. It looks like Knockout.JS used together with jQuery Templates could become a leading contender in client side templating, with jQuery and Microsoft's support.
There are many others that also look promising, including AngularJS, BackboneJS, and some that are still in development such as batman.js from Shopify. It will be interesting to see how these shake out over the next year or so.
Wednesday, July 20, 2011
Thursday, July 7, 2011
Selenium IDE Sideflow Update 1
Once again, for your development pleasure, ladies and gentlemen, the famous Sideflow plugin for Selenium IDE! Goto and while loops performed in Selenium, before your very eyes.
Some people were having a bit of trouble getting started, so I've updated the demo test for Sideflow (Selenium IDE flow control extension) to use the latest Selenese commands.
What's changed: no more direct access to 'storedVars'. No more 'getEval'... uses 'runScript' instead. Need to do some weird casting to perform counter increments.
The github repo is over here. Everybody git on board the github train!
PS. You can find the original post here.
Some people were having a bit of trouble getting started, so I've updated the demo test for Sideflow (Selenium IDE flow control extension) to use the latest Selenese commands.
What's changed: no more direct access to 'storedVars'. No more 'getEval'... uses 'runScript' instead. Need to do some weird casting to perform counter increments.
The github repo is over here. Everybody git on board the github train!
PS. You can find the original post here.
Wednesday, July 6, 2011
Spinnaker Set
We pulled off a perfect spinnaker set with a crew of first-time sailors, Canada Day long weekend. The weather couldn't have been more perfect!
Flying the spinnaker is challenging, and doing it with a crew of brand new sailors was interesting. There's a real art to skippering a boat and helping the crew learn the ropes. It's definitely taught me a lot about patience and leadership.
Flying the spinnaker is challenging, and doing it with a crew of brand new sailors was interesting. There's a real art to skippering a boat and helping the crew learn the ropes. It's definitely taught me a lot about patience and leadership.
Monday, July 4, 2011
A simple introduction to TDD with Expresso in NodeJS
In the last post we made a super simple NodeJS module called hello.js and used it in app.js. We can make it better, and test it with Expresso.
First we can add to the awesomeness of hello.js by adding a farewell function, so it can say both "hello" and "goodbye".
So now our module can say hello, and bid farewell. It exports the "greet" and "leave" functions, which we can use from app.js like so:
Notice that I moved hello.js into a new directory called "lib", which is why the require statement now says "require('./lib/hello.js')".
Now suppose we want to test this module using expresso. Since expresso is a command-line utility, we should install it globally:
Now we can write a test. First we make a "test" directory and then create a file called "hello.test.js".
This just requires node's built-in "assert" module for unit testing, plus our hello.js module that we want to test. Then, it defines a test to make sure that when we call "greet()", the response is "Hello World!". Alright! Now we can go back to the parent directory (where app.js lives) and run expresso. We tell it to look in the "lib" directory for hello.js. Expresso already knows to look in the "test" directory for tests, and will run everything it finds there.
Cool. It tells us we haven't tested the part about leaving with a farewell. All we have to do if we want 100% code coverage is to define a test for "leave":
And now when we run expresso again, we should have 100% code coverage.
Cool, eh?
Expresso offers several other assert functions that you can find in the documentation here: http://visionmedia.github.com/expresso/.
First we can add to the awesomeness of hello.js by adding a farewell function, so it can say both "hello" and "goodbye".
// hello.js var greeting="Hello World!"; var farewell="Goodbye Cruel World!"; var greet = function(){ return greeting; }; var leave = function() { return farewell; }; exports.greet = greet; exports.leave = leave;
So now our module can say hello, and bid farewell. It exports the "greet" and "leave" functions, which we can use from app.js like so:
// app.js var hello=require('./lib/hello.js'); console.log(hello.greet()); console.log(hello.leave());
Notice that I moved hello.js into a new directory called "lib", which is why the require statement now says "require('./lib/hello.js')".
Now suppose we want to test this module using expresso. Since expresso is a command-line utility, we should install it globally:
npm install -g expresso
Now we can write a test. First we make a "test" directory and then create a file called "hello.test.js".
mkdir test vi test/hello.test.js
// test/hello.test.js var assert = require('assert'), hello = require('hello.js); module.exports = { 'greet()': function() { assert.equal('Hello World!', hello.greet()); } };
This just requires node's built-in "assert" module for unit testing, plus our hello.js module that we want to test. Then, it defines a test to make sure that when we call "greet()", the response is "Hello World!". Alright! Now we can go back to the parent directory (where app.js lives) and run expresso. We tell it to look in the "lib" directory for hello.js. Expresso already knows to look in the "test" directory for tests, and will run everything it finds there.
$ expresso -I lib %100 1 testsWonderful. Only, we didn't test the part where we say goodbye. Expresso has built-in code coverage reporting that we can enable with the "-c" flag:
$ expresso -I lib -c Test Coverage +------------------------------------------+----------+------+------+--------+ | filename | coverage | LOC | SLOC | missed | +------------------------------------------+----------+------+------+--------+ | hello.js | 87.50 | 10 | 8 | 1 | +------------------------------------------+----------+------+------+--------+ | 87.50 | 10 | 8 | 1 | +----------+------+------+--------+ hello.js: 1 | 1 | var greeting = "Hello World!"; 2 | 1 | var farewell = "Goodbye Cruel World!"; 3 | 1 | var greet = function() { 4 | 1 | return greeting; 5 | | }; 6 | 1 | var leave = function() { 7 | 0 | return farewell; 8 | | }; 9 | 1 | exports.greet = greet; 10 | 1 | exports.leave = leave;
Cool. It tells us we haven't tested the part about leaving with a farewell. All we have to do if we want 100% code coverage is to define a test for "leave":
// test/hello.test.js var assert = require('assert'), hello = require('hello.js'); module.exports = { 'greet()': function() { assert.equal('Hello World!', hello.greet()); }, 'leave()': function() { assert.equal('Goodbye Cruel World!', hello.leave()); } };
And now when we run expresso again, we should have 100% code coverage.
$ expresso -I lib -c Test Coverage +------------------------------------------+----------+------+------+--------+ | filename | coverage | LOC | SLOC | missed | +------------------------------------------+----------+------+------+--------+ | hello.js | 100.00 | 10 | 8 | 0 | +------------------------------------------+----------+------+------+--------+ | 100.00 | 10 | 8 | 0 | +----------+------+------+--------+ hello.js: 1 | 1 | var greeting = "Hello World!"; 2 | 1 | var farewell = "Goodbye Cruel World!"; 3 | 1 | var greet = function() { 4 | 1 | return greeting; 5 | | }; 6 | 1 | var leave = function() { 7 | 1 | return farewell; 8 | | }; 9 | 1 | exports.greet = greet; 10 | 1 | exports.leave = leave;
Cool, eh?
Expresso offers several other assert functions that you can find in the documentation here: http://visionmedia.github.com/expresso/.
Sunday, July 3, 2011
A simple intro to NodeJS modules
In preparation for an upcoming workshop at Shad Valley on NodeJS, I tried to come up with some simple examples of the CommonJS module system in NodeJS. Felix Geisendörfer has a similar "hello world" example in his Node.js Beginner Guide. I've put the main concepts into a short tutorial. We start with one line of Javascript, and turn it into a working NodeJS module.
Assuming you have node installed, you can run "node" from the command line to get the REPL (ie. node shell).
Wonderful. How about putting this in a file?
Then run:
Also wonderful. Then, how about making an application that includes hello.js? Let's call it app.js. Here are the two files:
Now we can run it like this.
Again wonderful. We've written a module. Not a very fancy one, but it's a start. Now, as an aside, suppose we want to run app.js like a shell script, without specifying "node" on the command line all the time? Simply add the node command to the app.js script:
Oh, and make it executable.
Now we can run it like so:
Now we can begin having fun. The thing about modules is that whatever you declare in the module (hello.js) is local to that module. If you want to use it externally, you have to add it to the special variable "exports":
This accomplishes the same thing, but take note of a couple things. First, "var greeting" is not available outside of the hello.js file. The function "greet" is available though, because we added it to exports. So that's how you get variables, functions and objects to be available from your module. Easy peasy.
Assuming you have node installed, you can run "node" from the command line to get the REPL (ie. node shell).
$ node > console.log("Hello World!"); Hello World!
Wonderful. How about putting this in a file?
// hello.js console.log("Hello World!")
Then run:
$ node hello.js Hello World!
Also wonderful. Then, how about making an application that includes hello.js? Let's call it app.js. Here are the two files:
// app.js require('./hello.js');
// hello.js console.log("Hello World!");
Now we can run it like this.
$ node app.js Hello World!
Again wonderful. We've written a module. Not a very fancy one, but it's a start. Now, as an aside, suppose we want to run app.js like a shell script, without specifying "node" on the command line all the time? Simply add the node command to the app.js script:
#!/usr/bin/env node // app.js require('./hello.js');
Oh, and make it executable.
chmod u+x app.js
Now we can run it like so:
$ ./app.js Hello World!
Now we can begin having fun. The thing about modules is that whatever you declare in the module (hello.js) is local to that module. If you want to use it externally, you have to add it to the special variable "exports":
// hello.js var greeting = "Hello World!"; var greet = function() { console.log(greeting); } exports.greet = greet;
#!/usr/bin/env node // app.js var mygreet = require('./hello.js').greet; mygreet();
This accomplishes the same thing, but take note of a couple things. First, "var greeting" is not available outside of the hello.js file. The function "greet" is available though, because we added it to exports. So that's how you get variables, functions and objects to be available from your module. Easy peasy.
Saturday, June 11, 2011
Smile
Reading articles on multi-core scaling while listening to a new track from Jamiroquai - "Smile" - available as a download from http://soundcloud.com/jamiroquai1/jamiroquai-smile. It's pretty good - even if you're not into software design for multi-core, multi-cpu computer architectures. :-)
Wednesday, June 1, 2011
Windows 8 gets on the Web Stack Bandwagon
I'm a Mac / Linux guy, but it's good to see Microsoft putting some serious work into the user experience in the Windows 8 preview. What's cool about the video on that link is that they've also seen the light when it comes to the developer experience, paving the way for rapid application development by leveraging the web stack of HTML5 and JavaScript. A long way back I wrote about "Gödel, Escher, Bach" to explore the link between artistic creativity and great engineering work - how a love of technical complexity drives some developers, compared to a love of elegance and simplicity that drives another kind of developer. While technical complexity enamors the uber-geek, artists are inspired by technology that gets out of the way and allows them to do what they do best - create stuff. Even though a web stack wouldn't be my first choice for some kinds of apps, it's just fine for a whole lot of them, and when it comes to rapid application development its way, way up high on the list of best options.
It seems like in the midst of Apple's incredible growth in the mobile, laptop, and tablet space there's been a lot of soul-searching going on at companies like Nokia, Microsoft, RIM, and many others. A dominant theme that keeps coming up is "simplicity". For example, see "Why Dropbox beat Syncplicity". By embracing web technologies for app development Microsoft is taking a forward-looking step towards simplicity in application development. Hopefully this means standards-based web technologies and not the embrace-and-extend, proprietary model we have come to expect from Microsoft.
Things all seem to be moving in this direction. RIM has a platform for building apps on web standards for the Blackberry. The iPhone has had "web apps" for a long time. And recently I've run into more people who are excited about Nitobi's PhoneGap, a technology I reviewed a few months ago (PhoneGap and jQuery Mobile First Impressions) which let's you build apps for 6 different smartphone platforms using standard web technologies
I think I just set a record for cross-linking to my own posts! To make up for it next time I'll post a bunch of external links to cool stuff from the interwebs.
It seems like in the midst of Apple's incredible growth in the mobile, laptop, and tablet space there's been a lot of soul-searching going on at companies like Nokia, Microsoft, RIM, and many others. A dominant theme that keeps coming up is "simplicity". For example, see "Why Dropbox beat Syncplicity". By embracing web technologies for app development Microsoft is taking a forward-looking step towards simplicity in application development. Hopefully this means standards-based web technologies and not the embrace-and-extend, proprietary model we have come to expect from Microsoft.
Things all seem to be moving in this direction. RIM has a platform for building apps on web standards for the Blackberry. The iPhone has had "web apps" for a long time. And recently I've run into more people who are excited about Nitobi's PhoneGap, a technology I reviewed a few months ago (PhoneGap and jQuery Mobile First Impressions) which let's you build apps for 6 different smartphone platforms using standard web technologies
I think I just set a record for cross-linking to my own posts! To make up for it next time I'll post a bunch of external links to cool stuff from the interwebs.
Monday, May 16, 2011
get path in bash
When running a bash shell you might want to find files and directories relative to the path of the script. The use of 'pwd' in this case can lead to problems if the script has been run from another directory. What you need is the absolute path of the script being executed. Here's an example of how to do it. This works on most Linuxes but unfortunately is not supported on Mac OSX.
Saturday, April 23, 2011
Map Reduce in JS
Joel Spolsky's piece "Can Your Programming Language Do This?" was an enjoyable read for three reasons: 1) he provides some clear, simple examples of map/reduce and anonymous functions, 2) he shows how these are natively supported in JavaScript (actually there is even more and better support for Map/Reduce in JavaScript than he describes) and 3) he hints (link to related article) at why Java is a mediocre language that produces mediocre software. Originally posted in 2006 it generated a big buzz on HN this morning and is more timely now than ever, considering the groundswell of support and innovation around JavaScript in the upcoming generation of web-scale programmers.
Those who follow the bleeding edge of software development today know that in the last two years there has been a Cambrian explosion of innovation and creativity related to JavaScript as a serious, server-side programming language. It may not be a stretch to say that a majority of the software people interact with today is powered by JavaScript, considering the ubiquity of web-based applications. With the increasing prevalence of JSON as a data interchange format, the advent of high-performance server-side JavaScript engines, and non-relational data-stores that speak JSON natively, there is now, for the first time, a homogeneous software ecosystem that spans the N-tier distributed architecture. It seems this post from 2006 was prescient in it's discussion of the language's capabilities and potential.
A good post that hits three of my favorite birds with one stone, and an excellent cup of Francesco's dark roast on a rainy Saturday morning while listening to the Isbells.
Those who follow the bleeding edge of software development today know that in the last two years there has been a Cambrian explosion of innovation and creativity related to JavaScript as a serious, server-side programming language. It may not be a stretch to say that a majority of the software people interact with today is powered by JavaScript, considering the ubiquity of web-based applications. With the increasing prevalence of JSON as a data interchange format, the advent of high-performance server-side JavaScript engines, and non-relational data-stores that speak JSON natively, there is now, for the first time, a homogeneous software ecosystem that spans the N-tier distributed architecture. It seems this post from 2006 was prescient in it's discussion of the language's capabilities and potential.
A good post that hits three of my favorite birds with one stone, and an excellent cup of Francesco's dark roast on a rainy Saturday morning while listening to the Isbells.
Friday, April 22, 2011
Virtual Chior 2.0 "Sleep"
The previously mentioned production of Eric Whitacre's Virtual Chior 2.0 performance of "Sleep", previewed recently at TED, has been posted on Youtube. A brilliant collaboration of more than 2000 singers from around the world participating in a virtual choir.
Tuesday, April 5, 2011
2000 Voices
One of my top 10 albums of 2010 was Eric Whitacre's Cloudburst. TED has just released a talk by Eric Whitacre featuring the amazing 2000-voice virtual choir singing two of the songs featured on the album. It's definitely worth checking out.
Incidentally, I was at a meeting of high-tech entrepreneurs this evening, and in a very interesting conversation with a high-tech company founder who shares a background in classical music, was told that musical training, and piano in particular, often results in highly analytical thinking. As an engineer with a background in music, I've always felt a strong connection between musical composition and technical design, but have never been able to say exactly what it is. This video really seems to find itself right at home in the intersection of artistic creativity and technical innovation.
Incidentally, I was at a meeting of high-tech entrepreneurs this evening, and in a very interesting conversation with a high-tech company founder who shares a background in classical music, was told that musical training, and piano in particular, often results in highly analytical thinking. As an engineer with a background in music, I've always felt a strong connection between musical composition and technical design, but have never been able to say exactly what it is. This video really seems to find itself right at home in the intersection of artistic creativity and technical innovation.
Saturday, March 26, 2011
Friday, March 11, 2011
Thursday, March 10, 2011
Omar
Prayer for Omar by darrenderidder
Here's a short composition I wrote using Omnisphere, a virtual synthesizer. It's basically a meditation on making a choice between two different mindsets: forgiveness, reconciliation, and respect for human dignity... versus fear, bitterness, vindictiveness and disregard for human rights. The song is meant to be a musical expression of the first mindset.
Here's a short composition I wrote using Omnisphere, a virtual synthesizer. It's basically a meditation on making a choice between two different mindsets: forgiveness, reconciliation, and respect for human dignity... versus fear, bitterness, vindictiveness and disregard for human rights. The song is meant to be a musical expression of the first mindset.
Monday, February 28, 2011
C++ STL Manpages
Do man pages exist for the C++ STL library? Yes they do, and here they are.
ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/
ftp://gcc.gnu.org/pub/gcc/libstdc++/doxygen/
libstdc++-man.4.4.0.tar.bz2. . . Apr 21 2009 360K
Tuesday, February 22, 2011
Phonegap and jQuery Mobile First Impressions
This past long weekend I decided to spend some time getting familiar with PhoneGap and jQuery Mobile. After a couple of afternoons spent in coffee shops, walking through the learning curve and experimenting, I had a working app installed on my iPhone. Not the most polished piece of boilerplate, but enough to show off to some friends, who were duly impressed.
These are my first impressions after muddling around with it for a while.
Why PhoneGap?
PhoneGap is one of several platforms that aim to make developing cross-platform mobile apps possible, and easy. It does this by wrapping a mobile web app in a stand-alone application that provides wrappers for the phone's native APIs, including accelerometer, sound, vibration, media, geolocation, camera and local storage. PhoneGap targets a large number of mobile platforms including Android, iPhone, Blackberry, Palm, Symbian and WebOS. It uses straightforward markup, script and stylesheets to build the application. Some of the native look and feel is sacrificed for the benefit of an application that runs the same on all these different devices.
PhoneGap doesn't provide a JS framework
Although PhoneGap gives you a convenient way to bundle a web app as a native app, and hooks into the devices native APIs, you are totally on your own with respect to what web-app framework you use, if any. I started out writing raw HTML, CSS and JavaScript and soon realized that I wanted a framework. I tried out both jqtouch and jQuery Mobile with mixed results.
Start with your web app
I could have saved a lot of time if I had started out just writing my app as a straight web app, and then transitioned it into PhoneGap after the main boilerplate was done. Bearing in mind that PhoneGap is akin to a browser reading files off local disk, its necessary to structure the code accordingly. For example, jQuery Mobile converts hyperlinks to AJAX requests with callbacks that are handled by with animated page transitions. This works great if the link is another page served over HTTP, but it didn't work for reading files off the local disk. As a result, all the markup for my app resides in a single file. This is just a constraint of using jQuery Mobile on PhoneGap, at least for the time being.
jQuery Mobile Impression
jQuery Mobile is currently an alpha release, so its not fair to be too critical of it yet. But it is fair to say that it's not production-ready. It tries to be clever with its navigation and often ends up getting lost. Errors are not handled graciously. Some advertised features, like fixed toolbars, simply don't work reliably enough to use. That being said, if you take a look at the excellent jQuery Mobile demo page, and see everything you need to build your app and can stay within those limits, it should work well.
jqtouch impression
jqtouch has a bit less in the way of features compared to jQuery Mobile, but it seems more polished. The look and feel (both the default "dark" theme and the alternate "apple" theme) show a great level of attention to detail. Seeing as it comes from Sencha Labs, this is not too surprising.
Sencha Touch
Sencha Touch is both polished and feature-rich. Based on my experience with jQuery Mobile and jqtouch, Sencha will probably be my choice next time. Check out some of the demo apps at sencha.com and you get an idea of just how far the mobile web-stack has come.
Don't fight the framework
With both jqtouch and jQuery Mobile, I tried to go beyond what you can see in the demo page, and quickly found myself fighting with the framework more than it was actually helping me. I started to make progress when I gave up on my fixed idea of how I wanted things to work and let the framework dictate my design. For example, I had to use a navigation bar at the top of the page, because a fixed navigation bar at the bottom of the page was too buggy. This is a problem that Sencha Touch seems to have fixed, and one of the reasons I'd probably choose it next time.
PhoneGap Simulator
For testing while developing, I just opened my app in Safari. It can render all the page transformations and gives you a pretty close approximation of what you'll see on the iPhone. There is also a PhoneGap Simulator, an Adobe AIR application that runs on Windows, Mac and 32-bit Linux. I had problems with an early version downloaded from the author's blog, but there's an updated version known as the Sony Ericsson PhoneGap Simulator (v.1.3.0), downloadable from Softpedia.com. It comes with skins for several different smartphones and goes beyond other simulators by providing a 3D model that you can manipulate to test the accelerometer, although it doesn't allow you to test all the native features wrapped by PhoneGap like the camera and local media.
Other Options
Appcelerator is a recent addition to the cross-platform mobile framework field, and although it only supports iPhone and Android at this time, it looks promising. The unique advantage it offers is that provides access to the native user interface, so your application can be written in JavaScript and still run native widgets on the device, together with content rendered by the Webkit engine. At first glance it seems extremely well put together and comes highly recommended from some pretty happenin' web dev folks.
These are my first impressions after muddling around with it for a while.
Why PhoneGap?
PhoneGap is one of several platforms that aim to make developing cross-platform mobile apps possible, and easy. It does this by wrapping a mobile web app in a stand-alone application that provides wrappers for the phone's native APIs, including accelerometer, sound, vibration, media, geolocation, camera and local storage. PhoneGap targets a large number of mobile platforms including Android, iPhone, Blackberry, Palm, Symbian and WebOS. It uses straightforward markup, script and stylesheets to build the application. Some of the native look and feel is sacrificed for the benefit of an application that runs the same on all these different devices.
PhoneGap doesn't provide a JS framework
Although PhoneGap gives you a convenient way to bundle a web app as a native app, and hooks into the devices native APIs, you are totally on your own with respect to what web-app framework you use, if any. I started out writing raw HTML, CSS and JavaScript and soon realized that I wanted a framework. I tried out both jqtouch and jQuery Mobile with mixed results.
Start with your web app
I could have saved a lot of time if I had started out just writing my app as a straight web app, and then transitioned it into PhoneGap after the main boilerplate was done. Bearing in mind that PhoneGap is akin to a browser reading files off local disk, its necessary to structure the code accordingly. For example, jQuery Mobile converts hyperlinks to AJAX requests with callbacks that are handled by with animated page transitions. This works great if the link is another page served over HTTP, but it didn't work for reading files off the local disk. As a result, all the markup for my app resides in a single file. This is just a constraint of using jQuery Mobile on PhoneGap, at least for the time being.
jQuery Mobile Impression
jQuery Mobile is currently an alpha release, so its not fair to be too critical of it yet. But it is fair to say that it's not production-ready. It tries to be clever with its navigation and often ends up getting lost. Errors are not handled graciously. Some advertised features, like fixed toolbars, simply don't work reliably enough to use. That being said, if you take a look at the excellent jQuery Mobile demo page, and see everything you need to build your app and can stay within those limits, it should work well.
jqtouch impression
jqtouch has a bit less in the way of features compared to jQuery Mobile, but it seems more polished. The look and feel (both the default "dark" theme and the alternate "apple" theme) show a great level of attention to detail. Seeing as it comes from Sencha Labs, this is not too surprising.
Sencha Touch
Sencha Touch is both polished and feature-rich. Based on my experience with jQuery Mobile and jqtouch, Sencha will probably be my choice next time. Check out some of the demo apps at sencha.com and you get an idea of just how far the mobile web-stack has come.
Don't fight the framework
With both jqtouch and jQuery Mobile, I tried to go beyond what you can see in the demo page, and quickly found myself fighting with the framework more than it was actually helping me. I started to make progress when I gave up on my fixed idea of how I wanted things to work and let the framework dictate my design. For example, I had to use a navigation bar at the top of the page, because a fixed navigation bar at the bottom of the page was too buggy. This is a problem that Sencha Touch seems to have fixed, and one of the reasons I'd probably choose it next time.
PhoneGap Simulator
For testing while developing, I just opened my app in Safari. It can render all the page transformations and gives you a pretty close approximation of what you'll see on the iPhone. There is also a PhoneGap Simulator, an Adobe AIR application that runs on Windows, Mac and 32-bit Linux. I had problems with an early version downloaded from the author's blog, but there's an updated version known as the Sony Ericsson PhoneGap Simulator (v.1.3.0), downloadable from Softpedia.com. It comes with skins for several different smartphones and goes beyond other simulators by providing a 3D model that you can manipulate to test the accelerometer, although it doesn't allow you to test all the native features wrapped by PhoneGap like the camera and local media.
Other Options
Appcelerator is a recent addition to the cross-platform mobile framework field, and although it only supports iPhone and Android at this time, it looks promising. The unique advantage it offers is that provides access to the native user interface, so your application can be written in JavaScript and still run native widgets on the device, together with content rendered by the Webkit engine. At first glance it seems extremely well put together and comes highly recommended from some pretty happenin' web dev folks.
Thursday, February 10, 2011
Human Tech
Software engineering should not be about getting humans to become more technical. It should be about getting technology to become more human.
http://www.spokeo.com/blog/2010/09/technology-becomes-more-human/
http://www.spokeo.com/blog/2010/09/technology-becomes-more-human/
Tuesday, February 8, 2011
jQuery on the Command Line
This is too cool... A Jquery command line interface. TJ Holowaychuk posted it to his git repo last night.
https://github.com/visionmedia/query
Example:
$ curl http://twitter.com | query logging img attr alt
Twitter
https://github.com/visionmedia/query
Example:
$ curl http://twitter.com | query logging img attr alt
Tell CRTC to Reverse UBB
The CRTC is soliciting input from Canadians on anti-competitive Usage Based Billing practices by Bell, Rogers, and other incumbent ISPs. The Open Media group has a convenient online form letter that you can submit to the CRTC.
http://openmedia.ca/crtc
Go the Open Media page and let your voice be heard by the CRTC!
When I wrote that "dumb is the new smart" in December, predicting that consumers would demand dumb pipes, it was before the FCC ruling on the merger of Comcast & NBC and the CRTC 2011-44 decision.
That CRTC ruling and subsequent public uproar has brought the issue to a head faster than I imagined. Alas it seems that big ISPs like Bell and Rogers don't get it yet, but a lot of Canadians seem to think that dumb pipes are a smart choice. Yay! They're demanding it loudly, even if the big incumbent ISPs were too slow to see it coming.
http://openmedia.ca/crtc
Go the Open Media page and let your voice be heard by the CRTC!
When I wrote that "dumb is the new smart" in December, predicting that consumers would demand dumb pipes, it was before the FCC ruling on the merger of Comcast & NBC and the CRTC 2011-44 decision.
That CRTC ruling and subsequent public uproar has brought the issue to a head faster than I imagined. Alas it seems that big ISPs like Bell and Rogers don't get it yet, but a lot of Canadians seem to think that dumb pipes are a smart choice. Yay! They're demanding it loudly, even if the big incumbent ISPs were too slow to see it coming.
Sunday, February 6, 2011
Saturday, February 5, 2011
Tuesday, February 1, 2011
Petition Anti-competitive Internet Fees in Canada
Canadian ISPs want to charge you so much for Internet usage that it would be cheaper and faster to buy the most expensive solid-state hard drives and ship them across the country than it would be to download the same data online. Sign the petition against Usage Based Billing.
Friday, January 28, 2011
Why Dropbox Beat Syncplicity
If you follow this blog you know I'm a big fan of simplicity in design. Most software development is rife with complexity, and a lot of developers just love to wallow in it. It's a good recipe for Epic Fail.
Isaac Hall addresses this in a great post on why Dropbox beat it's competitors, summarized by Graham Wetzler. It echoes similar stories on the reasons for Facebook's displacement of MySpace. The idea that "features equals power" is a myth. As Paul Graham said, power is the result of conciseness. More programmers need to get this.
Syncplicity lacked simplicity. Anyways, good read.
[via HN]
Isaac Hall addresses this in a great post on why Dropbox beat it's competitors, summarized by Graham Wetzler. It echoes similar stories on the reasons for Facebook's displacement of MySpace. The idea that "features equals power" is a myth. As Paul Graham said, power is the result of conciseness. More programmers need to get this.
Syncplicity lacked simplicity. Anyways, good read.
[via HN]
Subscribe to:
Posts (Atom)
Productivity and Note-taking
I told a friend of mine that I wasn't really happy with the amount of time that gets taken up by Slack and "communication and sched...
-
Update : Here are slides for this talk at OttawaJS: " Node.JS Module Patterns Using Simple Examples ". Update 2 : More Node.JS M...
-
tldr; https://github.com/73rhodes/sideflow This extension provides goto, gotoIf and while loop functionality in Selenium IDE. Selenium ...
-
This post is a continuation of REST API Best Practices 2: HTTP and CRUD , and deals with the question of partial updates. REST purists ins...