Archive for category IT

PHP Development in Eclipse

I used Eclipse on a Mac to work with Java during my PhD, so familiarity made it seem the logical choice for some recent PHP development I've been doing. This post runs through the various plugins I added to support the development process, including checking code quality, running unit tests, and creating documentation.

The first step is obviously to install Eclipse. To ensure compatibility with all the plugins mentioned, I found it necessary to download the standard version of Eclipse and then install the PDT tools afterwards. The dedicated all-in-one PDT version of Eclipse didn't play ball with everything I needed it to.

 

Version Control – Subclipse
I use Subversion (SVN) for version control, and Subclipse seems to to be the de-facto client for Eclipse. However, there are some pitfalls to be aware of. If you install Subclipse and then try to add a respository in the SVN Perspective, you may get an error telling you that you need version 1.7 or higher of the JavaHL library. This is part of the Subversion binary, so your copy of SVN must be out of date. If you nip over to Collabnet for the latest version you'll find that they only have 1.6, so instead you'll need to visit WANDisco. Once 1.7 is installed, you should then be able to connect with Subclipse using the JavaHL library. Thanks to peeps on Stackoverflow for pointing this out.

Unfortunately JavaHL still failed for me, telling me that the network connection closed unexpectedly. I tried to use the SVNKit adapter instead of JavaHL, but it turns out that SVNKit isn't supported in version 1.8 of Subclipse, (the most recent version). I therefore uninstalled Subclipse v1.8 and installed v1.6 instead. That still didn't work because apparently SVNKit doesn't currently support SVN 1.7 (see previous link). Anyway, this turned out to be all a bit misleading, because when I tried it everything just worked.

 

Debgugging – Xdebug
If you want to debug PHP, then you'll need either Xdebug or Zend Debugger. I chose the former for reasons I can't quite recall. But setting it up required the following steps in Eclipse:

  1. In Preferences > PHP > PHP Executables, set up your PHP executable. Mine, the default Lion version, was at /usr/bin/php, and php.ini was at /etc/php.ini
  2. In Preferences > PHP >  PHP Servers, set up your PHP server. I had to delete the "default" one first.
  3. In Preferences > PHP > Debug, set your debugger, server and executable.
  4. If you've changed the Xdebug port from the default of 9000 for any reason (I had problems with my initial Xdebug install, and that was one of the suggested fixes), don't forget to correct it in Preferences > PHP > Debug > Installed Debuggers.

 

Debugging with Xdebug. The 'debug' panel shows the methods which are currently running, while the relevant code is shown below. Panel on the right shows variables and their current values.

Debugging with Xdebug. The 'debug' panel shows the methods which are currently running, while the relevant code is shown below. Panel on the right shows variables and their current values.


Coding Standards – PHP Code Sniffer

To ensure that your code is up to standard(s), you can install PHP_CodeSniffer with PEAR:

pear install PHP_CodeSniffer

There's more detail on their homepage, including information on the –report flag to get a summary of the errors in your entire project instead of all the detail for every file. I'd recommend creating your own customised standard so you can exclude errors you're not bother about (variables with single-letter names, for example). Once you've done that, you can also make your standard the default to be used each time you run PHPCS.

PHP Code Sniffer summary report.

PHP Code Sniffer summary report.


Coding Problems – PHP Mess Detector

PHP Mess Detector does a good job of finding nasty bits of code. This includes 'dead' code that's never run, complicated loops / nested ifs,  It's worth reading the section on how to create a custom ruleset, because the defaults may include tests that you want to exclude.


Unit Testing – PHPUnit

Unit testing is a great habit to get into, and test-driven development takes this to its logical conclusion. PHPUnit and SimpleTest both provide unit testing in PHP; I chose PHPUnit because there seemed to be more material online about how to use it. To install PHPUnit you can use PEAR. Unfortunately PEAR wasn't installed on my Lion system, but you can install it using wget.  Unfortunately wget wasn't installed on my Lion system, but you can install it with a number of terminal commands.

