It's that time of year again, the PHP North West conference is almost upon us, and this year they are once again running a hackathon. These events are a great way either to carve out some time to get your head down and hack on an idea that's been in the back of your mind for a while, but they're also a fabulous way to get involved in collaborating on projects. At PHPNW, you'll find there are quite a lot of open source projects at the hackathon, standing by to take on anyone interested in getting involved, either just for the evening or beyond. I'll be there, representing joind.in, a tool which is used by the conference itself. So what kinds of things will there be to do and how can you get involved? Continue reading
Slim framework has recently invaded my life, I picked it up for a hobby project, recommended it to a client who then contracted me to do quite a lot more development, and it's also used for m.joind.in. One thing that has tripped me up a couple of times is how to return not-HTML from Slim as it just bins any headers you try to send yourself. I think also that the "right" way to do this may have changed between versions as I also found some examples that didn't work! What did work for me was this:
$app variable is the Slim\Slim instance for your application, once you have that, you can just add on any headers you need to with this call to
header(). It wasn't obvious to me and there weren't a lot of resources for this, so I thought I'd share!
In this series of posts about my screencasting toolchain, I've already written about using wmctrl to resize windows accurately and about using Kazam to capture snippets of video from various applications. This post describes my adventures in trying to glue the video snippets together.
Graphical Video Editing
For most people, it probably makes sense to use a graphical video editor, such as KDEnlive, OpenShot or Pitivi. I tried the latter two and found them sufficiently crashy that I was unable to get a video out of them that I could play back. This might be a result of my total lack of knowledge of, and respect for, containers, codecs, and ... really whatever else I needed to know and didn't. I presume the crashiness was me doing something wrong as I know that others do use these tools successfully.
I'm also a commandline sort of person. I have difficulty in using a pointing device for any length of time, and I found that I was able to capture the videos tightly enough that I just needed to glue them together rather than actually edit.
Ffmpeg is a commandline linux tool that is the biggest swiss army knife of video tools you have ever seen. There's just one problem: on ubuntu, the program called ffmpeg is actually an alias for avconv, which is a fork of ffmpeg that is missing some key elements, such as the ability to concatenate videos. The upshot of which is that I downloaded and compiled my own copy of ffmpeg for this project. Once I had that, things got easier :)
I used this guide to get my ffmpeg tool and all the dependencies set up: https://trac.ffmpeg.org/wiki/UbuntuCompilationGuide
Ffprobe is a tool that looks at a video file and gives information about it. One thing that I found about combining videos is that matching resolutions and encodings are really important - sometimes you can create what looks like a valid output file, only to have it unable to play in some players. To use it:
I found this very useful, so I thought I'd add a note about it here. I tested my videos in VLC, it seems a bit less tolerant than the standard gnome player, so it was a good way to check if the videos would play. There's also a simpler version of VLC that shows fewer controls:
cvlc (I found it handy).
Combining Videos with Ffmpeg
Once I had the genuine version of ffmpeg compiled, I used that to combine my videos. First of all, I created an input file which contained a list of videos. Here's an example of my
file 'wireshark1.mp4' file 'wireshark2.mp4' file 'wireshark3.mp4' file 'wireshark4.mp4' file 'wireshark5.mp4' file 'wireshark6.mp4' file 'wireshark7.mp4'
(can you guess what this was a video of?)
Then I used the following command to use this input file and create a resulting video of these videos played one after another:
./ffmpeg -f concat -i input.txt -c copy wireshark-demo.mp4
This can look successful and still produce a bit of a strange video if all your video files aren't precisely the same resolution and format, but I was able to get results pretty quickly once I knew I had to get those things right in recording. The time spent planning the videos paid back several times over, as it was easy to just recapture one piece of the sequence if the need arose.
Ffmpeg is a beast, powerful but superbly complex, and it was tough going to find the commands I needed even without the "wrong" fork of the project being the default with ubuntu! Hopefully this post will remind me next time what to do, and if it helps you too, then awesome :) Feel free to leave additional tips and tricks in the comments.
I'm writing more and more things that are not code these days, and my content-managing toolchains are becoming more developed all the time. I've written in REstructured Text, Asciidoc, and LaTeX, and today I'm working on an article which eventually wants to be HTML but I'm creating in Markdown because it's much easier.
My swiss army knife of document formats is a program called pandoc. It's absolutely fabulous, powerful, and not too complicated if you don't need to do anything too complicated. It will guess input and output formats from file extensions, or you can be more specific if you need to. Today's command looks like this:
pandoc article.md -o article.html
You won't be surprised to hear that this command takes a file called
article.md which contains my markdown, and outputs a file called
article.html containing the HTML. I also use this to convert between all the various text markups, HTML, but also PDF and office document formats - it's a very comprehensive tool!
If you've ever seen a live demo, you will know that these things are fraught with danger. Even if the wifi works, the presenter knows what they are doing, and nothing crashes, you'll often end up watching someone explaining something to their laptop in detail, or clearly demonstrating their inability to type. Either way, it doesn't make good, informative content, which is why I never ever demo in a conference talk - I'm there to entertain and time is always of the essence. At this point, you can probably guess why I'm writing a blog post about my screencasting toolchain - I simply pre-record whatever it is that I want to show in the talk.
On an ubuntu platform, I've had a few false starts with video over the years, and mostly avoided it. But now my "Debugging HTTP" talk really does make more sense if you can see the process of something broken, what the tools show, and how to understand that information and fix the problem.
For the last ... really long time ... I've been working on a place to put the cookery books in the "new" kitchen. Since the kitchen was finished early in 2011, that's been quite a long-running project! It's finally finished though and I thought I'd share a bit about how I made it (not least because I get nagged about the lack of non-geeky posts on this site - you know who you are!) Continue reading
I'm working on a bunch of screencasts at the moment (more posts to come) and one of the things that tripped me up the most was getting all the windows the same size, so that the resulting videos are the same size and can easily be put back together. Enter
wmctrl, a very nice linux tool that can do all of this for me.
I'm aiming to have a series of windows all sized at 800x600, and the first step is to look at a list of windows in wmctrl:
-l switch provides a list, and the
-G switch shows the geometry of the windows. This is especially useful if you want to place something on a second monitor, you can look where a correctly-placed window would go and then use those co-ordinates! Also beware that windows positioned at the origin of a desktop space rarely end up where you expect them to go.
To set a new geometry for a window, we use the
-e switch to specify what that should be. The format is:
"gravity, X, Y, width, height"
For gravity, try zero. X and Y are the co-ordinates of the top left hand corner of the window, and width and height hopefully you can guess. It's also acceptable to pass -1 for any of these values for the window to retain its current setting.
To specify a window, we use the
-r switch to indicate to
wmctrl which window wants the resize. You can give the title of the window, or the identifier shown in the list output, but I found it most useful to use the special value
":SELECT:" and then just click on the window I wanted to affect. Therefore the command I used the most became:
wmctrl -r ":SELECT:" -e "0, -1, -1, 800, 600"
As a final tip, make sure (by resizing the window to something definitely smaller than the desktop it is on) that the window is not maximised - if it is, it will stay that way and you will wonder what you are doing wrong.
I've got an application (okay, scratty PHP script) which glues together some API things and shows them onto a dashboard for me. Recently, I updated it to use Guzzle as the consuming client, since twitter now needs me to authenticate (I wrote about that if you're interested), and I used Composer to bring the new library in. It was very simple so I thought I'd share it as it's quite minimal example, and those are my favourite kind. Continue reading
As a conference speaker, I've read the books on how to be a good conference speaker, and coached quite a few people to raise their skills in this area too. However recently I've been meeting more virtual audiences, both delivering virtual training and doing virtual events such as DayCamp4Developers, and I thought I'd share my take on what works well in a setting where people can see your slides, and hear your voice ... and nothing more. Continue reading
I used this trick to solve a particularly sticky problem last week, so I thought I'd share. I had a 3rd party SOAP service (except it was actually a .NET WCF service, which is almost SOAP but not quite) which didn't behave in accordance with the way its documentation said it would. PHP's
SoapClient has the ability to enable tracing and give information about the request/response headers/body, which is useful, but I needed to store the outputs and also rewrite a particular request header during the course of debugging this. Enter: Charles Proxy. Continue reading