If you're new here, you may want to subscribe to my RSS feed. Thanks for visiting!
Techcrunch seems to think so…
Hmm, Seems like web 2.0’s “Gem” of a framework may not be all that the zealots what you to think it is.
[Via TechnologyThree]
We have been using what we called “Scrum” for a couple of years now and I am curious as to how other organizations implement it. For us it is basically a daily staff meeting that lasts 10 minutes and you say what you did the previous 24 hours and what you are doing in the next 24 hours. We then move resources as the daily needs progress.
So my question is “What does scrum look like you to?” How do you do it? What do you use? Are you all in an office or do you have remote workers that you have to deal with.
Comment below…
I work on an application that only works in IE 6+ so moving to the mac has required me to find a way to test the application. I have found that about 90% of it works in Safari (but not FF) but the remaining 10% is critical to access at some points for testing.
Because of this I have been using Parallels running Windows 2k3. Basically the only thing I run on it is IE7 and I needed it to be able to access the Apache instance running on Leopard. Since Apache is running on 127.0.0.1, and Parallels was using shared networking, 127.0.0.1 and the actual IP address would never reach Apache.
After some looking around it appears that Parallels uses a NAT service that creates a local IP address for both the host OS (Leopard) and the guest OS (Win2k3). because of this I can use that IP address to access both machines back and forth. Here is how..
hostcomputer 10.211.55.2[the address you copied]
(I actually just changed the localhost entry to make things easier, you might not want to do that though)
That’s it. Put in http://hostcomputer in IE and it should pull up your Apache instance on Leopard.
So I ordered some letterhead and envelopes from VistaPrint about 2 months ago. I know that they have really good quality and that there are some quirks to their system… such as there is ZERO QA when it comes to their printing and you basically have to get them to reprint your order if there is ever an issue such as color etc. I have gotten business cards done and 1 set will be perfect and the other will be TOTALLY washed out. You just can’t beat their price for 4/c anything. It is worth the back-and-forth. They have been really nice about getting the order reprinted and would usually 2-day them regardless of your original shipping method.
the letterhead turned out nice but the envelopes were shifted and the bleed didn’t bleed like it was suppose to. I normally call but this time I decided just to submit my compliant via their email form since I don’t really need the letterhead until I do a mail out sometime end of April.
So I get the standard “Thank you for your email” auto-response but didn’t hear anything back from them. I didn’t think much about it since i have been busy on other things and then 2 days ago I get this email:
Dear Valued Customer,
Thank you for contacting VistaPrint, the online solution for “Best Printing. Best Price.”We apologize for responding so late to your email. We experienced a technical problem with our email processing system
and as such our team was not able to view and respond to your email. We have since corrected the error but are not able to
retrieve your email.
We do want to assist if possible. We hope that perhaps you have called us at our toll free number – 1-800-961-2075. Or if you prefer to email us,
please send us an email from our contact form - http://www.vistaprint.com/customer-care/contact-us.aspx?xnav=foot.
Again, we apologize for this situation and the inconvenience or frustration it may have caused. Please contact us with any questions or concerns.Sincerely,
Your VistaPrint
Customer Service Team
—– jay@cyber-jay.com Wrote —–
Webform Contact
The letterhead looks great but the envelopes are about an 1/8th of an inch off. The flap was suppose to have a bleed and does in the document but there is a white line along the left side when it was printed. Please reprint the envelopes.
Ok so that was the entire email… something look funny to you? Yeah the email they claim to not have is at the bottom of their email. Um ok. So you weren’t able to recover my email yet you were able to reply with it? WTF?
yeah… someone needs to smack them upside the head.
I have been doing web programming for about 10 years now… wow it really has been 10 years… and I have worked on a LOT of applications. Large ones, small ones, medium ones. Ones that are screaming fast and ones that are slooooooooooooooooow.
Well lately I have been assigned to upkeep a 4 year old application that is an enterprise level application. It is for a very large big name retail client that I am sure all of you have shopped at once in your life. This application manages a small part of their operations but for that small part it is a huge freak’n deal. The application is extremely slow and there is really no reason for it to be. There are a couple of quarky things about it that slow it down a little bit but they really only add 1-2 seconds on to a page load time so that is bareable. The one thing that really kills it is its database interaction layer. The queries are enormous. I mean I have some pretty sweet SQL skills but these make even MY head spin. I installed FusionReactor on to one of the servers in the cluster just to get an idea of some of the trouble spots in the application. I noticed one that was running on a couple of occasions in the MILLIONS of milliseconds… 1.9 million to be precise. Yes the previous developer would up the timeout on the page and add a “LOADING…” image instead of fixing the REAL issues. The query was a stored procedure so I decided to turn it back in a CFQUERY call so I could dissect it better.
The things I noticed first off was some of the things they did so that it could be a stored procedure. Like doing 2 queries and joining them together… and the second query pulled about 221,000 rows then JOINED the ones it needed which usually was only 1-10 records. Talk about inefficient. Fixing that so that it only pulled what it needed in the subselect trimmed off about 5 seconds from the 45 second page load.
The next thing I started to notice was the really issue. There pretty much was no INNER JOIN’s in the query. The person writing it had done all LEFT OUTER JOIN’s. I started going down the list and noticed that in 8 of the 10 “LOJ’s” it was data that had to be there. Take for instance they LOJ a store table that well you HAVE to have a storeID on every order. I did a quick DB call to find all orders that had a NULL storeID on them and sure enough NONE of them had a NULL storeID. 3 seconds shaved.
I went down the line looking at each LOJ and came to the one that was the killer. It was an authorization table that once again HAD to have data in it for it to return. They LOJ it and then in the code would not display the row if it was NULL… What huh?! Changed to that INNER JOIN… BAM it was now a 4 second query. Exactly 41 seconds shaved off.
So kiddies the moral of the story is DO NOT LEFT OUTER JOIN unless you really really have to. Second moral is that while we all will argue over whether StructKeyExists vs IsDefined is faster or IIF being the demise of the world the issues 90% of the time are not in your CF code but in your database. Be it your SQL queries or your indexes most of your bottleneck is the data getting to your application. Think about that from the beginning and you will have a much better programming life.
A thread was started in CF-Community about what websites are usefully implementing Web 2.0 technologies for the betterment of the UI. One that was mentioned was Netflix and the way that the UI responds to the user in a positive way.

