About Marcelo Ruiz

Marcelo has been working as a software developer for more than 15 years. He has participated in projects for companies in USA, Mexico, Argentina, Europe and Africa. He is skilled with Microsoft technologies such as ASP.NET, MVC, C#, WCF and SQL Server, among others.

ASP.Net WCF: The service cannot be activated because it does not support ASP.NET compatibility

Estuve dando vueltas con este error desde ayer y fue algo que, ciertamente, me hizo perder mucho tiempo.

El error surge por una falta de conocimiento en la forma en que trabaja WCF y ASP.NET cuando corren dentro del mismo sitio.

WCF y ASP.NET puede correr side-by-side pero se debe habilitar el modo de compatibilidad. Si no se hace, va a aparecer el mensaje de error del título:

The service cannot be activated because it does not support ASP.NET compatibility

Ahí se nos invitará a modificar la propiedad aspNetCompatibilityEnabled a false. Pero esto no resuelve las cosas totalmente porque habrá cosas en nuestro servicio WCF que no funcionarán como esperamos.

El problema que estaba teniendo yo al hacer esto es que HttpContext.Current me estaba devolviendo siempre null en mi servidor de pruebas (IIS Express). En el servidor de producción (AWS) funcionaba bien.

El problema aquí es que el servicio no se estaba activando bien. Para esto hay que seguir los siguientes pasos:

1. En primer lugar, la propiedad aspNetCompatibilityEnabled tiene que estar en true en el web.config:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />

2. En segundo lugar, hay que importar el siguiente namespace:

using System.ServiceModel.Activation;

3. Y, por último, hay que decorar la clase de nuestro servicio de la siguiente manera:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService

De esta forma podremos acceder a HttpContext.Current sin problemas.

Para más información sobre este tema, recomiendo este post de Microsoft: WCF Services and ASP.NET.

Meet the customer

Working remotely has its benefits but sometimes is good for certain projects, to have a closer contact with the customers. In fact, meeting our customers is one of the key aspects of our methodology and we believe it is important to meet us in person at least once, specially for long term projects and relationships.

In many occasions we have travelled to work at the customers’ offices and in other opportunities the customer has travelled down here to meet with us.

In 2005 we received the first visit of a customer from the UK. We were working in his startup idea and he decided to rent a place here in Buenos Aires. It was a very productive move because we had the opportunity to work together for three months with the customer and other of his collaborators on the same table.

Preparing a demo for the customer in our office in Buenos Aires.

Preparing a demo for the customer in our office in Buenos Aires.

We have a long record of travels to Mexico as well. We usually provide services to customers in the automotive industries for their plants in Mexico. So we travelled many times to cities like Aguascalientes and Cuernavaca, places where automotive plants are very important. We travelled approximately 15 times to México for meetings, installations and support to our customers in Mexico. So there you have another skill in our set: we support spicy food like the best!

Trabajando en Cuernavaca.

Working in Cuernavaca.

A punto de entrar a trabajar en Aguascalientes.

All set to work in Aguascalientes.

Working from the datacenter in Mexico.

Working from the datacenter in Mexico.

Other destination we have travelled to many times is Texas. Mainly for meetings, planning and support, we have travelled to Dallas to work from the customer offices. The first time we went there was for a GOT (General Operation Testing) of a project we were building for another customer. We spent two weeks working with the users of the system, testing, reviewing the work done and gaining important feedback.

Travel to Dallas

Travel to Dallas

The latest trips we have done have been to Costa Mesa, California. We are working in a new project for a customer who makes printers so we decided to boost up the project with three weeks of intense work from his office. I travelled there with Jose, one of my partners, and it was very positive because not only could we meet the customer but we could also see the printers we were working with closely, perform real life tests and also visit one of the beta users of the system we were building.

Working from the customer's office

Testing the project at customer’s office.

Our work place in Costa Mesa, California.

Returning home after 3 weeks of work in USA.

Estaremos en Barcelona para los 15 años de Centraldev

