Wednesday, May 28, 2014

What Xamarin 3 means to the future of Mobile Development


It was just a few hours ago that Xamarin release Xamarin 3.  With this announcement they have yet again revolutionized the way we write cross-platform mobile applications.

The announcement first highlights the Designer for iOS, which is awesome, but I want to take a step forward, and instead talk about what I think Xamarin.Forms will do for your future mobile development efforts.

Some background: For the last few months my company worked and developed an internal MVVM framework that provides services such as Navigation, Bindings,  Loosely-coupled messaging, mobile optimized Dependency Injection, List Controls for effortless displaying data, etc.  to be used in our projects because we believe these are things that real apps need, and what was available at the time did not fit our style of MVVM development,  so we rolled our own. Were were in the process of rolling out support for Windows Phone and were very excited to what we would be able to accomplish with this newly created framework when creating apps for all 3 platforms.  

While you might think that today's announcement would be annoying, or bittersweet to us, it is quite the contrary. We no longer have to maintain and evolve our framework, and instead we can focus on applying all we learned while creating this -yet to be named- framework, and instead extend (if needed) what Xamarin has just rolled out.

Sample UI on all 3 Platforms.
One of the immediate advantages of Xamarin.Forms over other frameworks (including our own) is that these services work on not only on the two (iOS and Android) but 3 mobile platforms (Windows Phone), and it promises the ability to achieve the quintessential  100% Code sharing.

"That's not something new" - You might say; and I would have to agree with you. MVVMCross (the most well known mvvm framework in the Xamarin ecosystem) does that.  But where Xamarin.Forms has no comparison is, in that  it attempts (and in my mind succeeds)  to bring XAML one step closer to being in all the mobile platforms (Something Microsoft just recently started doing).

XAML in itself is might not sound like a big win for seasoned iOS and Android developers, but think for a moment in the millions of developers who are already familiar with Microsoft technologies and UI creating in WPF, Silverlight and WP8. These guys already are already familiar with constructs such as Page Based UIs, Navigation Services, Two-way Bindings,  Data Templates, etc.

I invite you not just to believe me, and go try it yourself. The framework is already available today and let me know how awesome it it!!


Tuesday, May 27, 2014

Lo que Xamarin 3 significa para el futuro de desarrollo móvil


Hace pocas horas que Xamarin lanzó oficialmente Xamarin 3. Con este anuncio acaban de una vez más revolucionar la forma en que escribimos aplicaciones móviles multi-plataforma.

El lanzamiento primero subraya el nuevo diseñador de pantallas para iOS en Visual Studio, el cual es sorprendente, pero por ahora vamos a avanzar un paso hacia adelante para hablar de Xamarin.Forms y lo que yo pienso logrará para tus futuros proyectos de desarrollo móvil.

Información de contexto:Por gran parte del ultimo año mi compañía  desarrolló un framework interno basado en el patrón MVVM (Model, View, ViewModel) que provee servicios como Navegación, Bindings,  Loosely-coupled messaging, mobile optimized Dependency Injection, List Controls para desplegar datos facilmente, etc.  Este framework fue utilizado en varios de nuestros proyectos para clientes ya que cuando se crean apps de verdad, estos servicios son necesarios, y en aquel momento lo que estaba disponible no encajaba en nuestro estilo de desarrollo MVVM, así que creamos nuestro propio framework.  Recientemente estabamos en el proceso de implementar la funcionalidad para Windows Phone y estábamos super contentos con el potencial que tendría dicho framework para crear aplicaciones para las tres plataformas (iOS, Android y Windows Phone).

Mientras que podrías pensar que el anuncio del día de hoy es fastidioso para nosotros, tengo para contarte que es todo lo contrario. Ya no tendremos que mantener y evolucionar nuestro framework, y en su lugar nos podemos enfocar en aplicar todo lo que aprendimos al crear esta todavía-no-nobrada librería (y extender la de Xamarin, en caso de necesitarse).

Una de las ventajas imediatas de Xamarin.Forms sobre todas las demás librerías (incluyendo la nuestra) es la de incluye todos estos servicios para no solo las dos plataformas para los que ellos tiene productos (iOS y Android) pero también para Windows Phone, y promete la habilidad de alcanzar 100% de re-utilización de código.

