Jun 02 2009

Free WiFi – No Internet

Published by gringod under General, Technology

On my way to bell ringing practice last night I happen to pick up a screw (easy tiger!) in one of my car tyres.  So during my lunch today I took the car into my local Target Auto Parts store to get the puncture fixed.

Whilst I was waiting I did what I normally do with my spare time and whipped out my trusty iPhone to catch up with Google Reader/Podcasts/Twitter/games.  I’m sure you can imagine my joy to find that there is a wifi access point at Target which is open to the public.  I’m sure you can also imagine my devastation to find that, once connected to the wifi network I couldn’t access the internet.

I spent the next 20 minutes playing around with the iPhones wifi settings, MobileTerminal and Safari trying to access the wireless router to see if I could “fix” it.  Result:  FAIL!

So here is a plea to all companies that require customers to sit around twiddling their thumbs waiting for you to get a job done:  please, Please, PLEASE, if you’re going to tempt us with an open wifi access point, please follow through and provide access to the internet.  It really doesn’t cost that much and we’ll be much happier to come back next time!

No responses yet

Jun 01 2009

Use Bing As Safari Search Provider

Published by gringod under General

I’m always looking for the next great thing when it comes to Search.  Google is great but I can’t help but feel it could be better.  Since attending a developer course for FAST ESP back in January I’ve been looking for a Search provider that does more for navigating results rather than just allowing you to page through X thousand results until you get bored and try other search terms.

Microsoft may have hit the nail on the head with Bing.com.  Whilst I think the interface could do with a bit more thought, the features are spot on.

Unfortunately Safari browser on MacOS is tied to Google.com as the search provider.  Change the search provider requires changing the source code of the application… or Glims – a nifty Safari plugin.

Once Glims is downloaded and installed, open the Safari Preferences and under the Glims tab select “Search Engines”.

GLims Search Providers

You then need to add a new search engine with the following settings:

Bing.com settings

For the copy-paste folks out there, the url should be: http://www.bing.com/search?q=#query#

You can drag-drop the Bing search engine to the top of the Glims search engines list.  Also, select Bing from the search engines drop-down in the search box of a Safari browser window.

I’m not sure if this is required for it to work, but you may need to set your Bing.com region to being the U.S.A.: http://bit.ly/42kg8

4 responses so far

May 15 2009

VisendoSMTPExtender Management Web Service

Published by gringod under .NET, Programming, Software

Background:

For work, I’m using a Windows 2008 Server virtual machine for doing all my SharePoint and .Net development on.  As it has got all of the cool stuff I’m working on, it is also the machine that I use to demo what I can do to clients.  Recently I’ve had a bit of a serge in the number of clients wanting to see Nintex Workflow 2007 (NFW2007) for SharePoint.

One of the cool features of NWF2007 is the whole Lazy Approval system, whereby users don’t have to go into SharePoint to approve to decline requests, they can just reply to the notification email with “approved”, “declined”, “ok”, “yes”, “no” or any other recognised word as the first line of the email.  In or to demonstrate this I need to setup and email system on my local machine.  The SMTP (sending) side of things is easy as it is built in to Windows 2008.  However, POP3 is a bit of a problem.  Previous version of IIS had a simple POP3 service but that has been dropped in IIS7.  The Microsoft way would be to install Exchange Server but that is a little too heavyweight for what I am trying to acheive.  Luckily a company called Visendo provides a free solution to plug the gap.  So now I can demo Nintex notification features.

Another feature I also wanted to demonstrate was setting up Active Directory accounts and then using those new accounts.  Nintex has got actions that allow you to interact with Active Directory but to then do anything usefull with the account required modifying xml config files and restarting the Visendo service.  But Nintex can call web services, so I’ve created a web service that has an AddAccount and DeleteAccount methods to update the Visendo configuration and restart the service.

Download:

I’ve made the source code for this web service freely available should anyone else want to have this sort of functionality: VisendoSMTPService.  The code is written against .Net 3.5 and is provided “as is” with no sort of warranty and is most definitely NOT recommended for live systems.  The code is released under a BSD License.

3 responses so far

Apr 16 2009

FAST Powers Globrix Property Search

Published by gringod under General

C5 Alliance LogoToday I’m attending an event being hosted by my employer C5 Alliance in Jersey.  We’ve got two respresentitive from FAST (a Microsoft Subsidiary) hosting a presentation and discussion session about FAST ESP, Microsofts vision for the future of FAST and helping users to navigate to the search results they are looking for.

