Why I love working for SugarCRM

SugarCRM Chrome Bottle Opener It’s not everyday that a man finds work that he loves. Hell, in today’s economy, a lot of men can’t find work at all, let alone rewarding work that he enjoys. I’m one of the fortunate few who has been very blessed in my career path as it relates to doing work that I enjoy doing, being good at what I do and being able to provide for my family. But I have to say that I have never been quite as happy with my job as I have been since January of this year.

Backstory
In mid-December 2011 I was approached by a recruiter through email. Why I remember this is pretty simple: he didn’t sugar coat his email with a bunch of recruiter mumbo jumbo and buzzwords, nor did he include a job description or any of that. He straight up said he was a headhunter and was looking for a Senior Software Engineer for a well funded, private company in the bay area. After a couple of emails, we setup a time to talk on the phone. That in and of itself is a rare occurrence because I don’t talk to too many recruiters since most bomb out during the email phase. But what made this an especially odd thing was that as we talked, he engaged me very quickly about what I like to do, what I am good at and what I wanted to do with my career. We talked for about a half hour and he asked me if I’d be open to interviewing with his client if he could get me in for an interview. I told him I would be for a couple of reasons, the most prominent being that A) I was looking for work as I wrapped up a short term contract project, and B) the company he was talking about – SugarCRM – was a company I had known about and was interested in for quite some time. This call took place on a Friday. On Saturday he called me to tell me that he had scheduled an interview for me on Monday, December 19 at 2:00 in Cupertino. And from here on begins the real story of why I love working for SugarCRM.

In the beginning
The Monday that I was supposed to interview came around and I hadn’t heard from the recruiter. I thought it was kinda odd but figured that maybe something needed to be hashed out on his end so I went about my business that day. Then, at about 12:30, I got an email from him with the address for SugarCRM and a message saying they were expecting me at 2:00 pm. Since I was still out with the kids I had to hustle home and get myself somewhat presentable for an interview at 2:00 in Cupertino. I did my best, and managed to get some jeans and a golf shirt on before heading out the door. I got to Sugar just before 2:00.

I was given some papers to fill out while I waited for the person that was going to interview me to come get me. Turned out, there were several people that were going to interview me and the first fellow came out pretty quick. As we walked through the halls toward the interview room I began to get a little nervous. But once we sat down and started talking, I had the pleasure of experiencing the funnest interview I had ever been on. I actually interviewed with three different Engineers, all of whom asked me questions that were both challenging but practical. And all of them had a coding exercise that we worked on together to solve. I got a really good vibe from the first three guys but when the fourth person walked in, things changed a little bit. You see, the fourth person was a VP and there really weren’t any technical questions at that point. From there it became more a matter of when I could start and some of the other logistical questions that you might find in the late stages of an interview. And when I left there, just before 5:00, I had an odd sense that it might have gone pretty well. I didn’t know how well until, about 20 minutes later, I got a call from my recruiter telling me they had drafted an offer letter for me.

I started working for SugarCRM on January 9, 2012. My first day at the office was the first day of the 2012 Sales Kickoff week. It was also the first day of an Engineering Sprint featuring a good number of engineers, including all HQ engineers and remote engineers from just about everywhere. It was chaotic to say the least, and the pace in the office that day was absolutely frenetic. In all honesty, I was a little taken aback by it all because I had never been involved in such a large scale engineering effort nor had I ever been part of a large engineering team before. But after spending my first day getting my development environment set up, I was off and running with my first assigned tasks. Looking back on those first few days at work now feels like a big blur because of how fast things went, how much I learned and how many people I met. It was a crazy, fast, amazing week and without a doubt, it was the best first week I’ve ever had at a new gig ever.

Can it really be this good?
Fast forward to today. I’ve been with Sugar for six months now. I’ve learned a lot about our product, our codebase, our engineers, our company and our future plans. I’ve survived the on-boarding process, made it through a couple of team transitions and have made some pretty decent contributions to the application. I’ve made some friends, helped some folks and have essentially become part of the team. But of all the things that the last six months have brought to my life, what stands out to me the most is how much I enjoy going to work everyday.

It might sound strange to hear someone talk about how much they love their job. I know there are a lot of people that are either out of work right now or are working at a job that is killing them slowly. I’m not trying to make anyone jealous, but I am happier in my work now than I have ever been before. And anyone that knows me knows that this is not only a truth but one that I’ve not been able to say for a long, long time.

