Search Results
Let the endeavours begin...
Posted on: 27 February 2008
So, day one dawns. I've left the heady world of corporate software development, and begun the startup adventure! In this blog I'll be writing about the whole process of getting a new site developed and launched. I'll be looking in some depth at all kinds of different tools to do what we need, and writing a fair bit about managing the software development process too.
Connecting C# to MySQL
Posted on: 01 March 2008
My previous lives have left me pretty handy with C#. I only really used .net 1.1 for serious heavy lifting, so I'm finding all kinds of nice suprises (like generics - strongly typed ArrayLists at last!) in .net 3.5 now that I've started using Visual Studio 2008 (and finding that the free Express Edition is fine for commercial development came as a rather nice suprise too!).
Getting started with Drupal
Posted on: 12 March 2008
A few weeks ago, I decided that the best foundation for the site I'm working on would be Drupal. After some discussions around the scale of the site and the likely complexity of our customisations, this seemed to be the natural choice. One of the key factors in this decision was the perceived strength of Drupal's architecture.
Drupal Tutorials
Posted on: 19 March 2008
I'm starting to get the hang of Drupal now, largely thanks to Robert Safuto's video tutorials (especially the one about CCK and Views) - nice one Robert!
Importing Data Into Drupal CCK
Posted on: 20 March 2008
I've now got a bunch of structured data in a relational database, and need to get it into Drupal. I've created my content types using CCK. Fortunately, there's a great overview here which highlights some of the core Drupal tables I need to populate which aren't immediately apparent.
Everything is pretty straightforward, apart from populating deltas for repeating fields in CCK.
What tokens are available in Drupal?
Posted on: 31 March 2008
Drupal has a very powerful module called Tokens, which makes various pieces of data available in other modules. As an example, the Pathauto module will create friendly URLs for any piece of content based on some feature of that content, using token substitution. By default, a new piece of content will be available at the URL http://www.mysite.com/node/5 (assuming you have enabled clean URLs).
PHP RSS Parsers
Posted on: 04 April 2008
So, the next thing to build in my site is an RSS parser. I'm uploading video files to a hosting provider, who generates their own unique ID for each video. However, when users browse my site they want to play these videos, which means that I need to know the hosting provider's ID for the video the user wants to watch.
My video host provides an RSS feed of my uploaded content, which includes their IDs. So I need a scheduled task which will poll this feed and parse it so the IDs can be written back to my database.
New Hosting Provider
Posted on: 09 April 2008
Until the end of last week, this blog was hosted on my free web space from my ISP, Freedom2Surf. Now, while these guys have been great as an ISP (good value, uptime and performance, free regrades to higher bandwidth, turning a blind eye to occassional overstepping of my monthly bandwidth allowance!), their free web space is pretty basic. There's PHP and MySQL, and all was fine until I wanted a proper domain name for the site. Having bought a domain name, it seemed there were two options for making that domain name take users to my site:
Drupal pages sometimes come up blank!
Posted on: 01 May 2008
OK - pretty weird problem today. My local dev Drupal site was acting a bit strange. Most page requests worked fine, but some (e.g. /logout) brought back a completely blank page. "View source" on the page showed that the source was completely blank too. No errors in the apache error log, and nothing in the Drupal watchdog table.
On partitions, boot loaders, and multi-boot woes
Posted on: 13 May 2008
I have a rather old laptop which is set up to dual boot between Windows XP and Linux (Red Hat 9) using GRUB. Unfortunately this machine now needs to be fully dedicated to Windows (it only has a 10GB disk, and we have 8GB of data to be cleansed using a Windows app), so I've had to remove Linux. This proved slightly trickier than I suspected, mainly because of my own rashness.
The laptop was configured with four partitions:
1. the main Windows partition (XP was installed before Red Hat)
2. a Linux boot partition
3. a Linux OS partition
Remote Control The Easy Way
Posted on: 12 June 2008
Yesterday I needed to take remote control of a friend's PC over the internet. This can be a bit hairy at the best of times, but when the friend isn't exactly what you would call a power user, it can be nigh-on impossible. Fortunately, I've been a reader of Joel On Software for a while now, and was very interested in their intern project Copilot.
IE6 Hover The jQuery Way
Posted on: 23 June 2008
Drupal includes the jQuery framework by default, which gives you easy access to a bunch of neat javascript eye-candy. I've been meaning to look into this properly for a while now, but I have at least figured out how to resolve a fairly common Drupal requirement - displaying submit buttons as text links.
We're live!
Posted on: 27 June 2008
All the hard work over the past four months has now gone live at Save A Million Shots. It's still in beta (like all good web applications!), so there'll be some more polishing and data quality work over the next few weeks, but we're getting quite a lot of traffic already. Stop on by and have a look!
Simple video comments
Posted on: 28 August 2008
One of the things we're really eager to get going on Save A Million Shots is the idea of video conversation threads. The trouble is, commenting is a fundamentally different activity from posting.
If you're posting an article, you're putting in a reasonable amount of time and effort (probably!), which could include making a video file, saving it to your computer somewhere, and uploading it when you write your post
Getting HTML source of emails
Posted on: 03 September 2008
For my sins, I am currently using Windows Vista as the OS on my main PC, and am using the build-in mail client, Windows Mail, basically a rebranded Outlook Express. It's pretty basic, but I don't need much from my email client. However, today I found a need to view the HTML source of HTML emails.
Changing Mouse Pointer Speed in C#
Posted on: 09 October 2008
I've just got myself a fancy new mouse (OK - not really all that fancy, but I like it). There's just one small hitch - it's much more sensitive than the touchpad on my laptop, so whenever I switch between the two, I have to fire up control panel, choose the mouse panel, choose the right tab, slide the slider, click the "OK" button, and it all just seems not worth all the effort.
Styling file upload form buttons in Drupal
Posted on: 07 November 2008
I've used a nice bit of CSS to style all the buttons throughout our web site, but it all falls down a bit on the file upload button. For reasons best known only to the various browser developers, this button only has limited styling capability, if indeed any at all.
There are a few solutions out there, but they are all pretty messy in terms of adding a lot of cruft to your site code. I was looking for something a bit more elegant, and which would fit neatly in with the architecture of my Drupal-based site.
Upgrading Ubuntu
Posted on: 15 March 2009
OK, this one was entirely my own fault, but it's a useful cautionary tale to anyone running any version of Ubuntu.
For some time now I've been running an Ubuntu 7.04 server as my virtual development server, and it's been working out just great. The trouble started when I needed to process incoming emails using a PHP script. Now, there's a rather handy PHP IMAP library to do just this. Thanks to Ubuntu's use of the Synaptic package manager, installing it is a simple "sudo apt-get install php5-imap" command. And that's where trouble began.
Calendar Nirvana
Posted on: 15 March 2009
Back in January I treated myself to a new mobile phone. Of course I looked at the iPhone, but there were three big drawbacks:
1. the price
2. they're getting kinda common (1 million sold in the UK!)
3. you can't use it as a 3G modem
Running Multiple Internet Explorer Versions
Posted on: 02 May 2009
As a web developer, one of the jobs I enjoy least is making sure that the sites I build are going to look good to all our visitors, not just to me. Like most developers, I develop my website for Firefox, then check it's OK in other popular browsers. Given our relatively low visitor volumes (at least so far) and limited time available for testing, in practice, this means testing Internet Explorer 6 and 7, and hoping that Opera, Chrome and Safari are as standards-compliant as Firefox (which is a fairly safe assumption).
Installing Ruby on Rails on Ubuntu Hardy Heron
Posted on: 06 May 2009
For the past 16 months, I've been working almost exclusively with Drupal to build websites, and I've got pretty good with it. However, I'm always conscious of the old adage that "When the only tool you have is a hammer, everything looks like a nail", so in the interests of expanding my toolbox, I'm taking a look at Ruby on Rails.
Flashing my Samsung Pixon phone
Posted on: 17 June 2009
Having been a happy user of GooSync for keeping my Google Calendar synced with my Pixon phone, I decided it was time to centralise my address book too. GooSync claims to be able to sync Google Mail contacts too, so that seemed like a good way to go.
Sadly, once I'd got all my contacts into my Google Mail address book, running GooSync on the phone did two things:
Mysterious lack of disk space
Posted on: 25 August 2009
An interesting problem for today. I was trying to fix a fairly trivial bug in one of our websites, but when I try to load a page from my webserver I get a Drupal error:
user warning: Can't create/write to file '/tmp/#sql_1071_0.MYI' (Errcode: 28)
query: SELECT t.* FROM term_node r INNER JOIN term_data t ON r.tid = t.tid
INNER JOIN vocabulary v ON t.vid = v.vid WHERE r.vid = 39
ORDER BY v.weight, t.weight, t.name
in /var/www/seo/modules/taxonomy/taxonomy.module on line 617.
Errcode 28 means I'm out of disk space, but a quick df shows plenty:
The dangers of multiple Drupal database connections
Posted on: 20 October 2009
Our latest venture, www.analyticsseo.com, is a pretty complex app for a Drupal site. There are two parts to the system:
1. a back-end application, which crawls the web, analyses sites and competitors, and does all kinds of clever stuff
2. a front-end application, which summarises this data, generates tasks, and manages workloads
Fortunately, Drupal makes it really easy to work with multiple databases. Simply add two database connection strings in the settings.php:
The importance of testing database restore processes
Posted on: 20 November 2009
It's been said before, but good judgement comes with experience, but experience comes from bad judgement
We all know the golden rules on database backups:
1. do backups
2. test that you can restore from those backups
But how many of us actually do that second part? I've recently gained some experience (ahem!) on the importance of step 2.
ADSL Router IP Address Weirdness
Posted on: 01 December 2009
Bit of a weird problem this week about our customers not being able to access our pre-production websites. We have a test server in our office which we use to host websites during development so our customers can see progress and add their own content. Our internet access and networking is (mostly) handled by a consumer-grade Netgear router/firewall/ADSL modem job, which is configured to route inbound http requests to our test server. All worked fine.
Force Drupal User Logout
Posted on: 14 January 2010
I had an interesting problem this morning. One of our team had been demonstrating Analytics SEO to a potential reseller, and had forgotten to log out of the site at the end of the demo. He didn't really want to leave them with access to his account (which is a rather powerful administrator-type account), but also didn't really want to phone them and ask them to log out. The reseller is in South Africa, so I can't exactly sneak in and delete their login cookie either.
Google Website Optimizer
Posted on: 01 February 2010
I've been doing some interesting work lately using Google Website Optimizer to help with our signup page on Analytics SEO. The full gory details are over on the Analytics SEO Blog.
MySQL Concurrency
Posted on: 23 April 2010
I'm spending quite a lot of time at the moment working on performance optimisations for Analytics SEO, and learning much more about the subtle differences between the different MySQL storage engines.
Linux and it's schizophrenic clipboards
Posted on: 02 October 2010
I've been using Linux as my main development environment for a couple of months new (full details over here). The transition has been pretty easy on the whole, but I've been struggling with one of the most basic tasks - copying and pasting.
For historical reasons, Linux has two ways of copying and pasting:
My First Android App
Posted on: 24 June 2011
So, one of the main reasons I chose an Android phone instead of an iPhone (apart from not wanting to follow the herd) was so that I could develop my own apps and run them on my own phone. Yes - I know you can write apps for iOS as well, but I'm all PC, Linux and open source, and Mac development is going to need a bigger technology shift than I want to make right now (although I wouldn't rule it out in the future).
PHP Fatal error: Maximum execution time of 0 seconds exceeded
Posted on: 09 December 2011
I've got a pretty long-running script. In our live environment this runs under command line PHP, but for convenience on my dev machine I just run it through Apache.
Initially I got an error: Fatal error: Maximum execution time of 30 seconds exceeded
No problem - just up the max_execution_time parameter to zero in my php.ini to give an infinite execution time, restart Apache, and start again. Trouble was, after about ten minutes, I got a slightly different error:
The perils of switching from MyISAM to InnoDB
Posted on: 03 September 2012
We've been seeing a lot of contention on one of the larger tables in our database recently. This table has a few billion rows (around 300GB), and uses MyISAM. As our usage has increased, we've started seeing more SELECTs being blocked by UPDATEs, so decided to switch the table to use InnoDB to allow concurrent reads and writes.
Fun and Games With PHP Precision
Posted on: 12 July 2014
This is another of those "interesting" tech support cases (where "interesting" means painful and tedious).
Our platform collects lots of data for our customers, and generates lots of nice juicy reports for them in an assortment of formats. Being a sensible developer, I'd done this using a typical MVC pattern, so there are models which get data out of the database, and then different views to format it into each report. The support case was that some numbers were being displayed with a ridiculous number of decimal places in Excel reports.
Cleaning out phantom gearman workers
Posted on: 22 July 2014
We've been using the excellent Gearman in our production systems to handle distributed job processing, and it's been working very well for us. However, just occasionally it will throw a weird one our way.
Concrete5 Mandatory Custom Attributes
Posted on: 17 December 2014
I've built a few sites now using the Concrete5 CMS, and on the whole I really love working with it. It provides a whole heap of really nice user-facing functionality out of the box, and makes it really easy to add your own. However, today I had to build something which seems routine and trivial, and found no way to do it.
Why Is Apache Ignoring Some Of My Virtual Hosts?
Posted on: 10 September 2015
Why Is Apache Ignoring Some Of My Virtual Hosts?
Last night I learned an interesting lesson about Apache virtual host directives. On my development machine, I use named virtual hosts for the various projects I work on, a bit like this:
Making The Best Alarm Clock In The World
Posted on: 16 November 2016
I've had a lot of alarm clocks over the years, and I've never been 100% happy with any of them. Maybe I'm just too demanding, but here's what I want from an alarm clock, in no particular order: