Replatforming Guide: Pros, Cons, and Impact
2 years ago
Thoughts on technology, gadgets and whatever else I feel like sharing with the world.
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.
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.
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 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();
}
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 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();
}
}
<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>
Roles.IsUserInRole("My Group")
<location path="RestrictedSubDirectory">
<system.web>
<authorization>
<allow roles="My Group"/>
<deny users="*" />
</authorization>
</system.web>
</location>
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.
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!
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.