So what is it about my job that makes it this good? Well, I’ve been thinking about that as I drive to and from work from time to time (one of the many things I love about my job is the ability to work remotely). So I decided that I’d share the love a little bit. I mean, you never know, you might just be an engineer looking for a new place to call home, right? 🙂 So here are just some of the reasons why I absolutely love working for SugarCRM, in no particular order and not necessarily inclusive of all of the reasons I love this place.

  1. What we’re working on
    I’m not sure if everyone knows yet just what CRM is. I know I didn’t until my last job, and even then, it wasn’t nearly as clear to me as it is now. Customer Relationship Management… it sounds like an industry buzzword used by someone trying to sell you something when you read it like that. But when you listen to our founder – Clint Oram – describe his vision of CRM, and what gave him the idea to develop a CRM application to begin with, you’ll see that what we are working on at Sugar is so much more than an application or a buzzword. We are working toward the success of every organization that chooses our software and services. We are working on the notion that if we can help others become successful we in turn can become successful. And the vision that our company has to ensure the continued success of our users floods our entire engineering organization. There’s just something exciting about working toward a goal that is bigger than you.

  2. How we’re working
    If, as an engineer, you’ve never been involved in agile development you are missing out. I had never been involved in true agile development, although I had employed some of the methodologies in previous jobs, so that was a bit of a shock to my system at first. But it happened that I learned to love it pretty early on and have been able to embrace the speed and iterative nature of it. There is also something to be said about accountability, which agile also necessarily involves, and the freedom to engineer in the way that works best for you while taking full credit for your successes and standing behind your mistakes. Yes, I said mistakes. They happen, even (if not especially) in agile environments. And the best part about that is, when things break, no one flies off the handle or starts panicing. You simply engineer your way through it and let your brilliance flow.

  3. Who’s doing the work
    There’s something to be said for working with absolutely brilliant people, especially when those people are really cool and really friendly while being brilliant. I have the pleasure of going to work everyday with some of the smartest, most intelligent, sharpest minds that a company could put together. These folks are from all over the world as well as right here in the United States (some are even in Cupertino 😉 ). The engineers that I get to work with are never short of ideas, never slow to offer help, are always thinking of new and challenging ideas, and simply do not even consider that something can’t be done. And it seems that there isn’t a single person in Engineering and Development that doesn’t always have some sort of idea, some knowledge that you never even knew existed or some way of doing something that is totally fresh and new.

    Something else that totally amazes me everyday are some of the names within the PHP community that I get to work with. I know that distilling things down to PHP seems a little concrete in nature, but anyone that knows me knows that I am a PHP fanboi to the core. It’s the language I learned on and the language that has led to the career that I enjoy. So for me, getting to mix it up with some of the more well known names in the PHP world on a daily basis is kind of amazing. I won’t spill the beans on these people are out of respect for their privacy, but if you are as in love with the PHP language as I am, then you’d love working here.

  4. What we’re working with
    As much a fanboi as I am of PHP, I am more a fan of doing things the right way and the best way possible. To that end, PHP is NOT the end all, be all of technologies even if it is the core technology of the product we ship. And that right there is another thing I love about Sugar. We use tools from a mixed bag of technologies. We use Ruby applications, Python applications, Java applications… we use different databases, different environments and different platforms. There isn’t anything that is really off limits when it comes to making our jobs more efficient and more effective. And this appeals to me greatly because that means that whatever is the best tool for the job, that’s the tool we get to use, even if we don’t know it that well or it isn’t the same platform as our product is.

  5. Freedom to be creative
    I’m pretty sure that of all the cool qualities of working at Sugar this one right here is the one that speaks the loudest to me. Never before have I been a part of an organization that literally puts you in the driver’s seat. When you’re given a task, you own it. What you build, you stand behind. It’s yours. And whatever it takes to allow you to be able to produce something worthy of putting your name on it, you’re allowed. Need snacks, coffee, red bull or chips? Done. Need beer? Done. Need leather couches to kick back on while you code? Done. Need to take a break and school an intern on what ping pong is really about? Done. Or perhaps you’re feeling like working in the office isn’t the best way to get things done for the day. Perhaps you want to work at a local coffee shop or even work at home. Well, guess what? You can do that to. You are literally put in command of your own destiny and given whatever tools you need to be a successful engineer.

    I don’t think I’ve ever been as productive in my work, and in as enjoyable a fashion, as I have been while at Sugar. For me, there hasn’t really been a way to not be productive because whatever makes me the best programmer I can be for that day is offered to me.

  6. The learning never ends
    Not a week goes by that I don’t learn something new from someone. The experience that our engineers have, the curiosity that we all have, the development we are all doing leads us down a path of continued learning that can only make us better as we progress toward our goals. I mean, just in the last four weeks alone, I’ve learned more about Javascript than I think I had ever known before, I’ve learned about PHPUnit data providers place in the call stack and I’ve learned about Git submodules. In the weeks and months prior I’ve learned about some oddities in the way that Google manipulates email headers when being sent through their SMTP gateway when using credentials that don’t match the sender information, I’ve learned about licensing variations and I’ve learned how to automate some common development tasks by creating macros in my IDE. I am always learning, and at the same time, I am teaching. Which allows our entire team of engineers to continue to sharpen our skills while helping other engineers sharpen theirs.

Wrapping it up
I know it sounds a lot like I’m doting on my company. The truth is, I am. I am quite literally happier in my work now than I have ever been before. I feel a sense of purpose, a sense of determination and a sense of pride in doing what I do. I feel like there is a much bigger effort at play and that, while my contribution to that effort might be small, it is still significant. And even though I’ve laid down probably 2,500 words to describe why I feel this way, those words still fail to capture the essence of why every software engineer should have the experience of working at SugarCRM.

To that end, let me say that I am so not ashamed to plug the employment opportunities at Sugar right now. We are growing so fast right now that, even though we are bringing new engineers in regularly, we are still looking for top level talent. So if you’re looking for a change in your career, and you are stellar software engineer, you really should give us a look. Making that choice has been one of the best things I’ve ever done in my life.

