Skip to content

What do developers look for when they scan a job ad?

Dear Reader,

In my book “Culture of Respect” I have a section on writing job ads that will attract developers. I am in the process of revising that chapter, so I thought I would ask the people who actually read the job ads what they look for. The results weren’t that surprising to me. Having read a lot of job ads though, I am guessing that the results will be surprising to some managers out there.

I’ll let you read the results for yourself.

Until next time,
I <3 |<


When Giants Battle. Google, Twitter, Apple, and encrypting the web. A podcaster’s story

Dear Reader,

This is a story about my fight to change the feed on my little podcast, Voices of the ElePHPant.



Google's attitude towards encryption on the web


Twitter's attitude towards encryption on the web


Apple's attitude towards encryption on the web

As a podcaster, I’m in a quandary. I know that encrypting the web is a good thing. Most of my sites now sport a Let’s Encrypt cert. (See this post for how I automated let’s Encrypt on CentOS) However, several giants of the web have different views on encryption.

  • Google – Encrypt everything.
    That’s good, right? I mean encryption is good and Google will reward encrypted sites with better ranking.
  • Twitter – Encrypt Player-cards and all the assets.
    Ok, Since I’m encrypting everything, encrypting my player cards and all their assets are encrypted. I even wrote a plugin to do thePlayer-cards and part of it makes sure that everything is served over https.
  • Apple – Don’t encrypt your feed or anything in it.
    Ok, Apple doesn’t come right out and say this, they simply give you a “Can’t read your feed” error if you submit a https URL and you are left to try and figure out why. Turns out that with a little experimentation you will find that not only that your feed can’t be encrypted, nothing in your feed can be encrypted.

Welcome to the modern web.

Trying to play nice

iTunes is still the most popular destination for podcast discovery. So you’ve got to have your feed there. iTunes has a lot of rules though. Early on, we had tools like FeedBurner that would “wash” our feeds and make them iTunes friendly. Feedburner WOULD accept an encrypted URL and spit out unencrypted.

As with all free services on the web, priorities change and services die. FeedBurner hasn’t had an update in many years and if you listen closely, you can hear the rumblings about Google shuttering it soon. That’s fine, long ago, I moved my entire podcast infrastructure to using the Bluberry Powerpress plugin for WordPress and it puts out an iTunes friendly feed by itself. So you would think that it’s just a matter of telling iTunes you have a new feed right? Well, um…no.

The Fix

The problem is that all three of these giants, Google, Twitter, and Apple, have influence over my little podcast.  After hours of searching for a solution, and switching to a paid cert simply because someone suggested that Apple simply didn’t like Lets Encrypt (not true) I finally decided to try an unencrypted feed. I turned off the automatic redirect to https that I had in my Apache configuration file for my podcast site. This almost worked.

I resubmitted the regular HTTP URL.  I could see from tailing my log files that iTunes accepted it and actually read it this time. I was elated for about half a second until Apple came back with an error message telling me that the podcast image couldn’t be encrypted either. <sad trombone />

Making Progress

Ok, I was making progress. This was further than I had gotten in several weeks of research. I jumped to the conclusion that Apple didn’t want to see any https inside the feed. This presented an interesting challenge because of the way that WordPress and thus PowerPress handle feeds.

The feed is generated in feed-podcast.php inside the PowerPress plugin directory. Looking it over, this is just a big while loop that pulls in the necessary information and then echoes out XML, one post at a time. Since it uses WordPress’s native functions to get urls and such, everything says https. I didn’t want to change WordPress because then my entire site would be back to unencrypted. I also didn’t want to check each echo statement for https and remove the s if it was found. This could get messy in a hurry.

It became obvious that I needed to grep the entire feed and replace https with HTTP. I’m a programmer, this should be easy. Except that there is no point in the WordPress flow where I can intercept the entire feed before it is sent out. WordPress has a complex system of hooks and filters but none of them were “RSS_FEED_BEFORE_IT_IS_SENT_OUT”. <sad trombone />

Since WordPress doesn’t gather the entire feed into a variable and then spit it out, a different solution is needed. WordPress treats the feed like any other page, it has a template that is executed that directly outputs XML. This was the absolute worst case scenario. Since Powerpress controlled the feed for my podcast, it looked like I was going to have to hack the core of the PowerPress plugin itself.

Old-School PHP to the rescue

Digging around for solutions, I came across a snippet of code that suggested using PHP’s Output buffer. Something I’ve not done in a very long time. The code in the snippet was not helpful, but the idea it sparked was what worked.

function my_callback($buffer) 
    return str_replace('https://','http://',$buffer);

The heart of the solution is the function my_callback. In it, I simply replace HTTPS:// with HTTP://. Not terribly difficult to do in PHP. If I wanted to get fancy, I could probably have used an anonymous function int he ob_start() command, this solution is easier to read.

Next, we put in the ob_start(). In it we put the optional callback parameter and specify the name of the function we created just above it. For those not familiar with the callback parameter, here is an excerpt from the manual.

An optional output_callback function may be specified. This function takes a string as a parameter and should return a string. The function will be called when the output buffer is flushed (sent) or cleaned (with ob_flush(), ob_clean() or similar function) or when the output buffer is flushed to the browser at the end of the request. When output_callback is called, it will receive the contents of the output buffer as its parameter and is expected to return a new output buffer as a result, which will be sent to the browser. If the output_callback is not a callable function, this function will return FALSE.

