Tag: kranthi
Dark Patterns: Deception vs. Honesty in UI Design
Desktop Wallpaper Calendar: November 2011
We always try our best to challenge your artistic abilities and produce some interesting, beautiful and creative artwork. And as designers we usually turn to different sources of inspiration. As a matter of fact, we’ve discovered the best one — desktop wallpapers that are a little more distinctive than the usual crowd. This creativity mission has been going on for over two years now, and we are very thankful to all designers who have contributed and are still diligently contributing each month.
We continue to nourish you with a monthly spoon of inspiration. This post features 30 free desktop wallpapers created by artists across the globe for November 2011. Both versions with a calendar and without a calendar can be downloaded for free. It’s time to freshen up your wallpaper!
Please note that:
- All images can be clicked on and lead to the preview of the wallpaper,
- You can feature your work in our magazine by taking part in our Desktop Wallpaper Calendar series. We are regularly looking for creative designers and artists to be featured on Smashing Magazine. Are you one of them?
Real Artists Ship
"A tribute to Steve Jobs, from the crew at Busy Building Things." Designed by Andrew Power from Canada.
- Preview
- With calendar: 1024×768, 1280×800, 1440×900, 1920×1080, 2560×1440
- Without calendar: 1024×768, 1024×1024, 1280×800, 1440×900, 1920×1080, 2560×1440
Design For Good
Designed by Nicci Miller from USA.
- Preview
- With calendar: 800×600, 1024×768, 1280×1024, 1280×900, 1440×900, 1920×1200, 2561×1440
- Without calendar: 800×600, 1024×768, 1280×1024, 1280×900, 1440×900, 1920×1200, 2561×1440
Coffee
Designed by Agnieszka Malarczyk from Poland.
- Preview
- With calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 2560×1440
- Without calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 2560×1440
Autumn Impression
Designed by Agnieszka Malarczyk from Poland.
- Preview
- With calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 2560×1440
- Without calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 2560×1440
Fall Leafs
"I like autumn colors on the leafs!" Designed by Petr Vaclavek from Czech Republic.
- preview
- with calendar: 320×480, 1024×1024, 1280×1024, 1920×1200, 2560×1440
- without calendar: 320×480, 1024×1024, 1280×1024, 1920×1200, 2560×1440
The Hush
"Take time to sit and watch the leaves turn." Designed by Jason Krieger from USA.
- Preview
- With calendar: 1024×768, 1024×1024, 1440×900, 1600×1200, 1680×1050, 1920×1200
- Without calendar: 1024×768, 1024×1024, 1440×900, 1600×1200, 1680×1050, 1920×1200
November Nostalgia
"November Nostalgia has a bit of the old mixed with the new." Designed by Colin Whitehurst from Philippines.
- Preview
- With calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
- Without calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
November Rain
"It rains around here in november…." Designed by Inerseshen Creative Media from USA.
- Preview
- With calendar: 320×480, 640×480, 800×600, 1024×768, 1024×1024, 1152×864, 1280×720, 1280×800, 1280×960, 1400×1050, 1440×900, 1600×1200, 1680×1050, 1920×1080, 1920×1200, 1920×1440
- Without calendar: 320×480, 640×480, 800×600, 1024×768, 1024×1024, 1152×864, 1280×720, 1280×800, 1280×960, 1400×1050, 1440×900, 1600×1200, 1680×1050, 1920×1080, 1920×1200, 1920×1440
The Most Productive Month
"Working hard or hardly working? What will your work stats look like in November?" Designed by Photo Stats from Sweden.
- Preview
- With calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
- Without calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
Gunpowder Treason
"I doubt this piece needs any description at all, but here it goes. Because I’m a V for Vendetta fan, I decided to make a wallpaper out of the classic quote combined with the V for Vendetta “logo”. Of course this quote referenced to a historical event, which should never be forgot." Designed by Yentl from Belgium.
- Preview
- With calendar: 1280×960, 1366×768, 1600×900, 1600×1200, 1680×1200, 1920×1080, 1920×1200, 1920×1440, 2560×1440
- Without calendar: 1280×960, 1366×768, 1600×900, 1600×1200, 1680×1200, 1920×1080, 1920×1200, 1920×1440, 2560×1440
Soul Candle
"When we do not visit the dead, they come to visit us." Designed by Pilo Francia from Philippines.
- Preview
- With calendar: 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1440
- Without calendar: 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1440
Disco Ball
Designed by Emily Shirley from USA.
- Preview
- With calendar: 1280×800, 1440×900, 1680×1050, 1920×1080, 1920×1200
- Without calendar: 1280×800, 1440×900, 1680×1050, 1920×1080, 1920×1200
A Clearing In The Foggy Forest
"A clearing in the foggy forest could be your salvation or your downfall. Be careful!" Designed by Alberto Varela from Basque Country.
- Preview
- With calendar: 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1200, 2560×1440
- Without calendar: 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1200, 2560×1440
Pink November
"A face can manifest especially in a texture." Designed by Niki Virág from Hungary.
- Preview
- With calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200
- Without calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200
Winter Is Coming
"I always like to use the macro feature of my camera to capture all the nature’s changes. Winter is coming and the first molecules of snow appeared on the autumn leaves… Isn’t it amazing?" Designed by Tatiana Anagnostaki from Greece.
- Preview
- With calendar: 1024×768, 1280×1024, 1440×900, 1680×1050, 1680×1200, 1920×1440, 2560×1440
- Without calendar: 1024×768, 1280×1024, 1440×900, 1680×1050, 1680×1200, 1920×1440, 2560×1440
November Love
This November Love desktop wallpaper is designed by Medianovak from Bosnia and Herzegovina.
- Preview
- With calendar: 1024×768, 1024×1024, 1152×864, 1280×720, 1280×800, 1280×960, 1280×1024, 1400×1050, 1440×900, 1600×1200, 1680×1050, 1680×1200, 1920×1080, 1920×1200
- Without calendar: 1024×768, 1024×1024, 1152×864, 1280×720, 1280×800, 1280×960, 1280×1024, 1400×1050, 1440×900, 1600×1200, 1680×1050, 1680×1200, 1920×1080, 1920×1200
Rainy Day
"A picture from Budapest (Hungary), a city full of history in which I spent two lovely days." Designed by Simona Gosu from Romania.
- Preview
- With calendar: 1280×720, 1440×900, 1600×900, 1920×1080, 1920×1200, 2560×1440
- Without calendar: 1280×720, 1440×900, 1600×900, 1920×1080, 1920×1200, 2560×1440
Late Atumn
"The late arrival of Autumn." Designed by Maria Castello Solbes from Spain.
- Preview
- With calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
- Without calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
Autumn Hair
"The colour of Autumn." Designed by John Rubio from Australia.
- Preview
- With calendar: 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080
- Without calendar: 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080
Little Mademoiselle P
"Black-and-white drawing of a little girl." Designed by Jelena Tšekulajeva from Estonia.
- Preview
- With calendar: 320×480, 1024×1024, 1280×800, 1440×900, 1680×1050
- Without calendar: 320×480, 1024×1024, 1280×800, 1440×900, 1680×1050
Grey
"It’s November. Again. And we can’t believe that another year has gone by." Designed by Lotum from Germany.
- Preview
- With calendar: 320×480, 960×960, 1024×768, 1280×800, 1440×900, 1680×1050, 1920×1200, 2560×1440
- Without calendar: 320×480, 960×960, 1024×768, 1280×800, 1440×900, 1680×1050, 1920×1200, 2560×1440
Frozen Kingdom
"Cold, cold November somewhere in Frozen Kingdom…" Designed by Frozen Kingdom from Estonia.
- Preview
- With calendar: 320×480, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200
- Without calendar: 320×480, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200
Hunting
"Sometimes you hunt a bear, sometimes a bear hunts you." Designed by Cheloveche.ru from Russia.
- Preview
- With calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1200
- Without calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1200
Flying
Designed by Nindze.com from Russia.
- Preview
- With calendar: 1024×1024, 1280×800, 1440×900, 1680×1050, 1920×1200, 2560×1440
- Without calendar: 1024×1024, 1280×800, 1440×900, 1680×1050, 1920×1200, 2560×1440
Cool November
"This big oak tree is standing in the middle of a big corn field, near the trail where I jog every other day. I always wanted to include into on of my creations, and finally, with Smashing Magazine’s wallpaper contest, it finally found its place in my November’s wallpaper. This year, autumn was very warm, and I hope this photo taken on a warm october day, will keep you warm through a cool and cold november that is coming up…" Designed by Uros Opaka from Slovenia.
- Preview
- With calendar: 1280×960, 1440×900, 1680×1050, 1680×1200, 1920×1200, 1920×1440
- Without calendar: 1280×960, 1440×900, 1680×1050, 1680×1200, 1920×1200, 1920×1440
November 1st
"The 1st day of November was the first day of the Algerian revolution. It started in 1954 and lasted more than 7 years." Designed by Houssem Teghri from Algeria.
- Preview
- With calendar: 1280×720, 1280×1024, 1440×900, 1600×1200, 1680×1050
- Without calendar: 1280×720, 1280×1024, 1440×900, 1600×1200, 1680×1050
Thanks Gathering
"November is a month for reflecting on the past year and beginning to look ahead to the coming year. During this time, we come together as friends and family to give thanks for the good things we have received and to band together in preparation for whatever may come next." Designed by Danielle Camorlinga from USA.
- Preview
- With calendar: 320×480, 1024×768, 1440×900, 1920×1080, 2560×1440
- Without calendar: 320×480, 1024×768, 1440×900, 1920×1080, 2560×1440
Autumn
Designed by Leen Van Severen from Belgium.
- Preview
- With calendar: 1024×640, 1280×800, 1440×900, 1680×1050
- Without calendar: 1024×640, 1280×800, 1440×900, 1680×1050
Constellations
"As a young girl my father showed me the constellations in the night sky. These are the November constellations as they will appear from the northern hemisphere placed in a landscape I dreamed of. See their names in the non-calendar version. Look at the night sky and find them!" Designed by Christina Balanou from Greece.
- Preview
- With calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1920×1200
- Without calendar: 320×480, 1024×768, 1024×1024, 1280×800, 1280×1024, 1920×1200
November Turkey
Designed by Roland Szabo from Hungary.
- Preview
- With calendar: 1280×720, 1280×800, 1440×900, 1680×1050, 1920×1080, 1920×1200
- Without calendar: 1280×720, 1280×800, 1440×900, 1680×1050, 1920×1080, 1920×1200
Undas
"”Undas” (Day of the Dead) is a significant holiday in the Philippines. A tradition derived from the “Dia de los Muertos” of Spain and Mexico. Families visit their deceased relatives in the cemeteries. They clean the tombs and decorate it with candles and flowers." Designed by Bored Astronauts from Philippines.
- Preview
- With calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
- Without calendar: 1024×768, 1280×800, 1280×1024, 1440×900, 1680×1050, 1920×1080, 1920×1200, 2560×1440
Join In Next Month!
Please note that we respect and carefully consider the ideas and motivation behind each and every artist’s work. This is why we give all artists the full freedom to explore their creativity and express emotions and experience throughout their works. This is also why the themes of the wallpapers weren’t anyhow influenced by us, but rather designed from scratch by the artists themselves.
A big thank you to all designers for their participation. Join in next month!
What’s Your Favourite?
What’s your favorite theme or wallpaper for this month? Please let us know in the comment section below!
(il) (vf)
© Smashing Editorial for Smashing Magazine, 2011.
Useful Coding Tools and JavaScript Libraries For Web Developers
Everyone who is a regular Smashing Magazine reader will know that we have a traditional habit of regularly researching the latest resources, tools and services out there on the Web, as productivity is a crucial asset of professional Web designers and developers. We could, and should, all integrate workflow optimization into our working practices.
Perhaps we should warn you upfront for the long compilation, but what can we say — there are so many excellent tools out there which deserve attention of the community, yet unfortunately remain obscure way too often. We love all the designers and developers out there for releasing and producing useful, valuable resources for all of us to use! We, for one, surely sincerely appreciate it in the name of the Web design community. Whether you like it or not, here are some of the most useful coding and workflow tools released recently.
Feel free to comment to this post and let us know how exactly you use these tools in your workflow and also share other tools you’ve found with others who may also find them useful and still haven’t run across them. Please do avoid link dropping and share your insights and your experience instead.
Useful Coding and Workflow Tools
Stripe: Easy Credit-Card Processing For Online Stores
A website owner has many options for accepting credit card payments. Most of those options have a verification process that is quite slow; some have APIs and interfaces that are more or less robust than others; and some solutions are much easier to use than others. With Stripe, you can forget the tedious experience of the PayPal API and other mysterious programming environments. Unfortunately, Stripe is currently available only in the US.
The Web Developer’s Wonderland
Web development comes with truly enjoyable, creative tasks and some mundane, boring ones. Probably the most frustrating task is having to reload the browser page during development or debugging every time you make a change to the page. Livereload is a desktop app that monitors changes in your file system. As soon as you save a file, the file is preprocessed as needed, and the browser is refreshed. Also, every time you change a CSS file or image, the browser is updated instantly without you having to reload the page. The tool supports CoffeeScript, SASS/SCSS, LESS, Stylus, HAML and Jade, and it ships with all of them included. Currently available only for Mac.
Ender: The End Of Monolithic JavaScript Libraries
Ender allows you to search, install, manage and compile front-end JavaScript packages and their dependencies. Essentially, it’s a command-line tool that allows you to combine and mix all of the popular and small JavaScript libraries out there to create your own personal development library. If one library you use goes bad or is abandoned, Ender will help you quickly replace it with another. And if you need a particular version of a package, the tool can help you out as well. The release page contains detailed documentation, a user guide and some video tutorials. No more wasted bandwidth!
Open-Source Exchange Rates and Currency Conversion
So, you’d like your customers to be able to purchase your products in various currencies, but how exactly do you build this functionality into your product? Finding a free and reliable API for developers to access the rates data is darn hard. Joss Crowcroft has created an Open Source Exchange Rates API, which provides up-to-date, flexible and portable currency-conversion data that can be used in any application, framework or language (not just JavaScript). It has no access fees, no rate limits, no nasty XML: just free, hourly updated exchange rates in JSON. Even better: Joss has also built money.js, a JavaScript currency conversion library that can be easily integrated in any website. A demo playground and detailed documentation are provided on the website, and the source code is available on GitHub.
Easier Number and Currency Formatting
This simple, tiny JavaScript library will solve your currency and numbers-related formatting hassles, and it even includes optional Excel-style column rendering to line up symbols and decimals. It will make all of your numbers and currencies look much more uniform and professional than they would if left to many content creators.
Tilt Firefox Extension: DOM Inspection In 3-D
How much time do you spend traversing the DOM in Firebug, exploring the relationships between nodes, analyzing the structure of code and trying to manipulate it with nasty (or not so nasty) JavaScript? Well, perhaps you’d like to try a different approach to DOM inspection for a change. Mozilla’s new tool, Tilt Firefox Extension lets you visualize the DOM tree of any Web page in 3-D. Because the DOM is essentially a tree-like representation of a document, the developers of the tool have decided to layer nodes based on the nesting in a tree, creating stacks of elements, each with a corresponding depth, and textured according to the Web page being rendered.
Mou – Markdown editor for web developers, on Mac OS X
When current available Markdown editors are almost all for general writers, Mou is different: It’s for web developers. Syntax highlighting, live preview, fullscreen mode, auto save, powerful actions, auto pair, incremental search, custom themes, HTML export, enhanced CJK characters support. It’s exactly the app you want.
Creating Buzz With Launch Effect
The one-page theme lets visitors sign up using their email. Upon signing up, the page generates a special URL for them to share with their friends, so that you can track your most active promoters and reward them for spreading the word. What more do you need from a pre-launch page? This is a good tool to bookmark for your next creative breakthrough or start-up idea.
A Better Responsive Grid
The Golden Grid System uses the concept of “folding� grid columns into one another, based on the browser’s size. So, a 16-column grid that works great in desktop browsers would fold down to an 8-column grid for tablets, and a 4-column grid for mobile devices. It can handle screen sizes ranging anywhere from 240 pixels wide all the way up to 2560 pixels. The columns themselves are not the only things that are elastic either; while the column’s widths are based on screen size, the gutter widths adjust based on the page’s font size (specified in ems). The Golden Grid System comes with other features that make it perfectly suited to modern responsive Web design.
The Semantic Grid System
CSS grid frameworks can make your life easier, but they’re not without their faults. Fortunately for us, modern techniques offer a new approach to constructing page layouts. But before getting to the solution, we must first understand the three seemingly insurmountable flaws currently affecting CSS grids.
Bootstrap Kick-Start Development Toolkit
Bootstrap is a toolkit that includes the base CSS and HTML for typography, tables, grids, navigation, error messages, modal boxes, buttons and forms. It’s built with the LESS framework. It comes with a standard 940-pixel grid (i.e. 960.gs without the side margins), or you can create your own. Bootstrap allows you to create fixed or fluid layouts, and it comes with many elements that can be used as is or restyled to fit your website. Of course, the toolkit is free to use.
Colour Bookmark
Drag the Colour Bookmark link to your toolbar to find out the colour palette of the website you’re currently on. Then simply: copy, paste and use the colours you choose.
Leaflet: Open-Source Interactive Maps with JavaScript
The library offers a variety of map layers, including tiles, markers, pop-ups, image overlays and GeoJSON. It supports panning on both mobile and desktop browsers, double-tap zoom on mobile browsers (plus multi-touch zoom on iOS) and more. On iOS, hardware acceleration is enabled, and Leaflet has a modular structure that lets you reduce the size of the library to make it even faster. The project is open source and available for further development and forking on GitHub.
Weinre
weinre is a Web Inspector Remote that is essentially a debugger for web pages, like FireBug (for FireFox) and Web Inspector (for WebKit-based browsers), except it’s designed to work remotely, and in particular, to allow you debug web pages on a mobile device such as a phone.
Aardwolf: Remote JavaScript Debugger
Mobile browsers are becoming more powerful day-by-day and you can do almost everything you do on your desktop browser. One of the major concerns for the developers is the lack of developer tools. The reasons are quite obvious — real estate needed to show the debugger, non-developer friendly environment. The solution to this problem is remote debugging. You can use JSConsole for this purpose but when it comes to JavaScript debugging, Aardwolf is a better choice. Aardwolf is a JavaScript debugger for iPhone / Android / WindowsPhone 7 / BlackBerry OS 6+. (via Varun Kumar)
IE Vms
Microsoft provides virtual machine disk images to facilitate website testing in multiple versions of IE, regardless of the host operating system. But setting these virtual machines up without Microsoft’s VirtualPC can be extremely difficult. The ievms scripts aim to facilitate that process using VirtualBox on Linux or OS X. With a single command, you can have IE7, IE8 and IE9 running in separate virtual machines.
WhatFont
The tool allows you to easily get CSS typography details about the text you are hovering on.
WordPress TextMate Bundle
The WordPress TextMate Bundle is a TextMate bundle built with the sole purpose of reducing the amount of time spent digging around the WordPress core to look up the little things that we work with every day. The plugin features auto-completion of WordPress functions, snippets for common sections of code, and templates for WordPress components. We even snuck in function completion for the Carrington template framework functions. We’re always making improvements as we find more that we want covered by the plugin (merged from WordPress MU with the WordPress 3.0 code base consolidation).
cubic-bezier previewer
No matter how much you see someone changing the parameters, if you don’t picture it in a 2D plane, it’s very hard to understand how bouncing animation with cubic-bezier works. Lea Verou searched for a tool could use to show how bezier curves are formed. She found plenty, but all of them restricted the the coordinates to the 0-1 range. Lea then proceded to create her own cubic_bezier() curves generator.
Patternizer – Stripe Pattern Generator Tool
With Patternizer, it’s easy to make something amazing in just a few minutes. It takes all the work out of creating complicated patterns, letting you focus on creativity and play. Patterns can be saved and shared with anyone, allowing for collaboration and remixing. And you can access them from any device worldwide.
Chainvas
A tiny, modular library that can add chaining to any API that isn’t naturally chainable, like the Canvas API, the DOM and more.
Comparison Table Generator
This generator allows you to create beautiful HTML/CSS comparison tables on the fly.
DropKick.js
A custom drop-down jQuery plugin which degrades gracefully. If the user has JavaScript disabled, the drop-down will display normally using regular <select>
elements. It works on IE7+.
-prefixfree
-prefix-free lets you use only unprefixed CSS properties everywhere. It works behind the scenes, adding the current browser’s prefix to any CSS code, only when it’s needed.
{less}
An automated folder scanning/parsing tool for LESS. Once you add your project folders to the application, it will automatically start monitoring the less files inside these folders for changes. After you have saved the less file, the application will automatically parse your less file into a regular CSS file. Also, see: SimpLESS, an app for Mac, Linux and PC to compile *.less files into valid CSS.
Recurly.js
This tool allows you to easily embed a PCI compliant order form within your website. The library performs in-line validation, real-time total calculations, and gracefully handles errors. Your customer stays on your website while their billing information is securely sent to Recurly for approval. Because the cardholder data is sent directly to Recurly, your PCI compliance scope is dramatically reduced.
Responsive Overlay Grid for In-Browser Development
The Heads-Up Grid is a recently released grid overlay for in-browser development. It works with fixed-width designs but also works great with responsive grids. Just specify the page units, column units, page width, number of columns, column width, gutter width, top margin and row height, and then paste the Heads-Up Grid code into the head
element of your website to generate the grid overlay.
Has.js
The library is similar to Modernizr, but instead of testing for HTML5/CSS3 features, it tests for JavaScript features such as: ES5 array, string, and object featuresNative JSON supportNative console supportActiveXNative XHRSome DOM and event features.
grumble.js
This library allows you to create tooltips that can be rotated around a given element at any angle. Any distance can be specified. Any CSS style can be applied. There’s auto-magic size adjustment for use with localised text. FX queues for animating multiple grumbles. And it works in IE6+, and all modern browsers.
testling: Automated Cross-Browser JavaScript Testing
An automated cross-browser JavaScript testing platform for your quality assurance.
Instant WordPress
A standalone, portable WordPress development environment for Windows that can run from USB.
CSS Stress Testing and Profiling
A bookmarklet for stress testing the CSS on any given webpage. It indexes all the elements and their classes, and then — class by class — it removes one, and times how long it takes to scroll the page. Selectors that save a considerable amount of time when removed indicate problem areas.
Needle: Automated Tests for Your CSS
This tool checks that CSS renders correctly by taking screenshots of portions of a website and comparing them against known good screenshots. It also provides tools for testing calculated CSS values and the position of HTML elements.
Last Click
Cutting-Edge Web Typography Experiments
The website is essentially an ongoing collection of experiments and writings on Web typography and the possibilities of cutting-edge standards-based Web design. Christopher is pushing the boundaries of what is both possible and practical in Web standards in a way that is compelling and exciting to the visually minded creative.
Font-Bot
It is time for your favorite font to stand its ground. The idea of this project is to build robots out of typeface glyphs, showcase them and hope others put together an opponent. Participating is not hard, the rules are clear: all Robots must be built of type alone (A-Z). You may reflect and rotate the letters. Keep it civil. May the best bot win. Let’s see if your type design has what it takes to defend its corner. Fight!
Lights
“Lights” is an interactive music experience which is created with CSS, JavaScript and HTML5. This is why we love the Web.
Stay Tuned!
More posts with useful tools and techniques are coming very soon here, on Smashing Magazine. If you want to be among the first to be informed about the new tools, resources and techniques, please
You won’t regret it. Thank you.
Thank you to the Smashing Editorial team, especially Christiane Rosenberger, Iris Ljesnjanin and Luca Degasperi for their help in preparing and editing the post.
© Vitaly Friedman for Smashing Magazine, 2011.
No more conditional comments in IE10
It’s not exactly news – it was announced in July in HTML5 Parsing in IE10 – but in case you missed it, Microsoft are removing support for conditional comments from IE10.
I don't expect this to be a big deal. Actually I’m not sure it will have any impact at all, at least not for me. It’s already a rare thing to need to do something special for IE9.
Posted in Browsers.
Copyright © Roger Johansson
Lessons From A Review Of JavaScript Code
Before we start, I’d like to pose a question: when was the last time you asked someone to review your code? Reviewing code is possibly the single best technique to improve the overall quality of your solutions, and if you’re not actively taking advantage of it, then you’re missing out on identifying bugs and hearing suggestions that could make your code better.
None of us write 100% bug-free code all of the time, so don’t feel there’s a stigma attached to seeking help. Some of the most experienced developers in our industry, from framework authors to browser developers, regularly request reviews of their code from others; asking whether something could be tweaked should in no way be considered embarrassing. Reviews are a technique like any other and should be used where possible.
Today we’ll look at where to get your code reviewed, how to structure your requests, and what reviewers look for. I was recently asked to review some code for a new JavaScript application, and thought I’d like to share some of my feedback, because it covers some JavaScript fundamentals that are always useful to bear in mind.
Introduction
Reviewing code goes hand in hand with maintaining strong coding standards. That said, standards don’t usually prevent logical errors or misunderstandings about the quirks of a programming language, whether it’s JavaScript, Ruby, Objective-C or something else. Even the most experienced developers can make these kinds of mistakes, and reviewing code can greatly assist with catching them.
The first reaction most of us have to criticism is to defend ourselves (or our code), and perhaps lash back. While criticism can be slightly demoralizing, think of it as a learning experience that spurs us to do better and to improve ourselves; because in many cases, once we’ve calmed down, it actually does.
Also remember that no one is obliged to provide feedback on your work, and if the comments are indeed constructive, then be grateful for the time spent offering the input.
Reviews enable us to build on the experience of others and to benefit from a second pair of eyes. And at the end of the day, they are an opportunity for us to write better code. Whether we take advantage of them is entirely our choice.
Where Can I Get My Code Reviewed?
Often the most challenging part is actually finding an experienced developer who you trust to do the review. Below are some places where you can request others to review your code (sometimes in other languages, too).
- JSMentors
JSMentors is a mailing list that discusses everything to do with JavaScript (including Harmony), and a number of experienced developers are on its review panel (including JD Dalton, Angus Croll and Nicholas Zakas). These mentors might not always be readily available, but they do their best to provide useful, constructive feedback on code that’s been submitted. If you’re looking for assistance with a specific JavaScript framework beyond vanilla JavaScript, the majority of frameworks and libraries have mailing lists or forums that you can post to and that might provide a similar level of assistance. - freenode IRC
Many chat rooms here are dedicated both to discussing the JavaScript language and to requests for help or review. The most popular rooms are obviously named, and #javascript is particularly useful for generic JavaScript requests, while channels such as #jquery and #dojo are better for questions and requests related to particular libraries and frameworks. - Code Review (beta)
You would be forgiven for confusing Code Review with StackOverflow, but it’s actually a very useful, broad-spectrum, subjective tool for getting peer review of code. While on StackOverflow you might ask the question “Why isn’t my code working?,� Code Review is more suited to questions like “Why is my code so ugly?� If you still have any doubt about what it offers, I strongly recommend checking out the FAQs. - Twitter
This might sound odd, but at least half of the code that I submit for review is through social networks. Social networks work best, of course, if your code is open source, but trying them never hurts. The only thing I suggest is to ensure that the developers who you follow and interact with are experienced; a review by a developer with insufficient experience can sometimes be worse than no review at all, so be careful! - GitHub + reviewth.is
We all know that GitHub provides an excellent architecture for reviewing code. It comes with commits, file and line comments, update notifications, an easy way to track forks of gits and repositories, and more. All that’s missing is a way to actually initiate reviews. A tool called reviewth.is attempts to rectify that by giving you a post-commit hook that helps to automate this process, so changes that get posted in the wild have a clear #reviewthis hash tag, and you can tag any users who you wish to review your updates. If many of your colleagues happen to develop in the same language as you do, this set-up can work well for code reviews sourced closer to home. One workflow that works well with this (if you’re working on a team or on a collaborative project) is to perform your own work in a topic branch in a repository and then send through pull requests on that branch. Reviewers would examine the changes and commits and could then make line-by-line and file-by-file comments. You (the developer) would then take this feedback and do a destructive rebase on that topic branch, re-push it, and allow the review cycle to repeat until merging them would be acceptable.
How Should I Structure My Review Requests?
The following are some guidelines (based on experience) on how to structure your requests for code reviews, to increase the chances of them being accepted. You can be more liberal with them if the reviewer is on your team; but if the reviewer is external, then these might save you some time:
- Isolate what you would like to be reviewed; ensure that it can be easily run, forked and commented; be clear about where you think improvements could be made; and, above all, be patient.
- Make it as easy as possible for the reviewer to look at, demo and change your code.
- Don’t submit a ZIP file of your entire website or project; very few people have the time to go through all of this. The only situation in which this would be acceptable is if your code absolutely required local testing.
- Instead, isolate and reduce what you would like to be reviewed on jsFiddle, on jsbin or in a GitHub gist. This will allow the reviewer to easily fork what you’ve provided and to show changes and comments on what can be improved. If you would prefer a “diff� between your work and any changes they’ve recommended, you might also be interested in PasteBin, which supports this.
- Similarly, don’t just submit a link to a page and ask them to “View source� in order to see what can be improved. On websites with a lot of scripts, this task would be challenging and lowers the chances of a reviewer agreeing to help. No one wants to work to find what you want reviewed.
- Clearly indicate where you personally feel the implementation could be improved. This will help the reviewer quickly home in on what you’re most interested in having reviewed and will save them time. Many reviewers will still look at other parts of the code you’ve submitted regardless, but at least help them prioritize.
- Indicate what (if any) research you’ve done into techniques for improving the code. The reviewer might very well suggest the same resources, but if they’re aware that you already know of them, then they might offer alternative suggestions (which is what you want).
- If English isn’t your first language, there’s no harm in saying so. When other developers inform me of this, I know whether to keep the language in my review technical or simple.
- Be patient. Some reviews take several days to get back to me, and nothing’s wrong with that. Other developers are usually busy with other projects, and someone who agrees to schedule a look at your work is being kind. Be patient, don’t spam them with reminders, and be understanding if they get delayed. Doing this sometimes pay off, because the reviewer can provide even more detailed feedback when they have more time.
What Should Code Reviews Provide?
Jonathan Betz, a former developer at Google, once said that a code review should ideally address six things:
- Correctness
Does the code do everything it claims? - Complexity
Does it accomplish its goals in a straightforward way? - Consistency
Does it achieve its goals consistently? - Maintainability
Could the code be easily extended by another member of the team with a reasonable level of effort? - Scalability
Is the code written in such a way that it would work for both 100 users and 10,000? Is it optimized? - Style
Does the code adhere to a particular style guide (preferably one agreed upon by the team if the project is collaborative)?
While I agree with this list, expanding it into an action guide of what reviewers should practically aim to give developers would be useful. So, reviewers should do the following:
- Provide clear comments, demonstrate knowledge, and communicate well.
- Point out the shortfalls in an implementation (without being overly critical).
- State why a particular approach isn’t recommended, and, if possible, refer to blog posts, gists, specifications, MDN pages and jsPerf tests to back up the statement.
- Suggest alternative solutions, either in a separate runnable form or integrated in the code via a fork, so that the developer can clearly see what they did wrong.
- Focus on solutions first, and style second. Suggestions on style can come later in the review, but address the fundamental problem as thoroughly as possible before paying attention to this.
- Review beyond the scope of what was requested. This is entirely at the reviewer’s discretion, but if I notice issues with other aspects of a developer’s implementation, then I generally try to advise them on how those, too, might be improved. I’ve yet to receive a complaint about this, so I assume it’s not a bad thing.
Collaborative Code Reviews
Although a review by one developer can work well, an alternative approach is to bring more people into the process. This has a few distinct advantages, including reducing the load on individual reviewers and exposing more people to your implementation, which could potentially lead to more suggestions for improvements. It also allows a reviewer’s comments to be screened and corrected if they happen to make a mistake.
To assist the group, you may wish to employ a collaborative tool to allow all reviewers to simultaneously inspect and comment on your code. Luckily, a few decent ones out there are worth checking out:
- Review Board
This Web-based tool is available for free under the MIT license. It integrates with Git, CVS, Mercurial, Subversion and a number of other source-control systems. Review Board can be installed on any server running Apache or lighttpd and is free for personal and commercial use. - Crucible
This tool by Australian software company Atlassian is also Web-based. It’s aimed at the enterprise and works best with distributed teams. Crucible facilitates both live review and live commenting and, like Review Board, integrates with a number of source-control tools, including Git and Subversion. - Rietveld
Like the other two, Rietveld also supports collaborative review, but it was actually written by the creator of Python, Guido van Rossum. It is designed to run on Google’s cloud service and benefits from Guido’s experience writing Mondrian, the proprietary app that Google uses internally to review its code. - Others
A number of other options for collaborative code review weren’t created for that purpose. These include CollabEdit (free and Web-based) and, my personal favorite, EtherPad (also free and Web-based).
(Image Source: joelogon)
Lessons From A JavaScript Code Review
On to the review.
A developer recently wrote in, asking me to review their code and provide some useful suggestions on how they might improve it. While I’m certainly not an expert on reviewing code (don’t let the above fool you), here are the problems and solutions that I proposed.
Problem 1
Problem: Functions and objects are passed as arguments to other functions without any type validation.
Feedback: Type validation is an essential step in ensuring that you’re working only with input of a desired type. Without sanitization checks in place, you run the risk of users passing in just about anything (a string, a date, an array, etc.), which could easily break your application if you haven’t developed it defensively. For functions, you should do the following at a minimum:
- Test to ensure that arguments being passed actually exist,
- Do a
typeof
check to prevent the app from executing input that is not a valid function at all.
if (callback && typeof callback === "function"){ /* rest of your logic */ }else{ /* not a valid function */ }
Unfortunately, a simple typeof
check isn’t enough on its own. As Angus Croll points out in his post “Fixing the typeof operator,� you need to be aware of a number of issues with typeof
checking if you’re using them for anything other than functions.
For example, typeof null
returns object
, which is technically incorrect. In fact, when typeof
is applied to any object type that isn’t a function, it returns object
, not distinguishing between Array
, Date
, RegEx
or whatever else.
The solution is to use Object.prototype.toString
to call the underlying internal property of JavaScript objects known as [[Class]]
, the class property of the object. Unfortunately, specialized built-in objects generally overwrite Object.prototype.toString
, but you can force the generic toString
function on them:
Object.prototype.toString.call([1,2,3]); //"[object Array]"
You might also find Angus’s function below useful as a more reliable alternative to typeof
. Try calling betterTypeOf()
against objects, arrays and other types to see what happens.
function betterTypeOf( input ){ return Object.prototype.toString.call(input).match(/^\[object\s(.*)\]$/)[1]; }
Here, parseInt()
is being blindly used to parse an integer value of user input, but no base is specified. This can cause issues.
In JavaScript: The Good Parts, Douglas Crockford refers to parseInt()
as being dangerous. Although you probably know that passing it a string argument returns an integer, you should also ideally specify a base or radix as the second argument, otherwise it might return unexpected output. Take the following example:
parseInt('20'); // returns what you expect, however… parseInt('020'); // returns 16 parseInt('000020'); // returns 16 parseInt('020', 10); // returns 20 as we've specified the base to use
You’d be surprised by how many developers omit the second argument, but it happens quite regularly. Remember that your users (if permitted to freely enter numeric input) won’t necessarily follow standard number conventions (because they’re crazy!). I’ve seen 020
, ,20
, ;'20
and many other variations used, so do your best to parse as broad a range of inputs as possible. The following tricks to using parseInt()
are occasionally better:
Math.floor("020"); // returns 20 Math.floor("0020"); //returns 20 Number("020"); //returns 20 Number("0020"); //returns 20 +"020"; //returns 20
Problem 2
Problem: Checks for browser-specific conditions being met are repeated throughout the code base (for example, feature detection, checks for supported ES5 features, etc.).
Feedback: Ideally, your code base should be as DRY as possible, and there are some elegant solutions to this problem. For example, you might benefit from the load-time configuration pattern here (also called load-time and init-time branching). The basic idea is that you test a condition only once (when the application loads) and then access the result of that test for all subsequent checks. This pattern is commonly found in JavaScript libraries that configure themselves at load time to be optimized for a particular browser.
This pattern could be implemented as follows:
var tools = { addMethod: null, removeMethod: null }; if(/* condition for native support */){ tools.addMethod = function(/* params */){ /* method logic */ } }else{ /* fallback - eg. for IE */ tools.addMethod = function(/* */){ /* method logic */ } }
The example below demonstrates how this can be used to normalize getting an XMLHttpRequest
object.
var utils = { getXHR: null }; if(window.XMLHttpRequest){ utils.getXHR = function(){ return new XMLHttpRequest; } }else if(window.ActiveXObject){ utils.getXHR = function(){ /* this has been simplified for example sakes */ return new ActiveXObject(’Microsoft.XMLHTTP’); } }
For a great example, Stoyan Stefanov applies this to attaching and removing event listeners cross-browser, in his book JavaScript Patterns:
var utils = { addListener: null, removeListener: null }; // the implementation if (typeof window.addEventListener === ’function’) { utils.addListener = function ( el, type, fn ) { el.addEventListener(type, fn, false); }; utils.removeListener = function ( el, type, fn ) { el.removeEventListener(type, fn, false); }; } else if (typeof document.attachEvent === ’function’) { // IE utils.addListener = function ( el, type, fn ) { el.attachEvent(’on’ + type, fn); }; utils.removeListener = function ( el, type, fn ) { el.detachEvent(’on’ + type, fn); }; } else { // older browsers utils.addListener = function ( el, type, fn ) { el[’on’ + type] = fn; }; utils.removeListener = function ( el, type, fn ) { el[’on’ + type] = null; }; }
Problem 3
Problem: The native Object.prototype
is being extended regularly.
Feedback: Extending native types is generally frowned upon, and few (if any) popular code bases should dare to extend Object.prototype
. The reality is that there is not likely a situation in which you absolutely need to extend it in this way. In addition to breaking the object-as-hash tables in JavaScript and increasing the chance of naming collisions, it’s generally considered bad practice, and modifying it should only be a last resort (this is quite different from extending your own custom object
properties).
If for some reason you do end up extending the object
prototype, ensure that the method doesn’t already exist, and document it so that the rest of the team is aware why it’s necessary. You can use the following code sample as a guide:
if(typeof Object.prototype.myMethod != ’function’){ Object.prototype.myMethod = function(){ //implem }; }
Juriy Zaytsev has a great post on extending native and host objects, which may be of interest.
Problem 4
Problem: Some of the code is heavily blocking the page because it’s either waiting on processes to complete or data to load before executing anything further.
Feedback: Page-blocking makes for a poor user experience, and there are a number of ways to work around it without impairing the application.
One solution is to use “deferred execution� (via promises and futures). The basic idea with promises is that, rather than issuing blocking calls for resources, you immediately return a promise for a future value that will eventually be fulfilled. This rather easily allows you to write non-blocking logic that can be run asynchronously. It is common to introduce callbacks into this equation that execute once the request completes.
I’ve written a relatively comprehensive post on this with Julian Aubourg, if you’re interested in doing this through jQuery, but it can of course be implemented with vanilla JavaScript as well.
Micro-framework Q offers a CommonJS-compatible implementation of promises and futures that is relatively comprehensive and can be used as follows:
/* define a promise-only delay function that resolves when a timeout completes */ function delay(ms) { var deferred = Q.defer(); setTimeout(deferred.resolve, ms); return deferred.promise; } /* usage of Q with the 'when' pattern to execute a callback once delay fulfils the promise */ Q.when(delay(500), function () { /* do stuff in the callback */ });
If you’re looking for something more basic that can be read through, then here is Douglas Crockford’s implementation of promises:
function make_promise() { var status = ’unresolved’, outcome, waiting = [], dreading = []; function vouch( deed, func ) { switch (status) { case ’unresolved’: (deed === ’fulfilled’ ? waiting : dreading).push(func); break; case deed: func(outcome); break; } }; function resolve( deed, value ) { if (status !== ’unresolved’) { throw new Error(’The promise has already been resolved:’ + status); } status = deed; outcome = value; (deed == ’fulfilled’ ? waiting : dreading).forEach(function (func) { try { func(outcome); } catch (ignore) {} }); waiting = null; dreading = null; }; return { when: function ( func ) { vouch(’fulfilled’, func); }, fail: function ( func ) { vouch(’smashed’, func); }, fulfill: function ( value ) { resolve(’fulfilled’, value); }, smash: function ( string ) { resolve(’smashed’, string); }, status: function () { return status; } }; };
Problem 5
Problem: You’re testing for explicit numeric equality of a property using the ==
operator, but you should probably be using ===
instead
Feedback: As you may or may not know, the identity ==
operator in JavaScript is fairly liberal and considers values to be equal even if they’re of completely different types. This is due to the operator forcing a coercion of values into a single type (usually a number) prior to performing any comparison. The ===
operator will, however, not do this conversion, so if the two values being compared are not of the same type, then ===
will just return false
.
The reason I recommend considering ===
for more specific type comparison (in this case) is that ==
is known to have a number of gotchas and is considered to be unreliable by many developers.
You might also be interested to know that in abstractions of the language, such as CoffeeScript, the ==
operator is completely dropped in favor of ===
beneath the hood due to the former’s unreliability.
Rather than take my word for it, see the examples below of boolean checks for equality using ==
, some of which result in rather unexpected outputs.
3 == "3" // true 3 == "03" // true 3 == "0003" // true 3 == "+3" //true 3 == [3] //true 3 == (true+2) //true ’ \t\r\n ’ == 0 //true "\t\r\n" == 0 //true "\t" == 0 // true "\t\n" == 0 // true "\t\r" == 0 // true " " == 0 // true " \t" == 0 // true " \ " == 0 // true " \r\n\ " == 0 //true
The reason that many of the (stranger) results in this list evaluate to true
is because JavaScript is a weakly typed language: it applies type coercion wherever possible. If you’re interested in learning more about why some of the expressions above evaluate to true
, look at the Annotated ES5 guide, whose explanations are rather fascinating.
Back to the review. If you’re 100% certain that the values being compared cannot be interfered with by the user, then proceed with using the ==
operator with caution. Just remember that ===
covers your bases better in the event of an unexpected input.
Problem 6
Problem: An uncached array length
is being used in all for
loops. This is particularly bad because you’re using it when iterating through an HTMLCollection.
Here’s an example:
for( var i=0; i<myArray.length;i++ ){ /* do stuff */ }
Feedback: The problem with this approach (which I still see a number of developers using) is that the array length
is unnecessarily re-accessed on each loop’s iteration. This can be very slow, especially when working with HTMLCollections (in which case, caching the length
can be anywhere up to 190 times faster than repeatedly accessing it, as Nicholas C. Zakas mentions in his book High-Performance JavaScript). Below are some options for caching the array length
.
/* cached outside loop */ var len = myArray.length; for ( var i = 0; i < len; i++ ) { } /* cached inside loop */ for ( var i = 0, len = myArray.length; i < len; i++ ) { } /* cached outside loop using while */ var len = myArray.length; while (len--) { }
A jsPerf test that compares the performance benefits of caching the array length
inside and outside the loop, using prefix increments, counting down and more is also available, if you would like to study which performs the best.
Problem 7
Problem: jQuery’s $.each()
is being used to iterate over objects and arrays, in some cases while for
is being used in others.
Feedback: In jQuery, we have two ways to seamlessly iterate over objects and arrays. The generic $.each
iterates over both of these types, whereas $.fn.each()
iterates over a jQuery object specifically (where standard objects can be wrapped with $()
should you wish to use them with the latter). While the lower-level $.each
performs better than $.fn.each()
, both standard JavaScript for
and while
loops perform much better than either, as proven by this jsPerf test. Below are some examples of loop alternatives that also perform better:
/* jQuery $.each */ $.each(a, function() { e = $(this); }); /* classic for loop */ var len = a.length; for ( var i = 0; i < len; i++ ) { //if this must be a jQuery object do.. e = $(a[i]); //otherwise just e = a[i] should suffice }; /* reverse for loop */ for ( var i = a.length; i-- ) { e = $(a[i]); } /* classic while loop */ var i = a.length; while (i--) { e = $(a[i]); } /* alternative while loop */ var i = a.length - 1; while ( e = a[i--] ) { $(e) };
You might find Angus Croll’s post on “Rethinking JavaScript for
Loops� an interesting extension to these suggestions.
Given that this is a data-centric application with a potentially large quantity of data in each object or array, you should consider a refactor to use one of these. From a scalability perspective, you want to shave off as many milliseconds as possible from process-heavy routines, because these can build up when hundreds or thousands of elements are on the page.
Problem 8
Problem: JSON strings are being built in-memory using string concatenation.
Feedback: This could be approached in more optimal ways. For example, why not use JSON.stringify()
, a method that accepts a JavaScript object and returns its JSON equivalent. Objects can generally be as complex or as deeply nested as you wish, and this will almost certainly result in a simpler, shorter solution.
var myData = {}; myData.dataA = [’a’, ’b’, ’c’, ’d’]; myData.dataB = { ’animal’: ’cat’, ’color’: ’brown’ }; myData.dataC = { ’vehicles’: [{ ’type’: ’ford’, ’tint’: ’silver’, ’year’: ’2015’ }, { ’type’: ’honda’, ’tint’: ’black’, ’year’: ’2012’ }] }; myData.dataD = { ’buildings’: [{ ’houses’: [{ ’streetName’: ’sycamore close’, ’number’: ’252’ }, { ’streetName’: ’slimdon close’, ’number’: ’101’ }] }] }; console.log(myData); //object var jsonData = JSON.stringify(myData); console.log(jsonData); /* {"dataA":["a","b","c","d"],"dataB":{"animal":"cat","color":"brown"},"dataC":{"vehicles":[{"type":"ford","tint":"silver","year":"2015"},{"type":"honda","tint":"black","year":"2012"}]},"dataD":{"buildings":[{"houses":[{"streetName":"sycamore close","number":"252"},{"streetName":"slimdon close","number":"101"}]}]}} */
As an extra debugging tip, if you would like to pretty-print JSON in your console for easier reading, then the following extra arguments to stringify()
will achieve this:
JSON.stringify({ foo: "hello", bar: "world" }, null, 4);
Problem 9
Problem: The namespacing pattern used is technically invalid.
Feedback: While namespacing is implemented correctly across the rest of the application, the initial check for namespace existence is invalid. Here’s what you currently have:
if ( !MyNamespace ) { MyNamespace = { }; }
The problem is that !MyNamespace
will throw a ReferenceError
, because the MyNamespace
variable was never declared. A better pattern would take advantage of boolean conversion with an inner variable declaration, as follows:
if ( !MyNamespace ) { var MyNamespace = { }; } //or var myNamespace = myNamespace || {}; // Although a more efficient way of doing this is: // myNamespace || ( myNamespace = {} ); // jsPerf test: http://jsperf.com/conditional-assignment //or if ( typeof MyNamespace == ’undefined’ ) { var MyNamespace = { }; }
This could, of course, be done in numerous other ways. If you’re interested in reading about more namespacing patterns (as well as some ideas on namespace extension), I recently wrote “Essential JavaScript Namespacing Patterns.� Juriy Zaytsev also has a pretty comprehensive post on namespacing patterns.
Conclusion
That’s it. Reviewing code is a great way to enforce and maintain quality, correctness and consistency in coding standards at as high a level as possible. I strongly recommend that all developers give them a try in their daily projects, because they’re an excellent learning tool for both the developer and the reviewer. Until next time, try getting your code reviewed, and good luck with the rest of your project!
(al) (il)
© Addy Osmani for Smashing Magazine, 2011.