FULL DISCLOSURE NOTICE: The links to the open positions at SugarCRM that I’ve added to this post contains information that will associate your click through and subsequent interest in SugarCRM jobs to me. It is yet another perk of the job, getting bonuses for bringing new talent on board. If this troubles you feel free to hit the SugarCRM careers page directly. Just know that if you do that, Cthulhu will invade your sleep and eat all the kittens that you dream about nightly. Ok, that probably won’t happen, but if it does, you can’t say I didn’t warn you.

Pair programming with a child

While driving home today my daughter Alaynah asked me a little bit about what I do. After explaining to her that I am a software engineer and that I write programs, and telling her that my programs run on the internet, she asked me how Google makes that little box “that you type in to look stuff up”. I told her when we got home I’d show her since it was pretty easy to do.

When we got home we got to work. And a coupe of minutes later we had a very simple web “program” that took some text in a text box and wrote it out to the screen a certain number of times, each time making the text bigger. Not a lot of action going on there, but still something she could see that involved a text box and some programming logic. And as uneventful as this little application might have been, what it led to was amazing to say the least.

As we started to look at the words “Awesome Alaynah” explode onto my monitor in ever growing size, Alaynah began to look at the lines and count them to make sure there were as many lines of repeating text as she had selected. So we decided that it would be easier if there were numbers next to each line so we could see just how many lines were on the screen. Then, after she saw that, she asked me “is there a way to make it so if you click on a line, that all of the lines after it just disappear, including the line that you clicked on?”. I told her that I was sure there was, but that we needed a different kind of programming for that (since our original program was all PHP and click events, while potentially served by the server, are better handled on the client). So I went and got us jQuery, included it and wrote the code that made the lines disappear from the line you clicked on.

As she sat in amazement watching the lines disappear when clicked you could see that there was something troubling her. It was almost as if, when the lines were disappearing, that they were gone forever and ever. So I wrote a little bit of code that would bring the lines back if you wanted them back. She loved that. Except for the text to bring the lines back was “Bring them all back”, which works in all cases except if you disappeared the last line, because there aren’t any “all” lines, only “the” line. So she told me that we needed to change it so that if you removed the last line that to bring it back, the program should say “Bring it back” instead. So we fixed that, and after only a few minutes of conceptualizing, programming, testing, using and refactoring, Alaynah and I had put together a little program that we were both pretty proud of. You can view the source of this little program here.

Now aside from the obvious goodness that is my eight year old daughter (who happens to be turning nine tomorrow) taking an interest in the work I do, I have to say that having time to spend with my daughter – just her and me time – was a blessing. I don’t get a whole lot of one on one time with any of my kids. And even though this was only a few minutes, it was a cool few minutes that let me show my daughter what I do, let her do it with me and let us both enjoy some quality time together. I’m certain I would have loved it just as much if we had been talking about dolls, mud, cartoons or our favorite foods, but the fact is, we were talking about programming, my work, her ideas and our time together. There is a lesson in this for any parent. If your child shows any kind of interest in what you do, take the time to show him/her what it is you do. Don’t explain it with words and leave it at that. If you can take the time to allow your kids to connect with you while learning you, take that time. No excuses, no fussing, just do it.

She and I had an awesome time with this, even if it was only a few minutes. It was a great time and I am glad I didn’t pass it up because I was tired, wasn’t interested or was just unavailable.

View the source of our little program
Our original code was a little more rough around the edges than this one. After we got it working the way we wanted it I went through and cleaned things up a bit, added some comments, pulled out duplicated javascript code segments, etc. So the final product is a cleaned up rendition of our original stuff, which we hacked together very quickly in an effort to make it just work.

<?php
// Iterations max limit
$max = 30;
 
// Iterations min limit
$min = 5;
 
// User supplied iterations count
$limit = null;
 
// Handle posted values
if (!empty($_POST['limit'])) {
	$limit = intval($_POST['limit']);
	if ($limit > $max) {
		$limit = $max;
	}
 
	if ($limit < $min) {
		$limit = $min;
	}
}
 
$words = empty($_POST['words']) ? null : $_POST['words'];
?>
<html>
<head>
	<title>Alaynah's program</title>
	<style type="text/css">
		#putitback {
			color: #008;
			cursor: pointer;
			text-decoration: underline;
			margin-top: 20px;
		}
 
		.index {
			display: inline-block; 
			width: 50px;
		}
	</style>
	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
	<script type="text/javascript">
		$(function() {
			// Set the row prefix
			var rowprefix = 'row-';
 
			// The id of the clicked row to make hide from
			var rowid;
 
			// Row toggler, makes rows appear and disappear
			function toggleRows() {
				for (var i = rowid; i <= <?php echo $limit; ?>; i++) {
					$("#" + rowprefix + i).toggle();
				}
			}
 
			$('.row').click(function() {
				// Get the row id that was just clicked
				rowid = $(this).attr('id').replace(rowprefix, '');
 
				// Handle visibility toggling
				toggleRows();
 
				// Set our message for restoring rows
				var message = 'Put them all back.'
				if (rowid == <?php echo $limit; ?>) {
					// Alaynah was smart enough to see that if you only plucked
					// the last row the message should be singular
					message = 'Put it back';
				}
 
				$('#putitback').text(message);
			});
 
			// Handle restoring "removed" rows
			$('#putitback').click(function() {
				// Handle visibility toggling
				toggleRows();
 
				// Clear out the restore link since everything is back to normal
				$(this).text('');
			});
		});
	</script>
