For the last couple months, I’ve been working on a new mobile application for an AIS client. It is an iPad app, targeted for iOS 6. Although I am quite well-versed in many of the iOS standard libraries, there is always “further east” to go, and I’ve really stretched my wings with this project and explored some interesting UI features. One thing in particular that I dug really deeply into is Interface Builder and its new integration into Xcode 4.x. I’ll discuss more of that in a later post, as I explored some interesting features (and limitations).

What I’d like to discuss now is the use of static libraries in Xcode for a couple different reasons. First, I have several classes that I think will be helpful to the developer community (both here at AIS and beyond), and I will be building static libraries to share with any of my colleagues who want to use them in their iOS projects. Second, being able to import static libraries into an existing Xcode project can be a little involved, and I want to outline the process in a way that proves to be repeatable. And of course, the best way of learning is to teach, so I’m looking to solidify my understanding of the process by putting it out there for any of you to try it and punch holes in my logic. Read More…

Chemistry FlasksThe ability to inspect and adapt is what differentiates good software development teams from great software development teams. For agile teams, the retrospective is a key event to making that happen. Just as the daily scrum is a scheduled time each morning to plan an attack for the day, the retrospective is a scheduled time at the end of each sprint for the team to inspect how these daily attacks were executed and create an adjustment and improvement plan for the next sprint. If your team’s retrospectives have become stale and boring, or fail to generate concrete actions and experiments for the next sprint, then try some of the following adjustments. Read More…
I recently completed a large document management system on SharePoint 2010 that used FAST Search and claims-based authentication. The client wanted to secure and limit access to customer-specific documents based on data coming from their CRM system.

We decided to implement a custom claim provider that would query the CRM system at login for customer claims based on the user ID. On upload (based on the customer that was assigned to the document), we used the content organizer to route the document to the correct site, library and folder based on the organization and security rules that we had. Each library had a claim for the customer assigned to it so only users with that claim could view the documents in the library. We would use search for the UI so that the users had a single place to find and view the documents. Sounds simple, right?

It should’ve been.

Unfortunately, the implementation was anything but simple. From the beginning, we hit the core limits of SharePoint 2010, FAST and Claims. Now that we’ve made it to the end, I want to talk about the limits we ran into and steps you can take in your design to avoid them. Read More…

We’re honored to announce that AIS’ own Media Center app won an Appy award for “Coolest App” at the SharePoint MVP Summit 2013. Media Center is a SharePoint app that allows you to integrate your Windows Azure Media Services (WAMS) assets in SharePoint. And we agree that it’s pretty darn cool.

You can download the award-winning Media Center app for free from the AppSource.

And here’s a brief video demo of the app’s capabilities:

Congratulations and special thanks to AIS team members Jason McNutt, Harin Sandhoo, and Sam Larko for their contributions to Media Center!

Are you working on a REST API and using the new Web API to implement it? You’ve written an ApiController subclass or two? Let’s say you’ve created a new subclass of ApiController called OrderController. WebAPI provides your OrderController with out-of-the-box support for the following URLs:

HTTP Verb URL Description
GET /api/order Returns all orders
GET /api/order/3 Returns details order #3
POST /api/order Create new order
PUT /api/order/3 Update order #3
DELETE /api/order/3 Delete order #3

The above is considered verb-based routing. The URLs above only contain the controller name and an optional id. So the Web API uses the HTTP verb of the request to determine the action method to execute in your ApiController subclass.

Your Goal

Now what if you want to add some custom actions to your ApiController subclass? For example:

HTTP Verb URL Description
GET api/order/3/vendors Returns all vendors involved with providing items to complete order #3
PUT /api/order/3/expedite Expedites order #3, but can only be executed by managers in customer service dept.
PUT /api/order/3/reject Rejects order #3, but can only be executed by managers in customer service dept.

It turns out that adding those custom actions is hard, very hard. But keep reading. There is an easy way. Read More…

Although AIS is proud to center their technology on Microsoft’s frameworks and technology stack, AIS is also adept at working with a broad range of other technologies to give clients solutions that are custom-tailored to their needs.

One such project is the recently released Web Report Editing Tool, or WebRET. WebRET was custom-built in the Ohio Development Center for the specific needs of our government client. In this instance, the client needed a back end that was compatible with the Java Runtime Environment, so we used JRuby on Rails to provide a modern yet JRE-compatible back end.

To learn more about the technologies used in WebRET, take a look at the whitepaper below.

Web Report Editing Tool Case Study (PDF)

Click here to read more about AIS’ custom application development service offerings and how they’ve helped our clients.

Have you ever attended a technical training event, and three days later, couldn’t really remember what you were trained on? In trying to recall what you just sat through, your mind comes up with the mental equivalent of a desolate Wild Wild West ghost town, perhaps with a sad tumbleweed or two passing through. You are not alone! At one point or another, we’ve all fallen victim to a training presentation that simply does not stick.

Training is an opportunity to engender a self-propelling domino effect of learning that can better humanity.

As a training developer, it’s my job to prevent students from walking away empty-minded. Come to think of it, this is also the goal for most sales people. You want your presentation to make a lasting impression: You want something to hit home — to stick —for the other person, in order to produce results. Whether those results are improved on-the-job performance or the President’s Club Award for Outstanding Sales, it doesn’t matter. Recognize that training is so much more than a stand-alone event: It is an opportunity to engender a self-propelling domino effect of learning that can better humanity.  “Well, when you put it that way, serving as a Trainer is an honor and a privilege!” my colleague said to me.  Yes, indeed it is! Read More…

I have a Windows Presentation Foundation (WPF) app currently in testing and this week it came back with some weird issues. The app uses the Client Object Model to consume SharePoint 2010 lists and UX is a factor in the design, so we’ve decided to do some metrics recording to see how people interact with the app. We want to know what features people use and which efforts were wasted.

Strangely, we started noticing that the names of the metrics (which were also being written to a SharePoint list) were displaying some incorrect results…names like “ShowAllItemsOpened” were instead “showAllMenuItem_Click.” What’s that you say? Clearly that’s the name of an event handler! Well, you’d be right! But it worked before! What changed in testing? First, some background information …

Read More…

This article will show you how to create a custom TimeZoneInfo that incorporates AdjustmentRules for Daylight Saving Time (DST) Transitions all the way back to 1918. The backdrop for this effort is covered in my previous blog post: Beware of Daylight Saving Time Transitions in .NET. You might want to read that one first for the context.

As noted in the previous post, the System.TimeZoneInfo uses AdjustmentRules to account for DST Transitions, and the default AdjustmentRules do not incorporate all the available DST data. But it is possible to create a custom TimeZoneInfo and populate the AdjustmentRules with DST Transition data available to cover all DST transitions.

Read More…

Back in 1980, Daylight saving time (DST) started on April 27th. But calling the IsDaylightSavingTime method in System.TimeZoneInfo class for April 15, 1980 returns true. The following test fails:

  1. [TestMethod]
  2. public void DST_Started_On_April_27_1980()
  3. {
  4.     var ts = new DateTime(1980, 4, 15, 12, 0, 0);
  5.     var isDst = Utils.EasternTimeZone.IsDaylightSavingTime(ts);
  6.     Assert.IsFalse(isDst);
  7. }

Let’s do some sleuthing and get to the bottom of this.

Read More…