- too much coffee man
- CSS Vault Gallery
- Berkun blog
- Web Creme
- Bit Stampede
- ShaunInman.com // plus Elsewhere
- Christopher Blizzard
- SimpleBits Articles
- Penny-Arcade
- Signal vs. Noise
- craigslist | internet engineering jobs in boston
- IEBlog
- as days pass by
- Coop
- Hacking for Christ
- Le «blog personnel» de Joe Clark
- Airbag Presents: Longboard
- Mozilla Developer News
- Asa Dotzler - Firefox and more
- 456 Berea Street
- all in the head
- SimpleBits QuickBits
- Jason Santa Maria | Oddities & Diversions
- RobotJohnny.com
- Simon Willison's Weblog Entries
- CSS Beauty News Feed
- Calendar Weblog
- GarrettDimon.com
- inessential.com
- Robert Accettura's Fun With Wordage
- Sucking less, on a budget
- Mike Davidson
- BeatnikPad
- Binary Bonsai
- Frames Per Second Magazine
- PKB
- DWBlog
- Authentic Boredom
- del.icio.us/anthony_park
- Stopdesign
- Subtraction
- The Burning Edge
- Justdave's Blog
- persistent.info
- Ordered List by Steve Smith - Home
- Andy Budd::Blogography
- A List Apart
- mitchell's blog
- Indistinguishable from Jesse
- BSBlog
- croczilla/blog
- random particles
- dria.org
- Well, I'm Back
- And all that Malarkey
- Surf*Mind*Musings
- preed's blah-blah-blahg
- dmose's blog
- Jason Santa Maria | Articles
- hicksdesign - journal
- Bartelme Design | Journal
- Left Justified
- A Test Guy
- Burning Chrome
- Planet Mozilla: Mike Beltzner
- Zarro Boogs found.
- mykzilla
- mozillaZine.org
- bc
- Gemal's Psyched Blog: Mozilla
- Dave Shea's mezzoblue
- doron's blaahg: Mozilla Posts
- smallTransport
- shaver
- Three Monkeys, Three Typewriters, Two Days
- Vladimir Vukićević
- Chris Ilias' Blog
- SVG Declarative Animation in Mozilla
- chofmann's weblog
- Sillyness Spelled Wrong Intentionally
- dive into mark / planetmozilla
- molly.com
- Call Me Al
- Neil's Place
- pavlov.net
- inside aebrahim's head
- SeaMonkey
- Blog by Kveton
- Justdave's Blog
- blogfour
- Marcia's Tirade of the Day
- Design by Fire
- CSS Vault Resources
- morgamic.com
- alex.polvi.net
- The Mike Matas Blog
- Dan Rubin's SuperfluousBanter
- Brendan's Roadmap Updates
- TwoEyes.org
- Stylegala | gallery
- cbeard's mozilla blog
- Jeffrey Veen
- The Rumbling Edge
- Mozilla Digital Memory Bank - Blog
- Mozilla IT
- ill communication
- Web-Graphics
- schrep's blog
- Blake Ross on Firefox
- Mozilla SVG Update
- Frank Hecker - Mozilla
- DougT's Ramblings
- Mozilla Quality
- Zach's Blog: Mozilla Posts
- del.icio.us/oeschger/mozilla
- unconditionally interesting
- Glazblog
- sidesh0w.com
- MDC Webwatch
- Wisdump
- css thesis
- Creating Passionate Users
- Camino Update
- hicksdesign - sidenotes
- SeaMonkey QA
- phil ringnalda
- Fried Fish
- Lair of the Wolf: Mozilla Posts
- pretty widgets
- Asterisk
- chase's blog
- Web Standards Awards
- I really hate the kitchen sink
- Alazanto
- Blogzilla - a weblog about Mozilla
- UK Thoughts
- YourTotalSite (Summaries)
- MozillaNews.org
- nundroo
- Yellowlane
- Rob Weychert: Ask The Monkey
- Rational Action
- Stylegala | worth a visit
- Dunstan’s blogmarks
- Dunstan’s blog
- The Man in Blue
- RAILhead Design
sources
456 Berea Street
FileVault can cause default applications to reset in Mac OS X 10.5
For quite some time I’ve had this very annoying bug on my office Mac. Every time I rebooted, all default applications were reset. Text files would open with TextEdit, HTML files with Safari, .aspx files with iCab (yes, really), and so on. Extremely annoying.
Well, it took me a while but I finally figured out that the problem was caused by FileVault. In case you’re having the same problem, here’s more detailed info:
It seems like there are two workarounds until Apple fixes this bug – disable FileVault or run a shell command that does some magic to Launch Services at startup. Check the discussions I linked to for the command.
Posted in Mac.
Screen reader testing
Though as a sighted user I find it very difficult to fully grasp what it’s like for a blind or severly vision impaired person to browse the Web with a screen reader, I still think it’s quite useful to spend some time with a few screen readers.
If nothing else it gives you some kind of idea of the kinds of problems you run into when you can’t see the website you’re visiting. Having access to screen readers is also important for testing that the sites you build don’t create unnecessary obstacles.
Installing and setting up screen readers can be a bit tricky though, so the instructions Todd Kloots provides in Configuring Your Machine For Testing With A Screen Reader will come in handy for many.
As long as you have access to some kind of virtual machine software (Virtual PC, VMWare Fusion, Parallels Desktop and Virtual Box are a few options) and Windows, following the steps in the article will help you get the JAWS, Window-Eyes, and NVDA screen readers set up and ready for testing.
An article with similar tips is Henny Swan’s Setting up a screen reader test enviroment.
Posted in Accessibility.
European Accessibility Forum Frankfurt
An interesting conference that is coming up soon is the European Accessibility Forum Frankfurt that will take place in Frankfurt, Germany on 27 March 2009.
There are many well-known accessibility names among the speakers who will discuss the following topics:
- Accessible Web Applications
- Mobile Access – Device-independent or Accessible?
- Comparison of National Accessibility Guidelines
- Accessible Rich Internet Applications (ARIA)
- Web Standards and Accessibility in Higher Education
- Harmonising European Accessibility Guidelines
- The Business Value of Accessibility
If you can make it to Frankfurt on 27 March, register while there are tickets left.
Posted in Accessibility.
A List Apart
The Elements of Social Architecture
Fluid Grids
In Defense of Readers
A Test Guy
CubicTest, with pictures
OSTATLI a success, and a lot of fun
Test Data Management
Airbag Presents: Longboard
PeopleBrowser should be called StalkerBrowser.
Alazanto
Fragment 1
Compatible
Together We Sit
alex.polvi.net
Free Culture Conference in Berkeley, Oct 11th & 12th
10 years of Hampster Dance + 10 years of Mozilla
Polvi.next
all in the head
Supersleight jQuery Plugin for Transparent PNGs in IE6
I never meant to become obsessive about getting PNG transparency working nicely in IE6. In the summer of 2003, I hit across a situation on a client project where what the designer wanted required the use of PNG transparency. The script that came to hand to get this working in IE6 at the time was called Sleight, but that only dealt with applying the filter to IMG elements. My design needed to do the same for CSS background images, so I hacked up a different version of the script for that purpose, called it bgSleight, and occasionally updated it.
Back in late 2007, I gathered up the work I’d been doing on bgSleight along with updates from Aaron Boodman’s original Sleight script and wrote Transparent PNGs in Internet Explorer 6 over at 24ways. In the article I go into some depth about the issues and the pitfalls of using an IE filter, so it’s a useful background read. Included with the article was a script I called SuperSleight which attempted to wrap up both my work and Aaron’s into a single script that made PNGs work in IE6, regardless of them being applied with CSS or HTML IMG tags.
Despite some efforts to make my script play nice and integrate with other JavaScript that may be in use on the page, a lot of users still found the script problematic. Whilst I was checking for existing onload event handlers in the page before adding mine, other scripts don’t necessarily do that and so could overwrite my event handler causing the script not to work. Not my fault, but still not good for those with the problem.
With the rise of JavaScript libraries over the last couple of years, the ecosystem has got a lot more friendly. Rather than having a page running a mishmash of different scripts running in different methodologies, the adoption of a library brings with it shared methodology and infrastructure. That means you can do things like set an onload handler and not worry that your code will not get executed – the library is managing that across all the JavaScript that may be on the page. This also means that there’s a lot less code that needs to be written per-script, as you can tap into what the library already has on offer. So it made sense to me to re-implement SuperSleight using a common JavaScript library.
The PluginI personally use jQuery in my work, and its widespread use and solid plugin architecture made it a good choice.
Download SuperSleight for jQuery (current status: beta)
You apply it to a section of the page like this:
$('#content').supersleight();
Of course, if you wanted to fix PNGs for the entire page, you can just apply it to the body element. For all sorts of reasons, it’s better to be specific if you can.
$('body').supersleight();
This can be safely reapplied after importing a chunk of HTML via an Ajax request (something I end up doing a lot), and it uses jQuery’s browser detection to only apply it to the appropriate versions of IE, so it’s safe to deploy for everything, or to include inside some Conditional Comments as you prefer.
As always, the script requires the path to a transparent GIF shim image. By default, and almost by tradition with this script, that’s x.gif, but you can specify any image you like:
$('body').supersleight({shim: '/img/transparent.gif'});
Other possible configuration values are imgs and backgrounds (both boolean, default true) to tell the script which PNGs to fix up, and apply_positioning (boolean, default true) to tell the script not to try and fix up some of the bugs around unclickable links. (See the 24ways article for more info on that).
As always, this is a work in progress, and I value any feedback on technical issues, ease of use or style. I’ve labelled the plugin as beta, because although it’s tested it could always use more. I need to thank Brad Wright for his valuable input so far. I welcome yours.
The Cost of Accessibility
As a web developer, there’s little I dislike more than building sites to be accessible. Making sure we don’t build dependancies on JavaScript, making every widget work with a keyboard and not just a mouse, making sure that everything can resize without the layout breaking; it’s all a royal pain in the backside. Get it wrong and make a mistake and a whole bunch of ‘experts’ (who don’t even rely on the technology themselves) will whinge at you something awful.
We still do it, however, and we do it because it’s the right thing to do. Like paying taxes or putting the trash out, there are things we do in life that aren’t much fun but are incredibly important. Fail to do them and our collective quality of life is diminished. So as much as I find it an unpleasant chore, I’m firmly committed to building sites that can be accessible as I can make them.
The cost of this can be high, however, and the source of the cost is twofold. Firstly we need to consider the time it takes to thorough implement and test features in an accessible way. Whilst it’s true that a straightforward site build shouldn’t (and if done well, doesn’t) take any longer to do well than do badly, when we get into more complex UI territory with web apps there is certainly an overhead involved. But that’s fine, it takes time to do a high quality job in any field of work.
The other cost is the cost of progress or the cost of our resistance to progress. In our effort to provide an equivalent experience to all of our audience and to not build dependancies on JavaScript in particular, we have made the implicit decision to limit ourselves to a fairly basic set of technologies and working methods. Shed this requirement, and a whole world of possibilities opens up.
The Magical World of JavaScriptA big challenge we face as web developers is dealing with unknown variables. We don’t know what sort of browser is being used, what its CSS capabilities are, how big the window is, what size the fonts are set at and so forth. Further to this, many of those variables can change once the page has already been rendered – the window can be resized, the font sizes changed and so on.
As neither HTML nor CSS is a programming (or scripting) language, we lack the basic principal of conditionals. In all but the most basic of scripting languages a construct is available to say if this condition is met, do this. We can’t do that in HTML or CSS, despite having many ifs, whys and whats to contend with. As such we have to build very defensively, with a very basic set of options available to us.
Once we’re happy to depend on JavaScript, all this is no longer a problem. Most of the challenges we face working in a browser environment with CSS are trivial to solve because we can measure what’s happening on the page and with the window and manipulate both our markup and styling to respond to the situation. Centre in the browser window? No problem! Equal height columns? Easy!
Of course, there are still differences with how the situation is tested, measured and corrected between different browsers, but these are fewer with each new browser release, and can be centrally addressed and abstracted by JavaScript libraries. After some work, this leaves us with a web environment more akin to that of a predictable and capable desktop application.
Enter Cappuccino and AtlasThis is the space that the Cappuccino framework operates in. The team behind Cappuccino, 280 North bill it as a framework for building “desktop-caliber applications that run in a web browser”. They certainly seem to deliver on that promise, too. Just take a look at their demonstration 280 Slides product – an amazingly desktop-like tool in the style of Apple Keynote. This stuff is mind-blowingly cool.
By deciding to remove the constraint and build with a dependancy on JavaScript, along with doubtless hard work, creativity and programming skills, the 280 North guys have been able to push the technology way beyond what everyone else is able to do day-to-day on the web. They’ve built something that is more like a desktop app than we’ve yet seen on the web. But view source and you’ll see that this really is more than a change in conceptual approach, it’s quite a departure on a technical front, too.
Yesterday at the Future of Web Apps in Miami, 280 North announced and demonstrated their upcoming drag and drop IDE for the Cappuccino framework, called Atlas. It’s worth spending a few moments viewing the preview video over at their site – this really is an amazing piece of work. Just like using Interface Builder or Visual Studio to create the UI for a desktop app, users can drag and drop components into place in a window, set how they behave and bind data and interactions to them. It’s all very cool.
The resulting application is a real departure from what we know today as a web app. View source and you’ll find that the entire thing is generated with that dependancy on JavaScript.
A Different EnvironmentLet’s say we were to make the decision that’s it’s ok to depend on JavaScript for all the advantages that brings. The few users who have JavaScript disabled will have to enable it, and those who don’t have the option to enable it, well they can’t ride. You could then go ahead and build a really nice interface with all the bells and whistles required.
The important thing to understand about desktop software is that when you place a button on the screen in Interface Builder, the operating system knows it has a button. It has predefined behaviours, it responds to the keyboard and mouse, and there are underlying APIs for assistive technologies to hook into to read and activate the button. On the web we have none of that available for free. If we build a custom widget, even something as simple as a button, we might use a few images for the visual representation and then hook up an onclick event to catch the user clicking on it. If we’re being thorough, we’d also set the mouse over, mouse out, key down, key up and hover states too. What we’d have, however, would still just be some images with events on them, causing them to behave like buttons. The crucial missing part is that nothing else knows they’re buttons. That includes the browser and any assistive technology. Whilst the page might look right, it’s not going to work well outside mainstream use-cases.
A big advantage of using a framework, of course, is that you can solve all these problems once. Desktop software developers don’t need to care about how to build a button because the operating system has figured that out for them. So it must be for the web. If a framework like Cappuccino or any other is to implement its interfaces using none standard, JavaScript-dependant techniques, then it must ensure that those interfaces are fully accessible when JavaScript is available. If we want to use this stuff, we – and I do consider this a collective responsibility – have to figure out how to make it work properly, for everyone. Before we can do that, the guys at 280 North need to accept that this is a necessity.
Shortly after the announcement of Atlas at FOWA, Ryan Carson tweeted that it was going to change the web industry forever. Atlas could, in fact, change the way we develop web apps. 280 North currently have the rare opportunity of determining whether that change is for the better or for the worse.
HTML and Web Standards Training
Since we began running our CSS beginners course last year, we’ve had a number of requests for an entry-level course on using HTML and web standards principals in general. It makes sense, as a working knowledge of basic HTML is really needed to take full advantage of the instruction we offer on CSS. So we’ve put one together.
It’s a one-day course in which we’ll be covering all the basics of HTML 4, XHTML and briefly looking forward at the upcoming HTML 5. We’ll cover the principals of semantic markup, the separation of content, structure and presentation, the fundamentals of progressive enhancement and even microformats. Delegates will discover the impact of markup on SEO and Accessibility, and learn how best to work in order to benefit both.
It’s actually a beginners course I’ve always wanted to see: Learn How to Do It Properly From the Start. If you’re not the sort of person who learns well from The School of View Source, then I think this would be a day well spent. I think it’s going to be perfect for those who have to use HTML as part of their job (like site managers, content editors or even clients!) as well as those wanting to take some initial steps into building for the web.
We’ve scheduled the first one back to back with our CSS beginners course next month, and are offering a good discount to those who book on both days.
And all that Malarkey
tweetCC is Wired
I'm sorry for posting twice on the same day about tweetCC, but it's not everyday that something that I have worked on and feel super passionate about is picked up by, and hits the homepage of Wired. (More at For A Beautiful Web)
Designing tweetCC
This week Brian Suda and I launched tweetCC, a Twitter micro-app that allows Twitter users to declare a Creative Commons license for their tweeted content. I'll be writing more about why we decided to make tweetCC and why licensing you tweets is important in a future entry, but as several people have commented on my design and CSS implementation, first a few words about them. (Comments are open at For A Beautiful Web.
Do UK government web sites need to look exactly the same in every browser?
No, they don't. As Jeremy Keith so kindly pointed out, it's a subject that I have been banging on about for quite a while now. Comments are open at For A Beautiful Web
Andy Budd::Blogography
Why Friends Reunited Failed
I was recently interviewed by the Independent on Sunday to get a design perspective on why Friends Reunited ultimately failed. However rather than the design of the site, I think the design of the system was ultimately to blame.
Friends Reunited was one of the first “Social Networks” in the UK, long before the term had even been coined. Like all good web applications it made something that was difficult to do in the real world, incredibly easy. You could now re-connect with people from your past and spark up new friendships. It also tapped into two basic human traits; curiosity and gloating. Whether this was through design or by pure accident, the desire to see what had become of your childhood sweetheart or your school bully proved impossible to resist.
Like all social sites, Friends Reunited relied on the network affect, so when membership reached its tipping point the whole site went viral. However a lot of viruses burn through their fuel so quickly they die almost as fast as they grow, stifled by their own success. So with Friends Reunited once you’d registered, seen what your old friends were doing, connected with the ones you’d wanted to and had a laugh at the (hopefully) tragic lives of your childhood tormentors, there was very little reason to stick around.
The design of the site was delightfully amateurish, which was no surprise considering the background of the creators. However it had a low-fi aesthetic that made it feel genuine; something it shares with it’s later contemporaries like MySpace. The truth is, while a better design would almost certainly helped its fortunes, people are willing to ignore bad design and usability if the perceived value is great. With Friends Reunited there were no credible alternatives or competition so people were happy to make do.
I think one big problem was the business model itself. With so many users, Friends Reunited wanted to capitalise on this by charging a membership fee. Now this was during a time when Internet business models were still being tested, so it’s impressive that they managed to charge for the service at all. However charging for a service changes the whole dynamic of a site and causes people to game the system in order to get the maximum return on their investment. So it becomes less of a community and more of a commercial relationship. Like a lot of commercial relationships, once the value runs out, people will stop paying and leave.
Modern social networks do a much better job at keeping their members engaged than Friends Reunited. So Facebook quickly expanded from a way of getting to know people on campus into a way of connecting with old friend and managing new ones. In fact you can now use Facebook in numerous ways, be that chatting with friends, playing games, managing your social life, flirting or micro blogging. Facebook has managed to create a whole ecosystem and become an essential part of peoples social lives. What’s more, rather than charging for this privilege, they give it away for free and make their money from additional services.
Conversely LinkedIn started life as a generic social networking site but quickly specialised in the field of professional reputation management and recruitment. This model has much more longevity than simply “getting in touch with friends from school” and allows LinkedIn to charge for professional services that help their users solve a real world problem.
Product design and business model speculations aside, I think there is also a big element of timeliness and zeitgeist. Friends Reunited managed to capture the attention of millions of people and was very successful in it’s day. However human attention is fleeting and you can only maintain this until the next cool meme comes along. Because of this I’m unsure if any of the big social networks have much longevity and if we’ll be having the same conversation in 10 years time. Is social networking here to stay or is it just a blip on the evolutionary path of the Internet?
9 Ways to Stop Your SXSW Panel From Sucking
Each year, hundreds of assorted geeks will get the chance to speak on a panel at SXSW, many for the first time. I’ve witnesses some truly inspiring and thought provoking sessions at SXSW. However I’ve also had to sit through my share of turkeys, from the mind numbingly boring to the painfully embarrassing. So here are my top 9 ways to stop your panel sucking.
- Keep your introductions short and sweet. Nobody wants to hear your life story.
- Create drama. Panels suck if everybody agrees, so don’t be afraid to argue.
- Plan your panels in advance. Don’t tell your audience you met for the first time that morning.
- Alternatively keep it spontaneous. Don’t tell your audience about the great discussion you had over breakfast.
- Make your responses snappy. Don’t hog the mic and don’t waffle.
- Don’t try to be be smart, cute or wacky if you’re none of those things.
- Be interesting. Try to entertain and inspire as much as educate.
- Keep the pace going. A good panel will live and die by it’s moderator.
- Audience questions need to be short and to the point. Cut people off if you need to.
As I’m on a panel for the first time this year (I normally do presentations) hopefully I’ll heed my own advice and manage not to suck.
Is your website like a leaky bucket?
A lot of companies make money by driving traffic to their sites through marketing or SEO campaigns in the hope that some of their visitors will turn into customers. This makes sense when attention is plentiful and online marketing is cheap. However as marketing costs rise and attention becomes increasingly scarce, companies need to look outside of the traditional marketing funnel. Rather than simply increasing traffic, companies need to start focussing on conversions. After all there’s no point spending large sums of money pushing people to your site if they leave when they get there.
I call this the “leaky bucket” approach to product design and marketing. When water is cheap and plentiful, you don’t mind spilling most of it on the ground as long as you capture enough to quench your thirst. If you need more water you simply open the tap faster. You’ll end up spilling more but it doesn’t matter as you’ll catch more as a result. However as water supplies start to dwindle and costs begin to rise you’ll eventually reach a point when you can no longer afford to be wasting so much water. Instead it become much cheaper and more efficient to repair your bucket. As it currently stands most websites are literally leaking customers. These are people that actively want to use your product or service but can’t due to poor organisation or design.
This is where usability and user experience comes to the rescue. By ensuring visitors can find what they are looking for when they reach your site, you can plug some of the bigger holes. However the biggest holes are usually core processes like registration or check-out. A badly designed check-out process could literally be costing your company millions in lost revenue. In fact it’s not uncommon to see shopping cart abandonment rates as high as 95% on some sites.
Some of this can be put down to people window shopping, but a lot of this is due to bad process design. Shoppers with money in their hands getting frustrated by badly designed forms, or blocked by requirements to register before purchasing. For instance we came across a site the other day that prevented customers outside the US making purchases because State was mandatory and zip code was limited to 5 characters. We’ve even seen situations where customers think they have made a purchase but haven’t due to poor feedback design. All these issues are simple to discover and simple to fix.
So as attention starts to dry up, website owners need to start looking at plugging the holes in their system or risk losing out on business. After all it’s been known for a long time in marketing circles that it’s much cheaper to keep existing customers than it is to find new ones.
as days pass by
Roman dates in Wordpress
Updates on the “ARIA stylesheet” hack
Jif Lemon Day
Asa Dotzler - Firefox and more
firefox 3.1 beta 3
The third beta of Firefox 3.1 (soon to be renamed to Firefox 3.5) is now available. You can read all about it at Mozilla Developer News
not the only one
I'm glad that I'm not the only one that's annoyed by this.
firefox add-on developer guide
If you're an add-on developer or want to become one, the just now published draft of the Firefox Add-ons Developer Guide is for you. Go check it out and if you're so inclined, help make it better.
Asterisk
New Site!
The Creative License
Closing Comments For a Bit
Authentic Boredom
The 5 P's of Twitter's runaway success
Hi there, respected Twitterer. Follow me at @cameronmoll.
Twitter, the social ______ application for which no one can accurately describe its purpose (except this video), became a runaway success last year. The San Francisco-based startup added 70% of its subscriber base in 2008 and is steadily growing in 2009, with an estimated 5,000 to 10,000 new accounts opened every day (source).
Actually, I think we enjoy claiming we can't describe what Twitter is, yet a closer inspection of it yields not only a better understanding of it but also why it's become so prevalent in the media lately. And when that kind of inspection occurs, it's not surprising to the inspector why Twitter is where it's at today.
1. Prudence. Twitter is solid proof that there is undeniable merit in doing just one thing -- as a business, as a strategy, as both -- and doing it really well. Users have 140 characters or less to share a thought, link up a URL, post a status update, or ask a question. That's it. Brilliant.
If Twitter lies at one end of the spectrum doing one thing really well, Facebook lies at the opposite end attempting to do all things well: status updates, networking, photos, videos, groups, etc. In terms of subscribers, Twitter's 6 million unique visitors lag far behind Facebook's 68 million (source). These numbers clearly indicate many web users currently prefer the everything-but-the-kitchen-sink utility offered by Facebook, but I suspect Twitter has the potential to not only narrow the gap but even outlast its Palo Alto neighbor by merely doing one thing superbly well.
...until, of course, we're over Twitter too and we move on to the next technology. See #3.
2. Pulse. I know of no more immediate way of gathering, monitoring, or responding to feedback about/for an idea, a question, a company, or an industry. Want to know what Twitter consumers are saying about Nike right now? How about the Lakers? Or photos for breaking news before any of the major media sources can report it? Or which shoes to purchase?
In fact, AdAge reports that Twitter is exploring even more ways of leveraging the Twitterverse for immediate feedback, enabling (from what I can gather) search.twitter.com to not only search previous tweets but also to generate new ones based on the search query.
3. Proximity. It seems with every new web trend or technology we gradually draw closer in virtual proximity to persons we admire and to the authors of the content we consume. First, it was the personal or corporate website with its distant, one-way consumption of information. Then came blogs and the ability to generate two-way conversation with the author by commenting on content. And now we have Twitter, enabling one to engage in tweets with Dave Matthews or to track down Shaq at a local diner.
4. Promotion. I've heard enough people complain there's no point to Twitter to come to this conclusion: You get back from Twitter what you put into it. Spend time and effort growing a network of followers, and soon enough you'll find Twitter to be a powerful promotion tool. For example, many of my initial letterpress poster sales back in December came as a result of my tweet, not so much because of my blog post. Additionally, I use automated tweets for Authentic Jobs as another means of fostering business.
Follow a regimen akin to Jack Humphrey's 90-10 rule, or whatever works for you, and you'll likely cultivate a valuable marketing resource.
5. Prominence. I'm certain I'll get flak for this, but it's worth not beating around the bush to just come out and say it. Twitter puts one's ego follower count front and center. In the heyday of blogging, one could quickly estimate and deduce -- whether accurately or not, foolishly or prudently -- the prominence and traffic of a blog based on the average number of comments on articles or the FeedBurner reader tally. These days it's follower count. It's unsurprising so many individuals and companies are sponsoring contests to drive follower count upward, whether for intrinsic gratification or for promotional purposes. See #4.
Granted, certain individuals such as celebrities will garner large quantities of followers regardless of what they tweet about, but for many Twitterers, it remains a challenge to constantly be acquiring new followers.
So, when scrutinized as we've done here, Twitter really isn't such a mystery after all, is it?
Recent job listings (and job search data)
I was reviewing analytics data for Authentic Jobs this morning, and some figures emerged that are remarkable, but also somewhat unsurprising:
- For the same monthly period one year ago, visits to the site have increased by 45.9% and average time on the site has increased by 22.9%.
- For the same annual period one year ago (technically two years ago), visits to the site have increased by 76.0% and average time on the site has decreased by 5.1%.
I say somewhat unsurprising because given the current economic climate, one can assume traffic to online job boards has increased in the last 6-12 months. Indeed, a recent report from comScore confirms this assumption: Job search ranked as the fastest growing U.S. online category in 2008. Had comScore's study included other countries, the same trend would likely have emerged.
Of course, Authentic Jobs welcomes any and all increases in traffic, and the site will continue to connect talented creative and web professionals with great work opportunities -- as it's been doing for nearly four years strong.
Some recent listings are highlighted below.
Full-time (U.S.)
- Auburn, AL Front-end Web Developer at Politics4All
- Cupertino, CA Sr. Web UI Engineer at Apple Inc.
- Los Angeles, CA Flash Developer at HUGE
- Palo Alto, CA Product Designer at Facebook
- Golden, CO - Anywhere - Work Remotely Gifted Web Developer at RocketTheme, LLC
- Washington, DC Production Specialist (Web/Multimedia) at AAAS
- Lewes, Delaware Senior Web Designer at DecalGirl
- West Springfield, MA Web Marketing Manager at Aspen Square Management
- Lincoln, NE Interactive Operations Manager at Swanson Russell
- New York, NY Web Designer at Six Apart Inc.
- Eugene, OR Sr. Developer, Back-End at GarageGames
- Philadelphia Web Designer at Happy Cog Philadelphia
- Alexandria, VA Senior Frontend Web Developer at MPRI
Freelance
- Anywhere Interaction designer at Sideshow
- Anywhere Senior Designer Needed for Product Incubator at Jason Reed Web Design
- New York, NY E-Commerce Web Designer at Bonobos
Post a job or find one at Authentic Jobs.
Speaking at HOW Design Conference in June
I've been reading HOW magazine on and off almost since I began my career as a designer 11 years ago. Every issue seems chock full of inspiring design, interviews with other designers I admire, and the like. Most issues land a permanent spot on my bookshelf.
For almost as long as I've associated myself with the magazine, I've had two wishes. These were never written down on paper. They existed only as an aspiration in the back of mind. The first was to have my work featured in a HOW design annual. The second was to speak at a HOW conference.
I have no idea the stars have aligned so perfectly in my favor, but this year I will fulfill both of those wishes. At the start of this year, one of my letterpress posters was recognized in the 2009 HOW In-House Design Annual.
In June, I will be speaking at the HOW Conference in Austin, Texas for the first time. The event will run from June 24–27 and will be held in the same venue as SXSW, the Austin Convention Center.
Highlights include sessions and speakers such as:
- Print to Web Breakthrough
- The Secret of Project Management for In-House Designers
- Keeping Creative Control with Difficult Clients
- Communicating Up, Down and All Around the Organization
- 10 Things You Didn't Know Fonts Could Do
- Craft + Activism = Craftivism
- Studio tours (frog design, Olive Interactive Design & Marketing, others) for pre-conference attendees
- DJ Stout (Pentagram), Thomas Phinney (Adobe), Cynthia Rapp (Cartoon Network), Lia Braaten Hager (Proctor & Gamble), and nearly 50 other speakers
I'm incredibly excited. Register by April 1 and save $100. Hope to see you there!
Bartelme Design | Journal
Colorsplash Wallpaper
Flux iPhone Wallpaper
Flux iPhone Wallpaper
bc
7
Dell Precision 650, October 2003 - January 2008
Are Macs a ripoff ?
BeatnikPad
Things I will not miss at all come this Saturday
Things I will not miss at all come this Saturday
How to run Safari 4 beta and Safari 3 on the same mac
Berkun blog
A lesson in customer service (why my site was down today)
Live webcast: How progress happens, Free! March 19th
How project managers establish power
Binary Bonsai
Raiders of the Lost Ark - Story Conference Transcript
SK
Stanley Kubrick and the Bad Films
Bit Stampede
A bigger-than-expected project
More MDC mockups
New mockup: Supported technologies
Blake Ross on Firefox
Temptations
Scythe
N-Ball
Blog by Kveton
Why I’m running for the OpenID Foundation BOD
Announcing the Open Web Foundation
Congrats to Chris Messina
blogfour
IE and Flash parameters on redirects
Man, just stumbled over this little gem about Flash and IE:
If you embed Flash, and on the server side use a redirect to point at the .swf real location, including some query parameters all works fine. That is, until you also pass parameters in them html code. I.e. so if you embed “/foo/bar/loco.swf?foo=bar”, and want you redirect to “/foo/bar/chupito.swf?other=bother”, Flash will get “foo=bar” by IE. Nice :(
Christmas is getting near...
… and then we all know that it is time for this song:
(or the other way around: You know that Christmas is near when you hear it :) )
It is that time of year
Send your own ElfYourself eCards![]()
Blogzilla - a weblog about Mozilla
IE7 RSS icon to use Firefox RSS icon
FirefoxView: 'View This Page in Firefox' Extension for IE
View Source Choice
Brendan's Roadmap Updates
TraceMonkey Update
But what I'm sure everyone wants to know is: how do we compare to V8?
Here are the results from head-to-head SunSpider on Windows XP on a Mac Mini and Windows Vista on a MacBook Pro, testing against last night's Firefox automated build and yesterday's Chrome beta:
We win by 1.28x and 1.19x, respectively. Maybe we should rename TraceMonkey "V10" ;-).
Ok, it's only SunSpider, one popular yet arguably non-representative benchmark suite. We are not about to be braggy. ("Don't be braggy" is our motto here at Mozilla ;-).)
But it's worth digging deeper into the results. Let's look at the ratios by test:
We win on the bit-banging, string, and regular expression benchmarks. We are around 4x faster at the SunSpider micro-benchmarks than V8.
This graph does show V8 cleaning our clock on a couple of recursion-heavy tests. We have a plan, to trace recursion (not just tail recursion). We simply haven't had enough hours in the day to get to it, but it's "next".
This reminds me: TraceMonkey is only a few months old, excluding the Tamarin Tracing Nanojit contributed by Adobe (thanks again, Ed and co.!), which we've built on and enhanced with x86-64 support and other fixes. We've developed TraceMonkey in the open the whole way. And we're as fast as V8 on SunSpider!
This is not a trivial feat. As we continue to trace unrecorded bytecode and operand combinations, we will only get faster. As we add recursion, trace-wise register allocation, and other optimizations, we will eliminate the losses shown above and improve our ratios linearly across the board, probably by 2 or greater.
I'll keep updating the blog every week, as we do this work. Your comments are welcome as always.
V8 is great work, very well-engineered, with room to speed up too. (And Chrome looks good to great -- the multi-process architecture is righteous, but you expected no less praise from an old Unix hacker like me.)
What spectators have to realize is that this contest is not a playoff where each contending VM is eliminated at any given hype-event point. We believe that Franz&Gal-style tracing has more "headroom" than less aggressively speculative approaches, due to its ability to specialize code, making variables constant and eliminating dead code and conditions at runtime, based on the latent types inherent in almost all JavaScript programs. If we are right, we'll find out over the next weeks and months, and so will you all.
Anyway, we're very much in the game and moving fast -- "reports of our death are greatly exaggerated." Stay tuned!
TraceMonkey: JavaScript Lightspeed
Here are some select SunSpider micro-benchmarks, to show some near-term upper bounds on performance:
This chart shows speedup ratios over the SpiderMonkey interpreter, which is why "empty loop with globals" (a loop using global loop control and accumulator variables) shows a greater speedup -- global variables in JavaScript, especially if undeclared by var, can be harder to optimize in an interpreter than local variables in a function.
Here are the fastest test-by-test SunSpider results, sorted from greatest speedup to least:
The lesser speedups need their own chart, or they would be dwarfed by the above results:
(Any slowdown is a bug we will fix; we're in hot pursuit of the one biting binary-trees, which is heavily recursive -- it will be fixed.)
With SunSpider, some of the longest-running tests are string and regular-expression monsters, and since like most JS engines, we use native (compiled C++) code for most of the work, there's not as much speedup. Amdahl's Law predicts that this will bound the weighted-average total Sunspider score, probably to around 2. No matter how fast we JIT the rest of the code, the total score will be... 2.
But this is only a start. With tracing, performance will keep going up. We have easy small linear speedup tasks remaining (better register allocation, spill reduction around built-in calls). We will trace string and regular expression code and break through the "2" barrier. We will even trace into DOM methods. The tracing JIT approach scales as you move more code into JS, or otherwise into view of the tracing machinery.
Finally, schrep created a screencast that visually demonstrates the speedup gained by TraceMonkey. These speedups are not just for micro-benchmarks. You can see and feel them. How We Did It We've been working with Andreas Gal of UC Irvine on TraceMonkey, and it has been a blast. We started a little over sixty days (and nights ;-) ago, and just yesterday, shaver pushed the results of our work into the mozilla-central Hg repository for inclusion in Firefox 3.1. The JIT is currently pref'ed off, but you can enable it via about:config -- just search for "jit" and, if you are willing to report any bugs you find, toggle the javascript.options.jit.content preference (there's a jit.chrome pref too, for the truly adventurous).
Before TraceMonkey, for Firefox 3, we made serious performance improvements to SpiderMonkey, both to its Array code and to its interpreter. The interpreter speedups entailed two major pieces of work:
- Making bytecode cases in the threaded interpreter even fatter, so the fast cases can stay in the interpreter function.
- Adding a polymorphic property cache, for addressing properties found in prototype and scope objects quickly, without having to look in each object along the chain.
By the way, we are not letting moss grow under our interpreter's feet. Dave Mandelin is working on a combination of inline-threading and call-threading that will take interpreter performance up another notch.
While doing this Firefox 3 work, I was reminded again of the adage: Neurosis is doing the same thing over and over again, expecting to get a different result each time. But this is exactly what dynamically typed language interpreters must do. Consider the + operator: a = b + c; Is this string concatenation, or number addition? Without static analysis (generally too costly), we can't know ahead of time. For SpiderMonkey, we have to ask further: if number, can we keep the operands and result in machine integers of some kind?
Any interpreter will have to cope with unlikely (but allowed) overflow from int to double precision binary floating point, or even change of variable type from number to string. But this is neurotic, because for the vast majority of JS code, in spite of the freedom to mutate type of variable, types are stable. (This stability holds for other dynamic languages including Python.)
Another insight, which is key to the tracing JIT approach: if you are spending much time in JS, you are probably looping. There's simply not enough straight line code in Firefox's JS, or in a web app, to take that much runtime. Native code may go out to lunch, of course, but if you are spending time in JS, you're either looping or doing recursion.
The Trace Trees approach to tracing JIT compilation that Andreas pioneered can handle loops and recursion. Everything starts in the interpreter, when TraceMonkey notices a hot loop by keeping cheap count of how often a particular backward jump (or any backward jump) has happened. for (var i = 0; i < BIG; i++) { // Loop header starts here: if (usuallyTrue()) commonPath(); else uncommonPath(); }
Once a hot loop has been detected, TraceMonkey starts recording a trace. We use the Tamarin Tracing Nanojit to generate low-level intermediate representation instructions specialized from the SpiderMonkey bytecodes, their immediate and incoming stack operands, and the property cache "hit" case fast-lookup information.
The trace recorder completes when the loop header (see the comment in the code above) is reached by a backward jump. If the trace does not complete this way, the recorder aborts and the interpreter resumes without recording traces.
Let's suppose the usuallyTrue() function returns true (it could return any truthy, e.g. 1 or "non-empty" -- we can cope). The trace recorder emits a special guard instruction to check that the truthy condition matches, allowing native machine-code trace execution to continue if so. If the condition does not match, the guard exits (so-called "side-exits") the trace, returning to the interpreter at the exact point in the bytecode where the guard was recorded, with all the necessary interpreter state restored.
If the interpreter sees usuallyTrue() return true, then the commonPath(); case will be traced. After that function has been traced comes the loop update part i++ (which might or might not stay in SpiderMonkey's integer representation depending on the value of BIG -- again we guard). Finally, the condition i will be recorded as a guard. // Loop header starts here: inlined usuallyTrue() call, with guards guard on truthy return value guard that the function being invoked at this point is commonPath inlined commonPath() call, with any calls it makes inlined, guarded i++ code, with overflow to double guard i < BIG condition and loop-edge guard jump back to loop header
Thus tracing is all about speculating that what the interpreter sees is what will happen next time -- that the virtual machine can stop being neurotic.
And as you can see, tracing JITs can inline method calls easily -- just record the interpreter as it follows a JSOP_CALL instruction into an interpreted function.
One point about Trace Trees (as opposed to less structured kinds of tracing): you get function inlining without having to build interpreter frames at all, because the trace recording must reach the loop header in the outer function in order to complete. Therefore, so long as the JITted code stays "on trace", no interpreter frames need to be built.
If the commonPath function itself contains a guard that side-exits at runtime, then (and only then) will one or more interpreter frames need to be reconstructed.
Let's say after some number of iterations, the loop shown above side-exits at the guard for usuallyTrue() because that function returns a falsy value. We abort correctly back to the interpreter, but keep recording in case we can complete another trace back to the same loop header, and extend the first into a trace tree. This allows us to handle different paths through the control flow graph (including inlined functions) under a hot loop. What It All Means
Pulling back from the details, a few points deserve to be called out:
- We have, right now, x86, x86-64, and ARM support in TraceMonkey. This means we are ready for mobile and desktop target platforms out of the box.
- As the performance keeps going up, people will write and transport code that was "too slow" to run in the browser as JS. This means the web can accomodate workloads that right now require a proprietary plugin.
- As we trace more of the DOM and our other native code, we increase the memory-safe codebase that must be trusted not to have an exploitable bug.
- Tracing follows only the hot paths, and builds a trace-tree cache. Cold code never gets traced or JITted, avoiding the memory bloat that whole-method JITs incur. Tracing is mobile-friendly.
- JS-driven <canvas> rendering, with toolkits, scene graphs, game logic, etc. all in JS, are one wave of the future that is about to crest.
I believe that other browsers will follow our lead and take JS performance through current interpreter speed barriers, using just-in-time native code compilation. Beyond what TraceMonkey means for Firefox and other Mozilla projects, it heralds the JavaScript Lightspeed future we've all been anticipating. We are moving the goal posts and changing the game, for the benefit of all web developers. Acknowledgments I would like to thank Michael Franz and the rest of his group at UC Irvine, especially Michael Bebenita, Mason Chang, and Gregor Wagner; also the National Science Foundation for supporting Andreas Gal's thesis. I'm also grateful to Ed Smith and the Tamarin Tracing team at Adobe for the TT Nanojit, which was a huge boost to developing TraceMonkey.
And of course, mad props and late night thanks to Team TraceMonkey: Andreas, Shaver, David Anderson, with valuable assists from Bob Clary, Rob Sayre, Blake Kaplan, Boris Zbarsky, and Vladimir Vukićević.
Popularity
It seems (according to one guru, but coming from this source, it's a left-handed compliment) that JavaScript is finally popular.
To me, a nerd from a tender age, this is something between a curse and a joke. (See if you are in my camp: isn't the green chick hotter?)
Brendan Eich convinced his pointy-haired boss at Netscape that the Navigator browser should have its own scripting language, and that only a new language would do, a new language designed and implemented in big hurry, and that no existing language should be considered for that role.I don't know why Doug is making up stories. He wasn't at Netscape. He has heard my recollections about JavaScript's birth directly, told in my keynotes at Ajax conferences. Revisionist shenanigans to advance a Microhoo C# agenda among Web developers?
Who knows, and it's hard to care, but in this week of the tenth anniversary of mozilla.org, a project I co-founded, I mean to tell some history.
As I've often said, and as others at Netscape can confirm, I was recruited to Netscape with the promise of "doing Scheme" in the browser. At least client engineering management including Tom Paquin, Michael Toy, and Rick Schell, along with some guy named Marc Andreessen, were convinced that Netscape should embed a programming language, in source form, in HTML. So it was hardly a case of me selling a "pointy-haired boss" -- more the reverse.
Whether that language should be Scheme was an open question, but Scheme was the bait I went for in joining Netscape. Previously, at SGI, Nick Thompson had turned me on to SICP.
What was needed was a convincing proof of concept, AKA a demo. That, I delivered, and in too-short order it was a fait accompli.
Of course, by the time I joined Netscape, and then transferred out of the server group where I had been hired based on short-term requisition scarcity games (and where I had the pleasure of working briefly with the McCool twins and Ari Luotonen; later in 1995, Ari and I would create PAC), the Oak language had been renamed Java, and Netscape was negotiating with Sun to include it in Navigator.
The big debate inside Netscape therefore became "why two languages? why not just Java?" The answer was that two languages were required to serve the two mostly-disjoint audiences in the programming ziggurat who most deserved dedicated programming languages: the component authors, who wrote in C++ or (we hoped) Java; and the "scripters", amateur or pro, who would write code directly embedded in HTML.
Whether any existing language could be used, instead of inventing a new one, was also not something I decided. The diktat from upper engineering management was that the language must "look like Java". That ruled out Perl, Python, and Tcl, along with Scheme. Later, in 1996, John Ousterhout came by to pitch Tk and lament the missed opportunity for Tcl.
I'm not proud, but I'm happy that I chose Scheme-ish first-class functions and Self-ish (albeit singular) prototypes as the main ingredients. The Java influences, especially y2k Date bugs but also the primitive vs. object distinction (e.g., string vs. String), were unfortunate.
Back to spring of 1995: I remember meeting Bill Joy during this period, and discussing fine points of garbage collection (card marking for efficient write barriers) with him. From the beginning, Bill grokked the idea of an easy-to-use "scripting language" as a companion to Java, analogous to VB's relationship to C++ in Microsoft's platform of the mid-nineties. He was, as far as I can tell, our champion at Sun.
Kipp Hickman and I had been studying Java in April and May 1995, and Kipp had started writing his own JVM. Kipp and I wrote the first version of NSPR as a portability layer underlying his JVM, and I used it for the same purpose when prototyping "Mocha" in early-to-mid-May.
Bill convinced us to drop Kipp's JVM because it would lack bug-for-bug compatibility with Sun's JVM (a wise observation in those early days). By this point "Mocha" had proven itself via rapid prototyping and embedding in Netscape Navigator 2.0 , which was in its pre-alpha development phase.
The rest is perverse, merciless history. JS beat Java on the client, rivaled only by Flash, which supports an offspring of JS, ActionScript.
So back to popularity. I can take it or leave it. Nevertheless, popular Ajax libraries, often crunched and minified and link-culled into different plaintext source forms, are schlepped around the Internet constantly. Can we not share?
One idea, mooted by many folks, most recently here by Doug, entails embedding crypto-hashes in potentially very long-lived script tag attributes. Is this a good idea?
Probably not, based both on theoretical soundness concerns about crypto-hash algorithms, and on well-known poisoning attacks.
A better idea, which I heard first from Rob Sayre: support an optional "canonical URL" for the script source, via a share attribute on HTML5 <script>: If the browser has already downloaded the shared URL, and it still is valid according to HTTP caching rules, then it can use the cached (and pre-compiled!) script instead of downloading the src URL.
This avoids hash poisoning concerns. It requires only that the content author ensure that the src attribute name a file identical to the canonical ("popular") version of the library named by the shared attribute. And of course, it requires that we trust the DNS. (Ulp.)
This scheme also avoids embedding inscrutable hashcodes in script tag attribute values.
Your comments are welcome.
Ok, back to JavaScript popularity. We know certain Ajax libraries are popular. Is JavaScript popular? It's hard to say. Some Ajax developers profess (and demonstrate) love for it. Yet many curse it, including me. I still think of it as a quickie love-child of C and Self. Dr. Johnson's words come to mind: "the part that is good is not original, and the part that is original is not good."
Yet here we are. The web must evolve, or die. So too with JS, wherefore ES4. About which, more anon.
Firefox 3 looks like it will be popular too, based on space and time performance metrics. More on that soon, too.
BSBlog
Performance and Pymake
Sanity and Testcases for pymake
pymake: A Mostly GNU-compatible `make`, Written in Python
Burning Chrome
A Scrollable Grid With Headers, part 1
Recently, I discovered XUL trees will let you select individual cells with a single attribute, seltype="cell":
This gave me a few ideas - most notably about my regular expression grid, which takes up an awful lot of space on the screen. If I could use the tree to simulate a smaller grid, preferably with scrollbars, I could use much less real estate. After a quick newsgroup posting, Mark Finkle and Neil Deakin set me straight - the grid was probably better and more flexible.
Still, trees do one thing grids don't - they have a fixed header row. You can scroll the main body all you want - the header row will stay where it is. Doing the same for a grid was impossible - but if I combined three grids into a single XBL binding...
Note this demo won't fully work without Mozilla Firefox 3.1 beta 2. (It might work on earlier 3.1 builds, but this was the base.) I combined the scrollable content object model with a healthy dose of CSS styling and new bindings. In Firefox 3.0.6, it will partially render, but the headers won't appear.
This opens up a number of possibilities for new widgets. From the newsgroup:
- Menulist editor: Label, value, description
- Entity localizations: Entity name, English, other language
- Regular Expression testing grid
- A menu list containing namespace URI-prefix pairs
- A spreadsheet with header rows & columns
- Logic grid puzzles
With all this said, I think I need your help. Although I wrote this as a general-purpose binding, I hardly think it's ready for adding to the XUL toolkit. This is proof of concept code, and it has a few shortcomings:
- Navigation by cells - not by rows or by columns. (Suppose you want to select a whole row? I didn't implement that.)
- No specification. No rules on how it's supposed to behave other than, "Does it look right when I move it?"
- No tests. I wouldn't want to check this into Mozilla without some regression tests to make sure it works.
- Performance. In loading the test page, I noticed today that my more recent changes causes the CPU to spike for a couple seconds. That's bad, and I don't know where the bug is.
- The accessibility people will probably want to add some useful support roles.
- Selecting a cell throws off the header rows' & columns' scrolling.
- A really bad binding name: gridbox. It was the best I could come up with.
I filed bug 477446 for this. I'd like to see if anyone's interested in working on this binding, cleaning it up, writing tests for it, and generally making it Toolkit-ready. I think it's potentially very useful.
Comments are open!
I have a scrollable content object model... too late
Several years ago, I griped (unsuccessfully) about the need for a scrollable content object model. I remember someone mentioning on planet.mozilla.org that this would not be a problem going forward, but I couldn't find the entry. So today, I was exploring another user-interface concept, and it led me back again to scrollable content. (As you read this, my context is the XULRunner 1.9.0.x code base.)
Ahh, I remember the frustrations well. It took me several hours (and a few blind alleys), but I actually hit on a really simple way to tell where a XUL box with scrollbars has scrolled to. Though the XUL box itself has to use my particular XBL binding and CSS styling, it's still a nice starting point.
Here's the binding, stylesheet, and a demonstration all in one. Note that it's a lot cleaner than my previous attempt, and it works.
I realize the scrollX and scrollY properties are read-only. I don't see a way around that for this approach. If you really want it, you'll probably have to implement a native-code, C++-based component.
Or, you could wait for Firefox 3.1 / XULRunner 1.9.1, which now has scrollLeft and scrollTop for all DOM elements - and it's settable there, too. (This makes the third big improvement I'm looking for in XR 1.9.1 that isn't in 1.9.0.x, which means it's time to seriously think about moving forward... The other two are new drag and drop features, and a DOM Range fix I pulled in from very early in the 1.9.1 cycle.)
Note I groaned very audibly when I was writing this article and decided to check what 1.9.1 has. Talk about a feeling of a wasted day!
Twenty minutes a day
Sometimes, that's all it really takes, when you're hacking code. You know how I know? I tried it last week without even intending to.
In my case, I commute from San Jose to Mountain View every day. On the CalTrain, that takes twenty minutes. I also commute back on the CalTrain - another twenty minutes. That's enough time to pick up where I left off, fix a little bug in my code, rerun the test, try to fix another little bug, and power down the laptop. I'm just fixing bugs at the lowest level of complexity - one component, one interface, one test case. For a twenty-minute session, that's about all I need to think about debugging.
Now, of course, I spend a lot more than twenty minutes a day working on projects for the office. I'm also (I hope!) more efficient with my time at work - I can juggle a lot more files in my head at the same time when I have more time. For the really small stuff, you can achieve a lot in twenty minutes a day.
One other benefit, and I believe I've said this before: When you're working with test cases, those test cases later become examples you can reuse in your actual production code. More importantly, they should produce code you can cut-and-paste into your real program, with only variable name changes. That greatly increases the chances your code will work as you intend it to - if you test code one way and it passes, use that way to implement your real work. (Or, just write your test to emulate how you'd really use your component.)
Calendar Weblog
Lightning is an unusual Mozilla application
Since the start of February, the statistics capabilities of addons.mozilla.org have been upgraded. It is now possible to see the number of active users on a daily basis, where before it was only shown on a monthly basis. This shows some interesting facts about Lightning.
What is pretty apparent from the stats is that Lightning's usage is much higher during the week than on the weekend. This is a stark contrast to Mozilla's main application Firefox, which is usually used by more people on the weekend than during the week.
On Windows the usage numbers during the week are about twice as high as on the weekends, while on the other operating systems (Linux, MacOS X, Solaris, *BSD, OS/2) the usage numbers are just about 30% - 40% lower on the weekends.
This seems to indicate that we have a lot of business users out there using Lightning and that most of these business users use Windows as their platform of choice.
What we also see is that roughly 87.5% - 89.1% of our users are on the Windows platform, 7.6% - 8.6% use Linux and 3.1% - 3.8% are MacOS X users. Users of other operating systems range between 0.13% and 0.16%.
Those of you, that want to play more with our download numbers, can do this on the Lightning Statistics Dashboard, where you can find much more data to play with.
PS: Don't ask me about the low numbers on five days in early February. These are clearly incorrect and probably a result of an addons.mozilla.org bug, that was fixed later on.
[February 25, 2009] Lightning/Sunbird Status Update
After all the bad news in the last few days, here are some good news at last: Our recent bugfixes. Everything considered, the last 28 days were pretty good in terms of the number of bugfixes. Hopefully we can keep this up as more people will step up and help us with bringing the Calendar Project forward.
Here's the list of the 47 bugfixes in the last 28 days:
- Bug 345607: Copy recurring event and paste to another day appears to work but event is not saved
- Bug 357332: Holidays in Chile
- Bug 358217: Catalan holiday calendar
- Bug 379097: Export should default to ics
- Bug 405033: Remember last selected task when sorting list in Task mode
- Bug 421329: Freebusy information is not loaded for multiday events beginning previous to look-up date
- Bug 429126: Infinite loop at refresh when a calendar is deleted from the server outside of Lightning
- Bug 449567: 'Dismiss all' alarms of recurring events -> error console output
- Bug 457823: Mini-month vs datepicker on calendar pane
- Bug 463273: Error: Failed to read 'repeatDetailsOrdinal0'
- Bug 463679: Two email notifications sent for cached CalDAV calendar
- Bug 463960: Cannot refresh cached CalDAV calendars
- Bug 463961: Unnecessary fetch of all etags for cached calendars
- Bug 468723: Incorrect doModifyItem for CalDAV servers where the inbox matches the calendar uri
- Bug 469605: Incorrect handling of mBatchCount
- Bug 469767: Very slow etags parsing
- Bug 472314: Add some documentation to calendar code
- Bug 474361: Remove and rename calendar-decorated panes
- Bug 474630: Alarms don't work for recurring events
- Bug 474632: Update internal timezone database to version 2009a
- Bug 475170: LDAP Lookup broken in Invite Attendees dialog
- Bug 475549: ICS file for Norwegian holidays 2009-2013
- Bug 475599: Create the backup files in calendar-data folder instead of the backupData folder
- Bug 475745: Updated English Holidays calendar
- Bug 475803: Cal.fromRFC3339 matches fails to set timezone correctly
- Bug 475887: ${BrandFullName} needs to be quoted in shared.nsh
- Bug 476219: Drag and drop of event works but MODIFICATION_FAILED dialog is shown
- Bug 476262: alarms don't fire/show up/no reminder (alarmDate is not defined)
- Bug 476331: Replace InfoText with Info in updater.ini using sed in locales Makefile.in
- Bug 476518: Sunbird debug symbols for crash reports seem to be missing
- Bug 476867: Download links for Sunbird 0.7 and older releases do not work
- Bug 477009: Unable to get directory path for directories immediately under some symlinks
- Bug 477064: Recurrence description for weekly event uses repeatDetailsOrdinal* where should be weekday
- Bug 477207: Remove installer code that adds unused registry key values
- Bug 477445: What is this "orientation" of which you speak?
- Bug 477474: Remove searchplugins occurrences from locales/Makefile.in
- Bug 477664: No vertical space between label and underline indicating accesskey
- Bug 479327: On startup, icon in statusbar shows offline mode
- Bug 479513: task description box vanishes when dragging scrollbar in task list
- Bug 479577: Creating event/task with alarm on end/due date throws exception NS_ERROR_OBJECT_IS_IMMUTABLE
- Bug 479578: Creating task with alarm doesn't automatically enable the required start or due date anymore
- Bug 479599: Bugs.html: request review from module owner
- Bug 479605: FAQ: local file steps are out of date
- Bug 479606: FAQ: how to tinker: change "cvs" to comm-central
- Bug 479610: FAQ: netscape server -> sun server
- Bug 479695: Canceling Custom Reminder dialog trows error "customItem.reminders is undefined"
- Bug 479707: Error notification dialog: "Error number" should be "Error code"
Even more on the Sunbird/Lightning decision
- Various people have asked for the Mozilla Foundation or Mozilla Messaging to step in and help us out.
Short answer: They already are helping us out.
Long answer: Mozilla Messaging is already helping us out on the build engineering side and the Mozilla Foundation is actively working with us to make it possible for people to donate to the Calendar Project via the Mozilla Foundation. - Raffael asked: "How close are you working together with Spicebird? Are there other projects like Spicebird that could contribute code to Lightning?
We are working together with the Spicebird people. Their calendar code is mostly based on our code. We are also working closely together with the folks from SoGo. - Dave asked: "What happened to the guys at Sun? I was under the impression that there was a small team of developers at Sun working on Lightning specifically. Has Sun stopped their involvement?
We covered this issue in Philipp's original announcement. Here's the relevant paragraphRecently, several contributors who were working on the project full-time have left the project or have shifted to free-time contributor status due to other obligations. This means their contributions will be limited to their spare time, which is quite sparse given a full-time job and family. - Sunbirduser said: "The most important question is not whether sunbird or lightning will be stopped, but how to get new interesting people into the project and how to get more developers. This is the work of the project leader!
Like Philipp said in his original announcementOur next release will include Sunbird, but subsequent releases won't unless new contributors take on the work. and This is really a tremendous opportunity for anyone who is interested and willing to help make a difference here for the project and its hundreds of thousands of users -- get involved! Things will happen if someone actually steps up and makes them happen. That is how it works in the open source space. Philipp is very important as the project's lead developer, but he's not anyone's boss and can't command anyone to do something. Interested people will need to step up and do something, then Sunbird can live on.
Call Me Al
Firefox in Cats
Does this blog still work?
Portable Firefox
I have 9 extensions which are not yet compatible, though I know that several of them were tagged as ok for previous alpha and beta versions of Firefox 3. Unfortunately one of the disabled addons on Nightly Tester Tools, so I can't mark the others as compatible.
I can live without the other extensions for a short time, but before I can switch to Firefox 3, I need IE tab to be updated. I have to use IE for several intranet sites at work and this provides them seamlessly (except for the one website that seems to detect Firefox before IE Tag kicks in).
I haven't really been bothered by Firefox's memory usage, but I'm happy to see the recent progress.
Camino Update
Checkins Between July 11, 2006 and December 31, 2006
(Also note: any bugs that were fixed as a result of regressions from new features probably aren't listed.)
- Bug 151093 - Move tab-set bookmarking UI to Bookmarks menu
- Bug 152147 - Ability to save session state
- Bug 155956 - Zoom command is "maximizing to fill screen" instead of to fit contents
- Bug 159337 - Disable "View Source" from menu/key command when source is in view
- Bug 164733 - Multiple tabs painted redundantly on background tab load/reload
- Bug 179041 - Audit click-through state of toolbar buttons
- Bug 181712 - Menu item for "default font size" (also indicate current text/font zoom value/size?)
- Bug 181721 - Disable menus commands when sheets or dialogs are frontmost
- Bug 188679 - Enhanced tooltips with URL for some Toolbar icons
- Bug 202337 - Make Camino use the same passwords in the Keychain as Safari
- Bug 235863 - Show/Hide Bookmarks toolbar button does not indicate state
- Bug 236674 - Separator appearance should be that of a separator in bookmark manager.
- Bug 240760 - cmd-F (find dialog) should focus quicksearch when organizing bookmarks
- Bug 244116 - Unable to delete bookmark folder that is flagged as Dock Menu + cannot remove from Dock
- Bug 247837 - Trigger autocomplete options for url using down arrow key.
- Bug 271943 - "Show History" should be in "Go" menu
- Bug 275170 - Change "Go" menu to "History"
- Bug 277706 - Need pref UI to control tabbing navigation between form elements and web page links
- Bug 280827 - Preferences toolbar needs help tags (tooltips)
- Bug 285531 - Pressing the Escape key does not close the preferences window
- Bug 288814 - Need to disable the "+" button/menu items in History/Top10/etc.
- Bug 288980 - Add "View (reveal) in Bookmark Manager" contextual menu item for folders in the Bookmark Bar.
- Bug 290212 - Implement bookmark folders' "Open in Tabs"/"Open in New Tabs" with alternate menu items
- Bug 295165 - 32x32 versions of fileHtml.icns and fileBookmark.icns (icons) have a stray white pixel in the upper-right.
- Bug 298932 - cmd-shift-d should both open and close (toggle) the Download Manager window
- Bug 300304 - Bookmarks Bar buttons should darken text on mousesdown
- Bug 300905 - Send "en-US" if "en" is first in language list and no other English dialects present
- Bug 303193 - Make error pages look less like Windows and more like Camino/Aqua
- Bug 303628 - Bookmark keywords with spaces gives "Invalid URL" error if entered in address bar (do input validation on keyword entry)
- Bug 304061 - Refresh (reload) button disabled while page is loading
- Bug 306396 - Don't show wyciwyg URLs in location bar
- Bug 308062 - Trust CA dialogue: "trust this certif for" options text is cut off
- Bug 310395 - Open Link in New Window - new background windows open with Address bar focused
- Bug 313027 - Can't drag plain text url to tab bar
- Bug 313740 - Dragging bookmark from Safari to Camino removes bookmark rather than copies
- Bug 316232 - Add ability to pass RSS/Atom feeds detected on a page to a helper app
- Bug 317952 - When downloads window is active, bookmarks in folders in bookmarks bar ignore tabbed browsing prefs
- Bug 318888 - Color of download icon in prefs should match toolbar icon
- Bug 319408 - "Page Info" should be in the View menu
- Bug 319746 - Bookmark info panel's minimum size is too small.
- Bug 319879 - Loading bookmarks with keywords doesn't allow popups
- Bug 320668 - Dragging a bookmark into the tab bar creates a background tab, regardless of pref
- Bug 322093 - Camino initial bookmark import APPEARS to hang and stall w/ large bookmark imports
- Bug 323718 - Crash in [FindDlgController getSearchText:]
- Bug 324306 - No interface for allowing a user to manually specify which cert to log in with
- Bug 324907 - scrollbars=no ignored in window.open() (again!)
- Bug 325845 - Esc should cancel incomplete edit, not commit it, when closing Bookmark Info panel
- Bug 327203 - First item in pref pane gets focus even when OS pref says not to
- Bug 327488 - [10.4] Can't drag page proxy to mail.app compose window
- Bug 327966 - disable Bigger/Smaller Text in about:bookmarks/about:history
- Bug 328737 - Destination should be consistently remembered when saving bookmarks
- Bug 330534 - In Cookies list, session cookies show as expiring on current date
- Bug 331331 - Change popup blocker's color
- Bug 331576 - "Dynamic" determination of locale string for UA
- Bug 331670 - "Search" CM item needs to respect new & background keys/toggles
- Bug 331745 - "Email This Link…" doesn't appear for links whose "content" is an image
- Bug 331839 - View Source menu command does not respect shift modifier
- Bug 332542 - Bookmarking a tab group uses frontmost page title, confusing users
- Bug 333222 - Buttons not disabled when they should, if toolbar buttons are text-only
- Bug 335637 - "Backup" and "Backup all" should be "Back Up" in the Certificate action menu
- Bug 336017 - keyword.enabled doesn't work in Camino (1.8branch and trunk)
- Bug 336216 - Tabs don't do mouse tracking correctly across key window changes
- Bug 337570 - Description field in BookmarksInfoPanel.nib has no focus ring when active
- Bug 337958 - Dragging folder/tab group from Bookmark Bar to tab strip should respect shift toggle
- Bug 338694 - clarify and improve the behaviour of keyboard shortcuts for the bookmark bar (cmd-1..cmd-9 doesn't match safari)
- Bug 340099 - Give bookmark "mouse down" appearance when using cmd-1 through 9
- Bug 340273 - Can't drag proxy icons from tabs to location bar if focus is outside location bar
- Bug 341278 - Status bar priority
- Bug 341897 - Show bookmarks/history should make a new window when window is minimized
- Bug 341967 - Popup blocker notification text doesn't wrap properly
- Bug 341974 - pop-up blocker's close button has no mouseover feedback
- Bug 342097 - Replace _LSCopyApplicationURLsForItemURL with LSCopyApplicationURLsForURL when we move to the 10.3 SDK
- Bug 342232 - Disable various menu items when window/tab contains binary content
- Bug 342237 - disable view-source contextual menu item when viewing binary content
- Bug 342594 - Reload button and menu-item should be disabled when about:blank page is loaded
- Bug 342624 - Change phrasing of "Advanced" button tip in Appearance/Fonts
- Bug 342780 - Cmd and Shift modifiers for "View Image" don't work when pushing command after opening context menu
- Bug 342951 - "Warn me when" is not in the keyboard loop in General prefPane
- Bug 342956 - [ad-blocking] Block some common/repeat offender imdb flash ads
- Bug 342995 - "Auto fill password in web forms" in Privacy prefpane isn't validated/invalidated on prefpane open
- Bug 343046 - Fix cosmetic issues with the Downloads prefPane
- Bug 343070 - Correct margins in history preference pane
- Bug 343299 - Spell-check context menu missing Ignore and Learn Spelling entries
- Bug 343762 - Zoom All zooms downloads window (even when it's not visible)
- Bug 343767 - Implement Force Reload and Force Reload all in Contextual Menus
- Bug 343837 - SSL2/weak ciphers disabled messages contain "(null)" instead of "Camino"
- Bug 343852 - Host verification dialog has button "Stop"
- Bug 343941 - Audit Localizable.strings (and other .strings files) for typos/style guide and clarity
- Bug 344036 - Give certain pref checkboxes 'mixed state' look when neither on nor off
- Bug 344328 - Cosmetic Polish for Privacy Preference Pane
- Bug 344356 - Autofill username/password only fills the first form
- Bug 344958 - Add hidden preference for turning off tab jumpback
- Bug 345419 - "Use as Dock Menu" menu item for the current dock menu folder should reset Dock Menu to default folder
- Bug 345552 - Remove a pre-panther check
- Bug 345657 - Syncronize cmd= and cmd+
- Bug 346111 - [10.4] javascript:alert() typed in location bar doesn't close if loaded from autocomplete drop-down
- Bug 346130 - "Reuse the frontmost window" is dangerous
- Bug 346132 - Block Popup Windows By Default
- Bug 346135 - Use icons only on toolbar by default
- Bug 346228 - Use file's actual icon for site icon (favicon) for local files
- Bug 346492 - Preferences toolbar state (icons and text, icons only, etc) not remembered across launches
- Bug 346772 - First item in History search results has all disabled items in context menu
- Bug 346782 - Bookmark toggle behavior is broken
- Bug 346792 - Omnibus ad-blocking bug for August
- Bug 347111 - Bookmarks Manager prevents bookmarking of other tabs
- Bug 347211 - Jumpback doesn't work with "Open link in new tab" from link contextual menu
- Bug 347498 - Disable Email Page Location for all about:URIs
- Bug 348160 - Ad-blocking blocks attachments in Gmail
- Bug 348423 - Camino fails to honor the pref for redirecting window.open links
- Bug 348695 - No spelling items in context menu in Midas iframes
- Bug 350482 - Make bookmarks bar the default collection selection on add bookmark dialog
- Bug 350806 - Make Go menu history items respect the cmd/shift modifiers properly
- Bug 351124 - Omnibus ad-blocking bug for September
- Bug 351373 - Can't use keywords with "Open URL in Camino" Service
- Bug 352078 - RSS selection menu looks weird when there's no default feed app inserted
- Bug 352265 - Streamline tab prefs
- Bug 352293 - Should show standard mouse cursor instead of text cursor when hovering over RSS icon
- Bug 352448 - "Feed Preferences..." menu item does not activate General prefs pane
- Bug 352827 - Appearance pref pane leaks font mapping table on every load
- Bug 352922 - Override some generic strings in netError.dtd and config.dtd with "Camino"
- Bug 353221 - "Don't warn again" checkboxes can become polluted
- Bug 353391 - Camino ships 2 copies of the table images
- Bug 353433 - Preference window slow to open
- Bug 353753 - Remove MoCo from EULA
- Bug 353920 - Add about:license to About Camino
- Bug 353964 - Popup menu for select widgets appears too far up.
- Bug 354002 - [l10n] Missing string for FeedAppDoesNotExistExplanation
- Bug 354701 - MS Exchange Web Access kills window upon download finish with SWM set to "reuse"
- Bug 355033 - Keychain password prefs need clarification
- Bug 355037 - drag a file with a .URL extension.
- Bug 355073 - Omnibus ad-blocking bug for October
- Bug 355080 - prettify about:config warning
- Bug 355204 - Add Bookmark Sheet's "Bookmark All Tabs" Checkbox should read "Bookmark Current Tabs as Tab Group"
- Bug 355714 - Optimize tab close button hover tracking
- Bug 355808 - Popup suppressed silently
- Bug 355851 - Bookmark bar separator shows title during drag
- Bug 355912 - Camino hangs when doing "Clean Up" on a big list of downloads
- Bug 356100 - Location/Search split view doesn't enforce min widths during window resize
- Bug 356166 - Remove 10.2 runtime checks/fallbacks
- Bug 356480 - Enable spell-checking by default for all text fields
- Bug 356708 - Implement automatic bookmarks backup for 1.1
- Bug 357080 - Camino perf is very slow when deleting a large number of bookmarks
- Bug 357597 - Popup blocking preferences allow input when no data is in whitelist URL field
- Bug 358472 - Search field should not allow control characters
- Bug 358620 - Switch to use native NSSearchField widget in Bookmark Manager
- Bug 358686 - pop-up blocker message text is confusing
- Bug 359218 - Make Camino use 10.3.9 SDK
- Bug 359334 - Download language is confusing
- Bug 359557 - Omnibus ad-blocking bug for November
- Bug 359826 - Relocate "Block Web Advertising" checkbox to prevent confusion with pop-up exceptions list
- Bug 359907 - Bookmarks Aren't Deleted from Bookmarks Menu After Deletion from Bookmarks Manager
- Bug 360644 - Rename Show/hide bookmarks button and manager
- Bug 360779 - Drag n drop links to open tab causes leftmost tab to load link
- Bug 361001 - Bookmarks import only imports iCab 2 bookmarks, not iCab 3 bookmarks
- Bug 361016 - Needed an alternate command to zoom to "maximize to fill screen"
- Bug 361017 - Remove compile-time 10.2 cruft
- Bug 361049 - Zooming to fit contents fails miserably
- Bug 361163 - Remove window state on quit when save pref is off
- Bug 361838 - Some valid .url files fail to open properly
- Bug 362067 - Tab groups in bookmark menus need alternates
- Bug 362541 - Tooltips for Download toolbar buttons should update to reflect the number of items selected
- Bug 362543 - Keyboard shortcut for "Clear History…" doesn't work until after menu is shown
- Bug 362609 - Change font of example label to match default proportional font type
- Bug 363435 - bookmark keywords are case sensitive
- Bug 363600 - Periodically auto-save window state for crash recovery
- Bug 363680 - Bookmark Info should be disabled for menu spacers
- Bug 364075 - Separator sometimes is sometimes displayed as generic bookmark in bookmarks bar
All of the above changes should be in today's branch nightly and in all branch nightlies after December 31, 2006.
Camino 1.1 Beta Released
While we consider this beta release feature complete, there still might be issues which could hamper day-to-day browsing (though the new, built-in session saving will largely help with any crashes that may happen).
As always, please report any bugs you find.
Pending our remaining bugs and any new issues, Camino 1.1 is right around the corner.
Camino 1.1 Alpha 2 Released
This release (along with 1.1a1) is the culmination of months of work and is a good indicator of where we are in our work toward Camino 1.1.
The beta page has been updated with information on the release.
Please note that this release is not our stable version; please download Camino 1.0.3 if you want our stable version. As such, make sure to backup your profile before using this release and report any bugs you find, specifically those in new features or those that are regressed from Camino 1.0.3.
Also, because this isn't a final release, please don't submit this release to MacUpdate, VersionTracker, or other such software trackers. We want our users using the stable version of Camino.
(This was going to be up yesterday morning, but, well…. It's flu season.)
cbeard's mozilla blog
Toward Multitudes
Quick Update on What's New in Labs
Welcome to Jono DiCarlo, Aza Raskin and Atul Varma
chase's blog
The endtimes patch for Tinderbox has landed
The 2nd National Summit for CWNs
ISO The Mozilla Project's Identity
chofmann's weblog
7 Things
New PC Retailer Gives Discount to FireFox Users
Active X Migration Guides?
Chris Ilias' Blog
7 Things
Everything is just a few hundred clicks away
Canada wins Gold!
Christopher Blizzard
watching the firefox 3.1 beta 3 release on social media networks
quick tip: open web video and mime types
yeah, this is worth a post
Coop
Kutiman
The Whedonite’s Dilemma
Buffy, Abridged
craigslist | internet engineering jobs in boston
student for contract web-site development
web sites for small business. Contract position, students only
please. send along samples of your work.
Portuguese Web designer/builder (Framingham)
Rakuten USA, Jr. Ruby Developer (Prudential Building, Boston)
Prudential Building, Boston, MA
Are you a Web Developer with experience working on Consumer Websites? Do you like the idea of working for a company that isnt a non-profit, but works to help others? Are you dedicated to working with the most cutting-edge technology? If so, now is the time to learn more about Rakuten USA!
Rakuten USA is a division of Rakuten, one of the largest Internet service companies in Japan. Although Rakuten is a large company, Rakuten USA has a small, laser focused team with a startup vibe. The current focus of Rakuten USA is the OneCause website.
OneCause is a web community providing simple ways to turn thousands of consumers' everyday purchases into much-needed contributions to more than 30,000 causes and schools nationwide. OneCause empowers consumers who care about doing good to improve their world by making their everyday purchases make a difference.
Junior Web Developer
Under the direction of our Director of Technology, our new Developer will be responsible for application system design and development in Ruby using Rails and other Ruby based frameworks.
Required Skills and Experience:
Bachelor's degree in Computer Science or related field.
Experience with MySQL or Oracle, or other compatible SQL and PL/SQL.
Solid experience designing and programming in Ruby on Rails in an Agile Development environment.
Experience or familiarity with Unix/Linux, REST, Web Services, XML/XSL, AJAX, Ruby on Rails, JavaScript, HTML, CSS, Mac OS.
Experience with Test::Unit, RSpec, and Shoulda
Strong verbal & written communication skills. Team Player mentality is a must.
Excellent problem-solving skills.
Ability to work in a fast-paced results-driven environment.
A Fascination with technology and a drive to succeed.
Experience with, and interest in; social networking, social shopping, e-commerce, affiliate marketing, ad networks and/or consumer websites.
Aptitude for standard project lifecycle practices including source code versioning control and maintenance.
Experience with open source projects, involvement in development community a plus.
To Apply, Please Click Below:
http://tbe.taleo.net/NA11/ats/careers/requisition.jsp?org=LINKSHARE&cws=3&rid=60
Creating Passionate Users
My Favorite Graphs... and the future
My Favorite Graphs... and the future
My Favorite Graphs... and the future
croczilla/blog
Cross-Browser Oni
Oni@FOSDEM2009
Taming concurrency with Oni
CSS Beauty News Feed
Headed to SXSW
Conditional-CSS
Farewell Digital Web Magazine
css thesis
CSS Vault Gallery
Groove Commerce

Groove Commerce
Groove Commerce has been designing beautiful web pages for our clients for 2 years now, and our site needed a redesign. So we took time out of our schedule of client work to develop and design the current site. It is a wordpress site with brilliant call to actions, and is xHTML and CSS valid (besides that pesky thickbox.css!)
CSSVault brought to you by HostGator
Insight Studios

Insight Studios
This is our portfolio site for our design & development studio... we redesigned it this past summer and just found out about his great site. See what you think!
CSSVault brought to you by HostGator
Viewsonic

Viewsonic
ViewSonic's 2008 redesign combines YUI, CSS Sprites and fleXcroll among other lovely JavaScript goodies that make each page fun to navigate.
CSSVault brought to you by HostGator
CSS Vault Resources
Dan Rubin's SuperfluousBanter
The Final Word on IE6
Regex Patterns for Single Line CSS
Simple CSS Hover Tab Thingy
Dave Shea's mezzoblue
Sprite Optimization
Graceful Blame
Not a Test
del.icio.us/anthony_park
Human Behaviour
Readability
TinySong
del.icio.us/oeschger/mozilla
IBM developerWorks : Blogs : Bring information and collaboration into the context of your daily business processes using composite applications
Monkey Bites
Design by Fire
This page intentionally left blank
Keeping up with the Joneses
Introducing Spivot
dive into mark / planetmozilla
Immersed in the Googleplex ball pit
A gentle introduction to video encoding, part 5: constraints
A gentle introduction to video encoding: the slides
dmose's blog
design of BCC functionality
Spammers Are Such Nice People
Thunderbird 3.0b1 renamed to 3.0a3
doron's blaahg: Mozilla Posts
Why Auto Updating Browsers Matter
Opera: only 4.13% of the web is standards compliant
IE8 And XSS Protection
DougT's Ramblings
Site Moved
I am moving this site. stay tuned for details.
Tinderbox for 1.9-browser-chinook-armel
http://tinderbox.mozilla.org/showbuilds.cgi?tree=Testing
The first arm linux build of firefox. ever.
Lots of stuff to do, but this is a great start.
push out builds
run tests (emulated)
move to different tree
build xulrunner instead of browser
Minimo and Mobile.
Over the past few years the Minimo project has provided (1) a set of build and runtime options optimized for resource constrained devices, and (2) A XUL-based UI for prototyping and experimenting with new user interfaces for navigating and viewing web content and general browsing on mobile devices.
Recently you have probably read that the Mozilla Corporation is building the embeddable version of Mozilla and a mobile Firefox. In the new and expanded mobile effort the project will create a standards-based open-source browser engine and full open source development stack based on Mozilla technology, optimized for mobile devices, and embeddable on a variety of device targets. This new work will replace the Minimo project.
If you are a developer using Minimo as the basis for your embedding needs, this new effort will help you. This is picking up where Minimo’s build configure left off, and further squeezing and optimizing Mozilla.
Although we haven’t committed to specific platforms, all of the effort that was focused on the Minimo front end will be refocused on this new project. This new browser product will take advantage of lessons learned in minimo UI prototyping and experimentation. It will also include support for XUL-based add-ons, and deliver on Firefox's key principles of ease-of-use and accessibility.
We hope you can join the conversation. Most of the developers and interested people hang out on irc.mozilla.org #mobile. If you have questions, or need clarification, please drop by.
dria.org
Towards a new about:mozilla newsletter format
Dear lazyweb, trying to find a discussion system…
Mozilla Labs website redesign project
Dunstan’s blog
A short film of the puppies in the garden
Another short film of the puppies in the garden
A hello-and-goodbye kind of post
Dunstan’s blogmarks
DWBlog
Inquisitor for iPhone launched
NewsFire 1.6 Beta 1
Safari140 - a Twitter extension for Safari
eris designs
Frames Per Second Magazine
Wonder Woman Blu-ray Review

Wonder Woman (2009 - Blu-ray)
The Story:
Pretty good. Exactly what I was expecting. Not as focussed, structurally sound or iconic as i'd hoped but completely serviceable. To be fair, nearly every single criticism I can throw at producer Bruce Timm, director Lauren Montgomery and crew's animated Wonder Woman film can be explained away by it's two most villainous foes - budget and running time.
Read more after the jump:

Scribe Michael Jelenic by way of Gail Simone's story makes a grand effort of attempting to tell the definitive origin of DC Comics' Amazonian princess by amalgamating and slightly reshaping the best and most iconic elements found in the comic book series and on television. This Wonder Woman can't fly like the comics or Justice League cartoon incarnations and won't fight in heels like Linda Carter but is steeped in the Greek mythological background stuff that makes the modern DC version of the character feel timeless. In fact, the film skews heavily toward the sword and sandal tone, only allowing a hint of what Princess Diana's adventures in "Man's World" might feel like. And I think that's where it fails for me.
This fable feels most at home when exploring the lives, characters and mythology of the Amazonian world. It spends a glorious amount of its brief seventy-odd minute run-time focused on the toga/sandal crew and reasonably little on our protagonist's fish-out-of-water, island girl in NYC arc. A grave mistake, if you ask me, as that's where the character really shines, where she becomes the Wonder Woman that we all know and love. That version, the ideal status quo for the character is what the whole narrative leads us to in a denouement which really pays off. But along the way, the rush to explore every nook and cranny of the Amazonian plight leads to a juxtaposition of tone and style that doesn't always work, as if the climax of of Frank Miller's 300 was randomly staged in downtown Washington DC without much explanation. In fact, a lot of things get glossed over or unexplained in this story. Like the Invisible Jet that suddenly appears on the primitive Amazon island, for instance.
And, if the production team's comments are to be believed that sloppiness comes as necessitated by restricted budget and time. Sadly, it seems this vision for Wonder Woman was simply too epic to be contained in a short DTV feature. This is meant to be storytelling writ large and long. The music cues, riffing heavily on Shore's Lord of the Rings (with a little of Kilar's Bram Stokers Dracula thrown in for good measure) tell us as much right off the top. But you can feel the edits, the glossed over details, the deleted dialogue and scenes, the moments you were meant to love that ended up on the cutting room floor or the directors storyboard pages, as it were. I mean, this thing works well and looks good for a short, modestly budgeted video project. But ultimately, it serves best as a blueprint for Hollywood to follow and expand upon as they bring Wonder Woman to life, live-action on the big screen.

The Animation:
Compromise. That's the key word here. Director Montgomery talks often about it in the excellent and fairly candid commentary track on the disc. While this film looks and moves extremely well for a direct-to-video offering, sometimes expertly managing armies on screen, it can't compete with bigger budget films, where movement is perpetually fluid, dynamic and engaging and designs are kept strictly on model. Everything about the animation here is simply serviceable, with a small handful of action scenes being afforded extra attention - notably a beautiful sparring scene between Diana and Artemis early in film, boarded by the talented Brandon Vietti (The Batman, Superman: Doomsday) and the incredible call-to-action denouement by Dave Bullock (Kim Possible, Justice League).
Montgomery's character designs skew slightly toward her Disney influences, a welcome departure from Timm's previous 'house' style. Her large eyed, thin nose faces often look fantastic but are unforgiving and crash hard when Moi Animation Studio gets them even slightly off model. Character shading has a heavy anime influence, with more articulated shadows than previous efforts that, along with nice gradients and diffusion filters give the film depth with a more detailed look than WB animation is usually capable of. Add the occasional visceral, hand-held moving camera, common in modern action films and you have a look and feel appropriate to a PG-13 film.

The Final Word:
I really love that Warner is putting it's muscle behind these DTV releases. Despite any criticisms that I might have, i really enjoy the DC heroes in their various animated incarnations. And I can count this Wonder Woman film among my favourites. With a decent transfer and a handful of compelling features I can't help but give this disc a recommendation. As a PG-13 film, it's clearly focussed at fans and certainly not made for children but most viewers who enjoy animated adventure films will get a kick out of it.
Learn more about the Blu-ray and it's special features in my review over at TheBlurayBlog.com.
New Trailer For Pixar's "Up"
I'm getting really excited to see Up! I finally watched Wall-E a few days ago and was struck yet again by how brilliant Pixar can be. They so rarely disappoint, knowing exactly how to paint a scene to render it most affecting. I'm expecting the dog with the talking collar in the new Up trailer above to affect my laugh-hard-wet-pants centre quite a bit when the film hits theatres on May 29th.
Click on over to Yahoo Movies for links to the HD versions of the trailer.
Saturday Morning Style Watchmen Animation
For all five of you who haven't seen this yet, here it is: Happy Harry's "reanimation" of the Watchmen in a classic, Saturday morning animation style, complete with cheese-bag (read: awesome) theme song.
"Strong together, united forever"
For the record, I saw the feature film last night and I'm fairly conflicted. The music is terrible, the acting a mixed bag and the editing questionable but...
...sigh...
...it's kind of sticking with me. Every scene with Billy Crudup's Dr. Manhattan is damn-near pure gold. Almost makes me forget how wooden and stale the rest of the non-action scenes play.
My capsule review (for those who care): Watchmen needed the "Do Androids Dream..." to "Blade Runner" treatment, in favour of the literal "Sin City" approach. Maybe the "Animated" motion comic Blu-ray will get it right?
Frank Hecker - Mozilla
Switching to a new blog
I'm moving my personal blog to http://blog.hecker.org/; this is the last post in the Mozilla category of this blog (http://hecker.org/mozilla/). My future Mozilla-related blog posts will be published at http://blog.hecker.org/category/mozilla/. If you use a feed reader (which I recommend) please subscribe to http://blog.hecker.org/category/mozilla/feed/ instead of the previous feed URL (http://hecker.org/mozilla/index.atom).
I'll keep the old blog online for the foreseeable future, so that old posts will still be available; over time I hope to migrate that old content to the new blog and set redirects from the old URLs. However I cannot guarantee that I'll keep old content available forever or that old links will always work.
Mozilla Foundation activities, week ending 2008/02/01
This is my report on activities related to the Mozilla Foundation for the week ending February 1, 2008.
Projects for the weekHere's a summary of what Foundation-related activities went on last week; for more information about others' activities please see the weekly status reports published by David Boswell, Gerv Markham, and Zak Greant.
CAs and related issues
- I worked on CA applications from GlobalSign, Digicert, SECOM Trust, and S-TRUST.
Public communications
- Among other things, David worked on improvements to www.mozilla.org, including updating the Projects page with two new Featured Mozilla-Based Applications, submitting a patch to replace the Products section with Projects (bug 325485), and coordinating with fantasai concerning the About page content (bug 231131 and bug 414439).
Conferences and events
- Zak worked on preparations for several upcoming events in which the Mozilla Foundation might participate, including OSCON.
I'll be attending (at least part of) the CSUN conference March 10-15 in Los Angeles CA, the Freedom to Connect conference March 31 and April 1 in Silver Spring MD, and the Berkman@10 conference May 15-16 in Boston MA.
Zak will be speaking at the Southern California Linux Expo February 8-10 in Los Angeles, the PHP Quebec Conference March 12-14 in Montreal, and other events later in 2008.
A reminder: We're still accepting donations to the Mozilla Foundation through our directed giving program. Help support Bugzilla, Camino, SeaMonkey, and the Mozilla accessibility project, as well as general Foundation activities for the coming year.
Mozilla Foundation activities, week ending 2008/01/25
This is my report on activities related to the Mozilla Foundation for the week ending January 25, 2008.
Projects for the weekHere's a summary of what Foundation-related activities went on last week; for more information about others' activities please see the weekly status reports published by David Boswell, Gerv Markham, and Zak Greant.
CAs and related issues
Public communications
- David Boswell participated in a planning meeting for improvements to www.mozilla.org.
Other
- David is now in California and will be working out of the Mozilla office in Mountain View (once he gets settled).
I'll be attending (at least part of) the CSUN conference March 10-15 in Los Angeles CA, and the Freedom to Connect conference March 31 and April 1 in Silver Spring MD.
Zak will be speaking at the Southern California Linux Expo February 8-10 in Los Angeles, the PHP Quebec Conference March 12-14 in Montreal, and other events later in 2008.
A reminder: We're still accepting donations to the Mozilla Foundation through our directed giving program. Help support Bugzilla, Camino, SeaMonkey, and the Mozilla accessibility project, as well as general Foundation activities for the coming year.
Fried Fish
meer.net followup
What happened to meer.net
AdWords Editor
GarrettDimon.com
Independent Software Development
In January of ‘08, I woke up to the first day on the job. I was free of the daily grind. I could work anywhere and anytime I wanted. I could attend any web conference without seeking approval. I could write and share to my heart’s content. But most importantly, I could spend every single day working on things that I loved.
As it turns out, only the last one is 100% true. In retrospect, I wouldn’t trade it for the world, but making ends meet and building a software empire, err, uhh, village, can be quite the juggling act.
The Daily GrindI didn’t have to commute or work set hours, but being highly self-motivated and loving what I was doing led to a self-imposed grind where I felt guilty about every moment that wasn’t paying the bills or finishing Sifter. By blogging so openly about our plans, I had unintentionally created some expectations that loomed over me. Combine that with loving what you’re doing, and it was, and still is, hard to put the mouse down so to speak.
The really daily grind for me was making time for friends and family. Working was easy. It was fun. And, unfortunately, it can be pretty addictive as well. I’d like to think I kept a reasonable balance, but I probably averaged 60 hour weeks. That may not seem like a lot, but one of my goals in becoming self-employed was to find more time away from the desk. It hasn’t exactly worked out that way, but it’s getting closer.
Working Anywhere and AnytimeIn theory, this is attractive, and it was until Sifter launched. Now, with customers all over the world representing different time zones, the reality is that I’ve always got an eye on Sifter and support. Instead of working a boxed in 8 hour day, I’m regularly working a bunch of separate 2-4 hour shifts. I don’t mind so much, but Lauren, my fiancée, is, quite simply, over it. I can’t say I blame her, and one of my highest priorities is to bring in some backup for support.
Working anywhere is another thing that sounds great. I’ve romanticized about working on coffee shops or coworking spots for as long I’ve seen others doing it, but it turns out that I’m not too effective in that environment. At home, I have a meticulously crafted setup that includes a desk and chair high enough and large enough for someone that’s 6’6” and 225 lbs. I also have a printer/scanner, large monitor and various other amenities. Most importantly, it’s quiet, and there aren’t any distractions. (Yet.)
It turns out that I’m most productive from home, but there is a huge drawback in that I don’t have anyone to spin around in my chair and bounce ideas off of. That’s really tough at times. I blast friends with mockups over IM or call them up to make them listen to my new ideas, but it’s not the same. Frankly, it gets a bit lonely at times.
Web ConferencesI don’t need approval or justification to attend web conferences, but I’m too heads down to jet set from conference to conference like some people. Switching from a full-time job to part-time consulting constrains the cash-flow considerably. So, while I have been able to attend a handful of conferences, it hasn’t been the free-for-all that I had hoped. The most significant challenge is that it’s hard for me to justify work time that isn’t paying the bills or improving Sifter.
Writing, Blogging, and SharingThis was probably one of the most exciting facets of being self-employed and building my own web applications. I’d finally have more than enough material to update the blog regularly and share ideas free of NDA coverage. Unfortunately, it turns out that the amount of time one has for blogging is inversely proportional to the amount of fun cool things that you’re working on and able to discuss publicly.
I’ve learned more in the last year than I have in probably the last 3 years, and none of that new knowledge is under NDA. (Well, some of the client work is, but it’s a very small amount.) I have a backlog of ideas that I want to share and talk about so that you don’t trip over the same silly mistakes that I made. Lessons about the business, interface design, development, customer support, and more are all there with rough drafts that I just haven’t made time to finish.
I’m dying to sit down and type it all up, but improving Sifter wins out every time. For every new paying customer that spends their hard-earned money on our application, I feel even more obligation to make sure that Sifter makes them happy. So blogging loses out, for now.
Loving What You DoDespite all of the challenges, there’s something to be said for waking up every morning and pouring your heart into work that you love. I consider myself incredibly lucky to have that opportunity, and I consider myself even luckier that it seems to be working out financially as well. I’ve always believed that work and passion should go hand in hand. That is, we should all want to work to find a way to pursue our passions rather than just trudging through another 8 hour day just so we can pay the bills.
It’s not easy, but nothing worth doing ever is. So, if there’s anything I’ve learned this last 14 months, it’s that it’s definitely worth it. Whether it’s web development, music, writing, tight-rope walking, or creating and marketing your own BBQ sauce, being able to spend your work hours doing something that you enjoy makes all of the difference in the world.
Smart Return in Sifter
Just in case you missed it, Sifter launched last week. With all of the new material, I wanted to get back to sharing some of the behind the scenes details about designing Sifter.
Today, I wanted to focus on a feature that exists almost entirely behind the scenes. It’s more about interaction design than tangible aspects like visual or interface design, but it’s just as relevant to creating a good user experience. Just because a feature isn’t visible, doesn’t mean that it’s not valuable.
The FeatureI have been calling the feature “Smart Return”. The idea is simple. Whenever you’re viewing a list of issues, it’s possible, and likely, that you’ve sorted it a certain way or filtered the page so that you only see the issues that you care about right now.
The problem is that when you leave the page to create an issue or update an issue, we need to make sure return you to the page you originally came from as well as remember the state of the page so you don’t have to reapply your sort and filters.
A Real World ExampleFor instance, let’s say that I have a dozen issues that are assigned to me. Of those, I decide to focus exclusively on the critical and high priority issues. Since the list is short, I go ahead and sort them by when they were created. That way, I can make sure to address the oldest issues first. So, at this point, my page is filtered and sorted on several different parameters. (Figure 1)
Figure 1 One of the key ways to interact with issue lists is to filter and sort them into a list off issues that you can work through.
Now, when I click on an issue, I’m taken to the issue details page. After I take some action on this issue, it would be annoying to have to sort and filter my issue list every time. So, regardless of what I do next, I’d ultimately like to return to my issue listing sorted and filtered the way that I left it. (Figure 2)
On the surface, this seems like an almost trivial problem. Capture the referrer, and send you back there after you’re done. Unfortunately, it wasn’t that simple.
The Curveballs No SessionsThe initial idea for all of this was to simply capture the value in the session and hold on to it until we were ready to use it. Unfortunately, we’d need to clear that session variable whenever we finally did use the value. Otherwise, the return value could very easily be incorrect if you follow a different course of action and we didn’t reset it. This seemingly small limitation led to a much more advanced, but ultimately elegant solution.
Figure 2 From every issue detail page, you can easily return to the issue listing page and rest assured that it’s still sorted and filtered the way you left it.
Entry and Exit Points
From the issue detail page, there are actually multiple different actions you could pursue, and each complicates matters in its own unique way. Without going into the boring detail, there are 7 relevant courses of action that we need to consider. (Figure 3)
- Create a New Issue - It gets really hairy here because you can ultimately end up creating and adding another issue countless times, and we need to constantly keep track of your issue listing and sorting conditions.
- Return to Issue Listing - While this is conceptually simple, it presents a challenge in that it’s possible to arrive on the issue listing from the Dashboard. As a result “Return to Issue Listing” isn’t always accurate, and we need to dynamically check and see if the text should be “Return to Dashboard”.
- Edit the Issue - Editing the issue takes you to a different page, so we end up losing the value of our referrer. As a result, we have to make sure that we pass the referrer along to the edit page so that it knows where to send you after you’re finished editing.
- Delete the Issue - This is fairly straightforward. We need to delete the issue and send you back to your list.
- Delete a Comment - Thankfully, this is handled in almost exactly the same way as deleting the issue.
- Follow a link to a different issue - Of course, issues can link to each other, so it’s entirely possible that you might go off and look at another issue. If you do, we still need to be able to bring you back to your list.
- Update the Issue/Add a Comment - This is similar to deleting the issue, however, because we’re using a web form, we have to remember the URI with a hidden form field instead of passing it in the address bar.
Figure 3 There are several exit points on the issue detail page where we need to make sure that we maintain the original referring page so that we can return there.
Minimizing the Use of the Querystring
A small, but very subtle point is that we need to do all of this while relying on the query string as little as possible. Many people copy the issue link and paste it into their commit messages for source control. (Figure 4) If a query string value is used to remember the original starting point, then the link becomes cumbersome to use in a commit message.
We weren’t able to do all of this without leaning on the query string a little, but we definitely made a conscious effort to rely on it as little as possible. This definitely presented some small issues that weren’t trivial to work around.
In some cases, this may seem trivial, but it’s a crucial part of the interface design. Being able to access and share issues by copying and pasting links is going to happen. In fact, it’s going to happen a lot. So that means that clean URLs, while not always possible, are a high prioiity.
Similarly, all of the issue listing pages are handled within the query string (Figure 5) so that they can easily be shared with other team members or bookmarked in your browser.
Missing ReferrersFinally, while we initially grab the referrer from the environment, there’s no guarantee that we’ll have a referrer. If you visit a link directly, we have to fall back on a default. So, we had to be able to specify default locations to send you if you arrived from an external link.
Figure 6 I’ve found that it’s almost always easier to solve a complex problem by starting off with a sketch of the solution.
Designing the Solution
Now that we have a firm grasp of the problem, we can dive into the steps we took to design a solution. This solution is actually the second version of “Smart Return”. The first version evolved over time as we began to recognize the edge cases, and as a result, it had plenty of room for improvement. With this version, we were able to design the solution from the ground up after we had an intimate understanding of the problem, and that was key to creating a cleaner and more maintainable solution for the future.
Figure 7 I created more detailed versions of the sketches in Omnigraffle where different color lines represent different relationships between the pages.
Recognizing a Pattern
This time around, I wanted to build a reusable framework that would be easy to understand and reuse throughout Sifter. So, I went through the page flows so that I could build an understanding of the entire scenario.
I started off with some quick sketches (Figure 6) of the page flows. Then, I migrated the sketches into Omnigraffle (Figure 7) for a more detailed view of the concepts and challenges.
Designing a FrameworkAt this point, I began to understand and see how the different pages interacted with each other. I made sure to cover all of the different scenarios and set out to describe how each page would share the return URL with the other pages. (Figure 8)
Figure 8 By mapping the page relationships to a key, I was able to create a simple and memorable way for the pages to communicate the return URL between themselves.
This laid out the vision of how these pages would work together, and I had a language to describe the relationships. At this point, it became almost trivial to implement the code necessary for making it happen. More importantly, it became incredibly easy to apply this logic at other points within Sifter.
SummaryOne of the most significant pieces of creating a web application is understanding the interaction design. This almost invisible, yet critical piece of the design process is easily overlooked. If done correctly, it’s invisible and taken for granted. However, if handled poorly, it’s the difference between a clunky vs. a seamless experience.
Long story short, some of the most valuable elements of design are the ones that you don’t see. Just because there isn’t a visible manifestation of a decision doesn’t mean that it’s any less important.
Smart Return in Sifter
Just in case you missed it, Sifter launched last week. With all of the new material, I wanted to get back to sharing some of the behind the scenes details about designing Sifter.
Today, I wanted to focus on a feature that exists almost entirely behind the scenes. It’s more about interaction design than tangible aspects like visual or interface design, but it’s just as relevant to creating a good user experience. Just because a feature isn’t visible, doesn’t mean that it’s not valuable.
The FeatureI have been calling the feature “Smart Return”. The idea is simple. Whenever you’re viewing a list of issues, it’s possible, and likely, that you’ve sorted it a certain way or filtered the page so that you only see the issues that you care about right now.
The problem is that when you leave the page to create an issue or update an issue, we need to make sure return you to the page you originally came from as well as remember the state of the page so you don’t have to reapply your sort and filters.
A Real World ExampleFor instance, let’s say that I have a dozen issues that are assigned to me. Of those, I decide to focus exclusively on the critical and high priority issues. Since the list is short, I go ahead and sort them by when they were created. That way, I can make sure to address the oldest issues first. So, at this point, my page is filtered and sorted on several different parameters. (Figure 1)
Figure 1 One of the key ways to interact with issue lists is to filter and sort them into a list off issues that you can work through.
Now, when I click on an issue, I’m taken to the issue details page. After I take some action on this issue, it would be annoying to have to sort and filter my issue list every time. So, regardless of what I do next, I’d ultimately like to return to my issue listing sorted and filtered the way that I left it. (Figure 2)
On the surface, this seems like an almost trivial problem. Capture the referrer, and send you back there after you’re done. Unfortunately, it wasn’t that simple.
The Curveballs No SessionsThe initial idea for all of this was to simply capture the value in the session and hold on to it until we were ready to use it. Unfortunately, we’d need to clear that session variable whenever we finally did use the value. Otherwise, the return value could very easily be incorrect if you follow a different course of action and we didn’t reset it. This seemingly small limitation led to a much more advanced, but ultimately elegant solution.
Figure 2 From every issue detail page, you can easily return to the issue listing page and rest assured that it’s still sorted and filtered the way you left it.
Entry and Exit Points
From the issue detail page, there are actually multiple different actions you could pursue, and each complicates matters in its own unique way. Without going into the boring detail, there are 7 relevant courses of action that we need to consider. (Figure 3)
- Create a New Issue - It gets really hairy here because you can ultimately end up creating and adding another issue countless times, and we need to constantly keep track of your issue listing and sorting conditions.
- Return to Issue Listing - While this is conceptually simple, it presents a challenge in that it’s possible to arrive on the issue listing from the Dashboard. As a result “Return to Issue Listing” isn’t always accurate, and we need to dynamically check and see if the text should be “Return to Dashboard”.
- Edit the Issue - Editing the issue takes you to a different page, so we end up losing the value of our referrer. As a result, we have to make sure that we pass the referrer along to the edit page so that it knows where to send you after you’re finished editing.
- Delete the Issue - This is fairly straightforward. We need to delete the issue and send you back to your list.
- Delete a Comment - Thankfully, this is handled in almost exactly the same way as deleting the issue.
- Follow a link to a different issue - Of course, issues can link to each other, so it’s entirely possible that you might go off and look at another issue. If you do, we still need to be able to bring you back to your list.
- Update the Issue/Add a Comment - This is similar to deleting the issue, however, because we’re using a web form, we have to remember the URI with a hidden form field instead of passing it in the address bar.
Figure 3 There are several exit points on the issue detail page where we need to make sure that we maintain the original referring page so that we can return there.
Minimizing the Use of the Querystring
A small, but very subtle point is that we need to do all of this while relying on the query string as little as possible. Many people copy the issue link and paste it into their commit messages for source control. (Figure 4) If a query string value is used to remember the original starting point, then the link becomes cumbersome to use in a commit message.
We weren’t able to do all of this without leaning on the query string a little, but we definitely made a conscious effort to rely on it as little as possible. This definitely presented some small issues that weren’t trivial to work around.
In some cases, this may seem trivial, but it’s a crucial part of the interface design. Being able to access and share issues by copying and pasting links is going to happen. In fact, it’s going to happen a lot. So that means that clean URLs, while not always possible, are a high prioiity.
Similarly, all of the issue listing pages are handled within the query string (Figure 5) so that they can easily be shared with other team members or bookmarked in your browser.
Missing ReferrersFinally, while we initially grab the referrer from the environment, there’s no guarantee that we’ll have a referrer. If you visit a link directly, we have to fall back on a default. So, we had to be able to specify default locations to send you if you arrived from an external link.
Figure 6 I’ve found that it’s almost always easier to solve a complex problem by starting off with a sketch of the solution.
Designing the Solution
Now that we have a firm grasp of the problem, we can dive into the steps we took to design a solution. This solution is actually the second version of “Smart Return”. The first version evolved over time as we began to recognize the edge cases, and as a result, it had plenty of room for improvement. With this version, we were able to design the solution from the ground up after we had an intimate understanding of the problem, and that was key to creating a cleaner and more maintainable solution for the future.
Figure 7 I created more detailed versions of the sketches in Omnigraffle where different color lines represent different relationships between the pages.
Recognizing a Pattern
This time around, I wanted to build a reusable framework that would be easy to understand and reuse throughout Sifter. So, I went through the page flows so that I could build an understanding of the entire scenario.
I started off with some quick sketches (Figure 6) of the page flows. Then, I migrated the sketches into Omnigraffle (Figure 7) for a more detailed view of the concepts and challenges.
Designing a FrameworkAt this point, I began to understand and see how the different pages interacted with each other. I made sure to cover all of the different scenarios and set out to describe how each page would share the return URL with the other pages. (Figure 8)
Figure 8 By mapping the page relationships to a key, I was able to create a simple and memorable way for the pages to communicate the return URL between themselves.
This laid out the vision of how these pages would work together, and I had a language to describe the relationships. At this point, it became almost trivial to implement the code necessary for making it happen. More importantly, it became incredibly easy to apply this logic at other points within Sifter.
SummaryOne of the most significant pieces of creating a web application is understanding the interaction design. This almost invisible, yet critical piece of the design process is easily overlooked. If done correctly, it’s invisible and taken for granted. However, if handled poorly, it’s the difference between a clunky vs. a seamless experience.
Long story short, some of the most valuable elements of design are the ones that you don’t see. Just because there isn’t a visible manifestation of a decision doesn’t mean that it’s any less important.
Gemal's Psyched Blog: Mozilla
JPEG decoding will be 15% faster on x86_64
Just a quick note about a cool improvement that is gonna hit x86_64 builds of Mozilla Firefox soon:
"Currently, JPEG SSE2 code is only Windows x86. I will add it for x86_64 platform. After adding it, JPEG decoding is 15% faster."
More information in bug 475225
7 untold secrets about me
The seven, perhaps unknown, things about Henrik Gemal.
I was tagged by Fabien Cazenave who started to learn XUL by tweaking my Launchy extension. Cool!
So here are the rules to this:
1. Link to your original tagger(s) and list these rules in your post.
2. Share seven facts about yourself in the post.
3. Tag seven people at the end of your post by leaving their names and the links to their blogs.
4. Let them know theyve been tagged.
Here we go:
1: I've been charged with importing pornography into India
When I worked in India I was contacted by a Danish company that sold CD-ROMs (back in the days) and they asked me if I wanted to help them get into the Indian marked. No problem. Send me some CD's and I see what I can do. Unfortunately there were some porn CDs among the CDs they sent. Don't know if I can return to India...
2: I was the top Bugzilla bug reporter
When Bugzilla was at 100.000 bugs Asa Dotzler pulled some data out of Bugzilla. We were 10 people that filled over 700 bugs each and I was at the top with 1764 bugs and Seth Spitzer was second. Read the article.
3: I played a lot of AD&D when I was younger
I loved playing Advanced Dungeon & Dragons. Still dream about creating another adventure and play again.
4: I played soccer for almost 20 years
We were once at the Danish national championship and became number 7. We also had a cool sponsor so I meet a lot of the top soccer people from the 90' like Ruud Gullit, Frank Rijkaard and most of the Danish stars like Preben Elkjær, Frank Arnesen and Morten Olsen.
5: I lived in India for more than a year working for a Indian advertising company
What an experience! Quite amazing. I saw things that you can only dream about. Everything for dead poor people and filty rich people like I never seen before. Read my Indian story.
6: I have visited 35 countries or 15% of all countries
I love traveling. My wife and I did a lot of backpack traveling before we got our first child. Backpacked around in Thailand, Laos, Peru and Bolivia. See my map.
7: I have a road named after me
In the town of Kirkeby on Fyen in Denmark there is a road called Gemalvej. My ancestors come from around there. We traced the name Gemal back to around 1600. In Danish Gemal means spouse/partner/wife/husband.
I tag:
- Asa Dotzler
- Christian Sejersen
- Allan Beaufour
- William Quiviger
Early adopter of Mozilla Firefox
My son Mads is a early adopter of Mozilla Firefox.
The other day he got a Firefox tattoo on his left arm and was very proud of it. Showing it to everybody. And yes, it's washable.
So now whenever he sees a Mozilla Firefox logo he points to it. So when he sits next to my computer he has to point out all the time that he can see a Firefox logo.
Perhaps I can teach him to cry when he sees a Internet Explorer logo?
Glazblog
ParisWeb 2007
Fixing the Web
Ducks and Ducklings : ROTFL
Hacking for Christ
GSoC Ideas
CyberMentors
Information, Free To Good Home
hicksdesign - journal
Playstation 3 Media Centre

So, in what may be my last ‘media centre’ post, here’s a solution that I’ve finally found to work for me: a Playstation 3. This wasn’t in consideration until recently – I already have a Wii, which suits gaming on a family level really well. The Wii is small, white, minimal, fun and child friendly. The PS3 is a large high definition console for the serious gamers (which I am not). I’d thought of it as a nasty, evil console for violent, bloodthirsty shoot-em-ups. At least, until I saw LittleBigPlanet on my brother-in-law’s PS3 and realised how it good it was. I also realised how capable it was a media centre.
Here was one machine (resembling the monolith from 2001 I grant you), that could do all of this:
- Play DVDs
- Play CDs (and get track information from the internets)
- Play Blu-Ray discs. I don’t own any yet, but we subscribe to LoveFilm (Best UK equivalent of Netflix) and get BR discs through that
- Play Media (Music, Video and Photo) stored on a USB Stick or drive
- Streams Media via UPnP server. I use Medialink for OS X
- Plays and records freeview TV with the PlayTV add-on box, which by extension, includes Radio too. More on this below.
- With the built-in browser, and BBC iPlayer’s Big Screen Version, I have access to the one online video source I really care about. Quality is surprisingly good (perhaps some sort of upscaling happening?), and I’ve never seen the buffering spinner.
- Oh, it also plays games.
It replaces the DVD player, CD player, Mac Mini and Eyetv in one go. Also, compared to a Mac Mini, it’s made to be controlled by remote, so it’s very easy to control and administer.
The Sony XMB interface is themable, and there is a Windows based compiler available to create a theme from your PNG files. I’m considering making a theme, but in the meantime I’m using the Leopard v2 theme, which looks great:

To be fair, I’ve encountered a few drawbacks, and feel I should point these out before waxing lyrical further:
- It’s fussy about drive and file formats. USB drives must be formatted as FAT32 (which feels a bit primitive somehow), and files need to be arranged in ‘VIDEO’, ‘PHOTO’ and ‘MUSIC’ folders (yes with caps!) in the root of the drive. Using FAT32 also imposes a maximum 4gb file limit, so large HD rips may be out of the question.
- It doesn’t support as wide a variety of codecs as the Popcorn Hour or WDTV, but you’re generally good to go with .mp4s, and that suits me fine.
- Arranging video into folders and sub-folders is a clunky. It works better when using an external drive, or streaming, where you can arrange media exactly how you like it. Photos and Music are straightforward however, as arranging them by date and ID3 tag (such as Artist) respectively, makes sense.
- The latest PS3 consoles come with only 2 USB ports, whereas previously they came with 4. When you’ve got a PlayTV in one, and a USB drive in the other, you’re full up. Also, they’re both on the front – my ideal would be 2 ports at the back for the permanently attached devices, and at least two at the front for the occasional USB stick and charging the controller.
- Medialink works really, really well, with the exception of stuttering video, which I suspect is due to my home wireless network.
Also, not really a drawback as such, but I would love music playback to just show the album artwork, rather than a visualizer. If any PS3 users have found a way to do this, please let me know!
Despite these niggles, the PS3 has won me over as the solution I’ve been looking for – it suits my needs perfectly. Part of that is the PVR functionality from the PlayTV add on:
PlayTVPlay TV comes with just a USB box, cable and installer disc, giving your PS3 the ability to watch and record Freeview digital channels.

The USB plugin box rather feels large and hollow for what it does. Compare with an Elgato device, and you can’t help wonder why they couldn’t have just made it smaller. It really does feel as if it’s full of air. No matter, as once it’s in, it’s forgotten about, and everything happens smoothly from there. You insert the disc, install the PlayTV software, and once it’s scanned for channels, a TV icon appears in your XMB. I found everything about PlayTV to be smooth and easy, and the interface is very pleasing to the eye:



If you google for PlayTV information, you’ll find 2 common links: old press releases announcing that it will record using a non-drm format (like mpeg), and slightly later ones explaining that it’s actually going to use .m2ts (a sony-specific video format). There’s precious little information after that, but to clear this up: you can get your recordings off your PS3. Just copy them to the XMB, and from there to an external USB drive. You can then convert the .m2ts file easily using Handbrake. (Handbrake even has a ‘PS3’ output preset, which is also handy for your DVD backups!)
Recordings take roughly 1gb for every hour, but you can upgrade the internal HDD using just about any 2.5” SATA disk. Currently you pick up a 500GB Western Digital for about £84.
While not as feature-filled as EyeTV, I did find it easier to control, and much quicker to browse the EPG. While it doesn’t have a one-button ‘record series’ ability, you can choose a programme and ask it to repeat that recording to a pattern, such as weekly. So far, that’s working just fine for me.
Also, if you happen to own a PSP, you can use it to watch live TV or recordings in your library. If your PSP is a slim & lite version or newer, you can connect it to a TV. Having borrowed Mr Oxton’s PSP, I can confirm this works really well, at least on an internal wifi network.
So to quickly sum up, with perhaps the addition of a NAS in the future, I feel like I’m finally done here. The Mac Mini and WDTV have been sold to make way for this, and while separate components (such as a dedicated DVD player) may ultimately offer more features, I love the one-box does all approach.
Boxee and Plex

My journey to find the ideal Media Centre has brought me via Plex and Boxee. Both are media center applications based on the popular open source XBox Media Center (XBMC), with Boxee focussing on the social network slant, and Plex solely on OS X integration.

Plex has a very slick interface, and everytime I mention Boxee, there is the inevitable “Why not Plex?’ cry from other Mac users. At the moment, the answer is that Plex doesn’t yet offer me much over just using Front Row. The slick interface has more character than Front Row though, particularly in it’s use of online databases to provide metadata and large format photographs:


It doesn’t always get the show/movie right however. The Secret Show recordings were believed to be ‘Victoria’s Secret Fashion Show’, and this couldn’t be manually removed.
The main appeal of Plex is that it’s built for OS X only, so you’re getting the best integration – no pandering to cross platform needs. In particular iTunes library scanning works really well, and plays iTunes store DRM’s material, an area where Boxee failed (see below).
What I miss from Plex are services like BBC iPlayer and EyeTV integration, which I believe are planned. That’s where Boxee comes in.
Boxee, on the face of it, doesn’t have quite as much UI sexiness as Plex, but I think it’s more thoughtfully laid out. For example, when you log in, the home screen shows you not only what you and your friends have been watching/listening to, but what you’ve recently added. Here is your new content – go straight to it.

The social network side is intriguing, but the integration of internet services (too numerous to mention) is it’s forté. In particular, the one that interests me the most, is that the latest release supports BBC iPlayer, and does it rather well, using the Beeb’s Big Screen Interface :

There are only two downsides I’ve experienced so far: Firstly, it doesn’t show all of my Music (around 800 non-DRM albums are just missing), despite leaving it overnight to process the collection. After digging around on forums, this seemed to be caused by scraping Last.fm for information, and that a different source was intended for future releases. That doesn’t explain why random songs are missing from albums though. Until then, I have to browse the folder structure to find what I want to play.
The biggie is stability. In the middle of watching a movie with the family it crashed. I installed the EyeTV plugin from XBMC and it crashed. I asked it to look for a SMB share and it crashed. When it crashes on the Mac Mini the only solution is turn it off and restart it. It feels churlish mentioning this when Boxee is in Alpha, and if you follow Team Boxee on their blog and twitter, you’ll know it’s progressing at a good pace. It just means it’s not that usable for me at the moment.
While playing with Boxee, I found a few useful tricks and add-ons, such as:
- You can also get a Front Row appliance to put a Boxee entry into the Front Row Menu, making it easy to launch with the Apple Remote
- If you have problems (like I did) getting TV Shows to show up in the TV Show menu, editing the filename does the trick, but obviously that’s a bit tedious.
- To stream from your Mac, you can set up an SMB share, which will then show up as a media source in Boxee:
- The snappily title XBMCEyeTVParser will allow you to watch EyeTV recordings in Boxee. Oddly, it places it in Videos > Internet, rather than TV Shows. As mentioned above, it did cause crashes for me, but your mileage may vary.
Ultimately, Boxee is geared up for the US market – Hulu, ABC, Netflix and such, some of which can be accessed in the UK via VPN trickery. You would then have to disable that in order to watch BBC iPlayer, which I’m more likely to watch. Not a big deal on your laptop, but when you’re trying to control a Mac Mini with a little remote, it’s going to require clever scripts and patience.
Despite stability and iTunes library niggles, I prefer Boxee over Plex. In fact, Boxee instills feelings of love and devotion in me for it’s online services, recommendations and layout. However, I’ve come to realise that the problem for me isn’t ‘Boxee or Plex’, it’s that controlling a Mac Mini remotely can be a pain in the arse. I haven’t tried Boxee on AppleTV though, which may well be the answer, but the hacky nature of it put me off.
Neither Boxee or Plex have ended up being my ideal solution, which is in fact a Playstation 3 with PlayTV. That’s for another post!
Designing for the Web
Ever feel that the web design market is over-saturated by books, both coffee-table and technical? There’s too much choice, and “What books would you recommend?” is the top (non cheese related) question I get asked. Depending on the topic required, there are various degrees of ‘hmmm well…you could try…” that’s replied.
This is where Mark Boulton’s new PDF book A Practical Guide to Designing for the Web comes in. I’ve been watching the previews on Flickr and now that I’ve actually had the chance to read the full book, I can declare it a triumph. It doesn’t feel preachy or stodgy, or conversely, too light and insubstantial. Mark’s tone strikes the right balance, and is engaging from the start.

To those who don’t know, I’m not a trained designer – my background is firmly in illustration. As part of my 5 years studying illustration, we covered some graphic design, but it was about 20% or less of the curriculum. Since leaving college, and getting my first job as a Junior Designer for Coventry City Council, I’ve been ‘picking up’ the elements of design ever since, but have never had the benefit of formal training.
For me, this book is the equivalent of ‘Zeldmans Orange book’, taking those bits and pieces I’ve learnt over the years and filling in the gaps, finally creating an overall understanding.
However, it doesn’t just cover design theory, as practical business advice is given to complete the picture. Something that I’m sure all those people who ask me for recommendations will love.
It’s left me wanting the physical book, which if I have understood correctly, is on the cards. Yippee!
hicksdesign - sidenotes
Xtorrent site
Lego CEO speaks
Flat Hicks
I really hate the kitchen sink
Use cases for a calendar extension in Firefox
Releasing is hard
So long and thanks for all the fish...
IEBlog
Site Compatibility and IE8
Reports of broken sites are an important part of the feedback the IE team receives from the community. When we receive a report of a broken site, we take it and identify the core issue causing the problem. A number of these issues end up being side effects of changes we deliberately made in IE8, but even these are useful. They help us identify which IE8 changes have the broadest compatibility impact. In this post I'll share some of these issues with you so you can quickly identify problems affecting your site when migrating from IE7 to IE8.
Differences between IE8 Compatibility View and IE7
We strive to make Compatibility View behave as much like IE7 as possible, but we do make exceptions. Many of these exceptions enable improved security and accessibility features immediately, even for sites that have not yet migrated to IE8 Standards Mode.
Cross Document Communication
Hacks enabling cross-domain, cross-document communication have been disabled for security reasons. SOLUTION: Use Cross Document Messaging (XDM) to work around this change.Extending the Event Object
IE exposes new properties for certain AJAX features such as Cross Document Messaging (XDM), even in Compatibility View. Adding custom properties to the Event object can conflict with these new properties, such as "source". SOLUTION: Change the names of conflicting custom properties to avoid collision.event.source = myObject; // Read-only in IE8
event.mySource = myObject;
Attribute Ordering
The ordering of attributes has changed, affecting the attributes collection as well as the values of innerHTML and outerHTML. Pages depending on a specific attribute ordering may break. SOLUTION: Reference attributes by name as opposed to their position within the attributes collection.attr = elm.attributes[1]; // May differ in IE8
attr = elm.attributes["id"];
Setting Unsupported CSS Values
Assigning CSS values that were unsupported in IE7 but are supported in IE8 Standards Mode will not generate exceptions in IE8 Compatibility View. Some sites use these exceptions to determine if a particular value for a CSS property is supported or not. SOLUTION: Short of version detection, this is a difficult issue to work around. If this behavior is essential to a page, updating the page to run in IE8 Standards Mode may be the best approach.try {
elm.style.display = "table-cell";
} catch(e) {
// This executes in IE7,
// but not IE8, regardless of mode
}
Differences Between IE8 Standards Mode and IE8 Compatibility View
We see the majority of compatibility issues in IE8 Standards Mode. Most of these occur when sites expect legacy behavior that no longer exists in IE8 Standards Mode. Upgrading your site to run in IE8 Standards Mode is the best option in the long run, but in the interim you can quickly fix these types of issues by running your site in Compatibility Mode. This is described in Jefferson's post on the EmulateIE7 meta tag. In addition to the issues mentioned above, here's what you should be aware of.
Version Detection
While other changes are typically the root cause, version detection is where pages often go wrong. This is largely because making the right decision before a browser exists can be next to impossible. Nevertheless, incorrect version detection in conditional comments, script, and on the server side can easily break a page in IE8. This is especially true for conditional comments. They are used by a number of pages to apply fix-up CSS that IE8 no longer needs. SOLUTION: Update pages to make appropriate version decisions. When possible, use object detection instead.<!--[if IE]
<link rel="stylesheet" type="text/css" src="ie.css" />
[endif]-->
<!--[if lte IE 7]
<link rel="stylesheet" type="text/css" src="ie.css" />
[endif]-->
Object Detection
Object detection works great when used correctly. However some pages assume the existence of one feature based upon the presence of another, leading to problems when both features are not implemented in the same release. SOLUTION: Perform proper object-detection for each feature used.if(window.postMessage) {
window.addEventListener(
"load",
myHandler,
false
);
}
if(window.addEventListener) {
window.addEventListener(
"load",
myHandler,
false
);
}
Malformed HTML
Parser error correction for malformed HTML has changed in IE8 Standards Mode. Pages depending on the way IE7 performs error correction may encounter issues as a result. SOLUTION: Ensure your markup is well-formed and valid.<ul>
<li>1.1
<ul>
<li>1.1.1</li>
</li> <!-- Closes 1.1 in IE8, but not IE7 -->
<li>1.1.2</li>
</ul>
</li>
</ul>
<ul>
<li>1.1
<ul>
<li>1.1.1</li>
<!-- </li> -->
<li>1.1.2</li>
</ul>
</li>
</ul>
Working with an Element’s Class
In IE7, "className" had to be used as the attribute name to set and retrieve the class of an element. This has been fixed for standards-compliance in IE8 Standards Mode. Using the old approach will create an attribute named "className" that has no affect on the actual class assigned to an element. SOLUTION: Use the standardized name, "class", instead of "className".return elm.getAttribute("className");
return elm.getAttribute("class");
The method getElementById is now case-sensitive and no longer searches name attributes. SOLUTION: Ensure case-correctness and use getElementsByName when searching name attributes.<div></div>
<script type="text/javascript">
// No element is found because of case difference
var test = document.getElementById("test");
</script>
<div></div>
<script type="text/javascript">
// Element Test is found
var test = document.getElementById("Test")
</script>
Generic CSS Prefix Selectors
Generic CSS prefix selectors are no longer supported in IE8 Standards Mode in order to provide standards-compliant CSS parsing. Most often, this affects pages trying to use CSS to attach behaviors to VML elements. This can cause a script error if set dynamically, or a silent failure when hard-coded into the CSS of a page. Ultimately the rule is not applied, leading to effects such as VML not displaying on a page. SOLUTION: Explicitly specify each tag name you want to match when using CSS prefix selectors.v\:* {
behavior: url(#default#VML);
}
v\:polyline,
v\:line {
behavior: url(#default#VML);
}
/* CSS */
#main {
background-color: expression(
(new Date()).getHours()%2 ? "#000" : "#fff"
);
}
/* Script */
var elm = document.getElementById("main");
if((new Date()).getHours()%2) {
elm.style.backgroundColor = "#000";
} else {
elm.style.backgroundColor = "#fff";
}
if(!window.JSON) JSON = myJSON;
JSON.encode(obj); // Not part of the standard
JSON = myJSON;
JSON.encode(obj);
Initial CSS Property Values
Unset properties on the currentStyle object now return their initial value. Relying on the old initial values for CSS properties such as z-index can cause problems. This is the root cause of issues with the ASP.NET menu control. SOLUTION: Perform a check for both the backwards compatible value and the standardized initial value.var zIndex = elm.currentStyle.zIndex;
if(zIndex == 0) {
// custom code
}
var zIndex = elm.currentStyle.zIndex;
if(zIndex == 0 || zIndex == "auto") {
// custom code
}
Unspecified CSS Property Values
Unset properties on the style object now return the empty string for improved compliance with the DOM Level 2 Style Specification. Expecting CSS properties such as z-index to have a value when they have not been explicitly set can lead to problems. SOLUTION: Perform a check for both the backwards compatible value and the empty string.var zIndex = elm.style.zIndex;
if(zIndex === 0) {
// custom code
}
var zIndex = elm.style.zIndex;
if(zIndex === 0 || zIndex === "") {
// custom code
}
Attributes Collection
The attributes collection no longer contains all possible attributes recognized by IE, but only those that have been explicitly set. Scripts can fail if they depend on natively supported attributes always being present as they were in IE7. SOLUTION: Do not assume an attribute will be in the attributes collection. Check for existence first.var attr = elm.attributes["checked"];
// Potential script error in IE8
return attr.specified;
var attr = elm.attributes["checked"];
if(attr) return attr.specified;
else return false;
That's all I have for now. If you encounter anything else you feel should be on the list, please add it to the comments to help others out.
Tony Ross
Program Manager
Web Slice and Feed Authentication – Developer Guidelines
Hello, my name is Amy Placzkiewicz and I’m a Lead Software Design Engineer in Test on Internet Explorer’s Web Service Integration team. I wanted to take this opportunity to talk about the different mechanisms for providing a great and secure experience for Web Slices and feeds. We first described Web Slices when we launched them in IE8 beta 1, and also talked about the improvements we made to Web Slices and RSS in IE8 beta 2 as well as the post Ritika recently made about Dynamic Web Slices.
Now available in IE8 RC1 is HTTP authentication support for feeds and Web Slices. And cookie/forms based authentication that is persisted‘just works’. There are multiple ways for publishers to implement authenticated Web Slices and feeds. The 4 options I’ll be discussing are:
- Persistent login cookies (“remember me”)
- Web Slice specific auth cookie
- Unique subscription URLs
- HTTP Authentication
Each of these options has benefits and tradeoffs that can help you determine which solution (or combination of solutions) works best for your needs. Ask yourself, is the content in the Web Slice PII that must be protected by cookie authentication, or is it content that can afford “less protection?” Knowing the answer to this question will help you choose the best option (or combination of).
There are many other authentication schemes, but four these are the most prevalent on the web today. Other authentication mechanisms are also in the process of becoming popular. We are continuously looking at the developments in the authentication space to if it makes sense to support those for feeds and Web Slices.
Let’s get into detail…
1. Persistent login cookie (“remember me”)Web Slices will get cookie support for free because the browser will send cookies, when present, along with HTTP requests for a particular URL.
How it works:
Many sites already allow users to “remember me,” or persist login credentials that are stored in a cookie on the user’s machine. The site usually sets a persistent cookie with a future expiration date of, for example, 2 weeks from the time of login. During this time, the site will allow access without the user having to log in. IE will send up user cookies with every URL request assuming the cookie exists. Feed and Web Slice download requests are no exception to that. Note that session cookies will NOT work for receiving updates to feeds and Web Slices. This is because, due to Protected Mode work implemented in IE7, session cookies are not shared between cross integrity level processes (in this case msfeedsync.exe runs at medium and iexplore.exe runs at low). So, if a user logs out of the site, they will no longer be able to receive updates to the Web Slice.
Example
Consider the following scenario. A banking site requires a user to log in to their site. The user logs in and chooses to save their username and password by checking the ‘remember me’ box on the site (not to be confused with IE’s built in password auto complete feature). The site creates a cookie on the user’s machine that will expire in 2 weeks. Future updates to the Web Slice will just work until the cookie has expired. When the cookie expires, the site shows a custom crafted login form that fits nicely into the 320x240 pixel preview window of the Web Slice.
Here’s an example of how a tailored 320x240 login form could look in this scenario when the cookie has expired or there is some other type of error logging into the site.
If you don’t like the idea of creating a custom login form in the 320x240 window, then you can simply add a link (use target=_blank) to login at the site.
Design considerations:
- Recommended for Dynamic Slices only - This method is only recommended for Dynamic Web Slices, not feeds or the other types of Web Slices. The reason being that there is no friendly way to display a login form within a feed. Form controls in normal RSS feeds and non-Dynamic Update Source Web Slices are disabled for security reasons.
- Users logging out will cause updates to stop working – As mentioned above, users might not realize that logging out of the web site also prohibits the Web Slice from updating in the background. Also, “Remember me” is not traditionally checked by default, which means publishers need to communicate to users that the user should “check remember me” in order for the Web Slice to work the best. You will need to provide a login mechanism within the preview window, like the one above.
- Server responses need to be understandable to the Windows RSS Platform – Depending on how you decide to implement the Web Slice to get updates, make sure when auth fails due to no cookie, the response returned is in a format that the Windows RSS Platform can understand (either a Web Slice or feed). Returning an unrecognized response code or other type of error will cause an error to appear in the Web Slice UI.
- Use SSL - It is strongly recommended that you configure the server to require SSL in this scenario. This will add extra protection and avoid credentials being sent in the clear over the wire.
- Get Phishing and Certificate Validation for free - It should be noted that full certificate validation and SmartScreen support has been implemented for Dynamic Web Slice urls. So, users will get an extra layer of protection against Phishing attacks and identity theft. If a Phishing URL is detected, a block page is displayed in the 320x240 preview window. And, the certificate assurance badge is displayed for SSL sites (examples shown below).
The Suggested Sites Web Slice that ships out of box with IE8 is a good example of certification validation experience:
This option is applicable only for Dynamic Web Slices or slices using an Alternative Update/Display Source or feedurl. Given the pervasiveness of cross site request forgery vulnerabilities (CSRF), this may be a more secure option than relying on persistent cookies for Web Slice authentication. With this option, the user doesn’t have to choose between Web Slice functionality and the security of “signing out of sites”. Here, a Web Slice publisher will use a separate persistent cookie just for the Web Slice entry-content href or feedurl. This cookie permits just the download of the Web Slice content (which usually is read-only).
How it works
When the user subscribes to the Web Slice, the server sets a persistent cookie for the URL that contains updates to be synced. By default, cookies are set for a particular domain. To set a cookie for just the update url, depending on how your server is implemented, you can scope the cookie to a particular folder on the site OR to a particular sub domain. Or, you can do server side plumbing to validate that the cookie (e.g. via unique name/value pairs or other extra data within the cookie) contains “login credentials” that are just-enough to identify the user to the server and provide access to only the data in the Web Slice. In other words the cookie should only work on the particular Web Slice URL, but not anywhere else on the domain.
Design considerations:
- Extra cookies means extra work - Publishers will have to deal with a second kind of authentication cookie, validating it, expiring it, etc. which is more work.
- Should get user’s consent - It is recommended you put specific notice on the subscribe page to inform the user that a cookie is being set on their machine to sync updates.
- It should also be mentioned that the tradeoffs discussed in section 1 still apply here too.
Example:
Let’s say you’re the publisher of a social music site and users have to login to see the content. When they subscribe to a Web Slice to keep track of the top 20 songs, instead of using the site domain cookie, you generate a persistent read-only cookie scoped for a subfolder on the domain which contains just the Web Slice or feed of the top 20 songs. If the cookie expires or the user deletes it, then the Web Slice preview could display a custom form (if Dynamic) or a link to go login somewhere. Or you could just re-generate the cookie when they sync updates (depending on the scenario). Here’s how the code could look for this:
<div class="hslice" id="top20"> <h2 class="entry-title">Top 20 Downloaded Songs</h2> <a rel="feedurl" href="../SyncUpdatesFolder/default.aspx#top20" style="display:none;"></a> </div> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
Here the cookie would only apply to content under the SyncUpdatesFolder (using the Path cookie attribute while setting the cookie). Then, the code for default.aspx (in C#) could look like:
<%@ Page Language="C#" %> <% if (Request.Cookies["username"] != null) { //cookie exists display content HttpCookie aCookie = Request.Cookies["username"]; //write out Web Slice with updates Response.Write("<div's the top 20 songs, and more…</p></div>"); } else { //no cookie, write out error message with link to login Response.Write("<div"); } %> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
Or, you could just have all your Web Slices exist on subfolders or domains on the site and avoid putting them on the main site, then you don’t have to worry about having an extra feedurl to sync updates from.
3. Unique Web Slice URLs
A variation of #2 is the use of unique Web Slice URLs which would be unique to the user but could be used without cookies. When used without cookies, this is a not secure method, but it might be sufficient depending on the information provided in the particular Web Slice.
How it works:
Consider the following scenario: a Web Slice contains public information but is scoped to a particular user. Think of a scenario where you want to track new albums created by certain artists. Although public information, it is content tailored to a user’s query. Instead of having the user authenticate, you can have code that runs on the server to dynamically generate the entry-content href or feedurl. Note that generating this content using AJAX will not work, but instead it must be server side code to generate the unique URLs (see example below).
Design considerations:
- More server side plumbing required – this method requires a unique URL for each Web Slice and could actually be more work on the server side.
- Not a secure option when used without authentication - Unique URL approach shouldn’t be used for Web Slice that contain sensitive information (unless you have the capacity to generate unique cookies for these URLs and can do this over SSL)
- Must generate unique URLs using server side code – As mentioned above, you must generate the unique URLs using server side code. Ajax will not work because the Windows RSS sync engine can only check for updates on the HTML/xml returned from the server. It can’t simulate what a user would do to dynamically change the page after it’s loaded.
Alternative Update Source example:
In the code below, the asp server side code in <% … %> is used to generate the unique URL for the user.
<div class="hslice" id="<%=id%>"> <h2 class="entry-title">Unique URL Slice</h2> <a rel="entry-content" href="../display.aspx?userid=<%=guid%>"></a> </div>
4) HTTP Authenticated Web Slices and Feeds
The IE8 Windows RSS Platform now has support for HTTPS BASIC and HTTP/S DIGEST authentication. This option is the only supported option for setting credentials for a feed or Web Slice via our new RSS authentication APIs.
This table describes the supported HTTP authentication schemes in IE8:
Authentication
HTTP
HTTPS
BASIC
Not supported
ok
DIGEST
ok
ok
Aside from cookie/forms based authentication, these are the most prevalent HTTP authentication schemes on the internet today. Other authentication schemes (e.g. Kerberos and NTLM) should typically ‘just work’ as the operating system will already handle these schemes outside the Windows RSS platform and users will already be authenticated to these servers (e.g. by joining a computer to a domain over NTLM) and will only access those Web Slices or feeds when within that realm. Also, other HTTP authentication schemes that require prompting outside the context of the RSS platform (e.g. Certificate picker for client auth certificates) are specifically not supported because the Windows RSS Platform cannot simulate user actions in these scenarios. And, even more importantly, this is a poor experience for users as they will be shown a dialog out of context and may not know what they are being prompted for.
How it works
When any supported HTTP authentication method is used, the user experience will be as follows. If users are subscribing to an authenticated Web Slice and/or feed and has not already been authenticated to the server, then they will get prompted for credentials during subscription. However in many cases, they navigate to the authenticated server first, log in, and then subscribe to a Web Slice or feed. Since the users are already authenticated during time of subscribe, the initial download just works. On the next feed and Web Slice sync, users will see an error indicating that a username and password is required. Clicking the error, will launch the feed and/or Web Slice properties dialog where they can enter these credentials. After this, future syncs to the data will work as long as the server accepts those credentials.
Here’s a screenshot of the Web Slice error to enter credentials.
Clicking the error button will bring up the feed property dialog to enter credentials:
Design Considerations:
- Not recommended for Dynamic Web Slices - This option is not recommended for Dynamic Web Slices because the user experience is not ideal and because we are subscribed to a different url than what is shown to the user in the Preview window.. What happens is after download of the Web Slice, the first time the user clicks to view the content, they will be prompted for credentials with the Windows Credential Manager dialog. This may be a confusing experience since the dialog will show out of context and the user may not realize who/what is prompting for credentials. Also, it can be deceiving since the user may not realize they are entering credentials for a different url than what is shown to them in the Web Slice.
- Not supported for enclosures - Feed enclosures cannot be authenticated at this time
- Server response codes - It is required that the server challenge the requests to the Web Slice or feed with a regular HTTP auth challenge (HTTP 401 Auth required response). This will produce the experience mentioned above and the user will be prompted to enter credentials
- Why BASIC Auth only via SSL? We must not send out user credentials in the clear in a background process, in this case the Windows RSS sync engine process. The user is “somewhat” in control when s/he chooses for their credentials to be sent in the clear (e.g. by logging into a non SSL site). But for subscribed content s/he won’t know when the credentials will be sent. Imagine the scenario of going to free Internet café and having your credentials being sent in the clear over a non-secure wireless connection when IE downloads your feeds in the background.
- Using an alternate feedurl to subscribe to for authenticated Web Slice: Similar to option 2, instead of requiring that the Web Slice is only reachable via HTTPS, it’s possible to make the Web Slice reachable via http and https. Then have the Web Slice include the <a rel="feedurl" href="https://...."> construct to point to an alternate URL to subscribe to for the Web Slice. In this case the “feedurl” should point to the same Web Slice but instead of http it should be https so that the user will be subscribed to the SSL version. This approach has the additional potential benefit of allowing the regular http Web Slice to use cookie authentication, but the https version to use HTTP Authentication. This means that HTTP Authentication is only used when the user is actually subscribing to a Web Slice and not when just browsing to pages with Web Slices.
There are other options for authentication, but these are the main four we recommend and support. In summary, the following table describes the authentication support in IE8 for feeds and Web Slices.
Type/Option
1) Persistent cookies
2) Web Slice specific cookie
3) Unique Urls
4) HTTP auth
Regular Web Slices
(The slice does not use an Alternate Display/Update source.)
Ok1
Ok1
Ok
Ok
Dynamic Web Slice
(The slice uses an Alternate Display Source.)
Ok
Ok
Ok
Not recommended2
Alternate Update source
(The slice uses a feedurl to get updates.)
Not recommended3
Not recommended3
Ok
Ok
RSS feeds
Ok
Ok
Ok
Ok
1 This is ok, but you will have to create a web slice or single item feed response containing login information that will be shown when the cookie is not present. This may not be possible depending on how you’ve implemented the Web Slice or feed.
2Not recommended because the user will get a confusing auth prompt when opening the web slice after subscription. And, the user may not be aware of what they are entering credentials for.
3 Not recommended because you’re syncing updates from a different place than what is shown to the user. To make this work, you’d have to somehow figure out that the feedurl sync failed and generate a new slice on the main page to display to the user that auth is required. It is possible but extra work.
Thank you and I hope you have fun developing secure Web Slices!
Amy Placzkiewicz
Lead Software Design Engineer in Test
Web Service Integration Team
More IE8 Extensibility Improvements
We’ve made a few improvements to our extensibility model in IE8 RC1 based on feedback we’ve received both internally and externally.
WebBrowser (WebOC) Rendering Mode ChangesAbout a year ago, I posted an entry talking about WebBrowser Control Rendering Modes in IE8. You may recall that applications using the WebBrowser Control (also known as the WebOC, or Trident hosts) can use a Feature Control Key to select the default rendering mode of webpages they load.
Since our release of IE8 Beta 1, we’ve changed the name of the Feature Control Key that is used to toggle that behavior. The key was previously called FEATURE_NATIVE_DOCUMENT_MODE. IE8 now refers to it by the key FEATURE_BROWSER_EMULATION, and the values for both IE7 Standards Mode and IE8 Standards Mode have changed.
For compatibility purposes, the WebBrowser control will run in IE7 Standards Mode by default if no Feature Control Key value is defined for an application.To run a WebBrowser control in IE8 Standards Mode, use the following new value into the registry:
[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8000 (Hex: 0x1F40)
To run in IE7 Standards Mode, use the following registry value:
[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 7000 (Hex: 0x1B58)
For IE8 RTM, we’ve added a new “forced” IE8 Standards Mode value. When an application opts into this mode, the Web Browser control will use the IE8 User-Agent string and Browser Emulation mode strictly. It will also ignore fallback features such as the built-in Compatibility View list and the user-generated Compatibility View list when loading pages. To run in “forced” IE8 Standards Mode, use the following registry value:
[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8888 (Hex: 0x22B8)
In all of these examples, “MyApplication.exe” refers to the name of your application.
Besides the control key name update for RTM, you may have noticed that these values differ from our Beta 1 release. If you are migrating your application from a Beta or RC1 build of IE to RTM, this value chart will help you replace old rendering mode settings:
IE8 Beta 1 IE8 Beta 2 IE8 RC IE8 RTM
Feature Control Key
FEATURE_NATIVE_DOCUMENT_MODE FEATURE_BROWSER_EMULATION
IE8 Standards Mode
80000 (0x13880) 8 88000 (0x1F40)
IE7 Standards Mode
70000 (0x11170) 7 77000 (0x1B58)
IE8 Standards Mode (Forced)
- - - 8888 (0x22B8)For more information on how this will affect the way your application renders webpages, please refer to my older post, disregarding the old Feature Control Key information. If you would like to learn more about compatibility view and the differences between IE7 and IE8 modes, check out Scott’s post on Compatibility View.
ActiveX Logging Using the Application Compatibility ToolkitThe Application Compatibility Toolkit (ACT) helps customers understand their application compatibility situation by identifying which applications are compatible with Vista, IE7, and IE8, and which require further testing. To aid developers and IT Pros with ActiveX installations, we’ve added logging points for installation, instantiation, and loading of ActiveX controls. This data may help in determining whether or not a control is working properly, and may indicate if Line-of-Business applications need to be updated before IE8 is rolled out in enterprise scenarios.
For more information about how to use the Application Compatibility Toolkit, check out Jatinder’s post here. You can also take the toolkit out for a spin yourself by downloading it from Microsoft.com
Deprecation of activex.microsoft.comA few years back, when ActiveX controls were first emerging as a web technology, Microsoft set up activex.microsoft.com to allow for the distribution of popular controls.
As of IE8, Internet Explorer will no longer check activex.microsoft.com for control installations and updates. From a technical standpoint, this means that the domain was removed from our default CODEBASE lookup locations; when attempting to download a control from webpages, this domain will no longer act as a fallback when no control location is provided or when a provided location fails.
Enterprises using their own codebase download paths will not be affected by this change.
Feedback and SuggestionsI love to hear from developers, IT Pros, and users about feature suggestions, comments, complaints, etc. As always, feel free to email me (mattcrow@microsoft.com) with your thoughts on how we can improve.
Matthew David Crowley
Program Manager
Internet Explorer Extensibility
Update 3/11: Added a sentence indicating that the WebBrowser control runs in IE7 Standards mode by default when there is no Feature Control Key defined. Also, updated the registry values to indicate they apply in either HKCU or HKLM.
ill communication
10 Years Ago...
Netscape 9 Released!
Mac Firefox UI Disaster, v2.0
Indistinguishable from Jesse
TidyBug
Continuous integration at Mozilla
An open letter to my email inbox
inessential.com
Pixie
Here’s Pixie looking at my source code. Whenever I use it, it distracts me. I especially like turning it on itself.

Software + zealots + personalities
One of the things that kept me away from Git for a while was the evangelical stuff — and that Linus Torvalds is its daddy.
I don’t mind advocacy, and I absolutely, completely love it when people write with passion about cool stuff — but there’s a border. On the other side of that border are the zealots.
Git, like Linux, has more than its share of zealots, and I’ve always had the impression that Torvalds is not someone I would like very much in real life. (I’m probably wrong — I tend to like most everybody I meet, and I’d probably like him tons.)
I hate that personalities can get in the way of looking at technology. I admit, I had to make myself take a look at Git. That’s a shameful thing on my part. (But at least I did it!)
Thought experimentI’ve been using Apple computers for 29 years. But what if I hadn’t? What would I think?
I’d probably look at Steve Jobs and think he was precious and over-rated. Arrogant and fiddly. The kind of guy who’s so lonely because he’s the only person in the world who’s always right.
I would have to make myself take a look at Macs and iPhones, the way I had to make myself look at Git, despite not wanting to be in that guy’s world.
I’m not saying I actually do think that of Steve Jobs. I’m imagining an alternate universe.
But it points out the trouble of taking personalities into account too much when considering technology. It would be a shame to miss out on iPhones and Macs just because of that stuff — and it would be a shame to miss out on Git for those kinds of reasons too.
Cool stuff is cool, despite the source, despite the behavior of some of the people who like it.
Theory: zealotry == nilI’ll try this out: The absence or presence of zealots indicates absolutely nothing about the quality or lack of quality of a piece of technology.
It’s like weather. Not random, but close enough. You can ignore it completely. Zealots are wasting their time.
Similarly: the perceived arrogance of a leader indicates nothing about quality.
However, there does seem to be a correlation between certain types of leaders and the presence of zealots.
What’s a zealot?A fanboy is somebody who really, really, really likes something.
A zealot is somebody who really, really, really likes something — and thinks it will change the world, and that everybody who doesn’t like it is living their lives wrong and hurting everybody.
Zealots like to apply the phrase “just doesn’t get it” to people who differ. (Beware that phrase! But beware even more when people say of you that you “get it.”)
How to develop a cult of personalityIf you want your own corps of zealots, first you need some truly great technology. Don’t skip this part.
Then you need a philosophy that people adopt as a cause.
Then you need to state your opinions boldly. Make them as simple and direct and uncompromising as possible. The impressions of deep intelligence, candor, and certitude are key.
Your goal is to turn off the skeptical and analytical gears and ignite the pack-following engines.
It’s nice, but not essential, to actually be right, or partly right, much of the time.
(I think that’s it, but I might be missing something.)
Beta dogsThe ambition of every pack follower is to be the beta dog. They can’t be alpha, because fearless leader is alpha — but they can be second-in-command.
The surest route to beta-dog-status, our instincts wrongly tell us, is to be the best zealot.
(I want to get in a literary reference here about Paradise Lost and Lucifer saying it’s better to rule in hell than serve in heaven. But, of course, I’m slightly afraid that religious zealots will take it the wrong way. So I’ll skip it — I’ll just stick it in this parenthetical note, knowing full well that while parentheses look like shields, they’re really not.)
None of the above mattersI could go on and on. But the thing is, none of it says anything about how good is any given piece of technology. I still have to look and decide for myself.
It’s tough, because my personal tendency is always to hate Top 40. I’m always suspicious of the song that’s rising up the charts with a bullet.
Cable news channels complaint
The cable news channels are obsessed with Twitter these days. And of course they read feedback from Facebook and email too.
I wish they wouldn’t. I hate it. It wastes my time.
This on-air stuff proves that people have strong opinions that they can express succinctly — and that contribute nothing to the dialog or understanding of an issue. Nothing new there.
And it shows how desperate the news channels are to appear young, or plugged-in, or open, or whatever. I’d rather they did a better job of news reporting.
inside aebrahim's head
Enterprise Deployment of Firefox
Google Munging Search Result URIs
Mozilla Digital Memory Bank
Inside Firefox
Jason Santa Maria | Articles
In Person
I’m trying to cut back on travel and speaking dates this year, but I’ll be out and about a few times. If you happen to be attending any of these events, be sure to say hello!
Not the Same Old Story, SXSW Interactive, March 14, 11:30amI’ll be moderating a panel exploring how people from different backgrounds tackle the problem of design and storytelling online. From the description:
If the web provides so many ways to connect with audiences, why are we all stuck telling the same story with our designs? Hear from a panel of storytelling experts on the importance of narrative and art direction online to break away from static and boring experiences.
I’m honored to be joined on the panel by some very talented folks:
- Nicholas Felton, feltron.com
- Daniel Burka, Creative Director, Digg/Pownce
- Emily Gordon, Editor-in-Chief, Print Magazine, Emdashes.com
- Ian Adelman, Design Director, NYMag.com
The upcoming Interaction Design Masters program at SVA is really building steam, and they’ve been giving back to the community with a free monthly lecture series called DOT DOT DOT. I’ll be giving a 10-minute talk on the night’s theme of “The Influencers” alongside Steve Heller and Hillman Curtis. Get details and RSVP for free here.
An Event Apart, Boston, June 22-23I’ll only be at one An Event Apart this year, and luckily it’s during my birthday. I expect everyone in the audience to bring presents. Register with the promo code “AEAHCC” and save $100.
@media09, London, June 25-26Later the same week as An Event Apart, I’ll be jetting over to London for @media and the need to fulfill some serious bangers and mash cravings.
Layer Tennis, February 27, 3pm NY timeNext week I’ll once again jump onto the tennis court to do battle. Last time was a wonderfully macabre Halloween-themed match, this time it’s just straight up pixels and brain cells against none other than Derek Powazek (commentator TBD). I’m definitely going to need to get lucky on this one.
What the World Needs
My first job was as a dishwasher, a job title I’ve had at three separate times in my life. During high school I worked at a local restaurant where I washed dishes and did some light cooking. When I quit to attend college, the head cook lashed out with his wisdom, “Art?! As soon as there’s a war or recession, art will be the first thing to go. And when that happens, you’ll be right back here washing dishes. People will always need cooks.” The restaurant folded while I was away at college.
I’ve always wanted to be an artist. I drew constantly in my youth and quickly became one of those kids that was “good at art”. It was firmly planted in my head that I would go on to be a famous illustrator, probably drawing some of the most badass comic books around.
My family was nothing but supportive, regardless if they understood just what kind of things I wanted to create, they always conjured up interminable pride. I focused on doodling and pushed off the idea of how I’d actually make a living. I just kept telling myself that if I achieved a high enough level of skill, people would beat a path to my door.
The notion of being an illustrator stayed with me through most of my schooling, only to fade and finally die out in college. Sometimes I pinpoint that moment as the time I was sitting in life drawing class next to Kevin (who I didn’t know at the time). I had just finished what I thought to be a decent likeness of the reclining model in front of me when I glanced over at Kevin’s work. My jaw hit the floor, followed closely by the tiny jaw of the figure in my drawing. His perfectly shaded rendering mocked me from the easel with vivid photographic precision. It was good, like crazy fucking good.
Kevin’s drawing was a wake up call, but it wasn’t the only reason for my dread. The real fact was my grades were in the toilet because my heart just wasn’t in it anymore. Around then I discovered I had a strong connection with graphic design and a dormant love for typography—probably a leftover from years of filling my brain with meticulously hand-rendered comic book sound effects. I continued to take a full roster of illustration courses, but threw myself into my design classes with newfound resolve. I didn’t know it at the time, but this was a huge mile marker in my life. It didn’t matter what I thought I wanted to be, the real point was finding someplace to direct all of my creative energy.
It’s often interesting to see what paths life will drag you down. Before college, I had only a few brief encounters with a computer, and the majority of those were to play video games. Now I spend much of my day in front of a computer. I may not pick up a pencil or brush as often anymore, but I’m still creating things and trying to be good at art.
Simple.
Simplicity is not the goal. It is the by-product of a good idea and modest expectations.
”Jason Santa Maria | Oddities & Diversions
Drag Me to Hell
Redesign Mozilla
Comics Archetype Times Table
Jeffrey Veen
Conference hack: Embracing the backchannel at Start
I had a very interesting experience a few months ago while participating in a panel discussion. Once again, I realized that the content on stage is merely the spark of a broader conversation, and that the backchannel is rapidly becoming the whole point. So we've decided to try an experiment at the Start Conference in a couple weeks to see how we might hack traditional presentations.
But let me back up a bit first. I was on a panel at this year's South by Southwest talking about the role of analytics in design. With me were two veterans of the advertising industry who's work included some of the biggest ad campaigns of the past few years - some really amazing stuff. I started the conversation by saying how the remarkable amount of audience data available to us gives designers tremendous power to affect user experiences. My collegues suggested my approach sucked the creativity out of design. I countered that they were mistaking preferential research from behavioral. The argument heated up.
While this was happening, my phone was buzzing non-stop. I slipped it out of my pocket to discretely turn it off, but noticed a stream of Twitters going by - many from audience members in the room. So I set the phone down on the table in front of me and kept an eye on it. I'm so glad I did.
As the conversation on stage continued, the stream of questions and comments from the audience intensified. I changed my tactics based on what I saw. I asked questions the audience was asking, and I immediately felt the tenor of the room shift towards my favor. It felt a bit like cheating on an exam.
I guess it really wasn't cheating, but it does illustrate one of the frustrations I've had at conferences lately. Most of the events I attend have a rich conversation happening in the room, yet the only people not able to participate are those on stage. A couple times, I've seen organizers project a live IRC channel, but that usually bring out the worst in people ("First!!!111") - and is terribly distracting. So I've been wondering for a while if there was something smart we could do at our conference.
Apparently, Bryan had the same idea. As we were planning Start, he said, "We should have someone onstage the whole time to represent the audience. Like an ombudsman does for a newspaper."
So we decided to put a desk on stage and have our friend George Oates fill that roll. She'll be on Twitter, IM, and email listening to what people are talking about. (We'll also have volunteers collecting index cards for those not wanting to be online during the sessions.) And she'll synthesize questions, interrupt us if we get boring, and call bullshit if something sounds like it. George has been the designer at Flickr since it started; her personality has always shown through there, and will be a great fit for what we're trying to do.
What do you think? I've never really seen a conference do something like this before. Have you?
Conference hack: Embracing the backchannel at Start
I had a very interesting experience a few months ago while participating in a panel discussion. Once again, I realized that the content on stage is merely the spark of a broader conversation, and that the backchannel is rapidly becoming the whole point. So we've decided to try an experiment at the Start Conference in a couple weeks to see how we might hack traditional presentations.
But let me back up a bit first. I was on a panel at this year's South by Southwest talking about the role of analytics in design. With me were two veterans of the advertising industry who's work included some of the biggest ad campaigns of the past few years - some really amazing stuff. I started the conversation by saying how the remarkable amount of audience data available to us gives designers tremendous power to affect user experiences. My collegues suggested my approach sucked the creativity out of design. I countered that they were mistaking preferential research from behavioral. The argument heated up.
While this was happening, my phone was buzzing non-stop. I slipped it out of my pocket to discretely turn it off, but noticed a stream of Twitters going by - many from audience members in the room. So I set the phone down on the table in front of me and kept an eye on it. I'm so glad I did.
As the conversation on stage continued, the stream of questions and comments from the audience intensified. I changed my tactics based on what I saw. I asked questions the audience was asking, and I immediately felt the tenor of the room shift towards my favor. It felt a bit like cheating on an exam.
I guess it really wasn't cheating, but it does illustrate one of the frustrations I've had at conferences lately. Most of the events I attend have a rich conversation happening in the room, yet the only people not able to participate are those on stage. A couple times, I've seen organizers project a live IRC channel, but that usually bring out the worst in people ("First!!!111") - and is terribly distracting. So I've been wondering for a while if there was something smart we could do at our conference.
Apparently, Bryan had the same idea. As we were planning Start, he said, "We should have someone onstage the whole time to represent the audience. Like an ombudsman does for a newspaper."
So we decided to put a desk on stage and have our friend George Oates fill that roll. She'll be on Twitter, IM, and email listening to what people are talking about. (We'll also have volunteers collecting index cards for those not wanting to be online during the sessions.) And she'll synthesize questions, interrupt us if we get boring, and call bullshit if something sounds like it. George has been the designer at Flickr since it started; her personality has always shown through there, and will be a great fit for what we're trying to do.
What do you think? I've never really seen a conference do something like this before. Have you?
A quick plug: The Start Conference is coming up in two weeks: August 7 in San Francisco. And it's still only $200. Check it out...
Robot Cross Stitch
This was a project I started a couple years back that I lost between moving, packing and unpacking. I found it a few days ago and finished stitching it over the weekend. It was inspired by my favorite t-shirt back then.
I like cross stitching for it's obvious connection to pixelated icons and images from the web. I made the pattern by grabbing a picture of the shirt, knocking out the background, and posterizing the colors down to just red, yellow, and black. Then I blew up the image 400% and added a grid to show each stitch. Now, you can just upload an image here and have it spit out a pattern. You'll still need to spend time simplifying and sizing the source file, though.
I've always liked images of robots - especially mid-20th Century anthropomorphic representations. I like that style, but I also like the metaphor. Robots represent our approach to technology and, frankly, how wrong we usually are. We had hoped to create tech in our own image, like Rosie, the Jetson's maid who zipped around the house cleaning and cooking. We hoped that robots would enable a life of pure leisure - walking, talking butlers that do our bidding.
Our present reality is far from those idealistic days, but in a way I'm grateful for that. Instead of technology serving us, we've created powerful tools that amplify our abilities. We use computers to make us smarter, the web as an outboard brain, networks to stay connected. Rather than building robots as better humans, we've used technology to become better ourselves.
But that's just me at my most optimistic. The truth is I like to stitch things like this to get me away from the damn computer. I think I'll start another project...
Justdave's Blog
Replacing Google Groups for Mozilla Newsgroups?
Web interfaces for NNTP
Girl Scout Cookies
Justdave's Blog
Bugzilla news feed now available
Bugzilla in the news
bugzilla.mozilla.org update
Lair of the Wolf: Mozilla Posts
Egos and Stupidities....
Yes, I know, I'm late to the game.. and out of practice at blogging these days. Just wanted to get my own opinion out, since self-expression makes me feel all fuzzy....
So, yay, now we apparently have Icedove and IceWeasel (which for the sake of being anal and annoying must have a capital W in it. otherwise, hey, somebody might not realize what they're reading.) Sure, its completely free, as in freedom software. but then again, so is Bon Echo. (Firefox without the --enable-official-branding switch, you know, the thing Debian broke to make their problem worse).
The big problem here, isn't trademarks or patches, its a battle of egos. Mozilla (the Corporation, enforcer of all things trademarked.) is certainly taking a hard line stance. (To use the Firefox name (and its logo) you must be releasing something that we can certify meets the quality of "Firefox", which is an official designation for the software.) Other distros apparently do this successfully, but they aren't concerned about protecting themselves from every straw-man and mythical big-bad corporation beast that's (supposedly) determined to make their life harder.
Debian of course, is too good to have to ask permission for anything, or even make their patch set readable or answer straight questions about what the patches are they really are applying, avoiding it with (they came from bugzilla. and no more details about why.) and try to make it all about the evils of wanting patches included in something named Firefox approved.
I think its probably more about wanting to know why Debian builds with their included patchset, are far more buggy and cause users of them way more headaches than the Mozilla-released equivilent. Its those problems that led Mozilla to push Debian, to give details of those patches, or stop using the Firefox name, since it makes users think that Firefox itself, sucks, and not the distro provided packages.
So, let them rebrand IceWeasel, and include those patches, IceWeasel will of course suck as bad as the current Debian Fox builds do. Hopefully, somebody else will step-up and provide a base unbranded (or branded even, it shouldn't be hard.) Bon Echo or Deer Park build for Debian distros so that its users, (who aren't all FS zealots, i'm sure.) have an option to vote no to IceWeasel, and Ubuntu finds a better way independently of all this mess, like actually working with Mozilla and finding common ground and understanding. Instead of snobbish elitism and a nice big fork.
Oh, and the Mozilla side, should just let it go. If Debian wants to fork, let them, Firefox itself was a fork. As-is Flock, and Netscape 8. So what's one more, ignoring the politics?
And yes, Stephen Colbert is in the Firefox 2 credits.. Policital play? PR move? Nah, just a joke.. (I don't think its funny, but then again, I might if I actually /liked/ him.) Go find the name and tell your friends or something.
Oh yeah, Firefox 2 RC3 was released, go download it, poke at it and give feedback.
SpreadFirefox Spam
From the SpreadFirefox Account page:
"The e-mail address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by e-mail."
So, how then, did I get an e-mail from "Spread Firefox team [asa@mozilla.org]" that had nothing to do with any of the above? This email is about the Firefox Flicks campaign. This is spam.
Echoing some of the points made here. http://nitin.wlkr.net/mozings/2006/02/spreadfirefox_spams.html
· There's no options in SpreadFirefox's e-mail options that deal with promotional e-mail.
· There's no way to cancel a SFX account, still.
· The unsubscribe link points to http://mozilla.cmail1.com, and not anything @spreadfirefox. Who I might (kinda) trust.
And two new points:
· The message has a bad plain text-component so that you have to follow a link to read it.
· The email contains a webbug at the end of it:
<img src="http://mozilla.cmail1.com/.aspx/o/----------unique id ------------/o.gif" width="1" height="1" border="0">
Both techniques are usually emplyed only by spammers. (In fact, Thunderbird even flagged the message as an e-mail scam. Ironic?)
I'd like to call on the Mozilla Foundation (which, to my knowledge is who provides support for SpreadFirefox and not the Corporation) as well as Asa Dotzler who's email address is personally on the spam in question, to take responsibility for spamming SpreadFirefox members.
SpreadFirefox Hacked Again...
From http://www.mozillazine.org/talkback.html?article=7479:
"The Mozilla Foundation's community marketing site Spread Firefox has been hacked for the second time in less than three months. According to an email sent to registered users of the site, unknown remote attackers exploited a vulnerability in the TWiki wiki software, which was installed on the server but not actually used by the public website. The TWiki software has now been disabled. The Spread Firefox Team does not believe that any sensitive data was taken but they have shut down the site as a precaution. Only Spread Firefox was affected by the security breach; no other Mozilla Foundation or Mozilla Corporation sites have been hacked and the flaw does not affect users of Mozilla software."
This is what happens when you have a website run by people who do their own thing entirely, who obviously don't pay enough attention to keeping things up to date, without keeping the mozilla system administrators in the loop, and to think, the new version of SFX is being done behind closed doors with limited community interaction. This should send plenty of messages of safety about a site that's already been hacked twice, that they're still not being open, and as a result, its the only mozilla site to be hacked. I think its time that the Mozilla Foundation/Corporation take some responsibility for what happens with SpreadFirefox.com.
Personally, I'm no longer comfortable with the way SpreadFirefox is maintained. I don't believe its admins are doing an acceptable job. (This is seperate from the Mozilla Sysadmins, who are doing the best they can) I'd like to see SFX have the ability for users to delete their account. Since obviously they're not safe. Might also make the number of accounts more realistic.
I also find it interesting, that Asa, spreadfirefox admin and frequent mozilla blogger, fails to mention on his blog at all either hacking. :-) Guess the only mozilla news is good news.
Le «blog personnel» de Joe Clark
Shortchangers
Three remixen that teach you how to remix
Left Justified
SitePoint Raising Funds for Bushfire Victims
New Project Added - “The Big Amp”
Back From The Dead
Marcia's Tirade of the Day
Mozilla EU Camp Video now available on Air Mozilla "On demand"
Leopard falls short in the file uploading department
My weather survey needs responses
MDC Webwatch
Mozilla 24: 24-hour worldwide community event
Competitive Tracking - Weekly Roundup: 8/10/07
Competitive Tracking - Weekly Roundup: 8/3/07
Mike Davidson
Shared: Ever wonder why animal crackers are classified as crackers…
Shared: Ever wonder why animal crackers are classified as crackers…
Shared: Making The Simplest Investing Rule Even More Simple ⇗
mitchell's blog
EC: Principle 1: Respecting Previous Choice
EC: List of Potential Principles
EC: Let’s Talk Principles
molly.com
Web Standards for Web Applications
W3C Validators in Jeopardy
Registration for January HTML Course Open
morgamic.com
Tabbing Through Elements in Firefox on Mac
Firefox Keeps You Safe In Ways Other Browsers Don’t
Profiling PHP with Xdebug and Webgrind
Mozilla Developer News
Firefox 3.1 Beta 3 now available for download
about:mozilla - Firefox, security metrics, trademarks, Shiretoko, localization, prototypes, Ubiquity, Bespin, Weave, and more…
Shiretoko to be named Firefox 3.5
Mozilla Digital Memory Bank - Blog
Do You
Do You
Do You
Mozilla IT
Mozilla Scheduled Maintenance - 4/8/2008, 7pm - 9pm PDT (0200 - 0400 UTC)
We will have a scheduled maintenance window tonight from 7pm to 9pm PDT. The following changes will take place:
* 7pm PDT (0200 UTC) - MXR software upgrade. We'll be updating MXR to add new functionality around Hg & SVN. 5 minutes of downtime is expected.
* 7pm PDT (0200 UTC) - people.mozilla.com OS upgrade. people.mozilla.com will be upgraded to RHEL 5. 2 hours of downtime is expected.
Please let me know if you have any reason why we should not proceed with the planned maintenance. As always, we aim to keep downtime to as little as possible, but unexpected complications can arise causing longer downtime periods than expected. All systems should be operational by the end of the maintenance window. Feel free to email infra at mozilla.com if you see issues past the planned downtime.
Thanks,
-Justin
Mozilla Scheduled Maintenance - 1/22/2008, 7pm - 8pm PST (0300 - 0400 1/23/2007 UTC)
Mozilla Scheduled Maintenance - 1/22/2008, 7pm - 8pm PST (0300 - 0400 1/23/2007 UTC)
We will have a scheduled maintenance window tonight from 7pm to 8pm PST. The following changes will take place:
* 7pm PST (0300 UTC) - addons.mozilla.org update. We'll be updating addons.mozilla.org to pick up recent API updates. No downtime is expected.
Please let me know if you have any reason why we should not proceed with the planned maintenance. As always, we aim to keep downtime to as little as possible, but unexpected complications can arise causing longer downtime periods than expected. All systems should be operational by the end of the maintenance window. Feel free to email infra at mozilla.com if you see issues past the planned downtime.
Mozilla Scheduled Maintenance - 12/18/2007, 7pm - 10pm PST (0300 - 0600 12/19/2007 UTC)
We will have a scheduled maintenance window tomorrow night from 7pm to 10pm PST. The following changes will take place:
* 7pm PST (0300 UTC) - *.mozilla.org, *.add-ons.mozilla.org cert renewal. We'll be installing a new certificate for *.mozilla.org and *.add-ons.mozilla.org. No downtime is expected.
* 7pm PST (0300 UTC) - Geo-load balancing configuration chance. We'll be changing the configuration of our load balancers to help reduce the number of RTT pings and more effectively route users to the correct data center. No downtime is expected.
Please let me know if you have any reason why we should not proceed with the planned maintenance. As always, we aim to keep downtime to as little as possible, but unexpected complications can arise causing longer downtime periods than expected. All systems should be operational by the end of the maintenance window. Feel free to email infra at mozilla.com if you see issues past the planned downtime.
Thanks,
-Justin
Mozilla Quality
The Mozilla Quality Blog has moved...
As you may have noticed, the Mozilla QA team has not written much here for quite a while! That's because we've been using QMO (http://quality.mozilla.org) for everything related to the Mozilla QA Community.
Please update your bookmarks and join us at QMO going forward. You will be redirected there shortly. Thanks!
- Jay & the Mozilla QA team
MozQA Execution team meeting - Thursday, June 14th @ 1pm PDT
Mozilla QA community,
The MozQA team will be having our QA Execution team meeting this thursday, at 1pm PDT. All are welcomed to join us.
**To accomodate those unable to dial in, we will also be taking notes in real-time via irc #qa.**
Call Info:
*********
Thursday, June 14th, 1:00pm PDT
1) California: 650-903-0800 or Toronto: 416-848-3114 then extension 91
or
Toll-free: 800-707-2533 then password 369
2) Dial conference number: 8601#
3) IRC: #qa on irc.mozilla.org
Agenda items:
*************
- FF2.0.0.5 - updates, assignments (juanb)
- TB 2.0.0.4 RC1 - shipping this week. http://wiki.mozilla.org/Thunderbird:2.0.0.4:Test_Plan (marcia)
- FF 3.0a6 - round table status, better tracking feature testing for alpha results? (tchung / marcia)
- Test days - why was the showing low? Did we need more advertising? (tomcat / marcia)
- Litmus Test Result tracking. Spreadsheet at:
http://spreadsheets.google.com/pub?key=pSSnvsWI9ercRTmK4QS6hSQ (ashughes)
- QA Test environments - updates, assignments? (marcia)
- QMO - status, updates, logo? (jay)
- Anything else?
Firefox 3 MozQA Tracking document
For those interested, Mozilla QA now has a tracking document for testing Firefox 3 features. Here you can find a working document that tracks contacts, specs, bugs, and links to relevant docs.
Working feature document (in HTML format): http://tinyurl.com/yu8p7r
Firefox 3 Test Plan Wiki: http://wiki.mozilla.org/MozillaQualityAssurance:Home_Page:Firefox_3.0_TestPlan
Thanks,
Tony
Mozilla SVG Update
Please test your SVG with Firefox 3 Beta 3
As some of you will have noticed, the third beta of Firefox 3 was released earlier this week.
Things are now getting pretty solid so now would be a great time for people to try it out and test it on their SVG. At this late state of development the emphasis is firmly on regressions -- please report any SVG that works fine in Firefox 2, but seems broken in some way in this latest Firefox 3 beta. The more eyes we have on this the better.
For anyone interested in testing, I'd suggest reading the release notes, at least from the Download section through the Known Issues section.
If you do find any SVG issues, the preferred method of reporting them is to file them in the SVG component of Mozilla's bugzilla.
If that seems too much trouble then please do mention them here rather than let them slip through the net. :-)
Mozilla SVG speed and cairo
When using Mozilla SVG, you might have encountered cases where we are quite slow. While there have been great strides in fixing these in both the mozilla codebase and cairo between Firefox 1.5/2.0 and Firefox 3.0, we still see performance problems appearing.
When we profile these slow cases using tool like sysprof, cairo (or what it cause the X server to do in the case of unix/X11) usually makes up the majority of the time spent. If you're interested in helping with Mozilla SVG but don't feel like diving into the thick of Mozilla's flavor of C++, contributing to cairo would a great choice. It's a smaller, simpler codebase in straight C, has a responsive developer list, and improvements you make will help a large world of software beyond Mozilla.
Specific areas of interest to Mozilla SVG are:
- Hit detection.
- Currently, cairo_in_fill() and cairo_in_stroke() are implemented by tessellating the path and tests against the generated trapezoids. There are a number of other point in polygon testing methods which would be more efficient for implementing cairo_in_fill(). cairo_in_stroke() might be implementable by doing distance to line/curve tests for the path segments, along with some extra tests for the segment joins. Both of these hit detection functions are important to SVG as we are continually checking for objects underneath the pointer for event delivery. We do perform an early reject test against a cached bounding rectangle, but for complex geometry the time spent in cairo can become significant.
- Track down overuse of *CompositeGeneral.
- Many profiles we've run of slow SVG testcases show lots of cputime disappearing into this method, both on the client (named pixman_compositeGeneral or pixman_compsite_rect_general* depending on the version of cairo you're looking at) and in the copy inside the X server (fbCompositeGeneral). While ideally we'd like to avoid cairo's software renderer completely (as in Michael Dominic's work), it would be good to track down why rendering operations often end up there. My guess is that the frequent use of clipping in SVG (for inner <svg>, <image>, <marker>) is the cause of this.
- Server side gradients.
- Cairo does not use RENDER's gradients with the xlib backend. Since gradients are a frequently used SVG feature, speeding them up seems like a good thing to do, and if we can keep work on the server side it could be a win (might need work the server side to get the performance and fix possible problems with a currently unused server feature).
- Extents.
- Right now cairo implements extent calculation for both fill and stroke by tessellating the path in question. This is straightforward and allows cairo to reuse code needed for rendering, but it uses more memory and cpu time that is necessary for the query operation. SVG calculates the coverage information of an object each time a presentation attribute or property changes, so this can add up for complex geometry. Mozilla's SVG code can be changed in the post Firefox 3 world to work better with Gecko to avoid unnecessary calculations for changes that don't change geometry, but for now we need to assume the worst case.
- Path extents.
- This is a specification conformance issue rather than performance - the SVG IDL allows the bounding box of geometry (without stroke or mask effects) to be queried, and cairo_fill_extents() is both wasteful performance/memory-wise (see previous item) and doesn't give the answer we want for degenerate geometry.
- Filters.
- Mozilla SVG implements a full SVG pixel filter set (two of which, feImage and feDisplacementMap, unfortunately will not make Firefox 3) by hand as cairo has no native filters. It would nice to have filters in cairo; for the additional functionality it would provide to other users, the ability to hardware accelerate through OpenGL and pixel shaders, and to get more developers looking at speeding up the code.
If any of this sparks an interest, join the cairo mailing list and let people know. You'll be in touch with others working on cairo and get feedback on your ideas.
Drowning in UI
If you download a recent build and happen to visit a https site with an RSS feed, you'll encounter a urlbar which looks something like this:
In there we have one drag source (favicon), five buttons, and the original purpose of the urlbar, the URL itself. Surely there are more creative ways of adding functionality than just tossing more features into what should be a simple portion of the browser UI?
At the very least, the spacing/style of the buttons should be normalized to give a more professional finish.
MozillaNews.org
MozillaNews is on Hiatus
Interview with Daniel Glazman, Head NVu Developer
Opera NOT Best Web Browser
mozillaZine.org
Mozilla Firefox 3.0.6 Released
The sixth minor update to Mozilla Firefox 3 has been released. Firefox 3.0.6 fixes security vulnerabilities, improves stability, improves the ability for scripted commands to work properly with plugins and resolves a handful of other small bugs. The security fixes are detailed in the Firefox 3.0.6 section of the Security Advisories for Firefox 3.0.
The Firefox 3.0.6 Release Notes have more details about the fixes in this minor upgrade. Existing Firefox 3 users are expected to get it via the software update feature built in to the browser or their own operating system's update facility.
As a reminder, Firefox 2.0.0.x is no longer supported and contains known security vulnerabilities. Users should upgrade to Firefox 3 by downloading it from the Firefox product page
Mozilla Firefox 3 .1 Beta 2 Released
Mozilla Firefox 3.1 Beta 2 has been released. This milestone is a public preview release intended for developer testing and community feedback. New features include a private browsing mode, new functions that make it easy to remove specific portions of web history, a new javascript engine enabled by default, and several other developer features.
Firefox 3.1 Beta 2 can be downloaded from the Firefox beta page. The Firefox 3.1 Beta 2 Release Notes have more details, including information about what's new in Firefox 3.1 and what's been improved in this specific milestone. The Mozilla Developer News weblog's announcement of Firefox 3.1 Beta 2 includes more details of interest to developers.
Security Updates for Mozilla Firefox and SeaMonkey Released
Mozilla Firefox 3.0.4, Mozilla Firefox 2.0.0.18 and SeaMonkey 1.1.13 have been released. These releases contain several critical security updates, which include patches for crashes and remote code execution. All users are encouraged to update to the latest versions.
For more details, please refer to Mozilla Firefox 3.0.4 Release Notes, Mozilla Firefox 2.0.0.18 Release Notes and SeaMonkey 1.1.13 Release Notes
mykzilla
A XULRunner-Based Unit Test Harness
Atul Varma had suggested some time ago that a XULRunner-based harness might make sense, so I decided to see if I could modify Weave's harness to run JS module tests using XULRunner instead of xpcshell.
Act 1That proved doable, although some details were tricky. Sometimes I wondered whether I wouldn't have been better off reusing MochiTest, although it's heavier weight. Other times I wondered why I didn't find this bug about XULRunner-based unit tests sooner, although it's not clear that reusing the attachment in that bug would have been faster.
In any case, I got the harness working with XULRunner and wrote an initial set of tests of the Observers module. To run them, pull the jsmodules repository, change to its test/unit/ subdirectory, and run make with the location of your XULRunner executable (or set the XULRUNNER_BIN environment variable to its location):
hg clone https://hg.mozdev.org/jsmodules
cd jsmodules/test/unit/
make xulrunner_bin=/usr/bin/xulrunner
Since Firefox 3.0 comes with XULRunner, you can use any Firefox 3.0 (or newer) executable instead (except on Linux distros that ship Firefox as a XULRunner app--you have to use the XULRunner executable on those), like /Applications/Firefox.app/Contents/MacOS/firefox-bin on Mac and /c/Program\ Files/Mozilla\ Firefox/firefox.exe on Windows.
EpilogueOnce I got the harness working for jsmodules, I backported it to Weave, where it mostly works, except that IWeaveCrypto.generateKeypair (which calls PK11_GenerateKeyPair) fails, apparently because of SEC_ERROR_TOKEN_NOT_LOGGED_IN.
I have no idea why, but if you do, comment here or in bug 476539, since that's the last blocker to Weave using this harness.
Observers JS Module Improvements
let MyObserver = {
onFoo: function(subject) {...},
onBar: function(subject) {...},
onBaz: function(subject) {...},
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
observe: function(subject, topic, data) {
switch(topic) {
case "foo":
this.onFoo(subject);
break;
case "bar":
this.onBar(subject);
break;
case "baz":
this.onBaz(subject);
break;
}
}
}
Observers.add("foo", MyObserver);
Observers.add("bar", MyObserver);
Observers.add("baz", MyObserver);
You can do this:
let MyObserver = {
onFoo: function(subject) {...},
onBar: function(subject) {...},
onBaz: function(subject) {...}
}
Observers.add("foo", MyObserver.onFoo, MyObserver);
Observers.add("bar", MyObserver.onBar, MyObserver);
Observers.add("baz", MyObserver.onBaz, MyObserver);
Other changes include a couple of bug fixes and some backwards-incompatible API improvements. See the documentation for all the details (including steps to update from the previous version of the module).
Snowl Roadmap
Generally, I'm aiming for six week development cycles that are that ambiguous mixture of date-, feature set-, and quality-driven, so the goal is to hit the target date with high quality implementations of the specified set of features. But work may be pushed to later releases or the schedule extended as appropriate.
Each cycle has a theme on which I'll focus my efforts, and I'll publish regular preview releases, which will be numbered with consecutive "pre[n]" suffixes (f.e. 0.3pre1, 0.3pre2).
Most of the work on the roadmap is stuff I'm planning to do myself, although it also lists tasks that other developers have expressed an interest in tackling. And it's ambitious, so I probably won't get to all of these tasks (although I'll probably do other things that come up along the way).
If you want to do something with Snowl, whether or not it's on the roadmap, check out the source code and go for it! (And let us know what you're doing so others don't duplicate your work.)
Caveat: nothing is written in stone, it's the best laid plans of mice and men, take it with a grain of salt, etc. Among other things, this roadmap doesn't account for time I may spend working on other projects, nor am I any better than other hackers at estimating the time it takes to do work I haven't already done. And the farther out the roadmap goes, the fuzzier its plans.
Also, your suggestions are welcome. Are you missing something from the roadmap? Is there something on it that shouldn't be there? Let us know!
The latest version lives on the Mozilla wiki at https://wiki.mozilla.org/Labs/Snowl/Roadmap. Currently, it looks like this:
Priorities
As with Firefox development (f.e. with Firefox 3.1 features), Snowl tasks are prioritized. For Snowl, the fuzzy prioritization scheme is:
- P1: really want
- P2: want
- P3: nice to have
ReleasesThese are the target release dates for the imminent 0.2 release and the three releases after that:
- 0.2: Monday, January 12
- 0.3: Monday, March 9
- 0.4: Monday, April 20
- 0.5: Tuesday, May 26
0.3: simpler and smarter
Feeds
- P1 expose feeds from frecent (frequent + recent) websites [atul]
- P1 pick a feed automatically from among feeds with equivalent content
- P1 let users subscribe to feeds by entering the location of a website
- P2 automatically subscribe to feeds in live bookmarks [atul]
- P2 automatically discard old feed items and tweets
- P2 automatically determine how often to refresh feeds
- P2 let users specify how long to retain feed items and tweets
- P1 support replying to messages
- P2 support direct messages (private messages to specific users)
- P2 automatically subscribe to Twitter account in browser history
- P3 shorten long URLs when composing messages
Architecture/Extensibility
- P1 simplify composition of messaging service implementations from Source and Target prototypes
Misc
- P1 split collections view into resizable accounts/people sections [alta88]
- P1 support email protocols [alta88]
- P2 integrate Snowl into Thunderbird
- P2 organize river view into editions
- P3 use JS templates to build stream, river views
0.4: people and extensibility
People
- P1 add a person-centric view
- P1 automatically associate identities that represent the same person
- P1 let users associate identities that represent the same person
Extensibility
- P1 optimize database schema for sparse/custom attributes (f.e. username for Twitter, website URI for feeds)
- P2 move OPML import/export processing into messaging service connectors so they can provide custom attributes (f.e. username for Twitter)
- P2 compose subscription dialog from messaging service connector-specific overlays
- P3 factor out common functionality from Feed and Twitter implementations into Source and Target prototypes
Conversations
- P2 derive conversations from message metadata
- P2 display messages in the contexts of the conversations to which they belong
Misc
- P2 add a wordle-like view of messages
0.5: broader horizons
Feed Conversations
- P1 retrieve comments on feed items automatically
- P2 enable users to post comments on feed items
People
- P1 consume contact info from Portable Contacts service providers
- P2 provide contact info to Portable Contacts consumers
Misc
- P1 support several additional messaging services/social networks
- P2 support categorization of accounts and messages via tagging
- P2 synchronize subscriptions to a cloud datastore
- P3 synchronize all message data to a cloud datastore
Neil's Place
Focus…
Ode to Focus Code
Possibilities for XUL Transitions and Animation
nundroo
Thesis Proposal
I Hate iChat
IDII Summer Camp 2005
Ordered List by Steve Smith - Home
Harmony Update
Things have been silent on this here blog because Steve and I have been making ridiculously awesome progress on Harmony. We are actually less than a week away from our first deploy and only a few weeks away from running OrderedList.com in Harmony.
Is The Web Recession Proof?
Economy, economy, economy. I swear it is all you hear about these days. Turn on the news. Go to a cafe. Doesn’t matter where you are, someone mentions how bad the economy is. Because Steve and I left extremely stable and secure jobs, we often get asked, “Are you feeling the hurt?”
Another Blawg Enters The Sphere
I have spent a lot of time over the past few months growing RailsTips, a Ruby and Rails programming blog. All the tweaks I have been doing over there, have left me wanting an outlet to share.
pavlov.net
Fennec Alpha 2
Ten Years
Fennec Alpha 1
Penny-Arcade
News: Tweet Tweet
News: The Nature of Man
Comic: The Nature Of Man
persistent.info
HTML Color OneBox
Work is the sort of place that cares about specific colors, so HTML color hex triplets come up in conversation quite often. Neil suggested that this should be a OneBox in search results. It occurred to me that this could done via the Subscribed Link feature that we offer for search results. It turned out that subscribed links can use gadgets, which meant that an inline preview of colors was even possible. Regular expression matching also meant that I didn't have to list out every color by hand. This page has more information on the OneBox, or you can subscribe directly.

Once you have installed this, you can search for things like #fafafa or #ccc and get an immediate preview (in fact, the # can be omitted).
Porting Twitter Digest to Google App Engine
I've been meaning to play around with Google App Engine for a while, and as a quick project, I decided to port Twitter Digest to it (not as exciting as Kushal's Millidunst Calculator). This looked to be pretty straightforward: the original version was already in Python, and wasn't very complicated (just a single CGI script). It did indeed end up pretty easy; the whole process took a couple of hours.
The first step was to port the script from CGI-style invocation to the App Engine webapp framework. Then I looked into what it would take to get Python Twitter (the library I used for fetching data from Twitter) running. Switching it from urllib2 to urlfetch was pretty painless (though I don't use the posting parts of the API, so I didn't check if those work too). The other part of the library that I was relying on was its caching mechanism (since the digests are daily, there's no point in querying Twitter more often). DeWitt (the library's author) had thoughtfully put the caching functionality into a separate class, so it was easy to replace it with another one that implemented the same interface but was backed by App Engine's datastore.
The result (complete with App Gallery entry) is not that exciting, in the sense that it functions identically to the original. The only issue that I've run into so far is that when there are several cache misses, the URL fetches can take long enough that the request hits App Engine's deadline. However, since the successful fetches are cached, repeating the request will eventually succeed (so if consuming the digest via a feed, this shouldn't be a big deal). Ideally the urlfetch functionality would also support asynchronous fetches, since it would be easy to adapt the code to fetch all user timelines in parallel.
Update on 11/23/2008: Since I've gotten some requests for the modifications to twitter-digest that I made to get it to run on App Engine, here's a patch.
Porting Twitter Digest to Google App Engine
I've been meaning to play around with Google App Engine for a while, and as a quick project, I decided to port Twitter Digest to it (not as exciting as Kushal's Millidunst Calculator). This looked to be pretty straightforward: the original version was already in Python, and wasn't very complicated (just a single CGI script). It did indeed end up pretty easy; the whole process took a couple of hours.
The first step was to port the script from CGI-style invocation to the App Engine webapp framework. Then I looked into what it would take to get Python Twitter (the library I used for fetching data from Twitter) running. Switching it from urllib2 to urlfetch was pretty painless (though I don't use the posting parts of the API, so I didn't check if those work too). The other part of the library that I was relying on was its caching mechanism (since the digests are daily, there's no point in querying Twitter more often). DeWitt (the library's author) had thoughtfully put the caching functionality into a separate class, so it was easy to replace it with another one that implemented the same interface but was backed by App Engine's datastore.
The result (complete with App Gallery entry) is not that exciting, in the sense that it functions identically to the original. The only issue that I've run into so far is that when there are several cache misses, the URL fetches can take long enough that the request hits App Engine's deadline. However, since the successful fetches are cached, repeating the request will eventually succeed (so if consuming the digest via a feed, this shouldn't be a big deal). Ideally the urlfetch functionality would also support asynchronous fetches, since it would be easy to adapt the code to fetch all user timelines in parallel.
phil ringnalda
pink and repink
Where’s Mama Bear’s update notification?
Don’t (server)push me
Pixelsurgeon Interviews
PKB
three, is a magic number

three years
three years
Planet Mozilla: Mike Beltzner
Flagging down the future
I don’t know if my brain can handle two awesome Mozilla developer tool improvements in one week. First, we had tinderbox+pushlog given to us by Markus. Now, Reed has given us a way to simplify blocking flags.

old and busted
Blocking flags are used to indicate if a resolution for the bug in question is required in order to release some specific milestone (ex: Firefox 3.1 Beta 3, Firefox 3.0.7, Fennec 1.0 Alpha 3, etc.) Anyone can “nominate” a bug for blocking status by setting the appropriate flag to “?”, at which point a driver will make a decision and either agree that the bug blocks by marking it “+” or deny the bug blocking status by marking it “-“.
The problem with this approach is that when you have multiple milestones for a product (alphas, betas, final) you need to combine the binary blocking status (yes/no) with some other indicator of which specific milestone it blocks. For a while we tried using the target milestone field, but developers were using that for other reasons, and there wasn’t the same degree of control. We currently use priorities (P1 = blocks next beta, P2 = blocks final release) but there are limitations to that mechanism as well.

new hotness
The mobile team will be trying out a new multi-state flag (well, it’s actually a custom field that’s hacked together to behave like a flag) which will allow them to respond to a blocking request (“?”) by either denying blocking (“-“) or by indicating the milestone which the bug blocks. This should make it much easier to construct specific queries for blocker bugs, as well as clarify when the fix is required in terms of upcomign milestones.
We’ll see how things go, and based on learnings, will look to make similar changes to flags used to indicate blocking on Gecko, Firefox and branch releases.
A small change to tab ordering coming soon to trunk
A small change to the way in which new tabs are opened in Firefox is coming, in hopes of better meeting the needs and expectations of users. The change will be:
- tabs that are opened from links will open to the immediate right of the current tab
- new tabs created by the New Tab button or keyboard shortcut will open at the end of the tab strip
- if multiple tabs are opened (in the backgound) from links, they will open sequentially to the right of each other; as soon as focus changes, this sequential opening behaviour will stop, and tabs will go back to opening immediately to the right or at the end of the tab strip as per the above
The goal is to have tabs that are related - in terms of the user’s interaction - grouped together on the tab strip automatically. This supports a common case where a user is interacting with a webpage and opens one or many web pages from links; those tabs will now be adjacent to the initial tab. When the user explicitly asks for a new tab, it’s impossible to tell if it’s for a task that’s related to the current activity or for a new task; as such, we place it at the end of the tabstrip.
The change should be landing on trunk shortly, at which point we’ll have to make a decision about whether or not to take it in Firefox 3.1.
Some background, for those who are interested…
When we released Firefox 2, we changed the default behaviour of the browser so that links which would normally open a new window would, instead, open a new tab. Many proposals were presented about how to handle the opening and closing behaviour, with complex ideas around preserving the parenting relationships between tabs (so that when tab A opens tab B, closing tab B always returns to tab A no matter what’s happened in between). Many debates ensued, with hard-to-follow explanations that looked like:
AA b
A b c
a B c
A b
a D b
We quickly realized that if these things were hard to follow when explaining them to each other, they would be impossible for a user to intuit. At that time, we chose to always follow a guideline which stated: “do not to try to be more clever than the user.” Put another way, if we can’t be confident that the heuristics governing automatic behaviour matches the user’s intent, we shouldn’t try to automate the behaviour.
This is what led to our current tab-close behaviour, which takes the user back to the opening tab if and only if they haven’t changed tabs or re-ordered tabs between opening and closing. The heuristic being used for tab opening position - in addition to achieving behavioural parity with Internet Explorer, Chrome and Opera - follows the guideline as well.
Meme too
Apparently I have been tagged and must, by The Laws of The Internet, participate in the latest meme to sweep Planet Mozilla. Since my blog seems to be turning into 100% meme by volume, it works out well.
The Rules for This Particular Meme- Link to your original tagger(s) and list these rules in your post. (see above)
- Share seven facts about yourself in the post. (see below)
- Tag seven people at the end of your post by leaving their names and the links to their blogs. (see below)
- Let them know they’ve been tagged. (you’ll just have to trust me)
Without further ado, here are seven things about me. Please note that I fully acknowledge that you may already know, not know, not want to know, or have no interest in knowing these things. It is not my wish to force them upon you - I do merely what the Internet tells me to do. Though, there will be a test, so pay attention.
- I hold a Bachelor of Education degree, did half a year of practice teaching in a Kingston-area high-school, and but for an overly militant union would have ended up teaching children about math, computer science and media.
- I have been arrested (see Sec. 88), but never convicted.
- I have jumped out of a perfectly good airplane more than once.
- I have been without toenails on either of my big toes for more than half of my life, having lost them in a series of botched ingrown toenail repair procedures at age 15. Yes, it hurt (a lot) to lose them. No, I don’t wear flip-flops, or really any form of open-toed sandal.
- My last name can be used as a verb.
- In university I was an early riser, usually out and about by 6:45am, even though I routinely stayed up until 1 or 2 in the morning. Nowadays I keep the late night hours, but don’t get out of the house until closer to 9am.
- I am a credited voice-over actor.
As per the instructions that I dare not disobey, these people will also be notified by email, Facebook message, direct Tweet, carrier pigeon, singing telegram, and registered mail:
- Chelsea, who is a closet meme-lover anyway.
- John, who is perhaps the best storyteller I know.
- Dave, who never hesitates to share facts about himself … in a good way.
- Johnathan, who I can’t believe has not yet been tagged, as he sits very close to the roots of the Internet Crap Backbone.
- Rob Campbell, who I hope will tell us seven things about his ability to grow 18th century facial hair.
- David Tenser, who I know will always support the Internet in any way it demands.
- Dietrich Ayala, as it seems like a good as excuse as any for him to return to the habit of writing blog posts.
There, Internet. I hope you’re satisfied.
preed's blah-blah-blahg
Back the change out... and nobody gets hurt

Remember what Preed The Build Engineer says:
"Bad Checkins Hold Everyone Hostage!" This Valentine's Day1, the boyfriend and I bucked convention and took the opportunity to do something we had both randomly expressed interest in some weeks earlier, but neither of us had done before: learn how to shoot a gun.
We found a shooting range2, which offered a package deal that included a twenty minute how-to course4 followed by an hour on the range, to practice shooting a .22 caliber pistol at various things5.
(Interesting sociological note 1: a shooting range is a fascinating place to people watch while you're waiting for your class to start.)
(Interesting sociological note 2: apparently, shooting with your significant other on Valentine's Day is more common than one might think: we were joined by no less than six couples making use of an assortment of firearms.)
This particular range happened to be near KSFO, so afterward, we spent a few minutes watching planes land on the southeast plan, followed by a video game-related Fry's run and (altogether too much, but oh-so-tasty) thai food.
All in all, it was a pretty awesome way to spend a day with my Valentine.
*** When I got back to the office this week, I brought one of the targets in to show off my mad, GTA-honed6 aiming skillz.7After joking around for a bit, it became clear that this particular target could be used as a visual aid in imparting a much more important lesson.
Because as we all should know: the sooner a sad, frowny build is fixed, the sooner we can douer it.8,10
_____________________
1 Or, depending on status, location, local restriction, and phase of moon, "Singles Awareness Day"
2 Ironically3 in the South Bay; south city to be exact
3 Or not?
4 Apparently, actually discharging a firearm pales in comparison to the moral, circumstantial, and legal issues often associated with doing so?
5 Ok, just one thing.
6 Interesting sociological (or maybe merely generational) note 3: of the five people in the class, more people had played GTA than had shot a gun
7 Why yes, that is a bullet hole in the center of his forehead; there's also one in his left eye and three centered squarely on the chest!
8 Where "douer it" is defined as "release the product"9
9 A complex, three step process that involves four steps
10 Is this a sufficient number of footnotes, Mr. Dolske?
Sieben Dinge
Ack! I got tagged!
Planet has been awash in this meme the last few days, so I'll try to make mine short. Or interesting. Well... one of those, at least.
In roughly chronological order:
- I was born without a hip socket, a congenital birth defect that wasn't diagnosed until I was 17 months old and everyone started wondering why I hadn't started walking.
They fixed it by breaking the hip bone—no high-impact plastics or metal here!— and letting the socket create itself as it healed. The body cast I was in for four months was a "minor" side-effect. Good times!
I do have a scar; my mother was relieved that it started out about an inch long, but it grew along with my leg.
No, you can't see it.
- As a junior and senior in high school, I was a reporter and columnist for the local newspaper.
I wrote about a number of things which made me a class and high school administration favorite, including articles on unconstitutional searches, district-wide attendance rules which were not in accordance with state education law, and asking my girlfiend-of-the-time to prom.
(That last one got the most reader feedback of all of my columns.)
- I spent the last three years of college on disciplinary probation.
To make a long story short: When asked for it, I gave some not-so-glowing feedback on a new set of "responsible use" policies the campus IT department was drafting. Unrelated to this, I ran a port scan (woo nmap!) from my dorm to locate a company server I was working on at the time (I was scanning for an open ssh port).
The IT department used this event to put my tits in the proverbial ringer (in the parlance of our times). And unrelated to that, the experience uncovered a lot of illegal behavior by the University's Judicial Affairs.
I was eventually "convicted" in a campus kangaroo court where the "judge" conveniently turned out to be the same professor who had written the exact policy I had been charged with breaking.
There's an [embarrassingly] dated website chronicling the whole event, including MP3s from the all judicial hearings (holy crap did they hate when I posted those!) I was also on the news a couple of times.
I still get emails every so often from current students who find the website and want to tell me about how they're being railroaded by Judicial Affairs.
- The same year I was "convicted," I wrote a web application that over 40% of the 15,000+ students at my university ended up using to get slots in perpetually impacted courses.
The system was called CRASH: Cal-Poly Robot-Assisted Scheduling Helper.
My bachelor's thesis covered the history of the application. The university ran the service using my code for a couple quarters, the [awful, but functional] code was then open sourced, and about a year after I left, the University implemented the features directly within their registration system, due to outcry from students and professors.
- Like a few others apparently, I am a licensed pilot: airplane single engine land (ASEL) type rating with a high performance endorsement (but sadly, no instrument rating... yet).
A lot of people know that; what you may not know is that I got interested in it because I originally wanted to be an air-traffic controller. I didn't go that route because I became interested in it during my last year in college and couldn't justify wasting a perfectly fine computer science degree to go push tin.
I also couldn't justify the federal government dictating where I'd be living based upon its opaque staffing needs.
- I got started in Mozilla (and coincidentally my career path) in a pretty random way: I was 17 and perusing photos posted from the first Mozilla party and I kept seeing a person in these photos that looked interesting.
I randomly started conversing with them via email. As we chatted more about what I was doing—sysadmin at an ISP and a contractor—they offered me an internship at Netscape over that summer. It was on the client product engineering build team.
I learned a ton of lessons while I was there about life, love, and the pursuit of a repeatable, sustainable build and release engineering process. I know a lot of software engineers find it perverse, but I feel in love.
Searching Bonsai with a regular expression of "preed" is imminently embarrassing.
- I have a guilty little pleasure that when people hear it, they tend to think "Wow... this guy is super nerdy and quite possibly somewhat insane..."
Mixing—ha ha—two skills in life I wish I had, but don't, I blend electronica music air traffic control to make... interesting music.
I enjoy it for a bunch of reasons, not the least of which that as a pilot, it's good practice to listen to (and decode) that stuff. Electronica tends to ebb and flow, so it lends itself well to what you find in air traffic control transmissions as well.
I also find it great music when I need to multitask and do a lot of [typically build-related] work simultaneously: I find it easy to work to, I find myself working faster, and it puts me in the right mindset to complete tasks succinctly and correctly, lest I smack packets carrying precious bits into each other.
You may think it's weird, but I have a few fans on the Internet who've discovered it and pester me for more mixes; one of them is a Mozilla Corp. QA'er.
If you're curious, listening to the first ten minutes of this will give you a pretty good idea.
Since this has been bouncing around PMO for awhile now, I'm going to point the finger at other people, many of whom work on Mozilla-related apps and technology, but some of whom who don't and are just awesome people:
- John Gaunt: He used to have my job, but he got promoted to Bugzilla Janitor and Programmer Lie Detector
- Ali Rayl: I can't seem to find her blog, so maybe she'll tweet seven things we don't know; but she spends her days making sure the Bird doesn't suck and letting us know when it does...
- Nick Kreeger - Just call him "DJ Fail"
- Rob Lord: Chief Birder; beyond his eclectic decorating tastes (which I'm more-than-slightly jealous of), I know I know 7 things about him, but I also know there are way more than 7 things I don't know about him.
- Adam Fritzler: Adam does a lot of things (great photography among them) but will never be able to escape what he did first (if you're chatting on AIM using anything but AOL's client right now, you owe him).
- James Castañeda: James taught me that urban planning is a lot like programming, except it uses heavier things (like steel and concrete) and "refactoring" is slightly more "involved."
- Mark Chen: Mark (via the FDA) [among other things] makes sure your spinach isn't covered in poo. (He's also a first-class recycler!)
"Speedbird eight-six-zero-heavy, runway one-right: Cleared. For. Takeoff."
At 9:15 PST this morning, Songbird 1.0 executed a beautiful takeoff.
Being a die-hard Linux user, I didn't think anything would pull me away from my PDP8-era ncurses-based music player.
But the difficult (often behind-the-scenes) work done since in the 0.71 timeframe and leading up to the 1.0 release transformed the Bird into an imminently capable player, even for my admittedly somewhat-unorthodox uses2.
To boot, I've actually "lived the marketing materials" and found a bunch of music that I can't get out of my head3 that I otherwise would have missed. Coming from that ncurses-based player, it's quite a paradigm shift, and with extensions like mashTape, I don't think I'll be able to go back (even if they did stuff links into that old ncurses-based player ;-)
*** This is the first time in my career that I've shipped a "one-dot-oh" product.I was expecting it to be a bit more hectic than it turned out to be, but... I'd like to think "a boring, predictable release" translates to "I'm doing my job well." Then again, I'm also working with a great team, who make large parts of my job pretty easy (and enjoyable, to boot).
I'm really pleased by the way my first 1-dot-oh turned out.
And while there's lots of work to do, lots of features to add, and, sure, probably a couple of bugs to fix, Songbird is a pretty awesome application, one all of us should be proud to have among Mozilla's ranks, showcasing the power of the platform's technology.
You can grab your copy at getsongbird.com.
The real question now: is 10 am too early for scotch?6
_________________
1 Seems so long ago...
2 Lots of FLAC content and a lot of streaming...
3 ... some of it somewhat... embarrassing to actually admit I like...4
4 <cough>Rihanna's Don't Stop the Music</cough>5
5 If you had been reading this blog post in Songbird, you could have clicked on that link and gotten that song stuck in your head too!
6 Alright, alright, maybe I'll wait until lunch...





