Skip navigation
Help

recorder.sayforward.com

Hey! You're looking at the front page of recorder.sayforward.com which is a temporary storage place for articles I didn't read/evaluate yet. I also use this platform to prepare new content to post sayforward.com where audio/video/image material is hosted completely on my server. On the recorder instead, media is loaded from external sources, so don't get mad if some of them don't work anymore.

Please note that the content posted here is explicitly intended to help me remember certain things, i.e. it is not intended to entertain you in any way (although you certainly will find stuff that fulfills this criteria).

Now: Happy Browsing!

Windows only: Take a few minutes to familiarize yourself with the 747-dashboard of an interface that graces Bulk Rename Utility and you'll be rewarded with an enormously powerful tool. You can rename files, substitute some or all of the file name, apply numbers and lettering, swap extensions, append with time and date stamps, rename based on image EXIF data and audio ID3 data, and all that just scratches the surface. Concerned that somewhere in the labyrinth of check and text boxes you may have misstepped? The quick preview function is a fast and handy feature to help you sidestep any mishaps. After Bulk Rename Utility came reader recommended in the comments of Ken Rename, it has become a completely indispensable part of my file management work flow. Bulk Rename is freeware, Windows only.Thanks IOStreamCTO!

Bulk Rename Utility



0
Your rating: None

Yet another example proving the coolest things always come from Japan.

Lunascape is a web browser that incorporates all three major web rendering engines — Firefox’s Gecko engine, WebKit, which is used by Safari and Chrome, and Trident, the engine used by Internet Explorer.

The Windows-only download is the product of the Tokyo firm Lunascape, which has apparently been developing this product as Japanese-only release since 2004. This is the first English version of the browser, and it’s available as a free alpha download.

I ran it through some basic tests, and it’s stable. You can switch between the three rendering engines by right-clicking on the current tab under the menu bar. The option to select an engine appears in drop-down menu. There’s also an auto-engine switcher that forces specific pages to use one particular engine.

Most of us use several web browsers in testing our websites or even for just browsing around. Personally, I use Camino for all of my productivity apps (Gmail, Google apps and FriendFeed) and Firefox 3 for general browsing, but I also have to keep Safari open to use CondeNet’s intranet. Almost everyone has one critical site on their list that only lets you in if you have IE or Safari/Chrome, so Lunascape is an attractive alternative to running multiple instances of different browsers.

That being said, Lunascape is a total beast. It’s cluttered and difficult to use, especially if you’re used to the expertly-designed interfaces of IE or Firefox, or the barely-there UI of Safari or Chrome. There’s RSS support, but reading feeds is clumsy. There are almost too many options, including dozens of tweaks and interesting functionality available in the default menus, like the ability to download all linked media on a page to your hard drive at once, DownThemAll-style.

Speaking of DownThemAll, Lunascape sadly does not support Firefox add-ons even though the website advertises that it does. (If there’s some way to lash Firefox add-ons onto this, please let me know in the comments!)

The browser does have its own plug-in architecture, however, and it can be customized with a healthy assortment of downloadable skins. So, not only can you run Safari, Firefox and IE all in one browser, you can also do it in vibrant, pink Hello Kitty style.

Also check out the Lunapedia, an online user manual full of tips, links and FAQs.

0
Your rating: None

“Gentlemen, we can rebuild it. We have the technology. We can make Twitter better than it was before. Better, stronger, faster.”

That’s the speech I imagine Niall Kennedy giving himself recently when he decided to rewrite Twitter’s front end using web best practices. The result is a read only Twitter that’s a little less pretty, but a whole lot more streamlined.

To start, Kennedy converted Twitter’s table layout to XHTML/CSS-based design. He also split the page load so that all those little avatar graphics are loaded asynchronously, which makes pages appear faster.

One of the larger undertakings was localizing (or is it localising?) the site. Kennedy had to choose common wording throughout the site and ensure nothing that would ever need translating was hard-coded.

Kennedy claims a 41% decrease in bandwidth and a much faster DOM footprint. It’s a geeky way of saying that TwitterFE is an improved Twitter.

Of course, the front end has never been Twitter’s biggest problem. It’s the back-end, with thousands of messages a second, that prompts the Fail Whale. In all, TwitterFE reminds of redesigning Craigslist. It seems like a great idea, but it ends up being a solution searching for a problem.

But as a case study, TwitterFE is extremely useful. Perhaps Kennedy will release his source code, which runs on Google App Engine, and we can all learn from his experience.

See also:

0
Your rating: None

Google Life Mag PhotosLooking for a time suck? Google has put the entire catalog of Life magazine photographs online and (of course) made it fully searchable. More than a million historic Life images are hosted on a special section of the Google Images site, which you can browse by year, place, people, events and more.

The vast majority of the images are pulled from Life’s extensive archives and have never been published, though naturally many of the iconic images from Life’s covers are also in the mix.

Beware, you could lose hours, probably even days, in there.

[Via Waxy]

See Also:

0
Your rating: None

Remember last week when I said coding was just writing?

I was wrong. As one commenter noted, it's even simpler than that.

[This] reminds me of a true "Dilbert moment" a few years ago, when my (obviously non-technical) boss commented that he never understood why it took months to develop software. "After all", he said, "it's just typing."

Like broken clocks, even pointy-haired managers are right once a day. Coding is just typing.

keyright keyboard

So if you want to become a great programmer, start by becoming a great typist. Just ask Steve Yegge.

I can't understand why professional programmers out there allow themselves to have a career without teaching themselves to type. It doesn't make any sense. It's like being, I dunno, an actor without knowing how to put your clothes on. It's showing up to the game unprepared. It's coming to a meeting without your slides. Going to class without your homework. Swimming in the Olympics wearing a pair of Eddie Bauer Adventurer Shorts.

Let's face it: it's lazy.

There's just no excuse for it. There are no excuses. I have a friend, John, who can only use one of his hands. He types 70 wpm. He invented his own technique for it. He's not making excuses; he's typing circles around people who are making excuses.

I had a brief email exchange with Steve back in March 2007, after I wrote Put Down The Mouse, where he laid that very same Reservoir Dogs quote on me. Steve's followup blog post was a very long time in coming. I hope Steve doesn't mind, but I'd like to pull two choice quotes directly from his email responses:

I was trying to figure out which is the most important computer science course a CS student could ever take, and eventually realized it's Typing 101.

The really great engineers I know, the ones who build great things, they can type.

Strong statements indeed. I concur. We are typists first, and programmers second. It's very difficult for me to take another programmer seriously when I see them using the hunt and peck typing techniques. Like Steve, I've seen this far too often.

First, a bit of honesty is in order. Unlike Steve, I am a completely self-taught typist. I didn't take any typing classes in high school. Before I wrote this blog post, I realized I should check to make sure I'm not a total hypocrite. So I went to the first search result for typing test and gave it a shot.

typing test speed (WPM) results

I am by no means the world's fastest typist, though I do play a mean game of Typing of the Dead. Let me emphasize that this isn't a typing contest. I just wanted to make sure I wasn't full of crap before I posted this. I know, there's a first time for everything. Maybe this'll be the start of a trend. Doubtful, but you never know.

Steve and I believe there is nothing more fundamental in programming than the ability to efficiently express yourself through typing. Note that I said "efficiently" not "perfectly". This is about reasonable competency at a core programming discipline.

Maybe you're not convinced that typing is a core programming discipline. I don't blame you, although I do reserve the right to wonder how you manage to program without using your keyboard.

Instead of answering directly, let me share one of my (many) personal foibles with you. At least four times a day, I walk into a room having no idea why I entered that room. I mean no idea whatsoever. It's as if I have somehow been teleported into that room by an alien civilization. Sadly, the truth is much less thrilling. Here's what happened: in the brief time it took for me to get up and move from point A to point B, I have totally forgetten whatever it was that motivated me to get up at all. Oh sure, I'll rack my brain for a bit, trying to remember what I needed to do in that room. Sometimes I remember, sometimes I don't. In the end, I usually end up making multiple trips back and forth, remembering something else I should have done while I was in that room after I've already left it.

It's all quite sad. Hopefully your brain has a more efficient task stack than mine. But I don't fault my brain -- I fault my body. It can't keep up. If I had arrived faster, I wouldn't have had time to forget.

What I'm trying to say is this: speed matters. When you're a fast, efficient typist, you spend less time between thinking that thought and expressing it in code. Which means, if you're me at least, that you might actually get some of your ideas committed to screen before you completely lose your train of thought. Again.

Yes, you should think about what you're doing, obviously. Don't just type random gibberish as fast as you can on the screen, unless you're a Perl programmer. But all other things being equal -- and they never are -- the touch typist will have an advantage. The best way to become a touch typist is through typing, and lots of it. A little research and structured practice couldn't hurt either. Here are some links that might be of interest to the aspiring touch typist:

(But this is a meager and incomplete list. What tools do you recommend for becoming a better typist?)

There's precious little a programmer can do without touching the keyboard; it is the primary tool of our trade. I believe in practicing the fundamentals, and typing skills are as fundamental as it gets for programmers.

Hail to the typists!

[advertisement] Lighthouse — taking the suck out of issue tracking. Developer API. Email integration. Github integration. Used by thousands of developers and open source projects including Rails, MooTools, RSpec, and Sproutcore. Free for Open Source projects.

0
Your rating: None

I planned my first trip to Japan six months out with every intention of studying basic language skills in advance. I subscribed to a podcast, looked into Rosetta Stone, and added a few foreign films to our Netflix queue. Easier said than done. After five months of procrastination (just being honest), I picked up this book as a last-ditch effort to learn at least a little as we traveled. For a two-week trip, we brought five guides, including the previously-reviewed Japan's Hidden Hot Springs. Survival Japanese is the only one I consulted everyday -- at least one-third of its pages are now dog-eared. Rather than overwhelm with long word lists or complex explanations of how to form unique sentences, the book is broken into scenarios with simple phrases listed in English, Japanese (Romanized), Japanese characters and, most importantly, spelled phonetically in English. You just flip to whatever situation you're prepping for or have found yourself in... in a taxi, greeting people, paying bills, apologizing, asking questions, at the station, in a bar, visiting a home, medical emergencies (thankfully, we had none) and more. Sure an extensive glossary with many more words would be nice; additional phrases for the same and other scenarios would also be useful. That's not the point with this one. If you're a true beginner, the book provides just enough in a package you won't mind stashing in a jacket pocket or tossing in a day bag. I still wish I'd learned more beforehand. Nevertheless, my new (and very polite) Japanese friends gave me an A for effort.

-- Steven Leckart

survival-japanese-2.jpg

Survival Japanese
Boye Lafayette De Mente
160 pages, 2003 (revised ed.)
$7
Available from Amazon

If you want to save money and have the time to create a DIY pocketguide (I did not), this wikitravel phrasebook is a great resource; also, please note that below are just a few select phrases from a few sections -- SL

Related Entries:
SCOLA Television

Destinos

French in Action


0
Your rating: None

Have you ever heard a software engineer refer to a problem as "NP-complete"? That's fancy computer science jargon shorthand for "incredibly hard":

The most notable characteristic of NP-complete problems is that no fast solution to them is known; that is, the time required to solve the problem using any currently known algorithm increases very quickly as the size of the problem grows. As a result, the time required to solve even moderately large versions of many of these problems easily reaches into the billions or trillions of years, using any amount of computing power available today. As a consequence, determining whether or not it is possible to solve these problems quickly is one of the principal unsolved problems in Computer Science today.

While a method for computing the solutions to NP-complete problems using a reasonable amount of time remains undiscovered, computer scientists and programmers still frequently encounter NP-complete problems. An expert programmer should be able to recognize an NP-complete problem so that he or she does not unknowingly waste time trying to solve a problem which so far has eluded generations of computer scientists.

You do want to be an expert programmer, don't you? Of course you do!

NP-complete problems are like hardcore pornography. Nobody can define what makes a problem NP-complete, exactly, but you'll know it when you see it. Just this once, I'll refrain from my usual practice of inserting images to illustrate my point.

