
I gone done and did it. Again. (and yes, I am quite aware of how many grammar rules the first sentence breaks. I also know this footnote should not have started with “and”).
Henceforth, my technical blog exists at the following location;
This will be the last time such a move takes place. After something like 8 years of writing a blog of various sorts online, this is the first time I have purchased a domain name specifically for a technical blog.
The reasons for this final move are many. When I began picking up freelance work some months ago, I had reduced my online “footprint” significantly – giving some projects away (PluggedOut comes to mind), putting some projects on life support (ThoughtCafe), and closing accounts all over the place (Posterous, Tumblr, MySpace).
I had not considered that the traces I leave on the internet – my words, photos, code snippets, solutions, thoughts, views, and crackpot opinions – would be read by those who might one day hire my services. It therefore became obvious that if I choose to participate in the blogosphere, I need to do it on my own terms. I need to have my own websites which extend the little brand and influence I have beyond the bounds of the work that I do.
In blogging terms, after eight years I guess I’m finally growing up.
Earlier today, while waiting for a virtual machine to restart, I started tinkering with something else (as I often do). I moved my personal blog last night from wordpress.com to a self-hosted website. In doing so, I thought it might be nice to tell anybody who had commented in the last year or two that I had moved.
I had the wordpress XML export file (used to transfer the blog, and its comments) – all I needed was a quick way to get the email addresses out of it.
Here’s how I did it…
#!/usr/bin/env python
import re, sys, io
in_file = open(sys.argv[1], "r")
text = in_file.read()
in_file.close()
email_pattern = re.compile(r"[a-zA-Z0-9\_\-\.]+@[a-zA-Z0-9\_\-\.]+[a-zA-Z]+",re.M)
for match in email_pattern.findall(text):
print match
The above python code snippet accepts an argument of the textfile you want to interrogate, and outputs all the email addresses within it – courtesy of a regular expression. The regular expression can probably be improved on, but it worked for me.
To use it, you would probably do something like this…
python email_extract.py textfile.txt > emails.txt
I have been thinking about personal branding issues over the last several days. If I move this technical blog to my own WordPress installation, I am afforded the opportunity to sell my skills and experience indirectly via the quality of the interface people discover me through.
If visitors arrive at a well designed, well engineered destination, their first impression of the author will hopefully be enhanced. With this thought in mind, I am in the process of moving my technical writing (this blog) to www.bagofspanners.com. Given the vagaries of the internet and web hosting companies, this may take several days – please bear with me as the various machinations happen.
I upgraded my virtual machine running the K2 blackpoint beta to the production version this morning. It was instructive, and I’m wondering about the utility of writing up this gotcha, given that a customer would never install the Beta for a production environment anyway…
The removal of the beta, and the installation of version 0902 (4.9040.1.0) went smoothly. I then created a K2 workspace site within Sharepoint, and started looking around to make sure everything was okay. BANG.
The administration page threw up a generic ASP.NET error, reporting multiple binding errors with assemblies.
After thinking “oh crap” for a few moments, re-creating the K2 site, and trying again, I was still thinking “oh crap”.
Somewhere deep in my head, a lightbulb switched on, and I went to the SharePoint Central Administration portal, deactivated all the K2 specific features on the site collection, and re-activated them.
Voila. Success. Victory.
One to remember for future upgrades, and it made perfect sense too.
Cross posted from my personal blog @ jonbeckett73.wordpress.com
Over the last eight or nine years I have “existed” in many forms on the internet – a member of Compuserve, a contributor to bulletin boards, a sometime usenet evangelist, a personal blogger, a professional blogger, and a member of countless social networks and instant messaging systems.
Throughout my online journey, I never considered the vehicle carrying my thoughts, words and photographs as important.
Perhaps I got it all wrong. Perhaps I should have a domain of my own – a place that becomes known as “the site where that guy writes who knows all that stuff, and somehow finds time for a family too“.
Discovering that people actively follow the thoughts I record and share should perhaps have been a clue. The pure fact that people followed me through changes of web address – from one blog platform to another – should have been an even bigger clue.
I don’t know what to do.
If I invest time and effort into growing my own brand – as well as helping others do the same (through my freelance activities), is it not just shouting “ME TOO!” ?
In my laughable “spare” time away from my day job as a pro developer in the Windows world, I often do freelance web design and development projects. Part of the learning curve involved with doing freelance work has been learning how to record information properly to enable billing to happen. Finding a simple way to do this has been on my mind recently, and after cracking out some long forgotten Microsoft Access skills, I think I’ve cracked it.
I’m exporting the time recording data from Basecamp, and sucking it into a Microsoft Access database to run reports from. This post explains how I did it. If you want me to help you do it too, get in touch.
Exporting Time Data from Basecamp
In order to keep the process simple, I’m exporting the entire data set from the dashboard of Basecamp. Doing so avoids the complexity of checking for duplication. Within Basecamp, while viewing the default time view in the dashboard, select “Edit this Report”, and change the date range to cover everything you have ever recorded (from the beginning to the end of the century, for example).
Importing the Data into Microsoft Access
Here’s the slightly tricky bit. You need to get this right – if you get this wrong, you have to scrap your table (and import job) and start again. It’s worth pointing out that I’m talking about Microsoft Access 2007.
- Go to the “External Data” tab, and import a text file – choose the exported file from Basecamp (note – the place you look for the file is important – Access will remember it, and you cannot change it, so move the Basecamp CSV file if required.)
- Use the wizard to configure each column of the file, and change column names as appropriate. In my case, I prefixed all columns with “Work” – therefore I have columns such as “WorkProjectName”, “WorkPerson”, “WorkHours”, and so on. Note that you will need to rename the date column – “date” is a reserved word in Microsoft Access.
- At the end of the Wizard, choose to keep the import for later use – this turns it into a one click operation in the future via the “Saved Imports” feature in Access.
The import wizard should have given you a table of data in Microsoft Access, which is great. Your next problem is integrating that table with the rest of your information to create billing data (such as hourly rate, payments, costs, etc). The time data on it’s own isn’t enough – you need to show a client what they paid you, what work you did, how much that cost, and how much it left.
Important note – you should not modify the imported data – otherwise you will need to make the same modification every time you do an import. If you just reference it, you will be fine.
I solved the integration problem by creating two extra tables – one for payments, and one for costs. The payments table records money the client pays you for work, and the costs table records money you spend on resources – such as software, hosting, stock images – that kind of thing. To bring the three tables (payments, costs, work) together, you need to create a UNION query. I’m not going to get into the specifics of it here because it’s worth a huge post in it’s own right. The basic idea of the UNION query is to add the contents of the three tables together – but only the columns you need. In this case, we’re thinking about “date”, “company”, “project”, “notes”, and “amount”.
Notice that the work table (derived from Basecamp) will have hours in it – not monetary amounts. It makes sense to create a project table, and have the hourly rate for the project stored within it – then use that in your UNION query to present the monetary equivalent of the hours worked.
One final tip that isn’t obvious – make all work done or costs a minus figure – meaning you can then total a single column in your UNION query resultset to find out the balance of the account.
Okay… last tip – promise… make your own Company and Project tables, and within them have fields for “Basecamp Company Name”, and “Basecamp Project Name” – and link the work done by those fields – not the *actual* company name field. It affords flexibility when importing the data.
I recently switched on the time recording features in 37Signals Basecamp to assist with my various freelance activities – taking me into the realms of a tool that now costs $49 per month.
It seems like a lot of money to spend every month, but not when you consider it in terms of time. Basecamp is costing me about one hour of billable time per month – that’s nothing. The time I save through Basecamp aggregating my time across projects, and allowing me to report against tasks accurately is time I would otherwise have spent monkeying with spreadsheets.
While talking to several colleagues at work about the time recording system in my day job (Microsoft Project Enterprise – the work of the devil), several of them started talking about “oh, if we built this”, or “if we built that” – and I found myself thinking about how much time developers waste building themselves nice tools to do things, where there were perfectly good ones they could have just bought. It’s a foreign concept to many developers because you are so used to being able to build anything.
With the number of commitments and (self imposed) workload piled upon me, I am buying solutions to things far more often these days – even though I could have built them myself. Why re-invent the wheel…
When I first started looking at K2 blackpoint, I thought “wow, this is great – look at all this pre-build integration with SharePoint!”. It was some time before I realised something was missing from the list of event wizards – a client event.
As I wrote previously, if you don’t plan on using Infopath, the absence of client events in blackpoint severely restricts your ability to design forms based workflows. You suddenly have to re-think your entire approach to implementing workflow and rely a lot more on SharePoint lists, objects, metadata and events surrounding them to drive your process.
It turns out I got it wrong (many thanks go to Chris Geier at K2 who let me know about this trick). There IS a way to do “client events” in K2 blackpoint – through the “SharePoint Workflow Integration” event.
If you include a SharePoint Workflow Integration event in a process, you can configure a “new ASP.NET form” instead of the “Default Form” within the event wizard. This creates a boilerplate Web Control in a subdirectory of the process definition folder called “CSWebsiteWI”. The webcontrol gets wrapped up in the feature that is built when you deploy the process. Suddenly the doors are blown wide open in terms of extending k2 blackpoint to ape one of the most useful features in K2 blackpearl – the ability to have a “client event” using ASP.NET forms instead of Infopath forms.
There is a catch (isn’t there always) – you have to remember that the SharePoint Workflow Integration event has actually kicked off a SharePoint workflow – in this case creating a “Task” – and the task has been assigned the custom form that was deployed. Therefore when you open your worklist item in the K2 worklist, you don’t see the custom form straight away – you see the SharePoint workflow process – with the Task listed inside it. If you then open the task, and edit it, you see the form.
I’m guessing at this point that you would need to write your own worklist interface (a common task anyway), and detect these integrated events – and do the extra couple of steps for the user – so clicking on the worklist item would open the form directly. I may be wrong – there may be a way to shortcut the system hidden within K2 blackpoint somewhere.
All these thoughts of wrapping K2 blackpoint with bespoke worklist interfaces, ASP.NET forms, and various SmartObject servers should really be a warning. It’s a lot of development effort to work around restrictions in blackpoint that are much more straightforward in blackpearl. The cost difference will almost certainly be eaten up in the workarounds.
At work I have recently been tasked with evaluating how we might use K2 blackpoint to implement rich workflow and business process management within Microsoft Office SharePoint Server 2007 – and to compare the feature set provided by blackpoint against blackpearl.
It’s interesting – at the lowest level, K2 blackpoint is the same as blackpearl – the basic workflow engine is identical (which makes sense – why would you build two different products to do the same job). The tools and interfaces provided by blackpoint differ enormously though – and it’s important that the less technical people who may be making the decision of which product to go with realise the full implications of their decision.
In a nutshell, the specific targeting of K2 blackpoint towards Microsoft Office SharePoint Server 2007 means there are a number of key traditional workflow elements missing (that exist in K2 blackpearl) that severely restrict it’s potential;
- NO CLIENT EVENT
In blackpearl, you can integrate externally developed user interfaces (developed with ASP.NET, for example), via a “Client Event” – a point in the workflow that will not progress until the user/client interface instructs K2 “this task is complete”. THIS DOES NOT EXIST IN BLACKPOINT, AND THERE IS NO WAY TO RE-CREATE IT. I cannot emphasise this enough. The lack of a client event is a total game changer in terms of the way you would think about using blackpoint versus blackpearl. - Workbasket Concept becomes almost useless
Due to the lack of configurable client events, the traditional concept of the “Workbasket” is almost nullified – the only exception being Infopath forms, which K2 blackpoint has pre-built integration for. This causes a chicken and egg argument though – you are probably looking at blackpoint as an entry-level business process tool based on cost, but to do forms based processes you need Infopath, which either costs lots of money per seat, or you need SharePoint Enterprise edition for. - NO VISUAL STUDIO PROCESS DESIGN TOOLS
K2 blackpoint comes with it’s own process designer, and a number of activity and event wizards to help specify parameters of the pre-built integrations with Microsoft Office SharePoint Server 2007. The tool has no capability to view or edit the code the wizards generate (whereas the K2 blackpearl designer does allow this) – meaning all business logic has to be encapsulated in SmartObjects. There is no way to add to its list of wizards either (or at least I have not discovered one yet).
We therefore have to follow clear lines of thought about how K2 blackpoint should be used to develop workflow solutions with Microsoft Office SharePoint Server 2007.
- Think “SharePoint, SharePoint, SharePoint”
You must think in terms of SharePoint at all times. List items – documents in libraries, and tasks in lists – ARE your worklist items. User groups should be activity destinations wherever possible. As an aside, experience tells me that tailoring active directory groups to business process applications is something very few organisations will ever consider. - State Change Drives Process
Processes (or sections of them) will typically be triggered by state changes within list items – the creation of a document, the modification of a list item property, and so on. - Keep it Simple Stupid
Processes should be short, and simple. Longer processes should be chopped into smaller chunks – think of a relay race. It protects against change, and allows for rapid rollout. - Business Logic Requires SmartObject Development
Implementing complex business logic (for routing based on algorithms, or dynamic destination determination) will require SmartObject development. It is worth becoming familiar with the limits of SmartObjects in terms of extending the functionality of K2 blackpoint (or blackpearl for that matter) – higher level staff may well see them as the solution to everything they might dream up.
this post was cross-posted from the original at Beckett Web Design
Having worked as a freelance web designer and developer for some time now, I have come to rely on a tried and trusted collection of online tools that are reliable, straightforward, and genuinely useful for all sorts of applications. In the spirit of sharing with the community, here are ten of the most highly regarded…
Google Apps – www.google.com/apps
The Google online applications stack provides email, word processing, spreadsheets, presentations, instant messaging, calendars, and “sites” (think SharePoint) – and all for free. It’s stable, it all works, it’s wonderfully integated, and it’s getting better all the time. If you are looking for stable, functional applications that get the job done and that can be accessed anywhere, it’s a realistic (some might say superior) alternative to Microsoft Office.
Campfire – www.campfirenow.com
Many of us use instant messaging to communicate with the disparate project teams. Imagine if you could do so and also record the transcript of the conversation, and you have Campfire from 37 Signals. It starts out free, and is great to record live questions and answers in an unobtrusive manner when everybody is working flat out.
SugarCRM – www.sugarcrm.com
Many of us have experienced Client Relationship Management software either at the hands of Microsoft CRM, or Siebel – and feel lucky to have survived to tell the tale. SugarCRM is an open source web based CRM solution that provides just about everything you might want to keep on top of clients, leads, correspondence, and future actions. The best bit? The community edition is free.
Toodledo – www.toodledo.com
I looked at a lot of task list applications last year – and ended up using Toodledo in preference to all the others. It’s simple, the web interface is intuitive, and of course it’s free. It can be configured to support the “Getting Things Done” methodology, and integrates well with the iPhone, and iGoogle.
Delicious – www.delicious.com
Delicious is a social bookmarking tool – essentially meaning you can record your bookmarks into the cloud rather than your own machine. The real value comes when you are searching for something – if you search Delicious, you are searching only that which other people deemed important. The results are spectacular.
Basecamp – www.basecamphq.com
Basecamp is a wonderful online project management and collaboration system. It has messageboards, file upload areas, task lists, time tracking, notebooks, and granular security for company staff. Without Basecamp, administering the various freelance projects I am involved in would be almost impossible – it provides a simple portal that everybody understands, and perhaps the best email integration of any web application I have ever seen.
Unfuddle – www.unfuddle.com
While Basecamp is great for most project management tasks, there is one thing it can’t do so well – software development projects. Enter Unfuddle. It gives you Subversion repositories, tickets, discussions, milestones, notebooks, and source code browsing. If you’re building software as part of a team, it’s a no-brainer.
DabbleDB – www.dabbledb.com
When DabbleDB first appeared I was seriously impressed – a web based database management system with perhaps the most intelligently designed interface I had ever seen. You have to spend some time working with DabbleDB before the “lightbulb moment” when you suddenly realise how rich it’s functionality is, and what you can build. If you have to share and manipulate data with a disparate team, it’s a great solution.
drop.io – drop.io
Quite commonly you’ll need to send a large file across the internet to a contact or colleague. Drop.io neatly solves this problem by providing free temporary file storage – and no logins required. It’s simple, straightforward, and works wonderfully. I use it all the time. You are typically assigned a random URL, which expires at the date and time you set.
Meebo – www.meebo.com
Sometimes we may find outselves stuck away from our own computer, but in need of contacting a client or contact. Enter “Meebo” – an online instant messaging service. It connects to all of the popular online messaging networks – among them MSN, Yahoo, ICQ, AIM, and Google Talk. It’s free too.
So there you go – some of the great tools I use from day to day while working on freelance contracts. Go explore – tinker – enjoy.