Big Stumble by StumbleUpon

One year ago:

“Our badge/widget isn’t compatible with https sites; there are no plans at this time to change it.”

https://getsatisfaction.com/stumbleupon_help_center/topics/badge_widget_https_mixed_content_problem

Wow, how to ignore an ever growing set of your content base, specifically those most up-to-date and therefore probably interesting, in one sweeping statement.

Must be trying to compete with Reddit for the foot shooting prize.

Cute File Browser

I found this very neat jQuery based file browser:

http://tutorialzine.com/2014/09/cute-file-browser-jquery-ajax-php/

This uses a simply PHP script to form JSON output defining the filesystem, however in my case I want to serve files on a Windows PC using just static content. This is relatively easy to code – we just need to create the file listing in advance, e.g. into something called files.json, and modify the javascript to retrieve this instead of scan.php.

My batch script to do that is listed here – it simply scans recursively from the current directory creating the necessary JSON on the output; you can pipe it to the appropriate location for the files.json output.

@echo off
setlocal enableextensions disabledelayedexpansion

set p=%1
set n=%2
set comma=
set oldcomma=X

call:funcdo "%1" "%2"

endlocal
goto:eof

:funcdo
setlocal
set "p=%~1"
set "n=%~2"

echo {"name":"%n%","type":"folder","path":"%p%","items":[

set oldcomma=%oldcomma%%comma%
set comma=N

for /d %%d in (*) do (
    cd "%%d"
    call:funcdo "%p%/%%d" "%%d"
    echo ,
    cd ..
)

for /f "tokens=*" %%f in ('dir /b *.divx *.mpg *.mpeg *.avi *.mkv *.mp4 *.wmv 2^>nul ^| sort') do (
    echo {"name":"%%f","type":"file","path":"%p%/%%f","size":"%%~zf"},
)

echo {}]}

set comma=%oldcomma:~-1%
set oldcomma=%oldcomma:~0,-1%
endlocal
goto:eof

It’s not very polished and could no doubt be improved, but it works.

Mail forwarding blocked by SPF

Some time ago I moved away from Yahoo mail to my own hosted address, and used the forwarding function to pass through any residual mail. This worked fine for several years, but now my host has implemented strict SPF control and a lot of the forwarded mails get rejected.

Unfortunately Yahoo doesn’t give any sophisticated options to handle this, eg. there are a number of options they could have implemented for forwarding from the Yahoo address without looking like it’s spam:

  • normal forwarding, or as an attachment
  • putting the sender in the Reply-To header
  • or even a line of text saying who the original sender was

The only way I found to get around this was to stop the forwarding, and use a PHP script to periodically check my Yahoo account via POP and move the mail to my new IMAP account. This actually works fine, so in case it’s of use to others here is the script I use:

<html><body><pre>
<?php 

docopy("{pop.mail.yahoo.com:995/pop3/ssl}INBOX","Yahoo email","Yahoo password",
       "{Target imap:143}INBOX", "Target login", "Target password");

function docopy($smailbox, $suser, $spwd, $tmailbox, $tuser, $tpwd) {
  echo "--------------------\nCopying mail from $smailbox:$suser to $tmailbox:$tuser\n--------------------\n";

  if (!($source = imap_open($smailbox, $suser, $spwd))) {
    echo "Connect to source failed";
    exit(1);
  }

  echo "Connected source: $source\n";

  $msgcount = imap_num_msg($source);

  if ($msgcount == 0) {
    echo "No messages to process\n\n";
    imap_close($source);
    return;
  }

  echo "Messages: $msgcount\n";

  if (!($target = imap_open($tmailbox, $tuser, $tpwd))) {
    echo "Connect to target failed";
    imap_close($source);
    exit(1);
  }

  echo "Connected target: $target\n";

  for ($msg = 1; $msg <= $msgcount; $msg++) {
    echo "\nProcessing message $msg\n";

    $header = imap_fetchheader($source, $msg);
    $body = imap_body($source, $msg);

    if (!imap_append($target, $tmailbox, $header . $body)) {
      echo "Saving message failed";
      imap_close($source);
      imap_close($target);
      exit(1);
    }

    echo "Message saved\n";

    if (!imap_delete($source, $msg)) {
      echo "Deleting message failed";
      imap_close($source);
      imap_close($target);
      exit(1);
    }

    echo "Message deleted\n";
  }

  imap_expunge($source);

  imap_close($source);
  imap_close($target);

  echo "Completed copy\n\n";
}
?>
</pre></body></html>