(Update: I was shooting for a poetic allusion to the P=NP problem here but based on the comments this is confusing and arguably incorrect. So I'll redact this sentence. Instead, I point you to this P=NP poll (pdf); read the comments from CS professors (including Knuth) to get an idea of how realistic this might be.)

Instead, I'll recommend a book Anthony Scian recommended to me: Computers and Intractability: A Guide to the Theory of NP-Completeness.

 A Guide to the Theory of NP-Completeness

Like all the software engineering books I recommend, this book has a timeless quality. It was originally published in 1979, a shining testament to smart people attacking truly difficult problems in computer science: "I can't find an efficient algorithm, but neither can all these famous people."

So how many problems are NP-complete? Lots.

Even if you're a layman, you might have experienced NP-Completeness in the form of Minesweeper, as Ian Stewart explains. But for programmers, I'd argue the most well known NP-completeness problem is the travelling salesman problem.

Given a number of cities and the costs of travelling from any city to any other city, what is the least-cost round-trip route that visits each city exactly once and then returns to the starting city?

The brute-force solution -- trying every possible permutation between the cities -- might work for a very small network of cities, but this quickly becomes untenable. Even if we were to use theoretical CPUs our children might own, or our children's children. What's worse, every other algorithm we come up with to find an optimal path for the salesman has the same problem. That's the common characteristic of NP-complete problems: they are exercises in heuristics and approximation, as illustrated by this xkcd cartoon:

 Travelling Salesman Problem

What do expert programmers do when faced by an intractable problem? They cheat. And so should you! Indeed, some of the modern approximations for the Travelling Salesman Problem are remarkably effective.

Various approximation algorithms, which quickly yield good solutions with high probability, have been devised. Modern methods can find solutions for extremely large problems (millions of cities) within a reasonable time, with a high probability of being just 2-3% away from the optimal solution.

Unfortunately, not all NP-complete problems have good approximations. But for those that do, I have to wonder: if we can get so close to an optimal solution by cheating, does it really matter if there's no known algorithm to produce the optimal solution? If I've learned nothing else from NP-complete problems, I've learned this: sometimes coming up with clever cheats can be more interesting than searching in vain for the perfect solution.

Consider the First Fit Decreasing algorithm for the NP-complete Bin Packing problem . It's not perfect, but it's incredibly simple and fast. The algorithm is so simple, in fact, it is regularly demonstrated at time management seminars. Oh, and it guarantees that you will get within 22% of the perfect solution every time. Not bad for a lousy cheat.

So what's your favorite NP-complete cheat?

[advertisement] Peer code review without meetings, paperwork, or stopwatches? No wonder Code Collaborator won the Jolt Award.

0
Your rating: None

by Daved Brosche

Having a good collection of Photoshop brushes is essential for any designer. There is certainly no shortage of Photoshop brushes on the Web these days. The problem with Photoshop brushes isn’t in finding brushes, but in finding quality brushes. Below you’ll find a collection of quality brushes that every designer should find handy.

These 50 Photoshop brush sets are ones I find myself using over and over in a variety of projects. This collection is the result of years’ worth of downloads, trials and experiments. I hope this list helps you find some new Photoshop brushes that improve your collection.

Paint Splatters

Paint splatters are an essential set of Photoshop brushes to have. Lord knows there are plenty of them out there, but they are not all created equal. I have a good number of splatter brushes in my arsenal, but these are the ones I find myself calling upon the most for a variety of effects.

Splashes of Paint

Sample

Splatters

Sample

Splatter

Sample

Photoshop Brushes Set 1

Sample

Photoshop Brushes Set 2

Sample

Photoshop Brushes Set 3

Sample

Lucidity Brushes

Sample

Gradiant Splats

Sample

Go Media Brushes

Sample

Massive Splatter Pack

Sample

Brush Strokes

These types of Photoshop brushes are great to have on hand because they can achieve a variety of effects. They can do anything from helping you finish off an edge to grunging of a photo, and endless amount of other tasks. Brush stroke brushes are a commodity in Photoshop. These are some of my favorites.

Simple Smudges

Sample

20 Painted Brushes

Sample

Watercolor Brushes I

Sample

Watercolor Brushes II

Sample

Messy Spraypaint

Sample

Grungy Watercolor Brushes

Sample

Hi-Res Water Color Brushes 2

Sample

Hi-Res Watercolor Brushes

Sample

Fingertips

Sample

Blood

Sample

Textures

While actual texture photos come in handy for adding textures to your work, sometimes a Photoshop brush comes in more handy. For those times, you may want to look into some of the texture brushes I have picked out below. They are great for adding a touch of texture to your latest grunge design.

Concrete Series Vol 3

Sample

Fabric Textures Hi-Res

Sample

Texture Brushes Set 2

Sample

Paint Peel Pack

Sample

Wood Photoshop Brushes

Sample

52 Texture Brushes

Sample

Grunge Brushes

Sample

Hi-Res Dirt Brush Set

Sample

Grunge Brushes Moved

Sample

50 Texture Brushes

Sample

Borders and Edges

While not as multi-purpose as the stroke brushes, these edges and border are nonetheless valuable. I probably have more border and edge brushes in my collection than any other type of Photoshop brush. A good border or edge brush pack can make all the difference in your design. Many of these brushes come in super-large sizes to give you quality results.

Chalk Edges

Sample

Paper Edges

Sample

Torn Edges

Sample

Torn Edges 2

Sample

Sachet Edges

Sample

Torn Paper Brushes

Sample

Dirty Grunge Brush Set 1

Sample

Grunge Corners Brush Pack

Sample

Grunge Grit Borders

Sample

More Borders

Sample

Hand-Drawn Elements

Ok, so these are only really essential if you are trying to create that hand-drawn effect in your design. That said, these are some essential Photoshop brushes that will help you create a design with a hand-drawn look. Most, if not all, of these Photoshop brushes were made from real drawings. You can’t get much more “hand-drawn” than that.

Hand-Drawn Ornaments

Sample

Handwriting Brushes

Sample

Flower Brushes Drawn

Sample

Hand-Drawn Floral Pattern

Sample

Handmade Doodles

Sample

Big Swirly Ornaments

Sample

Old Markers

Sample

Sketchy Circles

Sample

Crayon Stars

Sample

Handmade Doodles

Sample

Smashing Magazine’s Photoshop Brushes

Splatter and Watercolour Brushes For Photoshop

Sample

67 Health and Beauty Brushes

Sample

Grunge Photoshop Brushes Set

Sample

(al)

0
Your rating: None

I used to wear contact lenses all the time, largely because they made playing sports easier. Then I bought a pair of Eyephorics. Zowee. At 2.5 grams, these glasses are ultra light and ultra, ultra comfortable. I often lay down to go to sleep totally unaware they are on my face. I chose earpieces that hook behind my ears. They don't slip, even when my face gets sweaty when I run and play tennis. Aside from different earpieces, you can get any shape lens and any color nose piece/ear bar. Mine are seafoam green, which sounds weird but they look normal. I got mine at a local high-end eyewear store. The glasses are costly, but they are also super durable. I am very rough on my glasses. This pair has taken some serious abuse in the past 18 months , but always manages to bounce back. I will never buy any other kind. If you wear contacts or glasses, these glasses will make you swoon.

-- Anne Schuster

eyephorics-colors-sm.jpg

Eyephorics
$270
(depending on lens/Rx/color, etc.)
Available from SF Optics - San Francisco

Grand Central Eyewear - New York

Eye Spy Optical - Chicago

QOptical - Boston

Also available for $180 via Optical Needs on eBay

Manufactured by Swissflex

Related Entries:
Maui Jim Titanium Sport Sunglasses

CliC Readers

Blinkless EyeDropper


0
Your rating: None

Well, I finally came up with a fix for this issue and thought to archive it.  Basically, the issue is that when you have textfields in a Sprite that you use for a material source for Papervision3D, you want to be able to set focus to those text fields.  Without them being on stage, however, it doesn’t work to say “stage.focus = myTextField”.

So, very simply, all you have to do is add the textfield to the stage, then use stage.focus = myTextField, then re-add back to your Sprite.  Bingo, you have focus in your TextField.  Now, I should say, that i’ve seen it work with just using stage.focus = myTextField, but in this particular situation, adding it to the stage first, then setting focus, then adding it back worked.  So give it a whirl either way.

example:

stage.addChild(myTextField);
stage.focus = myTextField;
this.addChild(myTextField);

Bam! done.  As long as you’re redrawing your material so that you can see what you’re typing ( bitmapMaterial.drawBitmap()), it’ll work just fine.

Tabbing is controlled easily with:


protected function handleKeyUp(e:KeyboardEvent):void
{
if( e.keyCode == 9 ) // tab
{
if( currentField == username )
changeToPassword();
else if( currentField == password )
changeToUsername();
}
}

hope that helps someone!

0
Your rating: None

Noupe keeps the roundups going with Most Wanted Ajax Techniques: 50+ Examples and Tutorials that consists of a lot of projects we have covered over time, but some new ones, and the added touch of putting it together in one place.

Ajax Forms

ShoutBox

Validate a Username AJAX

Ajax Instant Messenger

Ajax Tabs Content

Ajax Shopping Carts

Ajax Star Ratings

Ajax Inline Edit

Ajax Progress Bar

Ajax Pagination

Ajax File Browser & Manager

Ajax Calendar

Ajax Photo Manipulation

Ajax Dynamic Image Gallery and Slideshows

Ajax File Upload

Ajax AutoCompleter

CMS

Polls

Tabular data manipulations

Miscellaneous

0
Your rating: None

Rad headline font, dudeFor years web developers have bemoaned the state of typography on the web. We don’t have much control and we have to choose between a small handful of fonts. The only real guarantee is whether our text is serif or sans-serif.

A new JavaScript library solves the problem in a way similar to the long popular sIFR, but without requiring Flash. Called typeface.js, the library reproduces truetype fonts by converting glyphs to JSON. It uses canvas, SVG graphics, or VML, depending on the browser.

Like sIFR, it lets you keep your content in your HTML, but replaces the text with the appropriate shapes. That means that screen readers and search spiders can still get at your content.

The download weight appears slightly larger than sIFR, but still a reasonable size considering the information it holds. The main JavaScript file is 16K, with most fonts weighing in at about 50K.

Original sIFR creator Shaun Inman doesn’t appear all that impressed. In his link blog, Inman wrote:

“Dear type vendors, please save us from these convoluted stopgaps.”

Yes, it’s not as perfect a solution as a built-in standard. The library has three fonts available, plus a tool to convert other truetype fonts to JSON, as long as you have the right to embed the font. The tool won’t convert certain fonts it knows are restricted.

See also:


0
Your rating: None

I write a column for computer programmers called "Stevey's Blog Rants." It's basically a magazine column — I publish to it about once a month. The average length of my articles is about 12 pages, although they can range anywhere from 4 to 40 pages, depending on how I'm feeling. But for precedent, don't think blogs: think of Reader's Digest. The blog format sets the wrong expectations.

Hence, some people complain that my articles are too long. Others complain that I have not given my arguments sufficient exposition, and that my articles are in fact too short on detail to warrant any credibility. This is a lose-lose situation for me, but I keep at it nonetheless because I enjoy writing. Even if nobody were to read my blog, the act of writing things down helps me think more clearly, and it's engaging in the same way that solving a Sudoku puzzle is engaging.

You should try it yourself. All it takes is a little practice.

My blog topics vary widely, and sometimes I even venture outside the realm of programming. Programming is where I'm most comfortable, and it's also where people seem to ascribe to me some level of punditry: I'm not necessarily right, but even my greatest detractors grudgingly admit that I'm entitled to an opinion, by virtue of my having spent twenty years hacking day and night without any sign of wanting to give it up and turn into a pointy-haired manager.

Even though I love both programming and to a lesser extent writing about it, there are also lots of non-programming topics I'd like to write about. Being a career programmer gives you an interesting perspective on issues not directly related to programming. You start to see parallels. So maybe I'll branch out some more and see how it goes.

The programmer's view

The first thing you notice as a programmer is that it trains you — forces you, really — to think in a disciplined way about complex logic problems. It also gives you a big booster shot of confidence around problem-solving in general. Junior programmers tend to have very high opinions of themselves; I was no exception.

In time, though, programming eventually humbles you, because it shows you the limits of your reasoning ability in ways that few other activities can match. Eventually every programmer becomes entangled in a system that is overwhelming in its complexity. As we grow in our abilities as programmers we learn to tackle increasingly complex systems. But every human programmer has limits, and some systems are just too hard to grapple with.

When this happens, we usually don't blame ourselves, nor think any less of ourselves. Instead we claim that it's someone else's fault, and it just needs a rewrite to help manage the complexity. In many cases this is even true.

Over time, our worldwide computer-programming community has discovered or invented better and better ways ways to organize programs and systems. We've managed to increase their functionality while keeping the complexity under control.

But even with such controls in place, systems can occasionally get out of hand. And sometimes they even need to be abandoned altogether, like a dog that's gone rabid. No matter how much time and love you've put into such systems, there's no fixing them.

Abandoning a system is a time of grieving for the folks who've worked on it. Such systems are like family.

And there's a disturbing lesson at the tail end of such experiences. The scary thing is that it's very easy, as a programmer standing at the precipice of complexity, to envision systems that are orders of magnitude more complex, millions of times more complex, even unimaginably more complex.

In the end, programming shows us how small we are.

The fish's view

Long ago, I used to have a Siamese fighting fish, also known as a Betta splendens, or simply a "betta". You can buy these fish at almost any pet store. I kept my betta, who was a deep vibrant red, in a pretty little 15-gallon tank decorated with a resplendence of real freshwater plants. And for a while I think my betta was happy there.

Like many Americans, I went through a phase in which I kept and ultimately killed many, many tropical fish. I didn't kill them intentionally; I wanted them to live and thrive. But keeping them alive for long is a challenge when you don't live in the tropics. So they might live for a few months or maybe a year, but they would always die prematurely. It was sad, and eventually I could no longer bear it, so I stopped keeping them.

Of all my fish, my betta left the biggest impression on me. The betta is a remarkable fish in several ways. For one thing, bettas are physically beautiful, and when they are at full display, their fins expand, peacock-like, into a fluid rose shape that is undeniably dramatic.

Bettas are also remarkable because they fight. They do not fight to establish a pecking order, as other fish do; they fight to kill. The males display their fins and then fight whenever they see another male betta, or even their own reflection, so they have to be kept alone and away from mirrors.

But bettas, I think, are most remarkable for their intelligence. Of all of the hundreds of tropical fish I kept, only bettas displayed anything resembling intellectual curiosity.

This really makes bettas some of the saddest stories in the tropical fish industry. Like other hobbyist fishes, they are stolen from their natural habitat and shipped overseas, or at best farmed in unsavory conditions. But unlike most other fish, bettas are also dyed to enhance their color. They are generally housed in tiny fist-sized bowls because of their ability to breathe air when necessary. And they are bred to express their fighting genes, and are often made to fight by their owners. Whereas other fish are kidnapped and sold, bettas are abused.

But worst of all, I believe their high intelligence endows them with greater capacity for suffering than other fish species. They can suffer physically and emotionally, but as we will see shortly, they can also suffer intellectually.

So bettas are a sad story.

My betta

Here is the specific sad story of my betta, the fish that left such an impression on me.

I had taken to lying on my bed and watching my betta for an hour or longer. The betta was the sole occupant of the tank in my bedroom. I had filled the tank with plants and copious natural light, so the effect was calming and serene. At times I almost envied the betta for the nice home I'd made for him.

One day, after the betta had been in his new home for several weeks, I found him exploring. It was a most unusual exploration, and one that I will never forget.

For the first few weeks, the betta explored the way you would expect any reasonably intelligent fish to go about the task. For the first few days he swam around to every nook and cranny of the tank, to make sure he had the lay of the land. Then for a few more days he experimented with staying put in different locations to see how he liked their feel.

Just like people, most fish will soon find a spot or a path they like best, and they'll stay in that spot or on that path for the rest of their lives.

But my betta was different. After his initial explorations he became restless. I'm no Fish Whisperer, but I could tell that he was restless. You would have thought so too. The betta started spending most of his time looking out of the tank, examining my bedroom. And he was clearly looking at specific things in the bedroom, not just "out there" in general. He would periodically swim around looking mildly agitated. He was acting like he wanted out.

I did everything I could to placate him. I experimented with different fish foods. I changed the water weekly and monitored it carefully to keep its temperature and pH within acceptable ranges. I added more lights. I added more plants. I rearranged the plants. In desperation, I even added a little castle.

Every time I tried something new, it would pique his interest for a little while. But in time, and faster each time than before, he would revert to his state of restlessness.

I'd never seen quite this behavior in other fish, so already he was demonstrating what seemed to be above average intelligence.

And then one day I found him engaged in an exploration that was altogether new.

He wasn't exploring the tank. He'd already investigated its topology for weeks. This time, he was exploring the nature of the tank. That's what caught my attention, and not just for that day, but for the rest of my life.

There was a twenty-inch vine in the tank that extended from the lower left back corner to the upper right front corner, along the diagonal of the main volume of the tank. The vine belonged to one of the many plants I'd put in there in the hopes of making it feel more like the Mekong river basin and less like a plexiglass tank in Seattle, Washington.

The betta had his nose on the vine. He was floating just above it, twitching his fins slightly to stay in place, and he was keeping his eyes as close to the vine as possible while keeping it in focus: about half a centimeter to a centimeter. And he was traversing the vine.

With the tiniest of motions, he was propelling himself along the vine towards the lower back right corner, keeping it under close scrutiny at all times. This excursion, from the halfway point to the end of the vine, took him perhaps three minutes. He was taking his time.

When he got to the end of the vine, he remained rooted in place while he inspected the 3-inch-radius spherical volume at the end of the vine, which was truncated in three dimensions by the walls and floor of the tank. He spent about three or four minutes doing this inspection, evidently making sure the vine really did terminate in the corner, and did not escape the tank.

After he had thoroughly scrutinized everything in the betta-sized vicinity of the vine's end, he turned back to the vine, nose pressed close, and began working his way along the vine in the other direction.

At this point I sat down to watch, because if he was doing what I thought he might be doing, then... I didn't know what to think. I wanted to see it for myself.

Over the next seven to ten minutes, he crept along the vine, never losing sight of it nor getting further than a centimeter from it, until he reached the upper-right front corner of the tank. He then proceeded to repeat his inspection of the volume at vine's end, ensuring himself that the vine terminated in the tank rather than protruding beyond the wall.

But what if he had missed something?

Sure enough, he turned and looked down the length of the vine for a time. And then he put his nose back on the vine and began again his long descent to the other end.

He did this for five days.

By the second day my amazement had turned to concern, and by the third day I felt utterly helpless. Here was an intelligent prisoner, my captive, exploring the mechanics of his prison with a thoroughness that only the imprisoned can afford, looking for an escape with deathly tenacity.

But while purchasing my betta had been easy enough, returning him to his real home would be unthinkably difficult, and probably unsuccessful even if I'd tried. Returning him to the fish store seemed like a dead end; he could easily wind up worse off than he was now.

So I concluded that there was nothing I could do. As he inspected the vine, I bit my nails, and timed passed in silence.

After the fifth day he gave up. And then he did something that I still don't understand, even though I've heard about this kind of thing before, and even though I personally saw him do it: he died of unhappiness.

It only took him a few days. He refused his food, he stopped moving, and to all external appearances he had become ill. But I knew better.

The lesson

Whenever I find myself struggling against the tide of massive system complexity, I think of my betta. He had a big heart, a small brain, and a small range of sensory input. I watched him use them all as methodically as any programmer to reason his way through to a soundness proof of the inescapability of his prison.

We like to think of ourselves as being pretty smart. Admit it. We do. But in the grand scheme of things we're intellectually little better off than that fish. We can easily find problems so complex that reasoning about them can take days or weeks of microscopic scrutiny, like my fish swimming along his vine.

And we can just as easily envision problems thousands or millions of times more complex: problems beyond the reasoning abilities of any person, any group of people, or even our entire species.

This has ramifications for the way we think about things today.

I believe I will have more to say about this soon. Right now I need to go mourn my fish, whose soul shone as brightly as that of anyone I've known.

0
Your rating: None

By Jacob Gube

Grunge is a popular trend that gives designs a more organic and realistic look. It also provides a stark contrast to the simplistic, polished and rigid Web 2.0 trend, opting instead for a less uniform and more elaborate form of design.

We’ve discussed grunge style in modern Web design before, as well as tips and tricks to achieve the grunge look. Now, it’s time to put theory into practice by finding ways to infuse grunge themes into your artwork using Photoshop. In this collection, we present to you 40 excellent, high-quality grunge Photoshop tutorials. So fire up Photoshop and get ready to get your hands… dirty!

Beautiful Grunge Photoshop Tutorials

Antique Ace of Spades
This tutorial shows you how to create an old, stained playing card by using Blending modes.

Antique Ace of Spades

Creating an Old-Collage-Effect Poster
Create a textured, old-school collage poster by following this excellent Photoshop tutorial.

Creating an Old-Collage Effect Poster

Quick Grungy Poster
Learn how to create a grungy poster by using smart filters and a few image adjustments.

Quick Grungy Poster

Creating a Stunning Old-World Look in Photoshop
In this Photoshop tutorial, you’ll learn how to create an old-world look using stock vectors imported into Photoshop.

Creating a Stunning Old-World Look in Photoshop

Design a Unique Grungy Website Layout Tutorial
This tutorial will teach you how to design a cool grungy website layout. As well as walking you through the various Photoshop techniques it outlines general design principles and provides pointers for your own grunge designs.

Photoshop Tutorial

Dark Grunge Photo Effect
In this Photoshop tutorial, you’ll see how to “grunge up” a photo using a variety of filters and photo adjustments.

Dark Grunge Photo Effect

Creating Grunge Brushes
In this step-by-step tutorial, you’ll learn how to create your own custom Photoshop brush that you can use to add grunge accents to your images.

Creating Grunge Brushes

Crazy Movie Poster
Recreate the “Pirates of the Caribbean” movie poster using your own images in this tutorial.

Crazy Movie Poster

Creating “Smokey Dancer”
This tutorial involves isolating the subject using the Lasso tool, some image adjustments and texturing effects.

Creating 'Smokey Dancer'

Design a Grungy Floating Island
This tutorial by PSDFAN creates a grungy floating island by using a few Blending modes.

Design a Grungy Floating Island

Distressed Effects in Photoshop
Explore different techniques in Photoshop that give your artwork some wear and tear.

Distressed Effects in Photoshop

Grunge Vector Layout
Combine grunge with another popular design trend (vector illustration) to create this stunning layout.

Grunge Vector Layout

Photoshop Expertise
This tutorial shares a method for giving your artwork some texture and depth.

Photoshop Expertise

Filter-Free Art in Photoshop
Create a beautiful, grungy photo montage using only the Layer palette in Photoshop.

Filter-Free Art in Photoshop

Photo Transfer Edge Effect
Apply a distressed border onto existing images by following this brilliant Photoshop tutorial.

Photo Transfer Edge Effect

Creating an Urban-Style Piece of Artwork
Create this organic and edgy artwork by using some stock photos and some crafty filters.

Creating an Urban-Style Piece of Artwork

Artistic One-Eyed TV Man in a Grunge Vector Design
In this Photoshop tutorial, you’ll learn how to create a grunge-style wallpaper using stock textures and a couple of custom shapes to add some accents to the artwork.

Artistic One Eye TV Man in a Grunge Vector Design

Urban City Scene on Grunge Background
Create an urban city scene set on a grungy, distressed background.

Urban City Scene on Grunge Background

Design an Old-Style Safari Map
This tutorial uses some basic Photoshop techniques to create a textured, old-style safari map.

Design an Old-Style Safari Map

Dramatic Gritty Effect
Add some grit to an image by following this excellent grunge Photoshop tutorial.

Dramatic Gritty Effect

Create an Impressive Mock-up of a Grunge Box
Learn how to build a realistic worn-and-torn crate using the Vantage Point Photoshop filter as well as a few other Photoshop techniques.

Create an Impressive Mock-up of a Grunge Box

Creating Old Paper with Custom Brushes
Learn how to create a custom brush using folded paper to give your artwork distressed accents.

Creating Old Paper with Custom Brushes

Add Stock Textures to Images
Learn how to add a bit of grunge to your artwork by using stock textures.

Add Stock Textures to Images

Burnt Parchment in Photoshop
Give your borders a scorched, uneven look by following this Photoshop tutorial.

Burnt Parchment in Photoshop

Easy Photo Grunge Effect
Give photos a simple grunge effect by adjusting Layer styles and using some filters.

Easy Photo Grunge Effect

Grunge Portrait
This Photoshop tutorial uses some basic Photoshop techniques to create a grungy portrait.

Grunge Portrait

Daguerre Effect
Learn how to achieve the Daguerreotype look using this Photoshop tutorial.

Daguerre Effect

Designing a Typographic Concept Poster
In this Photoshop tutorial, you’ll learn how to create a grungy, aged poster design.

Designing a Typographic Concept Poster

Pencil It In
This tutorial shows you how to create a hand-drawn look that uses scanned images.

Pencil It In

Grunge-style layer tutorial
This tutorial uses Layer styles to achieve a gritty grunge look.

Grunge style layer tutorial

Grunge and Textured Art Tutorial
Use this Photoshop tutorial to add a grunge effect to your photographs.

Grunge & Textured Art Tutorial

Create an Awesome Illustration Using Custom Brushes
In this tutorial, you’ll find out how to use custom brushes to create a textured black and white illustration.

Create an Awesome Illustration Using Custom Brushes

Hero Header Part II
Learn how to create a grunge element using Photoshop filters and a stock image.

Hero Header Part II

Create a Fantastic Decaying Metal Sign
Using a variety of filters (five of them to be exact), you can create a rusting metal sign.

Create a Fantastic Decaying Metal Sign

Create a Cool Music Logo on a Grunge Background
Add a bit of grunge to your brand by using a variety of Photoshop techniques and using a free high-resolution brush set.

Create a Cool Music Logo on a Grunge Background

Design a Cartoon Grunge Website Layout
Mix cartoons with the grunge design trend to create a unique website layout.

Design a Cartoon Grunge Website Layout

The Dark Knight Grunge Wallpaper
This step-by-step Photoshop tutorial walks you through the creation of a Dark Knight-inspired wallpaper.

The Dark Knight Grunge Wallpaper

Building Textures from Scanned Art
This tutorial uses stock photos and a watercolor-washed scanned image to achieve an abstract, paint-splattered design.

Building Textures from Scanned Art

Making a Grungy Business Card
Make your business card stand out by giving it some texture with the help of this Photoshop tutorial.

Making a Grungy Business Card

Ultimate Grunge Design Tutorial
This tutorial walks you through the creation of a grunge website layout that has rough edges and a distressed background texture.

Ultimate Grunge Design Tutorial

How to Create a Grunge Web Design in Photoshop
Witness the steps involved in creating a beautiful grunge-themed website design in this brilliant Photoshop tutorial by PSDTUTS.

How to Create a Grunge Web Design in Photoshop

Want to find more Photoshop tutorials?

This is the fourth part of the “Beautiful Photoshop Tutorials” series by Jacob Gube. If you enjoyed this article, you may also want to consider:

  1. Part 1: 30 Beautiful Photoshop Text Effect Tutorials (on Six Revisions)
  2. Part 2: 30 Beautiful Photoshop Illustration Tutorials (on Six Revisions)
  3. Part 3: 35 Beautiful Vintage and Retro Photoshop Tutorials

About the Author

Jacob Gube is a Web developer/designer and author of Six Revisions, a blog on Web development and design. If you want to connect with the author, you can follow him on Twitter. (al)

0
Your rating: None

This is a collection of links that I have gathered in time and want to share with everyone so you can:
-know what sites are popular and known in the design community,
-tutorials to help you grow your skills,
-inspiration to increase your eye for art,
-portfolios to look up to,
-brush/vector/texture/image sources to increase your design arsenal,
-articles to read that are useful and informative on design and knowing vital techniques / information,
-and round ups for quick references to tutorial sources and inspirations.

This will definitely get the ball rolling if your new to design, or help you increase your resources and knowledge.

Posted by iCORE for Design Yout Trust, 2008. Permalink | 1 comment

Design You Trust sponsors. We're proud all of them:
Dream Template | W3 MARKUP | activeCollab | MOSSO : The Hosting Cloud | Envisionext.net | Behance Network

0
Your rating: None

Hi,

I'm trying to compile a set of CSS classes for using in WYSIWYG editors to let users choose different fonts, but these classes would have to be as cross-browser / cross-platform as possible.

Here's a site with lots of information about this subject:

http://www.codestyle.org/css/font-family/index.shtml

And here's what I have compiled to date:

.font-arial {
  font-family: Arial, Helvetica, sans-serif;
}
.font-lucida {
  font-family: "Lucida Sans Unicode", "Lucida Grande", Lucida, sans-serif;
}
.font-tahoma {
  font-family: Tahoma, sans-serif;
}
.font-trebuchet {
  font-family: Trebuchet, "Trebuchet MS", Arial, Helvetica, sans-serif;
}
.font-verdana {
  font-family: Verdana, sans-serif;
}
.font-georgia {
  font-family: Georgia, Times, serif;
}
.font-times {
  font-family: "Times New Roman", Times, serif;
}
.font-courier {
  font-family: "Courier New", Courier, monospace;
}

Anyone has done something like this before? Suggestions?

Wysiwyg

0
Your rating: None

Diy Whiteboard Mats

Tom sent us this take on the DIY whiteboard project - These instructions show you how to create a 4’ x 8’ whiteboard with minimal effort for about $40-50. It’ll take a little time (a couple of hours - most of which is waiting), but if you are cash strapped, it’s a good alternative. Clearly illustrated PDF instructions available here - DIY Whiteboard for under $50

More:
Diywhiteboardcrop
$28 huge cheap whiteboards

Read more | Permalink | Comments |

Read more articles in DIY Projects |

Digg this!

0
Your rating: None

An interesting top 12 list has been published, on using Javascript to fix 12 common browser headaches:

  1. Setting Equal Heights (jQuery example: $("#col1, #col2").equalizeCols();)
  2. IE6 PNG Alpha Transperancy support
  3. Changing CSS Classes in JavaScript
  4. Browser selectors in CSS ($('html').addClass($.browser);)
  5. min-/max- height & width support
  6. Center Elements Vertically / Horizontally
  7. Display Q tags in Internet Explorer
  8. Increase the size of click targets and get more call-to-action conversions
  9. Lazy loader
  10. bgiframe: Helps ease the pain when having to deal with IE z-index issues.
  11. ieFixButtons: fixes the buggy behavior of the element in Internet Explorer 6 and 7
  12. Fix Overflow

As you will see, most of the solutions are jQuery plugins, but you could roll your own.

0
Your rating: None

Finger Lickin’ Good

Another busy week, and a later than usual Sunday Type. Owing to work commitments that have a habit of intefering with iLT, those articles I promised will be posted, though a little later than scheduled. Several big articles are on their way: the fifth part in the History of Typography series, a personal piece on Why Type Matters, a couple of interviews, and the Combining Type article that outlines how to combine serifed typefaces with sans serif ones. In the meantime, here’s something to inspire you:

First up is some lovely lettering from Russian Maxwell Lord:

Maxwell Lord

Stunning photography from Steve Leadbeater:

A lovely poster for the Raking Leaves exhibition in Berlin:

Work of Andrio Abero:

These wonderful creations from Bath-based Ice House Design:

Typigraphy. Brilliant. Thanks to Richard Spencer Davies for the heads up.

These are very, very clever:

Not sure what to call them, but Kanjiograms sounds good to me. From Connecting the Dots (Japanese).

Extensis’ followup to Brave Font, Max Kerning. You’ll either love it or hate it:

A series of wallpapers (who knows, perhaps one day they will become t-shirts or screen-printed posters), where I show you some of my favourite letterforms:

Why not join the My Favourite Letters Flickr Group and show me yours.

Keetra Dean Dixon:

Via notcot.

I’ve mentioned the work of Oded Ezer several times before. Michael Bierut called him “[the] master of inventive Hebrew lettering”:

from his Typoplastic Surgeries series.

Sunday links

MyFonts Rising Stars
Pricing tables showcase
Frilly bits typographic inspiration—thanks, Alec.
Jean François Porchez’s Type History, part 2
Interview with Lucas De Groot
Hangul, the world’s most perfect script—H&FJ

New fonts

First is Recovery, a single weight display sans, from James Puckett. Released via TypeTrust:

 Recovery from James Puckett

Next is Montague Script by Stephen Rapp, a gorgeous contemporary script:

Free things

Don’t forget to get your copy of the Font Magazine, free from FontShop. Just sign up (it’s free and easy), and you’ll get some great type, sitting proudly on its favourite substrate—good old paper.

Quicksand (seven fonts), from Andrew Paglinawan:

The link to the fonts is in this Typophile thread.

Prizes

Darren Marshall of ampertee has kindly offered one of his t-shirts as a prize.

To be in with a chance of winning one, name the typefaces that these two S’s are taken from:

Send your answers via the contact form. I’ll choose a correct entry at random, and announce the winner next week.

I’m only about a third of the way through my list of things to post this week, but it’s back to work for me. I will try to post more during the week. Have an inspiring, productive, and happy week. And, on a light note, this has to be the ultimate pet name.

click for a random post from iLT


0
Your rating: None

whiteboard-1-2b-468.jpg
whiteboard-3-4-468.jpg
whiteboard-4-5-468.jpg

Clean, crisp, sweet instructions for building a 4' x 8' whiteboard from scratch for under $50. Kicker studios puts together a tidy downloadable PDF, outlining their solution for low-cost fabrication of a small business essential, spawned from the needs of their own studio. If nine people crowding around a sheet of letter size paper isn't cutting for you anymore, give it a look.

(more...)

0
Your rating: None

If you haven’t seen it yet, Andy Zupko just released QuadTree for Papervision3D! He also released a more indepth look at using the new features on his blog. A big huge thanks to the Away3D team for their code and brilliance!  Andy was able to port it over to work with Papervision3D rather well and we’ve added some features that I think everyone will want to take advantage of.

So, what is QuadTree?  Well, in simple terms, its corrective z sorting for a 3D scene.  Say wha?  In other words, when you have 2 triangles who’s size is bigger than the distance between them, you will sometimes see sorting issues depending on the angle the camera is to the triangles.

It makes this:

Look like this:

How do I use it?

Now, this is very easy to use with Papervision3D.  Instead of creating a BasicRenderEngine, you’d now use the new QuadrantRenderEngine object instead:

var renderer:QuadrantRenderEngine = new QuadrantRenderEngine(QuadrantRenderEngine.CORRECT_Z_FILTER);

You’ll notice that there’s one argument about which type of filter to use.  On the sample I’ve created, I used the CORRECT_Z_FILTER which is the faster filter of the 3 options.  It simply takes care of z sorting of triangles.

Two new features added for speed

There’s also 2 other options worth mentioning.  One is the ability to tell QuadTree that any particular DO3D is not to be tested on each render (DisplayObject3D.testQuad:Boolean=true).  The default setting is true, but you can set it to false.  The second option is the maxLevel setting.  This controls the regions of the QuadTree.  Having less does NOT mean better performance.   You have to find a nice balance between the # of tri’s you have and how many regions gives you the best bang for the buck.

You might be asking yourself “why would I only want certain objects to be tested for z sorting fixes?”.  Well, the example I’ve created shows you just a instance that you *would* choose to be very picky about what QuadTree does and doesn’t test on.  This example is using the 3D object I’d made for my Mom’s site.  When you first load the sample, it is *not* including the big white mass in the middle (under the panels) in the QuadTree testing.  To activate it, hit the “s” key on the keyboard, and you’ll notice a decrease in performance.  In this particular type of demo, not testing the biggest object in the scene pays off as the panels above it are still corrected.  That’s a substantial savings.

Also, if you want to see how maxLevel affects performance, use the Q and A buttons to increase and decrease the maxLevel.  As I said earlier, a lower number does not equal better performance.  You just have to find a nice middle ground.  The default value, btw, is 4 and my demo seemed to run better set to 3.

Try it out here

My point, all along, is proven true ;)

