Wednesday, June 23, 2010

Web SIte Performance: Optimal Page Structure Vs. Reality

Recently, I had the opportunity to talk about Steve Souders' web site performance work with some old friends. While attempting to hammer home the importance of the Souders' performance techniques, I failed to mention one VERY IMPORTANT thing...

It's NOT an all or nothing proposition.

Along with the ideal, there are two VERY important points that need to be conveyed:

1. Not ALL of the techniques need to be deployed at the same time in order to have an impact. Implementing just a few can have a dramatic effect. The more the merrier BUT, all or nothing is DEFINITELY NOT the goal.

2. The techniques are not biblical in stature. There are times when the ideal is simply incongruent with the required solution. For instance, the recipe for optimum performance and IDEAL page structure is:


  • 1 static HTML file

  • 1 css resource

  • 1 image resource

  • 1 js resource


Ideal Page Structure:

<html>
    <head>
        <!-- 1 css resource -->
        <link rel="stylesheet" href="[EXTERNAL_PATH]">
    </head>
    <body>
        <div id="container">
            <!-- begin content -->

            <!-- 1 image resource (to be used as sprite) -->
            <img src="[EXTERNAL_PATH]">

            <!-- end content -->
        </div>

        <!-- 1 js resource -->
        <script src="[EXTERNAL_PATH]"></script>

        <!-- embedded js if required -->
        <script language="javascript">
            your.thing = new your.constructor({
                name1: value1,
                name1: value2
            });
        </script>
    </body>
</html>



HOWEVER, while this may be the ideal, sometimes, you simply can't get down to a single resource request because of solution requirements. Case in point - if you need to add Google Analytics to your page, you're NOT going to hit the ideal - you're going to have more than 1 js resource.

So, in closing, the idea should always be to strive for the ideal and get as close as possible. Very simply put, taking 10 js requests down to 8 is a GREAT start. Don't skip it because you can't get 10 down to 1.

Monday, June 14, 2010

Apple likes my wife.

To date, I've built 3 iPhone Web Apps. None of them would be considered functionally unique or powerful by any stretch, HOWEVER... and it's a big HOWEVER... so far... ready for this?

Two out of the three have earned "Staff Pick" awards from Apple!

As much as I would like to take credit for being an absolute genius, it would appear that Apple has a thing... for my wife.

The two awarded iPhone Apps are "Mila's Tools", a simple Unit Conversion Calculator and "VeganMunch Kombucha Calculator" a simple Kombucha recipe calculator. Both are basically products of my wife, Mila.

The other App - Scott's Pinger, a simple web site monitor, of which I am very proud - got nothin'. Nada. Zilch. Zippo.

I guess I'll be asking Mila for more App ideas.

In the meantime, while waiting for Mila to tell me what App to build next, I decided to put a Mini-App of sorts together as a portal to all of my apps. The idea being, as I deploy new iPhone apps, they'll be listed in the portal app.

Check it out from your iPhone here: Scott's iPhone Web Apps. Don't forget to add it to your Home screen.

Back to the grind. Uhm... eh ehm... Mila? What am I building next?

Cannot Process Command: Internal Error.

*Knock, knock. knock.*

Apple? Hello? Apple?

Apple!

Is there anyone even home over at the Apple iPhone Web Apps site?

For the love of Pete already. After all of the hubub from Jobs about HTML 5, Safari 5, Web Apps, iPhone 4 and all of the other greatness spewing from the pores of Apple, you'd think maybe they'd have someone over there keeping an eye on the Web Apps site.

Intermittently, THE VAST MAJORITY of the web app links point to this lovely page:

Cannot Process Command: Internal Error.Cannot Process Command: Internal Error. I'm now having nightmares about this page! How many e-mails do I have to send!? How many forums need to be screaming!?

PLEASE... someone at APPLE... FIX THE DAMN LEAK. Oh... wait... wrong rant... Nevertheless!!! FIX IT ALREADY!

K. I feel better. Love you Apple. :)

If you're experiencing the same issue at Apple.com, please leave a comment below. A few more voices couldn't hurt.

