¡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:

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:

En este caso, la respuesta será en JSON:

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:

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:

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

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:

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í: http://centraldev.net/4sqtest/

El código fuente lo pueden bajar de http://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:

 

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

The 5 Types of Prospects

1. The Most Aware: Your prospect knows your product, and only needs to know “the deal.”

2. Product-Aware: Your prospect knows what you sell, but isn’t sure it’s right for him.

3. Solution-Aware: Your prospect knows the result he wants, but not that your product provides it.

4. Problem-Aware: Your prospect senses he has a problem, but doesn’t know there’s a solution.

5. Completely Unaware: No knowledge of anything except, perhaps, his own identity or opinion.

Plastc, una multitarjeta digital

Plastc Card_front_and_back

Si somos sinceros, a más de uno de le ocurrió alguna vez tener una tarjeta única para todo. Plastc es la primera implementación de esta idea hecha realidad. A simple vista, parece una tarjeta más para nuestra billetera, pero es mucho más que eso.

Plastc cuenta con un display LCD monocromático táctil, chip de smart card, chip de RFID y chip de memoria flash. Todo integrado en la medida estándar de una tarjeta de crédito común y corriente (si bien hay que darle crédito a la empresa estadounidense que lo ideó, no podemos dejar de admirar también a los chinos te fabrican cualquier cosa!).

La tarjeta funciona en conjunto con un smartphone mediante el cual podemos registrar hasta 20 tarjetas. Todo esto es alimentado con una batería que se recarga por inducción y tiene una vida útil de hasta 30 días.

El funcionamiento se basa en emular las tarjetas que queremos utilizar. Para esto, basta seleccionarla desde la pantalla táctil y estará lista para funcionar ya sea como tarjeta de crédito, débito o tarjeta de millas o puntos. Básicamente, puede emular cualquier tarjeta que tenga banda magnética, chip o código de barras.

Sinceramente, no me he adentrado en los conceptos tecnológicos, pero me imagino que, para hacerlo, tienen que haber establecido algún tipo de acuerdo con las entidades financieras de las tarjetas que buscan emular.

El producto estará disponible a mediados del 2015, pero ya se están tomando órdenes por 155 dólares.

Cómo determinar la paridad de claves para encriptación con DES

Un tema que resulta confuso es determinar si una clave DES es odd parity o even parity. El algoritmo DES generalmente se utiliza con claves odd parity ya que son más seguras. Un criptograma creado con una clave even parity es más fácil de desencriptar.

Primero, para que nos pongamos de acuerdo, traduzcamos:

  • Even: par
  • Odd: impar (odd también significa extraño o raro, en inglés).

La condición para que una clave sea odd, es que cada uno de sus bytes sea odd. Si esta condición no se cumple, entonces es even.

  • Si todos los bytes son odd, la clave es odd y es aceptada.
  • Si al menos un byte es even, la clave es even y es rechazada. Algunos sistemas pueden hacer un ajuste para convertirla en odd.

Luego, la condición de odd o even de un byte se determina así:

  • Si el número de “1” en su representación binaria es impar, entonces el byte es odd.
  • Si el número de “1” en su representación binaria es par, entonces el byte es even.

Finalmente, el algoritmo para ajustar una clave even a odd debería ser byte a byte: Si un byte es even, se convierte ese byte a odd. Así para cada uno de los 8 bytes (para una clave single length). La forma en que se debería hacer este ajuste es el siguiente:

  • Si el número de “1” desde el bit 1 al 7 es impar (odd), se setea el bit 8 en “0”. Con esto se obtiene una cantidad impar de “1” en todo el byte, dejandolo odd.
  • Si el número de “1” desde el bit 1 al 7 es par (even), se setea el bit 8 en “1”. Con esto se obtiene una cantidad impar de “1” en todo el byte, dejandolo odd.

En todos los casos, se entiende que el bit 1 es el de la izquierda y el 8 el de la derecha.

Uso de Branches y Tags con SVN

El uso de branches y tags en SVN nos permite una mejor organización del trabajo en equipo. Si bien no muchos usuarios de SVN utilizan esta funcionalidad su uso trae varias ventajas.

Branches

Los branches se utilizan cuando se desea crear una rama independiente de desarrollo para trabajar en alguna funcionalidad nueva de un proyecto que todavía no se quiere incorporar a la línea principal. De esta forma, se crea una copia del proyecto en una carpeta /branches y el programador encargado de esta nueva característica cambiará (switch, según la terminología de SVN) su working copy a este nuevo branch y trabajará sobre este.

Cuando este programador realice operaciones de commit las realizará sobre su branch, sin afectar el desarrollo principal. Cuando esté listo para integrar sus cambios a la línea de trabajo principal, realizará una operación de merge.

Tags

El uso de tags se da cuando queremos “marcar” una determinada revisión por alguna razón en especial. Por ejemplo, podemos querer marcarla porque se trata de un release entregado al cliente. En este caso, como en el anterior, se crea una copia de la revisión deseada del repositorio en la carpeta tags. Técnicamente la creación de un branch y un tag es idéntica, ya que se realizan con el comando svn copy. La diferencia radica en la forma en que se les da su uso; en los branches está permitido realizar commits y en los tags no. Esta “prohibición” sobre la realización de commits o no es virtual, ya que no existe impedimento técnico sino que son los programadores los que lo deben tener en cuenta.

Creación y uso de branches y tags

El comando para la creación, tanto de branches como tags, es svn copy:

Si trabajamos con Tortoise SVN es aún más fácil, ya que tenemos un comando Branch/tag. Con Tortoise SVN tan solo tenemos que hacer clic derecho sobre nuestra working copy y elegir el comando Branch/tag. Tortoise reconocerá la URL de origen en el repositorio y nos pedirá la URL de destino, donde queremos hacer la copia.

En la ventana para crear un nuevo branch o tag, también tenemos un checkbox que podemos marcar para automáticamente hacer el switch al branch o al tag recientemente creado. De no hacerlo, podremos realizar el switch en cualquier otro momento con el comando homónimo.

Finalmente, para reintegrar un branch a la línea de desarrollo principal, recurrimos al comando Merge.

Estructura de directorios recomendada

La estructura de directorios recomendada por SVN, para la raíz de nuestros repositorios es de tres carpetas:

  • /trunk: este directorio aloja la línea de desarrollo principal.
  • /tags: en esta carpeta guardamos los tags que vayamos creando, por ejemplo /trunk/release-1.2/.
  • /branches: en esta carpeta guardamos los branches que creemos.

Es una buena práctica seguir esta estructura, aunque aún no hayamos decidido trabajar con branches y tags ya que de decidirlo más adelante será más complicado cambiarlo.