"Esto no es nada nuevo" - Diría un lector incrédulo - Melvyn Perez- Y tendría que darte la razón. Ya existen librerías que logran traer estos servicios al eco sistema de Xamarin; MVVMCross siendo la más conocida. Pero donde Xamarin.Forms se "come los bizcochitos" (modismo Dominicano que significa ser superior) es en el hecho de que logra traer a XAML un paso más cerca de estar presente en todas las plataformas móviles. Algo que Microsoft ha estado empujando desde hace tiempo y recientemente ha logrado en la plataforma Microsoft con Universal Apps.

XAML per se no suena como un gran logro si eres un developer de iOS y/o Android, pero toma un momento y piensa sobre los millones de desarrollador@s que ya están familiarizados con tecnologías Microsoft para crear Interfaces de Usuario (UI por sus siglas en Inglés) en WPF, Silverlight y Windows Phone. Est@s developers ya tienen mucha experiencia con conceptos como Pages, Navegación, Bindings, Data Templates y otros.

Yo los invito a que no me crean y los traten por ustedes mismos. El framework ya está disponible  hoy. ¡¡Me dejan saber lo formidable que es!!!

Versión traducida del articulo original en inglés.

Sunday, October 27, 2013

Creating Netflix-like UI for iOS with Xamarin.iOS and Nuclios

A Xamarin.iOS version of the XCode-based sample Creating a Netflix style iOS Grid with C#, Xamarin.iOS and NucliOS by Stephen Zaharuk.


While checking out my usual late afternoon reading stream (using Flipboard), I found this great article on how to put together a very sexy UI utilizing Infragistics's iOS Controls; it instantly occurred to me that this would be a great idea for an article. It was almost muscle memory, because I found my hands spinning a browser window open to my favorite Search engine - Bing.com - and typing the keywords "Nuclios Monotouch Bindings". To my surprise the product already ships with Xamarin.iOS bindings out of the box.
Innovative Functionality Meets iOS Familiarity
Take advantage of a powerful API that is familiar to all iOS developers. You can use NucliOS controls in native iOS projects built with Objective C and Xcode. You can even build in C#; with Xamarin.ioS support, NucliOS includes final MonoTouch bindings for all of our iOS controls.
And so the journey begins. Steve has done a great job of explaining in detail the implementation, so I won't bore you with the details. Instead I will highlight what things to keep in mind when "translating" code developed with XCode and Obj-C to the stuff dreams are made of (C# and Xamarin.iOS).
// Obj-C Implementation of the model 

@interface NetflixData : NSObject
       @property (nonatomic, retain)NSString* category;
       @property (nonatomic, retain)NSMutableArray* media;
       @property (nonatomic, assign)CGFloat scrollPosition;
@end 
1-Remember to add the [Export()] Attribute to your properties in your NSObject derived classes. This will allow the under-laying native implementation to use the properties of your Data Model.
public class NetflixMedia: NSObject
    {
        [Export("ImageUrl")]
        public string ImageUrl {
            get;
            set;
        }

        [Export("Title")]
        public string Title {
            get;
            set;
        }

        [Export("Genre")]
        public string Genre {
            get;
            set;
        }
    }
2 - Use the WeakDelagate property WeakDataSource
 //NucliosViewController.cs  - Obj-C
 _gridView.WeakDataSource = _ds;
...
Instead of..
//NucliosViewController.m  - Obj-C
_gridView.dataSource = _ds;
...
3- When creating creating overloaded constructors, remember to extract any initialization code to a separate method, so you can call it (and don't try to code on an empty stomach).
public class MediaCell:IGGridViewCell
{
    public MediaCell (string identifier): base(identifier)
    {
        Init ();
    }
4- This is not a required thing, but If you find something that just doesn't make sense to "translate" and you can make it better, then do it. That's the case of the code used to consume iTunes Web services. I wasn't going to simply translate line by line.
//Obj-C +(NSMutableArray*)generateData { NSMutableDictionary* mediaLookup = [[NSMutableDictionary alloc]init]; NSMutableArray* netFlixData = [[NSMutableArray alloc]init];
NSString* rootUrl = @"https://itunes.apple.com/search?term=%@&media=movie&entity=movie&limit=600&attribute=releaseYearTerm";

NSArray* keys = @[@"2012", @"2013"];

for(NSString* key in keys)
{
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:rootUrl, key]];

    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSArray* results = [json valueForKey:@"results"];

    if(results != nil)
    {
        for(NSDictionary* mediaInfo in results)
        {
            NSString* genre = [NSString stringWithFormat:@"%@", [mediaInfo valueForKey:@"primaryGenreName"]];

            NSString* url = [mediaInfo valueForKey:@"artworkUrl100"];

            MediaItem* media = [[MediaItem alloc]init];
            media.title = [mediaInfo valueForKey:@"trackName"];
            media.imgUrl = [NSURL URLWithString:url];

            MediaData* nfd = [mediaLookup valueForKey:genre];
            if(nfd == nil)
            {
                nfd = [[MediaData alloc]init];
                nfd.genre = genre;
                nfd.media = [[NSMutableArray alloc]init];
                [mediaLookup setValue:nfd forKey:genre];
                [netFlixData addObject:nfd];
            }

            [nfd.media addObject:media];
        }

    }
}