FAST LogoAs well as the general bumf about how FAST ESP works, they have also done a couple of demonstrations of clients they have worked with.  Two very interesting sites that demonstration the power of FAST ESP in helping users quick find what they are looking for are Getty and Globrix.

FAST @ C5 Alliance

Globrix was a surprise to me – although quite logical now that I know – as I have been using Gobrix for a while to look for a house to buy in Guernsey.  Everytime I go to Globrix I just start with a general search for “Guernsey”.  The result navigators down the left and the price graph across the top allow users to quickly refine the search results – it’s also AJAX enabled so the user doesn’t even leave the page to get the latest results.

The Globrix paradigm deviates from the normal type of property search website, in which the users creates a fixed query and if they don’t find what they’re after they have to create a new search query.  Globrix allows the users to dynamically build their query usign contextual navigators, e.g. you might select an area to search in then refine the number of bedrooms and then refine the price.

FAST also differs from Google.  The power of Google is in getting relevant information to the user in the first few results (how many people look more than 2 pages through the results?) but this fails the users when they don’t know what they’re looking for, it requires to keep try to guess more terms or different combinations of terms to try and find what they’re looking for.  FAST allows the users to enter very simple search terms and then gives the users options to refine the query based on the context of the results that have been returned from thier initial query.  But it doesn’t end there, as the user refines their query the context changes therefore the content refinement navigators change with the context.

Other interesting nuggets that come out of the sessions was the ability to search audio and video.  The scenario brought to the table was about having to record all telephone conversations and have those readily accessible for future retreival.  The simple solution to this is to store the audio files in a known location.  When indexing that location run the audio through a speak-to-text conversion service and index the resulting text and associate the audio file location with the index.

In terms of SharePoint integration of FAST, we got a very sneak preview of an exciting new webpart that should be making its way into Codeplex in the not too distant future.  I’m not sure if I can more than that as I was informed that this web part hasn’t been announced yet – watch this space for more information!

No responses yet

Apr 08 2009

Getting Things Done By Location

Published by gringod under General, Software, Technology

For several years now I’ve been trying to find a way of keeping on top of everything that I need to get done.  To be honest, I didn’t think I had a problem until I read David Allens book “Getting Things Done” (GTD).  It was whilst reading that book that I realised that I spend most of my time worry about what I need to get done and what I might be forgetting to do and not enough time actually doing things.

I’ve had several attempts at trying to follow the GTD methodology but so far they have all failed and I’ve reverted to just relying on the good ole grey matter to remember what I have got to do.  I’ve tried using software to help me – iGTD, Midnight Inbox, OmniFocus, Outlook, iCal, Google Calendar – but the problem with a lot of these is that they are either platform specific (I need my laptop with me) or are calendar based (a lot of what I need to remember is not date specific).

Other attempts have been centered around a notebook that I try to remember to take with me.  This has inevitably resulted in my failing to remember to take my notebook with me and therefore forgetting to update it what I have it to hand again.

I am now embarking on another attempt to follow the GTD methodology.  This time I’m resting my faith on a relatively new entry into the GTD software arena: TheHitList form a compay called Potion Factory.  A couple of nice features that I’m hoping are going to make this easier for me to get along with are:

  • iCal syncing (I have all my calendars synced – iCal, Google, Entourage, iPhone)
  • Repeating tasks (cleaning fish tank, mothly invoicing, etc.)
  • Timer (hopefully no more getting distracted!)
  • Future iPhone support (I may forget my notepad but I NEVER forget my iPhone!)

As great as this software is shaping up there is one striking feature that I think this app – and all other GTD apps – really needs.  Task Locations!  So I’ll go out to run some errands, get home and realised there was some else I could have got done because I was in the area but didn’t because I didn;t think of it whilst I was there – if I had a map on my iPhone of tasks in my current location I could get more done in less time.

TheHitList Task MapI’m not sure of how the iPhone app UI is going to look for TheHitList but I came up with a (very) rough Photoshop version of what the desktop app might look like.

This example is showing the Today list selected and the map with the number of tasks for today on their locations.  If you  had general list selected it might show the tasks for today in red with tasks in the future fading through to grey for tasks without a specific date.  With this type of functionality you’d be easily able to see if you’re going to a location for a specific task whether or not there were other things in the area you could do at the same time.

4 responses so far

Mar 23 2009

ScriptManager vs ClientScript

Published by gringod under .NET, General, Programming