Once wget is installed and then PEAR is installed and then PHPUnit is installed (!), you can set up Eclipse to run it as an external tool. However, it's much nicer to get it integrated into your Eclipse installation. To do this, I used MakeGood. The instructions on their website are pretty easy to follow and essentially boil down to:

  1. Install the MakeGood plugin from within Eclipse, using http://eclipse.piece-framework.com as the URL
  2. DON'T  ignore the lines about having to specify a PHP executable; I did (because I already had an executable defined), but for some reason the executable had disappeared from my Eclipse preferences and so I had to add it again after much head-scratching.
  3. DO display the MakeGood 'view' in your Eclipse window as soon as possible – it has a nice little message which explains what might be stopping you running your tests.
  4. A message about Stagehand_Testrunner led me to install that separately, using PEAR (instructions are on the Stagehand website)
  5. Despite adding my PEAR folder as a library to the project build path, I was still getting a message saying that PHPUnit_Framework_TestCase could not be found when I ran a test. I resolved this by adding /Users/Haydn/pear/share/pear/PHPUnit to the build path too, and using require_once in the test class:  require_once 'PHPUnit/Autoload.php';
MakeGood showing a successful test in Eclipse.

MakeGood showing a successful test in Eclipse.

Once PHPUnit is working correctly, if you want to test database operations too then you'll need the DbUnit extension. There's extensive help regarding this whole subject area in the PHP Unit manual. Note that SQL Server isn't supported by default.

 

Documentation – PHPDoc
If you're documenting your code then you'll want phpdoc – installation instructions are on their website. Just use the two PEAR commands on their homepage, and ignore other websites (which generally omit the '-alpha' reference). If you try and generate some documentation but get an error about GraphViz not being installed ("Unable to find the `dot` command of the GraphViz package. Is GraphViz correctly installed and present in your path?"), go to the GraphViz website to download a .pkg file for Lion and install it. If you get a message about timezones, ensure that the correct one is set in your php.ini file (e.g. date.timezone = Europe/London).

 

Automation – ANT
Once all the above are in place, it's nice to be able to run them all together. You can use ANT to do this; here's an example of my ANT build.xml file:
<?xml version="1.0"?>
<!DOCTYPE project>
<project name="MyProject" default="test">
    <property name="docs_dir" value="docs" />
    <property name="log_file" value="MyLogFile.log" />
    <target name="dtd" description="Creates a DTD for this build.xml file.">
        <antstructure output="project.dtd"/>
    </target>
    <target name="clean" description="Deletes temporary and compiled files.">
        <delete dir="${docs_dir}"/>
        <delete dir="output"/>
    </target>
    <target name="messdetect" description="Runs PHP Mess Detector on PHP files.">
        <exec executable="/Users/Haydn/pear/bin/phpmd" failonerror="true">
            <arg value="." />
            <arg value="text" />
            <arg value="anciliary/PHPMD_custom_ruleset.xml" />
        </exec>
    </target>
    <target name="codesniff" description="Runs PHP Code Sniffer on PHP files.">
        <exec executable="/Users/Haydn/pear/bin/phpcs" failonerror="true">
            <arg value="." />
            <arg value="--standard=MyStandard" />
            <arg value="--extensions=php" />
            <arg value="--report=summary" />
        </exec>
    </target>
    <target name="test" description="Runs all PHPUnit tests.">
        <exec executable="/Users/Haydn/pear/bin/phpunit" failonerror="true">
            <arg value="test" />
        </exec>
    </target>
    <target name="document"  depends="clean" description="Generates documentation for PHP files.">
        <exec executable="/Users/Haydn/pear/bin/phpdoc" failonerror="true">
            <arg value="-d" />
            <arg value="." />
            <arg value="-t" />
            <arg value="${docs_dir}" />
        </exec>
    </target>
    <target name="build" depends="clean,messdetect,codesniff,test,document" description="Run everything.">
    </target>
</project>
Next?
The next step is to move to continuous integration, using packages like Cruise Control or phpUnderControl, which will automatically test and build your code on a regular schedule. As a one-man project I always know the status of my work, so that's not been necessary so far. Hopefully the above will be of help in getting you up-and-running with a decent PHP development workflow in Eclipse.

Tags: , , , , , , , , , , , , , ,

NHS Claims Dashboard

