I hooked up the old VCR to the computer today and started going through some old tapes. This clip is from around 1991 and was part of a video that Marc and I created. Man those glasses were huuuugh!
Good luck to Chris and Dave as they depart at noon local time from Banff for the Great Divide Race! Dave is trying to be the first to finish on a fixed gear mountain bike and Chris is shooting to break the single speed record (22 days and 3hrs). Now most times when it comes to events like this I figure if I was focused and could dedicate the time to prepare, I’d have a shot. Not so much with the GDR. 2,490 miles and over 200,000 ft of climbing all self supported… this sort of thing ain’t my bag, baby.
You can follow Chris’ progress here and the coolest is you can track his near-live location!
Getting settled in the new house. I got out for a lunch time ride today. This is a view from the new trail at the Ryolite Park across from my house; Pikes Peak in the background. Beautiful day…
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
Twenty years ago, carving the bowl at the abandoned old Joppatown Skatepark (aka Edgewood) off Rt 40 in Maryland. Left over from the 1970’s, it was demolished less than a year later. Amazing memories at this place…
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
Moving day is four days away. I found several boxes of loose photographs in the basement. Exhibit #1: A day at Landsdown Skatepark outside of Baltimore, MD:
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
The last two weeks have been a blur. Yesterday I returned home from a trip back to the east coast with Jeanie and Ephraim. We set out to show Ephraim as much as we could shove into four days. Prior to our trip though I was in Memphis and before that I was ill and remodeling my sister in-laws bathroom.
The trip to Memphis was work related. I really liked the city, but my trip was tarnished by a lopsided standoff with a concrete pillar in a parking garage and my rental dodge caravan. Claim still pending…
On Wednesday there was a power outage at the Memphis International Airport that wreaked havoc on flight schedules. I arrived home with only a few hours to unpack, pack and return to the airport for a red-eye to Philly.
While in Philly we stayed with my brother Joe in Prospect Park, PA… basically South Philly with a pizza or sandwich shops every third store. All the Colorado “New York” pizza shops should be ashamed of themselved. Pizza in Philly was still only ~$8 for a large pie. Most Colorado shops are almost double that. We got 3 large pizzas with toppings for less that $30. The last time I got Pizza in Colorado I paid nearly $40 for 2 “large” pizzas with toppings. Can someone please explain this to me??
On Friday we headed to New York City and rendezvoused with my brother Tom who was kind enough to treat us to lunch in Manhattan a few blocks from Marvel “… the fashion district, home of the tiny over priced portion.”
The next day we headed to Washington DC where we hooked up with my other brother Ken who treated us to dinner at a Mexican tapas-like restaurant where Ken and Ephraim ordered grasshopper tacos. No joke, there was a big pile of grasshopper wrapped in a corn tortilla! Missed photo opportunity for sure. Here are some other pictures…
On Sunday we attended the grand opening of Cambridge Sound Studios of the Newtown Square, PA since Joe did a painting for the studio. Awesome party. Great food and they even had Mummer!
Monday we hit the Jersey Shore before heading to the airport. Ocean City:
The final meal of the trip was a chicken cheese steak. Amoroso role, fried peppers, onions, provolone and hot sauce.
It was a great trip, but a long two weeks. I haven’t been on my bike since the CCTT two weeks ago and before that was the CCTT the week before. Not good spring training campaigh by any means…
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
We landed in Philly this morning at 5:15 AM, and I’m hanging out with Joe at his house. We’re here through the weekend planning to see family and show Ephraim NYC, DC and the mighty Atlantic Ocean. I spent a lot of time in airports yesterday, finishing up a trip to Memphis and the power was out at the Memphis airport through mid-afternoon. I flew into DIA at 5PM, drove home, unpacked, repacked, ate at Qdoba, and headed back to the airport.
I haven’t been on my bike in over a week now and missed this week’s CCTT…
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
Somehow I though the winter race in Leadville was going to be my last race in the snow this year… afraid not. Tonight was Cherry Creek Time Trial #2. Attendance was lite and I welcomed the rock star parking as we enjoyed temperatures in the mid 30’s, a strong wind and persistent snow. I wish I had pictures to share. Maybe some will surface from Erik or Shawn. My time was a few seconds slower than last week and both were short of stellar. I can’t wait until we have some decent weather.
Last Saturday I did my first team time trial with Chris, Shawn and Erik at Haystack TT near boulder. I suffered like a dog and was dragged around the course by Chris and Erik. Shawn meanwhile was busy trying to stick the old dropped chain to cart wheel maneuver.
Approaching the line… ouch
Congrats to Marc V for his win at Fairhill last weekend! And good luck to Chris who just headed down to AZ for the Arizona Trail 300 “race”. If all goes well, Chris will be the first single speed (rigid no less) finisher of the AZT.
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
I recently had the opportunity to do a fresh installation of AtlassianJira and was faced again with how to integrate Jira with LDAP (in this case Active Directory). Jira does support simple authentication integration with LDAP via OSUser but requires that each LDAP user exist in Jira first. So if an LDAP user needs access to Jira, I have to go to Jira and create a new corresponding user record with the same user id as LDAP (sAMAccountName in this case). Ideally I would like Jira to synchronize LDAP users based on some query filter.
Luckily Jira has a perfect way to address this “opportunity”: Services. Jira Services are asynchronous scheduled units of work configured to run within Jira. I created a new service using JNDI called LDAPUserSyncService that can periodically query LDAP user objects based on configurable filter and create new Jira users for new users it finds in LDAP. I also added the ability to put a subset of users in a group called “internal-users” for users whose email matched a particular domain.
Its pretty simple. When the service runs, it queries LDAP, iterates through each user checking if the user already exists in LDAP, if not it created the user and puts it in the jira-users group and then checks if the email address contains myco.com (fictitious domain for this example) and if so put the user in the internal group as well. I just realized as I’m writing this though that I didn’t do anything to handle paging or results if the number of users is greater than the max returned by LDAP. Oh well, maybe another time…
public class LDAPUserSyncService extends AbstractService {
private static org.apache.log4j.Category log =
org.apache.log4j.Category.getInstance(LDAPUserSyncService.class);
public static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
public static String GROUP_INTERNAL = "Internal-Users";
public static String LDAP_USER_ID_ATTRIBUTE = "sAMAccountName";
public void run() {
try {
log.debug("Running com.myco.jira.service.LDAPUserSyncService");
String LDAP_HOST = getProperty("LDAP_HOST");
String LDAP_USER = getProperty("LDAP_USER");
String LDAP_PASSWORD = getProperty("LDAP_PASSWORD");
String LDAP_SEARCHBASE = getProperty("LDAP_SEARCHBASE");
String LDAP_FILTER = getProperty("LDAP_FILTER");
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
env.put(Context.PROVIDER_URL, LDAP_HOST);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, LDAP_USER);
env.put(Context.SECURITY_CREDENTIALS, LDAP_PASSWORD);
DirContext ctx = new InitialDirContext(env);
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration results = ctx.search(LDAP_SEARCHBASE, LDAP_FILTER, constraints);
while(results != null && results.hasMore()) {
SearchResult sr = (SearchResult) results.next();
Attributes attrs = sr.getAttributes();
log.debug("Processing " + attrs.get("dn"));
// need sn, givenName, mail
String first = (attrs.get("givenName") != null) ? (String) attrs.get("givenName").get() : null;
String last = (attrs.get("sn") != null) ? (String) attrs.get("sn").get() : null;
String mail = (attrs.get("mail") != null) ? (String) attrs.get("mail").get() : null;
String userId = (attrs.get(LDAP_USER_ID_ATTRIBUTE) != null) ? (String) attrs.get(LDAP_USER_ID_ATTRIBUTE).get() : null;
if(first != null && last != null && mail != null && userId != null) {
// check if user is in Jira
if(!userExists(userId.toLowerCase())) {
// create user, if a myco company user then add to internal group
if(createJiraUser(userId, first, last, mail) != null) {
if(mail.contains("myco.com"))
addUserGroup(userId, GROUP_INTERNAL);
} else {
log.error("LDAP User " + userId + " could not be created");
}
}
}
}
} catch (NamingException nex) {
log.error("Caught exception trying to Synch LDAP Users: " + nex.toString());
} catch (ObjectConfigurationException oce) {
log.error("Caught exception trying to Synch LDAP Users. Configuration setup failed: " + oce.toString());
}
}
private User createJiraUser(String userId, String fname, String lname, String email) {
UserManager userMgr = UserManager.getInstance();
User osUser = null;
try {
osUser = userMgr.createUser(userId.toLowerCase());
osUser.setFullName(fname + " " + lname);
osUser.setEmail(email);
Group jiraUserGroup = userMgr.getGroup("jira-users");
osUser.addToGroup(jiraUserGroup);
osUser.store();
log.debug("Successfully added LDAP user "+ userId);
} catch (ImmutableException e) {
log.error("Error creating User in Jira: " + userId, e);
} catch (DuplicateEntityException e) {
log.error("Error creating User in Jira: " + userId, e);
} catch (EntityNotFoundException e) {
log.error("Could not find group jira-users. Error creating User in Jira: " + userId, e);
}
// to be sure the user was created, return the reloaded user from Jira
return osUser;
}
private boolean userExists(String userId) {
UserManager userMgr = UserManager.getInstance();
boolean exists = false;
try {
if(userMgr.getUser(userId) != null)
exists = true;
} catch (EntityNotFoundException e) {
exists = false;
}
return exists;
}
private void addUserGroup(String userId, String groupName){
UserManager userMgr = UserManager.getInstance();
try {
User osUser = userMgr.getUser(userId);
Group group = userMgr.getGroup(groupName);
osUser.addToGroup(group);
osUser.store();
log.debug("Successfully added LDAP user " + userId + " to group: " + groupName);
} catch (ImmutableException e) {
log.error("Error adding User to acis-users group: " + userId, e);
} catch (EntityNotFoundException e) {
log.error("Could not find group acis-users. Error adding User to acis-users group: " + userId, e);
}
}
public ObjectConfiguration getObjectConfiguration() throws ObjectConfigurationException {
return getObjectConfiguration("LDAPUSERSYNCSERVICE", "com/myco/jira/service/LDAPUserSyncService.xml", null);
}
}
To configure a service within Jira navigate to Services in the System section of the Administration interface:
Here I’ve added the service you can see the parameters that can be customized for the service:
The parameters are configured in an XML file that is referenced by the getObjectConfiguration() method in the service code above:
I’d love to see stats on what percentage of all blog posts are an apology for not posting often enough. I have to assume the number is lower than I may expect since all the apologizing slackers (myself included), well, don’t post often enough. Anyway, that’s my passive aggressive apology.
I’ve been incredibly busy and have since transitioned back into consulting, taking a full time position with Avalon Consulting. I’m excited about my new role at Avalon, and the impact I’ll have there. I’ve recently had the opportunity to do some more work with Jira and set up a new Subversion environment. I should have some stuff to share there soon as well as pick back up on Grails.
On the cycling front, the first Cherry Creek time trial is Wednesday. I’m excited to see where my fitness is compared to last year at the same time. I’m about 13 lbs lighter if that’s any indication…
Hopefully more soon.
Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.