# Thursday, 06 August 2009

The reason why Apple products are so slick and cool is two fold, the first is that they are a great consumer product/design company hands down. But the second is an equally important reason, a reason that will potentially prevent them from massive long term market share (like Windows, Oracle, etc.) The second reason why Apple products look and work so nicely is that they have a tight control over the software installed on their devices. For example if you are a software developer and want to build an application for the iPhone or the Mac, you need to follow the strict Apple design guidelines and then get approval from Apple before you can sell (or give away) your software.

This is great, it gives the vendor (Apple) near complete control over what gets installed by the user base and the vendor (Apple) can control the user experience. This of course has some great benefits: less virus attacks, less crashes (windows is usually unstable due to people like me: software developers) and less hacks. You can also guarantee that there is no porn or politically sensitive content on your device.

This also has a negative side effect. Pissed off developers. Tech blog TechCrunch reports that many software developers are getting angry with Apple due to the rejection of their apps, random removal of their apps, or rejection of an upgrade of their original app from the Apple AppStore. This will only anger more and more devs and over time, will limit the developer community on that platform. As we all know, with the apps, there will be no platform.

I am not saying that this is happening (developers leaving in droves) now, but it can happen. A recent decision to pull an app may have started the revolution. Apple last week pulled the Google Voice application from its AppStoe. Google Voice is pretty cool and allows you to use VOIP to make and receive calls (among over cool stuff.) So free phone calls means less minutes AT&T (and other international carriers) can sell.

This caused a bit of an uproar in the tech world. Some major influencers including prominent Apple supporters decided to quit using the iPhone over the decision to remove Google Voice. Google’s CEO Eric Schmidt has decided to step down from Apple’s board due to the conflict of interest. Lastly, the US government has gotten interested, last week, the FCC launched an investigation about the removal of Google Voice.

Apple (and AT&T) should allow any application to be installed on the iPhone as well as any other phone for that matter. On the regular wired internet, I can buy a PC and then download and install anything I want, my ISP does not control what computer I can buy and what I can see and what I can’t see. Why is it different for phones? I can’t install everything I want, nor can I even buy whatever phone that I want, I have to buy the phone from the carrier in a “locked” mode.

There is a reason: the United States is large country by land mass. The government has let the carriers have some control due to them promising to wire the whole country-this is why you can get signal in remote places where there is not a lot of demand. But now years later we are paying the price. It is time to open up the airwaves and allow us to buy any phone and install any application. The Apple AppStore is a walled garden that eventually will fail. While Apple risks losing a few design points and some system crashes and AT&T will lose some revenue, over the long run, if they allow anyone to develop software and anyone to install it, we all will be better off.

posted on Thursday, 06 August 2009 05:14:53 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Friday, 31 July 2009

If case you did not know, Telerik released LINQ to M a few weeks ago, enabling you to use a LINQ style interface with M values of data. Mehfuz and I have written blog posts where you can see how to use the basics. 

There have been tremendous amounts of downloads and we have gotten tons of feedback. (Thanks, keep it coming!) One thing that stood out is that when you are building M values a lot of time you will have a named instance of your M code like this:

   1:  //People is the named "M" instance
   2:  People{
   3:                  {Id=1,Name="Stephen Forte",Age=37},
   4:                  {Id=2,Name="Mehfuz Hossain",Age=29},
   5:                  {Id=3,Name="Vassil Terziev",Age=31},
   6:                  {Id=4,Name="Nadia Terziev",Age=27},
   7:                  {Id=5,Name="Chris Sells",Age=37},
   8:                  {Id=6,Name="Todd Anglin",Age=27},
   9:                  {Id=7,Name="Joel Semeniuk",Age=37},
  10:                  {Id=8,Name="Richard Campbell",Age=42},
  11:                  {Id=9,Name="Kathleen Gurbisz",Age=31}
  12:   }";    

 

In the first version of LINQ to M, you get a runtime error saying that LINQ to M cannot parse “People”. The most current refresh of LINQ to M fixes this problem and you can run your LINQ queries against M values that have a named instance. You can get the refresh here. Enjoy!

posted on Friday, 31 July 2009 12:25:00 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Friday, 10 July 2009

I was interviewed about what I will be doing this summer on Bytes by MSDN. It was fun, and you can watch lots of others such as Scott Hanselman and Billy Hollis too.

