Locked the two boys in their room

Locked the two boys in their room and told them I was calling Child Services to take them away. They start packing and bawling because I kept yelling at them that they would never be back. Then I actually made a phone call and came back into their room an hour later telling them they didn’t accept shitty little kids at the orphanage because they were full of them.

One small tip for parents

One small tip for parents.

My happiest memories as a child, and the ones imprinted most indelibly on my heart, typically involve a happy or enthusiastic adult apart from toys — a teacher who infused fun into our physics lessons, an uncle who took us on bike rides to Galle face whenever we visited Colombo and a coach who loved his job.

But the happiest of happy moments always involved my parents. When my dad laughed or my mom got excited about something, time stood still and my heart threatened to burst. I delighted to see them delighted; their enthusiasm and joy instantly and naturally transferred to me because I loved to see them happy.

Kids learn to love what brings their parents delight. So what does this speak to you during this Advent season?

Latest build of Windows 10 removes ‘Smart Files’. Go vote to get it back

Smart files is one of the most awesomest feature in Windows 8. It basically lets you ‘see’ all your files in OneDrive but takes up a ridiculously minute fraction of storage. When you want to work on a file, either through an stop or double clicking, out would auto-magically pull down the whole file. See more here http://gcoupe.wordpress.com/2014/11/13/build-9879-of-windows-10-has-removed-smart-files/

In the latest build of the Windows 10 Tech Preview this feature had been removed. What’s refreshing about the new Microsoft is that we can vote to get it back. Go add your vote here. https://windows.uservoice.com/forums/265757-windows-feature-suggestions/suggestions/6708195-add-an-advanced-option-to-restore-showing-all-oned

You can also enjoy the passionate feedback from users.

Why I’m strongly considering temporarily moving to an iPhone till Windows Phone catches up

Why I’m strongly considering temporarily moving to an iPhone till Windows Phone catches up: Just got an email that my work phone has been moved to Jabber. Cisco says Jabber can be used from any device, they have iOS and Android apps but nothing for Windows Phone. Long story short the fault lies with Windows Phone.

This was posted in the forum last month by a Cisco rep: ‘Hi Brian, The open sockets we need to have running in the background are currently not supported by Windows Phone 8.1. The Windows Phone development group has been discussing with us to ensure that they can support Jabber architecture in the Threshold release.’

https://communities.cisco.com/thread/31390?start=15&tstart=0

The Xbox Music app is the bane of my existence. I am an Xbox music subscriber and it is absolutely pathetic for a native app. This article (dated yesterday) and the comments thread sums it all up. http://wmpoweruser.com/xbox-music-still-sucks-and-thats-a-sh…

And then you see benchmarks like this http://www.anandtech.com/show/8666/the-apple-ipad-air-2-revi… (also http://blog.codinghorror.com/the-tablet-turning-point/) with the iPhone 6 & iPad Air beating out all other devices, providing a superior app store selection.

Even the new the Microsoft Office app that Microsoft released for iOS is much better at rendering and more feature rich than the native Office apps in Windows Phone (which have been native and haven’t been update since WP 7,0).

Script to Download Yammer Image Profile

Here’s a neat script I wrote the other day to download the urls of all the user’s in your Yammer network. This comes in handy when you want to re-use the profile images that users have uploaded to Yammer.

The advantage with this script is that you don’t need the app to be approved by your Yammer admin. Just create a user created app on Yammer, create a token and approve it for your profile. That’s it. The token can be re-used as long as necessary.

Here’s the PowerShell script that will get you there.

<#
.SYNOPSIS
	This script downloads the profile image urls of all the users from Yammer, creates a csv file and uploads it to the YammerProfile document library.
	Example> 	.\Download-YammerProfile.ps1 -YammerToken 05fdIb1pNwIFEBg9k34EWw -SiteUrl http://mysharepoint/site
#>
param(
	[Parameter(Mandatory = $True, HelpMessage='Yammer Access Token - Refer to https://developer.yammer.com/authentication/ for how to generate an access token. Eg. 05fdIb1pNwIFEBg9k34EWw')]
	[string]$YammerToken,
	[Parameter(Mandatory = $True, HelpMessage='The url of the site that will store the Yammer user profile list. E.g. http://mysharepoint/site')]
	[string]$SiteUrl
)

Function Main() {
	$documentLibrary = "YammerProfiles"
	$csvFile = "YammerProfiles.csv"
	
	CreateEventLogSource "MePage"
	Log "Starting Download-YammerProfile.ps1"
	try {
		$spWeb = Get-SPWeb -Identity $SiteUrl
		CreateSharePointLibrary $spWeb $documentLibrary  "Downloaded cache of Yammer profile image urls" "DocumentLibrary"
		CreateYammerProfileCsv $YammerToken $csvFile
		$spWeb = Get-SPWeb -Identity $SiteUrl #Refresh reference to avoid timeout issue when it takes a long time to download from Yammer
		UploadToSharePoint $csvFile $spWeb $documentLibrary
		
		Log "Download-YammerProfile.ps1 completed succesfully"
	}
	catch {
		[string]$errDetail = $_.ToString()
		LogError "Error occured: $errDetail"
		Write-Error $_
	}
}

