PHP|Tek 2011 TDD Code

Posted 5/31/2011 By Jason

Thank you to everyone who attended my May 25th PHP|Tek talk on Test Driven Development. If you have not had a chance, please do leave feedback on joind.in.

Per the audiance request, below are the requirements, test file and source code we developed during the live tutorial.

Requirements:
Hash object
get and set function
respond to array access

Tests:

<?php

require 'simpletest/autorun.php';
require 'hash.php';

class TekTDDUnitTestCase extends UnitTestCase {
    protected $subject;
    function setup() {
        $this->subject = new Hash;
    }

    function testClassExists() {
        $this->assertTrue(class_exists('Hash'),'Hash Class does not exist');
    }
    
    function testSetMethod() {
            $this->assertNull($this->subject->set('key','value'));
    }
    function testGetMethod() {
            $key = 'foo';
            $value = 'bar'.rand(0,100);
            
            $this->subject->set($key,$value);
            $this->assertEqual     ($value, $this->subject->get($key));
    }
    function testAccessAsAnArray() {
            $key = 'foo';
            $value = 'bar'.rand(0,100);
            
            $this->subject[$key] =$value;
            $this->assertEqual($value, $this->subject[$key]);
        
    }
}

?>

hash.php

<?php

class Hash implements ArrayAccess {
    protected $store = array();
    function offsetExists($key) {
    }
    function offsetGet($key) {
        return $this->get($key);
    }
    function offsetSet($key,$value) {
        $this->set($key, $value);
    }
    function offsetUnset($key) {
    }
    function set($key, $value) {
        $this->store[$key] = $value;
    }
    function get($key) {
        return $this->store[$key];
    }
}

?>
   

Ideas of March

Posted 3/20/2011 By Jason

One of the things I love about Twitter is it enables me to stay in contact with the PHP community, and in particular the group of speaker I have come to know through PHP conferences. My friend Chris Shiflett tweeted about the “Ideas of March” calling for a revival of the blog as a form of communication for our community.

I am not sure I was ever a good contributor in this form. Jeff Moore always said his aggregator listed me as a “dinosaur” from the frequency of my posts. I stayed at home with my kids this week for spring break, and one thing I accomplished during this time was the migration of my home web and email servers to Rackspace and upgrading the software for this blog to something not as security ridden as what it had been.

As far as Twitter killing the Blogosphere, probably the story of it’s demise is greatly exaggerated. My personal blog revival will not be noticed in a sea of noise, but none the less, hopefully you can stay tuned for more updates with a bit more thought put into them than a tweet or a facebook status update in the future.

   

CodeWorks

Posted 9/29/2009 By Jason

I am winding down my “tour of duty” with the MTA crew for CodeWorks 2009. This is a really ambitious adventure, seven cities in two weeks. I was a member of the A-Team, doing 3 hour long tutorials on the first day of each city, while the B-Team was arriving. The following day, we would travel to the next city while the B-Team gave 1 hour long presentations. While some folks are signed up for the entire ordeal, I was only able to arrange for one week off, and therefore I am getting off of the train after Dallas.

My presentations were on the topic of Test Driven Development. In an attempt to make the material more interesting and useful for attendees, much of the talk is actually done with live coding. The idea is that after a brief introduction to unit testing, sitting through a simple but reasonably complete example of Test Driven Development for 45 minutes, I can then return to the presentation material and the ideas presented and potential benefits will be more tangible and accessible having had the hands on experience.

This is a copy of the presentation as it was presented in Dallas, and here is a zip file containing all of the live coding examples from all three sessions. I would really appreciate feedback from anyone who attended. Please feel free to tweet, comment on this blog, or use joind.in. If you visit this page there are links to each of the conferences and presentations for you to leave comments. Your feed back for any author is very valuable, to allow us to make any changes to make these talks more useful to audiences in the future.

The format of the trip allowed for much less “hallway track” time, at least for me on the tutorial day crew. I had a wonderful time catching up with my many PHP friends, and some new ones from among the many faces of the conference attendees. If you are attending these conferences, I highly encourage you to hang around with the speakers during the social events. You may learn as much during these times as you do attending the talks, though perhaps not on as focused of a topic. We had some great times, accompanied by good food and drink.

I got a fair dose of humility as well. I discovered it actually matters which airport in Dallas you book your return flight home from. (Note to self: next time book the return flight at the airport next to the hotel.) The upside of that little adventure was I was able to attend the the Microsoft sponsored social event hosted by Josh Holmes, who did a great job interacting with the community during our Dallas stop on the conference tour. After they departed we had a few beers, but no bottle opener. As I was attempting to open it by popping the edge of the cap on the table, from twenty feet away the server let me know “Dude, it’s a twist off”. Ah, live and learn.

Another great PHP conference in the books, now back to the grind stone.

   

Reflections on php|tek 2009

Posted 6/17/2009 By Jason

Ok, I know I am a little late on this, but I did want to post some thoughts on php|tek 2009.

I was very pleased to be a speaker again this year. On reflection one night, I realized I have been at every “tek” conference as a speaker: php|cruise, php|tropics, php|tek in Orlando and all three of the php|tek Chicago conferences. I am especially pleased because it almost did not happen this year. I had just accepted a job offer at the time the call for papers was taking place. As it ended up, I secured permission from my prospective employer one month prior to my actual start date with them and ended up submitting and presenting my Design Patterns in PHP talk.

Travel for me is just a short 2.5 hour drive from Iowa to Chicago. Two weeks before the conference took place, work decided to hold a carrier conference in Chicago, the speaker for the technical track was unable to attend, and I was asked to fill that role. This took place on Tuesday morning, so I was unable to attend the morning tutorial session. After my work speaking engagement ended, I headed back to the php|tek hotel and attended the afternoon tutorial “PHP Code Review” by Stefan Priebsch, Sebastian Bergmann and Arne Blankerts. These three experts (the co-founders of the php consultancy phpCC) held a code review session citing common example they find in reviews with companies who hire them. Unfortunately, they could not show their clients specific code, so they used examples from popular open source projects. One could characterize this as a “rip on other people’s projects” session, but I don’t think this is a fair assessment. Hopefully any project cited can take this as a bit of free consulting, and remember that while this is obviously not the best location to have a spotlight shined on your code, code bases are evolving organisms, and there were probably descent reasons why the code was structured that way originally. Code can continue to evolve as well, and this kind of a review might just be the impetus which prompts maintainers to refactor away from the problems pointed out in the session. I personally learned a new Design Anti-Pattern in this presentation (and actually referenced it in my own talk later in the week) the Prophet pattern.

I just realized if I covered every talk I went to through the week, this post would go on forever. Suffice to say, there were many great presenters there, and many time slots where I was forced to choose between multiple presentations I wanted to attend. I would be remiss if I did not point out I gave my own talk: “Design Patterns in PHP”, and here are the slides.

