After you have a running app and you have done enough testing on your iPhone and your other iDevices, the next step before submitting to the AppStore is to test on as many devices as possible. This type of testing is usually called beta testing. Beta testing is crucial in developing a great mobile app because of generally two types of feedback given by beta testers: - Compatibility problems. Even though everything might be sweet and sublime on your iPhone or iPad, it might not be the case for every combination of device and iOS version. Beta testing with hardware/software diverse testers will uncover all or most of those problems.
- General story/usability flaws. This category is not about bugs. It's about understanding what part was confusing to your beta users or what false assumptions did you make. Beta testing will help bring your assumptions and perspective inline with real users.
In this guide I will give the procedure for how to generate ad hoc builds that you can send to your beta testers to try. I could not find a single tutorial that covered all the related issues so I decided to write this. This procedure does not require registering in the iOS Developer Enterprise Program. All that is required is the standard iOS Developer Program. This guide was written using Xcode 4.2.

If you're going to write a general use library and use a linked list, please make it doubly linked. I was recently working with the
Box2d library which I have to say is a great physics engine. The engine maintains a linked list of what it calls Fixtures attached to each body. While I was trying to use this list I was shocked to find that it was a singly linked list. In other words the list only had a "next" pointer, no previous pointer.
Unless you have a good reason like
tail-sharing I really don't see why someone would do that especially in a general opensource library that would be used in a broad range of applications. First off, before we go into the pros and cons of both designs let's briefly talk about
linked lists. A linked list is a data structure used to store a group of data objects by connecting objects with a "link". The link is basically a pointer from one object to the next one, previous one, or both. If there's only one link it's called a singly linked list. If there's both a previous and a next link, it's called a doubly linked list. The best part about a linked list is that it's very cheap to add and remove objects. All we need to do is add a new link or remove a link and assign a pointer to a different object. The worst part about a linked list is random access. If we need to access an object that happens to be in the middle of the list, there's no way to reach that object but to traverse through all the objects before it or after it.
When designing software, we're supposed make libraries as flexible and general as reasonably possible. We already know that access is the main weakness of linked lists. The least we can do to make accessing objects a little easier is to make the list a doubly linked one. In the case of linked lists it's easy to see why someone might need to go backwards in a list. But even if it weren't so obvious, if adding something doesn't cost much and it satisfies a common use it should be done in a general purpose type of library.
Looking at the pros and cons of a singly and doubly linked list, it also makes more sense to make them doubly linked. The only pro of using singly linked lists is that it saves memory but all we're saving is a pointer which is about 32 or 64 bits per object. The con is being limited to traverse a list in only one direction. Singly linked lists also make it more challenging to delete objects. The pro of having a doubly linked list is that from any object in the list we can move in either direction. Also it's a lot easier to delete an object in a doubly linked list. The con of doubly linked lists is that we use a little more memory for the second pointer. However the additional memory (32 or 64 bits per object) used is insignificant. In terms of asymptotic notation, we're still using O(n) memory which means our memory usage is linear with respect to the number of objects.
The good news is that I was able to modify the list and make it doubly linked. Take home message: bi-linking = bi-winning.
Labels: bi-winning, design, doubly linked, linked list, singly linked, software

There are a couple options to raise an exception again after it has been caught. One option is to raise the exception again by using the "throw exception" keyword like below:
try
{
...//code that encounters an exception
}
catch (Exception ex)
{
...//exception handling code
throw ex; //raise the exception again
}
The disadvantage in this way is that the original context of the exception is lost. There is no longer a meaningful call stack attached to the exception because it will contain the latest context from the newly added throw. If you plan to throw the exception in this matter you should wrap the original exception into another new more high level (application) exception. The new exception would add more high level info about the original exception.
The second option is to use the throw keyword alone with out passing the actual exception variable. This tells the .NET framework to throw the original exception without updating its context like below:
try
{
...//code that encounters an exception
}
catch (Exception e)
{
...//exception handling code
throw; //notice the exception e is omitted
}
This way should be used when the exception is trivial enough and the code is too small to require wrapping into another exception. Again the advantage here is that you maintain the original call stack so that any user of this code can track the cause of the exception.
It's worth noting that Java is different in this aspect and using "throw ex" in Java will retain the original stack trace.
Labels: .net, c#, call, exception. raise, java, stack, throw, trace


Nearby is a new Windows Phone 7 (WP7) app. The app can be
downloaded here from the Windows Phone 7 app store.

Nearby shows the user nearby places automatically upon opening. The user can scroll through the list of nearby places and find more information on a location he is interested in. Information for a location includes phone, address, website, rating, and distance. You can see the directories where the location is found such as Yelp, Yahoo and CitySearch. Using Nearby, you can view the location's page on Yelp and other sources within the app. Browsing to the Yelp or Yahoo page for the business allows you to see reviews and more info.

With Nearby, you can find step-by-step directions to the location you are interested in. You can also navigate through the itinerary steps and see the steps on the map.