Curiosamente, no estaremos en Buenos Aires para los 15 años de Centraldev sino que estaremos de viaje en Barcelona. Tenemos clientes en Madrid, pero no tenemos clientes en Barcelona por lo que si alguien de Barcelona desea comenzar a ser nuestro cliente, ¡aún está a tiempo para que lo invitemos una cena y unas cervecitas el día 3 de Agosto! 😀

What’s the difference between cheap and fair price outsourcing?

A fair price outsourcer will probably have a decent office to work from. A cheap one will probably work from his bedroom.

A fair price outsourcer will probably be able to pay someone to clean his office. A cheap one will have spend time to do the housework.

A fair price outsourcer will probably have decent equipment, update it frequently and maintain it. A cheap one will probably have constant problems with his/her equipment.

A fair price outsourcer will probably be able to pay a good internet connection. A cheap one will probably suffer disconnections every day.

A fair price outsource will probably be able to focus in your project without distractions. A cheap one will probably have to find additional side projects to make ends meet.

¡Se vienen los 15 años de Centraldev!

Ayer estaba aburrido y me puse a pensar… ¿cuántos años llevamos trabajando con Centraldev? Para hacer el cálculo sencillo, me fijé cuál fue la fecha en que registré el dominio y resultó ser… ¡3 de agosto de 2002! ¡O sea que este año cumplimos 15 años!

Me pareció increíble el número, pero cuando empecé a mirar hacia atrás, el cálculo es acertado.

Empezamos con la idea de este negocio en el año 2002 con Carola Kessler. Argentina había devaluado recientemente y quisimos aprovechar la oportunidad para trabajar para el exterior prestando servicios por Internet. Para la época, ¡algo totalmente novedoso!

El año 2002 fue un año principalmente de preparativos. Diseñamos nuestro primer logo y nuestro primer sitio web.

No recuerdo exactamente cuándo llegaron nuestros primeros clientes, pero sí recuerdo que fueron:

  • Ampli Red, una empresa de venta de equipamiento para TV por cable, la única que aún conserva el diseño original del 2002.
  • Mabel Iam, una autora de libros de autoayuda de Miami (nuestro primer cliente del exterior).
  • Sounder Labs, una empresa de fabricación de laboratorios de idiomas.

Más tarde seguimos con proyectos nacionales como Cinturón Negro, 123info y Fundación Habitat y Desarrollo, entre otros.

Me acuerdo cuando conseguí una vez un proyecto para desarrollar un “presupuestador online” para un estudio de diseño. Fue el primer proyecto “grande” que había conseguido. En esa época estaba también aprendiendo ASP.NET y con el dinero del adelanto me fui derecho a comprarme el libro “Programming ASP.NET”, de O’Reilly, un libro que me sirvió muchísimo.

Seguimos en 2003 y 2004 cada vez consiguiendo proyectos más grandes, como MegaOperadora, que nos tuvo ocupados durante casi un año. Y luego Lantern Books, una editorial de Nigeria, BuddyTips, que luego migraría a Exxset, nuestros siguientes proyectos para el exterior.

2005 fue un año de muchos desafíos, porque empezamos, tanto Carola como yo, a dedicarnos full-time a Centraldev. Continuamos la mayor parte del año trabajando duro con BuddyTips. Hacia fines de año conseguimos también nuestro primer proyecto “WinForms”, que resultó muy interesante y desafiante, a pesar de que duró poco.

En 2006 arrancamos trabajando para SoliSYSTEMS, una empresa de Texas con la cual continuamos trabajando regularmente hasta el día de hoy. Para ellos hicimos toda clase de proyectos, incluyendo los realizados para la industria automotriz mexicana. Pero continuamos trabajando en toda clase de proyectos para otros clientes que sería muy largo de enumerar.

Hoy estamos concentrados en el lanzamiento de una aplicación web para nuestro cliente de California, OmniPrint International, al mismo tiempo que estamos planeando nuevos proyectos propios.

Más cerca del cumpleaños prometo hacer un post más detallado sobre los proyectos realizados y quienes colaboraron.

