Device That Reads Books

Intel Reader (Credit: Intel)
Intel reminded us this week that we are, by 1960’s issues of Popular Mechanics standards, living in The Future. Check out the little device above…know what it does? It reads book…from photos. You snap a photo of a page of text, and this device reads the text to you out loud. That, my friend, is capital-s Science in action. See the Gizmodo article for additional photos and a demonstration video of the device in action.

Ray Kurzweil demonstrated similar technology three years ago at the Singularity Summit at Stanford. As I summarized his demo at the time:

Using the device, Ray took a picture of the page with the device and had it read the page aloud on his behalf. This is apparently a project that Ray started working on with the National Federation of the Blind about five years ago, but at the time the technology was not sufficiently advanced to enable the application. At the time of original investigation, digital cameras didn’t have enough resolution to enable good pattern recognition, and pattern recognition algorithms had not yet been designed to handle the difficult environment in which such a device would need to operate. All this changed in the intervening five years.

And it would appear that it has changed again in the intervening three years. Not only is it possible, the solution is relatively cheap ($1500) and readily available as a consumer product. Interestingly, it appears that this is not an updated version of the device Kurzweil demonstrated. Kurzweil is, in fact, working on a competing device called the KNFB Reader. Not only is the future here, it has competitors!

Response to the Georgia Straight

The Georgia StraightI find it intriguing that the Straight found it appropriate to print two responses disagreeing with my comment on the “Vancouver’s Homeless Demand Solutions” story, yet didn’t see fit to print my original comment itself. As I recall, quoting responses without context is poor journalistic form. Nevertheless, despite that oversight, I think it worthwhile to respond to these comments.

For the record, my original comment:

I think a bit of perspective is required here: Let’s assume that the number of homeless is 15K, as suggested above. BC’s population is an estimate 4.4M according to BC Stats, which means that the homeless comprise 1/3 of a percent of the population. Even if the number is doubled, it’s still only 2/3 of a percent.

Am I happy there’s people who are homeless? Of course not. But by the same token, I think it’s unrealistic to expect nobody to be homeless, much in the same way it’s unrealistic to expect 100% employment.

I don’t have a solution to this problem and, in all honesty, I’m not sure one exists. However, I don’t think giving people cheap housing is going to solve the problem – it’s a hand-out that doesn’t solve the fundamental underlying issues, and it insults the rest of the hard-working population in the interim.

First, let me be clear: I’m in favour of programs to reduce homelessness. However, I have a problem with programs that choose to throw money at symptoms rather than causes. If history is any guide, these programs will not provide the desired results (one only needs to look at the $1.4B invested in the Downtown Eastside with few results), which does a disservice to those working hard to pay their taxes to pay for these ill-conceived projects.

According to the original Straight article, there are between 12,000 and 15,000 homeless people (note that we’re talking about genuinely homeless people here, not those who are struggling with housing affordability – I’ll come to them in a moment). Contrary to popular belief, the problem for these individuals is not a lack of housing – that’s a symptom. For the majority, the root cause is untreated mental health issues and substance abuse. These factors limit employment options and create the conditions that lead to homelessness.

The real solution is not to throw money at cheap housing, the solution is to provide proper, comprehensive mental healthcare in BC. Proper mental heath treatment can reduce or eliminate the factors that limit these individuals’ ability to be fully functioning members of society. That is the real solution.

Unfortunately, even comprehensive mental heath services are not sufficient to cure homelessness. Although one commenter called it “disgusting” for me to state that it’s unrealistic to expect nobody to be homeless, I stand by this statement. Even when adequate mental heath services are available, there are some individuals that simply will not adhere to treatment regimens required to enable them remain functioning members of society. For example, some schizophrenics complain that they don’t feel themselves when they’re on their medications, and choose to stop taking their treatment. My mother, a psychiatric nurse for twenty years, can attest to this phenomenon.

Unless we discover a way to cure mental health issues instantaneously or choose to, as one commenter suggested, put individuals who aren’t capable of functioning in society under the care of the state, the root cause of homelessness will remain. And as long as there is one person without a home, there will be homelessness. It’s an unfortunate, horrible thing to say. But it’s also reality.