Nearby allows you to bookmark your favorite locations so that you can find them easily. You may also share a location with a friend via SMS text or email. Calling a place is as easy as touching the phone icon or phone number after selecting a business.

List of favorite places and businesses for easy access.
Find out more about Nearby at
http://www.challengesolutions.net
Labels: app, application, directions, gps, maps, mobile, navigation, nearby, phone, reviews, windows phone 7, wp7


Just Draw is the latest mobile app I launched on the Apple App Store. Currently it's only compatible with the iPad. Future versions might extend support to iPhone and iTouch depending on demand.
Just Draw is a nice simple app that allows iPad users to use their fingers to draw then save or share their drawings via Facebook, Twitter, or email. The app is useful if you want to jot down ideas while thinking then come back to them later. It's also good for quickly mocking up designs of anything. If you ever wanted to quickly write or draw something on a picture and then send it to a friend, Just Draw is the app you've been looking for.
Perhaps one of the unique features of Just Draw is the "replay" feature. You can have the app trace every move you make by hitting the replay button. So you can take your time and draw something creative then hit replay and watch the app animate your drawing by repeating everything you did.
The cool thing about this app is that it is built on top of OpenGL which gives it the smooth performance. Just Draw supports multi-touch drawing. So you and your friends can draw at the same time! The app makes use of a few API's such as Facebook and TwitPhoto.
Since this is the first release, there are many nice features that can be added to Just Draw. I am open to any ideas or suggestions on what users want to add to the app. Have fun with the app and I look forward to hearing your feedback and comments.
Here are some screenshots from Just Draw:



Labels: app, App Store, Apple, draw, iDraw n Paint, iOS, iPad, iPhone, just draw, multi-touch, sketch


I just finished developing an iPhone App called TA Project that's on the Apple App Store now. The mobile application allows a user to create tasks or to do lists for a project. It can be simply used for task management. But it can also be used for more complex budget and schedule tracking. TA Project can also compute project management metrics such as the Schedule Performance Index (SPI) and the Cost Performance Index (CPI).
You can also graph your estimate and actual cost to visually compare your performance to what you have estimated. The graph is useful to foresee whether your actual cost is going to exceed your estimate or not. Another feature of TA Project is allowing the user to post the status of a project on Twitter. One of the tabs for each project is a Twitter tab that allows reading previous posts and posting new Tweets.
I was the only developer working on the project. I used CorePlot for graphing. Overall the most complex pieces of the project were handling task dependencies, graph formatting, and making the application robust. Making the application robust includes memory management and handling network events. Integrating with Twitter was fairly simple. The app uses CoreData for data storage which uses SQLite underneath.
Xcode and CoreData make using SQLite very convenient. After getting the data model down in Xcode, most of the data pluming is done for you under the hood. This project presented some data challenges because almost every single action the user makes has to be retained.
Below are some screenshots from the app.

Home page screen. This screen shows the list of projects.

The Tasks tab. After selecting a project you come to this tab which shows the tasks for the selected project.

The Performance tab. The Performance tab shows the CPI and SPI metrics in addition to the estimate and actual cost graphs.
Flipping the phone shows the graph in landscape mode.

The Twitter tab. This tab allows the user to read posts and update the status of the project on Twitter.

SQL Server does not allow creating a stored procedure with parameter default values that are not constant. This can be a problem if you want to give a parameter a default value that is predictable but not constant such as giving a datetime parameter a default value of the current time.
There are two ways to resolve this. One is solution but it's not very flexible. The other is a workaround but can be used in more situations. First the solution. If the parameter is used as a minimum or maximum value check, you can totally ignore the value if it's null.
Here is an example of the first solution. Let's say we want to write a stored procedure to get all records from an Activity table that occured from one point in time to another. In this case we want to include all records if the boundry variable is not specified. In the example below we simply do this by checking for NULL and using the logical OR.
CREATE PROCEDURE GetActivityRecords
@From DATETIME
@TO DATETIME
AS
BEGIN
SELECT * FROM Activity
WHERE (@From is null or LogTime >= @From)
and (@To is null or LogTime <= @To)
END
Another way to do this that is more flexible is to check if the parameter is null and in that case set it equal to whatever value you wish.
For example, in the code below I check if the @To variable is null and if it is I set it equal to the current time.
CREATE PROCEDURE GetActivityRecords
@From DATETIME
@TO DATETIME
AS
BEGIN
IF @To is null
BEGIN
SET @To = GetDate()
END
SELECT * FROM Activity
WHERE (@From is null or LogTime >= @From)
and LogTime <= @To
END
Labels: default value, microsoft, non-constant, null, parameter, sql server, stored procedure

