PHP and web services (SOAP, WSDL)
SoapUI-3.5 can help

Read more →
Podcast As Productivity Killer
Oil, meet water
Don't get me wrong, I love me some technology (you should see my museum of handheld computers). But when I tried to listen to a live podcast of my favorite tech blog the other day let's just say I'm lucky I didn't bring down our company's intranet.
Underscore Trick
JavaScript Callbacks with Arguments
ICIC 2010
Please Come to Boston in the springtime...

Sizzle (jQuery) Selector Pitfalls
It's so easy, but so slow!
Live Your Joy
Supporting the YWCA
Read more →
jQuery and Cufon Don't Mix!
IE7+8 Bugs with VML break Sizzle

Man Scroll Bookmarklet
Another Friday Fun Bookmarklet

Happy Friday! For all you Unix lovers out there, we have a treat. Do you miss the days of "more" and "man"? Do you often miss the pleasure of knowing right where you are at in a document? Introducing the Man Scroll bookmarklet!
Read more →Opera on the iPhone
Strange bed fellows or browser coup?
I got my team together this afternoon to give the newly approved Opera Mini for iPhone/iPod touch/iPad a try. Overall we agree it's great to see another browser in this space but they've got an uphill battle if they ever hope to overtake mobile Safari. Check out the rundown of our thoughts after the jump!
Read more →Mobile Safari Keyboard Selection
Choosing the keyboard for your user
$.delegate() and you
What jQuery delegate does and why you care
Read more →
How's Your Website Look Naked?
Bookmarklet to Reveal All!
You have a beautiful website. You have filled it with love and content. You know your website better then anyone else. But have you ever seen your website naked?
Read more →How a Google Search Works (Visually)
I thought this was a great explanation on how a Google search works. Google did a great job noting that even when you search the web on Google you are not searching though everything on the internet.
The Value of Determination

When to go for it? Always!
The Ayes Have It
Where is the Line for the Lowest Price?
A Commodity of Errors
Flash's Last Stand?
The Movement Beyond Flying Text
Disable UAC Windows 7
Just as painful is finding where the UI "checkbox" is to turn it on and off.
Needless to say I ended up having to play around with the command line to turn the UAC Off and On.
To save you the trouble here it is. Read more →
Function Caching in PHP
Using static variable as a function's cache
Read more →
Let it Shine
I gotta have more cowbell

We All Win
I wrote a while ago about seeing a "To Write Love On Her Arms" t-shirt while at Disneyland while my family was there celebrating my wife's birthday. We love that place. So when we heard about their program this year about getting a day pass for giving a day of service (Give a Day, Get a Disney Day), we jumped at the opportunity.
Read more →
The Rush Toward Faceless Transactions
Time to Reclaim Some Humanity
Presumption of Excellence
The Start of the Death Spiral
The Reason for SHIFT
Celebrating Local Tech Stories
This event springs from the refrain that was often heard at the South Sound Technology Conference about how we in the South Sound need to get together and create events around technology and collaboration. The reality is that there is a ton of great stuff going on in the South Sound relating to technology, and it's about time we look around and say, "Hey this is a pretty great place to live, work, and innovate."
SVN Files Since Revision
Need List of File Since a Revision
Read more →
Holiday Volunteering at the YWCA
13 of us volunteered to wrap and label presents during two different shifts. While the first few presents seemed to take an eternity to wrap, we soon got into the swing of things and were cranking them out like nobody's business. Good thing too, as there were lots of presents to go around. Donations come from several sources: individual donations, Girl Scout troops, churches, even Hell's Angels contribute everything from toys and clothes for the kids to housewares and perfume for mom.

Read more →
SiteCrafting Honored as 3rd Fastest Growing Company
Last night, myself, Brian, Julie, Mandi, Michael, Nick, and Kirk attended the Business Examiner's Fastest Growing Companies event at the Tacoma Glass Museum. Last year, we were honored to receive the #6 spot out of 10 finalists, but this year we received third place.Finalists were selected from companies headquartered in the South Sound. The winner of the #1 spot this year was Wichert Electric Inc from Chehalis.
BCRA also won the Longevity Award for the second year running.
Congrats to Wichert Electric, BCRA and all the other finalists.
Not in the Stars, but in Ourselves
Thoughts on South Sound Technology Conference

Vanessa Behan Tour

Last week Michael and I had the opportunity to spend some time with the staff of Spokane's Vanessa Behan Crisis Nursery. As a Gear Grant recipient, we'll be working closely with the crisis nursery on giving their website an overhaul, updating it to better serve their current needs.
Amy Swanson, the nursery's Executive Director, gave us a tour of the location and let us in on both the sad and really positive things that come with running a crisis nursery. Some of the stories make you really feel for the children that can't do anything about the situations that they are in, but the amazing success stories shore up the positive work that they are doing.
Read more →Detecting when self=parent in MySQL
and not letting it ruin your day
But, sometimes things have to be their own parent. For example, if you want to report details of an element's children to the parent element, what happens at the top level of the tree? You can't outright exclude a tree element from the reporting, you can't create a placeholder element because that would skew the tree, and you can't add in a special case in your code base for that single item.
Well, you could, but you don't want to. You'd rather have a simple and elegant solution that doesn't require lots of special cases for tree levels, and that doesn't require maintenance. So what do you do?
Read more →
Hiding Behind a Maintenance Wall
Using .htaccess and Cookies to manage a maintenance page
Read more →
StackOverflow DevDay Seattle Conference
There were many interesting topics covered, from ASP.NET to Qt, and there's a few new ideas that I want to try out now.
Read more →
Adobe's BrowserLab Goes Live
Browser testing just got easier, and more shiny!

It is an unfortunate fact of internet life that not all browsers are made equal. Pages viewed in Firefox may look completely different in Internet Explorer or Safari. Most developers consider this a very frustrating part of the development process, and often wish there was an easier way to test things out. Enter Adobe's BrowserLab. Given a publicly accessible URL, BrowserLab will generate full-size images that depict how a given page will appear in various browsers.
Read more →There's No Place Like Home
Forget Kansas, It's All About Spokane
Side Project Demo Night
Show off your work that's not for work

Thursday, October 22 from 6-8pm, SiteCrafting will host a Side Project Demo Night in our conference room.
Promote from Within
Home Grown Companies Get It
Be the Connector!
Keep it Local - Keep it Simple Part Deux
Keep it Local - Keep it Simple
What city governments can do to attract and retain small business - A Series of Posts On Small Business
Appreciating Clients

I recently had the pleasure of visiting Disneyland for my wife's birthday. While it is (by my opinion, and many others') the "happiest place on earth," there are certain things that made this trip even more enjoyable. Not only did my wife receive hundreds of "Happy Birthdays" from the cast workers (due to the birthday button you get on your birthday), but I got to see some of our clients' represented as well.
Read more →PHP String Concat vs Array Implode
Which is faster? Does it matter?
Read more →
Subversion Checkouts for Live WebApps Can Be Useful, but Dangerous
The web design and development blog Smashing Magazine published an article today about a problem when using a Subversion checkout to deploy files to a live webserver. In short, anyone could browse to a directory on your website, and see all the source code, including database connection information. (Don't worry, at SiteCrafting we don't do this. We have a much better system.)
The Smashing Magazine article includes tips on how to secure common web servers. Here's another way to secure a site using two simple htaccess rules.
Read more →Doing Mobile Right
Tips for mobile-izing your site

