Posts

Link Post and Podcast Roundup: July 2016 Edition

My noteable links for July.

Read More

Link Post and Podcast Roundup: June 2016 Edition

Read More

Could We Teach PHP TDD First?

We recently hired in a new Junior Developer and it’s been interesting to see how well they understand the basic PHP functions but get a little lost when they use some of our more advanced OOP classes. If feels like forever ago I went off on a rant about how we teach programming in what feel like a backwards way to the way I work every day:

When I learned to program in an academic setting (over a decade ago), we learned the basics of programming first (if block, for loop, functions, etc.) and then object oriented programming. This makes sense because it allows you to quickly write programs that do something but I think it teaches you the “wrong” way to structure your code. I think because of this some of the programmers I’ve worked with have been really good at writing code that can be used in one place (and can be copied and pasted into others :-)) but haven’t always been good at writing code that can be unit tested and reused without duplication.

It’s caused me to think about learning PHP using TDD and what that would look like.

Return to Coding 101

When I learned how to program using C++ all those years ago I was given an example like the following (my guess is that this won’t compile so don’t even try it):

#include "iostream.h";

void main(){
    cout << "Hello World!" << endl;
    return;
}

If I recall correctly, the author of the book I was learning from then went into detail about what each line did but the amazing thing was that I was able to type this into an editor and it would compile. That’s all it took to get a program up and running.

After this we started learning about variables, control statements, and functions. It was only later that we learned about classes, inheritance, and polymorphism.

Only now I realize we learned about the very basic statements, then functions and how they’re composed of multiple statements, and finally classes which are composed of multiple functions. Small pieces build up to larger pieces. From a learning stand point this makes sense. It’s easier to get going quickly and maximize the “wow” of programming so we didn’t lose interest.

For a long time I really didn’t “get” how classes could make my life easier.

Inverting the Learning

So let’s look at what would be involved in learning PHP if we taught everything TDD first. We would have to invert the learning process of statements > functions > classes to classes > functions > statements. Practically, it would flatten our learning process from learn statements, then functions, then classes to just learn all three in one go.

Programming languages like C# force this concept on us because everything must be a class so I wonder if this is even a problem.

Comparing Hello Worlds

I think the most interesting part of any programming language is the “Hello World!” example. The basic PHP version is simple:

<?php
echo "Hello World!";

Hard to get simpler than that.

Now let’s look at a classed version:

<?php
class Application
{
    public static function run()
    {
        echo "Hello World!";
    }
}

Application::run();

This is the simplist version of this I could create. If we were doing it the best practice way we would move the class into it’s own file, use an autoloader, setup DocBlocks, and the biggest problem with this is that it’s not easily testable.

Building Up

Let’s think about this some more. We could use the code above as our learning application and build on it. By doing so we can teach best practices:

  1. Install composer and use it’s autoloader
  2. Break the entry point and the class into separate files
  3. Rewrite the hello world example to use unit tests

It makes our hello world example MUCH longer and harder to understand but I almost wonder if it’s worth it.

Speeding Up Site Generation in Jekyll

When I work on my site I start jekyll using the following command line:

jekyll serve --future --drafts

I like this because it shows me what I’m working on and regenerates the files as things are updated:

Regenerating: 1 file(s) changed at 2016-05-22 14:24:25 ...done in 5.648222 seconds.
Regenerating: 1 file(s) changed at 2016-05-22 14:24:43 ...done in 5.055759 seconds.

The downside to this is that if I’m quickly switching between proof reading a post and editing a post it gets a little slow waiting 5+ seconds for the page to regenerate (you should try it). I started looking into the documentation for jekyll serve and there’s an option that allows you to limit how many posts it uses:

jekyll serve --limit_posts 50 --future --drafts

This cuts down the time required to see my changes:

Regenerating: 1 file(s) changed at 2016-05-22 14:25:29 ...done in 1.168727 seconds.
Regenerating: 1 file(s) changed at 2016-05-22 14:25:49 ...done in 0.96031 seconds.

That 4 seconds makes a huge difference.

Lessons Learned from My First Symfony Project

I’m writing this post for two reasons:

  1. So others can learn from my mistakes
  2. So I have this documented somewhere other than my laptop

This post is almost completely a copy and paste job of the notes I created while I was building my last project using Symfony 2.7.

Read More

Setting the Execute Bit on a File in GIT

I do all of my primary development work on a Windows computer that runs several Vagrant VMs. The other day I needed to add an executable to my repo and have it be automatically marked as an executable file on all the servers (this project isn’t running Ansible yet so it’s not an option).

