Saturday, February 28, 2015

How to automatically set DateTimeKind, while fetching Datetime properties from database

In one of the my projects, we were saving all DateTime properties after converting them into UTC timezone.  However while reading these values (using EntityFramework) the DateTimeKind was reset to DateTimeKind.Unspecified.

Needless to say that, this behavior causes a lot of problems when we want to convert these DateTime properties into different timezone values.  What we wanted was, an automatic way to set the DateTimeKind value of our DateTime properties to UTC.

I found an awesomely clean way to do this, without doing it manually for each and every DateTime property.

How Do They Do It!

To get the desired effect we need to follow these steps.

  • Create an Attribute that will have the responsibility to set the DateTimeKind value of all eligible DateTime properties of an entity (essentially, those DateTime properties that have this Attribute)
  • Apply this attribute on the desired DateTime properties of all entities.
  • Lastly, we need to hook up this attribute to the ObjectMaterialized event.  So that whenever an entity is materialized, the attribute can perform its job.
Three simple steps to get done, lets jump right into the code.

The code for this attribute is pretty self explanatory, basically
  • It just finds all properties of an entity of type DateTime or DateTime?
  • Loops over these properties to find whether they declare the Attribute
  • If yes, then set the value of the property along with the desired DateTimeKind value.
All we are doing here is to apply the attribute to a few properties of our EntityFramework entities.

Hooking up the Attribute with the ObjectMaterialized event of ObjectContext.

As mentioned earlier, its a simple and clean way to getting the DateTimeKind value set for all DateTime properties of EF entities.

That's all folks!

Credits: SO

Saturday, January 31, 2015

How to ignore global Ajax error handler for user aborted requests using jquery

We had this situation in one of my project, where we wanted to bypass the jquery global Ajax error handler if user aborts the Ajax request by navigating away from the page (for example, by clicking a link on the page)

I tried various options but none seem to work. Finally, I came across one solution, that seem to work perfectly well for my situation.

The idea behind this perfect solution is,
  • Bind the "beforeunload" event on the window object.
  • In the event handler, set a global variable to indicate that the page is being unloaded. 
  • In the global Ajax error handler, do not take any action if the above global variable is set.
  • In all other cases, perform the actual Ajax error handling.
Lets quickly look at the JS code as well.

The code is pretty self explanatory and well documented.  That's about all it takes to get the job done! 

Tuesday, December 30, 2014

The Last Alive Architect!

Have you ever met an Software Architect (or even worked with such a person) who thinks, he/she is the last alive Software Architect on the planet?
  • If your answer is Yes, then you will easily relate to this post :)
  • If its No, then I would have to say its definitely worth an experience - After all, life is not only about happiness :P
This rare species is facing extinction, but some of them have managed to survive.  Because they are so rare, finding them is almost like finding a needle in a hay stack!

Since they are so rare, how do you know when you have found one such person?

Here are some of the symptoms that people from this species exhibit:
  • They stopped reading about the latest in software development since 1981
  • They think all open source frameworks are crappy
  • They think the code written by them is the best possible in the world.
    • But in reality their code is a lot crappier than anything that you have seen before.
  • They would build everything from scratch.  Its their habit to reinvent the wheel.
    • For e.g. building a buggy ORM all by themselves (and of course being proud of it :P)
  • They think all code they write is bug free.  Since all their code is bug free, Unit Testing is such a big waste of time.
  • They can "talk static methods, they can walk static methods and the can laugh static methods, because static methods are the way to go!"
    • If you don't know the context around the dialog do see this clip
  • If given an opportunity, they would like to build a new programming language which runs on an Operating System built all by themselves.
As you can see, its definitely worth an experience meeting a person from this species.  My question to my readers is, whether you have ever met someone like this before?  If yes, do share any other symptoms that people of this species exhibit!

As a closing remark, here is an important disclaimer:

Disclaimer: The views expressed in this post are strictly personal and any resemblance to any real person is purely incidental and not intentional.

Sunday, November 30, 2014

How to show realtime translucent background frost/blur effect similar to iOS UIToolbar

In our app "Monster Math - Best Arithmetic Game. Ever" we wanted to show a parental gate screen, when people click on the "Upgrade" or "Restore" button.  The parental gate screen should have a realtime translucent background frosted glass/blur effect, similar to how its shown in the UIToolbar.

So essentially what I wanted was something like this.

The actual view with a carousel, Upgrade and Restore buttons on it

The parental gate with a translucent background frost effect similar to iOS UIToolbar
I searched around, to see if I can find an inbuilt API in iOS that can help us do this.  But unfortunately there is nothing exposed by Apple that helps us do it.  That said, Apple did show a simple trick that can give us the desired effect very easily.

How do they do it!

This can be done in 3 simple steps
  • Convert the underlying UIView to an UIImage
  • Frost/Blur the UIImage
  • Set this new frosted/blurred UIImage as background of your new view
NOTE: The explanation of how to do these steps can be found in this SO Answer.


Convert the underlining UIView to an UIImage


This can be done by creating a new category of UIView and adding the following method to that category


Frost/Blur the UIImage


To frost/blur the UIImage that we created in the previous step we can use the Apples Image Effect category.  The code for ImageEffects category looks as follows

Using this ImageEffects category we can frost/blur any UIImage as follows


Set this new frosted/blurred UIImage as background of your new view


This is by far the simplest step of all.  All that needs to be done here is to set the newly created UIImage as the background of your new view.  Our game is developed with Cocos2d and we could do this using the following lines of code

The end result is very satisfying.  It looks great on the devices as well!

Thats all folks! I hope you like this realtime frosted glass/blurred effect as much as I do.

Friday, October 31, 2014

How to get Apple Cover Flow effect in an iOS app

Recently, for our flagship app Monster Math, I was on a hunt to find a control that gives me the Apple Cover Flow like effect.  After evaluating a few options I ended up using the awesome iCarousel control.

Its extremely customisable, lightweight, has numerous hooks and many many predefined effects, its simply awesome!  In this post, we will see how easy it is to get the iCarousel integrated into our app.

How Do They Do It!

To get this control up and running follow these simple steps

Installation

The installation is stock standard, you can install it via Cocoapods.  Use the following line in your pod file

and then run

Usage
  • There are two protocols that need to be implemented for the iCarousel to work correctly.  iCarouselDataSource and iCarouselDelegate
  • The iCarouselDataSource protocol has two mandatory methods to be implemented 
    • (NSInteger)numberOfItemsInCarousel: This method returns the number of items in the carousel 
    • (UIView *)carousel:viewForItemAtIndex:reusingView: This method returns the view that needs to be shown in the carousel.
  • The iCarouselDelegate protocol has no mandatory methods but its good to implement the following method
    • (CGFloat)carousel:valueForOption:withDefault: This method can return values for different options which alter the display and behaviour of the carousel.
Thats about all the methods we will need to implement to get the cool Apple Cover Flow effect.  Lets jump into the code to see the details of implementation


In this snippet we are just initialising the iCarousel and setting the type of carousel to iCarouselTypeCoverFlow2, this type's behaviour closely mimics the App Cover Flow effect.

Next up are the protocol methods that we described earlier.

This snippet implements the two mandatory methods of iCarouselDataSource protocol.  For the view we are showing a simple image from our assets.  And we have total 4 items in our carousel.

The last and final method just customises two options of the iCarousel.  It basically wraps the view so that we get an infinite view sort of a feeling and adjusts the spacing between the views a bit.

With all the pieces in place lets fire it off and see how it looks!

An Infinite Cover Flow Effect

An Infinite Cover Flow Effect

Pretty impressive for such little code, won't you agree?  

That's all folks, until we meet again, Guten Tag!

Monday, September 29, 2014

How to map Fluently mapped NHibernate Entities To Stored Procedures ResultSet

In one of our .NET/NHibernate project, we wanted to move a time and resource consuming NHibernate generated query to a Stored Procedure.  Nothing else should change, the stored procedure should return the same result set as the query.

The motivation behind this move was to use some native techniques to tune/optimize the query for example compute some intermediate result set and put into a temporary table etc.

Now that the requirements are clear lets dive into the problem a bit more.  We were using Fluent NHibernate to map our entities and the problematic query was generated using NHibernate's criteria API using one of the Fluently mapped NHibernate Entity.  This object was a pretty big object with numerous associations to other NHibernate Entities.

I (being a lazy developer) was in no mood to map the result set of Stored Procedure all over again in an hbm.xml file.  Basically I was trying to do as little as possible to get the job done :).  What I had in mind was to directly map the result set of Stored Procedure to already mapped Fluent NHibernate Entities.

DISCLAIMER: Before I say anything else, let me make it very clear that its was not NHibernate that was generating an un-optimized query, our schema is a legacy schema and the query itself was pretty complex to begin with.  In all likelihood its a problem caused by us not using NHibernate correctly.

OK enough of context setting, let jump into code.

How Do They Do It!

Lets assume that we have two NHibernate entities called Department and Employee.  Department has a one-to-many relationship with Employee (i.e. A Department can have many Employees).  The mapping files of Employee and Department are stock standard, but just for sake of completeness showing them here

Now lets say we have a method that queries the departments by Name.  We want to move this query to a Stored Procedure.  The method and the generated query (for reference)


To move this NHibernate generated query to a Stored Procedure we need to do the following steps

  • Create a Stored Procedure that returns the exact same result set as the NHibernate generated query

  • Configure the stored procedure as a Named Query in hbm.xml file.  

  • Invoke the named query via NHibernate
That's about all the changes we need to map the result set of Stored Procedure to the Fluently mapped NHibernate entities.  As shown above all the lazy loading and other relationships work as before!

These simple steps got us what we wanted without some painful mapping jugglery.  As always, NHibernate just does not cease to amaze!

Thanks all folks!

Shameless Plug: we will be launching the best ever arithmetic app called "Math Monsters" very soon on the AppStore.  Checkout the details on our Website and like us on Facebook!

Sunday, August 31, 2014

How to add NOLOCK hint to EntityFramework Queries

We were using EntityFramework (don't ask me why, but yea thats a reality) in one of our projects as the ORM tool.  In one of the obscene query generated by EntityFramework, we wanted to make sure that it does not acquire any locks on any tables involved.

Obviously, we should be running such a query using the ReadUncommitted transaction isolation level.  However, in certain cases that is really not an option.  In such a situation we need to add the NOLOCK hint explicitly to the generated query.  This post is about adding the NOLOCK hint to any query generated by EntityFramework.

How Do They Do It!

The solution that I found was pretty elegant and nicely abstracted in one class.  The solution described in this post is taken from this SO post.  Here are the steps involved in getting the job done.
  • Create subclass of DbCommandInterceptor
  • Override two methods in this derived class ScalarExecuting and ReaderExecuting
  • These methods will be called by EntityFramework just before executing the generated query.
  • In these methods we get an opportunity to update the entity framework generated query and add the NOLOCK hint if required.
Heres the code that will get the job done.
Basically all we are doing here is, looking for a pattern which matches table names in the entity framework generated query and replacing all the table names with <TableName> WITH (NOLOCK) hint.  Thats all that is needed really!
The thread static variable ApplyNoLock is kind of a switch that, controls whether the NOLOCK hint is to be applied or not.

The Interceptor can be added during the application start as follows
Thats all folks, its really a simple and elegant way to add the NOLOCK hint to any query generated by EntityFramework!
Have some Fun!