posted on Friday, 10 July 2009 08:43:09 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Thursday, 09 July 2009

I chat it up with Richard and Carl about SQL Server, ADO .NET, the Entity Framework, the Boston Red Sox, LINQ to SQL, ORMs, Silverlight, Astoria, and RIA Services. Listen here.

posted on Thursday, 09 July 2009 19:38:44 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Wednesday, 08 July 2009

I have been using Microsoft “Oslo” for some time and have been pretty excited about the ability to model an application and store it in the repository. Other developers have also gotten very excited about the ability to create domain specific languages (DSLs). DSLs are cool, because if you build a DSL on top of your application, you can abstract away some of the hard to understand stuff. You can also put in a layer on top of your standard communication (DALs, web services, etc.) For example, let’s say you work at Expedia and you want to give your providers (the airlines) a way to enter flight data to your site. You will most likely have a data entry screen with lots of boxes and drop downs. An alternative of course is a Web Service as well as a CSV text import. But another alternative is to provide a DSL, so if someone wants to go in and make a quick change, they can type:

Delta flight 280 on Friday’s new price is $780.

Then using Oslo, you can transform this to an M Value format:

Flights

{

{Carrier=”Delta”, Flight=280, DepartDate=”July 10, 2009”, Price=780}

}

This is one area where you can use Oslo with .NET today-you can call the M DSL DLLs from .NET and perform the transformation in C# or VB. The problem is that the M Value format is difficult to work with in .NET; parsing the M values can be a challenge.

Mehfuz Hossain over at Telerik built a LINQ Extender available on codeplex. Building on top that, Telerik has released a LINQ to M implementation. It is pretty easy to use. After you download it and set a reference to it in your application, you then use standard LINQ statements against M Values.

For example, let’s say that your application has some M values that looks like this:

   1:   {                
   2:           {Id=1,Name=""Stephen Forte"",Age=37},
   3:           {Id=2,Name=""Mehfuz Hossain"",Age=29},
   4:           {Id=3,Name=""Vassil Terziev"",Age=31},
   5:           {Id=4,Name=""Nadia Terziev"",Age=27},
   6:           {Id=5,Name=""Chris Sells"",Age=37},
   7:           {Id=6,Name=""Todd Anglin"",Age=27},
   8:           {Id=7,Name=""Joel Semeniuk"",Age=37},
   9:           {Id=8,Name=""Richard Campbell"",Age=42},
  10:           {Id=9,Name=""Kathleen Gurbisz"",Age=31}
  11:   }

 

You could have gotten this M code from the results of a DSL or some other process. For our purpose, we will just put it into a constant and query against it:

 

const string MGraphCode = @"

            {

               

                {Id=1,Name=""Stephen Forte"",Age=37},

                {Id=2,Name=""Mehfuz Hossain"",Age=29},

                {Id=3,Name=""Vassil Terziev"",Age=31},

                {Id=4,Name=""Nadia Terziev"",Age=27},

                {Id=5,Name=""Chris Sells"",Age=37},

                {Id=6,Name=""Todd Anglin"",Age=27},

                {Id=7,Name=""Joel Semeniuk"",Age=37},

                {Id=8,Name=""Richard Campbell"",Age=42},

                {Id=9,Name=""Kathleen Gurbisz"",Age=31}

            }";

Now you need to load the M code into a QueryContext object so you can work with it in LINQ:

   1:  var personM = QueryContext.Instance.Load(MGraphCode);

There is not a ton you can do with it just yet, but you can bind it to an ASP.NET data grid:

   1:  GridView1.DataSource = personM;
   2:  GridView1.DataBind();

This alone will save you some time, but if you want to do typed queries and have the cool IntelliSense experience, you have to strongly type your LINQ statement. To do this, create a class that has the same shape as your M data, so we will create a Person class:

   1:  public class Person
   2:  {
   3:  public int Id { get; set; }
   4:  public string Name { get; set; }
   5:  public int Age { get; set; }
   6:  }

 

Now it gets fun. Let’s create a simple LINQ statement that will query just the 37 year old people not named Joel Semeniuk:

   1:  var persons = QueryContext.Instance.Load<Person>(MGraphCode);
   2:   
   3:  var result = from person in persons
   4:                where person.Age == 37 && person.Name != "Joel Semeniuk"
   5:                orderby person.Name ascending
   6:                select person;