Some of the best parts of the conference happen outside of the presentations, and php|tek 2009 was no exception. One aspect of these conferences I have seen getting better every time is the interaction between the regular speakers and the participants in the conference. I think perhaps the greater accessibility of people through mediums like twitter make people want to meet people even more in person, and contributes to longer and more impactful interactions when people do meet in person. During one of the social events, I spoke with Ed Finkler and he told me that he had read my Design Patterns book, and that I had successfully made the whole concept of Design Patterns less academic and more accessible. This was perhaps the most rewarding comment I have had regarding the book, as it validated for me all the work I put into it; the book had the desired impact on a person whom I respect in the coding community.

One of my favorite stories from this conference was about two attendees of the php|tropics conference. I had several interactions with these two attendees during the conference. Both of them have since changed jobs, become more influential in the PHP community, and both of them were speakers during php|tek 2009! One of them is Matthew Weier O’Phinney, now leading the development of the Zend Framework for Zend, and the other was Paul M. Jones, of Solar fame, who had to put up with me on the whole flight back from Cancun to Memphis. It was so much fun to renew my friendships with these people who are now bona fide experts in the field!

One more personal story about PHP community friendships. I met Travis Swicegood online through our work on the SimpleTest project, last year we met in person at php|tek 2008. We stay connected through the wonders of social media, and I saw a tweet from him shortly after he left his job that he needed a room for the conference. I volunteered my rooms couch, and while we caught up, he gave me some great feedback on my presentation, including inspiring me to complete the “Developers Prayer.”

I love attending PHP conferences to renew friendships, to learn, and to be inspired by the creativity in the air. If you have not attended a conference, I invite you to make an effort to attend. Never underestimate the value of networking during these events; when else do you have the chance to rub elbows with (or buy a beer for) the people who wrote the language you make a living from, or who are authors or contributors to the open source projects you use every day. There is tons to learn, and many friendships to be forged. I hope to see you at php|tek 2010!

   

Seven Things

Posted 1/4/2009 By Jason

Thanks to Brian Deshong I have been tagged with the “Seven Things” meme.

  1. I was born about 5 miles (and one state over) from where I now live, but I moved to Colorado Springs when I was one year old and I consider myself “from” Colorado.
  2. I first learned to program in BASIC, so I could figure out how to cheat on games we loaded from cassette tape on Apple II computers.
  3. My father was once featured in a magazine ad for Apple. He was a junion high school teacher, paid for 1/2 of the first Apple computer purchased in the school district, and they took the picture for the ad in his classroom. They touched up his teeth in the photo, he always claimed that was the cheapest and least painful dental work he ever had.
  4. My mother noticed both of my children are “eve” babies. Caleb was born on Christmas Eve, and Madeline was born on Ground Hogs Day Eve.
  5. I normally do about 8 to 10 hours or martial arts for exercise each week, including Taekwondo, Hapkido, Brazilian Jiu-Jitsu and Kickboxing. I practice Taekwondo with Grand Master Chung E. Kim, and I practice Jiu-Jitsu with Rodrigo Uzeda at Miletich Fighting Systems in Bettendorf.
  6. Don’t tell any PHP zelots, but I actually like the Ruby syntax. Have not done anything substancial with Rails though, more small cgi and shell scripting projects with Ruby.
  7. When I was in college, I was in a group called the Society for Creative Anachronism which recreated the middle ages. There I was know as Lord Karl Wolfgerson, and I was the first Protector of the Barony of Unserhaven.

I would like to tag:

Travis Swicegood,
Jacob Taylor,
Dana Coffey,
Marcus Baker,
Harry Fuecks,
Jeff Moore, and
Dr. Horrible

Oh, and the rules: Mention the person who tagged you, post seven things people might not know about you, then tag seven more people and let them know via post to their blog or mention on twitter.

   

Changes Afoot

Posted 1/2/2009 By Jason

This morning I turned in my resignation as the “Manager of eBusiness and Commercial Systems” for Alcoa after nine and a half years with the company. Starting January 20th, I will be the “Manager of Implementation and Continuous Improvement” for the World Wide Logistics division of a large agricultural equipment manufacturer headquartered here in Moline Illinois.

My time with Alcoa has been filled with good opportunities, experiences and people. My first big project at Alcoa was the deployment of a Siebel Customer Relationship Management system, and for the rest of my career there, I have been involved in with the IT systems for the Commercial Organization. I was able to put into place a number of other systems, including Linux web servers for PHP based intranet applications, and we put into place a governance process to help ensure the projects we were working on were the most valuable to the organization. I met a number of good people along the way, and build a unique work environment for my immediate work group. I will miss working with everyone as I move on to my new opportunity.

I am really looking forward to my new direction. My immediate work will focus on working with a database of logistics data. There is quite a bit of dimensionality to this data, as it comes from all of the divisions, both inbound and outbound transportation, and import and exports, and various logistics providers as data sources. My team will also work on business process improvement projects in addition to the data related work. I believe my technical background will be very valuable to move these projects along quickly and bring significant value to John Deere in the short term.

Longer term, I am excited about the demographics as well. I will be working at the world headquarters, so there will likely be significant possibilities for advancement without requiring relocation. So far I have been impressed by the leadership and strategy I have been exposed to thus far.

Probably the biggest open question for me on the technical side will be how PHP fits into my new role. For the past year I have been doing some side consulting work for one of the third party logistics providers, creating a dashboard from a subset of the logistics data I will now be responsible for. They are very pleased with the result, but we need to determine how this might fit into the environment and longer term directions overall. Continuing this work as consulting would be a conflict of interest, fortunately I have located a very good person to turn this work over to. On the other hand, after I become acclimated to my new work, I will probably have to start the search for a good replacement for this consulting work. I suspect this role will be even less technical than my current role, so I may come to depend more on the consulting work to keep my technical skills exercised.

I found the decision process regarding this change interesting. I was not being overly aggressive about searching for new employment; I do enjoy my job and the people I work with at Alcoa. I had contacts inside of John Deere with whom I have networks who encouraged me to apply for various positions, and they have a reasonably automated means of notifying you about new positions through their external career web site. Early this fall I was approached by a head hunter on a cold call about doing some CRM work at a director level in another industrial manufacturing company. This caused me to give thought to exactly what I would like to be doing and where I should be headed with my career. It actually prompted me to respond to some friend’s inquiry regarding a PHP position which led to one of the hardest decisions I have made in a long time: declining essentially my dream technical job. Unfortunately, I didn’t have the support of my wife and the economy had just took its’ big nosedive, and would have made it potentially very uncomfortable to relocate. I interviewed for this opportunity shortly after that, but it took several months to actually materialize.

Now onward and upwards! Big changes afoot and it will be exciting to see where they lead me. Happy new year to everyone, I hope your year is filled with excitement and changes as mine is.

   

I mentioned in the Part 2 about my wife Vicki and my daughter Madeline. On Christmas Eve, 2001, my son Caleb James Sweat was born.

Madeline is quite a little lady. She will be entering the sixth grade at Riverdale Heights Elementary. She will be taking her temporary Black Belt test on the day of the reunion (Aug 9th) and she is doing very well on the Pleasant Valley Stingrays Swim Team. I think it is interesting that her strengths and weaknesses in swimming stroke were the same as mine when I swam on the Coronado High School swim team. She does very well academically. She has taken the BESTS tests the past two years, which are an 8th grade level aptitude test in which she places above the 90th percentile. She also was selected as one of four students from the 5th grade to represent the school at the Ecomeet, in which Riverdale Heights won. Madeline volunteers at the local family museum and the library.