Of course, housing affordability is also a major problem. Proponents of social housing projects, such as Wendy Pedersen of the Carnegie Community Action Project, are quick to point out that money spent on the new convention center could have bought 4,250 deluxe inner-city homes. So let’s pretend that happened –what would be the result? Without the convention center project, we would have missed out on the benefits of the project:

  • 4500 direct and indirect jobs
  • $1.6B economic activity during the convention construction
  • 61 events between now and 2012 (which could not have been accommodated without the new facility)
  • $2 billion additional economic activity in the province between now and 2012

Not constructing the convention center would have eliminated a recurring source of jobs and economic stability. In other words, the very things that enable people to afford housing in the first place and that decrease the likelihood of people slipping into homelessness. The very result organizations such as the Carnegie Community Action Project would like to see.

The solution here is not simply to build some subsidized housing and pat ourselves on the back. It’s addressing the real problems, namely lack of proper mental healthcare. And the money required to provide that solution has to come from somewhere – namely income generated from new economic activity.

Given the dire economic straits we find ourselves in, I would argue that it’s more prudent for the government to focus on addressing the 7.6% unemployed British Columbians, rather than 1/3 of a percent homeless. After all, the money for all of these social programs has to come from somewhere, and lack of employment only increases the possibility of people becoming homeless in the first place.

These are not nice choices for a society to have to make. But in a world of constrained resources, you can’t have it all. You need to focus on the root problems, not symptoms, and try to generate the best result for the most people. To do otherwise is impractical.

BookCamp Vancouver 2009 Wrapup

BookCamp Vancouver 2009The atmosphere at this weekend’s excellent BookCamp Vancouver 2009 was quite different than other unconferences I’ve attended in the past. For one thing, people there were taking notes using pencil and paper. And unlike other unconferences, there was an absence of laptops, cameras, and ubiquitous social media coverage; even the #bcvan09 hashtag traffic on Twitter was attenuated versus other unconferences I’ve attended.

If I were to summarize the tone of the conference in one word, that word would be ‘fear‘. The publishing world is rapidly approaching a crossroads, and it doesn’t seem like its inhabitants are any better prepared for the transition to digital media than their brethren in the music and movie industries. Sean Cranbury‘s session on digital rights management could have been about the music industry if you replaced the word ‘book’ with the word ‘song’ in the discussion. This is somewhat disturbing, since there have been numerous examples of what works and doesn’t work in digital media.

The concerns of publishers boil down to economics. Publishers are struggling to reconcile the costs of book production with consumers’ unwillingness to pay for content. Regardless of whether the content is delivered via the Internet, or as an electronic book, consumers are less and less willing to pay for content, much to publishers’ chagrin. For many attendees, I think the real shock came from comments by publishers on the time and costs associated with producing physical books:

  • Profit margins in the publishing industry are about 4%. For those of us from the software industry, 4% is an amazingly low number (software profitability runs around 30% depending on industry).
  • The timeline on book production, once a complete manuscript has been received from the author? A year and a half on average.
  • Book printing costs only account for about 20% of the cost of a book. This is surprising to many consumers who, judging by audience reactions at the conference, believe that physical production and distribution is a major component of the price of a book.
  • Author royalties comprise only 10% of the cost of a book, another fact that shocked the audience.

The part I found most concerning: a professed lack of willingness on the part of publishers to experiment. Despite widespread agreement that technology publisher O’Reilly is leading the way in revolutionizing the publishing industry, few publishers professed a willingness to take a chance and undertake experiments of their own to determine how to chart a course through these new waters. It’s disappointing, especially when O’Reilly has already created many of the new models publishers might employ to stave off extinction, such as monetizing books through new formats (finely sliced content offered as PDFs, subscription-based reference libraries), and partnering with readers during the production process.

One conversation I had with a publisher highlighted the extent of the tunnel vision: the publisher admitted that they would not only be unwilling to accept any price cut when offering books in electronic form on devices such as the Kindle, but also that they weren’t even willing to try offering books in electronic form at all. If this attitude is widespread in the industry, the publishers’ fates are already sealed. The future of publishing may rely on a new breed of author-entrepreneurs adhering to the tenets of “lean publishing” to continue in their stead.

Treehugging: You’re Doing It Wrong