tl;dr my_callback is called and passed everything that output buffering collected. I can make any modifications to it and whatever I return is what is actually sent out. That is exactly what I did.

At the bottom of the feed template, I simply put

<?php ob_end_flush(); ?>

This triggers the callback that is the secret sauce to the solution.

That’s all it took. I was able to exactly what I needed to do by going old-school on it’s butt and using output buffering. This gathered everything into a single variable that I was able to wash before outputting.

Once this was in place, I resubmitted the newly cleansed feed to Apple and not only did it accept it, the change was completed and visible in iTunes within about 30 minutes. (See the pretty new logo that the lovely and talented Kathy did for us two years ago? Until yesterday we still had our old logo there)


Screen Shot 2016-04-09 at 12.01.09 PM


This blog post is not about the horrors of using a free service like FeedBurner. FeedBurner served me well for many years. It was my fault to begin with for submitting the FeedBurner url itself and not one hosted on my site as a 301 Redirect. The only lesson there is to make sure you own all the important pieces of your project, like feed URLs. :)

Here are the takeaways though.

  • iTunes does not hate Let’s Encrypt, iTunes hates encryption.
  • My site now runs both https and HTTP but I only advertise https
  • My feed is now exclusively HTTP, everything else on the site is HTTPS
  • I had to hack the core, which sucks but sometimes is necessary.

With regards to that last point. I believe that because PowerPress is awesome, there is a way to do this by specifying my own feed template. Reading the code, it looks like it is possible. I’ve written them to get clarification and will update this post when they get back to me.

Honestly, I don’t know how muggles deal with this. I was able to solve this because I am a programmer.

Until next time,
I <3 |<

Seven Words You Can Never Say on Television…But Can Apparently Say In Code

Dear Reader,


(Mom, don’t read this one)

The late great George Carlin had many awesome comedy skits. One of them – possibly his most famous – is “Seven Words You Can Never Say on Television” from the comedy album “Class Clown”. In it he gives his list of  seven words that – at the time – were inappropriate for over the air broadcast in the United States.

I thought it would be fun – if for no other reason than clickbait – to run the 7 dirty words against Github to see who is using what, and where. I took screenshots so that you can see each word and which languages use it the most. I also list PHP’s rating for each word out of the top 10 languages.

So, without further adieu here are Carlin’s “Seven Words You Can Never Say on Television” but you can apparently use in code with impunity.

The List

  • Shit

    (PHP – 9/10)


  • Piss

    (PHP – 5/10)

  • Fuck

    (PHP – 8/10)

  • Cunt

    (PHP – 3/10) :facepalm:


  • Cocksucker

    (PHP – 5/10)


  • Motherfucker

    (PHP – 4/10)

  • Tits

    (PHP – 4/10)


The only conclusion that can be drawn is that we have lost the ability to communicate without profanity. :)

Until next time,
I <3 |<

Load external HTML into Reveal.js presentations

Dear Reader,

One of the things I do at Zend is help rehab existing classes. Soon after I was hired, I got my team together and we decided that going forward, all classes would be in Reveal.js. Personally, I like Keynote, but other trainers had PowerPoint. We ended up porting classes to each of the major formats. That means that if you change one, you have to change them all, and we didn’t. :)

Because Reveal.js is HTML, you can present using just a browser. Our recommendation is to use PHP’s built-in web server so that you get access to features like speaker notes. All-in-all though, Reveal.js looks like it is going to be a solid solution for us.

One Problem

The one problem we have run into is that our slide decks are large. A single class could be 300-500+ slides. Yes, we could break them up into multiple presentations, but we would rather have them as a single presentation.

We are not the first people to want this. In reading the issues on the Reveal.js repo, I ran into this request “Support for external HTML” from 2013 by my friend Larry Garfield. Since this was important to Zend and our presentations, I decided to take a crack at it.

If you read the thread that Larry started, you will see that it was suggested that he use the Markdown plugin for Reveal.js. It would load external files. I played with plugin this for a while. Yes, it would load external files of any kind, it does a lot of post processing to the content because it assumes it is Markdown. This post processing is complex enough so that after about 3 slides,  it starts to affect the outcome. In our case, the title slide lost its image as soon as we added a 4th slide to the external file.

One Solution

So I did what any decent programmer would do, I stole code from the Markdown plugin and created External. External is just the loader from Markdown, stripped of all it’s post processing. It is a very simple solution, but this problem did not require a more complex one. I do note in the header comments of External.js that it was blatantly ripped off from Markdown.

The README in the External repo gives instructions on how to install it and how to implement it.

For those who have heard me talk about PHP, this is “Scratch your own itch” development. I needed it, I wrote it, I am sharing it with you.

Until next time,
I <3 |<

p.s. yes, I could have solved this with a simple ?<php include...?>. But then it would only work if you were actually using the PHP server. I wanted something that would work no matter what your setup.

PHP 7 Is Alive!

PHP 7 Lives!

php 7 logo white

PHP 7 is now ready for release! It took more than 200 developers, more than a year of work, eight Release Candidates, and more than a few fights on Internals, but it is now ready for you to download and install.

What are you waiting for? Hit the download page now and grab your copy. Unpack it, and then configure;make;make install! (or however you install the latest version of PHP on your servers)

While you are waiting for it to compile and install (did I mention make test? you need to do that too) here’s a little video that was put together by “ElePHPant Studios”. I have it on good authority that “ElePHPant Studios is really Zend Israel in disguise. :)

So fire up those downloaders and heat up those space heaters you call CPUs. It’s time to do the “Download Dance”!