Sunday, August 7, 2011

Efficiency in Photo Blogging

I recently started taking a lot of photos, with the idea that I would post them to my new photo blog. This has worked out well so far, except for the manual process of stripping out the uploaded image URLs and manually placing them into my template.

After a handful of day-long marathon copy-paste sessions, I've rescued myself from this heavily manual process using Python. Now I only need to paste a couple of links into a data file, and the script builds the rest.

Language: Python

Run this script in the same folder as a source file "links.txt".
    Odd lines contain the picture's href link
    Even lines contain the picture's image src

Similar to:
import glob, re

filename = "links.txt"
f = open(filename, "r")
flines = f.readlines()

count = 0
blogText = ""

blogPost1 = '<div class="separator '
blogPost2 = '" style="clear: both; text-align: center;">\n'
blogPost2 = blogPost2 + '<a href="'
blogPost3 = '" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="300" width="450" src="'
blogPost4 = '" /></a></div>\n'
blogPost4 = blogPost4 + '<h2 class="'
blogPost5 = '">Photo title</h2>'

sectionBreak = "<!-- More -->"

# Regular Expressions to pattern match the file name
# ex. 2011_06_13-B.jpg or 2011-07-23-A3.jpg
findB = r"[0-9]{4}[\-_][0-9]{2}[\-_][0-9]{2}[\-_]B[a-zA-Z0-9_\-]{1,6}.JPG"
findNotA = r"[0-9]{4}[\-_][0-9]{2}[\-_][0-9]{2}[\-_][B-Zb-z][a-zA-Z0-9_\-]{1,6}.JPG"

headingCSSClass = "objective"
imageCSSClass = "topPic"
imageHREF = ""
imageSRC = ""
breakText = ""
for line in flines:
count = count + 1
line = line.replace("https://", "http://")
line = line.split()[0]
if count % 2 == 1:
imageHREF = line
else: # count % 2 == 0:
imageSRC = line
#if the line ends with a "B" image, prefix it with a seciton break
matchB =, line)
if matchB:
breakText = sectionBreak

matchNotA =, imageSRC)
if matchNotA:
print("Not A: "+imageSRC)
headingCSSClass = "runnerUp"
imageCSSClass = "secondPic"
blogText = blogText + breakText + "\n\n" + blogPost1 + imageCSSClass
blogText = blogText + blogPost2 + imageHREF
blogText = blogText + blogPost3 + imageSRC
blogText = blogText + blogPost4 + headingCSSClass + blogPost5

# resets for the next run.
headingCSSClass = "objective"
imageCSSClass = "topPic"
imageHREF = ""
imageSRC = ""
breakText = ""

print ("BlogText: " + blogText)

The result? In the time it took me to prep a single post's links, I had prepped and named four seperate posts. This has freed up a lot more time to work on the content of the posts rather than processing them.

Analysing the code

I built this quickly, with the intent of making it useful as soon as possible. As a result, there are a few improvements that can be made. For example:

  • Take the links data file name as an input
  • Write the output to a file, with a manual override for output file name
  • Assuming all images are named consistently (they are), the script could re-order pairs of links automatically, so the source file can be unordered but still yeild an ordered post. This would require some rebuilding, but would be more versitile

All in all, the code does its job.

Resizing Images with ImageMagick

A second improvement to the efficiency of posting to my photo blog is the use of a program called ImageMagick. It's a program that allows me to resize and rename my original photos via the command-line. While I don't yet have a script to automate this part, not having to open and resize each photo individually will save me a lot of time. Again, it will increase the time I can spend doing creative things instead of copy-paste drudgery.

- - - - - - - - - -

It may not be for a wiki, but ImageMagick still works wonders.

Monday, January 17, 2011

Installing Apache web server on Windows 7

After a quick detour to install Notepad++, I'm on my way to installing Magento. Before I can get into the meat of it, though, I do require a few prerequisites.

From the installation instructions, installing Magento requires:
  • Apache 1.3.x or Apache 2
  • PHP 5.2.0 and above with Safe mode off
  • MySQL 4.1.20 and above
After a brief search, I happened upon a very handy site (Yes, my current dev machine runs Windows 7). No sense reinventing the wheel, so these instructions should do nicely.


I've chosen the latest stable release, 2.2.17, MD5-verified and ready to install.

Always one to put the right foot forward... The first thing I've done is to immediately download the wrong version (src) instead of the neatly prepped installer (msi) as per the instructions. Round 1 goes to my eagerness, but after a neat revisit to the Apache download page, I'm off in the right direction.

After kicking off the Apache installer, my first instinct was to twitch at the frozen installer progress (Did the instructions forget about that ghastly Windows 7 User Account Control?), but after only a brief pause, the UAC prompt has displayed and the Apache web server installation is back on track.

None the worse for wear, time for the next step.


I've pretty much kaboshed most of the PHP installation instructions, mostly due to its avoidance of the handy PHP for Windows installer. Pointing the installer to the Apache web server's cgi-bin folder seems like a good idea.

A configuration change...

; Directory in which the loadable extensions (modules) reside.
; extension_dir = "./"
; On windows:
extension_dir = "ext" ; Uncommented (removed the semicolon at the beginning of) this line

... and I'm back to the instructions. After an update to my environment variables, looks like it's time for a reboot... and sleep.

I'll be leaving the MySQL install (and testing Apache web server and PHP) 'til tomorrow.

- - - - - - - - - -

It's time to modify the css behind my code div... that really long text doesn't take up more than one line and I don't have to stare at it in a sleepy daze.
Edit: Done!

Saturday, January 15, 2011


I've been looking at Magento recently. My job has taken me into the world of e-commerce and, naturally Magento tends to crop up every now and then.

According to the installation instructions, Magento runs off of an Apache web server, PHP 5.2+, and MySQL (among other things).

And did I mention that Magento is Open Source?

Over all, it has a very attractive presentation and a usable interface for someone just getting started with the software. The Knowedge Base resources are pretty extensive and the community forums seem to be pretty active. Nothing too intimidating here, let's give it a whirl.