</head>
 
<body>
<h1>Alaynah&apos;s program</h1>
<form action="" method="post">
	<p>What do you want to write? <input type="text" name="words" value="<?php echo $words ?>" /></p>
	<p>How many times do you want to see it? 
		<select name="limit">
			<?php for ($i = $min; $i <= $max; $i++): ?>
			<option value="<?php echo $i ?>"<?php if ($i == $limit) echo ' selected="selected"'; ?>><?php echo $i; ?></option>
			<?php endfor; ?>
		</select>
	</p>
	<p><input type="submit" value="Hit it!" /></p>
</form>
<?php if ($limit && $words): ?>
<hr />
<?php /* Loop $limit times and make the displayed text grow each iteration */ ?>
<?php for ($i = 0; $i < $limit; $i++): $c = $i + 1; ?>
	<div class="row" id="row-<?php echo $c ?>" style="font-size: <?php echo (14 + $i); ?>px;">
		<span class="index"><?php echo $c; ?></span>
		<span><?php echo $words; ?></span>
	</div>
<?php endfor; ?>
<div id="putitback"></div>
<?php endif; ?>
</body>
</html>

Storing singleton objects in PHP sessions

A friend of mine, who is working on a sick little diet and exercise tracking application, asked me today if PHP allowed singleton objects to be stored in a session. My first reaction was absolutely they can be so long as you follow the normal rules of unserializing objects in PHP… namely, making sure the class is in scope before attempting to create an object from it OR having an autoloader that does that for you. But as I thought about it more I began to think that maybe this might not work as expected since singletons generally have no public access to their constructors. However, when an object is unserialized, it is instantiated, for lack of a better term, and populated with the data that was exposed from the serialization process.

Note: for those of you that are unfamiliar with the way PHP handles session data or are just wondering why I am using serialization so much in my examples, the basics are you start a session and PHP assigns a random MD5 hash to it as an id. You write data to the session via the $_SESSION superglobal array and when the script terminates or you call session_write_close(), PHP serializes the $_SESSION array and writes that serialized string to the file system for retrieval on subsequent requests so long as the session time limit has not expired. I really did not want to run this entire session process and inspect what was being written to my file system so I decided to mock that interaction myself by creating an arbitrary array, serializing it, grabbing the serialized string and unserializing it.

As I began to dig into this I started playing with PHP’s magic __sleep() and __wakeup() methods. Those seemed to do what I wanted them to do except in the case of protected and private properties of my class. As soon as I added those in my serialization took a crap all over itself, even when I cloned the singleton object and got the public properties exposed through get_object_vars(). So, thanks to the PHP manual – the most awesome tool in any PHP developer’s arsenal – I discovered the PHP Serializable interface.

This interface defines two methods: serialize() and unserialize(). These methods override the default behavior of __destruct() and __construct() so if you are using these you should keep that in mind and either put your __destruct() and __construct() code into these methods or allow for calls to __destruct() and __construct() from within these methods. Your homework is to decide which is the better implementation. 🙂

Now, back to the lesson at hand… the following object – let’s say it is saved to a file named dummy.php – is a super simple implementation of a basic singleton pattern. It includes both a serialize() and unserialize() method to allow it to be serialized for storage.

<?php
class DummySingleton implements Serializable {
    /**
     * Test properties of various visibility
     * @var string
     */
    public $dProp;
    public $dPropX = 'Nothing to see here folks';
    private $_prop = 'y u try see dis?';
 
    /**
     * Instance holder for this singleton
     * 
     * @var DummySingleton
     */
    private static $_instance = null;
 
    /**
     * Private singleton constructor, simply sets a property
     */
    final private function __construct() {
        $this->dProp = 'I was finally built';
    }
 
    /**
     * Singleton instance getter
     * 
     * @return DummySingleton
     */
    public static function getInstance() {
        if (self::$_instance === null) {
            self::$_instance = new DummySingleton();
        }
 
        return self::$_instance;
    }
 
    /**
     * Implementation of the Serializable interface, called automatically just 
     * before this object is serialized. This will override any calls to a
     * __destruct method, so if you have a destructor you should call it from
     * here.
     * 
     * @return string
     */
    public function serialize() {
        return serialize(get_object_vars($this));
    }
 
    /**
     * When this object is created from an unserialization this method is called. 
     * It implements the Serializable interface and uses the data from the 
     * serialize() method herein. Since this method overrides the __construct
     * method you should make any accomodations for constructing your object
     * in this method.
     */
    public function unserialize($data) {
        // "Instantiate" our singleton
        self::getInstance();
 
        // Set our values
        if (is_array($data)) {
            foreach ($data as $k => $v) {
                $this->$k = $v;
            }
        }
    }
}
?>

If you build up this object then serialize it, then rebuild it from the serialization, you can see that it remains in tact. Let’s test this by simulating the session array, first creating an array then adding the DummySingleton object to that array, then serializing it:

<?php
// Grab the class
include 'dummy.php';
 
// Get our instance
$o = DummySingleton::getInstance();
 
// Set something into it for testing
$o->setFromOutside = 'What the hell is this madness?';
 
// Make an array of stuff
$a = array();
$a['name'] = 'Robert';
$a['id'] = 23;
 
// Add the singleton
$a['dummy'] = $o;
 
// Serialize it
$s = serialize($a);
?>

The serialized output from this yields:

a:3:{s:4:"name";s:6:"Robert";s:2:"id";i:23;s:5:"dummy";C:14:"DummySingleton":187:{a:4:{s:5:"dProp";s:19:"I was finally built";s:6:"dPropX";s:25:"Nothing to see here folks";s:5:"_prop";s:16:"y u try see dis?";s:14:"setFromOutside";s:30:"What the hell is this madness?";}}}

If you take that string and subsequently load it and unserialize it then inspect it, you’ll see that the singleton object has been restored along with all private properties of it:

<?php
// $s is our serialized string from above
$o = unserialize($s);
var_dump($o);
?>

Output:

array(3) {
  ["name"]=>
  string(6) "Robert"
  ["id"]=>
  int(23)
  ["dummy"]=>
  object(DummySingleton)#1 (3) {
    ["dProp"]=>
    NULL
    ["dPropX"]=>
    string(25) "Nothing to see here folks"
    ["_prop":"DummySingleton":private]=>
    string(16) "y u try see dis?"
  }
}

Since this is, in essence, the process that PHP follows for its default session management it’s safe to say that you can, indeed, store singleton objects in a PHP session. Now onto to bigger and better questions, like…

Why would you ever want to store a singleton object instance in a PHP session?

Uninstalling Windows Live Messenger on Windows XP

The other day, while doing some routine cleanup on my machine at work, I ran into a bit of a snag when trying to uninstall Windows Live Messenger. Unlike most common software packages that include an uninstall utility, Windows Live Messenger, in a move typical of the Redmond Beast known commonly as Microsoft, does not.

After searching for a tutorial on how to remove this piece of crap software from my machine I decided to just try something.

Quick sidebar: If you are ever at the point of not trying something yourself in favor of asking someone how to do what you need to do, slap yourself three times, repeat “I am not a n00b” to yourself three times, send me $10 then try something. Seriously, just try something.

What I did was launch my Add/Remove Programs utility from the control panel (Start -> Control Panel -> Add/Remove Programs) then, after much searching, cursing and an increased disposition to hate Microsoft, finding, I decided to click on the Windows Live Essentials package and click the Change/Remove button.

From there I was presented a dialog box that gave me two options: Uninstall and Repair. I selected Uninstall and was then taken to a menu of currently installed Windows Live software. That list, for me, included one application: Messenger. I checked the box next to messenger and started the uninstall process (which I cannot show you because I was so excited to actually get this off my computer that I forgot to take screenshots… and no, I am not reinstalling it just so I can uninstall it again to get screenshots).

Anyway, after a few minutes of working and thinking and more working, Windows reported to me that the application had been successfully uninstalled. Which is way better than I can say for the instructions I found at these two links:

So if you are tired of having Messenger on your system this is the fastest and most efficient way of getting it off of there. Enjoy!

An homage to Geocities

All I can say is thank God Geocities is shutting down today. I wouldn’t have known that save for a link sent to me by my coworker. The link was to xkcd.com, one our favorite sites, which today featured a tribute to Geocities websites of old.

In case you missed it, here is the XKCD homepage today:

XKCD homage to Geocities thumbnail

Anyone else as glad as me that most of those websites (*cough* MySpace *cough*) are now off the internet?

Recovering your GoDaddy.com hosting password

Today my daughter asked me to install new themes on her blog for her. Normally this would not be a big issue. However, the last time I did any work on her blog was in 2005, when I set it up. And of course, this was like three computers ago, meaning I did not have her FTP password any longer.

So after trying all the usual passwords I would have used, then trying some passwords that made sense (knowing the way my brain operates) I decided to just reset the FTP password on her account since there was no noticeable way to recover the password in the GoDaddy hosting control panel. It wasn’t until almost 45 minutes later that I found out this was not necessary.

Slight digression: I found it somewhat odd that it would take GoDaddy between 20 and 30 minutes to change an FTP password. Really, this should take all of one minute at the most, and that is if you type really slow. Still, I was patient for a time before calling GoDaddy tech support and finding out the GoDaddy is rolling out a system upgrade today that will effectively make my password change request take five hours instead of 30 minutes. #godaddy #fail

However, while on the phone with GoDaddy tech support I was taught how to recover your password in the event I ever forget this one. Please note: I will never, ever, forget my FTP passwords on GoDaddy ever again. Ever.

Recovering your hosting password on GoDaddy
Note: The following steps assume you have access to your GoDaddy control panel. That means you should be able to log into your GoDaddy account and get to your list of hosting accounts.

  1. Log into your GoDaddy account
  2. Get to your hosting accounts:
    • Either click on Hosting under the My Products tab on the left sidebar; or
    • Click on the My Hosting Accounts under the Hosting tab in the upper navigation bar.
  3. In your hosting account list, under Control Panel column, click on the Manage Account link to open the Hosting Control Panel window.
  4. From within the Hosting Control Panel, click on the Statistics heading.
  5. click on the Configure Web Statistics icon.
  6. Under the Password Reset heading, click on the link that reads “Have your web statistics password emailed.”.