This will return just Chris and Stephen. You can see that we are using the standard LINQ statements FROM, WHERE, ORDERBY, and SELECT. (Hey wait a minute, aren’t those SQL operators, but I digress…. )

Let’s do some aggregation, this query will aggregate a list all of the ages and count how many people are that age, but we will exclude from our query any age that only has one person:

   1:  //Using a Group By and SUM
   2:   var result1 = from person in persons
   3:                 group person by person.Age into g                         
   4:                 where g.Count() > 1
   5:                 orderby g.Count() descending
   6:                 select new { Age = g.Key, Count = g.Count() };

Your results will look like this:

 

Age

Count

37

3

31

2

27

2

Lastly, just for the true geeks, here is how to use a LAMBDA expression:

   1:  GridView3.DataSource = QueryContext.Instance.Load<Person>(MGraphCode)
   2:                         .Where(p => p.Name == "Mehfuz Hossain");
   3:  GridView3.DataBind();

 

Mehfuz and I are pretty excited about this. There are some limitations; the M Values that you pass in has to be shaped without a name as you can see above. (Don’t worry we will change that later on.) But what you can do so far is pretty darn cool. Enjoy and drop a comment to me or Mehfuz about what you want to see in the next release.

Download it here.

posted on Wednesday, 08 July 2009 11:31:05 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Tuesday, 07 July 2009

Thursday, July 16, 2009
Project Stonehenge for .NET

Subject: 
You must register at https://www.clicktoattend.com/invitation.aspx?code=139381 in order to be admitted to the building and attend.
Project Stonehenge is an open source project created to build reference applications that demonstrate the use of WS-* Standards in real-world project implementations. Project Stonehenge is sponsored by the Apache Software Foundation, a leader in the Open Source community. Project Stonehenge’s flagship application the StockTrader Application currently has interoperable layers in .NET, PHP (unmanaged-C), and JAVA.
This session will provide an overview of the WS-* standards, a history of Apache Stonehenge and the StockTrader application, an demo of the StockTrader web services interoperability, and walk-thru of the StockTrader .NET WCF code and configuration.

Speaker: 
Ben Dewey, twentysix New York
Ben Dewey is a Senior Software Developer at twentysix New York and is a committer for the Apache Incubator StoneHenge project. He has over 10 years of web development experience and has recently worked on projects using WebServices, REST, WCF, jQuery, Silverlight, and WPF. Ben strives to create connected system with well defined roles without sacrificing the richness of the user experience.

Date: 
Thursday, July 16, 2009

Time: 
Reception 6:00 PM , Program 6:15 PM

Location:  
Microsoft , 1290 Avenue of the Americas (the AXA building - bet. 51st/52nd Sts.) , 6th floor

Directions:
B/D/F/V to 47th-50th Sts./Rockefeller Ctr
1 to 50th St./Bway
N/R/W to 49th St./7th Ave.

posted on Tuesday, 07 July 2009 07:48:33 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Monday, 06 July 2009

Last week I did the Agile Estimation session at the NYC Agile Firestarter. Thanks to Alex Hung for taking the video and posting it!

Some back story: all the presenters were trying to out do each other in making up words. :)

Agile Estimation from Alex Hung on Vimeo.

posted on Monday, 06 July 2009 09:05:04 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback
# Thursday, 25 June 2009

I have been to Nepal several times and trekked to the Everest Base camp twice. Since 2003, I have used a sherpa, Ngima, who totally rocks. Here is a photo of him on top of Mt. Everest:

DSC01433

While trekking to Everest base camp last year, Ngima invited me to come visit him at his home village Chyangba. I wanted to eat his mother’s cooking (dal bhat!) and visit the school children in his village. (They can help me improve my soccer skills.)

One thing led to another and it turns out that his Uncle, Pemba, is in the States and is working to build a school, library, and bring running water to the village. They are leading a trip this September that will raise money for the library via a US based charity called Elevation Education. We will be going to Chyangba with Ngima, Pemba, and Elevation Education on September 25th, to both raise money and do physical labor in the town. (Yes think of me giving up the laptop for a week and chopping wood and building a library.)

You can donate here. Please do.

posted on Thursday, 25 June 2009 10:49:41 (Eastern Daylight Time, UTC-04:00)  #    Comments [0] Trackback