Function CreateYammerProfileCsv($token, $csvFile){
	$page = 0
	$userCount = 0
	if (Test-Path $csvFile){ Remove-Item $csvFile }
	do {
		$page++		
		$users = GetYammerUsers $token $page
		$userCount = $users.Length
		Log "Downloading Yammer Profiles Page: $page Users: $userCount"
		for($i = 1; $i -lt $users.Length; $i++) {
			$user = $users[$i];			
			if($user.mugshot_url_template.EndsWith("no_photo.png")) { continue } #Only store valid photos			
			for($e = 0; $e -lt $user.contact.email_addresses.Length; $e++) {				
				$email = $user.contact.email_addresses[$e];
				if($email.type -eq "primary"){ #We're only interested in the telstra.com email addresses	
					$output = $email.address.ToLowerInvariant() + "," + $user.mugshot_url_template
					Write-Host $user.mugshot_url_template $email.address
					Add-Content $csvFile $output
				}
			}
		}
		Start-Sleep -s 2 #Sleep for two seconds so we don't go over Yammer's rate count of 10 req / 10 sec
	}
	while ($userCount -gt 0) # -and $page -eq 1)
}

Function UploadToSharePoint($fileName, $spWeb, $documentLibraryName) {
	Log "Uploading $fileName to $spWeb/$documentLibraryName"
	#Read the contents into a memory stream to prevent the file getting locked
	[byte[]]$byteArray = Get-Content -encoding byte -path $fileName	
	[void][reflection.assembly]::LoadWithPartialName("System.IO")
	$stream = [System.IO.MemoryStream]$byteArray

	$spDoc = $spWeb.GetFolder($documentLibraryName)
	$spFile = $spDoc.Files.Add($fileName, $stream, $true)
}

Function CreateSharePointLibrary ($Web, $LibraryName, $Description, $LibraryTemplate) {  
	$spListCollection = $spWeb.Lists   
	$spLibrary=$spWeb.Lists.TryGetList($LibraryName)
	if($spLibrary -eq $null) {
		Log -f Yellow "$LibraryName document library does not exist. Creating..."
		$spListCollection.Add($LibraryName, $Description, $LibraryTemplate)
	}
}

Function LoadPSSnapIn {
	$snapin = Get-PSSnapin | Where-Object {$_.Name -eq 'Microsoft.SharePoint.Powershell'}
	if ($snapin -eq $null) {
		Write-Host "Loading SharePoint Powershell Snapin"
		Add-PSSnapin "Microsoft.SharePoint.Powershell"
	}
}

Function ConvertToJson($jsonString) {
	[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
	$ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
	return $ser.DeserializeObject($jsonString)
}

Function GetYammerUsers($token, $pageNumber) {
	$users = InvokeYammerGetRequest $token "users.json?page=$pageNumber"
	return $users
}

Function InvokeYammerGetRequest($token, $target) { 
	# Setup the request
	$yammerApiUrl = "https://www.yammer.com/api/v1/"
	$requestUrl = $yammerApiUrl + $target
	$webRequest = [System.Net.WebRequest]::Create($requestUrl)
	$webRequest.Method = "GET"
	$webRequest.Headers.Add("Authorization", "Bearer $token")

	# Execute the request
	[System.Net.WebResponse]$resp = $webRequest.GetResponse()
	$reqstream = $resp.GetResponseStream()
	$sr = new-object System.IO.StreamReader $reqstream
	$obj = ConvertToJson $sr.ReadToEnd()
	return $obj
}

Function CreateEventLogSource($sourceName) {			
	try {
		if(![System.Diagnostics.Eventlog]::SourceExists($sourceName))
		{
			Write-Host "Creating event log source $sourceName"
			New-Eventlog -LogName "Application" -Source $sourceName
		}
	}
	catch {
		Write-Host "Error creating event log source $sourceName"			
		Write-Host $_
	}
}

Function Log($message) {
	Write-Host $message
	WriteEventLog $message $false
}

Function LogError($message) {	
	WriteEventLog $message $true    
}

Function WriteEventLog($message, $isError) {
	try {
		if($isError) {
			Write-EventLog -logname Application -source MePage -eventid 4002 -EntryType Error -Message $message
		}
		else {
			Write-EventLog -logname Application -source MePage -eventid 4001 -EntryType Information -Message $message
		}
	}
	catch { #We don't want the script to error out because it couldn't write to event log		
		Write-Host "Error writing message to eventlog. Message = $message"
		Write-Host $_
	}
}

$ErrorActionPreference = "stop"
LoadPSSnapIn
return Main