1 0
post icon

Why do we use Pulse at Neudesic? The four pillars of enterprise social networking

neudesic pulse
I’ve worked in the enterprise social networking space for a long time.   Over the years I’ve talked to a number of organizations to see how they use tools like Pulse to change the way they communicate and collaborate.  Of all the use cases that I’ve heard I can generally boil them down into what I consider the 4 pillars of enterprise social networking.

 

1) Culture Change
The primary goal of enterprise social networking, and by extension Pulse, is to facilitate an open culture.  This has very little to do with the actual tool and everything to do with how as an organization we interact with each other.  This crosses all areas of the business and extends into the relationships we have with our customers.Unlike email where communication is constrained to a targeted list of recipients on the “To” line Pulse is a way to ensure that communication is:

  • Open – Visible to everyone unless the need for security arises
  • Retained – Ever heard the term “reinvent the wheel”?  Why would we want to cover the same ground over and over again?  By using Pulse we retain knowledge long after the lifespan of the conversation for future reference.
  • Structured and Searchable -  What good is retaining knowledge if you can’t find it when you need it quickly?  Pulse gives you structure with tagging and groups along with a search interface that helps you discover what you’re looking for.

 

2) Knowledge and expertise discovery
Organizations are full of untapped knowledge.  By leveraging the search capability in Pulse we can find a wealth of information that has already been contributed by our colleagues.   The odds are good that the information you’re looking for has already been shared.

In some circumstances however that information may not be available.  There is still a good chance however that someone  else within Neudesic has already faced, and overcome, a similar obstacle.   In a closed organization these experiences are often lost and we’re forced to go it alone.  By creating communities focused around common interests, topics, technologies, projects, and functional areas we have a network of individuals that we can turn to for help if we can’t easily find the answer.  By building strong communities inside Pulse we can turn to recognized experts for their guidance on the best path forward.

As knowledge workers we inherently have a need to be informed about the latest developments on the topics important to us.   By following the tags associated with those topics in Pulse we get that information pushed to us without lifting a finger.   This is a powerful way to stay up to date on the latest trends and best practices that are relevant to our area of expertise.

When leveraging the collective knowledge of the organization we’re able to do our individual jobs more efficiently saving time and money for our customers.

3) Innovation
Great ideas can come from anywhere in the organization.  A social tool like Pulse is the equalizer and destroys the traditional notion of a corporate hierarchy.  By putting everyone on a level playing field it ensures that good ideas, no matter where they came from,  are surfaced so that decision makers can act on them quickly.

By leveraging the wisdom of the masses we can turn to our colleagues to make suggestions when we’re stumped by a perplexing problem.  These crowdsourced ideas allow a decision maker to pick the best one among those produced by the collective.

Sometimes all we need is a little validation.   You think your idea is the best since someone took a knife and sliced bread but do other people agree?  Pulse is a great way to validate our thoughts and ideas.   By sharing them you’re getting valuable feedback from peers which you can then incorporate to help mature your own thought process.

4) Identity and recognition
In a consulting organization such as ours it is common to see consultants “going native”.   This term refers to employees who spend an extended period of time on-site with our customers.  It can start to feel more like we work for the customer than Neudesic.  To further complicate matters we’re a national company which has a physical presence in 18 different markets in the United States (plus India!).  We may never meet many of our colleagues face to face yet they still have valuable ideas, knowledge, and experiences which we can leverage in the course of our day to day activities.

Pulse helps us maintain our identity inside of Neudesic while still remaining customer focused.   By sharing our experiences and knowledge with the collective whole of Neudesic we bring awareness to ourselves and  get the internal recognition we deserve.  This is important to foster a sense of belonging within the Neudesic collective which in turn improves moral and minimizes turnover.

Leave a Comment
post icon

Windows 8 backgrounds metro and desktop

I find it sort of odd that Microsoft didn’t provide a good OOTB way to keep the metro and desktop backgrounds in sync.  The abrupt switch from desktop to metro is a bit hard on the eyes with the default settings.   A quick tip to make this more pleasant is to make your classic desktop a solid color that matches that of the metro desktop.   I like grey so in my example I setup metro the way I wanted it and then took a screenshot, opened it in paint, and then using the eye dropper tool got the RGB value.   I then put this into the desktop solid color background and now I have a much nicer transition between metro/not metro.   The grey color is R: 88 G: 88 B: 88 in case you’re curious.