Caleb loves to follow in his big sisters footsteps. He is on both the swim team, and will be testing for his blue belt in Taekwondo on the ninth. He will be starting 1st grade at Riverdale Heights, and is big time into Super Heroes, video games and Webkinz.

Vicki stays home to take care of the kids, and during the school year is a volunteer in the classroom. She spends much of her time ferrying kids to various activities, and is a great cook.

Our family enjoys going on vacation together. Some of our best adventures have been in Acapulco Mexico, where we have purchased a vacation time share and have returned several times. We have also taken the kids to the Bahamas, Myrtle Beach, Orlando and the Wisconsin Dells over the past couple of years.

Last summer we did quite a bit of camping, but that has not seemed to fit into our packed schedule this summer. The weather has not treated us so well this summer either, we lost a rather large tree in our back yard due to the tremendous rain and wind storms we have been having. The flooding here in the Midwest has not affected us directly, other than our sump pump turned on for the first time this year.

Personally, I enjoy doing martial arts as my main “outside of work” activity. About two months before Caleb was born, I discovered an Aikido dojo here in the quad cities. I decide to do one night a week (not actually a popular decision at the time, if you can imagine). About three years later, the landlord was disappointed in not having been paid rent, and the dojo shut down. In August 2005, Vicki located a Taekwondo program through the YMCA which Madeline joined. I began to come and participate in class along with her. In March of 2006, Caleb decided he was old enough to join, but that was going to double our monthly payment to $60 per month. In her usual cost saving maneuver, Vicki located another Taekwondo Dojang, Chung Kim’s Blackbelt Academy which we could pay $75 per month for me and the kids on a family plan. I was especially attracted to this because they had three black belt instructors for a class of ~12-15 “little tigers” (class age 4-7) which would give Caleb a lot more individual instruction and attention. The overall classes focused more on discipline and proper form, which I liked better than the more “open” style we had been instructed in before, and they had a Hapkiye class (Hapkido but the “ye” means supplemental art instead of “do” meaning path, showing this was and additional art as part of our Taekwondo curriculum, not the main art we are studying). Hapkido is the Korean version of Aikido, and is a soft style martial art in contrast with the hard style of TKD itself. We usually do Monday and Wednesday evening TKD classes, and the kids do TKD when I do Hapkiye on Friday evening. I also do Hapkiye and the TKD Blackbelt classes on Saturday mornings.

I began to watch the UFC and various other Mixed Martial Arts shows on TV for entertainment. I noticed a trend where it seemed like every third or fourth fighter was announced as being from “Bettendorf, Iowa”. Well Bettendorf is a town of 20,000, so something was going on. It turns out that Pat Miletich, former UFC lightweight champion, runs a gym and training camp for MMA fighters here. Last summer I went to get a haircut and my barber had closed up shop temporarily. I remember that the gym was just a block away so I stopped in to visit. Pat was there and showed me around the facilities, and talked with me for 15 minutes or so. Later that evening, I met my boss at a local resturant for dinner. About half way through out meal, Pat walked in and sat down at the table next to us. His dinner guests never showed up, so we invited him over to our table and had a nice conversation. I decided to take a week trial and eventually signed up for a membership. I do the 5am Ultifit on Monday, Wednesday and Friday mornings. On Wednesday and Friday mornings, I stay at 6am and do basic kickboxing. On Monday and Wednesday evenings, I attend Rodrigo Uzeda’s Bazillion Ju-Jitsu classes. These classes are right after the advanced MMA classes, so it is kind of fun to walk in as see Pat Miletich, Jens Pulver, Tim Silvia, Cory Hill, Ben Rothwell and many others working out.

Anyway, that is a brief summary of 20 years of my life. Even though I can’t attend the reunion, I hope I will run into some of my former classmates in cyberspace.

   

One day at Neural, I received a telephone call from a recruiter who asked me if I would be interested in leading a project to replace legacy systems at “A Fortune 500 Company within 45 minute commute of you”. I say “ok, who is it?” and she revealed it was Alcoa. I laughed and said I know a vice-president of Alcoa, to which I got a “sure you do” kind of response. After I hung up from her, I called Wendy Winge, who was the IT project manager I had worked with most closely at North Star Steel, who had followed Mike Coleman over to Alcoa. Mike had been the president of North Star Steel, and joined Alcoa to run the Ridged Packaging Division and was a VP of Alcoa as a whole. Mike called me back later that afternoon and said he was going to call John Collins, the president of the Mill Products division where I was looking at the job, and he was going to instruct him to “do whatever it took to get me on board”. The next day the recruiter called back and said “I don’t know what happened, but they are very eager to get your resume, you have to get it over to me right away”.

I joined Alcoa Mill Products in Bettendorf Iowa in July of 1999. I was a Project Leader, and my first job was the installation of a Customer Relationship Management system. When I joined, the business had already identified the need, and we were going through a vendor selection process. We ended up selecting Siebel, and we went live with our system in March 2000, delivering the project on time and $500,000 under budget.

My role continued to be associated with these commercial systems. I facilitated maintenance and enhancement of this CRM tool, as well as AlcoaDirect, our custom extranet solution for our customers, and various intranet applications. In January 2005, I moved to the commercial side of the business and became the Manager of eBusiness/Commercial Systems, which basically meant keep doing all of the IT work for these systems, but now be responsible for sponsoring and guiding strategy with them as well. In August 2007, my supervisor departed to join John Deere, and my role moved back into the IT department, though my title and responsibilities remain the same.

One significant thing which happened during this time frame was my introduction to the web development language PHP. During my tenure at Neural Application Corporation, I participated in an investment club called the Pentecrest Investment Club, and I continued to pursue my personal interest in Stock Options trading, and eventually formed a partnership with some members of my investment club, family, friends and work associates. This partnership was called “Sweat Equity Investments” and I managed the options trades for the group. I originally tracked the trades in an Access database, and used a report to generate static web pages which I published as the monthly accounting. I was familiar with Microsoft SQL server and ASP pages from work experience, but I did not want to pay for the license for a Windows server setup at home. I talked to my UNIX administrator, Charles Fisher, and he pointed me in the direction of the LAMP stack. LAMP stands for Linux, Apache, Mysql and PHP, though I initially used Sybase for the easy of transitioning from Microsoft SQL.

Once I had this capability, I rewrote our accounting software and made a secured website where each partner could log in, review their account, and get graphs of their account history. Since I was using all open source software which I did not have to pay for, I felt I owed something back to the community which had provided these tools, so I began to write articles about the work I was doing. Some of these were published on the Zend website, and in particular a tutorial on using JpGraph attracted the attention of a publisher named Wrox. They wanted to write a book on graphics in PHP, and I ended up writing two chapters on charting data. Two weeks after I received the two preliminary copies of the book, the parent company of Wrox went bankrupt and I never received a penny for the 1/3 of the PHP Graphics Handbook.