Solar Powered...Faucet?I saw this faucet in a local mall in Vancouver, and it took me a moment to realize it wasn’t a joke. Your eyes aren’t deceiving you: What you’re seeing is a solar-powered electronic faucet, complete with a handy informative plaque:

By installing this electronic faucet, this facility is demonstrating its commitment to water conservation and protecting/preserving our environment.

The mind boggles. Apparently, conserving water requires electricity and someone figured that adding a solar panel to the device would turn the conservation-cred of this faucet up to eleven.

It’s almost comical. For one thing, a solar-powered faucet can’t be solar-powered when it’s indoorssolar implies the light source is the sun, but in this case the light source is the fluorescent lights.

But really, focusing on the idiocy of an indoor solar-powered faucet overlooks the biggest problem: a faucet that requires electricity to run in the first place. The primary touted benefit of an electronic faucet is its ability to conserve water – something which was already achievable with spring-powered faucets. So, if it was already achievable without electricity, what’s the point of this thing?

The answer lies in the secondary benefit: touch-less operation. While I doubt there’s a high risk of contamination from a faucet in a bathroom, I suppose there can be a case made that it reduces costs to keep the faucet clean. There is, however, an alternative solution: a pedal-based faucet. We saw these in France, and I thought they were brilliant: no power, water-conserving, touch-less operation (I don’t think the bottom of your shoes are at any increased risk of contamination).

It the greenwashing by companies like Sloan, the manufacturer of this device, that fuel resistance to attempts to fight climate change and reduce our impact on the environment. Critics view these devices as a cynical attempt by companies to make a buck – surely the whole environmentalism thing is trick to make us buy different stuff!

Seriously Sloan, knock it off.

Open Letter to Yuk Yuk’s

Note: This is the second time an entertainment establishment in Vancouver has made dramatic alterations without any acknowledgment to their customers of the changes. Last time, my wife and I went to see Spinal Tap, only to discover TicketMaster had decided to move us from the orchestra to the last row of the balcony section. It appears that entertainment groups in Vancouver simply don’t understand how to communicate changes to their customers.

Dear Yuk Yuk’s:

My wife and I attended Yuk Yuk’s last night to see the 8pm ‘Garfunkel and Oates‘ show, who were previously advertised as your headline act for the night. It was the only reason I went. Not only did Garfunkel and Oates not play the gig, there was no notice to this effect at the box office or anywhere prior to the show. It wasn’t even acknowledged by the MC that the advertised headliners weren’t going to be playing.

I am aware that you state that “Acts are subject to change without notice.”; however, this as a legal term is only defensible in cases where a player or act is physically unable to make the gig (illness, accident, detention while crossing the border due to house arrest – I’m thinking of Andy Dick here, of course). To simply gloss over the fact that the very act people came to see won’t be playing the gig and attempt to hand-wave it away under this overly-broad disclaimer is poor form and, quite frankly, insulting to your customers. In other businesses, it’s called a bait-and-switch, and it’s illegal (for a reason).

In the future, it would be useful to at least acknowledge that the acts have changed. You’ll find that customers are a lot more forgiving if you communicate the change, than if they get to the end of the show and wonder why they didn’t end up seeing the very act they paid good money to see. It’s just good business.

Ask Yourself: Should I Build This?

A couple of years ago, I heard Guy Kawasaki talk about how the thing that defined Silicon Valley was its “what the hell, let’s build it” attitude. It took me a while to get it, but I came round to understanding his point: get moving, build something, figure out who cares about what you’ve built, and then evolve the product. It’s good advice, to a point.

However, there comes a point where the market is so saturated that you start to do stupid things. I got a great example of one such thing in the email today:

Barbecue. On your iPhone. Yes, you heard me right.

It’s called, creatively, “Barbecue”. It’s from San Francisco-based Equinux. I’m pretty sure it’s one of the signs of the apocalypse.

Now, I’m sure there will be people that will purchase this application; it’s cute, gimmicky, and it will doubtlessly keep someone entertained for at least three minutes. But the breathless copy proclaiming this application’s unparalleled awesomeness is simply over the top:

Serve steaks to your friends on Facebook, share kebabs and ribs on Twitter or via Mail. Barbecue on the iPhone:

  • Photo realistic images that make your mouth water
  • Top notch graphics to get a real bbq experience
  • Real sound effects to bring the thrill to the grill

