Update: It appears Amazon is indeed listening; I was able to preorder Robert J. Sawyer’s latest for Kindle delivery, and most of the titles I talk about in this post are alerady available in my region. Thanks Amazon!
Like (according to Amazon.com) millions of people, I own a Kindle e-book reader. However, I’m a bit irked by the fact that Amazon is treating Kindle users as second-class citizens. As early adopters who paid a hefty sum for Amazon’s flagship product, I think we deserve better.
I’ve been a fan of e-ink technology since I first learned about the early, clumsy prototypes. When the original Kindle came out, I nearly jumped at the chance to get one. However I decided that the hassle of having a Kindle in a non-supported country (Mexico), meaning I’d have to jump through hoops to get content into the kindle, was not worth being an early adopter.
So patiently I waited, until, in late 2009, Amazon finally started selling the Kindle, complete with wireless content delivery, in Mexico and a host of other countries. “Great”, I thought. “I get to have my nice gadget, save on shipping costs and delivery time, and I still get to read a lot”.
The story has been a bit different. And it has more to do with politics and commercial interests than with technology. Let’s get this out of the way right now: I have only ONE complaint about the tech side of the Kindle, and it doesn’t even have anything to do with the product itself. More about that later.
So I got my shiny new kindle and went online to get some books for it. I naturally searched for my favorite Sci-fi author, Canadian writer Robert J. Sawyer.
To my dismay, there’s very little from him available as Kindle content. None of the books I was interested in were available: nor Calculating God, the first RJS book I read; neither Factoring Humanity, my all-time RJS favorite; I can’t get the Quintaglio Ascension trilogy, one of the very few RJS titles I haven’t read. They’re simply not available for the Kindle.
Titles are being “kindlefied” all the time. However selection is still quite shallow.
Sometimes I do find the title I’m looking for, only to be greeted by the message “not available in your region”. Amazon, if you CAN send physical books to my region, why can’t you deliver them to my Kindle? I know you’re going to say it’s not the same, but to me, that doesn’t cut it.
A few days ago I received a notification for Dan Simmons’ latest book. Black Hills was to come out in a few days, and I was offered a nice pre-order discount. However, it didn’t apply to the Kindle edition. So you mean to tell me that, even though I’d click on “buy now” this minute AND wait for the book to actually come out and be delivered to my Kindle, I can’t? and that the only way to take advantage of the discount is to wait for the dead-tree version to actually come out? well, never mind, because the book is for sale right now and there’s no Kindle edition in sight. So anyway I have to either get the hardcover or wait until the publisher decides it’s OK to let the Kindle edition out. It’s ridiculous that a hardcover book delivery will actually have me reading it sooner than the instantly-delivered electronic version.
Amazon, this is one area where you have to work with publishers and let them see what a big market they’re missing, and help them reach it. Because all these artificial restrictions, stemming from the irrational fear they have of electronic distribution, will only end up hurting their bottom line. I’m able (and more than willing) to purchase books. Look at my past history if you don’t believe me: even with a 50% delivery overcharge (the joys of not being in the United States) I routinely spent over $500 a year on books. Now I’m a bit weary of ordering physical books, since I’d prefer to offset the delivery cost with my Kindle; however, many of the titles that interest me aren’t available for the Kindle.
Interestingly, I find myself loading mostly classic literature on the Kindle; from Wilkie Collins to Jules Verne, these wonderful titles are available for free in Kindle-compatible formats. This is a consequence of the titles I want not being available on the Kindle; so if I have to choose between Jack London’s Call of the Wild (old book, I’ve read it 1000 times, I can get it for free at mobipocket.com) and Robert Sawyer’s Starplex (haven’t read it, but is not available for the Kindle), guess what, I’ll get the former.
Now for my one technical quip: What’s this about “optimized for large screens” books? so now I need a Kindle DX to read content? That just sucks.
So Amazon, you have the clout, but also the flexibility to work with publishers and stop (both you and them) treating us like second-class citizens, just because we find the convenience of the e-book reader worth the high admission price. A lack of reasonably-priced content shouldn’t be part of that price.
So my iPhone fell and got damaged. To its credit I have to say I did hit it pretty hard several times in the past, and it’d survived. However this time it didn’t, and I had to get a replacement. I had to pay for it since it was out of warranty. However the truly painful thing was spending one week without the perks of the modern smartphone.
I had to dig out my trusty 5-year-old Nokia 7210 (not the SuperNova, I mean the original funky-buttoned 7210), a stylish and compact phone which, however, is pretty featureless by modern standards. You can talk on the phone, send SMS (barely; I don’t know how I sent messages without a full QWERTY keyboard) and that’s about it. It has no camera, no network access, the screen is only 128-color and uploading stuff requires a tedious conversion process, and it only supports 4-voice MIDI polyphonic tones.
This was due in no small part to the death of my Blackberry’s lame battery; the ‘berry would have been a decent temporary replacement for the iPhone,even though it’s not compatible with my data plan. So here’s a tip: when your phone is about to be left indefinitely in a drawer, remove the battery.
Being without the iPhone, what I missed the most was:
- The QWERTY keyboard, without a doubt, is the most-missed feature. Whether virtual or real, it’s a necessity if you plan on composing a lot of text.
- The camera, believe it or not, is really useful for a lot of purposes.
- Synchronization with my computer’s address book. A lesser phone can do it but the Nokia lacked connectivity (only infrared).
- The browser, being able to access the internet anywhere, anytime has become a true necessity.
- E-mail. Yes, also not being able to receive emails periodically or, at least, on demand, is crippling and makes me feel out of touch and claustrophobic.
- Music, I guess it’s a case of “if you have it, you will use it”. Somehow carrying the iPod around in addition to the Nokia didn’t seem like a good idea.
What I didn’t miss:
- Ringtones. However weak the Nokia’s ringtone support is, it’s very loud and adequate, and my favorite ringtone ever (acceleration.mid) was available. I like it so much, I made an MP3 of it and loaded it on the iPhone.
- GPS. It’s cool to have it but I really don’t use it all that often.
- Most of my games. I don’t play on the iPhone that often. I must point out that neither the Nokia nor the iPhone had the “snakes” game from older (and newer) Nokia phones. I guess this 7210 got stuck in the past.
Also in case you hadn’t noticed, the entire point of this rant was so that I could have a new post before the 12th and thus keeping my blog updated “more than once every 6 months”.
BerryUnitConverter has been released. Featuring conversions for pennyweight, micrometers and millimeter (can’t believe I’d forgotten that one). Get it at the usual place.
OK, so I happily hack away on my Rails application on a Debian box with Ruby 1.8.7 and Rails 2.1.0, and then deploy to a Fedora 8 server with Ruby 1.8.6 and Rails 2.2.2. All of a sudden a particular release causes Passenger to spit an error page on application startup. The key error was:
undefined method \`empty?’ for nil:NilClass
Now I’m combing all over my code to find where I’m using “empty?” but I’m sure it’s somewhere that gets run on application startup, otherwise it wouldn’t show up when Passenger tries to start the application. But I find nothing and I’m about to shoot myself.
Following the trace I end up hacking Ruby’s erb.rb file, as there appear to be some bugs in this; indeed, this one from 1.8.6 is different from what I have in 1.8.7, so the app runs fine here. I try to fix instances where empty? might get called on a nil object, but after fixing 3 of these the app stops responding altogether. Hmm, so something, somewhere, depends on erb.rb’s buggy behavior. Best to leave it alone.
HOWEVER, on the deployment server, running with script/server works fine; it’s only when using Passenger that things blow up.
Finally I find this thread that points me in the right direction:
One of the users dropped some
JPEG files into the /app/views/static directory, and that seems to be
jamming up the works with 2.2.2.
Indeed, as part of my last set of revisions, I’d left several samples of static content I was converting into dynamically generated pages; sure enough, they included JPGs and whatnot. Just to be safe, I decided to move the entire directory into public to avoid any problems.
Now the app runs just peachy and I only wasted 2 hours chasing down this bug. Thanks to the guys at Nabble!
Eventually it all boils down to this Rails bug reported at Lighthouse. So hopefully it’ll be fixed soon. In the meanwhile, keep binary files out of your views subtree.
I’m attaching the entire Passenger error page, in case it’s useful to anyone. Mainly so that Google can find it faster for other people with this problem.
Ruby on Rails application could not be started
These are the possible causes:
-
There may be a syntax error in the application’s code. Please check for such errors and fix them.
-
A required library may not installed. Please install all libraries that this application requires.
-
The application may not be properly configured. Please check whether all configuration files are written correctly, fix any incorrect configurations, and restart this application.
-
A service that the application relies on (such as the database server or the Ferret search engine server) may not have been started. Please start that service.
Further information about the error may have been written to the application’s log file. Please check it in order to analyse the problem.
-
Error message:
-
undefined method `empty?’ for nil:NilClass
-
Exception class:
-
NoMethodError
-
Application root:
-
/var/www/spcccdec/releases/20090227005857
-
Backtrace:
-
|
/usr/lib/ruby/1.8/erb.rb
|
478
|
in `scan’
|
1
|
/usr/lib/ruby/1.8/erb.rb
|
524
|
in `compile’
|
2
|
/usr/lib/ruby/1.8/erb.rb
|
691
|
in `initialize’
|
3
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/template_handlers/erb.rb
|
51
|
in `new’
|
4
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/template_handlers/erb.rb
|
51
|
in `compile’
|
5
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/template_handler.rb
|
11
|
in `call’
|
6
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/renderable.rb
|
21
|
in `_unmemoized_compiled_source’
|
7
|
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/memoizable.rb
|
57
|
in `compiled_source’
|
8
|
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/memoizable.rb
|
25
|
in `__send__’
|
9
|
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/memoizable.rb
|
25
|
in `memoize_all’
|
10
|
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/memoizable.rb
|
22
|
in `each’
|
11
|
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/memoizable.rb
|
22
|
in `memoize_all’
|
12
|
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/memoizable.rb
|
17
|
in `freeze’
|
13
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
88
|
in `reload!’
|
14
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
102
|
in `templates_in_path’
|
15
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
100
|
in `each’
|
16
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
100
|
in `templates_in_path’
|
17
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
86
|
in `reload!’
|
18
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
78
|
in `load’
|
19
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
109
|
in `load’
|
20
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
109
|
in `each’
|
21
|
/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_view/paths.rb
|
109
|
in `load’
|
22
|
/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb
|
357
|
in `load_view_paths’
|
23
|
/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb
|
182
|
in `process’
|
24
|
/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb
|
112
|
in `send’
|
25
|
/usr/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/initializer.rb
|
112
|
in `run’
|
26
|
./config/environment.rb
|
13
|
|
27
|
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb
|
31
|
in `gem_original_require’
|
28
|
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb
|
31
|
in `require’
|
29
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/railz/application_spawner.rb
|
254
|
in `preload_application’
|
30
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/railz/application_spawner.rb
|
214
|
in `initialize_server’
|
31
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/utils.rb
|
179
|
in `report_app_init_status’
|
32
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/railz/application_spawner.rb
|
203
|
in `initialize_server’
|
33
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
166
|
in `start_synchronously’
|
34
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
135
|
in `start’
|
35
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
112
|
in `fork’
|
36
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
112
|
in `start’
|
37
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/railz/application_spawner.rb
|
179
|
in `start’
|
38
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/spawn_manager.rb
|
222
|
in `spawn_rails_application’
|
39
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/spawn_manager.rb
|
217
|
in `synchronize’
|
40
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/spawn_manager.rb
|
217
|
in `spawn_rails_application’
|
41
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/spawn_manager.rb
|
126
|
in `spawn_application’
|
42
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/spawn_manager.rb
|
251
|
in `handle_spawn_application’
|
43
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
317
|
in `__send__’
|
44
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
317
|
in `main_loop’
|
45
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/lib/passenger/abstract_server.rb
|
168
|
in `start_synchronously’
|
46
|
/usr/lib/ruby/gems/1.8/gems/passenger-2.0.6/bin/passenger-spawn-server
|
46
|
|
I’ve written before about how people in Mexico have zero road culture, which leads to a complete breakdown of road infrastructure. A lot of this infrastructure’s correct operation depends on people abiding by the law. Yet most people do not. Usually the consequences are from nil (parking in a handicapped space for a moment, leaving your car double-parked, parking in front of a house’s garage) to a relatively minor fine (parking illegally and THEN getting towed because the tow truck happened to be nearby).
However, when physical security of moving vehicles is dependent on the assumption that people will respect the law, things do indeed break down.
The metrobús is a Bus Rapid Transit system, which opened in 2005 in one important Mexico City avenue, and has enjoyed (in my opinion) great success, reducing transport times, improving traffic flow for private vehicles, and getting rid of dangerous Peseros along Insurgentes avenue. Everybody in Mexico knows Peseros are the worst offenders when it comes to traffic violations, where they blatantly run red lights, invade lanes, and generally do what they please without regard for others. So their sole disappearance was a blessing.
The price to be paid for this was that, since the metrobus runs on central lanes, left turns are forbidden along the avenue’s 26-km length. The reason is obvious: at the very least a significant disruption of traffic might occur if the bus has to stop for a car that’s trying to left-turn. At worst, the metrobus, a double-length behemoth, might hit another car with deadly consequences.
It’s been 3 years of the Metrobus operating, and this year a second line (running along eje 4 sur) was opened. This has caused an uproar because it appears this line has been misdesigned, creating several “death traps” and spots where, due to lack of space, cars and pedestrians have a tough time getting through. This has led to 18 accidents since the new line opened.
Some asshole in the government who needs urgent math lessons said that “98% of accidents involving the metrobus are due to private car driver’s imprudence”. For starters, 98% of 18 is 17.64, and assigning partial blames is absurd.
Anyway, what’s indeed clear is that most of the accidents are due to lack of culture by drivers. The all-too-common notion that “nobody wants to have an accident and if I just swerve violently in front of someone they’ll stop and swear at me but I’ll get my way” fails when the “someone” is a 15-ton monster traveling at 60 km/h with 30-meter stopping distances.
Sometimes, then, images are worth a thousand words, so I’ll leave you with the conclusion that while it’s necessary to guarantee that people operating a car need to have a minimum of road education, it’s also not going to happen because the “it’s ok just this one time” mentality rules, and as long as we’re giving driving licenses to anyone without a driving test (right, in Mexico there are no driving tests, you just pay for your license and you get it) things like this are going to happen. I also leave you with an eye-opening video of exactly whose fault it was for the accident, a picture of which is at the top of this message.
A new version of BerryUnitConverter is up. This one adds data units as well as Blackberry Storm compatibility. Let me know of any problems. Get it at the usual place.
Or, was it an accident? There’s plenty of speculation about the plane crash that cost Juan Camilo Mouriño, Mexico’s secretary of the interior (Secretario de Gobernación) and (so far) 12 other people their lives. Theories ranging from a simple accident to a narco-fueled vendetta abound.
But the fact is that the tragedy should be looked at from a humanitarian point of view. 13 dead and over 40 injured, 3 of which might also die in the next few days. It’s a time for mourning, yes, but for us to mourn for all the people who died, not just mr. Mouriño; a time for the entire mexican society to give their support to the families of the deceased, just as we would in any other tragedy.
Let me be cold-hearted for a while and state this: Mouriño’s death will not have a great impact for Mexico or even for president Felipe Calderón’s team, his plans or aspirations. Because for all the power his position brought, Mouriño himself was a rather grey politician. So yes, let the president give speeches about how we lost a “great mexican” (he was born in Spain so even that is debatable). But the truth is, Mouriño will get replaced by someone else, with similar political prowess, capabilities, aspirations and a similar position to further Calderón’s plans, whatever they are. And in the public eye, Mouriño will fade and then disappear, to become a footnote like Ramón Martín Huerta (whose name, incidentally, has resurfaced in connection with the Mouriño tragedy).
He will disappear, that is, in the eyes of everybody but his family and friends: these people didn’t just witness the death of a high-ranking government officer; they lost a friend, a father, a husband, and a son. To them, and to all the relatives of the deceased, the tragedy has a very personal feel. This is the level at which us normal people can empathize and understand the magnitude of what happened, for any loss of human life is to be regretted. So indeed, let our prayers (for those who pray) and our condolences and best wishes be with mr. Mouriño’s family, as well as with those of all the others who lost their lives or were injured in the tragedy.