The cut out about half of the material I had written, so I was later able to tweak that material into a series of article for PHP Architect magazine. I began attending conferences and presenting on various PHP topics, and later wrote my second book PHP|Architect’s Guide to PHP Design Patterns.

At this point and time, PHP is a small fraction of my professional work at Alcoa, but I do some consulting work on the side to keep myself engaged (and I love it, it is fun for me).

Continued…

   

My father, whom most people from Coronado in my class would remember as Mr. Sweat, the Media Specialist on the library staff, also sold grade book software for the computer. He took a support call from a teacher in Bluegrass Iowa, but it was actually that teacher future son-in-law, who was local computer technical support for her and in conversing with my dad, mention he was doing research on Artificial Neural Networks. My dad said “Hey, that is what my son is researching too” and on the winter break of my senior year, I arrange some time to visit their main research project at North Star Steel in Wilton Iowa, which was 30 miles down the road from my grandparent’s house in Silvis, Illinois. I found it fascinating, but at that time was intending to continue going to graduate school.

Mulling things over, I decided that perhaps it would be good to earn a bit of money for a year or two, pay off some student loans, and then go back to school after that (16 years later…never happened). During spring break I went back and did a second interview, and two days before graduation I received and acceptance letter from Milltech – HOH, a tiny engineering firm in Iowa of which I was the 12th employee. I moved back to Davenport Iowa, got an apartment, and we worked in a little office on top of a Chinese restaurant in Walnut Center. We were building process control systems for mini-mill in the steel industry.

The following year, the company changed its name to Neural Applications Corporation, and moved the University of Iowa’s Oakdale Research Campus, a business incubator for the university in Coralville Iowa. We spent a year or so in the basement of one of the campus buildings, and then eventually built our own building and moved into it.

I had purchased a condo in Iowa City, and lived next door to Laura Suppel, whose family ran La Casa, a Mexican restaurant in Iowa City. Her best friend was Vicki Casey, whom I met at a few parties at her house. We eventually began dating, and later sold both of our houses and moved in together into a split level house from the 70’s on the east side of Iowa City. He father passed away, and we had our daughter Madeline Moira Sweat, who was born on February 1st, 1997.

Vicki is a twin, her brother Brad is a school teacher, and a basketball coach and referee in Minneapolis, Minnesota. There is a younger set of twin brothers, Bret who lives in Ohio, and Bart who lives in Iowa City. Their youngest of 3 kids was Abe, born on March 1st, 1997 exactly one month after Madeline.

The work I performed was always in the steel industry. I changed from installing and configuring the control systems, to managing the research and development projects for new control systems on different pieces of equipment. There were several years where I was on the road 3-4 weeks a month, and it was actually quite amazing that I was able to meet my wife at all :) .

We were looking for additional ways to apply the technologies we were using. On aspect of them was they could learn to recognize patterns in large amounts of data. We were therefore looking for problems where there was lots of data and a poorly understood underlying process. The answer to this search was the stock market, and we began to use neural networks to assess performance of stocks. This lead the company to purchase a stock market oriented portal called stockpoint.com, which was later acquired through a series of transactions and is now CBS Marketwatch. By the time I left, I was the 6th most tenured employee at a firm of 100 people.

Towards the end of my work at Neural, I was designing ASP pages which looked at data collected from PLCs (Programmable Logic Controllers) and stored in a SQL Server database. I really enjoyed this web work and it certainly has continued to play a role in my life.

Six weeks before I left, the metals portion of the company was acquired by a company called Systems Alternative, Inc. and the rest of Neural continued on in its financial sector focus. I heard the Neural acquired portion of the business was shut down one year later, so my decision to leave was on good footing for many reasons.

Continued…

   

Life Since High School

Posted 8/3/2008 By Jason

This year is my 20th high school reunion. I was looking forward to this, and had been searching the internet for when it was going to happen all last fall and winter. Late this spring a postcard arrived with the date, which I looked at and to quote Han Solo “I’ve got a bad feeling about this”. The date was August 9th, and my kids head back to school on August 13th. To top it off, this was one of three black belt testing dates per year for our school, and I am ready to test, and my best friend from high school already had plans to see a Cubs game in Chicago on that date, and to stop here and visit afterwards. All in all, the stars seem to have aligned against me attending the reunion.

None the less, the spirit to reconnect is in me as it is with many others. Facebook has turned out to be a blessing in this way, allowing me to reconnect with some of those long lost souls by reaching out across the internet. If you have a facebook account, look me up.

These blog posts are a summary of twenty years of my life since high school, for anyone who cares. It may be mostly boring drivel that nobody is interested in reading, but that is what blogs on the internet are for, right ;) This will of course be the “resume” version of my life, I won’t subject you to the real crappy parts you don’t want to read anyway, just the highlights to give you a flavor.

Part 1 of 4 – The College Years

After high school, I attended Colordao State University. I graduated in four years with a Bachelors of Science in Business Administration. I had concentrations in Finance & Real Estate, and Computer Information Systems, and I had a minor in Mathematics. I was in the University Honors Program, and I did a Senior Honors Thesis titled “The Application of Neural Networks to the Forecasting of Economic Time Series Data”.

I spent two years in the dorms at CSU, and two more years in apartments there. Some people from Coronado who attended CSU with me were Teresa Parker (lived in the same dorm I did the first two years), Lisa Bailey (married Allen Wagner), Mark Stallings (roommate with me my second year in the dorms and first year of apartments) and Jeff Whitt (my roommate the last year of college).

I did funded undergraduate research on the same topic as my honors thesis, and the professor I did research with was Dr. John Snyder. He has a cabin up on a lake in Montana on Swan Lake, near the town of Big Fork; about 45 minutes drive south of the west entrance to Glacier National Park. He spent summers there, eventually retiring to the cabin, and I went to visit him there several times.

In addition to class work, I participated in numerous extracurricular activities. Besides the usual bar hopping, I was in a group called the Society for Creative Anachronism which did recreation of the medieval times including fighting, dancing and feasting. Four all four years at CSU, I was in the CSU Ki – Aikido Club, studying the Japanese martial art of Aikido. I liked this, and took both levels of introduction to Self-Defense courses offered as PE credits as well. I joined Alpha Kappa Psi, a co-ed professional business fraternity.

Continued…

   

What is Ultifit

Posted 7/31/2008 By Jason

I keep mentioning my Ultifit classes on twitter. If anybody cares, here is a more detailed description of what Ulitfit is.

Ultifit is part of the Miletich Fighting Systems conditioning program. Googling only came up with one description.

Edit 2008-08-05: Stumbled back over the description I was looking for – MFS Ulti-fit, our Ultifit class is the Ulti-Endurance listed here.

Here at Champions in Bettendorf, Ultifit classes take place at 5am, 7am and 12pm on Mondays, Wednesdays and Fridays, and at 8:30 on Saturdays. I usually go to the 5am MWF classes. The room is setup in stations, you start at one and work your way around all of the stations. The first round is one minute at each station with 15 seconds to move between stations. We get a drink of water for a two minute rest, then we go through the entire set of stations again for 30 seconds on each with 10 seconds to get between stations. When we finish the second circuit, we then “pick you favorites” (by which he means the stations which challenge you the most) doing 2 more stations for 1 minute each.

