Category: Software

Jerry-rigging pygments to support new PHP keywords

I use rst2pdf to create my presentations and noticed that the syntax highlighter wasn't highlighting instanceof.

rst2pdf uses pygments for syntax highlighting, so I wondered what was going on. A short investigation led to me realise that the current stable version of pigments is 1.6 and they are working on 2.0. It seems that 2.0 has a number of changes to the PHP lexer, which aren't in 1.6.

While I'm waiting, I modified my local copy of pigments 1.6 directly!

On my Mac, the file I'm interested in is in the egg file at /Library/Python/2.7/site-packages/Pygments-1.6-py2.7.egg. The .egg file is simply a directory, so within there, I edited pygments/lexer/web.py which is where the PHP lexer is.

Open web.py and look for the PhpLexer class (it's around line 759 at the moment!). Scrolling further down, you come to the tokens section and then with the 'php' array, I found:

This is the list of words that will be highlighted as keywords. Simply add the new ones that you need.

I then deleted the web.pyc file that was in the lexer directory (though I'm unsure if I needed to as it may auto-recreate itself) and then ran rst2pdf again to create my pdf with instanceof, yield & finally now correctly highlighted!

Obviously, when the next version of pygments is released, hopefully it'll be up to date, so jerry-rigging won't be required. Until then, this is working for me, at least.

View status of all Vagrant environments

I've just upgraded to Vagrant version 1.6, and vagrant global-status is possibly my favourite new feature.

This command lists all currently up Vagrant environments wherever they may be on your computer:

As you can see by the helpful information message, you can then pass the id to any of the usual Vagrant commands in order to work with that Vagrant install rather than changing directory first.

I tend to use this to halt VMs that I've left running by accident! i.e.

All in all, a very useful feature!

Z-Ray for Zend Server 7

I see that Zend Server 7 has now been released.

I've been running the beta for all my development work for a while now and the main reason is the new Z-Ray feature. Z-Ray is a bar that is injected into the bottom of your page showing lots of useful information.

This is what it looks like in its closed state when run on my development version of joind.in:

Z ray1

At a glance, I can see that this page's performance is acceptable, there's a notice that I need to look at and that 11 database queries were executed.

Continue reading

Perl syntax highlighting in Sublime Text 3

I'm currently writing a project in Perl for a client and have discovered that the default Perl syntax highlighting in Sublime Text is terrible.

Fortunately, the community has stepped up and Blaise Roth has created the ModerlPerl package. Install via Package Control.

To get all Perl files to open with the new syntax highlighter, use View > Syntax > Open all with current extension as… and select ModernPerl from the sub-menu.

Setting up Zend Server 6 on OS X for PHP development

I recently decided to upgrade my Mac's PHP to 5.4. One of the available options is Zend Server 6.1, Free edition. These are my notes how to set it up so that it works the way I develop.

Installation

Mount the disk image and follow the installation wizard. On OS X, Zend Server installs PHP, Apache and MySQL inside /usr/local/zend.

The Zend Server admin interface is at at http://localhost:10081. On first run you have to go through a wizard. I picked development for my Launch Option. You have to set an admin password – as it's my dev machine, I picked something simple :)

More information is available from Joe Stagner's guide on devzone. Ignore the bit about editing php.ini though as you can do that via Zend Server's admin system.

Apache

Like Joe, I also want the Apache running on port 80. Edit /usr/local/zend/apache2/conf/httpd.conf and replace Listen 10888 with Listen 80.

Note that the default localhost directory is /usr/local/zend/apache2/htdocs and the Apache processes run as user daemon with group daemon.

Zend Server admin

Once logged in, you can configure Zend Server:

Configuration -> PHP:
Set your PHP settings are required. Then press Save. To restart the server, click the button with two arrows in a circle on the toolbar.

You must set the date.timezone to stop the PHP warning. I also set sendmail_path as I like to redirect email on my development box.

Configuration -> Components:
Look down the list and turn off what you don't need. I turned off Zend Data Cache, Zend Job Queue and Zend Page Cache in addition to what is already off.

Command line control

Add the relevant Zend Server paths to your environment. Edit .bash_profile and add

to the bottom. This will give you access to the php, mysql and other Zend Server related CLI tools.

zendctl.sh

The main CLI tool to control Zend Server is zendctl.sh. The most interesting commands are:

  • sudo zendctl.sh restart-apache to restart Apache
  • sudo zendctl.sh restart-mysql to restart MySQL

MySQL

Zend Server supplies MySQL version 5.5.27 rather than 5.6 for some reason. If you want 5.6, then grab it from MySQL's website or homebrew.

If you use your own MySQL, then stop Zend Server from starting its one by editing /etc/zcd.rc and changing MYSQL_EN=true to MYSQL_EN=false.

If you're using Zend Server's MySQL, then set a root password:

I also had to link mysql.sock to /tmp so that some mysql CLI applications would work:

  • sudo ln -s /usr/local/zend/mysql/tmp/mysql.sock /tmp/mysql.sock

Apache vhosts

I couldn't work out how to configure Apache virtual hosts in the Zend Server admin unless you had an "application package", so I did them manually.

Apache is configured to look in /usr/local/zend/etc/sites.d/ for files names globals-*.conf and vhost_*.conf.

I created globals-vhost.conf:

And then I have vhost_dev.conf to configure my virtual hosts:

This allows me to put my development files in /www and sets up automatic virtual hosts for http://*.dev.

Fix sending email

Sending email doesn't work out of the box. To fix:

See here for details.

Logs

The Zend Server admin displays your logs via Overview -> Logs. There is a list of log files down the left hand side. The interesting ones for me are:

  • error: Apache error log (/usr/local/zend/var/log/error.log)
  • access: Apache access log (/usr/local/zend/var/log/access.log)
  • php: PHP log (/usr/local/zend/var/log/php.log)

That's it. Zend Server now works as a development stack and you get the nice diagnostics features like code tracing and the events list.

Password less command line scripts with MySQL 5.6

I have a number of command line scripts that copy MySQL databases down from staging servers and store them locally. These scripts set the password on the command line using the -p option.

With MySQL 5.6, a new warning is displayed every time my scripts run:

This is annoying!

The way to solve this is to use the new command line tool mysql_config_editor to set up a "login path" which the mysql command line client can then use.

You will then be asked to enter the password for the user that you've set, 'restore' in this case.

Now, you can log in to mysql on the command line using:

and note that you didn't need to enter a password!

In my case, I then changed my scripts so that the restore line looks like this:

Adding Diff syntax highlighting to Sublime Text

My chosen colour scheme for Sublime Text doesn't include support for diff/patch files, so I added my own.

To the bottom of my .tmTheme file, I added this just above the closing </array>:

This sets up a green colour for the meta information, blue for added lines, red for deleted lines and a yellowish colour for changed.

Notes on embedding fonts in rst2pdf

I wanted to use Helvetica Light in a PDF that I'm creating using rst2pdf and this proved a little tricker than I expected.

Note that to use fonts with rst2pdf, you need to install fontconfig using brew:

Now, on to the problem!

In this case, I discovered that setting stdFont: Helvetica-Light or stdFont: HelveticaLight in the style file resulted in Verdana being used in the PDF file!

Fortunately, the -v switch to rst2pdf is your friend when you want to know what's happening:

As can be seen by the output, rst2pdf can't find Helvetica-Light and so has substituted Verdana instead. This would seem to be because it couldn't find a TTF file for the font on my Mac as Helvetica Light is stored in a dfont file.

To solve this, I used DFontSplitter to extract Helvetica Light as a separate TTF file and added this as an embedded font to the style file:

and re-ran with -v which gave me this information:

I now know that the name to use when referencing this font is "fonts/HelveticaLight" and so I can use it within the style file like this:

and the font is embedded as I expected.

Improved Sublime Text 2 PHP getter and setter generation

As I've been using Sublime Text 2 for all coding for the last year, I've noticed a significant problem with my simple 'getset' snippet that I created last year: it doesn't handle underscores in property names correctly.

I've finally got around to fix it!

As with a lot of editors, Sublime Text supports snippets which are essentially text expansions of a short phrase into more text. This snippet creates a getXxx() and setXxx() method from a property name.

To create a snippet, go to Tools->New Snippet... and replace the code example provided with this:

Save the file as getset.sublime-snippet and you're done.

To use, simply type gs followed by tab and it will automatically expand and you can then type your underscore_separated property name and the correct method names will be created.

Alternatively, select some text and press shift+cmd+p and then type gs to automatically replace the selected text with the get and set methods completed for the text that was selected.

As an example, typing gs {tab} date_last_updated will produce:

I've also updated the snippet in my sublime-akrabat package on github.