It has been a while since I last posted to Brown PHP.  My life has been going through a large transition recently.  I just landed a new job (more on that later), and moved because my wife also accepted a new position in a different location.  If that were enough of a stressful environment, I have been re-factoring the Informative Post over the last month trying to get it ready before I begin my new job.

Enough about my own struggles, lets focus on the topic at hand.  Michael Kimsal’s new book,  PHP Job Hunter’s Handbook.  I pre-ordered this book a few months ago, and read the PDF version all the way through before I received my hard copy.  Not a big deal, but makes me regret ordering both.  I guess I can just add it to my collection of PHP temples of knowledge!  In this post, I, Douglas Brown, will be reviewing the PHP Job Hunter’s Handbook and giving a fairly detailed review of my own experiences.

First, let me begin by talking about the author, Michael Kimsal.  I am a subscriber and active listener to his podcast at WebDevRadio.com, from which he discusses current events in the web community, and not just PHP.  He is a well respected PHP contributer with a wide array of knowledge with many different languages.  I find him always willing to help another PHP member in need , and he recently started his own PHP job listings board to also help the PHP community.

What the book covers:

  • Finding a Full Time Job
  • Training and Certification
  • Contracting and Freelancing
  • Applicable Technologies You Should Know
  • Interviewing Tips and Tricks
  • Advice from Those Doing the Hiring
  • Advice from Fellow PHP Developers

It wouldn’t be extreme to go as far as saying that the book covers too much territory, but for it only being 106 pages, it’s a fair conclusion.  He mentions that this book is not meant for advanced PHP programmers who have been around the block a time or two, but more targeted towards beginners, to help them get started.  The book fits the bill for that purpose.

Does it contain any useful information?

It doesn’t give to much information that could overwhelm a “noobie” PHP programmer, but it does give just enough to help them get started.  I for example, have never had a professional PHP programming position.  I do this for my hobby.  What I do professionally is C and C++ programming.  So you can understand why I love PHP so much.  I did get quite a few nuggets of information from the PHP Job Hunter’s Handbook.  I got a few PHP job listing sites that I have never heard of to add to my bookmarks.  Also what types of information that the HRs look for when going through PHP cover letters and resumes.

So like I said above, I was able to absorb a lot of information from this book that I had no knowledge of previously.  However, there is also a lot of knowledge in here that can be picked off the web faster than opening a book.  It’s nice that it has been grouped together for a quick reference if needed.

What is missing?

The only two things that I would have liked to see in this book would be a whole encyclopedia of example PHP cover letters and resumes.  Don’t get me wrong, with all the information that he provides in the book, you can easily make these out for yourself.  This is a Job Hunting Handbook however, and I found it lacking that it didn’t contain any of these in the appendix or somewhere.  If added in the next Rev, 2 or 3 of each would improve the book to give new PHP programmers something to go off of when they are compiling their own.

Would I recommend this book?

If you are new to PHP and don’t know where to find all the great places to find jobs, and information, absolutely.  If you are not new with PHP and you already know where to look for PHP jobs, and what employers are looking for when in search of an experienced PHP programmer, probably not.  Like I mention before though, Mr. Kimsal did not write this book for that audience.

Did it help my job search?

It did and it didn’t. :)  I did find a new job, but not in a PHP position.  I also never really had that much time to do all the different techniques that Michael Kimsal recommended to help the search.  The new job I did find was a Software Engineering position working with C and C++, which are my bread and butter.  I’m sure that I learned something from this book that helped me land this new job though.

I hope you got a better understanding about what to expect if you yourself are looking into a PHP career and would like a little help finding that first job. Maybe sometime in the future, I’ll be approached by a company offering a PHP postion that is too good to pass up, but until then, it’s still my hobby! If you have any questions, please feel free to leave comments. Take care!

August 28, 2008 · Posted in PHP Links  
    

The past few months I have been using Twitter a lot.  I’m trying to find and follow people that are heavily involved with PHP or at least providing knowledgeable Tweets about PHP.  I guess you could say that I am always open to new networking opportunities within the PHP community. :)

If you don’t know what Twitter is, well then you aren’t keeping up with your current events very well.  I’m not going to use this post explaining what it is more than a mini-blogging service.  If you don’t know, check their site out.  I provided a link above.

The problem I was having was actually judging whether or not it would be worth my time following their tweets. I mean, I follow someone that is really respected in a certain field, only to find out that they tweet about their new puppy they just got more than anything. So I made a PHP script that generates a “Twitter Tag Cloud.”  Using this, you can generate your own Twitter tag cloud to put on your personal site to display the top keywords that you have been tweeting about.

I also provide a REST service so that you don’t have to upload or play with any code yourself other than accessing the BrownPHP Twitter Tag Cloud service. I’ll show you more about that later. Or you can just use the textbox I have here to check out your own Twitter Cloud or a friends.