Here is what a screenshot looks like on my multi-monitor setup with metro next to classic.

 

Leave a Comment
August 22, 2012
post icon

Windows 8 Activation oddity

I just installed the RTM version of Windows 8 Enterprise from my MSDN subscription and I experienced an odd activation issue.   During the install I was not prompted for a product key.   Once the install is complete activation fails with error 0x8007232B.   When you view the activation center it reports that the installed product key ended in CWCX7 (even though I never entered a key).   In order to activate I had to change my key using the slmgr command line application to the one assigned to me by MSDN.

1)  Run a command prompt as administrator

2) slmgr -ipk xxxxx-xxxxx-xxxxx-xxxxx-xxxxx    (replace with the correct product key)

3) Try activation again

This wasn’t a fluke either -  I’ve seen the same thing on 3 different machines that I’ve installed it on.

 

Leave a Comment
post icon

Client integration in SharePoint 2010 issue

Under the hood client integration in SharePoint uses WebDAV.   SharePoint has its own implementation of the WebDAV server (bypassing the IIS ability).   We had a problem in one of our environments where when a user would open a file in SharePoint it would always display as read-only in the office client application.  In an “identical” environment that I had setup for testing the same process worked fine.

To troubleshoot I first opened up Fiddler to see what was happening under the hood.   When word (or any office app) requests the file from SharePoint it first sends the OPTIONS verb to the folder in which the file lives.  The request would come back from SharePoint as a 404 (even though the folder was there) with an interesting HTTP header.

X-MS-InvokeApp: 1; RequireReadOnly

When I did the same request on the environment that worked I would get a 200 with the expected list of valid operations:

Allow: GET, POST, OPTIONS, HEAD, MKCOL, PUT, PROPFIND, PROPPATCH, DELETE, MOVE, COPY, GETLIB, LOCK, UNLOCK

Digging further I discovered that in our production environment there was an additional entry in the web.config.   This limited the OPTIONS verb.

<system.webServer>

<security>

<requestFiltering allowDoubleEscaping=”true”>

<verbs allowUnlisted=”true”>

<add verb=”OPTIONS” allowed=”false” />

<add verb=”PROPFIND” allowed=”false” />

</verbs>

<requestLimits maxAllowedContentLength=”2147483647″ />

</requestFiltering>

</security>

After removing the verbs section everything started working as expected.

Leave a Comment
post icon

Powershell one liner for finding lowest latency domain controller

I needed to find a list of all of the domain controllers in a given domain and then ping them to find which had the lowest latency. This is useful in order to find which DC will respond to LDAP requests faster for SharePoint user profile synchronization.

A quick powershell one-liner did the trick:

[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() | % { $_.DomainControllers } | %{Test-Connection $_.Name}

Similarly this one-liner connects to port 389 (LDAP) on the DC to ensure there is no firewall blocking. If the connection hits the timeout limit or failed it throws an exception.:

[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain() | % { $_.DomainControllers } | %{$o=new-object Net.Sockets.TcpClient;$o.Connect( $_.IPAddress, 389); new-object PSObject -Property @{name=$_.Name;connected=$o.Connected}}

Leave a Comment
post icon

Quickly convert tif files to jpg in bulk using powershell

I was given a CD full of TIF files for a project I’m working on.   I needed to get these into the much more reasonable JPG format in order to put them up on a website.   I was able to bulk convert this to JPG with only a few lines of powershell.

 


#Load required assemblies and get object reference
[Reflection.Assembly]::LoadWithPartialName(System.Windows.Forms);

#Using Get-ChildItem we search for all files matching our extension recurisvley from the location of the script down.
$files = Get-ChildItem -Exclude $outputdir -Recurse -Include *.tif

foreach($f in $files) {
$i = new-object System.Drawing.Bitmap($f.FullName);
$filename = $f.FullName -replace .tif$, .jpg
$i.Save($filename, [System.Drawing.Imaging.ImageFormat]::Jpeg);
}

Leave a Comment
post icon

What tools to install on a SharePoint 2010 developer box

I’ve built out SharePoint development environments many times but I’ve never really sat down and made a list of the tools I use before.   A good friend emailed me today and asked what tools I have on my SharePoint development box and it prompted me to put a list together.   I thought I’d share what tools fit into my day to day usage.

First a bit about the infrastructure and topology of my development environment.   I’ve got a dedicated VMWare ESXi 5.0 box in my basement with an i7-920, 24GB of ram, and 4x2TB hard drives in Raid 1+0.  I’m using an Adaptec hardware raid controller all inside of  a Super Micro tower.

With that box I’m able to run quite a number of virtual machines for a lot of different tasks beyond SharePoint development.   I’ve got a combination of Linux and Windows servers and clients setup for building and testing various applications.   A couple boxes are mainstays however and provide resources that are shared across the rest.   These are my domain controller and SQL box.   Both are running server 2008R2.   The SQL box has multiple SQL instances on it (2008R2 and 2012).   I have a couple of different SharePoint VMs and fire them up depending on what I’m working on.

When setting up the development box I always turn to AutoSPInstaller to actually install the SharePoint bits.   It automates the process and makes it repeatable.   It can handle installing the prequisites, configuring the farm, configuring service applications, creating web applications, creating site applications, etc.   It is really very powerful and saves a ton of time in setting up a new environment.   You can get it at http://autospinstaller.codeplex.com/.

 

For my primary 2010 development box I also have the following tools installed:

And while I hesitate to admit it given how much I hate the headache it can cause, I do also use SharePoint Designer from time to time.   While I’m a firm believer that you shouldn’t do SharePoint customizations with it (everything should be done via Visual Studio and packaged into a WSP) the truth is that SharePoint Designer is really good for working on masterpages.   If you’re doing branding work then I’d recommend it be included into your tool arsenal.

Leave a Comment
post icon

Comparing Office 365 and Google Apps

I’ve used Google Apps for many years given that it is a reliable way for me to host my personal email for free.   I own my own domain (obviously) and I enjoy having the address jason@vallery.net.    Since the surname Vallery isn’t terribly common I’ve also had the occasion to setup email addresses for close and distant family members who wanted the novelty of name@vallery.net.    With the free version of Google Apps you can create up to 10 accounts which was more than enough for my limited needs.

Given my role in technology I’ve also had the occasion to help friends and family with their own personal web needs.  Over the last few years I’ve helped several folks get off the ground with a basic website and email on their own domain for either personal or small business use.   Every single time I’ve turned to Google Apps as the solution for them to host their email, calendar, etc.

Now that Office 365 has been available for a while I decided to evaluate both my own usage of Google Apps as well as what tool I’m recommended to people who ask me.   What I’ve found has redefined the problem a bit and changed the way I approach the answer.

For my own use I migrated my domain over to Office 365 last fall (around November 2011 I think).   I was pleased with the tools that Microsoft offered to accomplish this.   It was a pretty simple task for me to import the users, migrate their email, and then send them their new login credentials.   I had a little bit of effort in walking the family members through configuring Outlook and/or their Phones but it generally went well.

There were a few things that I immediately noticed were missing however:

  • No custom CNAME for the login page.   Everyone had got used to logging in at https://mail.vallery.net/.   Now I have to have them go to https://portal.microsoftonline.com?   What is that about?   It would have made the transition quite a bit simpler if I could have just remapped the CNAME so the URL wouldn’t have changed for the users.

 

  • DNS management is tricky.   Microsoft has the expectation that I’m going to just hand them over my domain and use their DNS servers.   No way Microsoft!!   I use my domain for a lot more than email and instant messaging.   I’ve got a number of complex records that need to be maintained.  I want the ability to dynamically update those records via an API.   That is why I turned to paying for the premium service from dyndns.org to host my DNS.   With the limited capability that Microsoft is offering for DNS management there was no way I was going to switch to their name server.   As a result I had to “trick” their system by looking up all of the records that they would have inserted on my zone had they been hosting it and then create them on dyndns.org’s server.   This wasn’t a big deal but shortly after I setup my account those records changed and my service stopped working.   I had to go and repeat the process.   I understand why from a stability perspective Microsoft wants to be able to handle the DNS for the domain but that just isn’t practical until their tools are as robust as other offerings.

 

  • Of course the biggest difference is cost.   For free with Google Apps you get 10 mailboxes, calendar, cloud storage for documents, instant messaging,  SAML claims support (ADFS),  and a marketplace full of additional capabilities.  For free from Microsoft you get….  nothing.    The cheapest Office 365 plan is $4/month/user and that only gets you exchange.   For $6/month/user you can include Lync and a SharePoint site collection.   You still don’t get full enterprise features like sync with AD, true SharePoint (mysites, multiple site collections, etc).   That doesn’t kick in until you get up the E1 plan.  Current Office 365 pricing and plans: www.microsoft.com/en-us/office365/compare-plans.aspx

 

So what does that mean?   For someone like my cousin who has a classic car restoration business (http://chclassics.com) it would make no sense for him to pay $6/month/user for email.   He has five employees and only two of those actually use email.   With Google Apps he can get free hosting for his email and calendar and it meets 100% of his needs for free.   I can’t help but recommend that he go that route.

For someone like myself who lives in his email it makes more sense for me to go Office 365.   I mentioned the things that Office 365 was missing above but I didn’t mention what it brings.   This is exchange.   The most powerful mail server that has ever existed.   I get to push my email down to Outlook.  No more IMAP.   I get 25GB of storage to archive and search my old messages.   I get a SharePoint site for hosting my family’s documents.   I have a shared One Note with my wife with all kinds of stuff in it (tasks, shopping list, recipes, finances, etc).

So – if you’re a small business with a technical savvy audience that can appreciate the real value that having a true exchange/SharePoint based solution can bring then obviously Office 365 is the way to go.   If you need the very basic functionality and are watching your expenses very closely than I’d say stick with Google Apps.   For me the $6/month/user I’m paying is a small price to pay for the functionality that I get.   I will certainly continue to recommend Google Apps though for people like my cousin who just want to get their email.

Obviously neither Google or Microsoft are making their money off customers like myself or my cousin.   That isn’t the market that either of them are after.   The under 10 user customer isn’t even on the Microsoft radar.   I think from a public relations perspective though it would benefit Microsoft to consider introducing a plan that would directly compete with the free Google Apps plan.  Who knows…  maybe some day my cousins 5 person business will turn into a 50 person business?  Wouldn’t it be easier for him to continue using Google Apps then switch to Office365 at that point?

Leave a Comment
post icon

Terrible customer service from Microsoft

I’m obviously a big proponent of Microsoft and the Windows Phone platform.   I’m not one to badmouth them usually but I’m very upset at the moment.   Since I’ve been developing WP7 applications I convinced my wife to help with testing by swapping her phone.  During the recent Smoked by Windows Phone Challenge she reluctantly exchanged her iPhone 4 for an HTC Titan.  She likes the phone but it turns out the specific device she received has a malfunctioning microphone.   When she is on the phone she sounds like she is under water or has a sock in her mouth.   As a phone it is pretty much unusable.   The problem is fairly well documented

http://pocketnow.com/windows-phone/htc-investigating-titan-voice-quality-problems

http://community.htc.com/na/htc-forums/windows-phone/f/174/t/14950.aspx

I assumed this would be a straightforward swap to get a replacement phone.  She took her phone over to the local Microsoft store and explained the problem.   They told her that they couldn’t do anything about it and she would need to contact AT&T.   I called AT&T and they explained because the issue happened within the first 30 days there is nothing that they can do.  It is the responsibility of the original point of purchase to exchange the device or refund the money (we didn’t pay anything).  If it was after 30 days the best they could do would be to give her a refurbished phone.  I called back Microsoft and begged with the store representative to give us a new phone or her old iPhone back.  The best he could offer me was if (and according to him it was a VERY big if) they managed to get more HTC Titans in he would give me a call and we could exchange it.   He said this could be weeks or may never happen at all.  He suggested I contact HTC for warranty repair.  I called HTC and they explained that the best they could do is have us ship them the device and they would repair it and ship it back.   This could take up to 6-8 weeks.

So – my choices are either my wife goes without a phone for several weeks or I drop $500+ on an out of contract replacement phone.   She is furious because she didn’t want to switch in the first place and just 2 weeks ago she had a perfectly functioning iPhone 4.

Microsoft – If you want to be successful in the consumer space you need to work on your customer service skills. I would have NEVER had this experience in an Apple store.

Update 5/16/2012 — Derek, the store manager at the Park Meadows location, called me yesterday.   It sounded like he had probably read my blog article based on what he was saying.   He offered to swap my wife’s Titan for a Samsung Focus S.  I gladly took him up on the offer.  I went and picked it up today without incident.   I’ve had a Focus S since it launched last fall and I’ve been very happy with it.

Leave a Comment
post icon

Organizing your music with Powershell

So my wife just swapped her iPhone 4 for a new HTC Titan Windows Phone thanks to the recent Smoked by Windows Phone challenge.   The first thing she asked me about is how to get all of her music over to the new phone.  I’ve been using Zune Pass quite happily for a while however she has still continued to buy music from iTunes.   Her library, combined with the one that I had been amassing over the last several yeas before Zune Pass, meant that we have quite a bit of owned music.  Unfortunately like my pictures in the previous blog post thanks to multiple system backups, multiple computers, and the general fact that most of my files are in a sad state of unorganized I’m left with no consolidated music library.

Powershell to the rescue!!

I took the basic idea from the picture script I posted earlier and combined it with an open source DLL I found online which can query the metadata from a music file.  Grab the latest Windows package from http://download.banshee.fm/taglib-sharp/ and extract the taglib-sharp.dll file into the same folder as your powershell script.  

Here is the script –  it will remove duplicates and create a new folder with all of your music across multiple locations containing the unique files in the directory hierarchy ARTIST\ALBUM\TITLE.

#This is really divided into two scripts.   The first one searches for our audio files and creates and MD5 hash of each one. 
#Merging them all into the same folder allows us to eleminate duplicates.
#The second script reads the audio tags and puts them back out into folders based on artist, album, and title.


#Function to calculate the MD5 hash of a file
function Get-MD5([System.IO.FileInfo] $file = $(throw 'Usage: Get-MD5 [System.IO.FileInfo]'))
{
    # This Get-MD5 function sourced from:
    # http://blogs.msdn.com/powershell/archive/2006/04/25/583225.aspx
    $stream = $null;
    $cryptoServiceProvider = [System.Security.Cryptography.MD5CryptoServiceProvider];
    $hashAlgorithm = new-object $cryptoServiceProvider
    $stream = $file.OpenRead();
    $hashByteArray = $hashAlgorithm.ComputeHash($stream);
    $stream.Close();

    ## We have to be sure that we close the file stream if any exceptions are thrown.
    trap
    {
        if ($stream -ne $null) { $stream.Close(); }
        break;
    }

    $md5 = ""
    foreach ($byte in $hashByteArray)
      {
        $md5 = $md5 + $byte.ToString("X2");
      }
return $md5;
}

#Figure out where we are at and if there is a subfolder called output.  If not we will create one.   This is where we will put all of our images.
$currdir =  split-path -parent $MyInvocation.MyCommand.Definition
$outputdir = $currdir + "\output\"
if (!(Test-Path -path $outputdir))
{
    New-Item $outputdir -type directory
}

$tmpdir = $currdir + "\tmp\"
if (!(Test-Path -path $tmpdir))
{
    New-Item $tmpdir -type directory
}


#Using Get-ChildItem we search for all files matching our extension recurisvley from the location of the script down.
$files = Get-ChildItem -Exclude $outputdir -Recurse -Include *.m4a,*.mp3,*.wma

#We're going to keep track of how many files we process and put a unique number in the file for each one (eliminates all possibility of duplicate filename)
$i = 0;
foreach($f in $files) {
    #Increment our counter
    $i++;
     
    #Calcualte the MD5 of the original file so that we can look for duplicates later
    $md5 = Get-MD5($f);

    #The target filename will be the output directory with the MD5 hash as the filename and the original file extension
    $targetname = $tmpdir + $md5 + $f.extension;
    
    #Write the file to the output folder, if there are duplicate files Copy-Item's default behavior is to overwrite.   This eleminates the dupes.
    Copy-Item  $f.fullname $targetname
    
    #Could delete the old version, I'm leaving it as a backup so I've commented this out.
    #Remove-Item $f.fullname;    
    
    Write-Output $targetname
        
    #Write percent compelted of current operation
    $percent = [System.Math]::Round((($i / $files.Count)  * 100), 2)
    Write-Progress -Activity "Calculating hashes..."  -PercentComplete $percent -CurrentOperation "$percent% complete" -Status "Please wait."                
}


#Now that we've zapped our duplicates we can move the files out to their target locations
#We loop through them again extracting the important bits from the audio tags
#Format will be /$artist/$album/$title.Extension

#Load the taglib library assuming the DLL is in the same folder (be sure to Unblock it).  
#You can get the DLL from http://download.banshee.fm/taglib-sharp/ -- I'm using 2.0.4.0 which was latest at time of writing this
[Reflection.Assembly]::LoadFile( (Resolve-Path ".\taglib-sharp.dll") )

#List of characters that we can't use
$invalid_characters = "[{0}]" -f ([Regex]::Escape([String][System.IO.Path]::GetInvalidPathChars()) + "/", "\", "*", "?", ":")  

$files = Get-ChildItem $tmpdir -Recurse
$i = 0;
foreach($f in $files) {
    $i++;
    
    
    #Load up the audio file into TagLib
    $audiofile = [TagLib.File]::Create($f.fullname);                
    
    if($audiofile.Tag.AlbumArtists) {
        $artist = [string] $audiofile.Tag.AlbumArtists
    } elseif ($audiofile.Tag.FirstArtist) {
        $artist = [string] $audiofile.Tag.FirstArtist        
        $audiofile.Tag.AlbumArtists = $artist
        $audiofile.Save()        
    } else {
        $artist = "Unknown"
    }
    
    if($audiofile.Tag.Album) {
        $album = [string] $audiofile.Tag.Album
    } else {
        $album = "Unknown"
    }
    
    
    if ($audiofile.Tag.Title) {
        $title = [string] $audiofile.Tag.Title            
    } else {
        $title = "Unknown"
    }
    
    
    $artist = [string][Regex]::Replace($artist, $invalid_characters, '')
    $album = [string][Regex]::Replace($album, $invalid_characters, '')
    $title = [string][Regex]::Replace($title, $invalid_characters, '')
    
    #Where are we putting the new file?
    $targetname = $outputdir  + $artist + "\" + $album + "\" + $title  
    
    #Make sure that our folders exist (one for each month under the year) and if not create them
        if (!(Test-Path -path ($outputdir + $artist)))
        {
          $output =  New-Item ($outputdir + $artist) -type directory
        }

        if (!(Test-Path -path ($outputdir + $artist + "\" + $album)))
        {
          $output =  New-Item ($outputdir + $artist + "\" + $album) -type directory
        }
        
        
        $dupe = $true
        $x = 1
        While($dupe) {
            $x++
            if (!(Test-Path -Path ($targetname + $f.extension)))
            {
                $targetname = $targetname + $f.extension
                $dupe = $false                
            } elseif (!(Test-Path -Path ($targetname + "-" + $x + $f.extension))) 
            {
                $targetname = $targetname + "-" + $x + $f.extension
                $dupe = $false                            
            }            
        }
        
        #Move the source file to it's new home. 
        Move-Item -Path $f.fullname -Destination $targetname 
        Write-Output $targetname
        
        #Write percent compelted of current operation
        $percent = (($i / $files.Count)  * 100)        
        Write-Progress -Activity "Moving files..."  -PercentComplete $percent -CurrentOperation "$percent% complete" -Status "Please wait."        
    }
Leave a Comment