And that’s it. Even though it is disguised as a statistics package password, it is really your hosting account password. And just that simple, you have your hosting account password in a nice, plain text, easy to read and equally easy to steal format in your inbox.

ZendCon 2009: Day 3

And so ends the Zend PHP Developers Conference for 2009…

The last day of ZendCon is always a mixed bag when it comes to wrapping things up. On the one hand you, as a programmer, are loving the learning and education and networking and mixing things up with your peers. But on the other hand you, as a regular person, are tired from all the learning and education and networking and mixing things up with your peers (and drinking… and eating… and more drinking). Still, when all is said and done, all good things must come to an end. And so it goes with ZendCon.

Today started out pretty much the same as the other days except we knew we were in for a half day of sessions instead of a whole day. With that we chose the sessions we wanted to attend and headed for our rooms.

Session 0: Design Patterns for PHP developers
This was the second talk of Cal’s that I attended this ZendCon and, much like the first, Cal gave a great presentation on Design Patterns for PHP. Covering the basics of design patterns, he made sure to mention the most important patterns we could use, like Factory, Strategy, Observer, Model-View-Controller, Facade and Singleton. He made the samples very easy to understand and was quick to answer the questions asked of him.

Design Patterns have a special place in my heart as a programmer (I have given talks to local meetup groups about design patterns) and I love how knowing design patterns levels out the disparity between programming languages. Knowing them makes one language for all programmers and allows anyone from any language background to be able to communicate programming concepts and paradigms in a common tongue, if you will. That said, Cal delivered big-time in his talk on patterns. He also inspired me to pursue my ambition of putting together a PHP Design Patterns web site for developers that have not seen, or do not understand, design patterns applied to PHP.

Slide for Cal’s presentation can be downloaded here. (.pdf)

Session 1: Authorization with OAuth
Rob Richards gave a talk about OAuth and the difference between authentication and authorization. He moved pretty quickly into an actual implementation of using OAuth for authentication of a user from an application and, in my opinion, moved a little too fast into too concrete of an implementation. Still, the presentation was very informative and useful for anyone that is thinking of utilizing OAuth as an authentication mechanism.

Day 3 && ZendCon wrap-up
I was a little saddened to see the end of the conference come up so fast. Still, I am glad its over because I can use the rest.

I’m thinking next year I want to see if I can get in on giving a talk. I’d love to present and would love to not have to pay to get into the conference 🙂 . I also think that it would be freaking awesome to have a small group of the guys I have met over the last two hears at ZendCon over to my home for a BBQ or something, though I should probably bring that up with my wife before I even think of doing anything like that (I will honey, I promise 😛 ).

Overall, this year’s conference was better than last years in a couple of ways. First, the subject of many of the talks was NOT scaling. That, in and of itself, made this conference better than last year.

Second, the location was also a bit better than last year, being closer to downtown and all that being in downtown has to offer.

On the other hand, this year’s conference was deficient in several area. First off, the lack of power in the lobby and in the conference rooms was painful. Having a laptop battery with only a 38% capacity made it difficult to attend a session that didn’t have sufficient power.

Secondly, the vendor fair this year kinda sucked. It was nice to have them there, as always, but they didn’t seem to want to interact with people this year. The shirts were awesome and the shwag was also very nice -who doesn’t like free, right? Still, I think having more relevant vendors with more accessibility to relevant and pertinent information would have been nice.

Regardless, I got nothing but love for the organizers of this conference. Specifically, kudos need to go out to Eli White (@eliw) for his incredible support of the conference and attendees, and Keith Casey (@CaseySoftware) for the indescribable work he does on the conference uncon sessions. I cannot wait for ZendCon2010.

ZendCon 2009: Day 2

Yesterday was an amazing day at ZendCon. Lots of talks, lots of information, lots of networking, lots of geekdom. The day was long but very informative and at the end of it I couldn’t wait to get back for today.

Today started off a bit different than yesterday because today I was scheduled to take the Zend Framework Certification exam and my coworker was scheduled to take the Zend Certification Exam. So we got to the conference and camped out for the morning to get some last minute studying in.

As we studied we were joined by Aaron Wormus. I’m not sure why, but when presenters and other people who are widely known in PHP are close by I always feel like I am in the presence of a celebrity. Last year I was like a little kid at a football game, meeting everyone, shaking hands, being excited, enjoying the conference. This year? Well, kinda the same, except I haven’t seen to have as much time this year to find people to meet.

Still, it was nice to be able to spend a couple of hours trying to familiarize myself with the Zend Framework. The exam preparation study guide is 214 pages long, and as of 12:15, when it was lunch time, I had gotten through about 110 page of it. So much for being totally prepared for the exam.

After lunch was over my coworker and I headed to the exam room where we took our test. And wouldn’t you know it… I passed. So now I am not only a Zend Certified PHP Engineer, I am also Zend Framework certified as well. Sweet!

After the certifications were over we were able to get back into the swing of the sessions…