One great side effect of having no standard way to convert a website for mobile browsing (sorry CSS, it's still not happening) is taking some time to sit down and think what should go on your mobile site.
Read more →SiteCrafting Attends LeMay Auto Show

SiteCrafting attended the 32nd Annual LeMay Car Show & Auction at Marymount Academy in Tacoma, WA on Saturday, August 29th. As the Official Website Provider for LeMay- AMERICA'S CAR MUSEUM®, SiteCrafting set up an informational booth at the event where we showcased sites we developed and made ourselves available to talk about our partnership with LeMay and other community initiatives we take part in.
Read more →Twitter Takes On Search

Traditionally search results are presented to a user because the search engine tells them these are the results that are most relevant. The end user really has no connection to that result and really doesn't understand why such a result is ranked and presented to them. Nearly all of the data in these search engines is either crawled by bots or submitted by individual sites.
The twitter search approach is much different. When you search for a topic you are presented with a bit of commentary then a link to an article or blog that relates to the topic you are searching for. The relationship information that you get when searching on twitter is what makes it important. You now have the individual's twitter name, their commentary, as well as when it was "tweeted" so you can take this all into account before you decide if that bit of information is relevant. All of the content you are searching is user submitted so only information that users feel is relevant is added to the search pool.
As usual there are people out there to game these systems but a relationship based search is definitely a smart move and I look forward to the evolution of the real-time web integrating with traditional search.
Right now each type of search has its place but be on the look for a merger of the two types. From a PR perspective its potentially a reputation management nightmare but definitely something to think about.

What are your thoughts on the future of real time search?
PHP getCaller?
How to get the calling function in PHP

PHP has great debugging functions. By wrapping one we can find out who the caller of a function is. This blog entry gives a code snippet that returns the name of the function who called the current function by looking at the debug of the stack.
Read more →jQuery 1.3 Closest Function
A quick look at an awesome function
The jQuery function $.closest() is a particularly handy function when doing DOM manipulation. I'll discuss it's power along with an example of it's use.
Read more →jQuery UI Live
Make jQuery UI Widgets Attach Dynamically
A New Take on Default Input Values
JQuery Saves The Day
1) Add class="default" and value="Some default text..." to your field. The value can be anything.
2) Include this little jquery function on the page.
$(function() {
$('.default').each(function () {
var default_val = $(this).val();
$(this).focus(
function() {
if(default_val == $(this).val()) {
$(this).val('');
}
}
).blur(
function() {
if('' == $(this).val()) {
$(this).val(default_val);
}
}
);
});
});
View a demo >
SiteCrafting Tours YWCA Facilities
It's About Time
Today, SiteCrafting teammates were given a tour of YWCA facilities in downtown Tacoma. We had the pleasure of having our tour led by Executive Director Miriam Barnett and Marketing Manager Kelly McDonald. Miriam provided some great education on history, purpose and even shared stories of current and past clients. This organization has an amazing history. YWCA of Pierce County was started in 1905 and in 1976 opened the state's first shelter for battered women. It was the largest shelter in western states at the time.
We toured this shelter and learned a lot about the building utilization, client services and the organization's plans for the future. The YWCA of Pierce County is in desperate need of additional shelter space and recently purchased a nearby building that we also toured. This new building provides a lot of potential for the organization as, in the least, it will provide more apartment style shelter space for women and children.
They are currently in the midst of a campaign to raise the funds to fully convert this new building into shelter space, and SiteCrafting is a proud partner in this campaign.
Thanks very much to Miriam and Kelly for this thoughtful and thorough tour of YWCA facilities. You both make it very easy to be inspired and excited to support YWCA initiatives.
Additional pictures of the tour are available at SiteCrafting's Flickr photostream.
Firefox 3.5 and PHP 5.3 Released
Dyslexic Developers Cry Shenanigans
LESS is More
Leaner CSS with LESS

PHP and Connecting to IBM’s AS/400
PHP IBM DB2 iSeries Database Connection
Coast Guard: New Media Mission

During the next 15 minutes, I learned that the Coast Guard had scrambled a helicopter from Port Angeles as well as a boat from Station Seattle to assist in the search. Eventually, the tweet "@All the Coast Guard is standing down from the search" was posted after learning the report came from someone that thought they saw someone in the water. Better safe than sorry, I guess.
Read more →
The Secret to Managing Employee Social Media Activity
SiteCrafting's Common Sense Approach
We're often asked by clients and partners to advise on the development of their own social media policies, and we find, more often than not, that most first runs at a social media policy are created from very paranoid perspectives. Unfortunately in this realm, micro-managing often back-fires, which is why we encourage development of policies that stay simple and respect common sense.
Read more →
Exploring SPL: Part II
Implementing ArrayAccess

In this installment, we will be exploring one of SPL's frequently used interfaces, the ArrayAccess interface. By implementing this interface, a class can allow its objects to be accessed as if they were arrays. This approach is particularly useful for setting up accessor methods for a class (getters and setters), though it can be used for almost any purpose. Let's dig a little deeper...
Read more →Things that were cool when IE6 was released
2001 was the year of the snake. People born in the year of the Snake are romantic and deep-thinking, wise and charming, although they tend to dismiss others too quickly and are a bit stingy with money. Ideal jobs for them include teaching or psychiatry. In this entry, we take a quick look at what was cool back in the year of the Snake, 2001.
Read more →The US Government 2.0
Is Data.gov the start of a more web-savvy government?

jQuery Caching Convention
A Way To Name Your jQuery Objects
Brian Forth Honored at 8th Annual Business Leadership Awards
On April 29th, Brian was awarded Small Business Leader of the Year by the UW Tacoma Milgard School of Business. The Annual Business Leadership Awards is in its 8th year, and is considered one of the premiere events for businesses in the area.
How to create a 3D pie chart in Adobe Illustrator

I'm constantly intrigued by how other designers execute different effects and styles on the web. The other day I figured out a quick way to create a fantastic looking pie chart in Adobe Illustrator.
Read more →Percentage Width Margin Table IE Bug
Do I win the prize for longest title?
Exploring SPL: Part I
The SP-whatnow?

With the advent of PHP 5.0 came a new collection of built in classes and interfaces known as the Standard PHP Library (SPL). The goal of this library is to "solve standard problems and implements some efficient data access interfaces and classes." What gives this library an edge over other third-party offerings is its tight integration into the core of the PHP language and data structures. In this series of blog posts, I will attempt to showcase some of the more useful components of this library.
Read more →MySQL Tidbits: One-shot Page Ordering
The Wonders of the FIELD() Function

LeMay - America's Car Museum Visit

How to Center a Div
Finally, a pure CSS solution!

Centering a div horizontally and vertically has always been a pain for CSS. Not any more! With this trick, you can create a centered block in no time.
Read more →The Multiple Interval JavaScript Problem
The Phantom Menace
Introducing Digital File Nuke
Delete files forever

Today, Paul and I were kicking around the idea of secure file deletion. Being able to totally delete/destroy a file is pretty essential when you've got personal information such as credit card numbers or social security numbers.
However, there aren't a lot of easy programs that will do that for Macs. Paul found a Dashboard widget, and I idly remarked that coding up a custom program wouldn't be too hard. Well, he called me on it. So, about an hour later, I came up with Digital File Nuke, a Mac app to securely delete any file.
Read more →Working in your Pajamas
Not that hard to do these days

Today at the office I was shocked though. Looking over in the office at a team of our rockstar developers I saw them all huddled around a workstation talking with their team leader Kevin. Kevin was running his weekly morning meeting with his team from Scotland! The picture quality and sound had very little lag and it was almost like he was here.
Working remotely in an industry like ours is getting more and more common. Our office makes heavy use of instant messaging, VoIP, SiteCrafting internal management system, and email allowing us to constantly be in contact and available whenever and wherever.
The amazing thing about these technologies is how easy they are to get going with them. It was painless for our team to talk and within minutes everyone was back to their jobs at hand. Communication is key for a team when individuals are working remotely. I constantly hear people from other companies complain about when a coworker is working from home since it often delays their deliverables, here not so much.
Making Legalese Easy to Understand
This is a fantastic little step forward to a better web, and one that I would love to see become more popular.