Now, this all leads me to a point that I’ve been making since this topic and request for corrective z sorting came up a long time ago.  My point has been:  If you have the 3D model, fix the sorting yourself - its FAR faster performance-wize than QuadTree could ever be.  And my example here proves my point.

In the pictures below, I have the original version of my 3D object, and then a new version with the Panels much closer to the surface of the main structure.  The only difference between the 2 visually, is JUST that:  the panels are simply closer to the main structure.

Original:

The new QuadTree enhanced version:

When you run my sample, just hit “T” to switch between the QuadTree enhanced version and my original model.  You’ll see a huge difference in performance.  Yes, there are still some sorting issues in my model, but I could very easily go in and split the triangles by hand to fix those minor issues.  And I’d still have a very fast presentation.  While I would agree that having the panels closer to the main object looks a bit nicer, it’s not “nice enough” to justify the CPU/performance.

Now don’t go and take this as “John thinks QuadTree is useless” - I don’t think that, but I do think it’s uses are very confined given the speed we all live with in Flash 3D.  It’s awesome to see it working, and I would love to see good samples of it in production for sure, but if speed is what you need, you’ll likely end up fixing your sorting issues by hand in a good editor.  Of course, I haven’t talked about triangles colliding, which is something QuadTree deals with as well.  But for more information on that, head over to Andy’s blog for a full explanation ;)

Conclusion

Corrective Z sorting is a very cool feature to have indeed and, btw, the most requested.  But so was shaders before they came out.  Now ask yourself, “how much do I use shaders these days?”  I’d venture a guess that your answer is hardly ever - if ever.  I think we’ll see more need for QuadTree than shaders, but I don’t think that QuadTree is the miracle pill we’ll all be able to leverage very often to fix our sorting issues.  That will most likely STILL fall on the hands of the 3D modeler 95% of the time I would bet.

      

0
Your rating: None

Steve Souders posted on Runtime Page Optimizer a tool that you can think of as a performance proxy. It sits on the server side, and cleans up content before it is sent back to the browser.

What can it do? Steve let us know:

RPO automatically implements many of the best practices from my book and YSlow, so the guys from Aptimize contacted me and showed me an early version. Here are the performance improvements RPO delivers:

  • minifies, combines and compresses JavaScript files
  • minifies, combines and compresses stylesheets
  • combines images into CSS sprites
  • inlines images inside the stylesheet
  • turns on gzip compression
  • sets far future Expires headers
  • loads scripts asynchronously

RPO reduces the number of HTTP requests as well as reducing the amount of data that is transmitted, resulting in a page that loads faster. In doing this the big question is, how much overhead does this add at runtime? RPO caches the resources it generates (combined scripts, combined stylesheets, sprites). The primary realtime cost is changing the HTML markup. Static pages, after they are massaged, are also cached. Dynamic HTML can be optimized without a significant slowdown, much less than what’s gained by adding these performance benefits.

Steve had another couple of interesting posts recently:

  • Say no to IE6 discusses how we need to do something to help upgrade IE6 users (to IE7 is fine!)
  • Raising the bar talks about results from Steve's UA Profiler tests and how new browsers are pushing forward
0
Your rating: None

Michael Carter et al have been working on js.io, a client library that gives you networking, including Comet like support, via JavaScript.

The low level work can sit upon Comet APIs, and in the future, Web Sockets, and you get high level APIs to protocols such as:

  • amqp
  • imap
  • irc
  • ldap
  • smtp
  • ssh
  • stomp
  • telnet
  • xmpp

There are some demos such as LiveHelp that uses Orbited as the backend.

0
Your rating: None

One of the feature I would really love to see in a future release of the Flash Player is a native rasterizer for display objects. Imagine something like :

myMovieClip.rasterize = true;

This code would rasterize your DisplayObject as an animated PNG. It would bring crazy improvements for designers and coders who want to improve the rendering performance of any animation. This would be in fact the same behavior as the Banana Slice component I talked about.

When talking about this, some people could think "Well, you have cacheAsBitmap for that". The reason why such a feature would rock is mainly due to the fact that cacheAsBitmap is very dangerous. Well, it won't hurt you :), but it can definitely hurt your application performance.

As I said before, when cacheAsBitmap is set, the DisplayObject is cached as a bitmap on memory and the Flash Player is using this copy to render it on screen. The main problem that we have here is that if you do more than moving this DisplayObject on x and y, for each frame the Flash Player is updating the cached copy on memory before updating the screen. So if you apply any rotation, scale, alpha, or even if you have any key frames in your DisplayObject you will get performance decrease.

Hopefully, you can bypass this limitation by creating a BitmapData by yourself, draw the MovieClip on it, and pass it to multipe Bitmap instances. So let's take a simple example, in the folllowing movie, when you click on the "cacheAsBitmap" button, I create multiple instances of an Apple MovieClip, set cacheAsBitmap, and move them on screen :

var apple:Apple;

for (var i:int = 0; i< 100; i++)
{
apple = new Apple();

apple.cacheAsBitmap = true;

addChild ( apple );
}

When you click on the "draw" button, I first create an instance of the apple MovieClip, draw it on a BitmapData and then create Bitmap instances linked to the one and unique BitmapData instance :

var source:AppleSource = new AppleSource();

var buffer:BitmapData = new BitmapData ( source.width, source.height, true );

buffer.draw ( source );

var bitmapApple:BitmapApple;

for (var i:int = 0; i< 100; i++ )
{
bitmapApple = new BitmapApple( buffer );

addChild ( bitmapApple );
}

Online demo :

A Flash animation should have appeared here, but it seems that your browser has an older version of the Flash Player or it is not installed at all. Please, install the last release of the Flash Player now, then reload this page.

As you can see, manual rasterizing is king :)

You can download the sources here

0
Your rating: None

Mark Cooke talks about programming games in Japan, and what it takes to deal with the language differences.

time savedtime saved

0
Your rating: None

I've been wanting to do a little more with UML lately, moving beyond my standard post-it note chicken scratch for class diagrams. I've looked into UML tools before, but coming back to it this time, I think I've decided to stick with StarUML (Windows, free).One of the problems with StarUML, and this is probably the case with most UML tools (especially the free ones), is that there is no ActionScript 3.0 source export - at least not built in. I have found some information about exporting to ActionScript 3.0 from StarUML here:http://www.digitaldogbyte.com/?p=3which is based on what someone posted here (which I can't read):http://www.flashfocus.nl/forum/showthread.php?t=37074However, I was unable to get these export templates to work with my current project. And looking at the templates' source files, it seems that they are just refactored from the PHP export, something I felt was a little hacked (especially given that both Herman [digitaldogbyte] and his colleague were editing them further).Nevertheless, the potential was there so I spent some time this weekend starting a new, dedicated ActionScript 3.0 export script for StarUML. Here are the results (!):StarUML_ActionScript3_Export.zipTo install and use, basically follow the instructions on digitaldogbyte.com. I'll also try to get something a little more comprehensive about the whole process on this site when I get a chance.Note that this is technically still "beta" and if you have any problems, just let me know. I think, for the most part, though, everything should come out as you expect. I can't recall any liberties I took in how UML elements normally relate to each other but I make no promises ;).

0
Your rating: None

Nobody at Webmonkey expected to wake up and experience an internet game change today, but with Google’s semi-accidental launch of the Chrome browser Sunday, that’s exactly what we got. We barely had enough time to clean up the coffee spittle on our monitors.

It started with a very candid and thoughtful comic. It used drawn characters of Chrome designers to eloquently describe the browser’s inner workings. If it wasn’t in comic form, it would read like a computer science lecture, and you’d be asleep in the time it takes to say “garbage collection.” However, in comic form, the technical document gently exposes you us to just what we’re getting into.

So what are we getting into with Chrome? Perhaps web 3.0.

The way it manages tabs, the way it treats errors, its blinding speed — when Firefox 3 was released, it made Firefox 2 seems slow. Chrome does the same thing to Firefox 3. There’s no doubt this is a game changer in the world of web development. Even the surprise announcement lent a hand to making this as big of news as web news can get.

It may sound hyperbolic, but there is some serious machinery going on under the hood. Let’s break it down.