MySQL Server Performance Tuning 101
Cal Evans, filling in for Legaya Turmelle, did an excellent job of describing how to optimize your MySQL server and sent queries to enhance the performance of your applications. Filled with an incredible amount of technical data, this presentation was still a vibrant session that involved the attendees throughout the entire session. And I managed to sneak away two things that will be a help to me as soon as I get back to work:

/* Show all of your global variables */
mysql > SHOW GLOBAL VARIABLES;
 
/* Show your statuses */
mysql > SHOW GLOBAL STATUS;

Both of these can filter your queries by adding a “LIKE ‘%{filter}%'” to the query. Very handy pieces of information.

Architecting Your Models
Matthew Weier O’Phinney gave an awesome talk about architecting models (the M in MVC) and using your models to handle business logic. The logic that was employed was very similar to the Introduction to Zend Framework talk he gave on Monday (kudos for consistency) and covered data access, table/row gateways and service layers.

This is one of those presentations that I would recommend you get the slides for because just the programming practices employed in his presentation make it an absolutely stellar session and one that can only help you as a programmer. [Note: as soon as the links to the slides are posted I will put that link here. Sorry.]

Building Desktop RIAs with JavaScript and PHP
Ed Finkler gave a sweet presentation on taking PHP and Javascript from the web to the desktop in his talk on building Rich Internet Applications. His talk was dynamic, funny, had a couple of well handled snafus and totally captivated the audience.

Using Adobe AIR, Appcelerator’s Titanium and PHP, he built a couple of cool little desktop apps that are driven by server hosted PHP applications. Though the apps were just for example, what you can do with AIR or Titanium, jQuery and PHP is freaking amazing and I can’t wait to try some of this stuff when I get back to work.

Links to his presentation and associated code samples:

Day 2 wrap-up
Sitting here, at the end of the last session, I am overwhelmed with the amount of information I learned in the last couple of days. I am so looking forward to how ZendCon will be wrapping up tomorrow and cannot wait to meet some of the people of I haven’t yet had a chance to meet.

ZendCon 2009: Day 1

The second day of ZendCon is always a busy day. That is the day the sessions start; when you try as hard as you can to be in three places at once; where you spend half of each session reading Twitter for all #zendcon hash tags or hang out on the #zendcon IRC channel; when all you can think of outside of PHP is free swag and free beer.

Today was like that for me. Well, minus the mad rush to sit in on the morning keynote. I spent the early morning reading up on the Zend Framework so I can stand a chance at passing the ZF Certification Exam tomorrow. There is a lot to learn in that stupid manual (214 pages long – gripes!) so there was naturally lots of reading to do. After that we started the day.

Session 0: PHP 5.3 = Awesome
Ilia Alshanetsky gave this talk on PHP 5.3 and some of the new and exciting features in it. Outside the fact that Ilia never stops talking… I mean never… this talk was filled with some pretty cool stuff that a lot of programmers have been waiting for in PHP.

He opened with talking about namespaces and how they can be used. There are so many ways to utilize the namespace feature that to repeat that here would take a lot of screen real estate. I would recommend getting your hands on the slides of the presentation and reading through the first few slides. There is lots of useful information on namespaces in the slides.

The next thing he talked about was the new usage for the ternary operator. While there are, I’m sure, different ways to implement this feature, the manner in which it is implemented right now is pretty neat. Essentially you can now say “If the first condition evaluates to true, use it, otherwise use the second” without saying it exactly that way:

<?php
// We used to do this with ternary
$var = $a ? $a : $b;
 
// Now we can do this
$var = $a ?: $b;
?>

That is pretty slick in my opinion.

There was also mention of the use, internally, of the MySQLInd client library for MySQL Database Server interaction and how much overhead is being saved on select queries when not manipulating SELECT query result set data. Essentially you can cut your memory consumption in half because of this change. Sweet.

After this the talk moved into some new stuff you can do with INI files and data you can set in them. This change will make configuration pretty freaking sweet in my opinion, just because of what you can set and how you can set it. There is also some pretty nifty stuff that is happening with the DataTime built in objects in PHP. And lastly, there is a new PHP constant being introduced. That constant is E_DEPRECATED and it will be used to tell you, when you have error_reporting set to E_ALL, if what you are using in PHP 5.3 is slated for deprecation in PHP 6.

Overall this was an awesome talk. Ilia is a great speaker, knows his stuff very well and packs in about three hours worth of presentation into about an hour.

Session 1: Xdebug — PHP developer’s swiss-army knife
Presented by Derick Rethans, the author of xDebug, this presentation covered an enormous set of the features included in xDebug. Derick also talked about kcachegrind and utilizing xDebug with PHPUnit to cover many aspects of unit testing and debugging

Slides for Derick’s talk are available for download at his website.

Session 2: Mastering OpenXML Documents with PHP
Aaron Wormus gave an excellent talk about the PHPExcel library and how it utilizes the OpenXML standard to write complex and feature rich spreadsheets for Microsoft Excel, Open Office and other text based formats. This was very well presented session and covered several different, clearly coded examples.

