Sunday, June 26, 2011

Moving to Wordpress

Though it hasn't been updated in a while, this blog is moving to slalomdev.wordpress.com, move your links!

Friday, July 17, 2009

How I Stay Organized

I've always been a very organized person.  Though my habits for staying organized change rather frequently.  In grade school I recall cycling through a single divided notebook to a pee-chee for every class to a notebook for every class and back again.  College was no different.  One year, small 5x7 notebooks, color coded for each class to easily be able to grab them out of my bag (yeah, I know, huge dork, it doesn't get any better…) to a meticulously organized binder with schedules I'd print out daily to manage my class and work schedules to spending way more money than I had on a Handspring Visor PDA (yeah, I was that guy and it was awesome).
In my post-college work life I'm no different.  What has changed is the amount of technology I can take advantage of.  Not too long ago I jumped on the Moleskine bandwagon, I think it lasted for a month, but I'm just not a paper (or writing) person.  For one, my handwriting is horrible not to mention slow.  The time it takes for me to write something that I will later not be able to read is not worth it.  Going to school in the 90's and being subjected to keyboarding classes not once, not twice, but three times made me an excellent typist with 5th grade level handwriting.
So here are the current methods I follow and tools I use to stay organized.
Inbox as a To Do List
One thing that has been true since I first got email is that I've always use my inbox as a to do list.  If something is in my inbox then it requires some action, otherwise it gets deleted or archived.  It's not anymore complicated than that.
Multiple Calendars
Separating items between different color coded calendars works well for me.  At the core I have a personal calendar, my work calendar and a calendar that has reoccurring events for when my various bills are due.  Beyond that I'm a big fan of subscribing to calendar feeds such as my TripIt calendar (more on that in a moment), birthdays and US holidays.
Things
I've tried a lot of different to do list applications.  Lately I've settled on Things.  The combination desktop application and iPhone application are worth the initial cost.  They key is to to get in the habit of using it.  I try to get every item down throughout the day and there is nothing more rewarding than checking things off.
Evernote
Evernote is a tool that I really like, and yet still find that I am not using it nearly as much as I should be.  My note taking habits are actually not very good.  I'm super OCD about tracking to do items, but general notes from meetings tend to be pretty light.  I'm currently trying to remedy this and Evernote is the tool that seems to fit my needs the best.
TripIt
Last, but not least, I have been traveling quite a bit in the last couple of years.  TripIt has become and invaluable tool for keeping track of my upcoming trips and the details for those trips (i.e. flight times, hotel reservations).  Being able to subscribe to my trip items in iCal and being able to see them mixed in with other items on my calendars saves me a lot of scheduling hassle.
I think the key components to each of these tools or methods is that they are all completely in sync with my iPhone.  A system that I can maintain while I'm away from my computer is critical for me.

Monday, June 29, 2009

Our First AppStore App

Last week our client SonoSite launched their new iPhone application into the AppStore.  SonoSite makes portable ultrasound machines.  The application we built for them provides instructional video content for general ultrasound procedures as well as a host of other supporting information.  Check out the app at http://www.sonosite.com/products/sonoaccess/.

Monday, June 1, 2009

WWDC 2009

I will be attending Apple's World Wide Developer Conference again this year.  Last year Steve Jobs announced the iPhone 3G at the keynote, I'm looking forward to seeing what they have in store for us this time.  WWDC is a pretty good event for developers.  I look forward to digging into some of the iPhone SDK 3.0 features that I have not yet had a chance to dig into.  The developer NDA doesn't allow me to talk about 3.0 here, so for now I'll just say that it looks like its going to be a pretty significant update.

Tuesday, April 28, 2009

Social Media Overload

I'm starting to become overwhelmed with all the social media sites. I resisted Twitter for a long time, but I caved yesterday. For the most part I've been pretty good about keeping it simple. I killed my MySpace account years ago and have pretty much only used Facebook for keeping connected with folks I don't see on a daily basis.
There is a big push now to find a use for these tools in the enterprise. Can Twitter really be a viable business tool? There are certainly some cases of it working, Zappos and Alaska Airlines to name a couple. Though I feel those users were not born out of trying to jump on the bandwagon, but rather seeing an opportunity to communicate better with customers.
I guess to me, it boils down to each individual case. Customers are smart, if you aren't trying to communicate with them in a genuine manor they will know and respond in kind.

Monday, March 30, 2009

Using the Cloud

Over the years I've started countless projects by myself or with friends that have never been fully realized.  I'm still waiting for that one great idea that really drives me to create something from nothing.  In the mean time I am pretty happy bringing other people's ideas to light, most of the time.