Chrome is essentially four open source projects bundled together: Chrome is the internet operating system, V8 the JavaScript engine, Gears for web developers and Webkit used for rendering HTML.

  1. Chrome — This is the first browser that incorporates the technology used in your desktop. Chrome basically acts like an operating system by treating tabs like applications. Each tab has its own protected memory, permissions and runs as its own process. If one misbehaves, you can pull up the Chrome task manager, see the processor and memory usage of the misbehaving site and close it on the spot.

    A very simple way to stress how revolutionary this is is to consider the fact that if you have a multi-core processor (as many desktop and laptops have these days), two tabs can render HTML and JavaScript independently on each processor, just as if you were running multiple desktop applications.

    This is similar to what Windows NT, and later XP, did with its protected memory in 2001. Protected memory was a popular selling point because it stabilized applications and allowed for better multi-threading. The same benefits apply to the multiple tabs of Chrome.

  2. V8 — Like Pinocchio became a real boy, JavaScript becomes a real programming language. Before, JavaScript was just a lightweight scripting solution that provided some cool effects. However, the way browsers were designed to handle it was for very moderate usage, like menus and simple interactive elements. AJAX web applications pushed the boundaries of what JavaScript was meant for. Google saw the potential in JavaScript, and grew impatient waiting for browsers to be able to handle what it was capable of. V8 puts away any doubt JavaScript can handle what you can give it. It even questions the need for add-ons like Adobe Flash or Microsoft’s Silverlight to enable rich web applications.

    Instead of virtually interpreting JavaScript, V8 compiles the code and managed to build a class/object relationship in the process, just like a grown up programming language. It runs blazingly fast, especially with those AJAX-y web applications you leave running in your browser all day.

    It has even included benchmarks to prove it.

  3. Gears — Because Gears has been around for over a year, there isn’t much to Gears that hasn’t already been said. Gears adapts some of the cooler functions of HTML 5.0 standards and adds an offline element to web surfing. It acts as the web developer friendly section of the Chrome package, enabling web developers to design faster and more powerful web applications. It is only fitting the technology is built into the browser.
  4. Webkit — Webkit is the only non-Google open source project included in the browser package. It stems from an Linux browser named Konqueror and, most recently, used for Apple’s Safari browser. Developers claimed the memory management and speed were among its top sellers. They also claimed the last thing web developers need is another rendering engine.

    They might be right. However, it is a bit of a slap in the face to Mozilla’s Gecko rendering engine. Given the financial and collaborative relationship Google has had with Mozilla in the past, it must be a hard pill to swallow in Firefox-land.

For its heavily asynchronous web applications to run better on a browser, Google acknowledged the browser needed to be redesigned from the ground up. It could’ve asked Mozilla to comply, and most likely it would have been rejected by Mozilla. Instead, it did the heavy lifting itself.

Much of the industry is now scrambling to try and figure out the Microsoftian threat Google poses. On the surface, Google is trying to redefine your window to the internet. When you consider how it deals with memory and how it protects your processes, it is, for all intents and purposes, the first successful combination of browser and operating system.

That said, how much of a threat can Google be if I (or you, or your neighbor) can jump in and write code for it? Releasing it under the BSD license, and even encouraging Internet Explorer and Firefox to steal code directly from the source, proves that Google wants nothing other than the capability to make their online properties more powerful. Google co-founder Larry Page sees Chrome as a way to increase competition and empower innovation in the long run.

“If there was only one choice [of browser], there wouldn’t be a lot of innovation out there,” Page proclaimed at a Chrome presentation Tuesday. “The web is really our connection to you, so it’s really important to us”

Sergey Brin, Google’s other co-founder, agrees: “Our business does well if there is a lot of healthy web usage … Our business does well if [people] are using the web and the internet a lot. Any usage of the internet through Chrome is a business win for us.”

The Chrome release and the way it treats web pages as applications is so innovative, it might have jumped years ahead of iterative advances from current browser offerings. It changes the game.

To the competition’s advantage, users may be slow to flock to Chrome. However, once they take it for a test drive, the speed of AJAX applications alone will set the bar high. It puts some heavy pressure on the browser competition to catch-up overnight.

Apparently, Mozilla developers were given an early peak at Chrome prior to the launch. How did it go? I’m sure the thoughts of threats swimmed in the minds of Firefox developers who have been working very hard on advancing browser technology for the last five years. Luckily, when you put any group of engineers together, the one common bond is on the coolness of technology. It wouldn’t be a surprise if the Firefox drawing board looks a little different today.

In fact, it wouldn’t be a surprise if it didn’t start incorporating the groundbreaking work done on the Chrome and V8 source — something Chrome developers want badly. They’re eager for this technology to hit the street, and they don’t care too much how it gets there.

What Internet Explorer will do with this information is anyone’s guess. Their closed source browser sports some definite “me too” functions and is advancing in speed, but Microsoft has real potential to incorporate the Chrome multi-processing technology in its Windows operating system. More likely, Microsoft will take the ideas and develop its own counter attack, however slowly it may take.

There is one fact with literally no doubt — the web has become a whole lot faster, more powerful and mind-numbingly fast overnight.

0
Your rating: None

Because Flash is a proprietary plug-in technology and its coding language evolved gradually over about a decade, it took a while before the words Open Source meant anything to its developer pool. But when it hit, it hit hard: Aral Balkan’s seminal site OSFlash introduced an already-thriving community to a whole new world of licensing code for the purpose of free and easy sharing, modification and reuse. Open Source took off in the Flash world and some of the most powerful software ever produced for the Flash Player is available for free, such as the incredible Red5 media server and the mighty PaperVision3D.

Friends of Ed is now giving you the chance to catch up on this little revolution with their new book, The Essential Guide to Open Source Flash Development, and I’m proud to say that I’m one of the contributing authors! My chapter covers several Open Source animation tools that I’ve released for ActionScript 2.0 and 3.0.

0
Your rating: None

By Tony White

Some of you may remember the days when 30KB was the recommended maximum size of a web page, a value which included HTML, CSS, JavaScript, Flash, and images. I find with every new project with even the slightest bit of complexity, it’s not long before that 30 KB ideal is well out of my reach. With the popularity of CSS layouts and JavaScript-enriched web page experiences, it’s not uncommon, particularly for large sites, for the CSS files alone to jump well beyond that 30KB ceiling.

But there are some principles to consider during and after you write your CSS to help keep it tight and optimized. Optimization isn’t just minimizing file size — it’s also about being organized, clutter-free, and efficient. You’ll find that the more knowledge you have about optimal CSS practices, smaller file size will inevitably come as an direct result of their implementation. You may already be familiar with some of the principles mentioned below, but they are worth a review. Being familiar with this concepts will help you write optimized CSS code and make you a better all-around web designer.

1. Use Shorthand

If you’re not already writing in shorthand, you’re late to the party. But fortunately, this party never ends. Using shorthand properties is the single easiest practice you can do to cut down your code (and coding time). There’s no better time than the present to start this efficient coding practice, or to review it.

Margin, border, padding, background, font, list-style, and even outline are all properties that allow shorthand (and that’s not even an extensive list!).

CSS Shorthand means that instead of using different declarations for related properties…


p { margin-top: 10px;
	margin-right: 20px;
	margin-bottom:  30px;
	margin-left: 40px; }

… you may use shorthand properties to combine those values like so:

	p { margin: 10px 20px 30px 40px; }

By specifying a different number of values, browsers would interpret the rules in a specified manner, illustrated in the diagram below.

Illustration of how shorthand declarations are interpreted depending on how many values are specified for a property
Illustration of how shorthand declarations are interpreted depending on how many values are specified for a property. This order also applies to padding and border-width among other properties.

Font is another helpful shorthand property that helps save some room and keystrokes.

Illustration of font shorthand examples
Examples of the font shorthand property. Note: leaving some values unspecified will mean that those properties will reset to thier initial values.

Those are just two examples of shorthand, but by no means should be considered a comprehensive guide. Even if you are familiar with the rules above, be sure to look at the articles mentioned below for more helpful reminders of those powerful properties that help keep your code succinct. Because of the number of lines and characters saved, going from a previous version of a CSS file which used no shorthand properties to one that makes full use of shorthand can have dramatic effect on file size.

See CSS Shorthand Guide (dustindiaz.com) and Efficient CSS with shorthand properties (456bereastreet.com) for more information about shorthand properties.

2. Axe the Hacks

Jon Hick's blog hicksdesign.co.uk/journal makes use of conditional comments
Jon Hick’s blog hicksdesign.co.uk/journal makes use of conditional comments

Hacks against dead browsers are safe, but hacks against the living aren’t. None of them. Ever.

Keep CSS Simple - Peter-Paul Koch (digitial-web.com)

If you’re like me, those words from Peter-Paul Koch’s nearly 5-year-old article may make you feel a little embarrased. After all, who hasn’t served hacks to Internet Explorer 6 and even Internet Explorer 7? As bad as we may want IE6 to lay six pixels under, the truth is it’s far from dead.

But now we know that using conditional comments to serve hacks correctional declarations for IE6 and IE7 is an accepted practice, even recommended by the Microsoft IE development team. Using conditional comments to serve IE-specific CSS rules has the added benefit of serving a cleaner, and therefore smaller, default CSS file to more standards-compliant browsers, while only those browsers that need the hackery daiquri (i.e. IE) will download the additional page weight.

Here’s how to use conditional comments to serve styles only to Internet Explorer 6:


	<!--[if IE 6]>
		<link rel="stylesheet" type="text/css" href="ie6.css">
	<![endif]-->

For IE7, you can use the above and substitute “6″ for “7″.

Alternatively, if there is hack-less way of getting the desired result using CSS, with all other things being equal, go for it! The less hacks you have to write, the simpler and lighter the code.

3. Use whitespace wisely

Whitespace, including spaces, tabs, and extra line breaks, is important for readability for CSS code. However, whitespace does add, however miniscule it may be, to page weight. Every space, line-break, and tab you can eliminate is like having one less character.

But this is one area where I would not encourage you to skimp just to get a smaller file. It’s still important that you write in a way that is readable to you (and hopefully to others), and if that includes using whitespace for formatting, so be it. After all, if you can’t read it, you’re going to have a hard time applying the other principles mentioned in this article. Just be aware of the fact that whitespace is like air - you might not be able to see it, but it does weigh something.

The figure below shows two different extremes in formatting style, with much whitespace, and the other with very little. I happen to favor the single-line formatting option without tabs, as I can scan the selectors a little easier, and I develop using the full width of my wide-screen monitor. But that’s just me. You may like your selectors to appear nested, and your declarations on each line.

Illustration of two extremes in CSS formatting, one with lots of whitespace, one with little whitespace
Illustration of two extremes in CSS formatting: lots of whitespace vs. very little whitespace

Using whitespace effectively is great, and a recommended practice for easy-to-manage code, but be aware that the less whitespace you have, the smaller the file. Even if you choose work with whitespace with your working file, you can choose to remove it for the production version of your CSS file, so your files stay skinny where it really counts.

4. Prune frameworks and resets

Nathan Smith's 960 Grid System uses a reset
Nathan Smith’s 960 Grid System CSS framework uses a reset rule.

If you’ve chosen to use a CSS framework (including ones you’ve written yourself), take the time to review the documentation as well as every line of the CSS file. You may find that the framework includes some rules that you don’t care to use for your current project, and they can be weeded out. Also, you may find that the framework includes a more elegant and concise way of achieving a presentational detail than what you normally use, and knowing about them can help prevent you duplicating rule sets unintentionally.

This goes for resets as well. YUI Grid CSS uses a reset, and Eric Meyer’s Reset is also very popular. Resets are great to use because they help to neutralize a browser’s default style. But if you know the nature of the site you are building, you may find some declarations that you know you’ll never need. <pre> and <code> will likely go unused on my Aunt Martha’s recipe blog. A design portfolio probably won’t ever use <sub>, <dfn>, <var>, etc. So ditch what you don’t need. It’s not only ok, it’s encouraged, even by Eric Meyer:

As I say on the reset page, those styles aren’t supposed to be left alone by anyone. They’re a starting point.

Crafting Ourselves - Eric Meyer (meyerweb.com)

Using a framework and/or a reset set of rules can help keep your work optimized, but they should not be accepted in their default state. Considering each declaration and cutting back on unneccessary ones can further help you keep your CSS files lean and readable.

5. Future-proof your CSS

Doug Bowman's stopdesign.com CSS reveals specially crafted selectors used for layout
Doug Bowman’s stopdesign.com CSS reveals specially crafted selectors used for layout.

Another way to optimize your code is to separate layout-specific declarations from the rest of your rules. I’ve heard options of separating typography and colors from layout-specific rules in the CSS file. I’ve never been fond of this practice, as I don’t care to repeat selectors just because I have different types of declarations to associate with them.

However, I’m warming up to the idea of separating layout styles from the rest of the styles, and giving layout it’s own file, or at least it’s own section. This is also advocated in Andy Clarke’s Transcending CSS. Within the book, Clarke reminds us of the following:

Full CSS layouts have always been a compromise. The current CSS specifications were never designed to create the visually rich and complex interface layouts that modern Web demands. The current methods — floats and positioning — were never intended as layout tools.

Transcending CSS - Andy Clarke.

One way of interpreting this is that floats and positions to establish sidebars and columns are, well, layout hacks. And though we really don’t have an alternative, we hopefully will once a layout standard is agreed upon and browsers start supporting them. When that happens, it should be easy to swap out those hacked up box-model properties for ones intended for layout. Though it will be a while before new layout modules are here, using the right properties to handle layout instead of compensating for the quirks of our current limited set of properties will most certainly help condense page weight.

6. Document your work

David Shea's markup guide at mezzoblue.com
David Shea’s markup guide illustrates the proper usage for HTML tags and how those are represented on his site, mezzoblue.com. Even sites without dynamic HTML can have this simple and effective guide (using its own CSS file, of course!) as a starting point of documentation.

For a team of designers, it is extremely important to communicate regularly so that markup and style rules are created in a consistent way, and also to create site standards. For example, if someone comes up with way to markup a tab interface for the site, documentation will keep others from duplicating that effort, preventing code bloat in the HTML and CSS.

Documentation, including markup guides and style sheet guides, is not just for group efforts — they are just as important for a one-man design team. After all, a year after working on other things, revisiting one of your own projects can feel quite foreign. Your future self might appreciate reminder of how your CSS grid framework is supposed to work, or what pages already have a treatment for a secondary action form button, and it will save you or someone else from appending redundant and unnecessary rules to your CSS.

The choice to use documentation has a bonus side effect of being a great place to park explanations that otherwise must be included as CSS comments. CSS comments are great for sectioning off chunks of long CSS files, but verbose comments that are used to explain design choices can add to file size, and might be better suited to a markup and style guide. Documenting your code using CSS comments within your working file is most definitely better than nothing at all, but housing that material in separate documentation is a great way to keep the code focus and free from bloat.

7. Make use of compression

Some great applications have been created to compress and optimize CSS for you, allowing you to serve a human-unreadable but still browser-friendly files that are a fraction of the origional working copies. Applications like CSSTidy and the YUI Compressor can compress whitespace, detect and correct for CSS properties that are overwrite each other, and look for opportunites to use CSS shorthand that you may have missed. (These types of applications are excellent sources to read about, if for no other reason, to learn what things you can further do by hand).

Even popular text editors like BBEdit, TextMate, and TopStyle, can help format your CSS files to your liking. There are also options serve zip versions of your CSS files using PHP. You can find more CSS compressors and optimizers in the post List of CSS Tools.

It is important to note that these applications do their best to minimize errors, but they aren’t always perfect. Also, they work best when browser hacks are not included in the file set (which is yet another reason to keep those hacks external).

There is one last type of application that can help prune CSS file size I’d like to mention. It can crawl a web site and log which CSS rules and declarations are not being applied, then bring these to your attention. Unfortunately, this tool hasn’t been inventend yet, but I would gladly pay for such a application.

I can recall times when I’ve been afraid to delete certain rules because there is no documentation that explains to me that those selectors are leftover from previous iterations of development. If an app can bring those rules to my attention, that will help with maintenance and keeping CSS files lean.

Conclusion

Clean and optimized code is important not just for file size, but for maintenance and readability as well. The principles mentioned above are good considerations not just for CSS, but can be applied to HTML, JavaScript, and other programming languages. CSS files are not as prominent as the rendering of your web site to an end-user, but consideration of the above principles can help with both the user experience (in the form of smaller file sizes) and the developer experience (cleaner code). Apply these principles to your current and future projects, and and you will surely appreciate the efforts.

About the author

Tony White runs the one-man show Ask the CSS Guy, an after-hours blog devoted to peaking under the hood of CSS and JavaScript web-design techniques, as well as troubleshooting CSS-related problems. He resides in Memphis, Tennessee.

0
Your rating: None

By R. Christie

Tables have got to be one of the most difficult objects to style in the Web, thanks to the cryptic markup, the amount of detail we have to take care of, and lack of browser compatibility. A lot of time could be wasted on a single table although it’s just a simple one. This is where this article comes in handy. It will show you ten most easily implemented CSS table designs so you can style your tables in a zap!

Top 10 CSS Table Designs

First things first

We start with a valid xhtml 1.0 strict markup. Here is an example of a valid table markup:

<!-- Table markup-->

<table id="...">

	<!-- Table header -->

		<thead>
			<tr>
				<th scope="col" id="...">...</th>
				...
			</tr>
		</thead>

	<!-- Table footer -->

		<tfoot>
	        <tr>
	              <td>...</td>
	        </tr>
		</tfoot>

	<!-- Table body -->

		<tbody>
			<tr>
				<td>...</td>
				...
			</tr>
			...
		</tbody>

</table>

You can read more about xhtml table markup in HTML Dog’s Table Section. I have tested the tables below in Mozilla Firefox 3, IE 6 and 7, Opera 9.x and Safari. Also note that I apply a light blue color scheme to all of these tables to give the article a consistent look. You can modify the color scheme to match your site — the source package is provided in the end of the article.

Before we start, let’s review the general rule of thumb for styling of tables:

  1. Tables love space. Set the width of tables carefully, according to the content. If you don’t know the perfect width, simply set the width of the table to 100%. Tables look nicer when they have “overwidth”, and when it comes to tables too much width is definitely better than too little width.
  2. Cells need some padding. Sure, each table cell relates to each other. But it doesn’t mean that we have to pull them too close, right? Define some space between the cells, crammed up table cells are so much harder to read.
  3. Treat tables the way you treat content. Tables are read similarly to the way we read text — except it’s harder and it takes more time to read a table. So be careful with the amount of contrast you are giving to your table. Use soft colors — it’s easier for the eyes. Don’t treat your table like it’s a graphical decoration. Make sure that the style you apply to it makes the content more readable, not the other way around.

Now that we are all set up let’s get going, shall we?

1. Horizontal Minimalist

Horizontal tables are tables that are read rather horizontally than vertically. Each entity is represented by a row. You can style these types of tables with minimalist style. Simply set enough padding to the cells (td and th) and put a 2 pixel border underneath the header.

Employee
Salary
Bonus
Supervisor

Stephen C. Cox
$300
$50
Bob

Josephin Tan
$150
-
Annie

Joyce Ming
$200
$35
Andy

James A. Pentel
$175
$25
Annie

Because horizontal tables are supposed to be scanned horizontally, clearing the border of the table increases the efficiency of the table. The lack of border, however, makes this table design hard to read if it has too many rows. To counter it we simply add 1 pixel border underneath all td elements:

Employee
Salary
Bonus
Supervisor

Stephen C. Cox
$300
$50
Bob

Josephin Tan
$150
-
Annie

Joyce Ming
$200
$35
Andy

James A. Pentel
$175
$25
Annie

The tr:hover rules are very useful to aid people reading a minimally designed tables. When the mouse cursor hovers over a cell, the rest of the cells in the same row highlights immediately, making it easier to track things if your tables have multiple columns.

Important!
Carefully finetune the typography and the padding between the cells
Pros
Very easy to style, good for simple tables
Cons
tr:hover rules don’t work in IE 6, table can be confusing if it has too many columns
Play with
Color scheme, typography, tr:hover effects

2. Vertical Minimalist

Although rarely used, vertically oriented tables are useful for categorizing or comparing descriptions of objects, with each entity represented by a column. We can style it in minimalistic style by adding whitespace separators between columns.

Comedy
Adventure
Action
Children

Scary Movie
Indiana Jones
The Punisher
Wall-E

Epic Movie
Star Wars
Bad Boys
Madagascar

Spartan
LOTR
Die Hard
Finding Nemo

Dr. Dolittle
The Mummy
300
A Bug’s Life

Add large border-left and border-right with the same color as background. You can use transparent borders if you want, but IE 6 screws it all up. Since this table is supposed to be read from top to bottom (vertically), adding tr:hover does not help and instead makes it harder to read the data. There is perhaps a Javascript-based solution which enables you to highlight the whole column when a mouseover event occurs, but that’s beyond the scope of this article.

Important!
Carefully finetune the typography and the padding between the cells, do not add tr:hover effect
Pros
Easy to style, good for simple tables
Cons
Can not be used if background is not a solid block of color, suitable only for some tables
Play With
Color scheme and typography

3. Box

The most dependable of all styles, the box style works for all kinds of tables. Pick a good color scheme and then distribute background-color to all the cells. Don’t forget to accentuate the differences of each cell by defining border as a separator. An example of a box style table is the following table:

Employee
Salary
Bonus
Supervisor

Stephen C. Cox
$300
$50
Bob

Josephin Tan
$150
-
Annie

Joyce Ming
$200
$35
Andy

James A. Pentel
$175
$25
Annie

Comedy
Adventure
Action
Children

Scary Movie
Indiana Jones
The Punisher
Wall-E

Epic Movie
Star Wars
Bad Boys
Madagascar

Spartan
LOTR
Die Hard
Finding Nemo

Dr. Dolittle
The Mummy
300
A Bug’s Life

This style is nowadays probably the most used style. The tricky part is actually trying to find the color scheme that matches with your site. If your site is heavy on graphics, it will be pretty hard to use this style.

Important!
Choose a color scheme that matches with your site
Pros
Easy to style, flexible for large or small tables
Cons
Choosing the perfect color scheme could be tricky
Play with
Colors and borders, use dashed or dotted to achieve cute effects, typography, icons

4. Horizontal Zebra

Zebra-tables are pretty attractive and usable. The alternating background color can serve as a visual cue for people when scanning the table. To style a table as zebra, simply put a class="odd" to every odd ordered tr tag and define a style for it (e.g. using if ($count % 2) then even class else odd class in PHP).

	...

		<tr class="odd">
		   <td>...</td>
		   ...
		</tr>

		<tr>
		   <td>...</td>
		   ...
		</tr>

	...

Employee
Salary
Bonus
Supervisor

Stephen C. Cox
$300
$50
Bob

Josephin Tan
$150
-
Annie

Joyce Ming
$200
$35
Andy

James A. Pentel
$175
$25
Annie

Important!
Do not put too much contrast on the zebra colors, you can blind your users
Pros
The zebra pattern can help people to scan the table
Cons
Adding class="odd" manually can be very tedious for large tables, many content management systems do not provide even/odd features on a table loop, hence picking the color scheme may be tricky
Play With
Contrasting color, borders, typography, icons

5. Vertical Zebra Style

Vertical zebra is easier to style than the horizontal one, as we can make use of colgroup and col elements to distribute column classes. However, the markup becomes a little bit heavier:


<table>

		<!-- Colgroup -->
	   <colgroup>
	      <col class="vzebra-odd">
	      <col class="vzebra-even">
	      <col class="vzebra-odd">
	      <col class="vzebra-even">
	   </colgroup>

		<!-- Table header -->
	   <thead>
	      <tr>
	         <th scope="col" id="vzebra-comedy">Employee</th>
	         ...
	      </tr>
	   </thead>

	   ...
</table>

The colgroup element actually applies a style or class to the table, columnwise. Instead of tediously applying class for the first td or th element, we can use a more convenient colgroup-tag. For more information about colgroup visit this page.

Comedy
Adventure
Action
Children

Scary Movie
Indiana Jones
The Punisher
Wall-E

Epic Movie
Star Wars
Bad Boys
Madagascar

Spartan
LOTR
Die Hard
Finding Nemo

Dr. Dolittle
The Mummy
300
A Bug’s Life

Although perhaps more suitable for vertically-oriented table, this zebra-style can also be used for any other kind of tables.

Important!
Do not put too much contrast on the zebra colors, you can blind your viewer
Pros
Suitable for all types of tables
Cons
Choosing the color scheme could be tricky, need to add colgroup elements
Play With
Contrasting color, borders, colgroup and col, icons and typography

6. One Column Emphasis

In some tables, some particular column may have a higher weight than the other columns. If that’s the case, you can use colgroup and col to make that particular column stand out. In the example below, the first column serves as the starting point to read, so it is emphasized, just like we emphasize the first letter of the paragraph as drop caps:

Company
Q1
Q2
Q3
Q4

Microsoft
20.3
30.5
23.5
40.3

Google
50.2
40.63
45.23
39.3

Apple
25.4
30.2
33.3
36.7

IBM
20.4
15.6
22.3
29.3

You can also use one-column-emphasis-technique to highlight something important, say the column containing totals of an accounting table, or in a comparison table — for computer specification perhaps, the winning entity (column).

Important!
Be careful, don’t overdo the emphasis or the column will jump out, distracting the effort to read the rest of the columns.
Pros
Very effective when used in certain kind of tables
Cons
The necessary tr:hover effect does not work in IE, suitable for certain types of tables only
Play with
Color scheme, typography, icons and tr:hover effects

7. Newspaper

To achieve the so-called newspaper effect, apply border to table element and play with the cells inside. A quick, minimalistic newspaper style can look like this:

Company
Q1
Q2
Q3
Q4

Microsoft
20.3
30.5
23.5
40.3

Google
50.2
40.63
45.23
39.3

Apple
25.4
30.2
33.3
36.7

IBM
20.4
15.6
22.3
29.3

Simply play with color scheme, borders, padding, backgrounds, and tr:hover effects of the cells (td and th). Other alternatives are presented below:

Company
Q1
Q2
Q3
Q4

The above data were fictional and made up, please do not sue me

Microsoft
20.3
30.5
23.5
40.3

Google
50.2
40.63
45.23
39.3

Apple
25.4
30.2
33.3
36.7

IBM
20.4
15.6
22.3
29.3

Favorite
Great
Nice
Bad

Passion of the Christ
Bourne Ultimatum
Shoot ‘Em Up
Ali

The Big Fish
The Mummy
Apocalypto
Monster

Shawshank Redemption
Cold Mountain
Indiana Jones
Dead or Alive

Greatest Story Ever Told
I Am Legend
Star Wars
Saw 3

Important!
Be careful with border-collapse, do not lose the signature border around the table!
Pros
Gives a royal, authorative aura to a table
Cons
Unsuitable for large tables (it loses it’s charm on large tables)
Play With
Typography, color scheme, background, border, padding, and tr:hover effects

8. Rounded Corner

Rounded corners are slick and modern, and it’s easy to apply it to a table, although you need to fire up Photoshop for this. Create images for all four corners of your table. Theoretically, we can make use of the nesting tr and td-elements to place the left and right corners of the table without adding additional markup. Unfortunately, IE 6 goes berserk and the table appears ugly, so the most stable way to do this is to put ID or class to all four corner cells of the table. Please consider the example below:

Company
Q1
Q2
Q3
Q4

The above data were fictional and made up, please do not sue me
 

Microsoft
20.3
30.5
23.5
40.3

Google
50.2
40.63
45.23
39.3

Apple
25.4
30.2
33.3
36.7

IBM
20.4
15.6
22.3
29.3

Pros
Great if you want untraditional table, probably the only viable option you have if your website uses rounded corners heavily
Cons
Takes longer to style, requires images
Play With
Color scheme, corner variations, typography, tr:hover effects, icons

9. Table Background

If you are looking for a quick and unique way to style your table, simply pick an attractive image or photo related to the subject of your table and set it to be the background-image of the table. You can add 50% grey png-image as background-image of the cells to improve readability, and that means that you need a CSS-hack to make it work in IE 6:


* html table tbody td
{

		  /* IE CSS Filter Hack goes here*/

}

The table would look like this:

Employee
Division
Suggestions

IE 6 users won’t see the transparent background if the hack is not applied

Stephen C. Cox
Marketing
Make discount offers

Josephin Tan
Advertising
Give bonuses

Joyce Ming
Marketing
New designs

James A. Pentel
Marketing
Better Packaging

Important!
Make sure the image is relevant to the table’s contents
Pros
Very easy to style, delivers unique look, if used correctly the image can serve as a symbol that gives outstanding impression on the viewer
Cons
Needs hack to get the background work in IE 6, needs images
Play With
Background images, transparent PNGs, typography, colors, icons

10. Cell Background

You can apply background-image to the cells and achieve a consistent look. Say you have at least half an hour to spare and you want something that’s not too bland. Start your Photoshop and make 1 pixel width gradients, and set them as background-image of all cells. You’ll end up with a gradient style table:

Employee
Division
Suggestions
Rating

Give background color to the table cells to achieve seamless transition

Stephen C. Cox
Marketing
Make discount offers
3/10

Josephin Tan
Advertising
Give bonuses
5/10

Joyce Ming
Marketing
New designs
8/10

James A. Pentel
Marketing
Better Packaging
8/10

Similarly, pick a pattern and set it as background-image and you’ll end up with a pattern-styled-table:

Employee
Salary
Bonus
Supervisor

Stephen C. Cox
$300
$50
Bob

Josephin Tan
$150
-
Annie

Joyce Ming
$200
$35
Andy

James A. Pentel
$175
$25
Annie

Nation
Capital
Language
Unique

Japan
Tokyo
Japanese
Karate

South Korea
Seoul
Korean
Ginseng

China
Beijing
Mandarin
Kung-Fu

Indonesia
Jakarta
Indonesian
Batik

Important!
Make sure the text stands out against the background
Pros
Easy to style, not too bland
Cons
Uses images, patterns and gradients might distract reading
Play With
Color scheme, patterns, typography, borders, backgrounds, gradients, icons

Final Words

I know I barely scratched the surface with this article, so grab the source and play around. Feel free to post your favourite table designs, especially if it’s something I missed out. Over to you.

About the author

R.Christie is studying information systems at college. He viciously juggles activities from college, web design, programming, church, to sport activities. You can say hello to him via e-mail.

Editor’s note

This post is one of the finalists of our guest author contest. Over three weeks selected top-10-lists and discussion articles will be published. To rate the articles we’ll analyze their popularity, users activity, quality of backlinks, traffic and further data.

How good is the post “Top 10 Express CSS Table Designs”?
( polls)

0
Your rating: None

One of the items we're struggling with now on Stack Overflow is how to maintain near-instantaneous performance levels in a relational database as the amount of data increases. More specifically, how to scale our tagging system. Traditional database design principles tell you that well-designed databases are always normalized, but I'm not so sure.

Dare Obasanjo had an excellent post When Not to Normalize your SQL Database wherein he helpfully provides a sample database schema for a generic social networking site. Here's what it would look like if we designed it in the accepted normalized fashion:

social network database example, normalized

Normalization certainly delivers in terms of limiting duplication. Every entity is represented once, and only once -- so there's almost no risk of inconsistencies in the data. But this design also requires a whopping six joins to retrieve a single user's information.

select * from Users u
inner join UserPhoneNumbers upn
on u.user_id = upn.user_id
inner join UserScreenNames usn
on u.user_id = usn.user_id
inner join UserAffiliations ua
on u.user_id = ua.user_id
inner join Affiliations a
on a.affiliation_id = ua.affiliation_id
inner join UserWorkHistory uwh
on u.user_id = uwh.user_id
inner join Affiliations wa
on uwh.affiliation_id = wa.affiliation_id

(Update: this isn't intended as a real query; it's only here to visually illustrate the fact that you need six joins -- or six individual queries, if that's your cup of tea -- to get all the information back about the user.)

Those six joins aren't doing anything to help your system's performance, either. Full-blown normalization isn't merely difficult to understand and hard to work with -- it can also be quite slow.

As Dare points out, the obvious solution is to denormalize -- to collapse a lot of the data into a single Users table.

Social database example, denormalized

This works -- queries are now blindingly simple (select * from users), and probably blindingly fast, as well. But you'll have a bunch of gaping blank holes in your data, along with a slew of awkwardly named field arrays. And all those pesky data integrity problems the database used to enforce for you? Those are all your job now. Congratulations on your demotion!

Both solutions have their pros and cons. So let me put the question to you: which is better -- a normalized database, or a denormalized database?

Trick question! The answer is that it doesn't matter! Until you have millions and millions of rows of data, that is. Everything is fast for small n. Even a modest PC by today's standards -- let's say a dual-core box with 4 gigabytes of memory -- will give you near-identical performance in either case for anything but the very largest of databases. Assuming your team can write reasonably well-tuned queries, of course.

There's no shortage of fascinating database war stories from companies that made it big. I do worry that these war stories carry an implied tone of "I lost 200 pounds and so could you!"; please assume the tiny-asterisk disclaimer results may not be typical is in full effect while reading them. Here's a series that Tim O'Reilly compiled:

There's also the High Scalability blog, which has its own set of database war stories:

First, a reality check. It's partially an act of hubris to imagine your app as the next Flickr, YouTube, or Twitter. As Ted Dziuba so aptly said, scalability is not your problem, getting people to give a shit is. So when it comes to database design, do measure performance, but try to err heavily on the side of sane, simple design. Pick whatever database schema you feel is easiest to understand and work with on a daily basis. It doesn't have to be all or nothing as I've pictured above; you can partially denormalize where it makes sense to do so, and stay fully normalized in other areas where it doesn't.

Despite copious evidence that normalization rarely scales, I find that many software engineers will zealously hold on to total database normalization on principle alone, long after it has ceased to make sense.

When growing Cofax at Knight Ridder, we hit a nasty bump in the road after adding our 17th newspaper to the system. Performance wasn't what it used to be and there were times when services were unresponsive.

A project was started to resolve the issue, to look for 'the smoking gun'. The thought being that the database, being as well designed as it was, could not be of issue, even with our classic symptom being rapidly growing numbers of db connections right before a crash. So we concentrated on optimizing the application stack.

I disagreed and waged a number of arguments that it was our database that needed attention. We first needed to tune queries and indexes, and be willing to, if required, pre-calculate data upon writes and avoid joins by developing a set of denormalized tables. It was a hard pill for me to swallow since I was the original database designer. Turned out it was harder for everyone else! Consultants were called in. They declared the db design to be just right - that the problem must have been the application.

After two months of the team pushing numerous releases thought to resolve the issue, to no avail, we came back to my original arguments.

Pat Helland notes that people normalize because their professors told them to. I'm a bit more pragmatic; I think you should normalize when the data tells you to:

  1. Normalization makes sense to your team.
  2. Normalization provides better performance. (You're automatically measuring all the queries that flow through your software, right?)
  3. Normalization prevents an onerous amount of duplication or avoids risk of synchronization problems that your problem domain or users are particularly sensitive to.
  4. Normalization allows you to write simpler queries and code.

Never, never should you normalize a database out of some vague sense of duty to the ghosts of Boyce-Codd. Normalization is not magical fairy dust you sprinkle over your database to cure all ills; it often creates as many problems as it solves. Fear not the specter of denormalization. Duplicated data and synchronization problems are often overstated and relatively easy to work around with cron jobs. Disks and memory are cheap and getting cheaper every nanosecond. Measure performance on your system and decide for yourself what works, free of predispositions and bias.

As the old adage goes, normalize until it hurts, denormalize until it works.

[advertisement] Peer code review without meetings, paperwork, or stopwatches? No wonder Code Collaborator won the Jolt Award.

0
Your rating: None

Last week we have presented first findings of our web forms survey. The main objective of the survey was to provide designers and developers with some intuition of how effective web forms are designed; we also presented some guidelines of how an effective and user-friendly web form can be achieved.

We have focused on sign-up forms as we wanted to consider further crucial forms (e.g. checkout forms) separately. Afterwards we’ve gone through each and every one sign-up form of the selected sites and analyzed the design approaches implemented in these forms. Below we present the second part of our findings — the results of our survey among web-forms of 100 popular web-sites where web-forms (should) matter.

Please notice that this post is not about checkout forms — that’s a topic for another discussion, we may consider them separately in one of the upcoming posts. We would like to thank Wufoo for providing us with a framework to conduct our survey.

3. Functionality of the forms

In the first part of our research we have considered the placement of the sign-up links and sign-up forms as well as on the visual appearance of forms. However, no matter how nice a design looks like, if the form doesn’t work properly, the completion rates will remain low. Let us now consider the functionality of the sign-up forms as well as typical problems, patterns and solutions used when it comes to the design of these forms.

3.1. Hover, active, focus - effects in use?

Apparently, to improve form completion rates designers try to avoid all kind of distractions and offer a clear, unambiguous and simple web form. This is essentially the reason why any visual effects are used very moderately — if used at all.

Screenshot

  • 84% of the web forms which we’ve reviewed didn’t have any kind of hover, active or focus-effects,
  • 16% used very subtle hover-effects.

3.2. Help, support, tooltips: static or dynamic?

Sometimes the label of the input fields isn’t concrete enough; however, users need to have a sufficient understanding of the information they need to provide. Which characters are allowed in the username? How many characters should a password have? Does a provided e-mail automatically become login to use the service?

Hints and tooltips provide assistance helping users to minimize the number of times an input should be reconsidered. Besides, there is nothing more annoying that some input field which doesn’t accept user’s input although it seems to be perfectly correct. To avoid it, designers make use of (usually) unobtrusive and clear hints.

Screenshot

57% of the reviewed web forms provided “static” help — tips which are supposed to explain what is expected from the user’s input; these tips are obviously placed next to the input field. 10% of the tooltips appear on demand - usually after some help-icon is clicked or when the user is typing the information in the input field.

3.3. Help, support, tooltips: where are they placed?

When providing users with assistance it is necessary to make sure not that the help is simply provided, but that it can be easily found and understood by users. It is crucial to make sure that users don’t make mistakes associating a hint to an input field. To achieve it you need to know where users expect hints to appear. So where are hints and help usually placed within the form?

Screenshot

If hints and help appear, they appear…

  • below the field (57%)
  • on the right side of the field (26%)
  • above the field (13%)
  • on the left side of the field (4%)

We have observed a strong trend toward hints placed directly below the input field. Usually such hints have a slightly different color, in most cases lighter than the main content.

3.4. Input validation: static or Ajax?

Although Ajax seems to have literally flooded web sites with a rich user interaction over the last years, it still hasn’t managed to reach a critical mass among popular web-services. Surprisingly, we weren’t able to identify a trend toward Ajax. The “classic” validation techniques which validate input after the user has clicked on the submit-button are more popular than real-time-validation with JavaScript.

According to our research,

  • 30% of the forms displayed only an error-message at the top of the form (no input fields were highlighted),
  • 29% had highlighted input fields with corresponding messages next to the input field (no error-messages were provided at the top of the page),
  • 25% used both error-messages and input fields,
  • 22% used real-time validation with Ajax,
  • 14% used JavaScript-error warnings,
  • 1% used a system-message with a “go back”-link.

3.5. Design of error messages

As you can see, we have identified six different types of error validation. It is remarkable that 14% of the forms still use Javascript-error-windows to communicate problems (e.g. YouSendIt, Mail.ru, Newsvine, Clipmarks, Yandex, see screenshot below) while only 22% had at least partial Ajax-validation (usually for checking available user names). It is also remarkable that not a single site had no validation whatsoever.

Screenshot
Newsvine uses JavaScript-error warnings to communicate problems.

Usually designers tend to report mistakes using a) error messages appearing after the submit-button is clicked and / or b) highlighting “incorrect” input fields visually. In the first case errors are usually bulleted and presented as a list at the top of the page, before the form. In the second case usually the color of the border of the “wrong” input field is highlighted together with the label of the field (in most cases with a red text color and red background color).