As part of a Microsoft Dynamics CRM customisation project, I was recently tasked with modifying an ISV add-in page so that individual sections of the page could be refreshed without having to refresh the entire page.

That in itself was nice and easy, it just required the use of a couple of UpdatePanel and UpdateProgress controls to be dropped on the page along with a ScriptManager control to handle the partial postback requests.

However, there were a couple of gotchas that I didn’t foresee.  Along with the partial updates, the client wanted the parts of the page to load the first time after the page had first loaded in the following order:

  1. Load base page.
  2. Start load of Application Status section.
  3. Start load of Risk section.
  4. Start load of Alerts section.

Unfortunately, the ScriptManager that comes with ASP.Net AJAX only handles one postback at a time.  Any subsequent postbacks take precedence over earlier request, which is fine if you only have one update panel on a page but this initially resulted in only the Alerts section being loaded – the other postbacks being canceled.

Luckily I found a very useful post on Amit’s Blog: Asp.Net Ajax UpdatePanel Simultaneous Update.  This post provides code that queues postback requests.  Ideally I would have liked to have the requests happening at the same time, but this is the next best thing.

The other problem that I found was that one of the sections on the page had previously been dynamically creating and reqistering script that got loaded and executed when the page loaded using:

Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
    "ShowNavBarItem", script.ToString());

Unfortunately that doesn’t work with the AJAX ScriptManager.  Instead I had to change the code to use the ScriptManager to load and execute the code using the following:

ScriptManager.RegisterClientScriptBlock(updatePanelApplications,
    typeof(UpdatePanel), "showNavBarItems", script.ToString(), true);

This means that each time the section is updated I can re-generate the script and it will be executed again.

With this AJAX loading and some enhancements to the SQL code, users now get a much fasted load and response time for the page as the no longer have to wait for the whole page to be rendered before seeing information appearing on the page.

kick it on DotNetKicks.com

No responses yet

Mar 10 2009

The SharePoint Adrenalin Moment

Published by gringod under Programming, Software

I’ve been developing with SharePoint for about 9 month now, and by developing I don’t mean airy-fairy SharePoint Designer drag-and-drop, I mean proper getting your hands dirty in code because SharePoint doesn’t have an *cough* out of the box *cough* feature that does what you want.

Mostly, deployment is done in two stages, firstly to a UAT box and then to a Live box.  Obviously the most efficient way to do this is to bundle your features into a solution which can easily be deployed onto any number of machines.  But, it does mean you have to make sure you’ve got everything right.  Untangling mistakes in your code can be a right royal pain in the arse.

By the time you’ve developed your solution, tested it out, deployed it to UAT and tested it again you should be fairly confident that when you come to deploy it on the Live server things should go pretty smoothly.  And, touch wood, to date things have gone smoothly.

But I still can’t get over that rush of adrenaline that comes with clicking “Activate Feature” after deploying the solution on Live.  In the second or two whilst the page waits to reload my mind runs through all the possible things that could go wrong and how long it would take me to unpick the changes my code might have got half way though.  Then the page finally loads…..

….. “Feature Activated”, phew!  Time for a lie down to clam my nerves.

2 responses so far

Mar 06 2009

Detecting Document Loaded on Window.Open()

Published by gringod under General

One of the tasks I have to achieve in a CRM project I’m working on requires opening a new IE window and identifying when the document within it has been loaded.

Unfortunately I have been unable to find a solution to this online but  found plenty of references to methods that don’t work.  So I decided to play around until I found a method that work and blog about it…. I guess I succeeded as you’re reading this!

Creating a new window using JavaScript is easy enough:

<script language="javascript">
    var newWindow = window.open("popup.html", "new popup window");
</script>

What would be really useful is if you could attach to an onload event of the newWindow variable.  Unfortunately this isn’t possible.  What I have found out is that it is possible to call back from the popup window to the code that loaded it.

For example, if we have two pages index.html and popup.html we can add the following code to index.html:

<script language="javascript">
    window.open("popup.html", "new popup window");
 
    function popupLoaded(newWindow)
    {
        // code to run after popup has loaded
    }
</script>

Within popup.html we can then added the following which will call back to the popupLoaded function in index.html when the popup is loaded:

<script language="javascript">
    function callback() {    
        window.opener.popupLoaded(this);
    }
</script>
<body onload=”callback()”>
</body>

The reason for the inclusion of the newWindow parameter of popupLoaded is to be able to get a handle on the new popup window.  I tried using a object returned from window.open() but it didn’t seem to keep a valid handle to the popup window.

