Well, as of today I am officially certified by Zend as an expert in PHP 5. Around the beginning of the month I purchased the Zend examination bundle. It included both the physical and electronic versions of the study guide by php|architect, 10 practice exams, and the official certification exam, which I finally took today.
At the time, I assumed I would want plenty of time to study, since the test was rather expensive and I would’ve hated to waste my money. As it turned out, based on the results of the first practice test, I was probably ready to pass without any help from the study pack. That feeling was reaffirmed today when I finished the 90-minute timed test in about 45 minutes.
Still, I enjoyed learning a few additional features of the language that I hadn’t encountered before, such as tidy, the SPL, and some of the PHP 5 database interaction tools. I feel I’m probably a better PHP developer now for having gone through the certification study than I was before.
[Update: 4-11-08] Today I received my official certificate in the mail from Zend. Looks like it was actually signed by Zeev and Andi, though with the high quality of today’s printers, I have no way to know for sure. Still, it looks nice. And as pieces of paper for hanging on my office wall go, this one’s a lot cheaper than that one I got from college. There was also a letter with instructions for doing this:
Cool, huh? It’ll be interesting to see whether having it actually makes my job search any easier. I hope so. Right now I’m doing the solo gig with multiple different clients who each send me a few hours’ work each week. Not bad work all things considered, but not the full-time position I’m still seeking.
March 31 2008 | worth mentioning | Comments Off on Zend Certified
I loved this latest project. It all started when I helped a fellow named Jay on experts-exchange with an issue that had been challenging him for quite some time. After he had his solution, he actually contacted me through a post on this blog asking me to give him a call. I did so, and thus began our partnership.
Jay had gotten this idea of putting together customized signature logos for military men and women, where they could display their name, rank, badges, ribbons, and other stats about themselves inside a cool stylized image. But while he’s an impressive graphic artist and has an excellent sense of proportion and design within his signatures, he needed more help with the behind-the-scenes coding than simply posting on experts-exchange could afford him.
Anyway, Jay agreed to match my normal hourly rate of pay, and I in turn did my best to not only give him code that did what he asked for, but code which could be easily understood by him, extended, and reused without his having to know too much about the underlying algorithms I employed.
Among the things I did for him, I:
gave him a way to define blocks of space within a signature for badges and for ribbons
constructed a CMS for adding his images and a simple API for calling them back out
turned his forms into database-driven affairs that would write large portions of themselves based on the art residing in the database
built a system for saving a member’s selections on the signature-building form and then auto-populating the fields each time the member returned
developed a way of adding attachments to ribbons (these can be like a set of stars that denote a particular award has been won multiple times) that even allows users to see an instant preview of their ribbon before building the signature
built a queue implementation that prevents server memory overload by making sure only one signature gets built at a time (GD operations are fairly memory intense, and too many at once can cause the server to grind to a halt)
created a javascript that sends the form selections back to the server and initiates the image creation without forcing a page reload
I’m very pleased to see that Jay’s idea has really started to explode in popularity. And he’s the sort of dedicated individual who will take the tools I’ve given him and constantly be turning out new innovations for his site. His thousands of members love all the work he puts into it, and scores of new signups join every day. His site membership has doubled in just the past 2 weeks. And he still hasn’t spent his first dime on advertising. His traffic is increasing entirely through the viral dissemination of these signatures.
I think they look awesome, and I’m really digging the chance to be part of something that looks like it could be huge.
I’m now a “Zone Advisor” at experts-exchange.com. Altogether, there are 55 of us, each responsible for 1 or more topic areas. In my case, I’m responsible for two: PHP and blogging. The blogging is because of my experience with WordPress, though it also includes Movable Type, which I have some limited experience with as well. As for PHP, it’s just a really active zone where I have a lot of experience. There’s actually 4 zone advisors who cover PHP (including me), but blogs I’m doing pretty much on my own. Fortunately, the blogging zone isn’t too busy, so I should still be able to do a decent job.
Basically, my responsibility is to try and help anytime there’s a really tricky question, arbitrate if a cleanup volunteer is trying to close a question and it’s not clear whether it’s been answered, and generally just make sure that everyone in my topic areas is following the member agreement (no profanity, cracking tips, abusive language, copyright violation, students trying to get homework help, etc.).
In order to become a Zone Advisor, I first had to prove myself as an expert in my topic areas. Now that I am one, I have the ability to leave admin comments on any question, close any open question, edit any question or comment, and though I’d normally be expected to get one of the site admins to do it if necessary, technically I have the ability to edit or suspend any member’s account. Honestly, I’m not sure why I have that last capability, but whatever.
Recently, I developed a WordPress plugin for the company I work for, Inside Success Productions. It gave WordPress users the ability to easily add a feed from our website to their blogs, and for our affiliates this meant the chance to earn a small passive income for every new subscriber they sent our way.
Now the problem is, this only works with WordPress, and there are many other ways of distributing content on the net. So today I created a generalized method to add the same content as the plugin, but which works with any type of webpage. If it can show adsense, it can show our feed. Admittedly, we can’t get SEO benefit from it, since the links are generated with javascript. But just getting out there and being syndicated by our affiliates is still sufficient motivation for doing it. And also, it gave me a chance to apply a little more of my recently acquired AJAX skill (that’s the bit that lets the form tell people how many potential interviews their preferences match).
One of the things which I feel has held back some of my web applications from their true potential has been my lack of javascript knowledge, and AJAX methods especially. I finally decided to do something about this, so I bought a book “AJAX and PHP” from Amazon last week. It arrived this past Friday and I’ve been having a blast learning this technology.
Happily, AJAX isn’t anything technically “new” it’s just a way of using 2 languages that I already have a grasp of. After playing with the examples in the book, I decided to get my feet wet by converting one of my old scripts into AJAX in order to improve its speed.
Basically, this was a component of EdocWizard (mentioned here) which allowed people to select the appropriate subjects for their eDocs. The subjects are all based on what are called BISAC codes, which simply stands for Book Industry Standards And Communications. The official list of codes can be found at the Book Industry Study Group’s website. I have them backed up to my database, and there’s currently just over 3000 different codes recognized. Amazon allows publishers to pick up to 4 subject codes for each eDoc.
These subject codes are broken up into categories, and originally, I simply made the user wait while the entire 3000+ codes were copied from the database into javascript arrays, and then I had functions that could switch out the display to show the appropriate subjects based on the category the user had selected. My intent was to make it fast to switch between categories without forcing a page reload. It worked, but depending on connection speed it could take a long time for the complete page to finish loading. In retrospect, I should’ve simply forced a page refresh.
Anyway, none of that matters now that the tool has been converted to use AJAX. Check it out by using the form below.
October 08 2007 | ajax and php projects | Comments Off on My First AJAX project
Converting a WordPress plugin to a widget doesn’t have to be difficult, but because the official API’s over at wordpress.org are so lacking in detail (the example they provide won’t even work if you cut and paste), many developers can become frustrated with the process.
STEP 1: Using a widget to call a plugin function (no user input)
To begin, assume you have a very simple sidebar plugin that can be called by editing the sidebar theme directly. In your plugin file, there is some function called “nifty_stuff” that outputs some sort of html code to display in the sidebar. In the bad old days of WordPress, the only way a user could display such a plugin would be to edit their theme and add the line of code provided by the plugin author to some point in their sidebar.php file (or whatever the sidebar’s name happens to be). And in older wordpress versions and themes this is still what a blogger needs to do, so you want to leave your user with that option.
If the plugin function requires no input from the user, then the following code will add it to their widgets menu where they can simply drag and drop it into a simplified representation of their sidebar. Just add this code to the same script that holds the “nifty_stuff” function:
function widget_nifty_stuff_init() {
if(!function_exists(‘register_sidebar_widget’)) { return; }
function widget_nifty_stuff($args) {
Going through the code, what’s happening is that we first want to create a wrapper for our widget function.
Without that wrapper, php will attempt to use the function “register_sidebar_widget” before the script containing it has been loaded. Using the ‘plugins_loaded’ action hook to run the init function ensures that everything loads in the right order first.
The lines surrounding the call to nifty_stuff are there because the widget-enabled wordpress themes may use them, and so they must be supported.
The register_sidebar_widget function associates a label for the widget with the actual widget function that will get called if the user adds it to their sidebar. That label is what the user sees in their widgets menu.
Now, that’s all well and good for really simple plugins. But if your widget needs that user input, then keep reading to learn how to add a widget control. continue reading »
In my current full-time job as webmaster for Inside Success Radio, I don’t often get a lot of opportunity to do really cool new programming. However, I had a blast with my latest project, and I was proud enough of it that I’m going to share it here.
Basically, we run an internet talk radio website, and we have members who pay to listen to our exclusive content. Each interview is broken up into 3 segments, with the first segment telling the guest’s story, and then the second segment giving their expert advice (and this is the stuff people are willing to pay for), and a third segment where they offer predictions about developing trends in their fields. Our experts span the gamut from business and finance to parenting and romance. With multiple subtopics, it’s pretty easy to see how content from our site could be a valuable addition to anyone’s weblog.
So anyway, after I happened to mention to my boss that I knew how to write WordPress widgets, he asked me if we could use a widget to let someone easily add a feed from our site to their own blog, and get some free links back in the process. I said that I could, and after we hammered out the specs, we came up with this pretty little widget.
You can see the result of this effort in my own sidebar there to the left. It includes just a tiny amount of information about the guest, a feed for listening to the first segment of the interview, and then a link inviting people to our VIP page, where by giving us just their name and email address we’ll let them listen to the entire interview for free. In addition, we offer them a free trial membership. After the trial period expires, they can pay each month to continue to get access to our huge library of content as well as all of our new shows that we add every week.
Now, the exciting feature for the blog owner is that the link to the VIP page includes an affiliate id. If a person signs up as a member and starts paying us each month, we pay a 35% commission on every payment. With just a few new users each month, this can quickly become a great passive income source. In addition, the blog owner specifies the keywords and topics relevant to their own visitors, ensuring that the interviews displayed will be ones their traffic is most likely to be interested in. The featured interview changes each day. As a handy guide, the widget control lets the blog owner know how many interviews in the database currently match their preferences. They can narrow or generalize their settings as appropriate.
The exciting feature for Inside Success Radio of course is that we get numerous links back to our site to improve our search engine rankings. We get 1 link back to the insidesuccessradio.com homepage, 1 link to the homepage of the particular radio show being featured, and 2 links back to the guest’s own promotional page. The other cool thing is that if we want to promote one particular guest on a particular day, we can modify the feed on our end such that if the widget’s keyword, category, and radioshow preferences match, then that guest we’re promoting will be sure to show up as the featured interview. This way we can quickly get dozens of backlinks and traffic all at once. Isn’t that a cool idea?
Anyway, if you think you’d like to have it on your own blog, you can either become a member yourself and request an affiliate id, or else feel free to use mine – 405203. (Hey, it never hurts to ask, right?)
Here’s what bloggers see when configuring their feed:
September 27 2007 | open-source and php projects | Comments Off on The ISR interview widget for affiliates
Though I originally developed this wordpress plugin just for my personal use, I decided to generalize it so anyone can display their rank on experts-exchange.com. Now I’m hoping others find it useful as well.
The point tally automatically updates when you gain new expert points, so it’s never out of date. As you pass milestones like 50K, 150K, 300K and so on, the graphic will switch to show your current shield of courage. It’s a snap to use either as a direct function call in your sidebar.php file or as a widget. And the badge itself is a link back to your experts-exchange profile.
After unzipping the contents, place them inside your wordpress plugins folder. In the admin panel, go to your Plugins menu and activate the Experts Exchange Badge plugin.
To have it display on your page, go to your Presentation menu and click the “Widgets” option. Drag the widget named “Experts Exchange Badge” into your preferred position in the sidebar. Click on the configuration link and complete the link to your profile in the input window. Now click “save changes”. Your badge will now appear for all your wordpress visitors to see.
As an alternate method, if you don’t want to use widgets you can modify your sidebar.php file directly. Again go to the Presentation menu, this time selecting the “Theme Editor” option. Select the sidebar file you wish to modify (or any other template you want to show your badge) and add the following line: <?php ee_badge(‘[your profile id]’); ?>
(replace [your profile id] with the code that completes the link to your profile: http://www.experts-exchange.com/M_[your profile id].html)
Experts exchange is a website where people who need an answer to a tricky technical question can go to seek out the help of self-proclaimed experts in various topics. Experts are given points for answering questions. Experts with lots of points can earn rankings, print out certificates and earn free t-shirts (the ultimate nerd motivator).
I first visited the site because I had been struggling with a particular function that had suddenly stopped working and I couldn’t figure out why. My boss got me set up with an account, and I was able to ask my question.
It was cool. At first, the suggestions I got were things I had already tried, or unhelpful comments from people who didn’t seem to understand what I was trying to do. Fortunately, there was a fellow who was able to suggest a way of rewriting the function. It worked, and I was happy.
But while I was there, I happened to look at some of the other php questions in that “zone”. I started providing some answers. I started earning some expert points. I started having fun.
I really like working on php problems, and because the nature of my work prevents me from coming across every potential use for php, I used to find that I wasn’t being stretched as much as I like. So now, whenever work gets slow, I can always count on someone on experts-exchange posting a question that I wouldn’t otherwise have a reason to think about.
I almost always learn something new when I visit the site these days. Either I learn because I have to do some research in order to answer a question I’ve never come across before, or else I learn because someone posts an alternate way of doing something that I didn’t know about.
I’m pretty good at it too, which is nice as far as self-validation goes. I’ve now participated in 123 questions, not counting the handful I’ve asked myself. Of those, I was either credited with an accepted answer or an assisted answer on 73. Out of the remaining 50, only 15 were credited to another user. The rest are all still open or deleted by their authors. I happen to know that many of those open questions have simply been abandoned after I correctly answered them, and I’ll eventually get the points credited to me when the moderators come around and clean up the old questions.
Right now I am ranked a php “Master”, meaning I have over 50K points. The next ranking is Guru. Earning it requires hitting 150K points, and I expect to hit it sometime in October. Additionally, today marks a milestone for me with EE, as I have earned a spot among the top 15 php experts for the entire year. This is particularly thrilling seeing as I joined in July, so almost every other expert on the list has been answering questions since the year began.
The top php “rookie” – meaning someone who joined this year, is sitting at number 4 on the top experts for 2007. He joined in January, and currently has 225K points in php. I have 94K. If I can overtake him by the end of the year (and I think I can) I will receive an official award from experts-exchange recognizing me as the top php rookie.
I’m competitive, I like to collaborate with other techies, I like the challenge of trying to debug someone else’s code, I enjoy expanding my own knowledge, and I love free t-shirts. It’s only natural that I would be drawn to this site. And if showing off my expertise helps me land a job doing what I enjoy, then that just makes it all the better.
[UPDATE: I’m now at #13 for the year on the site, and within a single answer from #12. So far for the month of September I have just over 53,000 points in the php zone. Or, to put it another way, I have more points than the combined monthly totals of the 2nd-6th spots of top php experts this month.]
[UPDATE: I’m now a guru, and #9 for the entire year in php. My new shirt should be here in a few weeks. I created a little module for my blog that counts my current points score. It’s at the bottom of my left-hand sidebar.
To help me spend less time on the site and still answer questions, I developed a script which alerts me each time a new question is asked. This is important because when I’m working, I can’t keep checking the site throughout the day, but it’s not a problem to turn off my timer for a few minutes while I answer a question that I know I’m interested in solving.
I believe I have close to 40,000 points stored up in unclosed questions that I’ll receive toward the end of the month and the beginning of next as moderators come through and clean them up. The current top php rookie may not realize it yet, but he is very soon going to be replaced.]
[UPDATE (October 26, 2007): I have now been recruited as a zone advisor for the PHP and the blogging zones. This means that I’ll be the “go-to” guy if someone’s stuck with a particularly difficult problem in any of those areas, or if there’s a dispute about who answered a question best. It also means I can close any question and post a comment as an admin. Also, I get a new email address. If someone sends to my username (MasonWolf) followed by “experts-exchange.com” it’ll be forwarded to me. Anyway, it’s kinda cool. Out of thousands of experts on the site, there’s only 55 zone advisors, and I’m the newest.]
Amazon.com has a neat program to let publishers sell ebooks online, which they call “eDocs”. Back when the eDoc program first came out my current boss Randy Gilbert registered for the program, got a vendor code and a pdf with instructions on how to use it. It was not user-friendly. It was so difficult, in fact, that until he hired me, he never placed a single eDoc on Amazon, even though he really wanted to. In its own instructions Amazon said that there was an easy way and a hard way to get eDocs posted.
The easy way was to pay some third-party company a hundred bucks per eDoc to place them online for you. However, Randy had already spent about $50 apiece getting his radio interviews transcribed, and he really didn’t think it made sense to spend another $100 apiece just to get them into the Amazon eDoc program. And certainly, with no clear idea how to get them sold once they were there, combined with the fact that Amazon gets 50% of every sale, he was probably justified in that opinion.
The hard way, on the other hand, required putting together a metadata file by hand for each eDoc to be uploaded. Randy’s no fool, but he had neither the time nor the patience to figure this out himself. And besides, he wasn’t interested in paying someone to create a new metadata file each time a new eDoc was supposed to go online. He wanted an automated system to quickly get lots of these products online.
When I first came to work for Randy, the only language I was competent with was Java. So, I built a Java applet that could guide someone through the process of entering the information about each eDoc, save that information to a database, and then convert that information into the metadata file according to Amazon’s instructions. It worked, and the applet can still be used for that purpose today.
After we got a good number of his transcripts online, Randy started getting noticed by other internet marketers who wanted to get their ebooks onto Amazon as well. My solution was good for a single user to create a metadata file and then manually ftp that metadata file to Amazon, along with the eDocs and their covers. It was not so good for having a large number of people using it, keeping their edocs separate, and managing overrides from sales.
When I became more proficient in php, I proposed to Randy that we create a new system for putting up the eDocs, one that would allow us to manage users, track sales reports from Amazon, automate the procedure of publishing documents, and store the eDocs and their cover images. He agreed, and asked me to put something together.
I designed the software requirements, set up a phased development schedule, and created a detailed process diagram and database diagram before I ever set down a single line of code. Randy signed off on the idea, agreed to fund the project at the amount I specified, and then I set to work. Initially, I expected to just create the first phase of the project myself, and then find another person or company to complete it. But when I couldn’t find anyone willing to work within the budget I had, and when my other projects started requiring less of my personal attention, I decided to just do it myself.
I love edocwizard.com. Because I never allowed major changes to the scope from start to finish, and because it was so thoroughly envisioned at the outset, the final project has a wonderful consistency throughout it, and performs well with everything it is intended to do. Phase I of the development was supposed to require 2 weeks. I needed 3, mainly because I was forced to split my time with another project. In Phase II, which I began about a month later after finishing up some other unrelated work, I determined that once I started I would be more jealous with my time. I didn’t agree to take on any other new projects, and except for the occasional IT “emergency” all of my work was devoted to the project’s completion. I had originally said I would need 3 weeks for the final phase, and I finished it in 3 weeks exactly.
Currently, we’re in beta testing mode. We have our own transcripts going up still, and now we also have another internet marketer placing eDocs online. Occasionally bugs are uncovered, though with surprising rarity for a project of this scale. And at this point, we’re confident that we’re ready for deployment. It’s just a matter of deciding how to advertise and what business plan we want to use. We’re not sure if we should charge for access, or simply take a percentage of sales, or some combination of both. Once the marketing is in place, edocwizard.com is going to be a very sweet source of income for Bargain Publishers.
To test it out yourself, though without admin controls or the ability to actually publish to Amazon, go to http://edocwizard.com/members/
Username and password are both “public”
For those features that you won’t be able to see because of limited access, check out the screenshots below. Click on the thumbnails for a larger view.
No other work that I’ve done so far demonstrates my understanding of web development at every level as clearly as this one. I’m a very strong web coder, and honestly not the best designer. While I understand css and html, I’ve never had the sort of gift with design that I’ve always enjoyed with programming, ever since I was a kid playing around with BASIC on my parents’ Commodore 64. I’d like to learn a few more tricks, but I fear I lack the sort of artistry that is innate in a great web designer. However, while my designs aren’t pretty, I try to make them intuitive and user-friendly. And while not gorgeous, I like to think they’re not especially ugly either.
Edocwizard is cross-platform compatible with Firefox and Internet Explorer.