return netFlixData;
//C#
async Task> GetData () { var movies = new List (); var url = "https://itunes.apple.com/search?term={0}&media=movie&entity=movie&limit=600&attribute=releaseYearTerm";
        var client = new HttpClient ();

        var response = await client.GetAsync (string.Format (url, "2013"));
        var stringData = await response.Content.ReadAsStringAsync ();
        var json = JsonObject.Parse (stringData);

        var results = json["results"];

        foreach(JsonValue movie in results)
        {
            movies.Add (new NetflixMedia(){
                Title = movie["trackName"],
                ImageUrl = movie["artworkUrl100"],
                Genre = movie["primaryGenreName"],
            });

        }
        return movies;
    }

Our UI

Netflix  UI


Netflix

Wednesday, May 15, 2013

Creando un UI como la de Netflix para iOS con C#, Xamarin iOS y NucliOS


Este articulo es una adaptación del articulo en inglés "Creating a Netflix style iOS Grid with C#, Xamarin.iOS and NucliOS".
Repositorio en Github.
Mientras me relajaba un poco, leyendo un poco de mi lista de lectura (via Flipboard), encontré este interesante articulo de como crear una Interfaz de Usuario utilizando la libreria INucliOS de Infragistics. Casi instantaneamente se me ocurrió que sería una buena idea para un articulo a mi blog. De pronto, casi como segunda naturaleza ya mis manos se desplazaban hacia el teclado, abrieron una ventana de IE 10 y buscaron -vía Bing - por los terminos de busqueda "NucliOS MonoTouch Bindings". Para mi sorpresa, el producto ya viene con los "bindings" para Xamarin.iOS en la descarga oficial. 
Es aquí cuando comienza la travesía. Como parte del trabajo de este articulo está basado en un articulo publicado por Stephen Zaharuk, bajo el titulo "Creating a Netflix style iOS Grid", no les aburriré con los detalles; en vez, les monstraté como tomar el original y crear un UI similar en Xamarin.iOS sin mucho esfuerzo. 
Aquí están las cosas que deben de tener en cuenta cuando "traducen"  código en Obj-C y XCode al glorioso C# y Xamarin.iOS. 

// Obj-C Implementation of the model 

@interface NetflixData : NSObject
       @property (nonatomic, retain)NSString* category;
       @property (nonatomic, retain)NSMutableArray* media;
       @property (nonatomic, assign)CGFloat scrollPosition;
@end 

1- Recuerda decorar con el atributo[Export()] a las propiedades de tus objectos que derivande NSObject. Esto le permitirá a la implementación nativa usar las propiedades de tu modelo de datos.

public class NetflixMedia: NSObject
    {
        [Export("ImageUrl")]
        public string ImageUrl {
            get;
            set;
        }

        [Export("Title")]
        public string Title {
            get;
            set;
        }

        [Export("Genre")]
        public string Genre {
            get;
            set;
        }
    }


2 - Usa la propiedad WeakDelagate que se llama WeakDataSource
 //NucliosViewController.cs  - Obj-C
 _gridView.WeakDataSource = _ds;
...
Instead of..
//NucliosViewController.m  - Obj-C
_gridView.dataSource = _ds;
...
3- Cuando crees "constructores sobrecargados", recuerda extraer el código de inicialización a un metodo aparte (eso es puro sentido común), y por último no trates de escribir código con el estomago vacío, que el "Malcomío no piensa".
public class MediaCell:IGGridViewCell
{
    public MediaCell (string identifier): base(identifier)
    {
        Init ();
    }
4- Y por último, si encuentras algo escrito de forma que no hace sentido reproducirlo tal cual, luce lo que sabes y re-escribelo, y utiliza lo que está de punta (Async) y echa vainas a tus colegas.
//Obj-C
+(NSMutableArray*)generateData
{
NSMutableDictionary* mediaLookup = [[NSMutableDictionary alloc]init];
NSMutableArray* netFlixData = [[NSMutableArray alloc]init];

NSString* rootUrl = @"https://itunes.apple.com/search?term=%@&media=movie&entity=movie&limit=600&attribute=releaseYearTerm";

NSArray* keys = @[@"2012", @"2013"];

for(NSString* key in keys)
{
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:rootUrl, key]];

    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSArray* results = [json valueForKey:@"results"];