kick it on DotNetKicks.com

2 responses so far

Feb 25 2009

CRM 4 iFrame Printing

Published by gringod under Programming, Software

Last year I was working with a client to develop some ISV add-ins for Microsoft Dynamics CRM.  Recently I was alerted to the fact that one of them – a seperate aspx page that loads in an iFrame on the account details panel – wasn’t printing correctly.

It displayed correctly in the normal view form, appeared correctly on the print preview form but when actually printed it was collapsed down to one or two pixels high.

After doing a bit of research, I found this post by Vince Bullinger, in which he gets around the problem by, as far as I can tell, modifying a core CRM css file.  Whilst this will work, it should be noted that any modification to core CRM files is not supported and will almost certainly break or be lost by updates and hotfixes.

Another problem with the code Vince Bullinger gives is that the iFrames a fixed height and that applies to ALL ISV iFrames.  However, with this knowledge I was able to  come up with my own solution that uses a bit of Javascript to ensure that iFrames are printed and at the correct height to display all the content:

<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="Summary.aspx.cs" Inherits="CRMWeb.SummaryStatus.Summary" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Summary Status</title>
    <style type="text/css">
        #pageWrapper
        {
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>
<body>
    <div id="pageWrapper">
    <form id="form1" runat="server">
        <!-- content goes here -->
    </form>
    </div>
    <script language="javascript" type="text/javascript">
        var dh = document.getElementById("pageWrapper").offsetHeight;
        document.parentWindow.frameElement.height = dh;
        document.parentWindow.frameElement.style.display = "block";
        document.parentWindow.frameElement.style.height = dh + "px";
    </script>
</body>
</html>

This solutions requires that you surround the content of your page with a div, in this case <div id=”pageWrapper”></div>.  This is used by the block of Javascript at the end.

The purpose of the Javascript is to use the pageWrapper div to find out the height of the content.  This height is then used to set the height of the iFrame that contains the page and to set the display style of the iFrame to block.

It probably doesn’t require the iFrame height and the iFrames style.height both being set but I decided to take a belts and braces approach.

In addition to ensuring the iFrame content is printed, I am also planning on implementing the code on Vince Bullingers page for loading a specific css stylesheet for printing.

kick it on DotNetKicks.com

One response so far

Feb 11 2009

Microsoft Enterprise Search Roadmap

Published by gringod under .NET, Programming, Software

When I first started developing with SharePoint in June last year the last thing that was on my mind was Enterprise Search.  I had considered it the sort of technology that you just plug in a magic box and it just did all the work for you.

Recently, however, I have been involved in developing a customised search solution using Microsoft Office SharePoint Server (MOSS) to allow a client to search client and non-client related documentation within their organisation.   What I rapidly discovered is that enterprise search is not a plug-and-play affair.  A lot of thought needs to go into the meta data that is used to define the taxonomy of the data (in this documents) and also how users are going to interact with search and how to make sure they get the information they need.

I have also recently been on a training course at FAST Search,which was acquired by Microsoft in April 2008.  The course was both an introduction to the structure of FAST ESP and also an in-depth look into customising the internal, both feeding content into the indexing engine of FAST ESP and building a rich user experience for getting content from the FATS ESP search engine.

The two activities have really awaken me to how powerfull enterprise search can be in empowering users to find information which previously they either may not have know how to access or, more likely, simply hadn’t known existed.  Whilst I was learning about FAST Search, it was generally anticipated that it would be included with the next generation of MOSS.  Today that was confirmed at FASTForward ‘09 when Microsoft announced its roadmap for enterprise search which has two initial streams, firstly FAST Search for Internet Business which is mainly aimed at internet retail businesses – like you’d use to find products on Amazon.  The second, and more interesting for me, stream is FAST Search for SharePoint, which will integrate FAST Search more closely with SharePoint and would be used for the type of internal information discovery that I have been working on recently.

Mark Harrisson also noted on his blog that Microsoft is going to be offering ESP for SharePoint immediately which is

a special offering that allows customers to purchase high-end search capabilities today, with a defined licensing path to FAST Search for SharePoint when it becomes available.

I haven’t been able to find out more information about ESP for SharePoint, but it certainly looks like it could be an interesting product to get hold of.  I the mean time I’m keen to continue working with MOSS Enterprise Search and have just the right project lined up to flex my new found love of search on.

No responses yet

Next »