The trainer rotates stations in and out of the mix periodically, but here is a sample of the current stations in the workout:

Center Jumps
Heavy bag on the floor, pick up a 15 lbs medicine ball. Squat with a leg on either side of the heavy bag then jump with both legs and land on the heavy bag. Jump back down to strading the bag and squat. Holding the medicine ball in front of you the whole time.

Upper Cuts
Pick up weights and do uppercuts alternating arms.

Pop-Ups
Like pushups, but your feet are on a 55cm stability ball, when you push up, you bring you knees up to your chest. Straighten out your legs and lower yourself in the pushup position.

Shoulder Rotation
Pick up a 30 lbs plate and rotate it in a circle in front of you at waist level, then behind your head and back down. Change direction of rotation half way through the exercise.

Squatting J Row
Elastic bands on the wall. Pull to tension. Squat, stand up, pull hands back to shoulders and imagine pinching a pencil between your shoulder blades. Basically the opposing muscle groups to the pop-ups.

Split Rail Jump
Like the Center Jump exercise, but keep one leg on the heavy bag and the other on the floor, then switch which leg is on the bag and on the floor while holding a medicine ball in front of you.

Renegade Row
Dumbbells in front of you, butt up in the air. Resting your hand on one of the dumbbells, lift the other up to your hip while lowering the other knee slightly, reset and repeat on the other side.

Balance Ball
One of my favorites, a 65cm stability ball. Get up on top of it and balance. Beginners start balancing on their knees, those who master that start shadow boxing or the like to introduce some instability, but that is not what the really good people do, they stand on the ball. I can actually do about 6 squats after getting up standing during the 60 minute first round.

Jack Knife
Lay down flat with medicine ball in hands. Raise up your legs strait in the air and raise your arms and the ball up to touch your legs. I do it with an 8 lbs medicine ball between my legs and the 15 lbs in my hands.

Turkish Getups
Hold a dumbbell in one arm. Lay flat on the ground. Push the dumbbell straight up in the air and rise to a standing position (without rocking, it is harder than it sounds). Change the dumbbell to the other hand in the air, then lay down and repeat.

Flip It
Take a heavy bag off of the ground from one end, lift it up and flip it over to the other side. Run to the other side and repeat back in the first direction.

Alternating Punches
Pick up hand weights and shadow box.

Giant Swing
Pick up a 45 lbs kettle bell (basically a cannonball with a handle welded on it) and swing it up in the air in front of you, change hands holding the kettle bell while it is at about eye level, then let it swing down into a squat, swing it back up in the air and repeat.

Zipper Hop
Noodle (like swimming floatie) laying on the floor, hand weights. Hop back and forth on either side of the noodle.

Stability Chop
Elastic band, lay back on 65cm stability ball, hold elastic band and chop away from the wall like the tin woodsman. Change sides half way through the exercise.

Ulti Plank
Like a normal plank, but you raise up on one arm like a push up, then bring the other arm into a full push up position, then put one elbow back down on the ground, then the other. Repeat.

Press
Lay flat on the floor and lift dumbbells from your chest straight up in the air.

Hamstring Curls
Eliptical shapped stability ball. Lay down on the ground and put your legs up on the ball, Curl you ancles back down towards your butt, straighten back out, but don’t let your butt or lower back touch the ground.

Butterfly
Elastic band and 65cm stability ball, stretch bands to tension, lay down with chest on the stability ball, then pull back the bands. Ends up looking like you are doing the butterfly stroke from swimming.

Amazing Spiderman
Hands and feet on the ground, butt up in the air. Bring knee up outside and in front of the elbow, back to starting position, bring other knee up in front of other elbow.

Dumbell Press
Standing with dumbbells in close in front of your chest, raise to straight up in the air.

Big Jump
12 2″ wrestling mats in a stack. Standing jump up on them, and then back down. Repeat. I do this one backwards during the second round.

Open Ups
Feet spread out a bit wider than shoulder width behind you, resting on one hand straight below you. Keep spine basically level and raise dumbbell in 180 degree arc from ground to straight up in the air, follow it with your head looking at the dumbbell, repeat, switch sides half way through the exercise.

   

Absolutely Hilarious

Posted 6/30/2008 By Jason

Thanks to Sebastian via Twitter in this tweet.

   

PHP Oracle Web Development

Posted 11/21/2007 By Jason

I was recently given the opportunity to review a new book on the subject of PHP and Oracle databases. We use Oracle databases nearly exclusively at work, so this seemed like a good opportunity to me.

cover imagePHP Oracle Web Development” itself resembles many other technical references available for PHP, soft cover, approximately 375 pages, from Packt Publishing. The author is Yuli Vasiliev who has written several articles for the Oracle Technical Network. A quick look over the table of contents revealed a reasonable plan of attack: Why use Oracle with PHP, how to get things setup, how to connect and use the connection. Then it proceeded into some more detailed specific topics: transactions, security, caching, XML, web services and AJAX.

The “Why use Oracle” section covered the technical capabilities and advantages of the Oracle database well, but it also highlighted the complexity of setting up an Oracle database, which is probably one of the primary stumbling blocks for anyone who was already familiar with PHP/MySQL to try transitioning to using Oracle for a database. The book touched on the Zend Core for Oracle in this chapter, and a bit more in the appendices, but this just provides the Apache/PHP/PHP Oracle Client libraries, the user still has to get an instance of Oracle up and running, which can be a somewhat daunting challenge. So, while the chapter was not an Oracle sell job, you will get a reasonably accurate picture of what the setup will involve from reading it.

The next chapter covered PHP and Oracle Connection, covers your fundamental “How do I talk to the database?” questions. This chapter (and the rest of the book) uses the PHP native OCI8 functions, though the chapter does touch on database access and abstraction libraries like PEAR DB, ADOdb and PDO. Having written a book before, I can sympathize with the decisions an author is faced with, in this case either having completely portable code which will work “cut and paste” from every example, or by introducing some kind of a database access library to eliminate some of the more tedious and repetitive code, but introduce a new dependency for the subsequent example (either the selected code library, or a custom library written for the book). Coming from a production environment, I fall down on the side of putting a database access library in place which enhances developer productivity. On the other hand, it may just be a personal pet peeve of mine, as the examples in the book remind me of code from my database administrator who insists on using native OCI functions rather than the standard access library we use throughout the rest of our code base.

The chapter on Data Processing introduces the readers to concepts like stored procedures and triggers, certainly beneficial and potentially unfamiliar concepts for anyone migrating from a PHP/MySQL background to this RDBMS. The chapter on OOP presented some initial material on refactoring, some discussion of errors and exceptions, and an introduction to some standard libraries like PEAR.

Chapter 6 covered security, and introduced using the PEAR::Auth class in combination with some custom packages. Clearly any sort of a user based authentication is going to have to be persisted somewhere, and where better than your database? This chapter did a nice job of showing how to integrate third party code like PEAR::Auth into your application while storing the underlying details in Oracle. Sometimes the same word is used for different meanings in different technical domains, and this was highlighted for me in this chapter when the author discussed both database sessions (as they related to package state) and PHP sessions. There is an impedance mismatch between these two concepts, and sometimes you had to pause a bit to decided which context of these two “sessions” is being used.