It's good to refresh what the default access modifiers are in C#. Default access modifiers could explain why you can't see something you declared when expect to see it and vice versa.
First let's quickly review all the access modifiers in C#.
private: Can be accessed by members of the same class only.
protected: Can be accessed by members of the same class plus members of derived classes only.
internal: Can be accessed by all that is in the same assembly regardless of what class they are in. But can only be accessed from the same assembly.
public: Can be accessed by everything.
The general rule is that the default access modifier is as secured as possible for the declaration context. This does not mean that everything is
private by default because
private does not make sense for everything. So here is the breakdown.
Data types: class, struct, enumFor data types such as classes the most strict reasonable access modifier is
internal. And that is exactly the default modifier. So when declaring a new class it is
internal by default so that it can be accessed by other classes in the same assembly. It does not make sense for a class to be
private by default because it would inaccessible.
Members: variables, methodsFor member variables and methods which are inside a certain data type from the list above, the most restrictive reasonable modifier is
private and that is it. Any time a member is declared with no access modifier, it is
private by default.
Labels: access modifiers, c#, default access modifiers

It gets confusing at times when figuring out which ASP.NET tag is best to use. Moreover, it is good to know the settle difference between a couple of the similar tags. One might think that for example the "<%#" tag and "<%=" are the same for certain cases and can be used interchangeably. Actually they are different and in most cases only one of them would work unless some code change is done. So here is a summary of the tag attributes and the differences amongst them:
<% ... %>
This tag is used to insert code into an ASP.NET page usually with a .aspx extension. One of the most common use of this tag is conditional statements where you can choose to display certain content only when a condition is met.
<% if(isLoggedIn){ %>
Hello user
<% } else { %>
Please login
<% } %>
For more info:
http://msdn.microsoft.com/en-us/library/ms178135(vs.80).aspx<%# ... %>
This tag is used with data binding. It can be used with DataBinder.Eval() or DataBinder.Bind() or just with any protected or public member as shown in the example. The trick about this tag is that it must be used inside a server-side element (with runat="server"). Also the DataBind() method of that element must be called at some point. However, certain ASP.NET elements automatically call their DataBind() method in their PreRender() methods. So there is no need to is explicitly call their DataBind() methods. Such elements are GridView, DetailsView, and FormView.
<div id="div1" runat="server">
Hello <%# userName %>
</div>
In the code behind:
protected void Page_Load(object sender, EventArgs e)
{
div1.DataBind();
}
For more info:
http://msdn2.microsoft.com/en-us/library/ms178366.aspx<%= ... %>
This tag is similar to the above tag in the sense that it is used to evaluate the value of a protected or public member variable. The tag evaluates the ToString() method of the variable used and displays it. The nice thing about this tag is that it does not need to be inside a server-side element and its parent element does not even need to have a name.
<div>
Hello <%= userName %>
</div>
For more info:
http://msdn.microsoft.com/en-us/library/6dwsdcf5(VS.71).aspx<%$ ... %>
This tag is used to evaluate expressions in a configuration file. It is usually used for connection strings but it can be used with AppSettings and other configurations.
<asp:SqlDataSource ID="SqlDataSource1" Runat="server"
SelectCommand="SELECT * FROM [Employees]"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString1 %>">
</asp:SqlDataSource>
For more info:
http://msdn.microsoft.com/en-us/library/d5bd1tad.aspx<%@ ... %>
This is usually used at top of a page as a directive to register controls or import a library.
<%@ Register TagPrefix="uc" Namespace="MyCustomUserControl" %>
For more info:
http://msdn.microsoft.com/en-us/library/xz702w3e(VS.80).aspx<%-- ... --%>
This tag allows you to add server-side comments which would never show in the HTML output. This is different from using an HTML comment (<! -->) because HTML comments do get rendered in the outputted HTML.
<%-- this is a comment --%>
For more info:
http://msdn.microsoft.com/en-us/library/4acf8afk.aspxThat should be a good summary but there is obviously more to some of tags.
Labels: .net, asp .net, asp .net tags, c#

ASP .NET offers an elegant way to store data source connection creditentials. Connection strings should be stored in a .config file, commonly and by default the Web.config file.
Firstly, what are connection strings? Connection strings are strings of text that contain information about a data source used in the code for data access. Information contained in a connection string includes the data source name, data source address, security mode, login creditentials, and the data source type.
There are a couple reasons why the Web.config file is a good place to store connection. One, ASP .NET is automatically configured to never display a file with a .config extension. So you can assume a level of security when storing login information in the Web.config. In addition, ASP .NET can be configured to encrypt the Web.config file, which would add more security. Nonetheless, you can be assured that any web request to a .config file would result in an error. Secondly, using Web.config allows a central way to manage information without requiring digging into the code nor code modification.
Below are examples of how connection strings would be used:
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<connectionStrings>
<add name="connectionName" connectionString="Data Source=serverName;
Initial Catalog=databaseName;User Id=username;Password=password;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
...
</configuration>
To retrieve the above connection string in C# code:
string connStr = ConfigurationManager.ConnectionStrings["connectionName"];
To use the connection string directly in an ASP .NET page:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:connectionName %>"
SelectCommand="SELECT * FROM [Employees]" />
Labels: asp .net, c#, connection string, database, sql server, sqldatasource, web.config