Google Voice to the Rescue
Because so many of my projects are in different niches, having a way to manage the image and voice of that project is key. Many people are familiar with business incubators where when a client calls in on a number a shared receptionist answers the phone a certain way... same idea. By having a way to file people into different accounts it helps me manage all of the people trying to contact me and allows me to prioritize responses much easier.
This all works fine except with one type of contact. My phone number. When out and about, people have asked for my cell. If I have a personal connection with them I'll give it to them but if they are more of a business contact I tell them to just email me. Out of all of the ways to contact me my cell is definitely the "bat phone" so sharing the details are much more private since it is much harder to filter out the noise.
There is a solution just around the corner that I'm extremely excited about. In 2007, many of my friends turned me onto Grand Central, but they were quickly swallowed up by Google and I was unable to get an account. Well, news just came out about it, stating that it might becoming out of closed doors soon as Google Voice.
Google Voice allows you to get an alias phone number that is then routed to your phone. Also, all voicemail becomes digitized, allowing you to play via web interface!
Check out the video:
This solution will now make it extremely easy to give out a number that you can cancel at any point, all while keeping your personal number available and private. Another great advantage is if you are working on a site targeted at a certain state or city you can get a local number that gives you the image of being local.
jQuery.live()
A new way to setup events
Kindle for iPhone
Is that a library in your pocket...?

Mapping folders to Asp.net
IIS tips and tricks

- Add a Wildcard mapping in Internet Information Services for your website
- 3rd party software, such as ISAPI 2.7 or higher
- Redirect 404 errors to 404.aspx and use Global.asax to capture the URL that caused the 404 error
Have http://www.mywebsite.com/calendar/ map to http://www.mywebsite.com/calendar.aspx
Read more →
Safari 4.0 Beta
Game Changer?

CSS Animations in WebKit
See what's new in the latest build...

Read more →
Giving Actions to Classes
Actions without JavaScript!
A concept of how to define actions using classes. Best part is, there's no need to know JavaScript!
Read more →Obama's New Home (on the Internet)
WhiteHouse.gov overhaul

At 12:00 PM, Eastern Standard Time, most eyes were on the swearing in of Barack Obama, 44th President of the United States. But at the same time, a total redesign of the President's official website, whitehouse.gov, was being launched.
Read more →Styling Inputs is Hard
jQuery to the rescue!
Internet Explorer 6 is just too old to support all the fun CSS tricks of the modern web. The Input Type selector is one of the most problematic. I suggest a quick jQuery function to get around this.
Read more →E-Cycle Washington
The project is called "E-Cycle Washington" and more information and locations can be found here .
Buckle Up!
With a little help from a client...
Our logo (the gear) lends itself to many-a-unique uses. It's been used to depict Rudolph on last year's Christmas card, a throwing star held by a ninja on some company t-shirts, and even used as a knock-off of the good 'ol Jolly Roger. We're always trying to come up with new ways to use and new things to put it on.
Read more →Visual Studio 2005 and Crystal Reports
Adding/Deploying Crystal Reports to the Web Server
Fastest Growing Companies
Thank You!
I have a five year old, who loves her daddy more than just about anything and who loves princesses and dress up. She is learning to read and is getting better at it every day. She counts on me to be there, to support her and to love her.
Read more →
ASP.net 2.0 and .htm or .html files
Methods for page redirects
Read more →
Volunteering For the Emergency Food Network
I may never eat carrots again.

Read more →
Happy Halloween
You hungry?

Free video streaming by Ustream
How to use jQuery in a Prototype world
jQuery Namespace Workarounds

Variable Resolution In Server Side Cursors
Or: Things you don't know until you do them on accident
Logically, what I wanted to do was this:
BEGINRead more →
-- set up variable to store name of table
DECLARE storedValue VARCHAR(64);
-- query to grab the value used later
SELECT firstValue
INTO storedValue
FROM FirstTable
WHERE id = 1;
-- other stuff happens here
DECLARE tableCur CURSOR FOR
SELECT *
FROM SecondTable
WHERE secondValue = storedValue;
OPEN tableCur;
tableLoop: LOOP
-- process results
END LOOP tableLoop;
CLOSE tableCur;
END
Goto Code in PHP
It's not as bad as you'd think
Sometimes, you just need a way to GOTO. Here is a little trick that will duck out of a section of code using break
Read more →Stats In MySQL Pt. III: Alphabetical Distribution
Not as snazzy-looking as my last two, but a useful query nonetheless. One the applications we built over the years, among other things, takes a list of names and addresses (currently a little over 2600), and selects around 200 of them at random. The client has been keeping track of the alphabetical distribution of last names with each random batch, and was concerned that the apparent weighting of the list toward the beginning of the alphabet was evidence that the lists were not truly random.
Fortunately I was able to get a quick statistical breakdown of the overall list, using the following:
Read more →JSCommandlet Released
JavaScript Development Made Easier

We're happy to announce a new bookmarklet called JSCommandlet. It is a JavaScript console developed for use within SiteCrafting. If you do any kind of JavaScript development, especially working with Internet Explorer, JSCommandlet is for you.
Read more →Disney PhotoPass
Real World to Web Done Right

Here's the set up. I spent a week at Disneyland with my family. Fun was had by all. I enjoyed seeing my kids enjoy the rides, the characters and the fun that is Disneyland. All in all, I took over a thousand photos and a lot of video. Where the story gets interesting is in the photos I didn't take.
Read more →
Stack Overflow: Liftoff!
A handy developer community launched yesterday.

Today marks the first day Stack Overflow opens its doors to the public. In case you're not in the know, Stack Overflow is essentially a Q&A site geared towards developers of all kinds. It takes a language/technology agnostic approach and simply provides a framework within which the community can ask and answer techincal questions. Think of it as ExpertsExchange.com except free and much more community driven.
Read more →The New .phar PHP Package
PHP now comes with a carry-on!

Today I discovered a very powerful addition to the PHP world. Phar is an archive extension for PHP that allows an entire PHP application to be packaged into a single file. It's basically PHP's answer to Java's .jar archive format. Don't get excited yet, it gets better...
Read more →First Look at Google's Chrome Browser
The Browser Wars Expandeth

Though adding another browser to our already rigorous bevvy of website testing doesn't appeal to me, having new such programs help drive web innovation is always welcome. Case in point: today's beta release of Google Chrome.
Read more →Stats in MySQL Pt. II: Histograms
Fun with ASCII graphs!