Sometimes designers combine both techniques and use error message as well as the input field highlighting. For instance, consider the sign-up form on Ning (see image below) which combines both techniques.

Screenshot

Usually, red is used to indicate mistakes; however it is not necessarily the case. Tickspot, Mixx.com and Furl use yellow to communicate problems occurred during the form completion.

However, if any color is used at all to communicate a successful registration, then it is green. It was the case in 97% of web-sites where success was highlighted visually.

Screenshot

3.6. Is it necessary to confirm the e-mail?

Only in 18% of the cases it was necessary to confirm the e-mail (e.g. Odeo, Ning). To be honest, we don’t really see any rationale in asking users to re-type the e-mail — after all, users can see what they input because the e-mail field is not starred out (updated). Do you?

Screenshot

3.7. Is it necessary to confirm the password?

It sounds reasonable to ask the user to confirm the input as the user doesn’t see the information typed in (he/she sees asterisks instead). However, many sited decide to remove one input field to minimize the time required to complete the form.

Screenshot

In 72% of the cases it was necessary to confirm the password. However, many large sites such as Facebook, Friendster, LinkedIn, Stumbleupon, Pownce and Twitter don’t require password confirmation.

3.8. Is captcha in use?

While users would definitely be glad if captchas were gone, they are necessary in practice, because web-sites need to make it impossible for spambots to create numerous accounts as otherwise they would need to filter spam accounts in the database.

According to our research,

  • 52% of the sites don’t use captcha,
  • in 39% of the cases it was impossible to reload the captcha without reloading the whole form. This is really dramatic from the usability point of view.

However, we couldn’t identify a trend toward sign-up forms with or without captchas. In any case, if you use a captcha, please make sure that it is either always easily readable or users can reload the image in case it is not readable. Some sites haven’t offered the possibility to reload the captcha, but Digg, AOL, Slashdot, Google and Last.fm have made it possible to the users to listen to it in case it is hard to recognize.

3.9. Cancel-button in use?

When we were coming up with the design problems to consider when designing web forms, we have expected sign-up forms to not have a cancel-button, as it doesn’t really make much sense for the users to abort the form completion after all fields have been typed in. Yet we were partly wrong.

The cancel-button was used only in 8% of the cases. In some of these cases the “cancel”-button came right after the “terms and conditions”-section (e.g. Zoho Writer). Consequently, if users do not want to agree to the service conditions, they could abort the process. On the other side, some services offer a payment plan before the registration (e.g. Crazyegg). In case users have selected the wrong payment plan they can get back with the cancel-button and select another plan they prefer.

Screenshot

Apart from that: we just don’t understand why Dzone has a cancel-button placed on the left in its sign-up form.

If the cancel-button is used, it is placed on the right side of the submit-button (4%). Among the sites reviewed in the post cancel and submit-buttons didn’t have a strong visual difference and were placed next to each other. From the usability point of view it makes more sense to use a clear visual distinction between primary action buttons and secondary action buttons and introduce a significant amount of space to clearly separate them.

3.10. Alignment of the submit-button

Depending on the form layout it may make sense to align the submit-button on the left, on the right side or place it in the middle of the layout. Designers seem to have a strong preference toward left-aligned submit-buttons (56%), followed by centered buttons (26%).

Screenshot

Right-aligned submit-button is still popular (17%), however it is often used when designers want to indicate the next step of the registration. In such cases submit-buttons are often titled “Continue” or “Next”. Reason: in usual desktop-applications “Next”-button is also often right-aligned.

3.11. Thank-you message

While few years ago most services offered a simple, basic thank-you message after a successful registration (usually with a link to the login-page), now most sites try to motivate users to explore the service immediately.

  • 45% of the forms asked just registered users to proceed with submitting further information, finding friends in the networks, suggesting the site to friends or filling out his or her profile.
  • 33% of the forms presented “places to go” and functions to explore in an engaging, user-friendly-tone,
  • 4% offered a basic “thank you”-message,
  • 2% had a redirect to the homepage.

Further findings

  • tab index was used correctly in 99% of the cases (the only exception was Habrahabr)
  • 24% of forms used conversational talk, trying to address users needs by speaking with them through labels. Informal phrases such as “What’s your name?”, “Your e-mail, please?” or “I’d like to…” are common in this context.
  • 38% of sites prefer to remain formal and use business talk, asking users the required information user-friendly (e.g. “Your name”, “Confirm password” etc.),
  • 38% of sites use system talk; here visitors are asked for their “Login”, “User password”, “Location” etc.

Bottom line

Let’s conclude with a brief overview of the findings presented above. Please keep in mind that we have considered only sign-up forms.

  • sign-up forms don’t have any hover, active or focus-effects (84%),
  • hints and help are either static (57%) or dynamic (33%) and appear below the input field (57%) or on the right side of the field (26%),
  • static validation is as popular as dynamic validation — no trend toward Ajax;
  • e-mail confirmation is not used (82%),
  • password confirmation is used (72%),
  • captcha can be used or not used (48% vs. 52%),
  • cancel button is not used (92%),
  • the submit-button is left-aligned (56%) or centered (26%),
  • thank-you message motivates users to proceed with exploring the services of the site (45%).

0
Your rating: None

Michal Zalewski, of Google, has released ratproxy, a tool to test your Web application against attacks such as XSS and XSRF:

Ratproxy is a semi-automated, largely passive web application security audit tool. It is meant to complement active crawlers and manual proxies more commonly used for this task, and is optimized specifically for an accurate and sensitive detection, and automatic annotation, of potential problems and security-relevant design patterns based on the observation of existing, user-initiated traffic in complex web 2.0 environments. The approach taken with ratproxy offers several important advantages over more traditional methods:

What about other solutions?

There are numerous alternative proxy tools meant to aid security auditors - most notably WebScarab, Paros, Burp, ProxMon, and Pantera. Stick with whatever suits your needs, as long as you get the data you need in the format you like.

That said, ratproxy is there for a reason. It is designed specifically to deliver concise reports that focus on prioritized issues of clear relevance to contemporary web 2.0 applications, and to do so in a hands-off, repeatable manner. It should not overwhelm you with raw HTTP traffic dumps, and it goes far beyond simply providing a framework to tamper with the application by hand.

Ratproxy implements a number of fairly advanced and unique checks based on our experience with these applications, as well as all the related browser quirks and content handling oddities. It features a sophisticated content-sniffing functionality capable of distinguishing between stylesheets and Javascript code snippets, supports SSL man-in-the-middle, on the fly Flash ActionScript? decompilation, and even offers an option to confirm high-likelihood flaw candidates with very lightweight, a built-in active testing module.

Last but not least, if you are undecided, the proxy may be easily chained with third-party security testing proxies of your choice.

0
Your rating: None

Question: Can you give me more information on how to set up MySQL cluster?

Answer: Sure, below are the links to extremely informative Internet resources providing detailed guides on why and how to deploy MySQL cluster.

By the way a cluster in IT field is a group of linked computers, working together so they form a single computing system. The components of a cluster are usually connected to each other via fast local area networks. Clusters are usually deployed to improve performance and/or availability over that provided by a single computer, while typically being much more cost-effective than single computers of comparable speed or availability.

1. http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster.html

MySQL Cluster is a high-availability, high-redundancy version of MySQL adapted for the distributed computing environment. It uses the NDBCLUSTER storage engine to enable running several MySQL servers in a cluster. This storage engine is available in MySQL 5.0 binary releases and in RPMs compatible with most modern Linux distributions.

2. Mysql Cluster: The definitive HOWTO

3. How To Set Up A Load-Balanced MySQL Cluster

This tutorial shows how to configure a MySQL 5 cluster with three nodes: two storage nodes and one management node. This cluster is load-balanced by a high-availability load balancer that in fact has two nodes that use the Ultra Monkey package which provides heartbeat (for checking if the other node is still alive) and ldirectord (to split up the requests to the nodes of the MySQL cluster).

4. MySQL Cluster Server Setup

MySQL Cluser Server is a fault-tolerant, redundant, scalable database architecture built on the open-source MySQL application, and capable of delivering 99.999% reliability. In this paper we describe the process we used to setup, configure, and test a three-node mySQL cluster server in a test environment.

Related Posts

0
Your rating: None

AS3Exporterのテスト(要:FlashPlayer9)

Blenderから頂点・頂点インデックス・UV座標値を、各種AS3用3Dエンジン(Away3D、PV3D、Sandy)に対応した.asファイルとして吐き出すスクリプトが公開されてたのを最近見つけたんで使ってみた。スクリプト本体のダウンロードや、導入方法、基本的な使い方は、下記配布元で懇切丁寧に解説されてる。
http://rozengain.com/?postid=54

Away3D2.0以降で使う場合は、パッケージ構造の変更に対応するために下記のような修正が必要だった。

AS3Export.py - 187〜199行目

	as_output_string = 		"package "+as_package_name.val+" {\n"
	as_output_string +=		"\timport away3d.core.*;\n"
	as_output_string +=		"\timport away3d.core.mesh.*;\n"
	as_output_string +=		"\timport away3d.core.material.*;\n"
	as_output_string +=		"\timport away3d.core.utils.*;\n\n"

	as_output_string +=		"\tpublic class "+as_class_name.val+" extends Mesh {\n"
	as_output_string +=		"\t\tprivate var ve:Array;\n"
	as_output_string +=		"\t\tprivate var fa:Array;\n\n"
	as_output_string +=		"\t\tpublic function "+as_class_name.val+"(init:Object = null) {\n"
	as_output_string +=		"\t\t\tsuper( init );\n"
	as_output_string +=		"\t\t\tinit = Init.parse(init);\n"
	as_output_string +=		"\t\t\tve = [];\n”

を、下記のように変更した。

	as_output_string = 		"package "+as_package_name.val+" {\n"
	as_output_string +=		"\timport away3d.core.*;\n"
	as_output_string +=		"\timport away3d.core.base.*;\n\n"

	as_output_string +=		"\tpublic class "+as_class_name.val+" extends Mesh {\n"
	as_output_string +=		"\t\tprivate var ve:Array;\n"
	as_output_string +=		"\t\tprivate var fa:Array;\n\n"
	as_output_string +=		"\t\tpublic function "+as_class_name.val+"(init:Object = null) {\n"
	as_output_string +=		"\t\t\tsuper( init );\n"
	as_output_string +=		"\t\t\tve = [];\n”

それ以外は今のとこ問題なく、最新の2.46でもちゃんと動作した。
忘れがちなので要注意だったのが、Colladaエクスポーターと違って△ポリに自動変換してくれないので、エクスポート前に△ポリに変換しておくべし。

書き出された .as は、普通にMeshを継承したクラスになってるので、プリミティブオブジェクトと同じように扱えばオッケ。
当然ながらアニメーションには対応してないけど、これ結構便利かも。頂点とUV定義だけで充分な場合Collada使う意味無いし、そういうケースのほうが多いし。あと、モデルデータがファイルとして存在しない分コンテンツ保護にも繋がりそう。

0
Your rating: None

Finally I found a bit of time this weekend to do some other tests with expressions evaluation.

The results are pretty interesting, even if obvious from some point of view. I took the ExpressionEvaluator I wrote as example for the first post about this topic, and then I edited a bit the code adding just in time AS Bytecode compilation. Thanks to that, expressions evaluation is much more fast and always safe because it runs in its own ApplicationDomain.

You can download the sources here, that includes the edited code and a test file. The test file runs 1 milion of iterations and may hang your browser or at worst case your system. Reduce the value of the ITERATIONS constant if you are not sure about the power of you machine.

If you want to read a bit more details about that, click on the link below to continue reading.

I did some simple modification to the existing classes:

  • Added a compile method to the IExpression interface;
  • Added the symbolNames getter to the SymbolTable class, to retrieve a list of all the symbols defined inside the symbol table.
  • Converted hxasm to Actionscript (finxing some small issues to avoid to include all the Haxe support classes);
  • Implemented the compile method on all the AST nodes using HxASM;
  • Added an SWFCompile class that takes an IExpression and a SymbolTable and produces an SWF;
  • Edited the CompiledExpression class adding a compile method that generates an SWF starting from an IExpression.

Adding just in time compilation was easy a really quick thanks to HxASM. HxASM is an Haxe library written by Haxe's author (Nicolas Cannasse) that makes you able to write low level bytecode instructions in ActionScript an generate a ByteArray that contains an (hopefully) valid SWF. The SWF can then be loaded by Loader.loadBytes and executed.
It have been easy to port HxASM to ActionScript too, thanks again to the Haxe compiler which is able to generate AS3 code starting from Haxe code.

Compilation was achieved easilly because the expressions we are compiling are really simple. The compiler generates a class called CompiledExpression that has a method execute that can be called to execute the expression. All the values inside the symbol table are exposed as public properties.

Just to make you understand better, givin this expression:

sin( x * 10 + y - 11 )

SWFCompiler will generate the bytecode for this class:


class CompiledExpression
{
  public var sin: *;
  public var x: *;
  public var y: *;
  
  public function execute(): Number
  {
    return sin( x * 10 + y - 11 );
  }
}

As you can see the type of the class variables is generic, but you can improve the generator to understand if a variable should contain a number or a function.

The generated SWF can be loaded and run easilly:


var loader: Loader = new Loader();
var parser: Parser = new Parser(
  new Scanner( "sin( x / ( 4 / 2 * 2 - 2 + 2 * x / x ) ) * 100" ) );

var compiled: CompiledExpression = parser.parse();
var data: ByteArray = compiled.compile();

loader.contentLoaderInfo.addEventListener( Event.COMPLETE,
  function( event: Event ): void
  {
    var info: LoaderInfo = ( event.target as LoaderInfo );
    var klass: Class = (
      info.applicationDomain.getDefinition( "CompiledExpression" ) as Class );

    var cp: Object = new klass();

    cp.x = 10;
    cp.sin = Math.sin;

    trace( "Result", cp.execute() );

  } );

loader.loadBytes( data, new LoaderContext( false,
  new ApplicationDomain( ApplicationDomain.currentDomain ) ) );

I build a simple test (shipped with the sources) that runs 1 milion times an expression using 3 methods: Evaluation, Compiled and Native.

Results (on my Mac Pro 8 Core, 4GB ram) are obvious:

eval 1000000 iterations: 12939
compiled 1000000 iterations: 848
native 1000000 iterations: 371

As you can see native execution is faster, but compiled version runs really well (you might want to optimize the generated code to make it run faster) and it is many times faster then AST evaluation.

If you want to run a complex expression many times and dont want to stress your Flash Plugin, you can use the compiled version.

Gotta run, see u next time!

0
Your rating: None

Contents


Introduction

Can pop-ups be beautiful? When people think of pop-up windows, users and developers alike may cringe a little. Making a link open a new window is one of the most simple things you can do with javascript & HTML, yet there are so many ways to get it wrong. I think though, when you get it right, it really is what I would call beautiful code.


What you'll need

Basic HTML/XHTML, Basic JavaScript


Steps


The Really Bad Version

Here is what I believe is the worst way of putting a pop-up together. We've all seen this:

<a href="javascript:window.open(url);">Some link</a>

The above is probably the most effective way of destroying the accessibility and usefulness of a link. When you use javascript: in a link, it's no different than assigning the pop-up function to an onclick event of any random old element. In other words, it's not a link at all. More importantly, a user can only follow that link if they have javascript enabled. For those of you who think that my concern with scriptless people is outdated in this modern year of 2008, try browsing with IE6 or IE7 with security settings set on high...


The Mildly Bad Version

So enough people understood that the Really Bad version of doing this wasn't a responsible way of creating popups, so they started using the handy target attribute. You can't control the size of the new window or the focus of the new window, and you can't pass values to it via javascript; but it will open a new window, dammit!

<a href="aRealPage.html" target="_new">Some link</a>

So you have a real href, so the users can actually follow the link. The target attribute handles the pop-up, so we're good, right? Actually target does not exist in the XHTML spec (oops). You've just written some invalid code if you're using an XHTML doctype, and the fact remains that you can't control a thing about how the browser handles target. So what have we learned here?


O relY? - Using the rel attribute

There's a good reason I haven't shown the good old inline onclick trick: There's no point in putting your event handling in the HTML when it be handled in the javascript.
With that said, let me introduce you to the rel attribute if you haven't already met it. rel is a way of describing the relationship between the current page and the href destination of the anchor. For example, rel="pop-up" (for more info, check the spec). I'm sure you see where this is going now...

<a href="aRealPage.html" rel="pop-up">Some link</a>

Looking good - all valid attributes. Now let's make it work:

// messy unabstracted version
var popUp = function() {

	//get all anchors
	var link = document.getElementsByTagName('a');

	//loop through anchors, check for REL attribute
	for(s=0; s < link.length; s++) {
		var linkBehavior = link[s].rel;

		//assign onclick behavior to links with REL="pop-up"
		if(linkBehavior == 'pop-up') {
			var features = 'height=600,width=800,scrollTo,resizable=1,scrollbars=1,location=0';
			link[s].onclick = function() {

				//the pop-up!
				//the 'this' keyword here refers to the anchor element
				newwindow=window.open(this.href, 'myPopUp', features);

				//auto focus new window
				if (window.focus) {newwindow.focus()}

				//stop parent window from following the link
				return false;
			}
		}
	}
}
window.onload = popUp; //loads up the event handling, but doesn't do anything until 'onclick'

