Will Larson writes about deploying Django with Fabric. Fabric is a Capistrano-like tool for remote deployment written in Python.
Gmail for mobile 2.0 is out. I've been an avid user of the 1.x version for years and here is my quick review:
The Good:
- Multiple account support, including Gmail for Domains support.
- Limited offline mode.
The Bad:
- The "Refresh" softkey is gone, replaced by a "Hide" one. "Refresh" is now a menu option and it apparently has no key shortcut. Thanks but no thanks. Most multitasking phones nowadays feature a dedicated "Home" or "Menu" key of some sort that hides the application. It would be fine to hide "Refresh" away in the menu if the application had push synchronization but that's not the case (not that it could anyway, long-lived push on J2ME is impossible on almost every phone. That's why "Refresh" should be in a easy, visible shortcut and not in the menu.)
I'm keeping this version for the multiple account support but I hope Google brings back the "Refresh" softkey or at least maps a key shortcut to it. Right now "Hide" is completely useless on my Nokia E61.
Android has been finally been made fully open source. Previously only a small part of Android was open source and, for example, it was impossible to build it for a new architecture.
Opera has announced MAMA, a new search engine that indexes the actual markup and styling information of a web page:
MAMA is a structural Web-page search engine—it trawls Web pages and returns results detailing page structures, including what HTML, CSS, and script is used on it, as well as whether the HTML validates.
The PyPy team held recently a coding sprint and its status blog has been updated with notes on the JIT generator and C++ bindings.
Dave Herman explores the strange interactions between eval() and variable scoping in Javascript.
Glenn Gillen has a nice writeup on the new features presented in MerbCamp. And here is day 2.
Excellent overview on the cruel dynamics of the iPhone App Store:
Think of it as if there was a single Top 40 music radio station everybody listened to: moving up or down in the list has a huge impact on sales, and dropping from the list means your sales will be easily reduced by one or two orders of magnitude.
Ilya Grigorik implements the stale-while-revalidate Cache-Control proposal with EventMachine and memcached:
The application logic is simple: if we have never seen this request, process, and cache it; if we've seen this request, and the cache is valid, then render response; if we've seen this response, but the cache is stale, render the stale version immediately, and then continue the process to update the cache. Also, to avoid the 'stampeding' effect, we've added a flag to mark a request as in-progress, to indicate that an application server is working on updating the cache.
Big list of Django tips. Note: if your retinas start melting while reading the list try a zap colors bookmarklet.
Starting with Merb: a collection of links
Merb homepage.
Ruby Enterprise Edition. Apparently Ruby plus tcmalloc. All the cool kids are using it.
Phusion Passenger. The Apache module formerly known as mod_rails. Version 2.0 has support for Rack. Rack is a good idea:
Rack provides a minimal interface between webservers supporting Ruby and Ruby frameworks.
The Merb docs on deploying with Passenger.
Merb is ORM agnostic so grab DataMapper too. Or maybe Sequel.
Merb focusing on controler logic rather than shoving down developers throat a particular, bloated ORM engine is a very refreshing change from current trends in web frameworks. And it continues with its choice of a view rendering policy. There is none.
Merb is not yet 1.0 and still very much on active development. Grab it from from git.
If you choose DataMapper you may want to live on the edge.
Or just follow and easy, short tutorial to get started faster.
Haml is interesting too.
It took them months but Apple has finally done the right thing.
Simon Willison points to an article on the MySQL query profiler, available since version 5.0.37. Looks much more powerful than the classic EXPLAIN.
Apple has updated the Safari Web Inspector. In this release it appears to have caught up with Firebug, and is actually surpassing it in some areas with features like selector-based search in the Elements view and a timeline-based network monitor with latency display.
To celebrate their 10th birthday Google has made available for a limited time their 2001 index. Try to find how much of the pop culture trash we take for granted today didn't even exist seven years ago.
jQuery, the best Javascript library, will be included as part of the Nokia and Microsoft web development platforms.
Researching a bit for my previous post about closures in Python and Ruby I found out that they are coming in PHP 5.3. Here is the RFC. Unfortunately it requires declaring the closed variables with the use keyword and provides a justification for it:
PHP's notion of scope is quite different than the notion of scope other languages define. Combine this with variable variables ($$var) and it becomes clear that automatically detecting which variables from the outer scope are referenced inside are closure is impossible.
One of the main attractions (a least for me) of dynamic languages are their functional capabilities. Python has crippled lambdas but makes it up with very powerful stateful generators and generator expressions, even if its scoping rules are a bit fishy.
In comparison Ruby goes in the opposite direction. Being relatively poor on comprehension syntax it makes it up by offering 7 different ways to define a block of code and pass it around, with varying degrees of scoping. Unfortunately most of them appear to be nearly identical and are being kept around just to not break old code. Investigating this matter I found this enlightening sample script from Paul Cantrell:
This is quite a dizzing array of syntactic options, with subtle semantics differences that are not at all obvious, and riddled with minor special cases. It's like a big bear trap from programmers who expect the language to just work.
Paul explains how most of this mess grew out of lacking a formal specification for Ruby as a language, and how most of the ways to define a code block are equivalent and different at the same time. The final conclusion would be to use lambda if you want a true, lexically scoped first order function, and code blocks for everything else. The script finishes with a very cool lazy evaluation example and a pointer to the Lazy gem.
Excellent HTTP analysis tool for Firefox: HttpFox (via F5 DevCentral).
The Android SDK 1.0 as been released, and it is now in feature and API parity with the recently released T-Mobile G1 in the USA. The API changes since 0.9 appear to be very small so most current applications will work on the G1, and the rest will be very easily updated. Now let's hope Google and HTC deliver on the promise of open handsets and sell a factory unlocked version of the G1.
John Resig, the author of the amazing jQuery library, has published his interactive presentation on advanced Javascript topics like first class functions, closures and prototype based OOP. The talk also covers his Javascript port of the Processing language and offers a new demo that compares it with direct Javascript + Canvas programming. More in his blog.
Stories of indie developers making a quarter million in 2 months are driving a surge of crappy shovelware in the iPhone App Store. Russell Beattie weighs in and compares it to the gold rush that mass sales of J2ME handsets produced.
Wil Shipley proposes a new model for the App Store, where all applications are accepted but only a select few are publicly listed in the store frontend. The rest are still searchable by name and linkable from external sites:
Everyone can get into the warehouse. Only the select few can get into the storefront.