Sunday, May 23, 2010

Add a mute button to your system tray

So you're working... jammmin' to some Zeppelin... and the phone rings. You then proceed to fumble around your systray with your volume control attempting to open it to mute. I'm not one to critique another UI engineer's flow but... DUDE! REALLY!? WHERE THE HELL IS THE DAMN MUTE BUTTON IN THE SYSTRAY!?

Get ready to go around your ass to get to your elbow. Ready?

1. Download NirCmd
2. Download BeTrayed!
3. Assuming you installed NirCmd in your Program Files directory, create a shortcut on your desktop to: "C:\Program Files\nircmd\nircmd.exe" mutesysvolume 2
4. Create a new txt document with the following as the body:

  C:
  cd C:\Program Files\JohnnyFoster.com\BeTrayed!
  start BeTrayed "C:\Program Files\nircmd\nircmd.exe" mutesysvolume 2
  Y:
  exit
  cls

5. Save the file as MUTE_SYSTRAY.cmd
6. Create a shortcut to MUTE_SYSTRAY.cmd in your Start -> All Programs -> Startup folder

Double click to toggle your sound.

Nice.

TODO: Find volume control UI designer. Yell.

Saturday, May 22, 2010

"Mila's Tools" on the Apple Web Apps homepage

Let me tell you something... if you've built yourself a simple iPhone Web App... and you'd like to get a few hundred users REAL QUICK... SUBMIT YOUR APP TO THE APPLE WEB APPS DIRECTORY. Run. Don't walk. Run to the Apple Web Apps site and do it now.

I about fell out of my chair after submitting my app late one night only to wake up to 100s of new users. Upon checking the directory, there it was... right on the Apple Web Apps home page as a "Staff Pick" - "Mila's Tools", my new iPhone Unit Conversion App.

Pure awesomeness, drenched in awesome juice.



Thursday, May 20, 2010

Error Number: 1413 (0x80070585)

PROBLEM: Immediately after installing Zend server, upon testing you are faced with:


FastCGI Error

The FastCGI Handler was unable to process the request.
Error Details:

Could not find entry for "php" on site 1 in [Types] section.
Error Number: 1413 (0x80070585).
Error Description: Invalid index.
HTTP Error 500 - Server Error.
Internet Information Services (IIS)


SOLUTION: Add the following to the end of C:\WINDOWS\system32\inetsrv\fcgiext.ini


[Types]
php=PHP

[PHP]
ExePath=C:\Program Files\Zend\ZendServer\bin\php-cgi.exe

EnvironmentVars=PHP_FCGI_MAX_REQUESTS:1000
IdleTimeout=1500
ActivityTimeout=3000
RequestTimeout=1500


Tuesday, May 18, 2010

REFACTORING: A day in the life

I put this video up months ago and just realized I never blogged about it! How'd that happen!? If you're an engineer, this butting-my-head-up-against-the-wall moment is for you.

So, without further ado... I bring to you... "Refactoring: A day in the life." [dat-do-do]



P.S. Turn up the volume. [Really. Turn it up.]

 

Sunday, May 16, 2010

iPhone Unit Conversion Calculator

So, I dove into jQuery and jQTouch development for the iPhone and all I know is, I can't wait to do it again.

Wow, wow, wow... talk about easy-peasy-Japanese. I could not have been more impressed. The functionality of the unit conversion calculator in-and-of-itself is nothing to write home about BUT, that which comes with employing jQuery + jQTouch most certainly is.

Wowsers. Yep. That's all I got. Wowsers.

The iPhone app includes four conversion calculators - a length converter, liquid converter, temperature converter, and time converter. From your iPhone, check out the converter here: iPhone Unit Conversion Calculator.

Don't forget to add it as a full screen app by hitting the + sign. :)

 

Sunday, May 02, 2010

Amazon API "Tags" Response Group

PROBLEM: Amazon API is not returning "Tags" even when "Tags" response group is specified in the request URL.

SOLUTION: Add the "Version" parameter to your request.

EXAMPLE: http://webservices.amazon.com/onca/xml?AWSAccessKeyId=...&Version=2009-10-01