One of the things we have to remember in UI development is that just because we can’t doesn’t mean we should. With the advent of the CFAJAX stuff in CF8 it really expands on that. I have seen a few developers use the Ajax elements just because they thought it was cool, and in the end hinder the user experience. Good uses of AJAX is when the user doesn’t even realize it. When the user experience is so transparent that the user doesn’t even know that that there is anything “magical” going on.
It’s at that time you know you have a good UI.
Derek Sivers, the guy behind CDBaby.com has a great blog post about his move to RoR then back to PHP.
Here is the comment that I posted, I just wanted to share it with you guys:
I think that most people, from these comments, missed the point of this article. This was not a technical article.
Sometimes we as programmers forget what our clients want… applications that just work. They don’t care how they just want it to do what they want it to do and do it well. If that means you can code in BASIC the best as anyone on the planet then use it! If for some reason you have 2 brains and Java is your cup of joe then DO IT. I personally use the most widely hated language, ColdFusion, and I have been using it for about 10 years now. I am really good at it and I can get things done amazingly fast. I do some fairly large platforms with it and it works very well. Adobe is still developing it, I still get paid gobs of money to program in it and I will keep using it as long as I can. Yes I still play around with RoR, PHP and .Net but if someone comes to me and says I need an app and I need it in 1 month I am going to use CF because that is what I know and it is what I work fast in. May not be the coolest on the block but for me it is what works.
Don’t just use a language because it is cool, use it because it works.
There was a recent thread on CF-Talk about bounce management for email newsletters and thought I should write a How-to on how I have done bounce management in the past. One of the things that I will start out with is that this takes a method that I feel is much cleaner but requires you to have access to a mailserver and be able to create domains on that mailserver.
First off I am going to explain how I created my mailer and some pieces and practices I used in creating it. One thing that I started out with was creating a subdomain called nl.simplesiteonline.com. This subdomain was specifically for my newsletter bounces and I could have called it bounces.simplesiteonline.com just as well.
From there I created a postoffice on our mail server to handle email for nl.simplesiteonline.com and then created a catch-all for the domain that we will just call bounces@nl.simplesiteonline.com. A catch-all is an email address that will accept email for anything@yourdomain.com that isn't specified as a mailbox. Typically this is a no no in the spam world but this box will be fairly cleaned and the domain name never used for anything other then bounce management you should be ok.
One thing about bounce emails is that every email server seems to be different in what the message is that comes back. In that email it may or may not contain the email address of the person you are trying to reach and parsing it can be a b... well you know. This is never an exact science but I found a method that can make it just that.
Since odds are that every time you subscribe someone to your newsletter you are inserting them in the database. This means that you probably have a numeric ID to represent that email address in your database. Because of this it would be really nice to know in that bounce message what that numeric ID is.... well you can!
Here is the way it is done... When you send out an email use the CFMAIL attribute from and make it something like from="newsletter@mydomain.com" and then use the failto attributes to be "bounce--#IDOfUser#@nl.simplesiteonline.com"
This creates an email that will show the from as newsletter@ but then tell the mailserver to send a bounce to "bounce--1234@nl.simplesiteonline.com"
BAM! You now have a bounce message being sent to a unique email address that the catch-all is doing to accept.
From there the fun part starts. You will need to create a page that will process your bounces@nl.simplesiteonline.com and you can set this to be a scheduled task. Let's take a look at some code...
First off we are going to go grab the email from the POP box:
You will notice that I make the max row 500 since really the max you can process in a given time is about 500 at a time.
Next you want to loop over the query that CFPOP creates and then do something with each message.
This right here is what makes this a bounce manager. I have found that the subject line WILL contain one of these 90% of the time. If you find that you need more just add them as you figure it out.
This little piece of code runs a parser that will take "bounce--1234@nl.simplesiteonline.com" and extract the 1234 which is our user's ID
Next is to unsubscribe the person from your list... their email failed, we don't need them anymore! Of course this query will depend on how you are unsubscribing them, in this case we are doing a hard delete.
This adds the UID of the email to a list so we can delete the email if it was successfully processed
I am going to delete any delayed message, out of office reply or anything automated reply
Now here is a fun one. We decided that if for some reason something gets in this box that neither has a failure notice or is an auto-reply we are going to forward it on to another email box. This is nice because it allows you to see what is falling through your filter and add the subject to one of the above "CONTAINS".
After everything this is your cleanup process that deletes emails off your POP box.
That is it. Yeah nice and simple and open for discussion!
Adam Howitt has a great post about "What Gordon Ramsay taught me about Programming". I LOVE Hell's Kitchen and literally, you can ask my wife, it is the only show I watch in the summer.
Adam has some great points that he talks about but this is one of my favorites:
Get the food out of the kitchen and on to the table fast
- Shorten the time taken to deliver pieces of each project
- Break the project into phased delivery
Just go on over and read it for yourself. This is something that makes a lot of sense!
the Twitter Blog has something posted that I thought was a nice in site.
"For stressed engineers, it's tempting to think that another solution - anything but what you're using now! - will solve all your problems. Maybe you start dreaming up the perfect framework on a whiteboard, or maybe you start scouring the web for the fastest, newest, most experimental technology. In the long run, picking a foundation you're comfortable with and making sensible iterations towards your performance goals will yield a bigger win. You have to be careful while iterating: watch your database, test thoroughly, and be ready to roll back when things break (and they will)."
ColdFusion has suffered from this. Since it's ease of use invites users to create applications that may not be the best methodologies means that sometimes legacy apps can be crap. I look at some of the stuff I wrote 8 years ago and Good Lord it makes me cringe.
Though they are talking about Ruby and the Rails framework I think that it applies to just about any language. They all have their strengths and weaknesses and in the end will probably serve about 90% of all your needs with the other 10% just being a rethink of the way you do things.
I think that if more people concentrated on making their apps better then complaining and wanting to move to the "New Kid On the Block" that their programming life would be a LOT less stressful.