UX & WebDesign

Dribbble: What are you working on?

Show and tell for designers in 120,000 pixels or less.

http://dribbble.com/

JS, jQuery and Development

How to Test your JavaScript Code with QUnit

QUnit, developed by the jQuery team, is a great framework for unit testing your JavaScript. In this tutorial, I’ll introduce what QUnit specifically is, and why you should care about rigorously testing your code

http://net.tutsplus.com/tutorials/javascript-ajax/how-to-test-your-javascript-code-with-qunit/

jsPerf: JavaScript performance playground

jsPerf aims to provide an easy way to create and share test cases, comparing the performance of different JavaScript snippets by running benchmarks…

http://jsperf.com/

Single Page Application

A ”’SPA”’ is a web application that fits on a single page, and which might be optionally enhanced by connectivity with a server

http://code.google.com/p/trimpath/wiki/SinglePageApplications

GeekFun

Under Construction Bars and Images (Careful, can hurt your eyes)

http://www.textfiles.com/underconstruction/

The Daily Mail’s Robots.txt File Contains… an SEO Job Advert(!?)

The robots.txt file on any site is how search engines discover what a site wants indexed and what it doesn’t.

Generally you won’t find many people checking the files unless they’re technically minded, passionate about SEO and curious. The Daily Mail of all sites thought it would be an ingenious idea to place a job advert in the file and SEO consultant Malcolm Coles discovered it…

http://thenextweb.com/uk/2010/08/24/the-daily-mails-robots-txt-file-contains-a-seo-job-advert/

UX and WebDesign

Best examples of 404 error pages

http://ht.ly/18EcOR

How People Are Signing In Across the Web [STATS]

As in its last report back in April, Google and Facebook continue to dominate websites that offer third-party login options. Across the 250,000 sites that use Janrain Engage, Google (Google) represents the preferred sign-in option for 38% of users…

What ever happened to common courtesy?

Upon updating Facebook’s iPhone app last night, the first thing I immediately noticed was Pull to Refresh, the awesome UI Element created by Loren Brichter for Tweetie 2. We fell in love with this element the second Tweetie 2 hit app store, so we re-created it and open sourced it for everyone to use…

http://developers.enormego.com/view/what-happened-common-courtesy-facebook

Test Credit Card Account Numbers

Expiration Date must be a valid date in the future (use the mmyy format).

https://www.paypalobjects.com/en_US/vhelp/paypalmanager_help/credit_card_numbers.htm

Quotes and Fun

Quotes from the User

Ever have a client think that users only say the nicest things? Here’s the place to prove them wrong.

http://userquotes.tumblr.com/

“Can you show us the design of what our site would look like so we can decide whether it’ll be worth it?”

http://clientsfromhell.net/

Desk for geeks

http://lifehacker.com/5617021/diy-plank-desk-inventively-hides-your-cord-clutter

Web, Design & UX

It’s About the Design Not the Tools

http://designm.ag/design/its-about-the-design-not-the-tools-2/

Ultimate guide to table UI patterns

http://www.jankoatwarpspeed.com/post/2010/02/26/table-ui-patterns.aspx

Thoughts About Redundancy In Web Design

http://www.vanseodesign.com/web-design/redundancy/

Line25 Sites of the Week for August 13th 2010

http://line25.com/inspiration/line25-sites-of-the-week-for-august-13th-2010

Designing for the Mind

http://designinformer.com/designing-mind/

Tools for the Job

iPhone and iPad Development GUI Kits, Stencils and Icons

http://speckyboy.com/2010/04/30/iphone-and-ipad-development-gui-kits-stencils-and-icons/

Bonus Track

What Happened to Yahoo [what went wrong with Yahoo – my title]

http://www.paulgraham.com/yahoo.html

“I remember telling David Filo in late 1998 or early 1999 that Yahoo should buy Google, because I and most of the other programmers in the company were using it instead of Yahoo for search. He told me that it wasn’t worth worrying about. Search was only 6% of our traffic, and we were growing at 10% a month. It wasn’t worth doing better…”

GeekFun

HR Recruiting on JavaScript (http://s.meebocdn.net/script/meebo_v88_9.js)

If you want to look how a test (or any other site) will behave in an iPhone safari from the comfort of your Desktop, do the following steps:

Windows 7

  1. In Windows Explorer, go to
    C:\Users\YOUR_USERNAME\AppData\Local\Google\Chrome\Application\
  2. Create a link to chrome.exe (right click, Create Shortcut)
  3. Alter the target property in this shortcut:

From: C:\Users\YOUR_USERNAME\AppData\Local\Google\Chrome\Application\chrome.exe

To: C:\Users\YOUR_USERNAME\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent="Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3"

I use the Web Developer extension, so I can resize my window to iPhone’s defaults (320×480 or 480×320)

From Christian Heilmann. Nothing too fancy for those who are used to write jQ plugins, but nice to save it for reference…

var myApp = function(){
	var nome = 'Mauricio Wolff';
	var idade = 35;
 
	function insertPessoa(){
		// [...]
	}
 
	function updatePessoa(){
		// [...]
	}
 
	function setPessoa () {
		// [ usa insert ou update ]
	}
 
	function getPessoa () {
		// [...]
	}
 
	return{
		set: setPessoa,
		get: getPessoa
	}
}();
 
// Example usage:
myApp.get();
Google 2010 in msie 3.0

Google 2010 in msie 3.0

Just for fun… but believe me, it looks better than Bing.  :)

