Thursday, 27 November 2014

Conflict Resolution Template

I recently had to deal with conflict within a team I was leading as a Scrum Master.

I wrote the below as a framework for the team to work together to resolving their problems, while remaining independent of interference from Senior Managers.


Hi all,

As an outcome of what was raised in our sprint retrospective, I’d like to facilitate (with x’s help) a meeting with the necessary people to help the team work together in a way that gets work done quickly, and more importantly makes each team member feel valued and respected.

I know that there are frustrations within the team, and I’m glad that some of these have been raised so that we can work to improve as a team. I feel the best way for this to happen is to have an open, honest and respectful discussion together, face to face.

I’m proposing the following as a framework for this meeting – if there’s anything you think is wrong in here, please let me know and we can discuss /change what I’ve proposed.

·      This meeting will be a safe place to discuss the problems between team members
o   No notes will be taken of the details of the discussion – only of the outcomes to move the team forward
o   Once we’ve discussed what’s caused problems, we’ll leave it behind us and move past it
o   There will be no ‘reporting back’ to the Management Team. We can provide them with the outcomes we’ve reached.
·        It is for the team (and those in the room) to deal with these issues
o   Where we need help from others, we could feature this as part of our outcomes
·        The outcomes will be for us to find a way to work in future which will:
o   use all team member’s expertise
o   value each persons’ contribution
o   be respectful of each other
o   be efficient in collaboration
·       There will be clear boundaries of everyone’s roles within these outcomes
·          Everyone will get to have their say – and not be interrupted while they’re doing so

I would like to hear the following from each of the team members affected:
·          Explain the problems you’ve had with working together
·         What happened that you weren’t happy with
·        What you’d like to happen differently in future to improve things


Friday, 8 February 2013

How to use an Apple USB Ethernet Adapter to replace a broken ethernet port on a Mac

The iMac at my work has a problem with it's ethernet port - the cable will not stay plugged in and it can lead to the connection being lost. The ethernet port seems a common 'weak link' with Apple hardware.

We bought a Apple USB Ethernet Adapter (MC704ZM/A), to replace it.

Setting this up was not straightforward, for starters they do not bundle the driver on Mountain Lion for the iMac!

Luckily I've got a Mac Mini at home, so I could copy the driver from there.

The steps you should take are:

  • Find/Download AppleUSBEthernet.kext file (will be within IONetworkingFamily.kext - full path to this is below)
  • In Finder open System > Library > Extensions
  • (To open a .kext file, right click > Show Package Contents)
  • Open /System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/
  • Copy AppleUSBEthernet.kext into the folder IONetworkingFamily.kext/Contents/PlugIns/
  • You will be prompted for your administrator password.
  • Open Applications > Utilities > Disk Utility. Then "Repair file permissions"
  • Open Applications > Utilities > Terminal. Run the following command
sudo kextload /System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleUSBEthernet.kext



  • You will be prompted for your administrator password.
  • Open Applications > System Preferences > Network. You should now have 'USB Ethernet' as a connection on the left hand side. If not you can add it with the + at the bottom of the left pane.
  • You may find as I did that once plugged in your USB Ethernet will show as connected, but you won't be able to use the internet. If this happens, use the Assist Me > Assistant within Network and it should fix it for you.
All being well, you should have replaced your temperamental physical Ethernet port with a USB one.

(Update) This solution does not work after you have restarted your mac.
You need to run


sudo kextload /System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/AppleUSBEthernet.kext

again to load the driver.

I have set up a Unix executable which runs this command on startup. System Preferences > Users and Groups > Login Items. This is far from ideal, as the user is prompted for their password to run this.

Luckily we don't restart the Mac very often, but I will search for a more elegant solution.

Any Mac experts out there who know how to load this driver on startup in a more elegant way, please let me know!

Monday, 10 December 2012

Android - Disabling enter key press for a text editor

//A bug where hitting enter after entering text in a EditText box would clear the box
//the code below prevents this
//disable enter key press
EditText txtEdit = (EditText)view.findViewById(R.id.text_input);
txtEdit.setOnEditorActionListener(new OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
InputMethodManager in = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
in.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
return true;
}
return false;
}
});

Wednesday, 31 October 2012

Disabling dates in JQueryUI Datepicker - hooked up to an MVC 3 controller action to provide dates.