Without giving away too much detail, one of my current client projects is a pretty cool combination of technologies.  We are building an iPhone application with Amazon Web Services back-end.  As we've been building this it has occurred to me how many of my ideas in the past died because we would get bogged down in the details about where and how we were going to host it rather than just building it.

It's thrilling to see all these cloud computing services springing up that really level the playing field for anyone with an idea to deploy, and more importantly scale if they find success.

I still don't have that one great idea, but I feel like the roadblocks that existed in years past have lessened.

Friday, February 6, 2009

Once-A-Month Blog Challenge

You might recall the Once-A-Week Blog Challenge that Joel and I started last year. Well, the wheels kinda fell off that wagon, but never fear, we have a new challenge, but this time we are lowering our expectations. We are both committing to getting at least once post up a month! Here is mine for February.

My Top 5 iPhone Applications Redux

Back in july I posted about my top 5 iPhone applications.  I figure it's been about 6 months and it would be a good time to revisit this topic as my top 5 have since changed.  So in no particular order, here they are...


I managed to pick this app up when it was initially released for free, now it runs $2.99, but I would still pay for it. Zenbe is a pretty straight forward list tracking app that allows you to create multiple lists, assign due dates and organize your items. It has the added bonus of having a pretty decent web front end that stays in sync at lists.zenbe.com


I continue to find Yelp very useful when looking for new restaurants and bars, the iPhone app is a nice compliment to the website.


I am pretty much addicted to iPhone solitaire, this version is great. They have a free version as well, but I think its worth the price for the added game variations you get.


I kinda hate to admit it, but I check Facebook on my phone way more than I probably need to be.


Mint is a great tool for tacking your expenses and investments, the iPhone application makes it even more useful.


Honorable Mentions...


I still thing Evernote is a great tool, I just don't use is at much as I should.


Shazam is one of the most clever apps I've seen. It has been able to identify songs in some pretty poor audio situations.


GasBag crashes way more than a public application should, but I do like the MPG tracking component of the application.


Remote is still a great app for controlling your music from anywhere in your house, even if your house is really only about 750 sq. feet.

Wednesday, October 15, 2008

Connecting to iPhone Applications via Peer-To-Peer Networking

I recently found myself wanting to copy some documents to the AirSharing application on my iPhone but I was not able to connect to a Wi-Fi network at the time.

As it turns out, this is really easy to do using peer-to-peer wireless networking, enabling applications like AirSharing or the Apple Remote to connect to your machine regardless of if there is an available wireless network.

Note: This can be done on Windows as well, however, I will only be covering the process on a Mac.
  1. First you need to create a new network on your Mac by selecting your AirPort menu item and choosing "Create Network...".

  2. Choose a name for your network, and optionally require a password (I would suggest adding a password to restrict access to your machine).

  3. On your iPhone, tap Setttings then Wi-Fi.

  4. Your phone should find the network you just created, tap it and enter your password if you chose to set one up.

  5. Now open AirSharing.

  6. Back on your Mac, from the Finder menu, select "Connect to Server..." (this can also be opened by pressing Command+K on your keyboard).

  7. Enter the address specified by AirSharing for connecting and click "Connect".

  8. A finder window will open with the AirSharing share and a mounted disk will appear on your desktop.

As I mentioned above, this tip is not limited to the AirSharing application.  Any iPhone application that uses wireless connectivity to interface with your machine, such as the Apple Remote, should work with this method.

Friday, August 15, 2008

Active Directory Role Provider


I've been using the ActiveDirectoryMembershipProvider to allow my users to login to a custom ASP.Net site with their AD credentials and it is pretty straight forward. Recently I needed to add more granularity to who can view various parts of the site. I wanted to take advantage of our existing AD groups so I assumed there would be something like an ActiveDirectoryRoleProvider as well. After a little searching, it became clear that wasn't the case, so I decided to roll my own.

Creating a custom role provider is pretty easy, all you have to do is create a new class and inherit RoleProvider:


public class ActiveDirectoryRoleProvider : RoleProvider
{}


You will have to create stubs for all the inherited members. We only need to implement a couple of them to get basic role membership checking. We need to get our AD configuration information out of the Web.Config values, so we'll create a few properties and override the Initialize method:



private string ConnectionStringName { get; set; }
private string ConnectionUsername { get; set; }
private string ConnectionPassword { get; set; }
private string AttributeMapUsername { get; set; }

public override void Initialize(string name, NameValueCollection config)
{
ConnectionStringName = config["connectionStringName"];
ConnectionUsername = config["connectionUsername"];
ConnectionPassword = config["connectionPassword"];
AttributeMapUsername = config["attributeMapUsername"];

base.Initialize(name, config);
}