Obviously you have to fill in the bits for Yahoo email, Yahoo password, Target imap etc. It should also work for other POP or IMAP sources/targets, but I haven’t tried it.

The function can be called several times if you have more than one account to copy, in my case two works fine.

It’s written to give some level of output if you run it through a web server, then once it’s working you can schedule it to run every few minutes via cron or similar.

App “upgrade” = Ransomware ?

I’ve been a user of SplashID password manager on my iPhone, iPad and Windows machine for a couple of years and found it pretty good. I paid $10 to use wifi sync which seemed reasonable value at the time.

Now, the developer has created an “upgraded” version which requires a $20 annual fee to use wifi sync. Of course they can offer this service and maybe some people will buy it, but I’m happy with my version thanks.

BUT – the version on my iDevices is linked to the App Store, and will automatically update if I enable this option or if I ever click the “Update All” button; there’s no easy way to stop this, and thus at some point my paid for functionality will inevitably be deleted by the developer.

In my view this is ransomware (or possibly theft). The developer almost certainly doesn’t intend it this way, but as a consumer I don’t care what their theory is, I care what I can use and what it costs me. When I buy something I don’t expect free upgrades, although they are often included, but I do expect it to not be remotely disabled and an additional fee demanded.

Of course there is a very simple solution – leave the application on the App Store and create a new one explicitely as “Version X”. If the old one breaks with an iOS update then fair enough, I didn’t buy perpetual support, but in the meantime don’t steal my functionality.

Posts on the SplashData forum received suggestions to use their permanent upgrade offer – so basically ransomware in email form rather than as an in-app purchase.

I also raised this with Apple but haven’t heard back yet.

iPhone 6

So I now have an iPhone 6 – after sticking with my old iPhone 4S for three years the new 6 offered enough difference to be worth the upgrade.

The migration was trivial and took less than one hour, with all the apps still apparently working and nothing more than a few logins to reset.

For the phone, the highlight is obviously the bigger screen. I didn’t really think the 4S was small, but wow the 6 is just so much better in that department, with even more clarity and so much more text visible. Reading news or looking at photos is a vastly improved experience, and I didn’t even feel it was a problem before.

In terms of the hardware, it feels solid, and the (optional) leather case is very nice to hold. Camera is significantly more responsive, and the fingerprint ID works pretty well. The size is OK, obviously a lot bigger but not so much it feels inappropriate for a phone.

The only thing I’ve noticed is that quite a lot of apps are obviously not yet adjusted for the new resolution, so the graphics feel blown up and a bit bold. It’s a bit like using the 2x view of an iPhone app on the iPad but not as bad.

Update 17 Oct

The Belkin Charge+Sync Dock works with the iPhone 6 with the leather case on. I think without the case the phone would be too thin and lean back uncomfortably far.

British English??

I just upgraded my iPad to iOS7, and have mixed views on the changes overall. The new functionality seems in general to be useful, but the flat design seems to be less clear than the old one and in particular some of the icons are really not intuitive or clear to me.

I’ve found one thing which particularly annoys me in the Mail application though:

My iPad is set to use British English, and Trash is not a British term! It’s also inconsistent when there’s a perfectly good wastebin icon on the email screen itself.

This started a train of thought about a similar icon/term which has always bothered me:

Why is is called a Recycle Bin ?

Stuff I put in our physical recycle bin gets taken away, cut up, washed / melted, and reworked into a range of new items, which I don’t personally get back. If I expected to put in a Word document and get back an Excel with numbers from a bunch of other people maybe the analogy would be more accurate.

To be fair there are some similarities:

  • I always forget to empty both the electronic and real form of the bins until we run out of space.
  • A file is always needed just after emptying, and newspaper is always needed for surface protection the day after it is recycled.

I wonder what the correct term for this electronic store would be? Options I’ve thought of:

Attic – much better metaphore, but can’t really picture the icon for this.

Celler – not very common in British English.

Garage – having a car on the icon would clearly cause confusion!

Shortcuts for Google Translating a page in IE

Google Chrome has some nice features, one in particular being the automatic translation. Unfortunately the performance on my home machine was awful, with long pauses before loading pages despite the usual attemps to cleanup, reinstall etc etc.

In a fit of frustration I tried IE, and was pleasantly surprised to find it very fast and very usable, with the exception of the translation part. Bing isn’t very well integrated, and simply doesn’t do very good translations.

I don’t like the Google Toolbar, but needed a button to do one-stop translation of the page, and found two solutions.

1. Use a Javascript bookmark in the Favourites bar

