iFinity Blogs 

File this one under ‘you learn something new every day’.

I may be the last person to know this, but example.org, example.com and example.org are domains reserved for use in documentation.

I tend to use ‘mysite.com’, ‘domain.com’, ‘yoursite.com’ and anything else.  I usually try and remove automatically generated hyperlinks because I don’t like to feed link juice to the owners of these domains.  But it still happens.

Then today I accidentally clicked on an automatically generated example.com Url, and found out it’s reserved for documentation.  No more link-juice bleeding from documentation and discussions about Urls.  Try it! http://example.com

I’m off to do some find/replace.

With DotNetNuke 5.2 a new change was introduced, where a specific GRANT EXECUTE statement was run for all the objects on the database.  This caused plenty of problems with shared hosts, where a specific database user is used to run all of the Sql for a specified database, and those users don’t have permission to use ‘grant execute’.

The change was to tighten up security, but unfortunately it tightened things up to the point where many users could not run them.  I know I personally burnt many hours trying to figure out where these errors had suddenly come from.  I was genuinely bewildered when first hit with this problem after providing someone some script to run to correct an error in their database.

Typically, you’d get something like this, either as a result of using the ‘Host->Sql’ screen, or by installing a module.

System.Data.SqlClient.SqlException: Cannot find the object 'dnn_DeleteLanguage', because it does not exist or you do not have permission. Cannot find the object 'dnn_GetUserByUsername',...

Read More »

This post shows how to setup automatically created 'tooltips' on links within your DotNetNuke site using the iFinity Inline Link Master and the jQuery clueTip plugin.  The links are created automatically at run time and provide a powerful way of giving context and extra information on links and increasing the amount of links in your content by matching simple text search phrases.

Read More »

Anyone who visits this site reasonably frequently will no doubt have come across some serious downtime in the last 10 days or so.  The errors ranged from out-of-disk-space to out-of-memory and just plain old ‘server unavailable’.  The casual visitor must have thought that it was running on some dusty old 486 box with a 52k modem hanging out the side.

The truth is, disaster always strikes when you are least are able to handle it.  In this case, disaster kept striking while I was at the hospital welcoming the arrival of a new baby into my family.  Being somewhat busy with this more important event meant that the outages probably went on for twice as long as they should have, but that’s life in the small end of the business world.

Symptoms of the Outages It’s well known that sometimes, servers just develop a problem and a quick reboot gets them on their way.  This was the first strategy I used, and at first it seemed to work OK.   When the server needed to be rebooted several times a day I knew something...

Read More »

Working with GUID variables is a highly useful way of developing software.  If you don’t know, GUID stands for ‘Globally Unique Identifier’.  It’s a way of generating a value that is guaranteed to be different from any other value, generated anywhere else in the world.  It’s a neat idea.  I once read there are more possible values for a GUID than there are stars in the universe.  I don’t know how accurate that is, but at least it makes me feel better everytime I ‘waste’ a Guid by creating it and then not using it again.

Moving right along, the reason for the post is that I came across an issue today where I was generating records in .NET code, and then saving those to a Sql Server database.  So far so normal.  In this case, however, I am using a GUID type to link a foreign key record to a table.   The problem I had was that the .NET equivalent of an empty guid (detectable by the statement Guid.Empty) is a string of zeroes, like this:

00000000-0000-0000-0000-000000000000

In this case, I’d rather...

Read More »

A lot of people use Sql Server express for the reason of it’s generous licensing.  One of the drawbacks of Sql Server express is that it comes without the Sql Agent – which is the batch-running part of Sql Server.  Sql Agent is used to run jobs to do all sorts of things with Sql Server, and one of the most common jobs is to run a backup schedule.  And, as everyone knows, you need to have a daily backup schedule on your database, or one day, you’re going to pay for it.

This blog post will cover how to setup a backup procedure which will backup databases, zip them up, copy them to a location, ftp them to a backup server for long term storage, and clean up after itself.   I’ve done this without purchasing a single piece of backup software, and relied on in-built tools or shareware.

It’s targeted towards people who are running their own web server, whether it’s co-located, hosted or a VPS.  If the thought of command line utilities, scheduled tasks and file permissions stresses you, then I’d suggest the...

Read More »

This is a philosophical post targeted at anyone who messes about with code, and from time to time comes across intractable problems that they just can’t get around.

When I first started writing code for a living (as opposed to messing about) I had a mentor who got placed into the role by simple fact that she sat at the desk behind me in my very first job.   As the newbie on the team, I was pretty much less than useless, because not only could I not produce anything worthwhile, I actively took up peoples time trying to figure out why I couldn’t produce anything worthwhile.  I knew this for a fact when I was assigned to ‘tidy up the team bookshelf’ – then a mess of programming and system manuals in those natty clip-open binders, so you could plug in the latest updates.  Remember those?

Anyway, my self-appointed mentor (shamefully I can’t remember her name, though I’d run with Christina) basically got to the point where she told me “you can solve the problem, just keep tracing it until it presents itself”. ...

Read More »

This blog post is going to cover a pretty small subset of problems that people have with auto-generated Urls using Friendly Urls in DotNetNuke.    All Friendly Url solutions in DNN, regardless of what module used to generate them, approach the problem of making Urls better by converting some of the querystring values into the actual Url path.

Explained simply, a url which looks like this :

/default.aspx?tabid=64&key=value&text=description

will be converted to a url which looks like this (assume tabid 64 is ‘DNNPage’)

/Tabid/64/DNNPage/key/value/text/description/default.aspx or /DNNPage/key/value/text/description.aspx

The differences between the DNN Friendly Url Provider and the Url Master module is that the DNN provider will keep the tabid and the /default.aspx on the end, whereas the Url Master disposes of these parts of the Url.  However, the main similarity remains : the querystring items are converted to be part of the Url path.

In most cases this is advantageous,...

Read More »

I recently had a problem writing a PayPal Instant Payment Notification (IPN) listener.  The problem was that the PayPal Sandbox environment (now puzzlingly called x.com) would process my IPN requests OK, but any ‘live’ request that came through my site ended in error.

Now the PayPal support people assured me that this wasn’t possible, but after dumping most of the actual code out of my module, and replacing it with highly-sensitive ‘gotcha’ error capturing code, I worked out the problem was due to a slight difference in the date formats between the Sandbox and Live environments.

The Sandbox date looked like this:

22:40:29 Dec. 16, 2009 PST

The live date looked like this:

13:02:26 Dec 21, 2009 PST

Eagle eyed readers will detect the difference straight away.  It was a bit more difficult for me, as I was looking through raw logs and all I could see was 22%3A40%3A29+Dec.+16%2C+2009+PST as the values are encoded.  It was a surprise for me, but I guess I should have been more...

Read More »

When I was doing the rounds at the recent DotNetNuke OpenForce conference, I was surprised at the number of people who wanted to talk to me about the DNN Unit Testing framework I put together a few years back.   I use this on an almost daily basis, but it’s become part of the plumbing for all projects so I don’t really think about it as much as I used to.   I was recently contacted and asked to update it all for DNN 5, and I thought I would spend some time bringing it up to latest standards and generally re-visit the topic again.  It would seem there is a lot of interest in doing Test Driven Development with DNN, so this post will revisit all of that.

Should you be doing Test Driven Development with DotNetNuke? Test Driven Development (TDD) is a worthy goal of any software project that aspires to good quality and the flexibility to change over time.  If this is true of your DotNetNuke module, then the answer is yes.  All non-trivial iFinity modules have Unit Test projects that are run before releases and...

Read More »