This is helpful to judge what the person tweets about the most.  The more the Twitter-er Tweets about a certain keyword, the larger it appears. Like if you would look at mine.  One of the large keywords is “informative.”  I also run a site called, Informative Post, and I tweet about it often, so it makes sense that this would be the largest keyword.

View Your Twitter Tag Cloud Now

Try it yourself! Type in a twitter username to see what that twitter-er tweets about more often:


Pretty cool, huh?  At the bottom of this, I provide a link where you can download the PHP files from.  I am also providing this as a REST service.

REST Twitter Tag Cloud Service

Parameters:

  • user (required)
    • Twitter Username
  • history (optional)
    • Number of past status updates to look for
    • Defaults to 100
    • Max is 200
  • size (optional)
    • Number of Keywords to return
    • Defaults to 50
    • Max is 75

Example REST call to get my (dlbrown06) Twitter tag cloud:
http://www.brownphp.com/rest/twittertagcloud.php?user=dlbrown06
Response:

<div id="twitterTagCloud"><a class="size2 tag" title="dlbrown06's Tweets Covering money" rel="nofollow" href="http://search.twitter.com/search?q=+money+from%3Adlbrown06" target="_blank">money</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering taking" rel="nofollow" href="http://search.twitter.com/search?q=+taking+from%3Adlbrown06" target="_blank">taking</a>
<a class="size1 tag" title="dlbrown06's Tweets Covering networking" rel="nofollow" href="http://search.twitter.com/search?q=+networking+from%3Adlbrown06" target="_blank">networking</a>
<a class="size1 tag" title="dlbrown06's Tweets Covering social" rel="nofollow" href="http://search.twitter.com/search?q=+social+from%3Adlbrown06" target="_blank">social</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering would" rel="nofollow" href="http://search.twitter.com/search?q=+would+from%3Adlbrown06" target="_blank">would</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering children" rel="nofollow" href="http://search.twitter.com/search?q=+children+from%3Adlbrown06" target="_blank">children</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering account" rel="nofollow" href="http://search.twitter.com/search?q=+account+from%3Adlbrown06" target="_blank">account</a>
<a class="size4 tag" title="dlbrown06's Tweets Covering working" rel="nofollow" href="http://search.twitter.com/search?q=+working+from%3Adlbrown06" target="_blank">working</a>
<a class="size3 tag" title="dlbrown06's Tweets Covering article" rel="nofollow" href="http://search.twitter.com/search?q=+article+from%3Adlbrown06" target="_blank">article</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering start" rel="nofollow" href="http://search.twitter.com/search?q=+start+from%3Adlbrown06" target="_blank">start</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering currently" rel="nofollow" href="http://search.twitter.com/search?q=+currently+from%3Adlbrown06" target="_blank">currently</a>
<a class="size1 tag" title="dlbrown06's Tweets Covering making" rel="nofollow" href="http://search.twitter.com/search?q=+making+from%3Adlbrown06" target="_blank">making</a>
<a class="size4 tag" title="dlbrown06's Tweets Covering online" rel="nofollow" href="http://search.twitter.com/search?q=+online+from%3Adlbrown06" target="_blank">online</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering twitter" rel="nofollow" href="http://search.twitter.com/search?q=+twitter+from%3Adlbrown06" target="_blank">twitter</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering morning" rel="nofollow" href="http://search.twitter.com/search?q=+morning+from%3Adlbrown06" target="_blank">morning</a>
<a class="size1 tag" title="dlbrown06's Tweets Covering sites" rel="nofollow" href="http://search.twitter.com/search?q=+sites+from%3Adlbrown06" target="_blank">sites</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering right" rel="nofollow" href="http://search.twitter.com/search?q=+right+from%3Adlbrown06" target="_blank">right</a>
<a class="size5 tag" title="dlbrown06's Tweets Covering informative" rel="nofollow" href="http://search.twitter.com/search?q=+informative+from%3Adlbrown06" target="_blank">informative</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering hosting" rel="nofollow" href="http://search.twitter.com/search?q=+hosting+from%3Adlbrown06" target="_blank">hosting</a>
<a class="size1 tag" title="dlbrown06's Tweets Covering until" rel="nofollow" href="http://search.twitter.com/search?q=+until+from%3Adlbrown06" target="_blank">until</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering people" rel="nofollow" href="http://search.twitter.com/search?q=+people+from%3Adlbrown06" target="_blank">people</a>
<a class="size1 tag" title="dlbrown06's Tweets Covering looking" rel="nofollow" href="http://search.twitter.com/search?q=+looking+from%3Adlbrown06" target="_blank">looking</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering starting" rel="nofollow" href="http://search.twitter.com/search?q=+starting+from%3Adlbrown06" target="_blank">starting</a>
<a class="size2 tag" title="dlbrown06's Tweets Covering really" rel="nofollow" href="http://search.twitter.com/search?q=+really+from%3Adlbrown06" target="_blank">really</a>
<a class="size3 tag" title="dlbrown06's Tweets Covering diablo" rel="nofollow" href="http://search.twitter.com/search?q=+diablo+from%3Adlbrown06" target="_blank">diablo</a></div>