(There are a number of ways to abstract and clean up the above javascript function, but that's another article.)

What was accomplished by doing this?

  • The user can follow the link regardless of javascript support
  • We used perfectly valid XHTML, the rel attribute
  • We added an extra layer of meaning by using an attribute that describes link relationship
  • The event is now handled by a function where we have complete control over how the pop-up behaves


Suggested readings

This article first appeared on [http:/www.500null.com 500null] on 6/08/08.
Questions/Comments/Requests?- email me at info@500null.com

]]>

0
Your rating: None

As today's web applications continue to evolve and get more complex, it has become a lot more commonplace to keep a data model present inside of your javascript. You would then write various widgets, modules, or whatever that would get their data from the model, rather than querying some other web service independently (and if you aren't doing this, you should!). While centralizing all your data into a nice, organized model that different parts of your code can access, it's often a challenge to integrate an efficient way to notify the code that depends on these models when the stored data is updated. Lucky for us, Ryan Johnson has created a surprisingly small library that will allow our data model to notify anything that depends on it that it has updated (or loaded, or whatever you'd like in fact).

Before we dig in to the notifications, let's do a little work to set up an example and some assumptions we'll be operating under for the sake of this article. First, as prototype is my weapon of choice, that's what we'll be using. We'll also be using prototype as Object.Event uses it as well! Now, let's pretend that we have a website that has some social networking aspect of some kind. We want to display a short list of who's currently online (say the 6 most recently active people) in some sort of side bar, and perhaps a count of the total members online in a footer element. Rather than having both these elements poll the server at some interval to update their information, let's create a little data model that these areas can use instead.

Contents


Step 1 - Create a Data Model

For the sake of brevity, this will be stubbed out in a lot of places, but we'll create enough functionality to get the concepts across.

var WhosOnlineSummary = Class.create(
{
    initialize: function initialize()
    {
        this.totalOnlineUsers   = 0;
        this.whosOnline         = new Hash();
        this.loading            = true;
        
        // do our initial fetch
        this.fetchUsers();
        
        // set this up to poll for new data every thirty seconds...
        this.dataPoller = new PeriodicalExecuter(function(pe)
        {
            this.fetchUsers();
        }.bind(this), 30);
    },
    
    fetchUsers: function fetchUsers()
    {
        // this would probably do some other stuff too
        
        new Ajax.Request('/your/data/service', 
        {
            onComplete: function(response)
            {
                this.update(response.responseText);
            }.bind(this)
        })
    },
    
    update: function update(data)
    {
        // and you'd have some sort of logic
        // here to update the data... here's a stub..
        
        
        // I'm assuming the data returned is a JSON object here...
        
        if('totalOnlineUsers' in data)
        {
            this.totalOnlineUsers = data.totalOnlineUsers;
        }
        
        // and update our "who's online" stuff...
        if('onlineUsers' in data)
        {
            // simple way to refresh, just kill the current list :)
            this.whosOnline = new Hash();
            
            // pretend online users is an array of json objects here...
            // [ { id: userId, name: username, etc.}, {...}, ... ]
            data.onlineUsers.each(function(user)
            {
                this.whosOnline.set(user.id, user);
            }.bind(this));
        }
        
        if(this.loading)
        {
            this.loading = false;
        }
    }
});

// get this globally namespaced... we'll just declare it here for
// the sake of keeping things easy... you probably shouldn't do 
// this in real life ;)
var whosOnline = '';

Event.observe(window, 'load', function() {
    whosOnline = new WhosOnlineSummary();
});

OK, as you can see, we've got a very simple data model that updates itself every thirty seconds, and that our other "widgets" can easily tap into for their information. I'm not going to write these widgets out to any great extent, but I will create a small stub for the total online users functionality to help us out here.


Step 2 - Create Some Widgets

Now that we have a model, let's start leveraging it to do something meaningful. As I just mentioned, this is only a stub, but it should give you a nice idea of where we're going...

var TotalOnlineUsers = Class.create(
{
    initialize: function(element)
    {
        this.domElement = element;
        
        // any other useful variables could go here...
        
        this.parseOnlineUsers();
    },
    
    parseOnlineUsers: function parseOnlineUsers()
    {
        // nice and simple ;)
        this.domElement.update('Currently ' + whosOnline.totalOnlineUsers + ' users online');
    }
});

And now we're essentially ready to do some fun stuff. As you can see, all this looks nice, but our TotalOnlineUsers widget has no way of knowing when it needs to update the display, as there's no way to know when the data model has changed. Enter Object.Event...


Step 3 - Make Your Data Model Smart

So, we need to get our data model publishing events that our widgets can listen for. This is actually pretty darn simple since all the heavy lifting has been done for us. Let's go ahead and leverage the power of Object.Event (I'll provide download links at the end of this article). The first thing we need to do is provide the data model with the "event" functionality. This is a simple one-liner that we can put right after our class declaration. It looks like this:

...
 if(this.loading)
        {
            this.loading = false;
        }
    }
});

Object.Event.extend(WhosOnlineSummary);

That's it! Now, all that remains for us to do is to create events inside this object that can be observed (we'll cover the actual observing shortly). This is done through simple additions of "notify" functions. Since we've extended our data model class, this is also a cinch. I'll modify the update function to include two "events":

...
    update: function update(data)
    {
        // and you'd have some sort of logic
        // here to update the data... here's a stub..
        
        
        // I'm assuming the data returned is a JSON object here...
        
        if('totalOnlineUsers' in data)
        {
            this.totalOnlineUsers = data.totalOnlineUsers;
        }
        
        // and update our "who's online" stuff...
        if('onlineUsers' in data)
        {
            // simple way to refresh, just kill the current list :)
            this.whosOnline = new Hash();
            
            // pretend online users is an array of json objects here...
            // [ { id: userId, name: username, etc.}, {...}, ... ]
            data.onlineUsers.each(function(user)
            {
                this.whosOnline.set(user.id, user);
            }.bind(this));
        }
        
        if(this.loading)
        {
            this.loading = false;
            this.notify('whosOnlineLoaded');
        }
        
        this.notify('whosOnlineUpdate');
    }
...

As you can see, we can create any custom events that we want, and we can name them whatever we want. Pretty cool stuff, huh? So, there's only one thing that remains, and that's making our widget listen for these events.


Step 4 - Make our Widgets Listen for Events

You'll notice I created two events in our data model, but we're only going to use one for this example. Let's get right to it, as there's no real need for explanation here...

var TotalOnlineUsers = Class.create(
{
    initialize: function(element)
    {
        this.domElement = element;
        
        // any other useful variables could go here...
        
        // watch for updates from the data model
        whoseOnline.observe('whosOnlineUpdate', function()
        {
            this.parseOnlineUsers()
        }.bind(this));
        
        this.parseOnlineUsers();
    },
    
    parseOnlineUsers: function parseOnlineUsers()
    {
        // nice and simple ;)
        this.domElement.update('Currently ' + whosOnline.totalOnlineUsers + ' users online');
    }
});

Done. It's really that easy!


Wrapping Up

Hopefully, you can see the huge benefit of approaching your apps this way, and integrating Object.Event. If you'll remember, our so-called page also has a who's online list. You could create a widget that also observes the "whosOnlineUpdate" event, so it will update whenever the model changes as well. We've effectively made the load on the server smaller, since we've only got one thing calling our data service, instead of 2 (in this case, but I'm sure there are many practical applications that would have many more somewhat redundant calls). We also know that our presentation will be in sync across all the different elements on this page, which leads to a much slicker user experience. The best part of all this? We've made very, very small tweaks to our code, and they were very unobtrusive as well. Enjoy, and thank Ryan for his bad-ass javascript kung-fu if you've got a moment!

As promised, here are your links to all the required libraries:

This article was originally posted at my blog: Make Your JavaScript Data Model Smarter - With Object.Event

]]>

0
Your rating: None

This article is a guest post written by Dirk Jesse, the developer of YAML (Yet Another Multicolumn Layout), an (X)HTML&CSS framework which explains his motivation for YAML in the last paragraph of the article. This article is supposed to initiate the discussion about the need for more flexible layouts in modern web design and explain why flexible designs are still important — even despite the Full Page Zoom-functionality implemented in most modern browsers.

The new generation of web browsers — Firefox 3, Opera 9.5 and Internet Explorer 7 — provides a feature which seems to save a lot of work for web-developers in the future, namely the Full Page Zoom. Instead of allowing users to increase and decrease the font size on a given web-site, browsers now enable users to literally scale the rendered layout including visuals and background images. The whole design layout is scaled proportionally according to some adjusted zoom-factor, with all the elements of a page’s layout expanding equally. Consequently, every fixed, pixel-based layout becomes “scalable”; the content area always remains within the layout box it is supposed to be in and there is no chance of producing overlapping boxes as we’ve seen in the previous generations of web-browsers.

However, is the new zoom-technique indeed so advanced that we don’t need flexible layouts any longer? Just as this question is extensively discussed in the blogosphere, it is extensively answered with “yes”. And there is a good reason behind it. The coding of a fixed layout is much easier and, when used properly, produces exactly the results a designer is willing to achieve. With fixed layouts, designers can ensure the exact positioning of each pixel (a dream of many graphics designers comes true!) and the user can adjust the size of the layout with a scaling zoom on demand. No wonder that it’s tempting to motivate the switch to fixed layouts. However, as professionals, we need to consider how reasonable it is from the professional point of view.

In the following let’s discuss why we strongly believe that this paradigm won’t lead web design to more user-friendly and accessible web-sites, why flexible layouts still remain important today and why they will become even more important in the future.

Where Full Page Zoom doesn’t help at all

The main difference between fixed (px-based) and flexible (%-based) layouts is the simple fact that flexible layouts can better adapt to user’s viewing preferences. With flexible solutions, the width of the layout depends on the viewport of the browser and can perfectly fill the viewing space without any manual adjustments from the user’s side. Fixed layouts can’t do that. Full page zoom, when applied to fixed layouts, enables users to manually adjust the design after it has already been rendered.

Another important aspect which is worth keeping in mind: Internet Explorer 6, probably the nightmare of every web-developer out there, has a market share of almost 40% — and it doesn’t support zoom at all.


According to w3schools.com, the larger and wider screen resolutions (larger than 1024×768px) will become a standard in the future.

More problematic is the overwhelming confidence of developers that the individual decision-making is better for users from the accessibility point of view. When applied to fixed layouts the web-developer delivers a clear message:

Dear users, your browser can zoom my fixed layout - so please help yourself if you want or need to!

From designer’s perspective with this argument it is tempting to switch to a more comfortable (fixed) design solution at expense of accessibility. Why should a user adapt his viewing preferences to a web-site? Shouldn’t a web-site rather adapt itself to the viewing preferences of its users? If you think about it for a second, you have the same situation as in a cloth store where you are offered cloth only in some very specific size. If the size doesn’t fit to you, it’s your problem, not store’s owner. And if you want to you can take a needle, some fabric and create the cloth of its own choice for free. That is not user-friendly.

Even more crucial is the simple fact that full page zoom isn’t really feasible in practice. Let’s assume that the designers has a fixed layouts with the width of 960px. To zoom it using a 150% scale factor and still browse the page without horizontal scroll bar, users need to have at least the screen resolution of 1440px and a browser opened in the full-screen-mode. Is it really a path for the Web to take in the years to come? As Nancib states, “problem is that sometimes the font on a page is friggin’ tiny without zooming it in, but zooming the page (with the images) doesn’t just make it more readable.”

Web developers often tend to argue that flexible layouts are too complex and with full page zoom every fixed layout is becoming scalable anyway. That’s right, scalable, but not flexible. Why should a browser correct the mistakes a developer or designer has done when creating a site layout?

Flexible layouts are hard to control? That’s not true!

Whenever designers argue against flexible layouts they tend to use the following argument:

In flexible layouts the text flows in the width when expanding the browser window, making the content hard to read. This text flow is hard to control.

Wide text flow is definitely not a nice thing to offer your visitors. However, text flow doesn’t need to flow in the width when the browser window is expanded. To achieve attractive flexible designs one can use the properties min-width and max-width. Of course, Internet Explorer 6 doesn’t support both of them — just as it implements both hasLayout-model and the Float-model incorrectly. However, this is not the reason to not use floats for your design layouts, right?

To simulate max-width and min-width you can use various workarounds (JS Expressions); and to simulate min-width you can even use a pure CSS-solution. But what happens if the user’s browser doesn’t support JavaScript? Well, in this case a flexible Layout without max-width doesn’t necessarily destroy the layout, although the text flow may be too wide. But this is what the Progressive Enhancement is all about, so this is not that problematic.

How to find an ideal width for a flexible layout?

Let’s consider how wide the layout should be for an optimal flexible layout:

  • Layout width: use width:auto or any %-value to make sure that the layout makes use of the available width of the browser windows automatically.
  • Minimal width: use some px-value (e.g. 760px). This lower bound should be used for all pixel-based layouts, so the content remains readable when displayed in the minimal screen resolution.
  • Maximal width: use an em-value (e.g. 90em). Thus the text flow doesn’t grow in width in an uncontrollable fashion, but remains constant for various screen resolutions. Side effect: the maximal width is scaled according to the font-size of the browser.

Also keep in mind that we, designers, don’t really have the design layout (whether fixed or flexible) under control as the presentation of our layouts depends on the browser, font size adjustments, operating system, alternative user-stylesheets etc.

The Holy Photoshop Mockup

The most frequent argument used to motivate the fixed layout solution is the fact that customers are confident that a perfect Photoshop mockup would look best when displayed 1:1 in user’s browser. Indeed, it is hard to explain to the customers that flexible solution, although looking differently in different context, has some advantages. After all, if the design doesn’t look as expected on senior project manager’s wide screen laptop, then this is not something the customer would agree on.

However, following customer’s decisions blindly you neglect your professional responsibility to develop accessible, user-friendly web-sites. It’s your duty to complement your customer’s wishes, compromise and seek for the best possible solution for users and not for the senior manager. A quick argument that a user-friendly solution which doesn’t look best at some specific configuration would bring more satisfied customers and consequently more money in a long run usually suffices.


Vivabit.com: transparency, patterns and background images can lead to impressive and flexible results.

The end-result layout isn’t supposed to be used as a nice screenshot for one single portfolio. It has to serve users’ needs and enable them to get to the content of the site as quickly and as painlessly as possible. Take your time and go through some of the layouts presented in numerous CSS-showcases. In way too many cases the attractive pixel-based design breaks down completely when the browser window is resized or the content is scaled. A Photoshop Mockup isn’t necessarily easy to convert into a flexible design layout, however it is definitely worth consideration. Transparency, patterns and background images can lead to impressive and flexible results.

In most cases we design web-sites not to present some design, but to let the design help users to achieve some objectives such as finding the information they are looking for. Graphics-heavy flexible layouts are not easy to achieve and require planning, patience and confidence that the results are worth it. However, these efforts improve user experience and make the design medium-independent.

Mobile Browsers – Why flexible is better

Mobile Web layouts as well as its small and big problems are a topic which is worth a single discussion. Just one year ago my old mobile phone could access the Internet, however it was extremely hard to browse web-pages, read them and navigate. With the improved user interface of iPhone it has completely changed. Mobile web-browsers (e.g. Opera Mini or Safari on the iPhone) have dramatically improved over the last two years — at the moment it is almost natural that they render web-pages without any considerable display errors.

My iPhone has no problem displaying flexible layouts in the landscape format or portrait format; in fact it automatically adjusts them to the best format which fills the whole iPhone window. At the same time I often experience problems when loading fixed layouts — from time to time they need to be zoomed in to fill in the whole browser window.

What holds for mobile devices holds also for printing devices. Ironically, nobody really argues about the advantages that flexible layouts for print layouts manage to deliver. Flexible design allows to use portrait / landscape - formats for optimal printing.

The decision for flexible layouts against fixed layouts doesn’t only improve the accessibility on Desktop-PCs, but also creates robust and flexible medium-independent layouts which can be easily adapted to any output devices. After all, with flexible rules (relative measure units, minimal margin and padding, alignment etc.) instead of fixed rules (px) rendering engines can better consider the properties of the used media.

The future, the unexplored land

As mentioned above, the mobile Web is becoming more and more important. Are we now going to optimize layouts for 640×480 or 800×600? The screen resolutions are increasing, the prices for high-resolution displays are decreasing. At the same time the physical resolution of devices as well as the spatial printing resolution (dpi). Consequently, the absolute size of one pixel decreases. No wonder that pixel-based definitions are becoming less expressive.

The gap between low-resolution displays and high-resolution displays hasn’t bridged over the last 10 years. On the contrary: the gap has increased dramatically. Web-sites are viewed in hundreds of possible screen resolutions while each user may have his own preference for the viewport of his browser. This consideration alone explains how important flexible design layouts are today and how important they will be in the future. Consequently, fixed layouts won’t make the cut in the future as designers will need to consider more and more different devices to optimize the design for. What we need in web design to come to grips with all this variety are dominating relative measurement units.

Flexible Layouts with YAML

YAML (”Yet Another Multicolumn Layout”) is an (X)HTML/CSS-framework which was developed especially to meet the requirements of flexible and user-friendly design layouts. Since June 2007 YAML is available in English and provide an extensive documentation. Most CSS-Frameworks like Blueprint CSS or YUI Grids offer designers a predefined system of CSS-classes to create grid-based layouts visually. To create a layout designer needs to create a HTML-structure of the site and to assign CSS-classes to containers. The rest is automatically taken care of.

YAML takes a different route. The Framework supports the development of grid-based layouts as well as the development of the grid system - with the emphasis on flexible layouts. If a designer wants to create a grid-based layout he can use the basic skeleton with three columns, header and footer. Each element can be removed or adjusted to user’s needs. The actual design, the positioning of the columns, is done using CSS-definitions (and not HTML-structure as it is done in other CSS-frameworks). The benefit for designers: with YAML one has better options for defining his own system of classes, using any measurement units and getting clean code.

Based on the HTML-structure of YAML, the framework includes layout presets which already prevent IE-bugs; thus the framework makes it easier for designers to create a layout which works in both modern and older browsers. Layout examples provide an overview of what is possible with YAML and may deliver some ideas for your future layouts. Apart from that, YAML offers a set of flexible grid-components which you can use to create columns within columns and thus design a more complex but flexible Grid-layouts.


YAML Example: a demonstration of YAML’s flexible grids.

Consider the example above. BluePrint CSS has a demo-page which displays a layout created with Blueprint CSS. And this is the result of the very same template created using the flexible grid-elements of YAML. The scaling works even in IE 5.5, including min-width and max-width.

Apart from layout design, YAML also delivers style sheets for print layouts, as well as components for horizontal and vertical navigation. YAML definitely requires some time to climb the learning curve: the tool offers a variety of functions and user-friendly flexible layouts are definitely not easy to build.