The following bookmark will take the current URL and open in it Google Translate:

javascript:window.open('http://translate.google.com/translate?hl=en&sl=auto&tl=en&u='+encodeURIComponent(location.href))

To install this in IE

  1. Bookmark the normal Google Translate page translate.google.com.
  2. Edit the properties of the new bookmark to set the URL to the javascript above.

You can change the target and interface language by modifying the tl=en and hl=en parts respectively.

2. Set up Google Translate as a search provider

By setting up Google Translate as a search provider, you can send the current address bar content in two clicks.

  1. Use the tool at the following page to create the search provider: www.enhanceie.com/ie/SearchBuilder.asp.The URL you need to use is: http://translate.google.com/translate?hl=en&sl=auto&tl=en&u=TEST
  2. To do the translation, click the little down arrow by the search button in the IE address bar, and click the Google Translate button twice.

Change Request = Risk Premium

Fixed price work is all the rage with IT finance departments and senior managers, even in this age of moving towards Agile methodologies and incremental delivery.

There’s definitely a big dichotomy between agile and fixed price, with the former based on flexible scope, frequent delivery and frequent business led prioritisation, and the later fixed scope, large delivery milestones and fixed priorities.

What I’ve found in a number of projects that attempted to be fixed price but flexible is that it leads to a large number of change requests. In itself this isn’t necessarily a bad thing – it’s surely better to have a change request than deliver the incorrect or out-of-date functionality. However, I’ve also observed that the cost of the change requests tends to increase, and frequently make the project overall uncompetitive compared to a regular non-fixed delivery.

I believe the reason for this is that the quotes for change requests build in an increasing risk premium. The logic for this is fairly simple:

  1. Project is priced based on assumed perfect knowledge of the requirements, with a contingency.
  2. Change request comes along, so the confidence about the overall requirements falls and a risk premium is added to cover assumed increased contingency requirements.
  3. Another change request comes along, so the confidence falls further and the risk premium increases further.
  4. etc etc

You can’t really blame the delivery team for this – it may be a bit naive to assume the requirements are clear/perfect at the start, but you have to work on some assumptions. Change requests typically mean that either the business are moving the requirements, or worse for existing systems that difficult parts of code/functionality are being uncovered; denying this increases the risk and the cost would be foolish.

I’m not sure there’s a good solution to this, but there are a couple of things I’ve seen.

Have a limit on change requests, either numeric or in percentage of cost terms.

This has a number of implications. For the delivery team, it means they have confidence the scope won’t keep changing, so the risk premium is lower. For the business, it means they have to think very clearly about changes and prioritise them properly.

Encourage a larger contingency, but allow use of it for small changes.

This means that a small amount of change is accepted and accounted for, so giving both sides more flexibility in how to manage it.

Overall I don’t believe fixed price is typically the right approach except for items which can be very clearly packaged (e.g. upgrades, migrations, modules linked by defined API), in most cases Agile will deliver a better solution more reliably. However, if you are using fixed price, perhaps the idea of a risk premium is useful.

Custom Search in IE8

Adding custom search providers to IE7 and IE8 was a bit convoluted, involving going to the Microsoft site to create the required XML based on a template URL. I could never work out why they didn’t build it into the browser, but it did kind-of work.

However, the MS site no longer offers this. A web search gives plenty of blogs telling you how to do it using the Microsoft site, but the option described is no longer there.

Fortunately, Eric Lawrence has put the functionality on his EnhanceIE.com site here:

www.enhanceie.com/ie/SearchBuilder.asp

Thanks Eric!

Resizing an Embedded Visio Canvas

As I work in a big bank, I handle a lot of Powerpoint presentations. Most are cut-and-paste versions of others, slightly modified for whatever senior audience is relevant at the time.

Unfortunately the graphics capabilities of Powerpoint are limited, therefore a lot of presentations have Visio diagrams embedded in them (if I’m lucky, and not just a nasty pixelated bitmap instead).

When I’m “tweaking” a presentation, I’ve often found it necessary to re-organise the layout, including the Visio parts, and find that the size of the Viseo tends to go crazy, either leaving me with big white borders to crop or losing parts of the diagram off the side.

Fortunately I found the very very simple solution here:

Press the Ctrl key and move your mouse over the edge of the canvas; when you see your cursor turn into a double arrow, drag the canvas edge to the required size.

The only issue I’ve found is that Powerpoint can update the zoom level while you are doing this, which stops the operation and can make the canvas resize incorrectly. Just make sure you do it fast enough before Powerpoint can react!