Then you can use CSS to format the cloud however you like!

Download the Twitter Tag Cloud Source Code:

If you would like to use this source code yourself, you are free to do so.  All I ask is that you provide a link to this site, or somehow recognize the work that I put into it somehow.  I would love to see what kind of mashups that the PHP community could do with this source code. Enjoy!

Download Twitter Tag Cloud Source Code Version 1.0

Downloaded a total of 146 times

If there are any problems with the source code, please let me know here. Then I’ll update code for future downloads.

August 1, 2008 · Posted in PHP Code Projects, PHP Links  
    
July 22, 2008 · Posted in PHP Links  
    
July 21, 2008 · Posted in PHP Links  
    

Let me tell you a little story.  My latest site I have been working on for some time was written using the Zend Framework.  Since it was launched in Oct 07, it has been growing rapidly enough where I am now starting to feel growing pains.

One morning I went into the site to check some analytics, and my site was displaying a 403 Forbidden error!  I suddenly got a cold nervous sweat down the back of my spine.  Why was it forbidden?  It was fine when I checked it out last night?!  So I tried to login to my FTP account.  No go!  I I thought a hacker has some how blocked me out of my own account. [Exit dramatic build up].

I come to find out that my hosting company revoked my access to the folder that I was using for the domain.  I called them up immediately after I noticed that.  They responded by telling me that on a shared server, they limit their clients to use only 2% of the servers resources before they shut them down.  My site was using 30%. They were then forced to shut the site down without notice, because it was most likely affecting the performance of the other sites running from that shared server.

After some negotiating and explaining to them that I was going to come up with a solution, they temporarily gave me back access to the folder so that I could diagnose further what was going on.  The first thing that I did was looked through the server logs.  Because of my unfortunate neglect, the server log file was freaking enormous bigger than normal.

Nearly all of the errors I was getting were:

[03-Jul-2008 09:41:19] PHP Fatal error:  Uncaught exception ‘Zend_Db_Adapter_Exception’ with message ‘SQLSTATE[42000] [1203] User blank already has more than ‘max_user_connections’ active connections’ in blah blah blah

I’ll admit, I was in a huge hurry to get this project done, so I wasn’t thinking about the long tern effects.  Needless to say, I wasn’t caching my MySQL query results. I know, tisk tisk. Once I discovered this, I added this private method to my classes:


private function loadCache()
{
$frontendOptions = array(
'lifetime' => 7200, // cache lifetime of 2 hours
'automatic_serialization' =>
true);
$backendOptions = array(
'cache_dir' => './cache/' // Directory where to put the cache files
); // getting a Zend_Cache_Core object
return Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
}

Then in each of my classes where I needed to cache my query results, I implemented the above method. Here is an example:


class IndexController extends Zend_Controller_Action {
/**
* Index Action
*
*/
public function indexAction() {
$db = new SomeDB;
$cache = $this->loadCache();
if (!$results = $cache->load('cache_variable')) {
$results = $db->fetchAll('columnName="whatIWant"');
$cache->save($results, 'cache_variable');
}
}
}

It’s pretty much as simple as that.  Once I did this, it dropped the server load tremendously, which now buys me more time from upgrading my hosting package.  About 10 minutes of coding just saved me about $50 a month in hosting fees!  That feels good.

Keep in mind that this is not the best approach to solving this problem.  If you too are using the Zend Framework in your own design.  It was be better to initialize the Zend_Cache in your bootstrap file.  Doing it the way I did above will force you to replicate the code method, loadCache, in all of your classes which I dont’ have to explain to you why this is inefficient, and just plain old bad OOP technique! :P

July 3, 2008 · Posted in PHP Links, Zend Framework  
    

This is officially the first post of many to come.  I have never really had the chance to start a Wordpress blog before.  Well, maybe mentioning that I never really had the time to work on one would be better.  I always enjoyed building a site from the ground up.  Starting to think about how I will design the file structure, and what design pattern to choose from always get me excited.  I don’t think I need to mention the gratification you get from launching a site that you have been working on for months to the public eye.

So I am admittedly late to the Wordpress blog show, but I am doing this to contribute everything that I have learned along the way about PHP and other web technologies to the PHP community.  My motivation behind continued work on this site comes from all the developers out there that have offered advice or have troubleshooted my PHP design mistakes in the past.  I hope that I can use this site as a conduit to other PHP developers to share ideas that we can all learn and grow from.

I am currently in a living situation that cuts me out of the loop from the Web 2.0 world.  I live in Indiana/Ohio and believe it or not, the only way I can hear about or learn more about PHP is from blogs, and php.net.  I’m sure I am not the only person in this situation.  Some day, I do plan on moving the West Coast or New York, where I can be around more like-minded people.

I just wanted to use this first post on Brown PHP to welcome you and hope you stick around to contribute and learn more about the great things that PHP can do to make the world a better place! :P

June 7, 2008 · Posted in PHP Links