Não sou muito fã de teorias da conspiração, mas achei todo esse movimento de criar uma vacina a jato e vários governos do mundo comprando milhões de unidades e fazendo campanhas mundiais de vacinação muito estranhas…

Aí achei um filme em três partes no youtube, que tem algumas informações no mínimo interessantes… deixo a decisão para o julgamento de cada um:

O site terra-flor.com já estava em produção há algum tempo… Ele conta com o admbonsai, que é o gerenciador de conteúdo próprio, com uma série de plugins e produtos (gerenciador de eventos, produtos, locais de revenda, contatos, gerenciador de FAQs, mailer…)

Com uma série de recursos de HTML5 e CSS3 e jQuery na veia, é um bom case. Vou ter de escrever um case completo para retratar as features de uma forma legal.


Site Terra-Flor Aromaterapia

This is nice. An article on SixRevisions, short version here for my Archive.

If you write a couple meta tags, your html5 app will look like any other iPhone App, but will also work on Android, PalmPre, etc…

<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" href="iphone_icon.png"/>
<link rel="apple-touch-startup-image" href="startup.png" />
<link rel="stylesheet" href="styles.css" type="text/css" media="screen, mobile" title="main" charset="utf-8">
  • apple-mobile-web-app-capable: This is another tip-off that we want to be an offline app.
  • apple-mobile-web-app-status-bar-style: This hides the status bar, and nav bar when the app is offline.
  • apple-touch-icon:This is the pointer to the image that want to be the icon.
  • apple-touch-startup-image: This is a url pointing to the startup image.

Application Cache

Application caching allows browsers to determine in advance all the files a web page will need for the web page to work.

One tricky part to this whole thing is that the manifest (the list of files that need to be cached offline) has to be passed with a filetype Header set to text/manifest. That is why you need access to a web server that can set HTTP headers.

    CACHE MANIFEST
 
    # Version 3 
 
    style.css
    index.html
    init.js
 
    # offline icons
    startup.png
    iphone_icon.png

Offline Data

Along with the ability to keep files that are needed offline, you can also store user data in an offline database. There are two major APIs for per user and/or per page data. The first is localStorage. localStorage, is an easy to use key-value store with a dead simple API.

    localStorage.dataToStore = 5;
    console.log(localStorage.dataToStore); // 5

Its also possible to use a webdatabase (SQLite):

    // Try and get a database object
    var db;
 
    try {
        if (window.openDatabase) {
            db = openDatabase("NoteTest", "1.0", "HTML5 Database API example", 200000);
            if (!db)
                alert("Failed to open the database on disk.  This is probably because the version was /
                bad or there is not enough space left in this domain's quota");
        } else
            alert("Couldn't open the database.  Please try with a WebKit nightly with this feature enabled");
    } catch(err) { }
 
    // Check and see if you need to initalize the DB
    db.transaction(function(tx) {
        tx.executeSql("SELECT COUNT(*) FROM WebkitStickyNotes", [], function(result) {
            loadNotes();
        }, function(tx, error) {
            tx.executeSql("CREATE TABLE WebKitStickyNotes (id REAL UNIQUE, note TEXT, timestamp /
            REAL, left TEXT, top TEXT, zindex REAL)", [], function(result) {
                loadNotes();
            });
        });
    });
 
    // Insert a test Note.
    var note = {
        id: "1",
        text:" This is a test note",
        timestamp: "112123000",
        left:10,
        top:10,
        zIndex:2
    };
    db.transaction(function (tx)
    {
        tx.executeSql("INSERT INTO WebKitStickyNotes (id, note, timestamp, left, top, zindex) VALUES /
        (?, ?, ?, ?, ?, ?)", [note.id, note.text, note.timestamp, note.left, note.top, note.zIndex]);
    }); 
 
    // Get all the notes out of the database.
    db.transaction(function(tx) {
        tx.executeSql("SELECT id, note, timestamp, left, top, zindex /
        FROM WebKitStickyNotes", [], function(tx, result) {
            for (var i = 0; i < result.rows.length; ++i) {                 var row = result.rows.item(i);                 var note = new Note();                 note.id = row['id'];                 note.text = row['note'];                 note.timestamp = row['timestamp'];                 note.left = row['left'];                 note.top = row['top'];                 note.zIndex = row['zindex'];                 if (row['id'] > highestId)
                    highestId = row['id'];
                if (row['zindex'] > highestZ)
                    highestZ = row['zindex'];
            }
 
            if (!result.rows.length)
                newNote();
        }, function(tx, error) {
            alert('Failed to retrieve notes from database - ' + error.message);
            return;
        });
    });