For valid "Version" values, keep your eyes on the API's release notes.

NOTE: By default, the API will return the top 5 tags. To have more returned or to page through tags, check out the TagPage and TagsPerPage parameters in the ItemLookup documentation.

 

Friday, April 30, 2010

Run multiple instances of Internet Explorer

Dear Lord,

Thank you for my life, my wife and FOR Hilbrand Edskes who built THIS APPLICATION allowing me to run multiple instances of Internet Explorer.

One more thing...

LAST YEAR YOU TOOK MY FAVORITE ACTOR, PATRICK SWAYZIE. YOU TOOK MY FAVORITE ACTRESS, FARAH FAWCETT. YOU TOOK MY FAVORITE SINGER, MICHAEL JACKSON. I JUST WANTED TO LET YOU KNOW, MY FAVORITE BROWSER IS INTERNET EXPLORER.

AMEN.

 

Sunday, April 18, 2010

Classic ASP VBScript OAuth

FINALLY. VBScript OAuth with example project!

OAuth is hard. I don't care if you're the greatest engineer on Earth, at first glance OAuth is a WTF moment. Having a slew of Classic ASP sites to maintain, and no luck finding any help in the VBSCript OAuth department, I dove in to the HELL that is OAuth. When I'd finally emerged, although scarred for life, I had a full fledged OAuth implementation... done entirely in VBScript... OK, not entirely... but mostly no doubt.


Check it out here: Classic ASP VBScript OAuth

Get twitter user profile pic by name, unauthenticated

No javascript required. No server side component to deal with. Just drop the image tag in using this generic handler as the src:

http://api.twitter.com/1/users/profile_image/[SCREEN_NAME]

Replace "[SCREEN_NAME]" with the actual screen name and, voilĂ .

EX: <img src="http://api.twitter.com/1/users/profile_image/sdesapio">


 

Saturday, April 10, 2010

oAuth 1.0a: oauth_callback in development

The "oauth_callback" parameter goes in the "request token" request NOT the "access token" request! You'll get back an oauth_verifier value which then becomes part of your "access token" request.

AAARRRRRRGGGGGGGGHHHHHHHHHH! K. I feel better.

More info: Signed Callback URLs

Tuesday, April 06, 2010

Adjust contrast in Windows Movie Maker.

How is it possible that contrast adjustment is not built into Windows Movie Maker by default!?

All I can say is... thank heaven for Daniel. Daniel, whoever you are, wherever you are, THANK YOU.

--------------------

<!-- Daniels contrast (2005) http://www.danielfx.moo.no *This XML only works in XP*-->
<TransitionsAndEffects Version="1.0">
<Effects>
<EffectDLL guid="{B4DC8DD9-2CC1-4081-9B2B-20D7030234EF}">
<Effect name="Contrast up" iconid="29" comment="by daniel">
<Param name="InternalName" value="Standard" />
<Param name="Red" value="0.2"/>
<Param name="Blue" value="0.2"/>
<Param name="Green" value="0.2"/>
<Param name="yellow" value="0.2"/>
<Param name="Brightness" value="0.9"/>
</Effect>
<Effect name="Contrast Down" iconid="29" comment="by daniel">
<Param name="InternalName" value="Standard" />
<Param name="Contrast" value="0.5"/>
</Effect>
</EffectDLL>
</Effects>
</TransitionsAndEffects>

--------------------

1. Copy and paste the above XML into Notepad.
2. Save in C:\Program Files\Movie Maker\Shared\AddOnTFX\ as as Contrast.xml (create the AddOnTFX folder if this is your first time adding an XML effect).
3. Restart Movie Maker.

Voila. Contrast adjustment on Windows Movie Maker.

YUI 3: Looping through an array of elements

OH MAN... I was about ready to kill somebody over this one. Being a die-hard YUI2'er, the concepts introduced in YUI 3, while possibly familiar to the jQuery crowd, are COMPLETELY foreign to us YUI 2 jedis.

In any event, the how to...

------------------

YUI 2