(Author's note: not necessarily actually a practical idea. But fun!)
So pictured here is a histogram of a moderately large set of random integers. Each vertical line represents the total number of entries at each particular integer. Since each number is made up of multiple random factors (10 different random numbers, each between 0 and 100, added together), the distribution tends toward a bell curve.
So how did I build the graph? Excel? PHP? Nope. Just a MySQL query.
Read more →Stats in MySQL Pt. I: Outliers
Finding spikes in your normal data

One useful tool in any statistical analysis is the identification of outliers. Assuming you have a normally distributed set of data, outliers can help to identify user error in the data entry process, or genuine spikes in the data. Once found, these numbers can be set aside for closer analysis or eliminated to normalize the data set.
There are many different methods for identifying outliers, with varying levels of rigor. Here I'll just demonstrate one of the simplest definitions: an outlier is any value greater than three standard deviations away from the mean. Read more →
iPhone Goggles
See how iPhones view your websites with iPhoney.

As mobile access to the web increases, it is becoming more and more important to ensure sites are usable on mobile devices. iPhoney attempts to address the iPhone camp with a desktop application that renders web pages within a virtual iPhone.
Read more →Let's get Sirius
Subscription Renewal Chaos

So I have a new car. Well three months old and I've been taking advantage of the FREE installed satellite radio. I have to say I was pretty certain that I'd let the system expire once the trial was over, but after commercial free radio with good music, I have to say I'm hooked.
So, when the extend your service email arrived in my Inbox Saturday, you bet I clicked to extend my service.
Read more →The Company Email Signature
No Animated Gifs here
Read more →
They Don't Build 'em Like They Used To
Websites have sure grown up
As one of the "older" employees at SiteCrafting, and as I get ever closer to the birth of my first child, I find myself mirroring my father's sentimentality by reminiscing about the "good 'ol days". Sometimes the "they don't build 'em like they used to" adage can be a wistful lament, whereas other times it can be joyful proclamation. Gone are the days of the sturdy, craftsman house with rough-cut timber and spacious attics, as we now build with prefabricated trusses, foam-filled roof sections, and 4x2 lumber that's really 3 1/2 x 1 1/2.
Read more →Website Innovation Profile #1
Lettermans Club

We all remember (at least those of us that were jocks) receiving our letter and going to the nearest sporting goods store and ordering our jackets. Typically, we chose from a limited set of styles, got measured, paid some money, and then waited 4-6 weeks for delivery. It's a process that still plays itself out in most of the country. Enter Lettermansclub.com...
Read more →
Innovation
Why are we doing this?
So much has been made of the need for innovation that people have lost track of what the word even means, they just know they need to do it. Which I guess is good if you are in the business of providing solutions that help people "innovate".
Unfortunately, every day people are "selling" innovations that ultimately serve no purpose or are just enormous time wasters.
Read more →
MySQL Login Truncation
Why yes, you can log in with an invalid username
MySQL's user table restricts user names to 16 characters (and hosts to 60). Any attempt to create a user with a longer login results in an error. However, unlike Stefan's example where a field is compared, then truncated and then inserted, MySQL actually truncates a login attempt before processing it.
Read more →
Finding the Needle in your MySQL Haystack
Fun with stored procedures pt. I
Say you've got a client, Mystery Client A. Mystery Client A has hired a marketing consultant. As a part of their rebranding efforts, they have decided to refactor their company spelling convention to MysteryClientA!, for whatever reason. That's fine for replacing a few logos, but MCA has a database-driven content management system, and their name is riddled throughout the database in page content, event description, news headlines and so forth. Your job is now to sift through the entire system and apply the newly crafted spelling to the entire database. So what do you do?
Read more →
Quick Lost Content Recovery Option
Google cache as quick fix backup

No matter how protected your website may be, sometimes you still need a helping hand when an accident happens. Delete a page while fumbling with FTP? Someone else in your office write over your work on a webpage? Heck, maybe your entire site is down! Google Cache may be able to help.
Read more →Window.Name experiment
Does anyone use it yet?
Web Semantics of a Blog Comment
Yes we are that nerdy

What do you think is the "proper" way to markup a blog comment in this image?
SEO
Stop the Insanity!
Look, we all want to be noticed. If we didn't we'd never buy flashy car rims that spin, add exhaust pipes that sound like F-16s, or wear perfume. Your website is no different, it wants to be seen and you want it be seen. Which is exactly what most Search Engine Optimization firms are counting on.
Read more →
Onload Collisions and How to Fix them
Harry Potter and the Onload Collisions
But all can be made well in JavaScript land once one of four choices is made. I give four ways to get around this problem, and suggest a way for modern browsers to be rid of this problem once and for all.
Read more →
MySQL Tidbits: The XOR Toggle
Fun with bitwise logic!

This can be handled on the PHP end with a bit of math and a counter, like so:
$count = 0;
while( $row = mysql_fetch_assoc($res) ) {
if( $count % 2 == 0 )
$background_color = 'white';
else
$background_color = 'gray';
/* OUTPUT TABLE CONTENTS WITH GIVEN BACKGROUND */
$count++;
}However, it can also be done entirely in-database, via creative use of the XOR operator: Read more →
Coding Fonts
Not just an endeavor in aesthetics!

Having recently discovered the plethora of coding fonts available online, it occurred to me that quite a bit of thought has been put into something I have always seen as rather trivial. The more I read about it, the more I have come to realize that using a font specifically designed for software development can be extremely beneficial.
Read more →Faux Paw in the Footer
Why do we put a copyright in the footer? Why not a publish date?
Read on and I promise not to use any more bad puns.
Read more →
Write .NET Applications in PHP
Say what?!

Read more →
'M' is for Model, 'V' is for View . . .
Four hilarious programming videos!
Read more →
Google's Search Appliance
The Mini in a Nutshell

Read more →
Jay Ray Think Lab
A Place to Think - For Health Care
The program included practical tips and discussion on a variety of topics, including my presentation, How to Wow! Website Innovation. Other presenters included Andrew Fry and JayRay staff.
My presentation, of course begged the question...How does one wow with the web?
Read more →
Dumping Duplicates
Deleting all semi-matching rows in MySQL
One of the more recent additions to the SiteCrafting CMS arsenal is a comprehensive error logger, tracking all PHP and MySQL errors (by default... other error types can be created on a case by case basis) that occur in new sites we build. Errors are stored in our own intranet system with a timestamp, error body and a site ID (assigned to each client at a different stage of our project workflow). The table looks something like this:
+----+---------------------+---------------+---------+
| id | logTime | text | project |
+----+---------------------+---------------+---------+
| 2 | 2008-05-14 14:42:15 | A PHP Error | 1 |
| 3 | 2008-05-14 14:42:26 | A PHP Error | 1 |
| 4 | 2008-05-14 14:42:34 | A PHP Error | 1 |
| 5 | 2008-05-14 14:42:47 | A MySQL Error | 1 |
| 6 | 2008-05-14 14:42:56 | A MySQL Error | 1 |
| 7 | 2008-05-14 14:43:05 | A PHP Error | 2 |
| 8 | 2008-05-14 14:43:10 | A PHP Error | 2 |
| 9 | 2008-05-14 14:43:21 | A MySQL Error | 2 |
+----+---------------------+---------------+---------+
8 rows in set (0.00 sec)
Obviously sometimes we get duplicate errors coming through. Aside from being mere mortals who aren't always fast enough to correct an error before it recurs, one of the first stages of debugging is to try and replicate the error. These are often pretty easy to manage. It's pretty trivial to search for all matching errors, check them all, and delete them. Sometimes, though, this just doesn't cut it. Like when there are a few different errors with 10,000 occurrences apiece.
Read more →Appreciation
An Honor and a Challenge...

Sure, we have a lot of very smart, technically minded people working here, but what's more important and worthy of recognition is the fact that we have incredible human beings working here. We have individuals committed to our customers, to our vision, to our community and to each other.
So how did this happen? And how do I live up to the challenge?
Read more →
SiteCrafting to Expand into New Markets
Find out what's next for the high-growth company...

Seeing the time as ripe for expansion, SiteCrafting has launched a new venture in an effort to expand into prescription eyewear. SightCrafters, LLC will bring to the eyewear world what SiteCrafting has brought to the web development business.
Read more →Got API?
An API reference does a method's body good...

Read more →
Change is Good

Normally government websites tend to be pretty dry and information-oriented, so I was expecting more of the same when I checked the Snoqualmie Pass traffic cameras from the WSDOT this morning. All the standard stuff that I've come to expect from years of checking the site before driving across the pass was there. However, there was one part of the site that gave me a good laugh this morning. Camera 2 was wiped out in an avalanche over the winter, but rather than a simple "Camera Unavailable" message that I've seen in the past, I saw this:
Read more →Make PHP Growl
. . . but in a good way!

I stumbled upon a fantastic PHP class today and felt compelled to comment on it. Originally written by Tyler Hall, this class allows you to send notifications to any system running Growl from a PHP script. For those of you that don't know, Growl is an application written for Mac OS X that is intended to act as a universal notification tool (much like the taskbar notification bubbles we've all come to know and love in Windows XP/Vista).
Read more →
PHP 5.3 - A Heavy Hitter in Training
PHP's next major release is just that, major!

So what's in store for us next? Find out after the jump . . .
Read more →
Touch the Vote
Rock it as well, if you must

This time of year you either get hooked or get sick of everything politics. That's right, it's a Presidential election season and the 24-hour news cable channels are firing out tons of info both via your TV and online. Some worthy strides in web development practices have also come about on one news site in particular that may help political junkies get their fix anytime, anywhere.
Read more →PHP Patterns, Part III
The TO Pattern

There is Nothing Small About Everything
Read more →
Thoughts On Creating Website Advertising Guidelines
Read more →
PHP Passes Homeland Security Test
Use open-source with more confidence

Occasionally, there's a client who remembers reading an article 4 or 5 years ago about PHP 3 having some security issues. We refer them to current articles on PHP and mention our own experiences, but the latter argument can come across as "Because we say so," which isn't a good way to get the point across.
Read more →
Anonymous Recursion with JavaScript
A new way of solving an old problem
A nice feature of JavaScript is that functions are objects. As such, they do not need a name if they are used right away. But what if you need a short anonymous recursive function? arguments.callee becomes your new best friend.
Read more →Technical Debt
What the heck am I talking about?

