For those of you who are not familiar with Mozilla Prism, it's a tool that allows you to sandbox web applications away from the rest of your day-to-day browsing. For security freaks (which we should all be to at least some degree), this is an excellent tool, as it prevents data from being shared or potentially stolen between web pages. It also allows you to clear away the browser navigational elements, making the page more like a real application and giving you more screen real estate to work with.
The big problem with Prism right now is that it's in beta and isn't technically Firefox (even though it's the same exact browser engine). That means software that sniffs the user agent string specifically for certain browsers has no clue what Prism is, and therefore might not let you do everything you could were you in Firefox itself. Most people come across this issue with YAHOO Mail. YAHOO's newest mail client is super-sexy, but in order for it to do all the fancy interactivity that it does, it relies on having a very modern, snappy javascript implementation in the browser. To make sure the user's experience is top notch, it therefore only lets browsers it knows are good enough into the new client, and forces older or unidentifiable browsers into the old, flat client. Unfortunatley, it does not yet recognize Prism, and therefore your nice YAHOO Mail sandboxes in Prism won't have access to the newer mail client.
In theory, there's a plugin/template linked to at mozilla's prism wiki that is supposed to fix this problem, but it doesn't seem to work as of Prism 1.0 beta 1. A user named rotassator on the Mozilla Lab's forums outlined an excellent alternative solution that I'd like to repeat here for searchers' sake. Here's how to do it:
I hope this helps someone!
If anyone hasn't heard, there's a bit of a kerfuffle brewing about Microsoft's decision to continue to use Word as the default editor and html renderer for Outlook 2010. Web developers reading this will probably cringe, as Outlook is the primary thorn in any email designer's side. A case in point: I was hired not too long ago to assemble a tightly-designed email for a small publisher. The design was clean, simple, and attractive. I generated a clean, standards-compliant version fairly quickly, but when I moved to adding compatibility for Outlook, my time and their costs literally tripled.
This sounds all too much like the arguments made against changing standards support in IE6. The IE6 argument started when a Microsoft product was found to handle things in a nonstandard manner that the larger community of developers found troublesome. That argument resulted in the ascension of Firefox and Safari, as well as Microsoft's decision to support better standards in IE7 and 8 later one.
We're now on the second phase of deja vu now, where the Microsoft holds that their method and strategy is fine and proper, even if it breaks their fundamental compatibility with the rest of the community. Now we'll move on to the last phase, where enough of an outcry is generated that a secondary application like Thunderbird or GMail begins to get better PR and market share. Well after this happens, Microsoft will begin to implement better compatibility in order to appease the community and retain their user base.
It's sad that this has to play out again so soon after the IE6 debacle. One would hope that losing 20% of a monopolistic market would be enough of a jolt to change the corporate culture at Microsoft to recognize the importance of standards on the internet, but their recent declarations indicate otherwise.
Outlook is a digital communications tool, and digital communications rely on standards to operate properly. Despite Microsoft's claim to the contrary, there is a standard for email rendering: HTML 4 and CSS 2. YAHOO, GMail, OSX Mail, Thunderbird, and Hotmail all render consistently using this standard, leaving Outlook as the IE6-like outlier. If they wish to use Word to make the editing portion of their user experience better, that's fantastic, and I encourage them to do so. Simply make the results obey standard HTML/CSS rules, and use a real HTML/CSS renderer to display emails from others.
Step 1: Sign into your gandi.net account
Step 2: Select your domain (click on the Manage tab if you don't see a similar screen after logging in)
Step 3: At the bottom of the screen (under Technical Settings), click "Manage DNS zone file"
Step 4:

Remove the unneeded entries as indicated in the screenshot (i.e. everything except the "A" record and the www CNAME)
Step 5: Edit the A record and change the value to 65.39.205.54
Step 6: Edit the CNAME record and change the value to yourdomainname.com. i.e. domain dot top-level domain dot; the last dot is important!
Step 7: Click "Submit changes". Note that it may take some time (up to a day) for this change to take effect.
Step 8: Log into your squarespace.com account.
Step 9: Visit your Website Management console
Step 10: Click "Custom Domain"
Step 11:

Enter your domain name without a www (and without a trailing dot). It will ask if you also want to create the www - say yes.
That's it! If you don't see any results right away, wait a few hours. DNS changes have to get copied all around the internet once they're made, and can take up to a day to do so.
It's official...I'll be at the Film Festival this year going over some of the basics on how to get an online community started. You can register your interest in the program here, and see my original proposal here.
Here's a rough proposal for a talk at the 2009 CT Film Festival. Let me know if you have any comments or questions!
Being online is a must for any burgeoning content creator, but standing out from the crowd is an ever-growing challenge. As the online community grows and matures, so too must your online persona. In this session, I will go over a pair of tools that anyone can use to create a home for that developing persona. I will also cover ways to get media distributed online and ground rules for interacting with your online community.
The majority of this discussion will cover two avenues for creating an online home. First, I will cover a new, simple solution: Squarespace. Squarespace is an all-in-one modular service where you can easily assemble pre-made components in order to build a community-oriented website. Though not the most flexible solution on the market, it is one that has much appeal for less technical or time-constrained users. I will follow up with an introduction to Wordpress, a more traditional software package with a far greater breadth of use, but one that requires more technical skills to set up and maintain. For both packages, I will cover the basics for integrating video, audio, and photos.
The last part of the talk will be devoted to dealing with an online community. I will cover such basics like moderation and not "feeding the trolls". I will also showcase some good and bad examples of online community management.
There are a bunch of code/syntax highlighter plugin options for MediaWiki. After playing around with the few I just linked to, I'd like to recommend the basic GeSHi highlighter...it's by far the simplest to install, and works well with both highlighting and spacing.
To steal the commands from the wiki, here's what you do:
1) Browse to your mediawiki extensions folder:
cd /var/www/%mysite%/wiki/extensions
2) Check out the extension with SVN (you do have SVN installed, right?)
svn co http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/SyntaxHighlight_GeSHi
3) Add a single line to LocalSettings.php in your mediawiki directory root:
require_once("extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");
That's it! It's great if you do your documentation in MediaWiki...tags will only get you so far.
One of the things that's always bugged me about designing good cross-platform SQL queries is the difficulty in constructing complicated 'where' clauses. Things like nested logic (AND (a = 2 OR b = 3)), column comparisons (whenadded != lastupdated), and function calls (whenadded > dateAdd(d . 10, getDate())) are always practically impossible without resorting to raw SQL. That raw SQL is often not cross platform.
With that in mind, I've assembled a small library called DBWhere that generates where clauses in a fairly sane but easily extensible fashion. I've included 2 differrent implementations, one that escapes for MySQL, and another that escapes for TSql (MSSQL). I've also included a test script that shows both implementations in action.
For these examples, I'll assume we're using MySQL and have the following function:
function GetWhere($keyOrWhere, $value=null, $logic='=', $type=DBWhere::VALUE_IS_VALUE) {
return new MySqlWhere($keyOrWhere, $value, $logic, $type);
}
The library starts with the base class DBWhere. You call the constructor with the parameters for the first clause of your where like so:
$where = GetWhere('status', 2)->End();
WHERE `status` = '2
Parameters 1 and 2 respectively represent the left and right sides of a where clause, with the assumed logic being '='.
You can then add to the command by chaining the functions Also and Either (for And and Or, respectively. Darn you PHP reserved words!):
$where = GetWhere('status', 2)->Also('timestamp', '1/1/2000', '<')->End();
WHERE `status` = '2' AND `timestamp` < '1/1/2000'
Here we use the 3rd parameter to assign some custom logic (note that we could have done this in the constructor as well).
We can also do WHERE IN by passing array values:
$where = GetWhere('status', (1,2))->End();
WHERE `status` IN ('1', '2')
...or WHERE NOT IN by passing negative logic:
$where = GetWhere('status', (1,2), '!=')->End();
WHERE `status` NOT IN ('1', '2')
We can also nest logic by nesting DBWhere objects:
$where = GetWhere('status', 2)
->Also(
GetWhere('lastname', 'smith')
->Either('firstname', 'George')
)->End();
WHERE `status` = '2' AND (`lastname` = 'smith' OR `firstname` = 'George')
Finally, we can compare columns by changing the constant we use for valueType:
$where = GetWhere('whenadded', 'lastupdated, '!=', DBWhere::VALUE_IS_COLUMN)->End();
WHERE `whenadded` != `lastupdated`
As illustrated in the examples, it makes the most sense to use this class when you have a function somewhere that returns the type of DBWhere object that you need. For example, in the Cebrum library, I have a Connection object that knows what type of database it's connected to. The Connection obejct has the function GetWhere that will return the proper kind of DBWhere object, so I can keep all my database configuration code in one place.
Also, notice that there's a $valueType called DBWhere::VALUE_IS_SPECIAL. When you use this type, the value will not be escaped! Sometimes this is necessary, as when you want to use built-in SQL functions. It shold be used carefully and sparingly at all times.
This was a quick one-evening project, and so even though I have the basics in place, I already know many things that need to be done in order to make this a fully functional tool. Here's a few:
If you have any other thoughts, questions, comments, or concerns, let me know!
When Amazon began reselling their backbone as web services, another barrier to the internet collapsed. Much like the introduction of the LAMP stack heralded the arrival of commoditized web applications, Amazon's service heralded the commoditization of large-scale application deployment. A budding web company no longer needs to choose between initial infrastructure investments (in the form of large-iron servers) or robust prayer (that their nascent website can survive a digg, crunch, or slashdotting).
The problem...or at least my problem...with Amazon's services was trust. As the first large-scale cloud computing service, Amazon was destined to experience growing pains of some sort. Companies that bought into their technologies had to trust that these pains would not prove deliberating, and had little choice but to sit back and hope during recent outages.
Today, Google has launched their own version of Amazon's cloud computing technologies. While currently more limited in scope, Google's histoy suggests that they will eventually be brought up to speed with Amazons offerings, though likely in a slightly different form. Once some form of parity in these services is achieved, purveyers of cloud computing techology will finally have the one missing peice of the web services puzzle.
Redundant services.
Once platform developers are comfortable in the niceties of both environments, I anticipate that most smart startups will begin to hedge their infrastructure bets and learn ways to load-balance their offerings across both of these platforms. As each service is pay-as-you-go, the ongoing costs will not be drastically different than the consumption of either service separately, and the ability to leverage the infrastructure of two web giants should outweigh any additional development overhead.
This can only be a good thing for everone involved. Google has found yet another revenue stream that leverages its massive hardware backbone, developers gain the power of choice, and even Amazon should benefit from the growth caused by the expanding market. All in all, it is a good day for the internet.
One of my clients recently overhauled their talent pool. Their staff went from two freelancers with very general development skills to one generalist (me), two php developers, and a CSS/HTML developer. System administration was understandably not in the three new developers' bags of tricks, and so they needed to be given development environments. As the only remaining person with system chops (and what mediocre chops they are), it fell to me to set these up. The project manager and I decided to set up completely isolated instances of the site and database, all hooked together by our subversion system.
Setup took longer than expected. Between minor issues at the host, incompatability between our code and library versions on the new server, and inevitable communications delays, we lost the better part of the week to our setup. This left several of the clients' staff wondering at why such elaborate preparations were necessary. Why couldn't all the developers just work out of a single environment and database?
This confusion left me at a bit of a loss. I remain confident that we took the right steps in getting our new talent up and running on the project, but I had no idea how to communicate the need to a non-technical individual. Most analogies I worked through fell apart in short order. The building-a-house analogy? Doesn't work - you generally don't have one contractor building a roof while the other works on the foundation. The writing-a-contract analogy? No parallellism to reference.
Finally, I started picking apart some variations on the writing-a-story analogy and came up with one that seems to fit. Let's assume several authors decided to team up and write a character-driven, multi-chapter story. Each author would write one chapter that would feature one main character, and that author would be the authority on that character. However, all the characters will by necessity interact at various points during the story.
When writing begins, each author can work effectively in isolation within his or her own chapter. The character develops, and encounters with the other characters are documented. As these interactions unfold, however, they may begin to start interfering with other parts of the story. What if in Chapter 1, Jonny said "Where will we go next?", while in Chapter 3's telling of the same encounter, he says "Let's go to the cave!"? Johnny's author would need to go into someone else's chapter and fix the quotation.
Now you're faced with the prospect of more than one person editing the same document at the same time. Most people can understand that significant issues can occur here - for instance, if two authors are editing the same chapter at the same time, the chapter will ultimatley contain only the changes of whoever saves last. What you need is a mechanism by which each author can edit a chapter and have their changes merged together seamlessly.
That's where version control comes in. Version control takes the different parts of the story and gives the authors the freedom to make changes wherever necessary without impacting one another's work. When you extrapolate the analogy into real development terms, its usefulness becomes amplified by the fact that it enables editing by anyone, anywhere with an internet connection.
There's certainly some gaps in this description, but for the most part I think it holds up. If nothing else, it serves as an interesting intellectual exercise.
Microsoft has announced that IE8 will include yet another non-standard hack in order to get their browsers to be backwards compatible. While their intentions are good, they've still got the wrong idea.
Microsoft's approach to browser creation is a good one, considering their dominant position in the browser market. "Don't break the web". Make sure new versions of IE don't cause terrible breakages in existing content, since each breaking change they introduce can cost the industry millions, if not billions of dollars. Their difficulty lies in improving the browser without introducing such breakages. Their solution has always been to add some kind of version-identification functionality that developers can use to customize their sites for each iteration of IE. For example:
IE8 will continue this trend, adding a new meta tag that will act as a browser render mode identifier.
The issue is that Microsoft wants to prevent companies with IE6/7 specific pages from having to redesign for IE8. However, even though "Don't break the web" is their credo, they've never been able to follow through on it completely. IE6 broke IE 5.5 sites, IE7 broke IE6 sites, and no matter what they do, IE8 will break IE7 sites. People are going to expect this to occur and will be testing and tweaking their sites despite Microsoft's best intentions.
With that in mind, why not make their tweaks be opt-ins to the IE6/7 model as opposed to opt-outs? Again, people are going to have to fix their sites. If history is any indicator, some changes will be needed regardless of Microsoft's compatibility intentions. If adding the
For for both Microsoft and the web in general this would be a big win, as it would minimize the need for the hack-per-version development model IE currently follows. If they're not screwing around this time and IE8's new super compatibility mode really does make it work like other browsers, then they'll be able to focus on making IE9 an even better browser and not just a standards-fixing exercise.
Our game sharing application, ShareGames, goes into beta today! We've put ShareGames together as a way to generate a conversation between friends about casual games. We're hoping to expose facebook users to some of the great casual and independant games on the market by giving them a fun way to show off what they're playing to their friends. Users can search for games, download and play free trials, then brag about their exploits afterwards. Better yet, their friends can see what they've been bragging about and brag right back.
So come check out the beta! We'd love to have you and to hear your feedback. Help us make ShareGames the best game application on Facebook!
A new version of the website went live today. We\'ve incorporated our Cebrum framework this time around, so not only are we eating our own dogfood, we\'re in a better position to add more features to the site over time! What\'s more, we should be able to get more content available on the site for our clients and partners.
It certainly is a geek's dream - handwritable layout code, stylesheets, full access to the .NET libraries, integrated 3D graphics. The closed nature of the platform is still disconcerting, but this is a case where you can't blame Microsoft. Their only real competitor in the space is Flash, which is still proprietary itself. I'll be watching this technology closely!
More progress has been made on the administration tools. Two new features were added today:
Neither update is terribly impressive, but both make the default admin tools even more usable out of the box, which is critical.