    if(results != nil)
    {
        for(NSDictionary* mediaInfo in results)
        {
            NSString* genre = [NSString stringWithFormat:@"%@", [mediaInfo valueForKey:@"primaryGenreName"]];

            NSString* url = [mediaInfo valueForKey:@"artworkUrl100"];

            MediaItem* media = [[MediaItem alloc]init];
            media.title = [mediaInfo valueForKey:@"trackName"];
            media.imgUrl = [NSURL URLWithString:url];

            MediaData* nfd = [mediaLookup valueForKey:genre];
            if(nfd == nil)
            {
                nfd = [[MediaData alloc]init];
                nfd.genre = genre;
                nfd.media = [[NSMutableArray alloc]init];
                [mediaLookup setValue:nfd forKey:genre];
                [netFlixData addObject:nfd];
            }

            [nfd.media addObject:media];
        }

    }
}


return netFlixData;

//C#
async Task<IList<NetflixMedia>> GetData ()
    {
        var movies = new List<NetflixMedia> ();
        var url = "https://itunes.apple.com/search?term={0}&media=movie&entity=movie&limit=600&attribute=releaseYearTerm";

        var client = new HttpClient ();

        var response = await client.GetAsync (string.Format (url, "2013"));
        var stringData = await response.Content.ReadAsStringAsync ();
        var json = JsonObject.Parse (stringData);

        var results = json["results"];

        foreach(JsonValue movie in results)
        {
            movies.Add (new NetflixMedia(){
                Title = movie["trackName"],
                ImageUrl = movie["artworkUrl100"],
                Genre = movie["primaryGenreName"],
            });

        }
        return movies;
    }

El resultado final


Wednesday, August 15, 2012

Código, Presentaciones y Fotos de CodeCampSDQ 2012

Me complace reportar que el evento CodeCampSDQ fué un éxito.
Gracias a todos los que contribuyeron con su granito de arena para que este evento fuese exitoso.

El evento comenzó a las 9:30 AM, y acabó a las 4:00 PM. A este acudieron 30 profesionales del desarrollo, entre ellos varios ex-alumnos del Instituto Técnico Salesiano y el Instituto Tecnológico de Las Américas.

Los temas a tratar en este primer CodeCamp fueron:

  • Desarollo de aplicaciones Web con ASP.NET MVC 4, por Alexander Matos
  • Desarrollo de aplicaciones para iOS con C# y .NET usando MonoTouch, por Claudio Sanchez



Si el widget de SkyDrive no te funciona; para ver el código, presentaciones y fotos, eche un vistazo aquí

Wednesday, February 8, 2012

How to get a job with Microsoft, Apple or Google

I recently read a very interesting article about how to get yourself noticed in the “Major Leagues” . The article is by Gayle Laakmann McDowell, who herself has worked at four of today’s big tech companies the likes of Apple, Google and Microsoft.
Here is a short version of the 9 Reasons.
  • Go to an elite school (or associate with one).
  • Intern early, and relevant to your career (knowing how to flip burgers doesn’t make you a better coder).
  • Major in something relevant.
  • Community service means: do Tech work for free, not in a soup kitchen.
  • Learn how to write (oops, that is why I could never land one of those Winking smile).
  • Be a teacher’s pet. They write good recommendation letters.
  • Be a generalist.
  • Be an entrepreneur, innovate or deliver results.
  • no one cares if you have a 4.0 GPA.
At the end of the day, make sure that whatever you do is transferable to the next step/job in your career.

Friday, December 30, 2011

MSDN Training Courses

Microsoft’s DPE Team has put together some great training courses available for download. It is always good to “sharpen the tools”, and this would be a great starting point for learning a new skill or sharpen the already developed one.

Some of the ones that caught my eye are:

  Link to Training Courses: http://msdn.microsoft.com/en-us/gg299335