Session 3: Premature Optimization Mistakes
Another awesome presentation by Ilia Alshanetsky, this session talked about some of the wrong directions programmers can go into when trying to optimize their applications. Many myths were debunked in this session, like the idea that smaller code is better code, removing comments in PHP makes your applications faster and changing your code makes it better. I even installed APC on the PHP Developer’s Network forums during this presentation to buy some performance gain without having to do any really heaving lifting.

Again, Ilia put about three hours worth of information into an hour long session and knocked it out of the park.

Session 4: Taming the Deployment Beast
Chris Cornutt, the man behind PHPDeveloper.org and joind.in, gave a hugely informative presentation about deployment and managing your applications from the start of development to the implementation of production over both teams of developers and for individual programmers.

Covering an array of various tools, practices and principles, Chris’s presentation was filled with application lifecycle management concepts, deployment practices and low level programming practices.

Slides can be downloaded here

Day 1 wrap-up
Much like last year, the first day of ZendCon was packed with information, networking, free swag (thank God for vendor fairs) and great food. Seriously%2

ZendCon 2009: Day 0

Woo to the frickin’ hoo! ZendCon 2009 is back in town!

I am fortunate enough to work for a company that believes that you should continue your education within your professional field. They back up that commitment by putting their money where their mouth is and actually spending money to send their employees to various training seminars and conferences throughout the year. And this year, like last year, ZendCon is that conference for me.

Like last year, this year opened up with the conference tutorials day. This year I chose to focus on Zend Framework and learning what I could of it. It is a fast growing framework and is quickly becoming a popular tool in the arsenal of many a PHP developer. I am seeing more and more recruiter emails that are asking for ZF experience. And it is a beast of a code base, well written and extremely well organized, developed by a team of people that are some of the biggest and brightest names in PHP development around the world.

Session 0
My day started out with an Introduction to Zend Framework by Matthew Weier O’Phinney. Matthew gave a stellar presentation on using the Zend Framework to develop a pastebin application. Covering some of the ins and outs of the MVC architecture employed by the Zend Framework, he also taught some programming practices as he started out first by developing his models, then his forms, then his controllers then his views. He taught techniques like setting view variables as their lowest PHP variable type so they are not to tightly coupled to a particular implementation should controllers or models change (like passing a result array to the view as opposed to a DB result object).

He also went into a decent amount of detail on Zend_Tool, Zend_Config, plugins and routing. In the end I felt like I could actually do something cool with the Zend Framework. Maybe not as cool as what he did, but cool nonetheless.

Now if I could just figure out those sweet vim plugins he was using…

Session 1
Seeing as the Zend Framework certification exam is being offered to conference attendees for free I figured since I am here that I would try to add to my ZCE certification. To do that I figured I’d sit in on the Zend Framework Certification Refresher course being presented by Rob Allen.

I am pretty sure I was in over my head from the start of this class. One of the first things that Rob said was that this class was not a tutorial on Zend Framework but a refresher for those that are using it regularly. For almost every component that was covered he asked the question “Who has used this?” and sadly I could not raise my hand for hardly any of them. Still, on the practice questions I did alright because much of the Zend Framework is common enough that you can expect certain behavior from it. That seemed to get me some pretty good mileage.

Of course there were lots of things that I had never seen, either. Parts of Zend_Log (and the writers, the formatters and the filters), parts of Zend_Db (the table data gateway and the row data gateway), Zend_Auth (the returns from Zend_Auth::authenticate()) and a host of other items from the framework are fodder for me reading up on.

Still, I think I can pass the exam if I don’t overthink the questions being asked. Of course, that means lots and lots of reading tonight, tomorrow, tomorrow evening and Wednesday morning.

Other happenings (and mishappenings)
When my coworker and I got to the conference and registered that we were there we noticed something missing from our registration packet. All early registrants who attended a previous ZendCon were supposed to receive a netbook for the conference. Ours was not there. Throughout the day we checked back in with the front desk, per their instruction, and found out at the end of the day that we would be getting ours tomorrow. That was a small bummer, though it had a happy ending so I am pretty stoked about that.

Something else I noticed this year was the lack of power in the rooms. Last year there was no shortage of power plugs to plug my laptop into. This year, in the first session, only the people that sat next to the walls close to an outlet could plug in. The second session was a little better in that my room had two power strips. Still, both of those were on one side of the room so if you sat on the other side of the room for the three hour session there was a decent chance that you were going to be running out of power before the end of the session.

Wireless internet this year was way better than last year for me (albeit a lot slower). Connecting to it was a snap and once I was able to power up my laptop I was able to stay connected to the internet pretty much the entire rest of the day.

Lunch was really good this year. For a boxed lunch the food was really, really good. As were the dining accommodations. My coworker and I were able to meet some new folks (a fellow from Seattle, John from Vermont and another fellow from Slovenia) as we talked about the ZCE, differences between PHP and Java and this year’s conference versus last year’s.

Ending the day this year was a little sad for me. Not because the day was over and I had to wait an entire half a day to mingle with my peers again. No, it was because of the $18 I spent on parking at the Convention Center. What. The. Hell? There was no validation either. And to top it off, the stupid ticket reader didn’t work so we had to drive around the entire garage until we found a guy that could help us.

Still, given the day as it went, I am very happy with ZendCon this year. I cannot wait until it gets into full swing tomorrow. And I really can’t wait for some of the uncons that were just posted late tonight.