Time for a couple more NHS-related dashboards, this time looking at claims made against NHS organisations. There are three main schemes that are run – Clinical Negligence Scheme for Trusts (CNST), Risk Pooling Scheme for Trusts (RPST) and the Existing Liabilities Scheme (ELS). CNST and ELS relate to clinical negligence claims post- and pre-1st April 1995 respectively, while RPST covers non-clinical claims. All three schemes fall under the umbrella of the NHS Litigation Authority (NHSLA).

Handily, the NHSLA makes available data relating to the number and value of claims, released each year as "Factsheet 5" in the "NHSLA Factsheets" section (doesn't work in Safari). Factsheet 3 gives graphs by specialty, although not raw numbers it seems, and includes the possibly surprising fact that nearly 40% of claims last year were abandoned. I've combined the high-level raw data from 2003/04 to 2010/11 into one large dataset and then performed some extra manipulation to sanitise it a little (see the end of this post if you want the details).

The number of claims has escalated in recent years, as has the amount of money being paid out,  and hopefully the charts below show these trends in an easily-digestible format. One word of warning though: think carefully about the numbers involved. The second dashboard shows the amount paid out in total across all schemes, which last reached £860 million pounds, and the figures being circulated [edit: link no longer working, unfortunately] for potential liability across all current cases top £16 billion. Numerous publications have looked into the reasons behind the changes, ranging from increased numbers of claims in times of recession, to increased – or non-existant – upper limits to claim values. This isn't my area of expertise, so I'll leave it to others to interpret the stats accordingly.

Speaking of stats, the NHSLA themselves put some good information on the front worksheet of each "factsheet" that they publish, and I would encourage anyone digging into these figures to read that blurb too. Note that, as discussed above, I have amended the data in the interests of collating it into a single dataset, so whilst I accept responsibility for any errors and/or omissions resulting from that process, the raw data provided by the NHSLA  should always be taken as the gold standard for anyone drawing major conclusions from the information presented here.

The first dashboard looks at the numbers of claims received, including a comparison of whether a PCT with a larger population has more claims, while the second focuses on the cost of these claims overall, and the damages paid out.

 

 

Notes on the Data:

The standard data has been manipulated a bit to create my final version.  Note that the requirement to change the data shouldn't necessarily be viewed as confirmation that it is inherently flawed; most of these amendments were made to facilitate analysis rather than correct errors. The revised dataset used to create the dashboards above can be downloaded here(MS Excel spreadsheet, 3Mb). The following changes have been performed:

  • Combined the 'Trust' and 'PCT' sheets
  • Standardised organisation names, using the most recent name on a sheet (2010/11). This is basically to harmonise name changes, e.g. a Trust becoming a Foundation Trust, and also deals with spelling errors and different abbreviations used across the years (e.g. "Mental Health Trust" vs. "MHT"). Some discrepancies will still be present where, for example, Trusts merged or split during the sample period.
  • Filled in blanks for Strategic Health Authority using most recent values (one set of names is used to 2004/05, all are blank for 2005/06, a new set is used after that)
  • Amended population values for 2010/11 from 000s to actual number, e.g. 306.5 becomes 306,500

Tags: , , , , , , ,

Patient Safety Dashboard 3: Organisation

Patient safety dashboard number three has now been released, looking at trends over time within a particular organisation. You can see all the info given by the NPSA from the NRLS, including median time to report, a breakdown of incident categories, and track the reporting rate too. As per all the dashboards, check my original post for caveats and links to further notes on the data.

Click to view Patient Safety Dashboard 3: Organisation

Click to view Patient Safety Dashboard 3: Organisation

Click here to view
Patient Safety Dashboard 3 : Organisation

What's next? Well I've now released dashboards looking at the broad spectrum of NRLS data, from a comparison between national clusters down to individual trusts and services. There will be one final NRLS dashboard, looking at more left-field ideas such as what the geographical distribution of incidents is, and whether Trusts which don't report many low-harm incidents are still good at reporting the more serious ones. After that I intend to move onto to some non-patient safety info, and then some other NHS-related data including clinical negligence claims (there're some big financial values floating around in those data!). Keep any eye on the blog by subscribing to the mailing list (signup to the right of this post), to the RSS feed, or by following me on twitter – @hwwilliams

Tags: , , , , , , , ,