Calculadora de Impuesto a las ganancias para autónomos

En diciembre del año pasado, inspirado en un proyecto publicado en el blog de Ariel Setton, una calculadora del impuesto a las ganancias para trabajadores en relación de dependencia, me puse a programar una calculadora específica para el caso de Autónomos.

La calculadora salió publicada primero en el blog de Ariel Setton, quien también colaboró en el desarrollo, y ahora la publico aquí, para el que no la haya visto.

Recuerden incorporar en los Gastos y Deducciones el monto que pagan en aportes de Autónomos.

Recuerden incorporar en los Gastos y Deducciones el monto que pagan en aportes de Autónomos.

So 2016 is ending in Centraldev!

Working at OmniPrint

You know, I’m always super busy and have no time to write in the blog, but I wanted to close the year (today is December 31st, by the way) with a summary of all we have done in 2016.

I started the year in Mexico, closing a deal for a new project that started in March and ended very abruptly in May. You will find odd clients from time to time and I’m used to that since I started in this business. I’m experienced enough to know it was not my fault, and I let my partners know that they are not guilty if we happen to run across one of this specimens.

Working at OmniPrint

At the same time, we continued working for OmniPrint, one of our customers in California in two projects. By July we were invited to travel to Los Angeles for reasons of these projects with my partner José. We spent 20 days of August having meetings, planning and working there. We continued working in the improvements discussed in those meetings and we are close to launch the products we are still working on.

We have also worked in projects for our customers in Argentina like the new websites of Consultora Paradigma, CICYP, Fundación Hábitat y Desarrollo and Print a Lot.

Finally, we have also worked in smaller gigs for some old and loyal customers: SoliSYSTEMS (10 years as customer this March!) from Texas, SiteJabber from San Francisco and Agilink from Louisiana.

Next year we expect the final launch of the products we have been working on during 2016 and many new exciting projects.

Happy new year!!

Tutorial: Accedé a la API de Foursquare con PHP

En este tutorial veremos un ejemplo bastante simple sobre cómo acceder a la API de Foursquare desde PHP.

El primer paso es registrar una aplicación. No importa que se trata de una aplicación de prueba. Lo importante es tener definido ya el servidor donde la alojaremos. Para esto vayan a la URL https://es.foursquare.com/developers/register.

Captura de pantalla 2015-01-28 a las 16.28.33

Allí, completen los datos que les piden para su aplicación y obtendrán los dos datos más importantes: el client_id y el client_secret. Estos datos los deben resguardar ya que son las credenciales de autenticación de su aplicación.

Ahora sí, ya pueden empezar a programar.

Básicamente, la interacción con Foursquare se maneja de la siguiente manera:

Se dirige al usuario a la página de autorización de Foursquare (https://foursquare.com/oauth2/authenticate). Aquí el usuario deberá autorizar el acceso de nuestra aplicación a su cuenta de Foursquare. Para esto, el usuario deberá loguearse con sus datos de Foursquare, si es que ya no está logueado.

Para esto, le proveemos al usuario de un link en nuestra aplicación hacia la siguiente URL:

 https://foursquare.com/oauth2/authenticate?client_id=<?=CLIENT_ID?>&response_type=code&redirect_uri=<?=REDIRECT_URI?>

Observen que debemos pasar dos parámetros: el client_id y la URL a donde queremos que Foursquare nos devuelva la respuesta.

Una vez que el usuario haya autorizado a nuestra aplicación, Foursquare nos devolverá un “code” en un parámetro de querystring, a la redirect_uri. Por ejemplo, http://redirect_URI/?code=XXX.

Con este code, el cual puede ser diferente con cada autenticación, deberemos obtener el token del usuario. Para esto llamaremos a la siguiente URL:

https://foursquare.com/oauth2/access_token
?client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET
&grant_type=authorization_code
&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
&code=CODE

En este caso, la respuesta será en JSON:

{ access_token: ACCESS_TOKEN }

Si vamos a guardar los usuarios en una base de datos, querremos también guardar este token con él.

Veamos cómo realizar esto con PHP:

if (isset($_GET['code'])) 
{
 $response = file_get_contents('https://foursquare.com/oauth2/access_token?client_id='. CLIENT_ID .'&client_secret='. CLIENT_SECRET .'&grant_type=authorization_code&redirect_uri=https://centraldev.net/4sqtest/index.php&code='.$_GET['code']); 
 $obj = json_decode($response);
 echo '<p><a href="index.php?page=checkins&access_token='. $obj->{'access_token'} .'">Ver checkins</a></p>';
}

Aquí vemos como accedemos a un bloque if al recibir el parámetro code por querystring y luego obtenermos el token. Seguidamente, utilizamos este token (en $obj->{‘access_token’}) para mostrar un link a otra página de nuestra aplicación que realizará otra tarea.

El siguiente paso ya es la interacción con los diferentes métodos de la API.

Por ejemplo, si queremos obtener todos los checkins de un usuario, podemos llamar al siguiente método:

https://api.foursquare.com/v2/users/self/checkins?v=20150128&oauth_token=TOKEN

Aquí vemos cómo obtener los checkins con PHP:

$url = 'https://api.foursquare.com/v2/users/self/checkins?v=20150128&oauth_token='. $access_token;
$response = file_get_contents($url);
$obj = json_decode($response);

Aquí ya tendremos los datos de los últimos checkins en la variable $obj. Aquí deberemos hacer referencia a la documentación para conocer cómo está estructurada la información JSON en esta variable.  Para esto podemos ir a la página que documenta el método (en este caso, https://developer.foursquare.com/docs/users/checkins) y allí hacer click en el botón Try it out para ver un ejemplo de utilización y los datos retornados.

Por ejemplo, para recorrer todos los checkins, podemos hacer lo siguiente:

foreach ($obj->{'response'}->{'checkins'}->{'items'} as $item)
{
  echo '<p><a href="https://es.foursquare.com/v/'.$item->{'venue'}->{'id'}.'">'. $item->{'venue'}->{'name'} .'</a> ('. 
 $item->{'venue'}->{'location'}->{'city'} .', '. $item->{'venue'}->{'location'}->{'country'} .') - '. 
 date('M Y', $item->{'createdAt'}) .'</p>';
}

De esa forma imprimiremos una lista de todos los checkins recientes.

Para un ejemplo de uso completo, he armado una pequeña aplicación de una página que lista todos los checkins realizados bajo la categoría “Hoteles”. El mismo puede ser encontrado aquí: https://centraldev.net/4sqtest/

El código fuente lo pueden bajar de https://centraldev.net/4sqtest/index.php.zip con la salvedad de que deberán crear un archivo config.php donde deberán definir dos constantes CLIENT_ID y CLIENT_SECRET con las credenciales de su aplicación, como se muestra a continuación:

<?
define('CLIENT_ID', 'XXX');
define('CLIENT_SECRET', 'XXX');
?>

 

How to run a SQL Server script from the command line

To run the script file

  1. Open a command prompt window.
  2. In the Command Prompt window, type: sqlcmd -S myServer\instanceName -i C:\myScript.sql
  3. Press ENTER.

To save this output to a text file

  1. Open a command prompt window.
  2. In the Command Prompt window, type: sqlcmd -S myServer\instanceName -i C:\myScript.sql -o C:\EmpAdds.txt
  3. Press ENTER.

No output is returned in the Command Prompt window. Instead, the output is sent to the EmpAdds.txt file. You can verify this output by opening the EmpAdds.txt file.

How to download SQL Server Express, the easy way

For some not easy to understand reason, Microsoft has made downloading SQL Server Express very difficult. According to this blog post, you have to go through 12 steps to download SQL Server Express 2014.

Luckily, Scott Hanselman has put togetter a page where you will find all the direct links you’ve always wanted. So here you have the SQL Server Express download page, just 1 click away!

http://downloadsqlserverexpress.com