Software Updates

I’ve finally gotten round to updating iSyncIt and Set Icon for Snow Leopard, as always you can download iSyncIt here and Set Icon here.

The new release of iSyncIt fixes the only bug I could find under Snow Leopard – the icon not changing correctly under bluetooth on / off conditions.

The Set Icon release fixes the problem of the application not performing its one and only function – setting a drive icon. Along with the bug fix I modified the image conversion to prevent the (frankly awful) stretching of non-square images to fill a 512×512 icon, images now scale nicely. I also removed the terrible tool-tips that show up when you start the application I used to think they were ‘cool’ but soon realised the error of my ways. However, in place of this I added some ‘brilliant’ window resizing when you remove an icon – we’ll see how long that lasts. Oh, the application will also run as a 64 bit application now – not that that makes any difference what-so-ever, I just did it because I could.

Check back soon.

Software Updates

Clearing Out Old Sessions

A while ago I started setting up my websites to use ActiveRecord as a session store, this means that the session information for all the visitors to my website is placed in a table in my database. It may or may not be the best way to store sessions but it’s certainly faster than the filesystem and my VPS doesn’t really have the memory capacity for an ‘in memory’ store.

Anyway, one day I decided to perform some DB maintenance, check tables where okay etc, upon logging into the DB I noticed that my sessions table had grown quite large, almost 125,000 records, little did I realize that the sessions are persisted forever in the DB.

I didn’t think it was the best idea to keep all the session data so wrote the following script and put it in lib/tasks/session.rake:

namespace :session do
  desc "Prune old session data"
  task :prune => :environment do
    sql = ActiveRecord::Base.connection()
    sql.execute "SET autocommit=0"
    sql.begin_db_transaction
      response = sql.execute("DELETE FROM sessions WHERE `updated_at` < DATE_SUB(CURDATE(), INTERVAL 1 DAY)");
    sql.commit_db_transaction
  end
end

This gave me a ‘session:prune’ rake task. The task removes all sessions older than 1 day from the sessions table. I then added a CRON job for in the following format:

0 0 * * * cd /home/user/railsapp && rake RAILS_ENV=production session:prune > /dev/null 2>&1

The job above basically calls the session:prune rake task at midnight every night.

The code in the task in MySQL specific but without a model representing the session table I couldn’t (or at least couldn’t think of a way) to make the code any more ruby-fied. In the event that you do have, or decide to create a session model the following code may work in your task (warning: untested):

Session.destroy_all("created_at" < (Time.now - 1.day))

Hope the above snippet solves at least one of your ActiveRecord session woes.

Check back soon.

Clearing Out Old Sessions

Clearing Out The rFlickr Cache

Assuming you’ve followed the Caching Your Photographs tutorial at some point, you’ll probably have had a lot of fun either deleting the cache every time you upload a new photo or you’ve written your own automated method by now. For those of you that haven’t written your own method of dumping the cache yet, here’s how I do it.

First of all, I created a lib/actions folder in the root of my rails project. Inside this folder I created the file ‘photography_action.rb’ with the following contents:

class PhotographyAction
  def self.clear_cache
    ActionController::Base.new.expire_fragment(%r{photography.cache})
  end
end

The above fragment naming assumes that your photos are on a page called ‘photography’ if they are elsewhere, change the fragment to expire that page instead.

Fairly simple I think you’ll agree, you may also be asking yourself ‘why the extra file?’, the main reason for the new file is so that the cache clearing can be executed from a new rake task that doesn’t remove all your cached pages or from an admin page on the website.

You’ll also need to update your config.load_paths in environment.rb. After updating, mine looks like this:

config.load_paths += %W( #{RAILS_ROOT}/app/sweepers #{RAILS_ROOT}/lib/actions )

Inside some action in some, preferably protected, controller somewhere, add the following (redirecting to anywhere you fancy):

PhotographyAction.clear_cache
redirect_to :action => 'index'

Now for the rake task. Inside the directory lib/tasks (create it if it doesn’t exists) create the file photography.rake then put the following code inside the file:

namespace :photo do
  namespace :cache do
    desc "Clear out photography cache"
    task :clear => :environment do
      PhotographyAction.clear_cache
    end
  end
end

You should then be able to run:

rake photo:cache:clear

From the base of your project in order to clear the cache.

Bear in mind, the code above is literally just a convenient way of clearing out the fragment cache so new photos show up on your photo page, it does not delete photos, nor does it perform a refresh automatically, although, you could add it to a CRON job.

When I get chance, I intend to automate this process and build it into rFlickr along with a new, improved, caching mechanism. I’m sure the above will tide you over for now though.

Check back soon.

Clearing Out The rFlickr Cache

New rFlickr Ruby Gem

After I started to use the rFlickr gem it didn’t take me long to realize that development of the gem had all but halted, yes it worked, which was more than the original Flickr gem did, but it was still a little bit out of date and in the end, a little bit broken.

In one of my older posts I documented a fix for the gem and provided a download to unzip into your plugins folder, however, with the advent of the wonderful GitHub and its marvelous gem support I’ve decided to move the project onto GitHub.

I have preserved the original gem’s GPL license and copied the source code from its original repository on RubyForge to a new, public, GitHub repository. In the process of the move I have dropped old code from the project, updated the readme & license information and generally performed a little house-keeping.

You can find the project at: http://github.com/digitalpardoe/rflickr/. You can install the gem using one of the following methods. First involves adding GitHub as a gem source (always a good idea) and installing the gem:

gem sources -a http://gems.github.com
sudo gem install digitalpardoe-rflickr

The second method it to add the gem as a gem dependency to the environment.rb of your Rails project:

config.gem 'digitalpardoe-rflickr', :lib => 'flickr', :source => 'http://gems.github.com'

And run a rake task to install the gem:

sudo rake gems:install

Whilst performing the code migration I also added the fix that was documented in my original post and implemented support for the (not so) new ‘farm’ based Flickr URLs for images (which should make things easier to implement).

The future plans for rFlickr include new tests, improved usage examples, updated readme / documentation and implementation of missing API methods, time permitting of course.

Until the readme is updated please refer to the original post for information on how to use rFlickr.

That’s all for now, enjoy the new gem and as they say, if you don’t like it, fork it.

New rFlickr Ruby Gem

Guess Who’s Back

As you may have noticed, it’s been a long time since my last post. There isn’t really any good reason for this. Plenty has happened, I just haven’t got round to writing any of it down.

First off I’d like to mention the website, it went through a fairly radical redesign a few months ago and I mentioned nothing about it. For some reason it’s not in my nature to be happy with what I make hence the many faces and iterations of the website. This website, whilst being my home on the internet, is also the test bed for my RoR programming, you may get tired of hearing about its re-designs and re-codes but that’s part of the reason I created it. Anyway, another re-design is coming, this time it’s not visual but all back end, the main difference you will notice is that I am doing away with user accounts and having a more open comment system (I could be shooting myself in the foot with this decision, we’ll have to see how the spam bots take it). To the people that have commented on the blog already, your comments will be preserved and, when I roll out the changes, I intend to reply to all the comments I haven’t yet replied to.

The second thing I wanted to mention, again website related, is my hosting. A good proportion of my posts seem to be apologizing for the downtime of the website. I was actually getting pretty bored of this so decided to, quite literally, take matters into my own hands. The website is now hosted on a virtual private server set up and maintained by me. This again, may be a case where I’ve shot myself in the foot. For those of you interested, the VPS is provided by the wonderful folks at Bytemark Hosting.

Number three. Many of the posts of my website relate to the use of the ‘rflickr’ RubyGem. Development of this gem seems to have been at a stand still for a good while now, I’ve therefore taken the decision to clone it and try to continue development in my spare time. More on this in a later post.

Four. Any of you interested in my photography will have noticed a lack of it over the past few months, it’s not that I haven’t been taking any photographs, it’s just that I’ve not published any. To try and remedy this I uploaded a batch of photos today that have been sitting on my computer for a while. You can take a look at them on the photo page of the website or on my Flickr page.

Guess Who’s Back

Arghh, Downtime

Apologies to anyone that has visited the website in the last couple of days, it would appear that there has been a fairly large amount of downtime. Everything is back up and operational again. I will be keeping a closer eye on the status of the website from now on to try and prevent this type of situation arising again. Thanks for your understanding.

Check back soon.

Update: It would also appear that the category browsing is currently broken, I am working on a fix and will push it out shortly.

Arghh, Downtime

Just An Introduction

I’ve been promising to write this post for a while now, it is exactly what is says in the title, an introduction. A good friend of mine, after much persuasion has finally ‘got his blog on’. Fortunately he has a far better blogging style than me and blogs far more often so it shouldn’t be too much of a strain on the senses to bookmark him and/or add him to your feed reader. Funnily enough he is also a keen photographer so don’t forget to check out his Flickr page, you’ll find a link from his blog.

So here he is, (drum roll please), Mr Rob Young: robyoung.me.uk.

Be nice, I don’t want him scared back off the internet, it took long enough to get him on here.

Don’t forget to check back here sometimes too.

Just An Introduction

Calculating Work Days In Java

In work this week I came across a couple of problems in which I needed to performs some calculations involving dates and a number of “work days” rather than just normal numbers of days. My first few attempts filed miserably, so I did some Googling to see if I could find anyone else that had come across the same problem and of course, there were plenty of people.

The code I eventually used I found shoehorned into the middle of a coding help forum and, with a little bit of tweaking, it calculated the number of whole work days in between two dates. The code is as follows:

public static int calculateDuration(Date startDate, Date endDate)
{
  Calendar startCal = Calendar.getInstance();
  startCal.setTime(startDate);

  Calendar endCal = Calendar.getInstance();
  endCal.setTime(endDate);

  int workDays = 0;

  if (startCal.getTimeInMillis() > endCal.getTimeInMillis())
  {
    startCal.setTime(endDate);
    endCal.setTime(startDate);
  }

  do
  {
    startCal.add(Calendar.DAY_OF_MONTH, 1);
    if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
    {
      workDays++;
    }
  }
  while (startCal.getTimeInMillis() <= endCal.getTimeInMillis());

  return workDays;
}

This code solved my first problem, however I couldn’t find any code to solve my second problem, how to calculate a final date from a start date and a specified number of work days, to do the calculation I came up with the following code:

public static Date calculateEndDate(Date startDate, int duration)
{       
  Calendar startCal = Calendar.getInstance();

  startCal.setTime(startDate);

  for (int i = 1; i < duration; i++)
  {
    startCal.add(Calendar.DAY_OF_MONTH, 1);
    while (startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || startCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
    {
      startCal.add(Calendar.DAY_OF_MONTH, 1);
    }
  }

  return startCal.getTime();
}

Hope this code works as well for you as it did for me.

Check back soon.

Update: Improved the calculating code with the suggestion from Anass (below) and made some more accuracy & business logic improvements to the calculateDuration method. Enjoy.

Calculating Work Days In Java

Flickr BBCode

phpBB is one of the most widely used forum systems on the internet and Flickr is one of the most popular photo sharing websites, unfortunately there is still no concrete way to integrate the two of them. As a temporary solution I came up with the following piece of BBCode to allow for the easy display of Flickr images in phpBB forums.

First, you will need to navigate to the “Admin Control Panel” of phpBB then to the “Posting” section. From here navigate to the screen that allows you to add custom BBCode.

In the “Usage” section paste the following code:

[flickr=<a href="{URL1}" title="{TEXT1}"><img src="{URL2}" width="{NUMBER1}" height="{NUMBER2}" alt="{TEXT2}" /></a>][/flickr]

In the “HTML” section paste:

<a href="{URL1}" title="{TEXT1}"><img src="{URL2}" width="{NUMBER1}" height="{NUMBER2}" alt="{TEXT2}" /></a><br /><a href="{URL1}">{TEXT2}</a>

Then in the “Help” section paste:

Flickr: [flickr=<Flickr, Medium Size, Copy & Paste HTML>][/flickr]

And that’s it, you can use the tag by navigating to one of your photo’s Flickr “All Sizes → Medium” page (e.g. http://www.flickr.com/photos/digitalpardoe/2900618617/sizes/m/), copying the code in the “1. Copy and paste this HTML into your webpage:” box. And inserting it after the “=” in the Flickr BBCode tag, e.g.:

[flickr=<a href="http://www.flickr.com/photos/digitalpardoe/2900618617/" title="Isolation by digital:pardoe, on Flickr"> <img src="http://farm4.static.flickr.com/3095/2900618617_26bc8abc12.jpg" width="500" height="334" alt="Isolation" /></a>][/flickr]

Check back soon.

Flickr BBCode

Updates, Updates, Updates

Again, it has been quite a while since my last post (almost a month in fact) and quite a lot has happened since then. Any regular visitors to the website will have noticed the new theme, the website maintains the new layout released a couple of months ago but the colour scheme has changed to something a bit more minimal. Along with the new theme I have re-introduced some small adverts to the bottom of pages and modified the URL of the blog feed to allow tracking through FeedBurner.

The other main updates to the website are the introduction of My Book Icons 0.8 and My Passport Icons 0.3. The My Book Icons update includes a new icon for the Western Digital My Book Studio II drive. Both of the icon sets now include icons in Windows ICO format and Linux PNG format. On the Mac side of the icon sets, after popular demand, I have added copy & pasteable icons to allow setting of icons using the “Get Info” window in Finder.

You can download My Book Icons here and My Passport Icons here

That’s all for now, check back soon.

Updates, Updates, Updates