Time Tracking
A number of times clients ask how I track my time. And each time I have to explain that I built some software specifically to meet my needs. The software is a continual work in progress, the codebase is ancient and I hate working with it, although I still actively use it to track my time. But, for those who are wondering here is a quick demo of what we use here at TNL Total Solutions.
I'm also going to make it available for download. Just keep in mind, this was never intended for public consumption, some buttons don't do anything, there are annoying bugs that no one has gotten around to fixing and there is no documentation. The demo above does explain how everything works (mostly). Nonetheless, here is a copy of the current build for you to check out.
Download Link: Download TimeTrac v1.6
Cheers!
Brian
Displaying a subversion commit log with PHP

I was recently tasked with a small project that had to pull commit logs from various subversion servers and repositorys and display them on a web page.
The process was a lot simplier than I first anticipated. Hopefully someone else will find this useful. This php code snippet requires that the server have SHELL_EXEC() enabled and subversion must be installed. We'll use the SHELL_EXEC() function to actually use the subversion cli to grab the commit log from a remote server and store it in an xml file.
I'll break down the code a bit. This first bit, is a simple helper function that will help us read the XML file itself. We call the function xml_atrribute().
function xml_attribute($object, $attribute)
{
if(isset($object[$attribute]))
return (string) $object[$attribute];
}
Next up is to actually run the subversion CLI client with all of the correct parameters to generate an xml file of the commit log. You will want to adjust the server, username, password, repository name and output path to meet your needs.
$test = shell_exec("svn log --xml --verbose svn://svn.mydomain.com/reponame --username USERNAME --password PASSWORD > /home/html/svnlog/reponame.xml ") ;
Alright, at this point we should have a nicely formatted XML file that we can read, loop through and display information from. Here is a simple bit that loops through the various XML elements and displays them. As commented we go one step further than just reading the commit comments, we actually display the files and what action was performed on them.
foreach ($xml->logentry as $logentry)
{
$date = date('m/d/Y', strtotime((string) $logentry->date));
foreach ($logentry->paths as $paths)
{
echo ' <BR><B>Revision: ' . xml_attribute($logentry, 'revision') . '</B>';
echo ' <BR>Date: ' . $date;
echo ' <BR>Message: ' . $logentry->msg;
echo ' <BR>Commited By: ' . $logentry->author;
echo ' <BR> ' ;
/* Now lets loop through and get a
list of files that have changed
in this commit */
echo '<UL>';
foreach ($paths->path as $path)
{
echo "
<li>" . $path['action'] . " " . $path . "</l1>";
}
echo '</UL>';
}
}
Here is the entire script all put together and commented:
<?php
/* This is a helper function
to aid in reading our XML
file we are going to create */
function xml_attribute($object, $attribute)
{
if(isset($object[$attribute]))
return (string) $object[$attribute];
}
/* Run SVN to get an xml file
of the commit log.
SHELL_EXEC() must be enabled
on the server.
*/
$test = shell_exec("svn log --xml --verbose svn://svn.mydomain.com/reponame --username USERNAME --password PASSWORD > /home/html/svnlog/reponame.xml ") ;
/* Pull the XML file in */
$xml = simplexml_load_file(dirname(__FILE__).'/reponame.xml');
/* now lets roll through the XML and display the results */
foreach ($xml->logentry as $logentry)
{
$date = date('m/d/Y', strtotime((string) $logentry->date)); // format the date
foreach ($logentry->paths as $paths)
{
echo ' <BR><B>Revision: ' . xml_attribute($logentry, 'revision') . '</B>';
echo ' <BR>Date: ' . $date;
echo ' <BR>Message: ' . $logentry->msg;
echo ' <BR>Commited By: ' . $logentry->author;
echo ' <BR> ' ;
/* Now lets loop through and get a
list of files that have changed
in this commit */
echo '<UL>';
foreach ($paths->path as $path)
{
echo "
<li>" . $path['action'] . " " . $path . "</l1>";
}
echo '</UL>';
}
}
?>
It's worth noting that when we read in the XML file we assume it lives in the same directory as the script reading it does. You can adjust this as needed. I Hope this is helpful to anyone out there needing to do something similar. The full source is here: svnsample.zip.
12 Tips To Help You Communicate With Your Developers
I Don't usually blog just to reproduce another thing I already saw, hense the slowness in new post. But I keep going back to this one.. It could be because I haven't slept in two days or maybe I keep going back because it's perfect...
The article is here: http://blogs.sitepoint.com/12-tips-for-better-developer-communication/
I'll Feel bad for reprinting it all but here is the best of it:
As an internet business owner you’ll need to face your developers. Yes, it’s scary — they probably look odd and speak a weird language. But you can’t avoid it. Here are my 12 tips to help you communicate with your development team…
1. Know Your Requirements…
How can you explain your requirements if you don’t know what they are? Developers are often faced with vague, wishy-washy briefs such as “it needs to be just like Facebook, only — er — like, different”.A good developer will immediately begin to analyze your idea. They’ll ask questions. They’ll pose “what-if” scenarios. No one will expect you to have all the answers, but you should be able to discuss the majority of problems. If you can’t, you haven’t thought the project through. It’ll fail.
2. …and Document Them
Putting your requirements on paper may not be fun, but it’s necessary. Interface sketches and flowcharts will help you identify functionality, understand the technicalities and explain issues.Consider hiring a systems analyst if you can’t do this yourself. They’ll ask identical questions, though.
3. Don’t Use Pseudo Code
If you’re not a programmer, please, please don’t attempt to write pseudo code — it won’t help. You’ll almost certainly over-complicate the easy stuff and gloss over the complexities. Your developer will need to reverse engineer your ‘code’ to determine what you actually wanted to achieve.Pseudo code is useful when developers discuss algorithms with each other. There are few other reasons to use it.
4. Agile Programming is Not an Excuse for Poor Planning
Don’t think that rapid, agile software development excuses requirements analysis. It may reduce some of the up-front planning, but you’ll still need to make just as many decisions — if not more.5. Be Clear and Decisive
Programmers make thousands of decisions on your behalf. However, they will inevitably have questions during the development process and failing to providing a definitive answer will halt progress.As good manager, you’ll take responsibility, make a prompt decision, stick with it, and face the consequences if it’s wrong. Bad managers are unavailable, avoid answering the question, seek opinions from 57 other (disinterested) colleagues, then blame the developer for delays or bad decisions.
6. Stay Ahead of Your Developers
Good programming teams will have a development plan — components and features will be implemented in order. Understand that plan and prepare accordingly:
know what decisions need to be made prior to implementation
prepare dummy data or test cases
organize the production of content, graphics, videos or other media.7. Avoid Scope Changes
Changing scope can destroy a project and put a deadline at risk. You may have seen a cool feature elsewhere, but it doesn’t need to be implemented immediately.
By all means, have an informal discussion with your developer. State it’s something you’re considering for a later version — don’t distract them from the agreed tasks or demand immediate attention.8. Don’t Assume Anything
One of the worst statements made by non-developers is: “Hey, we should implement feature X. It’s easy, right — it’ll only take a few hours.”
It might take a few minutes. It might take months. It might be impractical. It might be technically impossible. You don’t know — if you did, you wouldn’t require a developer to implement it for you.9. Set Realistic Deadlines
Like anyone, developers work best when they have an agreed deadline. However, those deadlines should be set by the developer themselves or someone with programming abilities and in-depth technical knowledge of the system. Setting an arbitrary or unrealistic deadline will result in a bug-ridden monstrosity which takes far longer to fix.10. Alter Your Schedule When Necessary
Application development is complex. Development estimates are just that — estimates. Programmers will encounter unforeseen problems and changes to the project scope (no matter how hard you try to avoid them).The schedule will inevitably change as the project progresses. Do not be afraid to modify the completion date accordingly.
11. Test Your Own Application
Don’t rely on your developers or other people to test your application. It’s your vision: test it yourself at every opportunity.That said, be aware you may be running unfinished code and check progress against the development schedule. Don’t send emails ranting about feature Y not working when that code hasn’t been started.
12. Stay Involved and Keep Communicating
Most people lose interest in their own projects as time goes on. If you can’t remain enthusiastic, don’t expect it from others.Contact your developers on a regular basis. You don’t necessarily need to organize formal progress meetings — just show your face and ask how things are going.
That said, avoid pestering them. Your project won’t be completed quicker if you call your developer every 10 minutes to ask “are we there yet?” Let your developer do their job.
Ok maybe that is all of it but it is awesome, and you should read all of Craig Buckler's other stuff...
::Awaiting DMCA takedown notices::
TweetCompiling Darwin Streaming Server 6.0.3 Under Debian.
I was recently tasked with a Linux install of Darwin Streaming Server on a Debian server. Unfortunately for me Apple stopped making Windows and Linux builds of DSS when version 6.0 was released.
After a lot of failed attempts at compiling from source on Linux I came across a wonderful post that had a shell script that would install all dependencies, download the source plus a handful of patches, compile and install v6.0.3 on Ubuntu 10.x. A few tweaks and I was able to get it to work for my install of Debian.
For the life of me I can't find the page again where that script was located, and apparently I'm not the only one. A google search brings up a whole lot of dated material mostly for DSS 5.x.
You shouldn't run into problems with these, I've used them several times now and they work pretty well. Be sure to run them as root though.
Debian 5.0 & 6.0 DSS Compile Script:
#!/bin/bash apt-get install build-essential wget addgroup --system qtss adduser --system --no-create-home --ingroup qtss qtss wget http://static.macosforge.org/dss/downloads/DarwinStreamingSrvr6.0.3-Source.tar tar -xvf DarwinStreamingSrvr6.0.3-Source.tar mv DarwinStreamingSrvr6.0.3-Source DarwinStreamingSrvr6.0.3-Source.orig wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/dss-6.0.3.patch patch -p0 < dss-6.0.3.patch mv DarwinStreamingSrvr6.0.3-Source.orig DarwinStreamingSrvr6.0.3-Source wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/dss-hh-20080728-1.patch patch -p0 < dss-hh-20080728-1.patch #need to answer n then y cd DarwinStreamingSrvr6.0.3-Source mv Install Install.orig wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/Install chmod +x Install ./Buildit ./Install
Ubuntu 10.x DSS Compile Script
#!/bin/bash sudo apt-get install build-essential wget sudo addgroup --system qtss sudo adduser --system --no-create-home --ingroup qtss qtss wget http://static.macosforge.org/dss/downloads/DarwinStreamingSrvr6.0.3-Source.tar tar -xvf DarwinStreamingSrvr6.0.3-Source.tar sudo mv DarwinStreamingSrvr6.0.3-Source DarwinStreamingSrvr6.0.3-Source.orig wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/dss-6.0.3.patch sudo patch -p0 < dss-6.0.3.patch sudo mv DarwinStreamingSrvr6.0.3-Source.orig DarwinStreamingSrvr6.0.3-Source wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/dss-hh-20080728-1.patch sudo patch -p0 < dss-hh-20080728-1.patch #need to answer n then y cd DarwinStreamingSrvr6.0.3-Source sudo mv Install Install.orig wget http://dss.macosforge.org/trac/raw-attachment/ticket/6/Install chmod +x Install sudo ./Buildit sudo ./Install
If you run into problems or are just plain lazy, here is Darwin Streaming Server 6.0.3 compiled for Linux. Simply unpack the archive and run ./Install :
Download: Darwin Streaming Server 6.0.3 Linux Binaries
IPv4 Countdown, down to the days.

Are you ready for IPv6? Only a few days left until the ipv4 apocalypse.
Some interesting links:
Fox news has no idea what they are reporting on:
"Web developers have tried to compensate for this problem by creating IPv6 -- a system that recognizes six-digit IP addresses rather than four-digit ones."
http://www.foxnews.com/scitech/2011/01/26/internet-run-ip-addresses-happens-anyones-guess/
Twitter Feed reporting the countdown:
http://twitter.com/IPv4Countdown
Facebook Page
http://www.facebook.com/pages/IPv4-Countdown/162683847102050
Want a countdown widget thingy? On your phone perhaps?
http://ipv6.he.net/statistics
For those who aren't in the know of this techno-apocalypse wikipedia has the answers for you:
http://en.wikipedia.org/wiki/IPv4_address_exhaustion