Seriously? We spent countless billions building silicon foundries, a revolutionary mobile operating system, and the associated expertise to simulate the experience of BBQ? I could do the real thing for a couple of bucks, with the obvious bonus that I’d actually get to eat the results. I know somewhere, a software developer is clucking their tongue and pontificating on those silly marketing people. But, last I checked, the marketing people didn’t build this application.

I worry that developers have lost some serious perspective in their bid for fame and fortune. Just because it makes money, doesn’t mean it’s useful. Now, I’m not suggesting that we toss out our enthusiasm for trying new, unproven things; however, I am suggesting that developers need to start considering whether or not their software offers any socially redeeming value.

Developers need to start not only asking themselves “can we build it?”, but also “should we build it?”

The How and Why of Barcamp

We’re on our final approach to next month’s Barcamp Vancouver which is shaping up nicely due to the contributions of many volunteers and a list of wonderful sponsors. But one thing bothers me – any time I mention Barcamp to most people I get one of two perplexing responses:

  1. “What’s that?”
  2. “Why would I want to participate?”

This post is designed to answer these questions for people in Vancouver.

To answer the first question: Barcamp is an unconference – this means that the participants determine the content. If you head on over to the topics, you’ll see sessions that various people want to present and moderate during Barcamp. In fact, the first thing you’ll notice is that you probably don’t know a single speaker. There are no rockstar presenters, à la TED; Al Gore will not be dropping by prior to heading out to save the whales.

Instead, the speakers are ordinary people – just like you! They’ve got something they’ve built, started, been involved in, or are generally passionate about that they want to share with other people who might be interested. They bring something unique to the conference for people to explore, understand, and comment upon. That’s it.

Which brings us to the second question: why should you participate? Well, in a nutshell, because you can. Everyone has something they’re working on that they should share with other like-minded individuals. Sharing is scary, but sharing makes it real; sharing not only validates what you’re working on, but also gives you a great opportunity to tap into the passion and expertise of a whole community.

Back in 2005, I gave a talk on SVG v. AJAX (creatively titled “Ajax-Schmajax”) at the first Barcamp. In honesty, I almost didn’t present until Scott Beale (of Laughing Squid fame in San Francisco) prodded me into presenting over a cocktail at the pre-Barcamp party. When I pointed out that I wasn’t sure why anyone should care about my topic, his advice was simple: “It doesn’t matter what your topic is, all that matters is that you share it with the others and see where it leads. That’s how we do things in Silicon Valley.”

So yes, I was peer-pressured into presenting at an unconference. And now this is me pressuring you to present at Barcamp: get your session on the list of proposed topics (and not living in Vancouver is not a barrier – sign up for a remote session). Let’s make the Vancouver technology/maker/tinkerer community a “share by default” community.

Signing Amazon Web Service Requests in ActionScript

Amazon.com announced a change to its Product Advertising API requiring all requests after August 15, 2009 to be signed. I’d been meaning to update one of the Scannerfly example applications and the Shelfari Scanner to sign Amazon requests, but was hoping someone else would figure it out before me. As near as I can tell, no one has provided an implementation in ActionScript, so I cobbled one together.

Generally, the process is fairly straighforward: developers need to transform their REST request’s parameters into a canonical form, add a timestamp, and then append a signed version of the resulting string. However, in reality there a lots of finicky details that make the process frustrating…luckily for you, I’ve created an ActionScript implementation that you should be able to modify to suit your purposes.

The signature process relies on the as3crypto library to provide HMAC and SHA-256 implementations. In addition, you’ll need an instance of mx.rpc.http.HttpService that you’ve likely instantiated in your MXML, along with your Amazon Web Services developer ID and secret key:

// A HTTPService configured to perform the required Amazon Web Services request.
<mx:HTTPService id="AmazonSearch" url="http://webservices.amazon.com/onca/xml" showBusyCursor="true">
	<mx:request>
		<awsaccesskeyid>{amazonDeveloperId}</awsaccesskeyid>
		<idtype>EAN</idtype>
		<itemid>9781592400874</itemid>
		<operation>ItemLookup</operation>
		<responsegroup>ItemAttributes,Images,Tracks,EditorialReview</responsegroup>
		<searchindex>Books</searchindex>
		<service>AWSECommerceService</service>
		<signature>{signature}</signature>
		<timestamp>{timestamp}</timestamp>
	&lt;/mx:request&gt;