var _d = YAHOO.util.DOM;
var aElements = _d.getElementsByClassName('className');
var i = aElements.length;

while(i--){
    doSomething(aElements(i));
}

------------------

YUI 3


YUI().use('node', function(Y){
    var aElements = Y.all('div.selector');

    var i = aElements.size();
    while(i--){
        doSomething(aElements.item(i));
    }
}
------------------

Note the "size" call as opposed to "length" and the "item(i)" in the "doSomething" call. Ouch.

I love YUI and have been a huge fan of Crockford, Glass, Eric, Nate and the rest of the crew over there but DUDES! C'MON! jk ;)

I finally came to grips after finding the "Rosetta Stone." Have a look and good luck!

Monday, April 05, 2010

Error -2146697210

The path to the file is wrong. Your XML parser can not find the file. Check the base path as well as the file extension.

Monday, August 25, 2008

Sure don't see this every day...

(CREDIT: pennybuckets forwarded email)

Talk about having your camera ready at an opportune time...












Friday, August 22, 2008

How to cope with work


Pennybuckets at it again...

Phase 1
You are listening to Stevie Wonder.
(Your first day at work and all is fine and great.)

Phase 2
You're listening to HOUSE music.
(After a while you are so busy that you are not sure if you're coming or going anymore)

Phase 3
You are listening to Metal.
(This is what you feel like at month's end)

Phase 4
You are listening to Hip Hop.
(You become bloated due to stress, feel sluggish and suffer from constipation)

Phase 5
You are listening to GANGSTA RAP
(After more time passes, your eyes start to twitch, you forget what a 'good hair day' feels like as you just fall out of bed and load up on caffeine!!!)

And Finally...
You are listening to Techno (on Ecstasy)
(The truth - how all employees end up eventually...)

Wednesday, August 20, 2008

Art on the cutting edge

Sometimes, eating food just isn't enough to satisfy the inner artist's appetite.

(from pennybuckets email)














Friday, August 15, 2008

NEW OFFICE POLICY

Another from my sister...

-------------------------------------------------

EFFECTIVE AUGUST 1, 2008

NEW OFFICE POLICY

Dress Code:

1) You are advised to come to work dressed according to
your salary.

2) If we see you wearing Prada shoes and carrying a
Gucci bag, we will assume you are doing well financially
and therefore do not need a raise.

3) If you dress poorly, you need to learn to manage your
money better, so that you may buy nicer clothes, and
therefore you do not need a raise.

4) If you dress just right, you are right where you need
to be and therefore you do not need a raise.<>


Sick Days:
We will no longer accept a doctor's statement as proof
of sickness. If you are able to go to the doctor, you are able to come to work.

Personal Days:
Each employee will receive 104 personal days a year.
They are called Saturdays & Sundays.

Bereavement Leave:
This is no excuse for missing work. There is nothing
you can do for dead friends, relatives or co-workers. Every
effort should be made to have non-employees attend the
funeral arrangements in your place. In rare cases where
employee involvement is necessary, the funeral should be
sc heduled in the late afternoon. We will be glad to
allow you to work through your lunch hour and
;subsequently leave one hour early.

Bathroom Breaks:
Entirely too much time is being spent in the toilet.
There is now a strict three-minute time limit in the
stalls. At the end of three minutes, an alarm will
sound, the toilet paper roll will retract, the stall
door will open, and a picture will be taken. After your
second offense, your picture will be posted on the
company bulletin board under the 'Chronic Offenders'
category. Anyone caught smiling in the picture will be
sectioned under the company's mental health policy.

Lunch Break: (Love this one)

* Skinny people get 30 minutes for lunch, as they need
to eat more, so that they can look healthy.

* Normal size people get 15 minutes for lunch to get a
balanced meal to maintain their average figure.

* Chubby people get 5 minutes for lunch, because that's
all the time needed to drin k a Slim-Fast.


Thank you for your loyalty to our company. We are here
to provide a positive employment experience. Therefore,
all questions, comments, concerns, complaints,
frustrations, irritations, aggravations, insinuations,
allegations, accusations, contemplations, consternation
and input should be directed elsewhere.


The Management