Honestly, I have not personally “drank the XML kool-aid”, and I was therefore a bit dubious when I approached the chapter on XML. I was pleasantly surprised, the author covered significant Oracle functionality in the area of XML processing which I did not have experience with (including XSLT processing and using XMLType and XQuery to fetch the stored XML data). These promise to be powerful techniques if XML is a standard you are working with.

The chapter on AJAX was another one I approached with a bit of skepticism. It would seem to be just the kind of thing being included in order to be “100% buzz-word compliant”, after all what does client side JavaScript calls have to do with the database PHP happens to be accessing? The author did a good job of both showing relevant usage (parent-child relationship management, an area AJAX certainly can help with) and also integrated some useful Oracle code to build on the XML chapter and use XSLT to return pre-formatted HTML for use in your AJAX application. Overall this chapter was a good introduction to AJAX techniques.

In summary, this book targets the niche of Oracle used in conjunction with PHP. This combination is certain to increase with the addition of PHP to the standard Oracle application stack. The book was written with no assumption on the skill level of the reader with regards to PHP. It would clearly be an asset at an organization which already has Oracle deployed, and is now starting to dip into PHP. On the other hand, the bookshelves at book stores are loaded with introductory texts for PHP, and while this book serves an outstanding role Oracle specific resource, it is probably not the best introductory source for PHP overall. The two audiences I believe would benefit the most from this book are locations which have Oracle deployed and want to start using PHP, and programmers who are not familiar with the capabilities of Oracle who would like a well written introduction to the capabilities of the Oracle database.

   

php|tek TDD live code

Posted 5/15/2007 By Jason

Many thanks to everyone who attended my Test Driven Development tutorial today at php|tek in Chicago. As promised, here is the code we developed during the live coding sections of the tutorial.

The slides I presented are available from the php|tek site here.

Our first example was a simple Hash object. The requirements we developed for the hash were:
***Hash to repond to get(key) and set(key, value)
***Hash to have isValid(key)
***load from associative array at construction
access via object notation $hash->key or $hash->key = value
***access via array notation $hash[key] or $hash[key] = value

During our session, we covered 4 out of the 5 requirements using TDD.

Here was the test case we ended up with for our Hash object:

<?php

class HashTestCase extends BaseTestCase {
    function testClass() {
        $this->assertTrue(class_exists('Hash'));
    }
    
    function testGetAndSet() {
        $hash = new Hash;
        $this->assertMethodExists($hash, 'get');
        $this->assertMethodExists($hash, 'set');
        
        $hash->set('foo', 'bar');
        $this->assertEqual('bar', $hash->get('foo'));
        $hash->set('baz', 'blah');
        $this->assertEqual('blah', $hash->get('baz'));
    }
    
    function testIsValid() {
        $hash = new Hash;
        $this->assertMethodExists($hash, 'isValid');
        
        $this->assertFalse($hash->isValid('foo'));
        $hash->set('foo', 'bar');
        $this->assertTrue($hash->isValid('foo'));
    }

    function testLoadDuringConstruction() {
        $arr = array('foo' => 'bar');
        $hash = new Hash($arr);
        
        $this->assertEqual('bar', $hash->get('foo'));
        
        $hash2 = new Hash('false');
        $hash2->set('foo','bar');
        $this->assertEqual('bar', $hash2->get('foo'));
    }
    
    function testAccessAsArray() {
        $hash = new Hash(array('foo' => 'bar'));
        $this->assertEqual('bar', $hash['foo']);
    }

}

?>

The code we developed for the Hash class was:

<?php

class Hash implements ArrayAccess {
    function __construct($vals = false) {
        $this->vals = (is_array($vals)) ? $vals : array();
    }
    protected $vals = array();
    function get($key) {
        return $this->vals[$key];
    }
    function set($key, $value) {
        $this->vals[$key] = $value;
    }
    function isValid($key) {
        return array_key_exists($key, $this->vals);
    }
    // functions to implement ArrayAccess
    function offsetExists($key) {
        return $this->isValid($key);
    }
    function offsetGet($key) {
        return $this->get($key);
    }
    function offsetSet($key, $val) {
        $this->set($key, $val);
    }
    function offsetUnset($key) {
        unset($this->vals[$key]);
    }
}

?>

After we reviewed more of the benefits of using TDD, we move on to a more meaty application: a guest book. Here was the test cases we developed:

<?php

class BaseTestCase extends UnitTestCase {
    function assertMethodExists($object, $method) {
        $this->assertTrue(method_exists($object, $method), get_class($object).' object has '.$method.' method');
    }
}

class ModelTestCase extends BaseTestCase {
    function testClass() {
        $this->assertTrue(class_exists('Guestbook'), 'Guestbook class exists');
    }
    
    function testSetDb() {
        $model = new Guestbook;
        $this->assertMethodExists($model, 'setDb');
    }
    
    function testGetComments() {
        $model = new Guestbook;
        $this->assertMethodExists($model, 'getComments');
        
        $this->assertIsA($comments = $model->getComments(), 'array'
            , 'Guestbook::getComments() returns an array [%s]');
        $this->assertTrue(count($comments)>1, 'returned more than one comment');
        $this->assertGreaterThan(
            $comments[0]['created']
            ,$comments[1]['created']
            );
            
    }
    
    function testGetCommentQueryDatabaseWithOrderByClause() {
        $model = new Guestbook;
        $db = new Mockadodb_mysql;
        $db->expectOnce('getArray', array(new WantedPatternExpectation('/order\s+by\screated\s+desc\s*$/i')));
        $model->setDb($db);
        $model->getComments();
    }
    
    function assertGreaterThan($val1, $val2) {
        $this->assertTrue($val1 > $val2, $val1.' is greater than '.$val2);
    }
}

class DbTestCase extends BaseTestCase {
    function testDbConnection() {
        $this->assertIsA($db = DB::conn(), 'adodb_mysql');
        $this->assertMethodExists($db, 'getArray');
    }
    function testAccessToGuestbookTable() {
        $db = DB::conn();
        $this->assertIsA($rs = $db->getArray('select * from Guestbook'), 'array');
        $this->assertTrue(count($rs) > 1, 'result contains more than one row');
        $expected_keys = array('name','comment','created');
        foreach(array_keys($rs[0]) as $key) {
            $this->assertTrue(in_array($key,$expected_keys), $key.' was not expected');
        }
    }
}


class PageTestCase extends WebTestCase {
    protected $url='http://gentoo/~sweatje/conf/phpt_tdd/live/guestbook.php';
    function testPage() {
        $this->get($this->url);
        $this->assertNoUnwantedPattern('/fatal error/i');
        $this->assertTitle('Live Guestbook');
        $this->assertWantedPattern(
            '~
            (<h2>\s*.*?</h2>.*?\w+.*?.*){2,}
            ~imsx');
    }
    function testInputForm() {
        $this->get($this->url);
        $this->assertFieldByName('name');
        $this->assertFieldByName('comment');
    }
}


With these test cases, we developed:

db.php:


?>
<?php

require_once 'adodb/adodb.inc.php';

class DB {
        //static class, we do not need a constructor
        private function __construct() {}