Read more →
Understanding Web Design at Alistapart = Holiday Joy
There isn't much more to say; it's the usual web-design-isn't-just-looks,-guys, but very eloquently and effectively worded. The kind of stuff to put on the wall.
Free Buttons

Download Buttons
Facebook Beacon: Social Media Becomes Spyware
Advertising Gone Wrong
However, their new advertising platform - Beacon - throws all this out the window. Beacon is a system that allows Facebook to track what you do on other websites. Let me reiterate that: Facebook tracks what you do online. They don't just track what you say you like on your profile, for example what movies you like; with Beacon they can track what movies you're actually renting.
Read more →
Why is AOL denying email?
Try adding a parameter to the mail() function
Email debugging is often frustrating and time consuming. There could be numerous reasons why the email you attempted to send out through your code fails: routing issues, firewalls, company servers blacklisting or blocking incoming emails, spam filters, bad DNS records, and email header requirements. The last one can definetely lead to infinite frustration, as I have experienced in the past, and was recently the cause of why AOL was denying emails generated by the php mail() function.
Read more →Star Wars IV Animated ASCII Art
A blast from the past

In a recent The Code Project Insider email newsletter, there was a link to an animated ASCII art for Star Wars IV, A New Hope. This brought back fond memories of a bygone era, where I cruised the ASCII based bulletin boards on my trusty Color Computer, the CoCo, and played ASCII art games, such as Voyage of the Valkyries (a game written by my Keithley Jr HS teacher Mr. Leo Christopherson*) and Star Trek, on my school's TRS-80 Model 4, trash 80. I also had the experience of entering the code for several ASCII art games from a book, where I learned that the GOTO statement is very dangerous, especially if you put in the wrong line number.
Read more →RescueTime: Find out where all your time is going...
(but don't tell your boss!)
Read more →
Office Star Trek: TNG marathon
To nerdly go...

That's what we did a couple Fridays ago here in the office. Brian's wife Julie is an avid Trekker and was excited to plan a Next Generation marathon with us. And we definitely put her complete series DVD collection to good use. From about 5:30pm on we watched episode after favorite episode. After a pile of snacks, some great pizza, sharing Star Trek memories, 7 episodes, it was half past midnight and time to wrap it up.
Thanks to Julie for making the trek (ha!) up and for those killer communicator cookies. We'll definitely have to do it again sometime.
Pics after the break.
Read more →DNS Propagation Explained
There's always plenty of tech-speak flying around among developers in the office. I certainly try to keep such language at a minimum when working with clients but sometimes it just works its way in there. DNS and other domain-related processes can be pretty confusing, period, let alone to someone anxious for their website to go live. So how to explain DNS propagation?
PHP Patterns, Part II
The DAO and VO Patterns

In this installment, we will be looking at two patterns that have been 'borrrowed' from Java. If you've had any development experience with J2EE, you are probably well aware of how handy Data Access Objects and Value Objects can be. If you haven't, don't fret! This article was written especially for you!
If you've never heard these terms before, you may be wondering why I have chosen to group them together within one article. The simple explanation is ... well you'll see. For now just accept that they go hand-in-hand, much like salt and pepper or peanut butter and jelly or
Excited? Let's dig deeper...
Read more →Android: The REAL Next Gen of Web Apps

If the iPhone is web apps to go, Google and the Open Handset Alliance's new open source mobile phone API, dubbed Android, is The Joy Of Cooking Webapps. Once again Google has seen a good idea (packing a cell phone full of convenient little apps and widgets that sync with websites and external systems) and figured out a way to make it a great one.
Read more →Windows Live - The Next Generation of Web Apps?
More like turn back the clock
So, I'm pretty much online all the time. I'm constantly looking for innovative applications and web services. I thought, "I'm going to have a look at what the 'big guys' are doing."
We all know Google is creating some pretty great web applications like their maps or spreadsheet apps. Seems decision makers at the big "G" have squarely set their sites on building innovative tools for web users. Surely, I thought, Microsoft has its plan and it's called Windows Live.
Read more →Confessions of a n00b: Part 1
*web developers really like snacks*
Read more →
Office Halloween costume contest
Fully one-third of the staff at SiteCrafting participated in our office Halloween contest today. Though we dressed up to win today's prize a few of us even wandered about the streets of Tacoma on our way to and from a party at local design and architectural firm BCRA. A software pirate, blogging ninja, head-crab zombie, and "J" blockhead walking down Pacific Ave. certainly drew a bit of attention.
Read more →Powered by Coffee
What do you prefer to drink while working? I'm usually a fan of mochas or red bull. Have any ridiculous stories about coworkers caffeine habits?
Apache, MySQL, and PHP on Leopard (Mac OS 10.5)
After that comes setting up Apache. Open up a terminal window, and type in "sudo pico /etc/apache2/httpd.conf". (Note that you must be a computer administrator to access the files in etc/) OS X 10.4 had Apache in /etc/httpd/, and that's part of why it didn't work after the upgrade. Find the line in httpd.conf that looks like "#LoadModule php5_module libexec/apache2/libphp5.so", and remove the # sign at the beginning. Then search for AddType, and put the following somewhere around it.
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Save the file, and exit. Then open up System Preferences in Finder, and click on Sharing. Then turn on Web Sharing. That's all you need do to to setup a webserver on Leopard, or upgrade from OS 10.4. You should be able to open up a browser, and enter http://localhost/YOUR_USERNAME/ and see that the server is running.
2007 SiteCrafting Company Retreat
No One's Missing the Trust Falls & Human Pyramids

The SiteCrafting team spent the first weekend in October enjoying the Hood Canal area as part of this year's company retreat. Being as we suffer from a distinct lack of petty office politics and other Dilbert-esque characteristics, "company retreat" is not synonymous with "endless torture" for us here.
The getaway was designed to allow the team to take a break from the office routine and gain capacity to review and offer input on company strategy, successes and our roadmap for sustaining growth. As usual, our collective wit, insight and sarcastic humor made these discussions interesting, informative, motivating and memorable.
Read more →SiteCrafting Culture Very Similar to Flickr
Here is a quick little Venn diagram comparing the two companies:

It was really cool seeing that all of the perks which make our company what it is comparable to the Yahoo funded Flickr group.

Lions and Tigers and Blogs! Oh My!
Are You Sure You Really Need That?

Don't get me wrong, there is a place for these features, but why do you need it all? How will a feature like this affect your company? What's the value add? Luckily, I've worked for ethical companies that have helped mentor clients through the process to help determine what a client really needs.
We could charge a client an arm and a leg for things they don't need, but what good is that? We are not in the business to have our clients fall. In no way is that beneficial to our Partnership. Read more →
Pirates != Web Developers
Unless they work here

Unless there's a Seahawks, Huskies, or Mariners game going on, it's pretty rare that I listen to the radio in my car, let alone anything on the AM band. Saturday was the exception as I was driving toward Seattle right after the Atlas Foundry explosion. I kept flipping between the local AM news stations, hoping to hear of any updates as I was just down the street visiting some friends about 10 minutes before the explosion. Hearing any updates required sitting through weather and traffic reports, as well as what seemed like an endless parade of commercials. One of those commercials hit upon one of my pet peeves.
Read more →A GUI Mess, or a Productivity Booster?
What's your take on the database admin debate?

Read more →
PHP Patterns, Part I
The Registry Pattern

This is the first in a planned series of articles discussing the application of various PHP patterns. If you're still getting your feet wet developing in PHP (or programming languages in general), you may be wondering what a "pattern" is in the first place. The best place to find a quick explanation is over in Wikipedia's article (which does a much better job than I could hope to do within the scope of this article).
Now, let's move on to the fun part . . .
Read more →
SiteCrafting outed for being awesome
Current clients not surprised

Dan Voelpel begs the following question in yesterday's Tacoma News Tribune: "If I asked you to name the most underrated business in Tacoma, what would you say?"
First on Voelpel's list was SiteCrafting. The article defined "underrated" by those local firms that are either well-known but who's contributions are deeper than at first glance or others, like us, who fly somewhat under the radar but do great business.
Read more →
Interact
What's the big deal?

We want to stay connected with our customers. We want customers to meet other customers. We want our potential customers to see just how easy it is to take control of their website and make it more successful. We want to give you the chance to meet others that are using our tools, that is why we have created "Interact".
We realize that people are busy. In fact, most people, when they get to the office, don't have time to even think about much of anything other than the hottest potato that has been thrown in their lap on that particular day. Rarely do they have time to get a few minutes to update their websites, even more rare, the time to strategize ways to make their website make their lives easier. That is why we believe Interact is so important.
Friday office creativity gets out of hand
Maybe next we'll break into song

Who knew a seemingly innocuous internal email would make for some good laughs and groans? I sure didn't when I invited folks from the office to join in a Friday after work pseudo-tradition.
Read more →if (date('z') == 256) echo("It's Programmers Day")
Translation: It's Programmers Day!
AJAX & IE Caching Issues
I've been working on a project that involves using the jQuery javascript library and the Ajax methods. I've been happily using the Ajax jQuery.get() method to handle simple calls, such as a link that allows a user to view a list of words based on their selection, getting the contents of a tab when the user selects a tab, and finally getting the current weather after the person enters a new zip code, which is then saved to the database.
For the last operation, I got the JavaScript working great on Firefox and I thought it was working in Internet Explorer. However, after some testing, I noticed that the same weather data was being returned, even after a new zip code on the opposite coast was selected. Mmmm, I was rather baffled, especially since I've been using this jQuery.get() on the other functions, and encountered no problems like this.
Read more →Adventures in Database Migration Pt. I
Fie on commas! Fie!

SiteCrafting is in the process of phasing out some of our older servers, and as an added bonus, the clients hosted on those servers are getting a MySQL jumpstart, leapfrogging over 4.1 to go straight from 4.0.24 to 5.0.32. Tragically, it's not quite as simple as dump | import. This is what I get for bothering my bosses for a few weeks not long after coming aboard about how nice stored procedures, updatable views, and triggers could be.
"The wonderful thing about standards," a wiser person than me once said, "is that there are so many of them." That's not the whole of it, though. One good thing about standards is that there are certain features one can generally rely upon to work, translate, port, etc. Assuming one works within them, rather than taking advantage of loopholes allowed by their not-entirely-compliant-but-we're-getting-there-and-anyway-isn't-this-way- easier-and-faster software. When people don't (and I'm not entirely innocent here), you run the risk of turning your simple upgrade into a serious project when your favorite software decides it's time to comply a bit more.
Read more →Long URLs create interesting wrap-effect in Firefox

In the process of trying to figure out what in the world was wrong with my stylesheet, I went to W3 to validate it (and, although it is irrelevant to this post, I found my problem in a typo. Isn't it always a typo?) Since I am lazy about these kinds of things, I did the validation by direct input rather than finding and uploading the actual file, and something entirely odd happened: the URL bar contained something that looked like a solid black mess. After one forced shutdown due to being worried that something had gone wrong, I copied and pasted the content of the bar into a text document and lo and behold! It was the URL (a 34 000 word one, no less, due to the direct-input validation's method of incorporating all the CSS into the URL) and because of its length, it had wrapped over itself.
Read more →Getting the Client’s IP Address
There are a number of reasons why you may want to capture a web user's IP address. You may want to only allow certain IP addresses to view your website, to allow only one vote per IP address, track unique clicks on links and buttons, a location of web users on Google Maps using MASHUP, and whatever else you can think of.
Below are a couple of examples to get the client's IP address in PHP and ASP.net, along with a couple of things to watch for.
Read more →Answer: Adaptability, Belief, Connectedness, Ideation, Activator
Question: What are my strengths?

So I mentioned earlier that I was reading the book Now Discover Your Strengths, and I have discovered mine, or at least mine as are determined by a 30 minute profile. What's strange is I never do well on these tests, I always find myself answering the questions the way I think they want me to and I wonder what that says about me...
Anyway, this is what my profile tells me. I am adaptable, have strong beliefs, believe everything is connected, thrive on coming up with ideas, and value action. My strengths are below:
Read more →PHP Code in The Background Part 2
Passing Arguments To Command Line
Fortunately, after some googling, I came across a forum post that mentioned how the global array $_SERVER["argv"] can be used to get arguments being passed through php. I then followed the link on that page to Chapter 43. Using PHP from the command line on the php.net website. Under the user contributed notes, I found a nice little function for getting the arguments and placing them into an array, similar to $_GET, $_POST, and $_REQUEST.
Read more →
ASP.net 2.0 Gridview vs. Custom Coding
A balance of needs and time
I was actually excited when I got this to work and how easy it was to do. It would only take a few minutes to create a simple, paged, sortable table where a user can delete and update records right on the page. Please note that simple is the operative word here.
Read more →
One iPhone = Web Apps to Go!
Feeding the Hype

OK, so I promised myself that I would wait until the second generation iPhone so I could let them work out the bugs and lower the price. Then I played with one and realized I had to retire my RAZR for one of these. Aesthetically, it is a knock out, but I can assure you it's beauty is way more than skin deep.
I have a hectic life, kids, business, and homebrew. All add up to a lot of demands and juggling. I've tried organizational tricks, Palm Pilot, Windows CE, Blackberry, and nothing, I mean nothing is even close to this. I'll stop gushing so that I can give you some practical examples.
What I'm Reading
So, some people are interested in what others are reading at the current moment. So I thought I'd give you a view into the sorts of things that I focus on when I'm not working on conquering the web universe.
The fact is, I am always looking for new books and new things to learn. I recently finished a book that was recommended by a client called Indomitable Spirit by Chuck Ferguson which calls itself "The essential guidebook for a lifelong journey of leadership and the rewards of meeting them".
Read more →Our clients on the road

Read more →
The Usual [browser] Suspects

Read more →
SiteCrafting'er burns it up at Hell's Kitchen

SiteCrafting'er Joe and his band This Shirt Is Pants had a gig last Friday here in Tacoma at Hell's Kitchen. A gaggle of co-workers and friends showed up and had a great time playing some pool and listening to the band.
Read more →ASP.NET 2.0 Tips - Shared Functions
Visual Basic for ASP.NET 2.0
Exceptional Service Personified
Why Les Schwab will never go out of business
Before I begin, I should set the stage. I get home from work Wednesday, and my wife tells me that the check tire pressure light is still on in the car. I've been "solving" this problem by continually adding air to the tire - not a great long term solution, I'll admit. It's kinda like adding water to a lake with a leaking dam. Anyway, we are scheduled for a vacation tomorrow that involves driving, so I decide it's better to take care of it for real at this point.
Read more →
Centering Content with CSS
It's been quiet on the SiteCrafting blog lately, mostly because we've been very busy making websites for out great clients. I've been swamped for the last two weeks with one project, and I know Kevin, Ken, Reena, and... well, everyone has a full load.
My latest few projects have all been sites that have a defined content width, say 850px, but centered in the browser window. The usual way to accomplish centering with CSS is to make the margins of the content to automatically adjust to the window (margin: 0 auto;). Usually, that happens on the specific areas, so if you have three content areas to center, you either need a container for all of those areas, or set margins three times. The first option has problems with backgrounds, and the second results in more code than is needed.
Read more →PHP PEAR and include_path
When attempting to use the SMTP library from PEAR for a project, I was having problems with including the file. I kept getting a file stream error for this code:
require 'Net/SMTP.php';I figured the problem had to be related to the include_path setting in the configuration file.
How To Run PHP Code In The Background
PHP Asynchronous Programming
You could update the configuration file for apache, or whatever web server you're running, to increase the amount of time a script page is allowed to run and then use php's ini_set("max_execution_time", seconds) to increase the amount of time php will allow a script to run.
Or you could use a session variable to mark the last position of the script and then use meta-refresh to start the script at the last position.
Or you could try an asynchronous call by using php's exec command.
Read more →
Printing without the Dialog
Read more →
PHP cURL and SSL Connection Timeout
Back in the USSR
Read more →
Character Set Troubleshooting
Over the past few weeks, Reena has been building a new website off and on for a local Jesuit parish. Everything was going along smoothly until we hit a bump in the road when dealing with a particular page with some Vietnamese text. After some small (but not obvious) changes in configuration and more research than I cared to do on the subject of character sets, it's all working properly.
Read more →Safari and PNG Headaches
For you, this means that you shouldn't use PNG images where color matching is important, use GIF instead. However, if PNG use becomes more widespread, hopefully the treatment of PNG images by browsers and OSs will become more standard and can replace GIFs - which have fewer colors and larger filesizes.
Cleaner forms through collapsible textareas
More form, less space
Some really large forms can be a bit of an eyesore especially to the people filling them out. One thing that always bothered me was how bulbous most textareas had to be just to make enough room for a user to feel they could type what they needed. So I set out to figure a good way to clean up my forms a bit while still allowing the multi-line input of textareas.
Read more →PHP Strings - Gotcha!
Read more →
Optimizing GROUP BY with Multiple LEFT JOINS
Creative use of temporary tables
At SiteCrafting, I enjoy working with a large number of different projects, each with their own requirements, technology, and problems to be solved, unfortunately, I sometimes forget about past solutions, until after I have finished writing a piece of code. Such is the case with a query that was eating up some serious processing time.
The problem was with a GROUP BY query with LEFT JOINs to several other tables and summing up totals from those joined tables. This query was taking about 4 minutes 45 seconds to run, and worse yet, it was affecting searches which had nothing to do with that query, and probably also eating up precious memory and cpu resources.
Read more →A little thought goes a long way
Why it's important to listen

Here at SiteCrafting, we are quite busy with new projects. As such, we have realized that additional staff is necessary to meet the demands for our services. With the addition of new staff members comes the need for more furniture. We also decided that this would be a great time to rearrange the office, and create 3-4 person "pods" for team collaborative purposes. So, we headed off to the furniture store that supplied us with our current desks and chairs, hoping to place an order for 14 new tables.
Read more →Design is Not Art
and neither is your website
You can see examples of this every day - in websites of art schools that are impossible to divine information out of, or in strictly information websites that have no graphical content whatsoever. In the case of these two ideas, the graphic-less sites win out in function and usability, but the art school sites look better. The problem is, that the art school sites are impossible to use, and so it doesn't matter how good they look. The clear winner here is the plain, yet content centric site. And the lesson to learn is that content is king, and communicating that information well and effectively is the key to building a good website.
Read more →
Query conservationist
The fewer the queries the better
I always enjoy trying to do my work creating web applications using the fewest number of database queries possible. It's kind of a pride thing, I guess. That and I suppose it makes to improve an app's performance and reduce the load on a server. If you're into that kind of thing. ;)
A technique I use subtitutes the temptation of using queries whose results call queries and instead uses only two.
Read more →Script Timing, v2
Making the timer look better
Last time, I outlined a way to create a simple PHP script timer. I use this timer in many of the projects that I work on, and it's really helpful to nail down trouble spots in scripts. The thing that it lacks, however, is a decent display. When you call the elapsed() function, it only gives you a number. Creating a decent display for each timer call is tedious and boring. So I simplified it. Now, I'm going to extend the existing Timer class and add some new functionality - make it look better and make it easier to call and display the information.
Making a PHP Script Timer
Read more →
Emulating Form POST in PHP
There's small choice in rotten apples.
Recently, I had a need to POST a form, using PHP script, to a remote url. As I started to research a solution, I soon realized there were very few limited options.
Read more →Prototype Documentation
Finally...
Their website is very simple and easy to use, and will quickly become one of my most visited sites. If you haven't used Prototype, I highly reccomend taking a look at its features. It makes javascript development very fast and simple, even for complex problems. I've used it to great success. I don't know how it matches up with some other javascript libraries yet, but I'm planning on reviewing all of them.
Email newsletters in Outlook 2007

One thing that we frequently build in conjunction with new websites is a tool for sending out email newsletters. For the most part, we stick to XHTML/CSS and try to stay away from using "old" layout techniques (i.e. tables) for the newsletters. This allows the greatest flexibility between the large number of email clients (e.g. Outlook, AOL, Yahoo!, Eudora, Thunderbird, Pine, etc.). Businesses love being able to quickly communicate with their customers, and email newsletters are a great way to do this. But things are changing, and if you use HTML newsletters, you'll need to make some changes too.
Read more →Diary of a Developing Developer
Learning by Doing
I never had any idea how complicated, confusing, and involved the development of web sites and web-based applications can truly be. When I was younger, every once in a while I would look at a web page and click the "view source" option and think, "Wow, that really doesn't look too difficult to learn."
Little did I know there is so much more behind the code than what is seen in that one snapshot of HTML.
Read more →Flexibility in foul weather

I'm working from home today mostly because Ma Nature dumped about six inches of snow on my house. In an area where an inch will shut down the city, this is a bit more serious. It really pays, however, to have a flexible employer so I don't have to brave the hills around town. The beauty of the web and digital communication is that it allows for these kinds of opportunities whether the weather, saving some fossil fuels, or even emergencies are concerned.
Read more →The Dependability Challenge
Striving to be Exceptional
While it is nice that we were recently recognized for dependabilty, I see it as more of a challenge. A challenge for us to do more, perform better, and have more satisfied customers.
Read more →
Let me know you care
One of the biggest, most beneficial means of communication is meeting with people face to face. There is mountains of data, information, and communication that goes on with facial gestures alone, and body language and tone of voice are equally important. Unfortunately working in a consulting agency, I don't get to meet many of the people that I'm building software for.
As a result, I have to fall back on more technical, yet less personal means of communication such as phone calls, email, and instant messaging. Here's some tips I've compiled about effectively communicating with out seeing the person you're talking to.
Read more →
Why the Best Advertising Just Might Be Free
or how you too can find a reliable professional who doesn't advertise
The Right People For Your Job

I'm in a band. Well, two of them, but only one that matters for this discussion. I've noticed that the progression of a musical group that wants to be professional on some scale in many ways closely mirrors that of any product-based business. You start out spending a certain amount of time in development. You come up with ideas, assemble the best team available to execute those ideas, and then do your level best to refine and perfect your product before you release it to the public.
Read more →Service in the storm
With all the storm-induced power problems in the Puget Sound area a few of us were able to make it into the office today. The area is a patch work of service availability -- I know of houses with power and phone but no internet access, some with no power but the phones work, and yet others with power but no phones. A stroke of service my co-worker Ken displayed today was brilliant in its simplicity but it probably meant the world to one of our clients.
Read more →The <select> Tag and innerHTML
Names 1, IDs 0

I never enjoy finding quirks in something so seemingly simple when I'm coding but it certainly happens. The following is a tale of how I ran into trouble with a couple attributes that should be worlds apart.
Read more →How My New Car Can Help Your Website
Use Functions for Readable Code
Code Soup versus Short Stories
On my way to meeting with a client, I got into a conversation about using functions in your code. One of the guys learned to write assembly first, and so his stance was that creating functions was only feasible when you used the same code more than (about) three times. That view makes a certain sense - don't deal with the overhead of creating tons of functions for stuff you'll seldom use.
I argue that you should use functions where ever possible, first because it makes code easier to generalize (and thus re-use), but also because it makes code much more readable.
Read more →Going Old School
As with most people with an email account, I receive a fair amount of spam each day. Most of it is caught by our spam filters and sent to Never-Never-Land where I won't see it. One piece of spam managed to sneak its way through last week that was just too good to ignore. With all the advancements in technology to filter out spam, how do you get your message out to thousands of email accounts? You go old school.
Read more →Going to Boise
Do you know why you have a website?
Now I'm off to the Boise Airport for my return trip to Seattle. As promised to the group...the pdf of the presentation and a copy of the handout.
Two Dollars - Follow up
In my last article, I wanted to tell developers that creating something that works perfectly is almost the only acceptable outcome of a job. For example: do you notice how the gas gauge in your car (or someone's car, if you don't have one) changes depending on the angle the car is sitting on? If the car is perfectly level, the gauge reads correctly, but on hills the level may be deceptively low or high, depending on where the sensor is in the tank. This is hardly a problem when it comes to using the car; it'll keep driving as long as there is some amount of gas in the tank, but it bugs me.
Read more →
Master of Your Domain
Take control from domain slammers and scammers
The practice preys upon unsuspecting people who want to pay their bills and keep their domain names current. After all, we have our domain name printed on every invoice, business cards, painted on our trucks, and we advertise with Google Adwords, we don't want our domain to expire. This is exactly what they count on.
Read more →
Two Dollars
Why going the extra mile always pays off
Two dollars is a small amount, but two is a magical number. Despite it's seeming insignificance, two represents the difference between doing a job, and doing it right.
One summer while I was still in college, I worked in a brewery in Colorado waiting tables. I recommend that everyone work in a restaurant at some time in their life. It teaches you a lot about life and service. While I was working there, I began to understand the value of such a small amount, and how much good work is worth.
Read more →The Joys of Object Oriented PHP
It's a nice ego boost for any prrogrammer to know they created a script/function/class that is really useful, and well designed, but at some point the code stops being well designed, and becomes gross. I think that point is when you have one script that displays an entire (SQL) table of data, views a particular row, edits that row, can delete that row, or can add new row to the table.
If my Software Engineering professor sees me doing that, I imagine that he'll reevalute my grade in his class.
Read more →
How To Full-Text Search
Inspired by Joe's MySQL Cross Table Content Search
Here's a quick how-to on implementing Full-Text Searching using Microsoft SQL Server 2005. Originally, I planned on just using LIKE statements in the WHERE clause of an sql query, however, this would not be possible since, as I posted earlier in MS SQL Server 2005 text and ntext, that string functions do not work on text and ntext data types.
That's when I remembered Joe's blog entry about Cross Table Content Search, which he also mentioned in the office a couple of times before his entry. After that, I've been wanting to implement the Cross Table Content Search, and did not get the opportunity until developing the search page for the Pierce County Library.
Read more →
Easy to Use Web Tools
Teach them to fish.

As a flyfisherman, I can say this proverb does not mean a lot to me. I've been taught, but rarely catch fish, and those I do catch, I release. However, this entry is not so much about fishing or learning to fish, it is about sharing knowledge and giving customers tools for success.
Read more →
The Web is not a Field of Dreams.
How to succeed on the Web by really, really trying
With apologies to the fine classic baseball movie…We can build it, but it doesn't mean "they" will come! I was having a conversation about this with a few people from SiteCrafting, who asked that I contribute my thoughts to the Blog.
Read more →
Bulletproof HTML Critique
Read more →
Why We Build Our Stuff from Scratch
It's never the same twice.
I mentioned to him that SiteCrafting builds our Web applications from the ground up, for each customer as an individual. We do not offer one-size fits all solutions, because just like anything one-size fits all it never fits anyone quite right.
Read more →
Cross Table Content Search
Now you say you want to search your site? All the content? And you want the results all together in one big happy sorted-by-relevancy list? How on earth am I going to do that?
Well... like this.
Read more →
MS SQL Server 2005 text and ntext
text, ntext, and image data types have been deprecated
How I discovered that text, ntext, and image data types have been deprecated and replaced by varchar(max), ntext(max), and varbinary(max).
Recently, I needed to perform a query to update a number of links for the Pierce Count Library website. I thought I could use a simple REPLACE() string function, unfortunately, this turned out not to be the case. In order to update text and ntext datatypes using a query you're limited to a few functions, in my case I would be forced to use SUBSTRING() or UPDATETEXT().
Read more →Group By Queries for MS SQL Server
Applying MySQL Wizardry to MS SQL Server
The problem was that we had one primary query to pull the records out, then, as the code looped through each record, several other queries were needed to calculate the disparate totals. That resulted in numerous database calls that slowed the entire web application. That's when Mike discovered MySQL Wizardry, that used the SUM(IF()) and the GROUP BY clause, problem solved.
Read more →
Firefox 2.0
Mozilla releases new browser when it's good and ready.
Hot on the heels of the Internet Explorer 7 release, Mozilla Firefox 2.0 is slated for official release tomorrow, but, as often happens, they have posted the full release version up on the mirrors already, so you can find what you're looking for at ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/2.0
Read more →What Customer Service Should be Like
Here's the important parts:
- If something goes wrong, tell the customer why
- Never have an action with out a success or error message
- If you can reasonably accomodate the customer's request, do so
- Respect your customer's schedule
- If the customer isn't happy, ask them why
IE 7 Out and About
Download IE 7 and let us know what you think! You can be sure we'll be doing extensive client testing and will post our thoughts as they solidify.
Navigation Nightmare pt. 1
Something no developer wants to see...
foreach ($left_elements AS $le) {
?>
<table class="leftnav_<?=$le['class']?>">
<tr>
<td class="leftnav_<?=$le['class']?>">
<a href="<?=$le['target']?>" class="<?=$le['theme']?>"><?=$le['name']?></a>
</td>
</tr>
</table>
<?
}Nobody wants to see that. Especially not seven different times with seven tiny variants covering seven different
if conditions.Each higher 'class' number is a deeper indentation. Apparently it's necessary for this class identification to be repeated for the table, table cell and link. Converting this to a nested list format (part of my current task) is going to be an adventure.
Well... at least it's indented nicely.
Smart Keyword Searching
File Extensions
Read more →
Into the Nested Table Abyss
At least it's clean code!
Read more →
A Piece of Query Cake
Making Inserts Sucks
Today, armed with only the descriptions of CodeIgniter's query helper functions, I spent 20 minutes trying to duplicate some the effect of the insert and update functions. I've never seen the code, or even used it, but I didn't have to see the code to write a similar function. Both functions take a table name and an associative array of column names and values. The update function also requires a WHERE statement, and it can't be blank. This is different from CodeIgniter, and that's so you don't accidentally reset all of the passwords in the mysql users table, or any table for that matter. And then, *poof*, the function gives you a nice sql statement.
I'll never have to write another "INSERT blah blah blah" again. Yay!
Read more →
Using What We Build
AKA Avoiding Lines at the Health Department
Read more →
The Three 'M'-igos
Why butter fingers break apps
header("Location: ...") function should pose no danger of messing up my app -- but today it did.Read more →
Welcome to Our Blog!
Welcome, and thanks for coming to the long-anticipated Blah Blah Blog! What you're going to find here is a rare peek behind the curtain at the inner workings of a leading Website and Web Application Development company. Our aim is to make this Blog different than the billions of other Blogs you could be reading. So start by expecting the unexpected.
For starters, we won't be afraid to reveal secrets or point out how we've learned from our mistakes. The main focus will be technology – but we'll also include proprietary Web tips & tricks, relevant business news, stories from the workbench, and more. Use the navigation on the right to get around, and check back regularly. Your category choices will grow as we add posts. And you never know what you'll find from day to day.
Strange Behavior with Opera 9 and Safari
Here's some background for how the navigation was supposed to work: there are five sections to the site, and each section has sub sections that show up in the navigation bar, depending on what your current location is. Navigation and sub-navigation. Also, the navigation area has a graphical background that can't change. Since the PNG spec isn't fully supported by IE yet, we had to go with GIF or JPG graphics.
Here's what it is supposed to look like (and what we ended up with):

Read more →
Baby Congrats Lunch and Bowling
Hey bowler, bowler!

It was good to get out of the office for a bit to celebrate the upcoming birth of Hiromi's baby (no, we don't know if it is a boy or a girl yet, but will soon). We all pitched in and purchased a Baby Bjorn and a baby wipe warmer. Kevin claims that a happy baby is a baby with warm wipes. Speaking from experience, I'm not so sure. Sometimes nothing, not even promises of hundred dollar bills will silence a crying newborn.
We had a fantastic time, complete with an out of body bowling experience by SiteCrafting's own David Poole. Dave's penchant for turkeys (three strikes in a row) allowed our team to coast to victory in both games.
To view more pics, have a look at Kevin's blog