The concept of YAML is, however, well documented in the online- and PDF-documentation and my provide beginners and professional with a good introduction to the framework. For practical purposes you can also use YAML-Builder, a handy tool for visual development of YAML-based CSS layouts which allows you to put the containers of the layout visually together via drag-n-drop. The valid HTML- and CSS-code is generated automatically on the fly.

0
Your rating: None


From the MAKE Flickr photo pool

Andrew from Boulder, CO created an orientation aware USB camera and imaging software to go with it - First I built a circuit to make it so I could read a 3-axis magnetometer and a 3-axis accelerometer over USB, just for the heck of it. Then later, while trying to come up with something interesting to do with such a device, I decided it could be neat to throw a webcam in the mix.
After I got everything to work, and after a while of playing around with different ideas for software to make use of all that data, I came up with the app in the video.Excellent! The potential applications run deep with this one. Hope he plans to share more on the design and software. - Orientation aware camera demo

Read more | Permalink | Comments |

Read more articles in Imaging |

Digg this!

0
Your rating: None

Contents


Introduction

Some days ago, Jeff Watkins published his [Coherent JS] framework: it is an outstanding new framework which implements Apple Bindings in Javascript. From his first tutorial I got the inspiration to write this article: it could be nice to structure our JQuery apps in widgets, using fast and reusable classes.


What you'll need

You need a text editor, latest JQuery, and boom! =)


Page structure

Think about your page as a set of tools: it's easy to see every part of the page as a widget with its own behaviour attached.


MVC: start building your model

Simply write you XHTML + CSS code, describing your page parts.

For example, if I want to make an image to move (stupid example, I know, but easy to implement and to understand for you ^^) creating a widget I've got to write the following code:

<img id="myImage" src="images/myimage.png" alt="Moving image" />


Separate Code from Presentation

In the head section of my page I'm going to write:

<script src="js/jquery-1.2.5.pack.js" type="text/javascript" charset="utf-8"></script>
<script src="js/ImageWidget.js" type="text/javascript" charset="utf-8"></script>
<script src="js/Main.js" type="text/javascript" charset="utf-8"></script>
  • js/jquery-1.2.5.pack.js is the latest JQuery available today.
  • js/ImageWidget.js will be our Widget class.
  • js/Main.js will be our initialization class.


Write a Class

We are going to use a particular kind of class pattern, which gives the possibility to have private variables (differently from many plugins and patterns) and reduces the overhead of public functions (differently from the GREAT Module Pattern).
That's it:

var MyClass = function(args) {
	if (!(this instanceof MyClass)) return new MyClass(args); //prevent the call without 'new' construct
	
	var myPrivateVar = args.MyPrivateVar;
	this.myPrivateVar = function() { //getter
		return myPrivateVar;
	}
	this.setMyPrivateVar = function(value) { //setter
		myPrivateVar = value;
	}
	
	this.publicVar = "My public value";
};

MyClass.prototype.myPublicFunction = function() {
	// code ...
};

MyClass.prototype.myStaticVar = "I'm static here";


Write a Widget Class

In a Widget it's important to store the DOM Object which represents the Widget: so pass it to class constructor like this:

var ImageWidget = function(object, args) {
	if (!(this instanceof ImageWidget)) return new ImageWidget(object, args); //prevent the call without 'new' construct
	
	this.object = function() { //returns attached object, the object which is controlled from this class
		return $(object);
	};
...
...
...

That's great because you can use this.object() getter everywhere in your code.

So, let's implement the animation:

ImageWidget.prototype.move = function(duration) {
	var self = this; //use the closure!!!
	
	this.object().animate({
		left: "+= 200px"
	}, {
		duration: duration,
		complete: function() {
			// you can use the closure and call class functions with self.myFunct()
		}
	});
};


Event delegation

To control all DOM events in your widget you could start observing the DOM in the constructor, delegating one the class to handle all the callbacks.That's possible thanks to bubbling: when an event is triggered, it bubbles towards the top of the DOM tree. For exampe if I have and Image Widget (so, an image, a caption and two navigation buttons - next, prev) you will attach the div to a class and, here, you will observe clicks to contained elements.

//Event delegation in an Image Widget
this.object().bind("click", {self: this}, function(event) {
	var tgt = $(event.target); //where event has effectively been triggered
	var self = event.data.self;
	
	if ("next" == tgt.attr("id")) {
		// next button pressed
	}
	else if ("prev" == tgt.attr("id")) {
		// prev button pressed
	}
});

Event propagation permits to structure our JavaScript in a different way, [triggering custom events] and binding them everywhere in the page.


Attaching the Class to Widget: giving a behaviour to our static DOM Objects

And the Main.js???
Here we are! =D

$(function() {
	var myWidget = new ImageWidget("#myImage", { }); //no args in this stupid example!
	myWidget.move(3000); //3 seconds
});

It initializes and fires methods as DOM is loaded.


Steps


Alternate methods

Thousands...


Suggested readings

Google "Coherent JS", "John Resig", "JQuery", "Low Pro", ...

]]>

0
Your rating: None

*UPDATE*
Apparently adobe scheduled maintenance this saturday during the scheduled time for the course (which blows tremendously -they could have asked if anyone was doing something during those hours) I guess it could be argued that no time is a good time, but I'd argue back that midnight would be 90% better option I'm willing to bet... Just sayin'

Anyway, we ARE going to reschedule it asap (like in the next week or 2), and RMI is extending the viewable recording of the session to 2 months for the inconvenience to the students. Sorry for the hassle guys

I'm sorry I'm late on announcing this, I've been super busy with this current client and trying to get everything else done for the course has just consumed all motor skills and brain cells ;(

I'm taking a break from traveling for a while, so RMI has set me up with some on-line course time and this weekend (saturday), I'm going to pouring over the Winterwonder Land application and talking about optimization techniques for Papervision and the flash Player in general.

In the course files, I'm including nearly all the demo's I used for the classes I taught in person as well as the source for Winterwonder Land's animation engine etc.

If you're interested, you can sign up over at RMI's site:

http://www.richmediainstitute.com/node/142

Hope to see you there!

0
Your rating: None

UPDATE: Xapian is now deployed for all users. Google search is now offered when Drupal search block is disabled. Details.

When the site gets too busy, the infrastructure team sometimes disables the built-in search function. When this happens, you can use Google to search by putting site:drupal.org in with your query. There are also a couple of unofficial sites mentioned in the comments below. The issue to discuss how best to handle providing an alternate search is here. Comments have been disabled on this post because they were becoming unproductive. If you are able to help with the problem, please do so via that issue. Please note that saying "someone" needs to do "something" will not be any more helpful on that issue. We are already well aware of that.

Michelle

0
Your rating: None

Drupal's theming system offers developers and designers a flexible way to override default HTML output when specific portions of the page are rendered. Everything from the name of the currently logged in user to the HTML markup of the entire page can be customized by a plugin "theme".

Unfortunately, this system can be its own worst enemy. Themes are very powerful, but in many cases they're the only place where specific output can be changed without hacking core. Because of this, themes on highly customized production sites can easily turn into code-monsters, carrying the weight of making 'Drupal' look like 'My Awesome Site.'

This can make maintenance difficult, and it also makes sharing these tweaks with other Drupal developers tricky. In fact, some downloadable modules also come with instructions on how to modify a theme to 'complete' the module's work. Wouldn't it be great if certain re-usable theme overrides could be packaged up and distributed as part of any Drupal? As it turns out, that is possible. In this article, we'll be exploring two ways to do it: a tweaky, hacky approach for Drupal 5, and a clean and elegant approach that's only possible in Drupal 6.

read more

0
Your rating: None

Article

There are a number of useful web design pattern libraries out there.


Suggested readings

]]>

0
Your rating: None

Well I finally got Ogre to compile. Bugger knows how I’m going to graft Openframeworks libraries into it. I only really need sound and the VideoGrabber, but those are still tall orders.

If you want to play with Ogre on a PC you’ll need the following:

Visual Studio 9. Trying to get it to work with Code Blocks is more trouble than it’s worth, especially as it breaks Openframeworks when you get the bare minimum working. Plus VS9 is pretty damn good. I’m amazed that Microsoft made it.
The Ogre SDK
DirectX Runtime

Then you’ll want to read the following:

Installing the Ogre SDK
Setting up an application. No the Ogre Application Wizard doesn’t work on VS9. This means we have to do some twiddling with project settings to get it to work. But despite this being a pain, it teaches you how to set up projects properly and will help you in the long run.
My thread in the Ogre Forum about trying to get VC9 to compile Ogre. I didn’t quite read the instructions in the previous link thoroughly, but those instructions also assumed some knowledge I didn’t have. Most of the difficulty of getting Ogre to compile is down to correct project settings and correct file placement. So you have to use your initiative a little to figure it out. Now I’m at the following stage:

Ogre Tutorials

I’m going to settle in to this stuff now to put off the nightmare that combining Ogre and Openframeworks will be.

Bruce Sterling on the future of interaction design
Magic Pen
Artificial Stupidity
Fruit Mystery game
Cat with Bow Golf game
Floating Head
The Control Master (a Run Wrake film)
Metal Gear Solid 4 game play demo

C++ optimisation strategies
Processing for Javascript

As a side note I got a new phone recently. So I downloaded the latest Mobile Processing and spent one Sunday writing a new and more clever game of Snake vs the Computer for it. It uses the new A* algorithm I built and shows the Snake’s thoughts about which path to take ahead of it.

Snake AI 2

0
Your rating: None

Steven Levithan has been flagrant by creating a simple way to remove nested patterns with a while loop and a replace:

PLAIN TEXT
JAVASCRIPT:

  1.  
  2. var str = "abc&lt;1&lt;2<>3>4>def";
  3.  
  4. while (str != (str = str.replace(/<[^<>]*>/g, "")));
  5.  
  6. // str -> "abcdef"
  7.  

Notice that the regex in this one-liner doesn't try to deal with nested patterns at all. The while loop's condition replaces instances of <…> (where angled brackets are not allowed in the inner pattern) with an empty string. This repeats from the inside out, until the regex no longer matches. At that point, the result of the replacement is the same as the subject string, and the loop ends.

You can use a similar approach to grab nested patterns rather than delete them, as shown below.

PLAIN TEXT
JAVASCRIPT:

  1.  
  2. var str = "abc(d(e())f)(gh)ijk()",
  3.     re = /\([^()]*\)/,
  4.     output = [],
  5.     match, parts, last;
  6.  
  7. while (match = re.exec(str)) {
  8.     parts = match[0].split("\uFFFF");
  9.     if (parts.length <2)
  10.         last = output.push(match[0]) - 1;
  11.     else
  12.         output[last] = parts[0] + output[last] + parts[1];
  13.     str = str.replace(re, "\uFFFF");
  14. }
  15.  
  16. // output -> ["(d(e())f)", "(gh)", "()"]
  17.  
0
Your rating: None

Effective web design doesn’t have to be pretty and colorful — it has to be clear and intuitive; in fact, we have analyzed the principles of effective design in our previous posts. However, how can you achieve a clear and intuitive design solution? Well, there are a number of options — for instance, you can use grids, you can prefer the simplest solutions or you can focus on usability. However, in each of these cases you need to make sure your visitors have some natural sense of order, harmony, balance and comfort. And this is exactly where the so-called Divine proportion becomes important.

This article explains what is the Divine proportion and what is the Rule of Thirds and describes how you can apply both of them effectively to your designs. Of course, there are many possibilities. Hopefully, this post will help you to find your way to more effective and beautiful web designs or at least provide some good starting points you can build upon or develop further.

Divine Proportion

Since the Renaissance, many artists and architects have proportioned their works to approximate the golden ratio — especially in the form of the golden rectangle, in which the ratio of the longer side to the shorter is the golden ratio. The rationale behind it is the belief that this proportion is organic, universal, harmonic and aesthetically pleasing. Indeed, being evident everywhere in the universe (in fact, many things around us can be expressed in this ratio), divine proportion (which is also called Golden ratio, divine section, golden cut and mean of Phidias) is probably the most known law of proportion which can dramatically improve the communication of your design.

As Mark Boulton states in his article Design and the Divine Proportion, “one of the key components in the vehicle of communication is composition, and in design schooling it is something that is taught as something you should feel rather than create logically.” Hence, to comfort your visitors with a pleasing and intuitive composition it is often worth considering the Golden ratio. So what exactly is Golden ratio? Basically, it is a proportion 1.618033988749895 ≈ 1.618 which holds between objects placed within some context.

Divine Proportions

Consider the example above. You would like to create a fixed width layout. The width of your layout is 960px. You would to have a large block for your content (#content) and a smaller block for your sidebar (#sidebar). How would you calculate the widths of your columns?

  1. First, calculate the width of your #content-block. You need to make sure that the ratio between this block and the overall layout width is 1.62. Hence you divide 960px by 1.62 which results in approximately 593px.
  2. Subtract 593px from the overall layout width (which is 960px) and get 960px - 593px = 367px.
  3. Now if you calculate the ratio between the #content-block and the #sidebar-block (593px : 367px ≈ 1.615) and the ratio between the container-width and the width of the content-block (960px : 593px ≈ 1.618) you have achieved almost the same ratio.

This is the whole idea behind the “Golden” proportion. The same holds for fluid and elastic layouts, too.

Of course, a web design doesn’t need to be organized according to the Divine proportion. However, in some cases it can improve not only the communication of your design, but also improve further details of your layouts. As an example consider The 404 Blog. The design itself is visually appealing, provides calm and supporting color scheme and has a nice composition.

However, the design does not correspond to the Divine proportion as you can see from the image below. Actually, users don’t necessarily feel it, because they intuitively split the layout in two separate blocks of the width 583px (630px - 31px - 31px) and 299px (330px - 31px). The reason behind it is that white space of the main area is passive (three columns, each 31px wide), it clearly supports the content next to it rather than being the content itself.

The ratio between the layout blocks is 630 : 330 px ≈ 1.91 ≠ 1.62, and the ratio between the content blocks is 583 : 299px ≈ 1.92 ≠ 1.62. The reason why the layout looks almost perfect although it doesn’t stick to the Divine proportion is the simple fact that it is balanced — both the layout blocks and the content blocks have the same proportion. Hence the design provides some sense of closure and structural harmony.

The interesting thing is, however, that due to a suboptimal layout length visitors are offered a suboptimal text length of over 90 symbols per line. However, an optimal number for comfortable reading lies between 60 and 80 symbols per line. The improvement of the layout would therefore lead to the improved readability of the content, too. That’s a useful side-effect of getting things done according to the laws of nature.

For some quick’n'dirty drafts you may use the ratio 5 : 3 which is not exactly the Divine proportion, but can turn out to be a useful rule of thumb in case you don’t have a calculator near you. Divine proportion usually provides bulletproof values one can perfectly incorporate in almost every design. When working on your next project you may want to consider using the following tools to calculate the widths “on the fly”:

  • Phiculator
    Phiculator is a simple tool which, given any number, will calculate the corresponding number according to the golden ratio. The free tool is available for both Win and Mac.
  • Golden Section Ratio Design Tool
    Atrise Golden Section is a program, which allows avoiding the routine operations, calculator compilations, planning of grouping and forms. You can see and change the harmonious forms and sizes, while being directly in the process of working on your project.

The Rule of Thirds

Basically, the Rule of Thirds is a simplified version of the Golden ratio and as such poses a compositional rule of thumb. Dividing a composition into thirds is an easy way to apply divine proportion without getting out your calculator.

It states that every composition can be divided into nine equal parts by two equally-spaced horizontal lines and two equally-spaced vertical lines. The four points formed by the intersections of these lines can be used to place the most important elements — the elements you’d like to give a prominent or dominant position in your designs. Aligning a composition according to Rule of thirds creates more tension, energy and interest in the composition than simply centering the feature would.

Rule of Thirds
This photograph demonstrates the principles of the rule of thirds. Source: Wikipedia

In most cases it is neither possible nor useful to use all four points to highlight the most important functions or navigation options in a design. However, you can definitely use some of them (usually one or two) to properly place the most important message or functionality of the site. The left upper corner is usually the strongest one, since users scan web-sites according to the “F”-shape.

So how do you split a layout into 9 equal parts? Jason Beiard states the following method for applying the Rule of Thirds to your layouts:

  1. To start the pencil-and-paper version of your layout, draw a rectangle. The vertical and horizontal dimensions don’t really matter, but try to keep straight lines and 90-degree angles.
  2. Divide your rectangle horizontally and vertically by thirds.
  3. Divide the top third of your layout into thirds again.
  4. Divide each of your columns in half to create a little more of a grid.
  5. You should have a square on your paper that looks similar to the rule of thirds grid.

Let’s consider the following situation. Assume you have a layout of fixed width 960px. Consider the area above the fold which is likely to have the height between 750 and 950px.

  1. Divide the width of your layout by 3. In an example you get 960px / 3 = 320px.
  2. Divide the height of your layout by 3. In an example you get ( (750 + 950 px) / 2 ) / 3 ≈ 285px.
  3. Each rectangle should have the size of 320px × 285px.
  4. Construct the grid of the rectangles described in step 4 by drawing lines going through the ends of rectangles.
  5. Place the most significant elements of your designs in the meeting points of horizontal and vertical lines.

Consider the design of demandware.com presented below. Although the design uses a number of vibrant colors, it is not noisy and seems to be both simple and clear. The navigation options are clearly visible and the structure of the site seems to be easy to scan.

Rule of Thirds

However, if you consider the effectiveness of this design, you might find a perfect balance the design actually has. Indeed, it almost perfectly uses the Rule of Thirds as two out of four intersections of the lines (pink blocks in the picture below) contain exactly the information which the company wants its users to see — namely what the site is all about and an example of their work. Note also how perfectly the main sections are placed on the second horizontal axis. That is effective.

Rule of Thirds
Rule of Thirds in use: two out of four intersections of the lines (pink blocks) contain exactly the information which the company wants its visitors to see.

Summary

In some cases, applying the Divine proportion and the Rule of Thirds may significantly improve the communication of your design to your visitors. Offering your users an almost natural balance in proportion 1 : 1.62 you literally impose the natural order on it and force your design layout to become more scannable and well-structured.

Using the Rule of Thirds you can also effectively highlight important functions of your site providing your visitors with a design they can easily work with and effectively delivering the message you want to deliver in the first place.

0
Your rating: None

Musiccatch

Catch the shapes, up your score. Simple enough?

That's the goal of free web game Music Catch, a game that offers a beautiful, almost contemplative, play experience. As shapes are shot from a rotating bar, you try to catch them, with the intensity of the blast accompanying the game's musical score -- the action stop once the track ends.

There are a few things to keep in mind. Capture yellow shapes and they give you a higher multiplier (and bigger icon). Avoid the red ones, since they do the opposite. The purple shapes? You'll want them, believe me, as they are glorious.

Music Catch was developed by Reflexive Entertainment -- check the web game section of their site to try some of their other games.

Music Catch [Reflexive Entertainment, via Rock, Paper, Shotgun]

See also:


0
Your rating: None
Syndicate content