&lt;mx:HTTPService&gt;
 
// The Amazon host providing the Product API web service.
private const AWS_HOST:String = "webservices.amazon.com";
 
// The HTTP method used to send the request.
private const AWS_METHOD:String = "GET";
 
// The path to the Product API web service on the Amazon host.
private const AWS_PATH:String = "/onca/xml";
 
// The AWS Access Key ID to use when querying Amazon.com.
[Bindable]
private var amazonDeveloperId:String = "####################";
 
// The AWS Secret Key to use when querying Amazon.com.
[Bindable]
private var amazonSecretAccessKey:String = "####################";
 
// The request signature string.
[Bindable]
private var signature:String;
 
// The request timestamp string, in UTC format (YYYY-MM-DDThh:mm:ssZ).
[Bindable]
private var timestamp:String;
 
private function generateSignature():void
{
	var parameterArray:Array = new Array();
	var parameterCollection:ArrayCollection = new ArrayCollection();
	var parameterString:String = "";
	var sort:Sort = new Sort();
	var hmac:HMAC = new HMAC(new SHA256());
	var requestBytes:ByteArray = new ByteArray();
	var keyBytes:ByteArray = new ByteArray();
	var hmacBytes:ByteArray;
	var encoder:Base64Encoder = new Base64Encoder();
	var formatter:DateFormatter = new DateFormatter();
	var now:Date = new Date();
 
 
	// Set the request timestamp using the format: YYYY-MM-DDThh:mm:ss.000Z
	// Note that we must convert to GMT.
	formatter.formatString = "YYYY-MM-DDTHH:NN:SS.000Z";
	now.setTime(now.getTime() + (now.getTimezoneOffset() * 60 * 1000));
	timestamp = formatter.format(now);
 
	// Process the parameters.
	for (var key:String in AmazonSearch.request )
	{
		// Ignore the "Signature" request parameter.
		if (key != "Signature")
		{
			var urlEncodedKey:String = encodeURIComponent(decodeURIComponent(key));
			var parameterBytes:ByteArray = new ByteArray();
			var valueBytes:ByteArray = new ByteArray();
			var value:String = AmazonSearch.request[key];
			var urlEncodedValue:String = encodeURIComponent(decodeURIComponent(value.replace(/\+/g, "%20")));
 
 
			// Use the byte values, not the string values.
			parameterBytes.writeUTFBytes(urlEncodedKey);
			valueBytes.writeUTFBytes(urlEncodedValue);
			parameterCollection.addItem( { parameter : parameterBytes , value : valueBytes } );
		}
	}
 
	// Sort the parameters and formulate the parameter string to be signed.
	parameterCollection.sort = sort;
	sort.fields = [ new SortField("parameter", true), new SortField("value", true) ];
	parameterCollection.refresh();
	parameterString = AWS_METHOD + "\n" + AWS_HOST + "\n" + AWS_PATH + "\n";
	for (var i:Number = 0; i < parameterCollection.length; i++)
	{
		var pair:Object = parameterCollection.getItemAt(i);
 
 
		parameterString += pair.parameter + "=" + pair.value;
 
		if (i < parameterCollection.length - 1)
			parameterString += "&";
	}
 
	// Sign the parameter string to generate the request signature.
	requestBytes.writeUTFBytes(parameterString);
	keyBytes.writeUTFBytes(amazonSecretAccessKey);
	hmacBytes = hmac.compute(keyBytes, requestBytes);
	encoder.encodeBytes(hmacBytes);
	signature = encodeURIComponent(encoder.toString());
}
 
...
 
// Somewhere in your code you'll call the following to generate request signature and perform the search.
generateSignature();
AmazonSearch.send();

And for those who need a complete working example, you can download the MXML for an example application from here. The example simply performs an ItemLookup; however, you will still need to add your Amazon developer ID and secret key for the example to work.

A note to other developers struggling with implementing the proper request signature, see the Signed Request Helper. This Javascript application breaks down each step in the formulating the normalized parameter string and signature.