        public static function conn() {
                static $conn;
                if (!$conn) {
                        $conn = adoNewConnection('mysql');
                        $conn->connect('localhost', 'phpauser', 'phpapass', 'phpa');
                        $conn->setFetchMode(ADODB_FETCH_ASSOC);
                }
                return $conn;
        }
}

?>

model.php

<?php

/**

getComments()  sorted by most recent first
listGuestNames()
addComment() - no blank comment, no SPAM

*/

require_once 'db.php';

class Guestbook {
    protected $db;
    function __construct() {
        $this->db = DB::conn();
    }
    function setDb($db) {
        $this->db = $db;
    }
    function getComments() {
        return $this->db->getArray(
            'select 
                * 
            from Guestbook 
            order by created desc');
    }
}

?>

guestbook.php

<?php

<html>
<head>

</head>
<body>
<h1>All my comments</h1>
< ?php

require_once 'model.php';

$guestbook = new Guestbook;
foreach($guestbook->getComments() as $comment) {
    echo '<h2>', $comment['name'], '</h2>', $comment['comment'], '';
}

?>
<h1>Add your comment</h1>
<form method="post">
<input type="text" name="name"/>
<textarea name="comment"></textarea>
</form>
</body>
</html>

?>

   

So I wanted to get a little more storage space on an MP3 player, and Geeks.com comes along and sends me a deal on a 4Gb RCA Lyra RD2762. I pick one up, get it Friday, load it up with 1.7Gb or so of MP3 files, and played a few tunes on it. My main system at home runs Gentoo Linux, and it was trivial to plug it into the USB port and mount /dev/hda for copying the files. I was fairly happy with my purchase at this point.

On Monday, I took it into work with me, tried to copy off some of the files onto another thumb drive I have there, and ended up with a “File System Corrupted” error.

That was it, the thing was dead in the water, you turn it on, it clicked and whirred for a while, displayed the “RCA” logo, and then the “File System Corrupted!” error :( . I figure maybe I can just reset the thing and it would reformat itself, the back says hold the power button off for 10 seconds to perform a reset. No dice. I Googled for some results, and get a bunch of tales of woe about sending the thing back to the manufacture for more than I paid for it in the first place. I was starting to think I should have been Googling this model before I bought it instead of now.

As a determined geek, I figured I could fix this thing by myself. I downloaded the manual, and found an interesting fact. If you hold down the Joystick control button while you plug in the USB cable, it automatically shifts to mass storage class (MSC) mode. Now I don’t actually have a clue what this means, but I suspected that was the mode which allowed me to format the drive. I did this, did an fdisk and set a single partition to type b (Win95 FAT32) (not sure if this step was actually required). I had to emerge dosfstools to get mkfs.vfat, then I did mkfs -t vfat -I /dev/sda, which formatted the drive. After this it fired back up as a blank drive, and I copied my 1.7Gb of MP3 files right back on to it. :)

Probably not a good solution for people not running Linux to begin with, but I would guess any self respecting distribution Live trial CD would probably have USB enabled and mkfs.vfat required to fix things up.

UPDATE 2007-12-04

I was out jogging when the screen on my Lyra froze. I was unable to recover it with any combination of efforts, and finally decided just to buy a replacement. I decided to switch to a flash based model, and after a bit of research selected the 8Gb Sansa player from Sandisk, which I have been pretty happy with overall. Good luck to everyone who still owns a RCA Lyra.

   

PHPLondon

Posted 10/7/2006 By Jason

I had a great time at the PHPLondon meeting. The meeting was held in the lounge above a English pub named “The Hope”. I was met at my hotel by Marcus Baker and Perrick Penet, and on the way we had a nice walk through London with a brief stop in another pub for a pint and a dinner of fish and chips. Here is a picture of me, Marcus and Perrick at the venue for PHPLondon.
Three SimpleTest Amigos, Jason, Marcus and Perrick

As soon as I volunteered that I might be able to attend the meeting, Marcus slotted me for a presentation. This worked out well, because after the PHP|Tek conference this past April, he had given me some pointers on a very good restructuring to my Test Driven Development talk. My original talk started with an intruction to testing, an overview of SimpleTest, an outline of test driven development, and culminated with a live demo where the audience selected the subject and we used TDD to arrive at a solution. I had structured the talk that way so that all of my information had already been imparted should the live demo fail miserably. Marcus pointed out that for someone who had not already been doing these techniques, the benefits of using TDD seem to vague and abstract, by moving the live TDD demo up into an earlier portion of the presentation, even someone who has never written a unit test would at least have a passing familiarity now, and the benefits described would thus be more tangible. This is clear evidence of Marcus’ teaching background seeping through, and was very good advise. For this talk, I organized it as: a brief intro to testing and SimpleTest, and a brief outline of TDD, then jumping into the TDD live session. After a few iterations of red-green-refactor, we hopped back to the presentation and had some very good dialog.

For the live demo, I started with this bootstrap file:

<?php

< ?php
error_reporting(E_ALL);
require_once 'simpletest/unit_tester.php';
require_once 'simpletest/reporter.php';
require_once 'simpletest/mock_objects.php';

class PhpLondonTestDrivenDevelopmentTestCase extends UnitTestCase {}

$test = new  PhpLondonTestCase;

if (TextReporter::inCli()) {
  require_once 'simpletest/ui/colortext_reporter.php';
  exit ($test->run(new ColorTextReporter()) ? 0 : 1);
}
$test->run(new HtmlReporter());

?>

The audiance selected an object whose job was to calculated information regarding an annual salary. Over several iterations we built up this test case.

<?php

class PhpLondonTestCase extends UnitTestCase {
    function testSalaryCalcExists() {
        $this->assertTrue(class_exists('SalaryCalc'));
    }
    function testGetDaily() {    
        $sal = new SalaryCalc(41400);
        $this->assertTrue(method_exists($sal,'getDaily'));
        $this->assertEqual(180, $sal->getDaily());
        $sal2 = new SalaryCalc(82800);
        $this->assertEqual(360, $sal2->getDaily());
    }
    function testNegativeSalaryThrowsException() {
        $this->expectException();
        $sal = new SalaryCalc(-41400);

    }
}

?>

which resulted in this code

<?php

class SalaryCalc {
    protected $sal;
    function __construct($sal) {
        if ($sal < = 0) {
            throw new Exception('Nobody works for free');
        }
        $this->sal = $sal;
    }
    function getDaily() {
        return $this->sal/46/5;
    }
}

?>

The entire power point presentation can be downloaded here.

Perrick followed up with a talk on using Agile development methodologies with PHP, less TDD which had already been covered ;). His talk generated a lot of lively discussion as well.

The facilities worked out well, the room was packed, and we had a very nice projector and screen. I was able to use the laser pointer/usb remote slide clicker given to me as a present for being a speaker at PHP|Tek this year.

After the presentations were over, we all enjoyed a few pints, many thanks to those attendees who choose to buy me a pint afterwards, I am very greatful. A few attendees were able to find out some personal details about me (and I think I broke a few sterotypes about typical American beer drinkers, though I by no means consider myself typical in these respects ;) ). One attendee managed to talk me out of the only copy of my book I had with me, so he now has a signed copy :).