//method in controller to return list of dates.
public ActionResult GetDisabledDates(string id) {
//get list of dates separated by comma ...
return Json(new {disabledDatesArray = result }, JsonRequestBehavior.AllowGet);
}

$(document).ready(function () {
 //Call GetDisabledDates in the controller, passing id
 $.getJSON("GetDisabledDates", { id: "identifier" },
 function(data) {
 //write date values to hidden field for retrieval later.
 //and to ensure we only have to call server side method once. $('#hiddenDates').val(data.disabledDatesArray); });

 function IsDateAvailable(date) {
 //we have to pad the date, to ensure we can compare with the dates we retrieve from serverside.
 var dmy = padDate(date.getDate()) + "/" + padDate(date.getMonth()+1) + "/" + date.getFullYear();
 //remove dates in array from datepicker. if (IsDateInUnavailableList(dmy)) {
 //date exists in list of those not allowed. return [false,"","Unavailable"]; } else { return [true,"","Available"]; } }

 //pad out dates to allow comparison, 1/1/2012 will become 01/01/2012
 function padDate(i) { return (i < 10) ? "0" + i : "" + i; }
 //define datepicker
$("#datepicker").datepicker({ dateFormat: 'dd/mm/yy', minDate: 0, beforeShowDay: IsDateAvailable });
EnableOrDisableSaveButton();


$("#datepicker").change(function () {
            EnableOrDisableSaveButton();
        });



 function IsDateInUnavailableList(date) {
 var dateValues = $("#hiddenDates").val();
 //convert back into an array.
 var dateArray = dateValues.split(",");
 //check date against dates in array
 if ($.inArray(date, dateArray) < 0) { return false; } else { return true; } }

 // Function to enable or Disable the Save Button
 function EnableOrDisableSaveButton() {

 var date = $('#datepicker').val();
 // Now enable the button if the above two values or not empty
 if (date != "") {
 //prevent save button click if date selected in list of disallowed dates.
 if (IsDateInUnavailableList(date)) { $("#Save").attr("disabled", true); }
 else {
 $("#Save").attr("disabled", false); } }
 else {
 $("#Save").attr("disabled", true); } }

 //hidden field to store date values.
<input id="hiddenDates" name="hiddenDates" style="display: none;" />

//datepicker
@Html.TextBoxFor(m => m.Date, new { id = "datepicker", @maxlength = 10, style = "width:65px" })

<input id="Save" title="Click here to save" type="submit" value="Save" />

Tuesday, 12 October 2010

Intellisense.

Intellisense in visual studio decided to turn itself off for my project.

The following blog post tells you how to fix it...

Intellisense not working in Visual Studio...
"IntelliSense is Microsoft's implementation of autocompletion, best known for its use in the Microsoft Visual Studio integrated development environment. In addition to completing the symbol names the programmer is typing, IntelliSense serves as documentation and disambiguation for variable names, functions and methods using metadata-based reflection." (Wikipedia)
So, I can't quite remember when exactly Intellisense stopped working for me in Visual Studio 2008, but I know I have been without (automatic) Intellisense for quite a while.When typing a dot after an object or method, it used to just show up automatically... I could however have it come up by pressing and eventually got in the habit of just doing that when I needed it, without attempting to find out exactly why it was broken in the first place...
So, several months later, I stumble upon an entry by Richard Fennell, who explains how to fix it. I thought I'd post it for when it breaks again, I know where to find the answer...

In Visual Studio 2008, select Tools > Options > Text Editor > All Languages. Ensure that the checkboxes in the Statement Completion section are actively checked (not grayed out).
That is it!. Click Ok and try it.

By Miguel Moreno
http://miguelmoreno.net/post/Intellisense-not-working-in-Visual-Studio.aspx

Wednesday, 6 October 2010

Image Copyright. C#

I needed to write some code to prevent images being copied.
Although not ideal (user can still view source, or use PrintScreen), this at least makes it harder for users to copy images directly.

public static void PreventRightClickOnHtmlControl(HtmlControl htmlControl)
{
htmlControl.Attributes["onmousedown"] += "return false";
htmlControl.Attributes["onclick"] += "return false";
htmlControl.Attributes["oncontextmenu"] += "return false";
}

Page.ClientScript.RegisterClientScriptBlock(GetType(), "DisableImageDrag", "document.ondragstart = function () { return false; };", true);

Friday, 3 September 2010

Sharepoint

I have recently started developing webparts using Sharepoint 2007. Some *fun* things I have encountered along the way...

Styling in sharepoint was tricky, until I started using 960 Grid System

I wrote a method to take in either one or two controls, and a main div to hold them. Styles for the control divs can also be passed.

I then wrapped each control in a div, gave it the gs class it needed i.e. "grid_12" as well as any styles passed in.

Then I added these divs to a container div and returned this so it could be styled independently.

(Main Div Holds Container Div, which holds Control Divs.)

Links - Visual Studio Styles & Winmerge

http://studiostyles.info/

More visual studio styles. Like below....

Visual Studio, and SQL Server "High Contrast" Themes.

When developing, I like to use a high contrast theme as I think it's easier on the eyes.

There is a big list to choose from here...

http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx
I use Brad Wilson's theme.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


I recently found that you can export these setting from VS to SQL MS. The utility below helps, just ensure that the registry keys are entered correctly - the default is vs2005 to sql2005, but there is help in the comments for changing these to vs2008 or sql2008.



http://winterdom.com/2007/10/colorschemesinsql2005managementstudio

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

As the merge tool included with VS is the worst piece of software ever written, I would recommend that you do as I have done and upgrade to use winmerge, which makes the process of merging in changes a lot more painless!

Get Winmerge here
In Visual Studio do the following:

Click on Tools menu
Click on Options menu item
Expand Source Control tree item
Select Visual Studio Team Foundation Server tree item
Click on Configure User Tools... button
Comparing

To use WinMerge as the Compare/Diff tool:

Click the Add... button
For Extension, type *
For Operation, select Compare
For Command, browse for C:\Program Files\WinMerge\WinMerge.exe
For Arguments, type /x /e /ub /wl /dl %6 /dr %7 %1 %2
Click OK to accept
Merging

To use WinMerge as the Merge tool:

Click the Add... button
For Extension, type *
For Operation, select Merge
For Command, browse for C:\Program Files\WinMerge\WinMerge.exe
For Arguments, type /x /e /ub /wl /dl %6 /dr %7 %1 %2 %4
Click OK to accept

Info stolen from here:

http://www.neovolve.com/post/2007/06/19/using-winmerge-with-tfs.aspx

Monday, 19 July 2010

Impersonating Users - e.g. For Unit Tests

http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/

//---code below---

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;

namespace Tools.Network
{
public enum LogonType
{
LOGON32_LOGON_INTERACTIVE = 2,
LOGON32_LOGON_NETWORK = 3,
LOGON32_LOGON_BATCH = 4,
LOGON32_LOGON_SERVICE = 5,
LOGON32_LOGON_UNLOCK = 7,
LOGON32_LOGON_NETWORK_CLEARTEXT = 8, // Win2K or higher
LOGON32_LOGON_NEW_CREDENTIALS = 9 // Win2K or higher
};

public enum LogonProvider
{
LOGON32_PROVIDER_DEFAULT = 0,
LOGON32_PROVIDER_WINNT35 = 1,
LOGON32_PROVIDER_WINNT40 = 2,
LOGON32_PROVIDER_WINNT50 = 3
};

public enum ImpersonationLevel
{
SecurityAnonymous = 0,
SecurityIdentification = 1,
SecurityImpersonation = 2,
SecurityDelegation = 3
}

class Win32NativeMethods
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int LogonUser( string lpszUserName,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken( IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
}

///
/// Allows code to be executed under the security context of a specified user account.
///

///
///
/// Implements IDispose, so can be used via a using-directive or method calls;
/// ...
///
/// var imp = new Impersonator( "myUsername", "myDomainname", "myPassword" );
/// imp.UndoImpersonation();
///
/// ...
///
/// var imp = new Impersonator();
/// imp.Impersonate("myUsername", "myDomainname", "myPassword");
/// imp.UndoImpersonation();
///
/// ...
///
/// using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
/// {
/// ...
/// [code that executes under the new context]
/// ...
/// }
///
/// ...
///

public class Impersonator : IDisposable
{
private WindowsImpersonationContext _wic;

///
/// Begins impersonation with the given credentials, Logon type and Logon provider.
///

///
Name of the user.
///
Name of the domain.
///
The password.
///
Type of the logon.
///
The logon provider.
public Impersonator(string userName, string domainName, string password, LogonType logonType, LogonProvider logonProvider)
{
Impersonate(userName, domainName, password, logonType, logonProvider);
}

///
/// Begins impersonation with the given credentials.
///

///
Name of the user.
///
Name of the domain.
///
The password.
public Impersonator(string userName, string domainName, string password)
{
Impersonate(userName, domainName, password, LogonType.LOGON32_LOGON_INTERACTIVE, LogonProvider.LOGON32_PROVIDER_DEFAULT);
}

///
/// Initializes a new instance of the class.
///

public Impersonator()
{}

///
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
///

public void Dispose()
{
UndoImpersonation();
}

///
/// Impersonates the specified user account.
///

///
Name of the user.
///
Name of the domain.
///
The password.
public void Impersonate(string userName, string domainName, string password)
{
Impersonate(userName, domainName, password, LogonType.LOGON32_LOGON_INTERACTIVE, LogonProvider.LOGON32_PROVIDER_DEFAULT);
}

///
/// Impersonates the specified user account.
///

///
Name of the user.
///
Name of the domain.
///
The password.
///
Type of the logon.
///
The logon provider.
public void Impersonate(string userName, string domainName, string password, LogonType logonType, LogonProvider logonProvider)
{
UndoImpersonation();

IntPtr logonToken = IntPtr.Zero;
IntPtr logonTokenDuplicate = IntPtr.Zero;
try
{
// revert to the application pool identity, saving the identity of the current requestor
_wic = WindowsIdentity.Impersonate(IntPtr.Zero);

// do logon & impersonate
if (Win32NativeMethods.LogonUser(userName,
domainName,
password,
(int)logonType,
(int)logonProvider,
ref logonToken) != 0)
{
if (Win32NativeMethods.DuplicateToken(logonToken, (int)ImpersonationLevel.SecurityImpersonation, ref logonTokenDuplicate) != 0)
{
var wi = new WindowsIdentity(logonTokenDuplicate);
wi.Impersonate(); // discard the returned identity context (which is the context of the application pool)
}
else
throw new Win32Exception(Marshal.GetLastWin32Error());
}
else
throw new Win32Exception(Marshal.GetLastWin32Error());
}
finally
{
if (logonToken != IntPtr.Zero)
Win32NativeMethods.CloseHandle(logonToken);

if (logonTokenDuplicate != IntPtr.Zero)
Win32NativeMethods.CloseHandle(logonTokenDuplicate);
}
}

///
/// Stops impersonation.
///

private void UndoImpersonation()
{
// restore saved requestor identity
if (_wic != null)
_wic.Undo();
_wic = null;
}
}
}

Code Coverage. Signed Assembly.

(Exception from HRESULT: 0x8013141A) ---> System.Security.SecurityException: Strong name validation failed. (Exception from HRESULT: 0x8013141A)

I had a problem with code coverage on a singed assembly, and the link below helped me...

http://weblogs.asp.net/soever/archive/2005/07/23/420338.aspx

VS.NET 2005: Code coverage for signed assemblies I am currently working on an application using VS.NET 2005, and because all the TDD tools like unit testing and code coverage are available I started to use them.

When I started code coverage on my signed application I got the following exception:

Test method X threw exception: System.IO.FileLoadException: Could not load file or assembly 'Y, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Z' or one of its dependencies. HRESULT: 0x8013141A Strong name validation failed. ---> System.Security.SecurityException: Exception from HRESULT: 0x8013141A Strong name validation failed at X.

Not so strange if you think about it. Assembly is signed, code coverage needs code instrumentation, means modifications of the assembly, resulting in incorrect assembly so the validation failed.

Solution is to resign the assembly after instrumentation.

If you open the localtestrun.testrunconfig file (or something similar) in your solution items (double-click it), you can enable resigning in the Code Coverage section. This solves the problem.

Wednesday, 25 November 2009

First Post: Useful Links for me this week.

While testing a secure site in IE8, I noticed a problem in displaying Secure/Un-secure elements of the page. I was able to test this locally without having IE8 installed by using Browser Sandbox

Unit testing a class which contained private methods. I could not access them from the unit test class, without adding the following line to the assemblyinfo.cs file for the project being tested.

[assembly: InternalsVisibleTo("MyUnitTests")]

I also had to change the method declarations in this class to use internal instead of private. This information was gathered from this link