If I was running a fully Linux development environment I could just do the following:

chmod +x /path/to/file
git add /path/to/file
git commit -m "Added file"

But this doesn’t work because of the way Virtual Boxes virtual folders work. In order to do this I need to run the following in Windows:

git update-index --chmod=+x /path/to/file

Then I can commit the file and it will be marked as executable when it gets git pulled to the server.

Link Post and Podcast Roundup: May 2016 Edition

Here are this months links…

Read More

Validating Last Names

Most of my life I’ve been a Warren. When my wife and I got married we decided to take each others names and my last name became Keck-Warren. My assumption was that it would be hard to get the DMV to change my license but then I would be on my way.

But I was wrong. It turns out that it was easier to get some of my socially conservative family members to understand than it was to get some computer systems.

Why This is Stupid

People have crazy names and if you create a barrier that prevents then from signing up because their last name has a space or a hyphen they’ll go somewhere else. It also causes all kinds of information mismatches between sites and systems.

Insurance

I had to visit a hospital for a couple tests right after I changed my name and their computer systems didn’t accept hyphenated last names. I was shocked that a hospital’s computer system wouldn’t allow the hyphen. We were able to move on through the process by removing the hyphen but the real problem started when they tried to bill my insurance. My insurance had a hyphen in my last name but the hospital didn’t. Because of this mismatch it caused my insurance to reject the claim.

This was strike on against this hospital and I haven’t been back.

Site Registration

Several times over the last couple years I’ve tried to sign up at various websites only to be told that my last name isn’t valid. My first fix is to remove the hyphen and that usually fixes the problem.

What You Can Do To Help

Test your sites signup process with common last name “oddities” things like Keck-warren, O’Connor, “van der Wall”, and McDonald. Test with non-latin names like Авандеев and قذافي‎. Everything you can do to make sure new users can get in because the rest of us non-alpha character last name people will thank you and you might end up with a few more customers.

Rotate a Custom Log File in Ubuntu

As developers it’s super helpful to log information to a file so we can retrieve it later. The problem we run into is that over time those log files can take up a lot of space so it’s important to clean them up. We could do that manually by logging into the server and manually deleting them but that’s time consuming and it would be better if we could just have the server do it automatically.

Read More

Fixing the "fork failed - Cannot allocate memory" Error When Running Composer

The other day I tried to install the FOS User Bundle but I received the following error:

$ php composer.phar require friendsofsymfony/user-bundle "~2.0@dev"
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing friendsofsymfony/user-bundle (dev-master 16b04c4)
    Cloning 16b04c49af05dd3fb381e4abe04f0e5e231ac76d

Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory and not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details

PHP Fatal error:  Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///var/www/composer.phar/vendor/symfony/console/Application.php:954
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///var/www...', 954, Array)
#1 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(954): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(754): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(715): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(648): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(130): Symfony\Component\Console\Application->renderException(Object(ErrorException), Object in phar:///var/www/composer.phar/vendor/symfony/console/Application.php on line 954

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///var/www/composer.phar/vendor/symfony/console/Application.php:954
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///var/www...', 954, Array)
#1 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(954): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(754): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(715): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(648): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///var/www/composer.phar/vendor/symfony/console/Application.php(130): Symfony\Component\Console\Application->renderException(Object(ErrorException), Object in phar:///var/www/composer.phar/vendor/symfony/console/Application.php on line 954

In order to solve this problem I had to setup a swap file:

$ sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.54095 s, 697 MB/s
$ sudo /sbin/mkswap /var/swap.1
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=035dd6b9-2ff5-4597-bc7d-3f89f478e855
$ sudo /sbin/swapon /var/swap.1
RSS

Join Our Mailing List!

View previous campaigns.

Top Posts

  1. Working With Soft Deletes in Laravel (By Example)
  2. Fixing CMake was unable to find a build program corresponding to "Unix Makefiles"
  3. Upgrading to Laravel 8.x
  4. Get The Count of the Number of Users in an AD Group
  5. Multiple Vagrant VMs in One Vagrantfile
  6. Fixing the "this is larger than GitHub's recommended maximum file size of 50.00 MB" error
  7. Changing the Directory Vagrant Stores the VMs In
  8. Accepting Android SDK Licenses From The OSX Command Line
  9. Fixing the 'Target class [config] does not exist' Error
  10. Using Rectangle to Manage MacOS Windows

subscribe via RSS

All content copyright This Programming Thing 2012 - 2021
Blogging about PHP, MySQL, Zend Framework, MySQL, Server Administration and Programming in general