One thing an American should be prepared for in London is a lot of walking! Bring a decent pair of walking shoes, because if they are not good, you might have what happend to me affect you. The first thing is I have sore feet, and some good sized proto-blisters brewing. The second is I walk the soles off of my shoes…literally. I saw they were starting to split at the hotel, but I figured they would last the trip home where I could throw away my shoes. By half way through my flight back to Chicago from London, it became apearant the sole would fall off if I did not do something. I asked the stewardess if they had any tape, and somehow they managed to come up with a role of masking tape. I attempted the hidden repair by making loops of sticky tape and putting them between the sole and the bottome of the shoe, but it was obvious this was not going to work. I then bit the bullet and wrapped the tape around the outside of the shoes to hold the sole on until I could get to my bag and change into an alternate pair I had brought with me. If you don’t believe it, here is the proof, shot on the airplane shortly after the repair.
London kills Jason's Shoe

Speaking of the flight, I had a very nice gentleman next to me from Dice, a company specializing in matching qualified technical candidates with technical jobs. It was very interesting to contrast our different companies, a giant industrial manufacturer vs. an internet company, yet we had quite a number of similarities: use of PHP and the LAMP stack, use of Oracle databases, use of Siebel for a Customer Relationship Management system, and both of our companies use other open source solutions where they are beneficial. If anyone is on the job hunt for technical jobs, it is probably worth using Dice as a good starting point.

   

Places I Would Rather Be

Posted 9/12/2006 By Jason

Right now I am sitting in the B concourse of Chicago O’Hare airport. The next two flights to Pittsburg have been canceled, so I am going to be late to my corporate eBusiness summit meeting.

If I was not headed here, I would have to be at work responding to an internal audit for SOX compliance, so I guess things are not all bad ;)

Where I would rather be is with Marco and crew in Toronto at the PHP|Works conference. I am sad to miss the chance to hobnob with my PHP buddies :(

Another interesting conference coming up is the DC PHP conference in Oct. It looks like many of the familiar PHP faces will be around there as well.

If you are in the UK, perhaps we can hook up at the October PHP London meeting, I am on a business trip to the UK and was able to schedule it to attend this as well.

As I have mentioned before, there are many benefits to attending PHP conferences and meetings. Get involved, learn something new, and maybe I will see you there!

   

Farewell, buy why did you go?

Posted 7/29/2006 By Jason

First of all a warning, this is not a PHP post, but instead purely an opinion piece. I am using my God given right as an owner of a blog to spout off about any situation, no matter how little I know about it.

Recently, Jani Taskinen publicly decided to disassociate himself from the PHP project. An individual is certainly able to choose how they allocate their time, particularly when it is a volunteer effort, I and respect his decision as much as I respect and value the efforts he has put into PHP over the years.

I have never met Mr. Taskinen in person, nor have I communicated directly with him via email. Where I have seen him most is from his tireless efforts on the bugs.php.net site (and his efforts to “bogus” as many bugs as possible ;) ). I have no direct knowledge of why he quit and can only speculate from this post by Andrei.

The situation presented is tragic. I read a rumor that not only has Jani performed the same UN Peacekeeper job, but knew some of the people killed in the bombing. If this is the case, certainly my condolences go out to Jani Taskinen, and to all the families of the UN Peace Keepers affected. For that matter, to the Israelis and the Hezbollah who have died in this conflict as well. The world would be a much better place if we could all figure out how to resolve our differences without resorting to killing each other.

What I don’t understand is the logic which motivates a person to take retribution on individuals or groups where there is no clear association to the source of the incident causing this frustration. In this case the retribution is withholding valuable time and efforts from a project, which is influenced by individuals at a company, which reside in a country, whose military is the source of the incident (ignoring further analysis of why the military is acting at that point). Again, I don’t know the details or personal issues in this matter, but from my perspective this seems a pretty tenuous connection. To take the hyperbole to the furthest extent is this not the same logic which terrorists use to rationalize attacks on civilian populations in retribution for actions of a government they dislike? Or even furthers, should we all not go and live in isolated cave, because members of the human race are capable of acts of brutality?

This logic also seem to typify the fallacy of Zend == PHP. Usually I see this kind of an assumption on message boards or mailing lists, but I assumed it usually will only annoy an internals developer. To be sure Zend has significant influence on PHP, but they are not PHP in and of themselves.

Perhaps there are many other facts I am aware of in this situation. Perhaps Zeev and Andi are not geek programmers, but are instead using that as a cover for their true positions as top secret operatives of Mossad, and indeed they both selected the target and pushed the button to launch this attack. I don’t see this as realistic, so I guess I have to fall back to my earlier analysis.

Again, this is not any sort of an attack on Mr. Taskinen, I thank him for his contributions and many efforts to help PHP over the years, and I wish him luck in all his future endeavors. This is just questioning some reasoning which does not seem to be logical to me, and has been turning over in my head for the past few days. Perhaps in the end it was not a logical decision but an emotional one, which seems perhaps probably given the tragedy of the situation.

   

PHP Conferences

Posted 1/21/2006 By Jason

If you have never been to a PHP Conference, you owe it to yourself to make 2006 a year to attend one. There are of course the obvious benefits of attending the presentations and being able to see these presentations first hand as well as being able to interact with the presenters, ask questions, etc. A more subtle benefit is the networking which happens at these conferences. People whom you recognize from email addresses on mailing lists, pseudonyms on forums or names on the covers of PHP books are actually living breathing people (and usually fine, upstanding people at that). PHP conferences are a great opportunity to interact with both the presenters, conference organizers and the other attendees, who likely share many common interests with you, chiefly a passion for PHP and web development.

One conferences coming up soon I would like to attend is PHP UK 2006. Unfortunately time and distance make it impossible for me to attend. I consider Harry Fuecks a personal friend, though we have only corresponded via email and coordinated on projects. I would love to have the opportunity to finally meet in person (and perhaps purchase a few malted beverages ;) ) Another PHPer I consider to be a friend is Marcus Baker, of SimpleTest fame, and a PHP London regular, is going to be attending and is helping to organize the conference. Many of the talks look interesting as well. Derick Rethans always gives informative talks, and I have read and was very impressed by Matt Zandstra’s PHP Objects, Patterns and Practice book.

There is a conference I know I am attending: php|tek 2006. I will be attending because I will be presenting talks on Design Patterns in PHP and Test Driven Development. I am looking forward to meeting everyone there, and hopefully I will see you there.

   

Nerd Score

Posted 11/8/2005 By Jason

Okay, so I am in the middle of an hour and a half long database repository migration, and so I have a few minutes to catch up on blogs. I stumble across this post which leads me to this test. I thought I would come out on the reasonably high end, but I had no idea I would end up with a designation of “Supreme Nerd. Apply for a professorship at MIT now!!!”

I am nerdier than 93% of all people. Are you nerdier? Click here to find out!

So who out there can out Nerd me?! And who is manly enough to admit it ;)