Now we'll override GetRolesForUser which is the bulk of our implementation. We use the DirectorySearcher class in System.DirectoryServices to query AD for the passed username. We then pull the memberOf property from that user and extract the CN component for each entry as the role:



public override string[] GetRolesForUser(string username)
{
var allRoles = new List<string>();

var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString, ConnectionUsername, ConnectionPassword);

var searcher = new DirectorySearcher(root, string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)({0}={1}))", AttributeMapUsername, username));
searcher.PropertiesToLoad.Add("memberOf");

SearchResult result = searcher.FindOne();

if (result != null && !string.IsNullOrEmpty(result.Path))
{
DirectoryEntry user = result.GetDirectoryEntry();

PropertyValueCollection groups = user.Properties["memberOf"];

foreach (string path in groups)
{
string[] parts = path.Split(',');

if (parts.Length > 0)
{
foreach (string part in parts)
{
string[] p = part.Split('=');

if (p[0].Equals("cn", StringComparison.OrdinalIgnoreCase))
{
allRoles.Add(p[1]);
}
}
}
}
}

return allRoles.ToArray();
}


And finally we need to override IsUserInRole so we can easily check for role membership in code:



public override bool IsUserInRole(string username, string roleName)
{
string[] roles = GetRolesForUser(username);

foreach (string role in roles)
{
if (role.Equals(roleName, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}

return false;
}


Here's the the full code (minus the unimplemented inherited methods):



public class ActiveDirectoryRoleProvider : RoleProvider
{
private string ConnectionStringName { get; set; }
private string ConnectionUsername { get; set; }
private string ConnectionPassword { get; set; }
private string AttributeMapUsername { get; set; }

public override void Initialize(string name, NameValueCollection config)
{
ConnectionStringName = config["connectionStringName"];
ConnectionUsername = config["connectionUsername"];
ConnectionPassword = config["connectionPassword"];
AttributeMapUsername = config["attributeMapUsername"];

base.Initialize(name, config);
}

public override bool IsUserInRole(string username, string roleName)
{
string[] roles = GetRolesForUser(username);

foreach (string role in roles)
{
if (role.Equals(roleName, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}

return false;
}

public override string[] GetRolesForUser(string username)
{
var allRoles = new List<string>();

var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString, ConnectionUsername, ConnectionPassword);

var searcher = new DirectorySearcher(root, string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)({0}={1}))", AttributeMapUsername, username));
searcher.PropertiesToLoad.Add("memberOf");

SearchResult result = searcher.FindOne();

if (result != null && !string.IsNullOrEmpty(result.Path))
{
DirectoryEntry user = result.GetDirectoryEntry();

PropertyValueCollection groups = user.Properties["memberOf"];

foreach (string path in groups)
{
string[] parts = path.Split(',');

if (parts.Length > 0)
{
foreach (string part in parts)
{
string[] p = part.Split('=');

if (p[0].Equals("cn", StringComparison.OrdinalIgnoreCase))
{
allRoles.Add(p[1]);
}
}
}
}
}

return allRoles.ToArray();
}
}


Add the role provider to your Web.Config:



<system.web>
<roleManager enabled="true" defaultProvider="ADRoleProvider" cacheRolesInCookie="true" cookieName=".ASPXROLES" cookiePath="/"
cookieTimeout="30" cookieRequireSSL="false" cookieSlidingExpiration="true" createPersistentCookie="false" cookieProtection="All">
<providers>
<clear />
<add name="ActiveDirectoryRoleProvider" connectionStringName="ADConnectionString" connectionUsername="username"
connectionPassword="password" attributeMapUsername="sAMAccountName" type="ActiveDirectoryRoleProvider" />
</providers>
</roleManager>
</system.web>


You can then check the roles of your user in code like so:



Roles.IsUserInRole("My Group")


Or control access to entire directories via the Web.Config:



<location path="RestrictedSubDirectory">
<system.web>
<authorization>
<allow roles="My Group"/>
<deny users="*" />
</authorization>
</system.web>
</location>

Tuesday, July 29, 2008

My Fancy New 3G Wireless Card

Lately I have been finding myself in more and more situations where I am giving a presentation and I need wireless connectivity and it isn't readily available.  Yesterday I finally broke down and picked up a USBConnect 881 card from AT&T, and so far, I like it.  For about $60 a month the cost isn't too bad for what you are getting, and in using it last night, the 3G speeds were pretty good for doing what I needed to do.  I orginally wanted to go with an Express PCI card for my Mac, but opted for the USB card for more flexibility.

Saturday, July 19, 2008

My Top 5 iPhone Applications

So of course I picked up a shiny new iPhone 3G on launch day.  I was lucky to be in Hillsboro Oregon at the time which meant my line was not too long and I got to take advantage of no sales tax.  It's been a while since I've posted (I'm going to correct that in the next few weeks), so I thought I'd do a round-up of my top 5 favorite 3rd party applications.  In no particular order here they are...

This is Apple's fantastic iTunes remote.  I don't have an Apple TV yet, but I have been playing with this with my iTunes library on my laptop and it works flawlessly.  I can't wait to get my condo all setup so I can take full advantage of this tool.

This has to be one of the less polished games in the iTunes store, but it is addicting. The basic goal is to fly your little ship through a minefield of cubes, if you hit a cube, you die. You pretty much just compete against yourself for high score. The game could use stages, so you don't just end up playing the same first level over and over again, but short of that, it is an awesome first showing for a casual game.

Evernote is a great desktop tool for knowledge capture.  It works on Mac and Windows, and with their latest release they have included an iPhone client.  This comes in handy so often in my life when I have meetings where lots of white boarding occurs.  All I have to do is open Evernote and take a picture of the whiteboard and the image is automatically synced with my laptop.  On top of that, Evernote has fantastic OCR technology allowing you to then search all of your content, even my aweful whiteboard chicken scratch gets properly indexed.

I always have a terrible time picking a restaurant when it comes time to go out to eat.  This tool solves that problem in a fun way.  Using location based services, Urbanspoon will zero in on your city.  You then lock in your options, be it neighborhood, cuisine or price.  Then simply shake your phone and Urbanspoon will randomly pick a place for you, if you don't like it, shake it again!

Tie: Pandora and Last.fm
Both of these applications do very similar things. Based on the same technologies of their respective web sites, you can get a customized radio station based on your music tastes. Pandora is based on the Music Genome Project, which uses a more scientific approach to matching tunes. Last.fm relies on social networks and listening patterns to do something very similar. I am a Last.fm user, so I like this app for that reason, however, I believe Pandora streams much more reliably with less waiting for buffering.

Monday, June 9, 2008

WWDC 2008 Keynote

I got to attend the Apple Worldwide Developers Conference 2008 keynote this morning, it was a lot of fun. Luckily for me I didn't have to get there at 6am like my colleges who held a spot for me. I got to see Steve Balmer speak at Mix '08 back in March, he was good, but doesn't hold a candle to watching Mr. Jobs.

On the left is a picture I took from line, so may nerds, myself included.

Sunday, June 1, 2008

TripIt - One of My Favorite Tools

I tend to fly fairly often (at least once a month). I have been using TripIt for a few months now and I'm a big fan. TripIt helps you track your travels very easily. All you do is forward your email confirmations for your flights, hotels or rental cars and TripIt will consume the information and keep all your travel information in one handy place. That combined with the ability to subscribe to your trip details via an iCal feed, as well as a new mobile site that looks great on the iPhone, make it a great tool for any frequent traveler.

Monday, May 19, 2008

ReSharper 4.0 Nightly Build Finally Stable?

My all time favorite add-on for Visual Studio, ReSharper, has finally marked one of their nightly builds for the upcoming 4.0 version as "Stable". This is good news since 4.0 brings support for Visual Studio 2008 and the new .Net 3.5 language features such as LINQ, Extension Methods and Automatic Properties. ReSharper has become a tool that I find hard to live without and I have been using the nightly builds for the last couple months. For the most part they have been good but I'm hoping this means they will have a final release soon, originally they promised the release to be in mid-Februrary.

[UPDATE]: Looks like they have finally launched the beta for 4.0, get it here.

[UPDATE 6/26/2008]: Hooray, the final version was released last week, get it here.

Sunday, May 4, 2008

Maker Faire 2008

Today I attended the Bay Area Maker Faire 2008. Over all it was an entertaining trip, except for the hour we sat on the onramp to get to the fairgrounds. I got to see Adam Savage of the Mythbusters speak, as well as enjoy a couple rounds of Battle Bots. And for your viewing pleasure, here are some Battle Bot videos taken with my new Flip Video camera.



Tuesday, April 29, 2008

New Date and Time Data Types in SQL Server 2008

I am delinquent in the one-a-week challenge post for last week, and on top of that this is going to be a pretty lazy one, as I'm just going to refer to a good article I just found.

My current client has taken to early adopting the latest SQL Server 2008 CTP. One of my favorite new features are the enhanced date and time data types. Dinesh Asanka has a good summary of these new types over at SQL Server Performance and you should really just go check out his article.

My favorite additions are the DATE and TIME data types, how many times have you wanted to just specify a date or time portion of a value and had to do some sort of crazy truncation or logic in code to keep it straight? Well no longer.

Another great addition is the DATETIME2 data type, though its not going to win any awards for clever naming, the gist of it is that you now can specify the millisecond resolution of your DATETIME, previously it was defaulted to 3 decimal places, now you can specify from 0 to 7.

Sunday, April 20, 2008

TFS Blog Series: Setting Up Projects

Welcome to the second entry in Joel and my series on Microsoft Teams System (aka Team Foundation Server, aka TFS). To catch up, check out the previous entries in the series:
  1. Overview
In this post I'm going to cover the details of creating a new team project including the intricacies of setting up project permissions and permissions for the corresponding SharePoint and Reporting Services.

Creating a New Project

Creating a new project in TFS is pretty straight forward and involves the following steps:
  1. Launch Team Explorer (Visual Studio).
  2. In the Team Explorer toolbox, right click on your server name and choose "New Team Project...".
  3. In the wizard, give your project a proper name and description. You can name a project anything you want, but you should give some thought to this before committing to something because you cannot change this once the project is created. If you work in an organization like ours where you have many projects, a consistent naming convention is important. We use {ClientName}.{ProjectName}, so for this test I will create a project called Slalom.Test, Slalom because it is an internal project so we are our own client and Test because I'm just going to delete this thing when I'm done.

  4. Choose a project template. TFS comes with two built in, however you can create your own custom templates as well, allowing you to have some pre-canned work items generated for every project you create. We'll talk about template customization later in the series, for now we will just choose Agile.

  5. Choose where you want your source control, by default TFS builds out a new repository, in most cases this is what you will want to do.
  6. Once you click finish and let TFS build out your project you will have a new project listed in Team Explorer.

Setting Project Permissions

TFS allows you apply roles to your different users, these roles can be adjusted by right clicking on your team project and choosing "Team Project Settings > Group Membership..."





For a project, there are four groups available for classifying your users rights:
  1. Readers - Users that can access the project, but are not able to modify work items or check in code.
  2. Project Administrators - Users that can do anything within the project.
  3. Contributers - Users that can make changes in the project but are now allowed administrative tasks.
  4. Build Services - System role for building the project (for service accounts only).
Most people generally fall under project administrators or contributors.

Setting SharePoint and Reporting Services Permissions

Unfortunately setting permissions within TFS does not complete the process. Permissions must also be granted individually to the corresponding SharePoint site and SQL Server Reporting Services.

For SSRS permissions, we have simplified this by creating a Team Foundation Server Users domain group and putting all valid TFS users into that group, then giving that group read permission on the reporting server. This saves us from having to set these permissions each time.

For SharePoint we still must grant users proper access, do this follow these steps:
  1. Access your project portal (right click on your project and choose "Show Project Portal...") as an administrator.
  2. Choose "Site Settings" from the "Site Actions" drop down on the site.
  3. Choose "Advanced Permissions" from "Users and Permissions".
  4. Choose "New" to add your users and give them specific SharePoint permissions.



Sunday, April 13, 2008

Bad Dog

Well, this post is a little bit of a cop-out, but I'm still counting it for the "one a week" challenge. Next week I will get part two of Joel and my series on TFS out.

My mom called me this morning, she was upset because her dog jumped up and grabbed her iPhone off the kitchen counter in the middle of the night, and pretty much destroyed it. It will power on, but the screen is completely white. When I plugged it in, it did sync, so we were able to get her a new one and restore from the backup. Check out the photos below:







Tuesday, April 1, 2008

My First "Valley" Event

Well as a follow-up to my last post about how Seattle compares to The Valley last night I attended my first "Valley" event. A friend of mine that works for a PR firm down here told me about Mozilla's 10 year anniversary celebration that was going on last night. So I decided to check it out. It was pretty packed when I got there, but they had just made it open bar, so thanks Mozilla for the gin and tonics. There were a lot of .com folks chatting it up, a few folks that were clearly Mozilla contributors and a few valley celebrities (or so I'm told, I didn't really know who any of them were). At one point Mitchell Baker (I think) and Brendan Eich got up and thanked everyone and said some words that most of us couldn't hear. All-in-all it was an interesting experience and I hope to find my way into more of these things.

UPDATE: Here is proof that I was there, or at least that the back of my head was: http://valleywag.com/photogallery/mozilla10/1001073788