¡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=http://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í: 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:

<?
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

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.

Hyperlapse y el aluvión de videos acelerados

Ayer salió Hyperlapse, una nueva aplicación de Instagram promocionada como “U$S 15.000 de equipo profesional en la palma de tu mano”. Imagino que los profesionales se deben estar matando de la risa al ver esto. ¡Ojo! La aplicación me parece fantástica, pero la afirmación es cuanto menos un poquito exagerada.

Ahora, suponiendo que tenemos U$S 15.000 de equipo profesional, me parece que lo que queda demostrado es que, si no lo sabés usar, el resultado final va a seguir siendo pésimo. Y eso se pudo demostrar con el primer aluvión de videos de Hyperlapse. Lejos de las demos promocionales del producto, no llegué a ver ni un solo video que esté bueno.

Dejenme decirles que antes de que saliera esta app ya me gustaban mucho los videos en estilo timelapse o hyperlapse, lo cual lo pueden ver chusmeando mis favoritos de Vimeo. Esto no significa tampoco que me considere un experto en el tema. Pero los videos que vi ayer y hoy realizados con Hyperlapse están muy lejos de los resultados que, creo, los creadores de la app esperaban. Lo que más ví fueron videos caóticos de gente haciendo piruetas y monerías a 10x, que no parecen más que un sketch de Benny Hill o bien videos súper movidos con la excusa de que la app corregirá esas variaciones.

Mi punto es que la aplicación, creo yo, no sirve para eso sino que se pensó para lograr un efecto en particular, que es del hyperlapse. En este efecto, que no lo inventó Instagram, sino que es viejo (http://en.wikipedia.org/wiki/Hyperlapse), se trata de tomar repetidas fotografías alrededor de un punto fijo, mientras se mueve la cámara de posición, generalmente, una distancia grande. Esto es diferente al método de timelapse, donde la cámara está fija durante mucho tiempo para generar videos de escenas tales como puestas del sol, movimiento de gente en una ciudad, etc. En ambos casos se repite la constante de que un punto en la película es fijo. Esto no significa que la app Hyperlapse se pueda utilizar de otras formas creativas, pero creo que esta es la que más podremos aprovechar.

Otra forma de uso de la aplicación es para el seguimiento de un objeto que se desplaza, aprovechando para esto la característica más comentada de la misma, que es la estabilización. Yo creo que esta es una característica correctiva para el inevitable efecto que se daría en estos videos del movimiento al filmar un video largo. Esto significa que no pensemos que podemos hacer videos mientras saltamos y bailamos. Si usamos esta aplicación, la idea, es que los videos no se sacudan. La característica de estabilización es simplemente una ayuda.

Algunas ideas que se me ocurren para lograr los mejores efectos:

  • Se logran muy buenos efectos al moverse alrededor de un objeto fijo lo más lento y estables posibles, mientras aceleramos el entorno a gran velocidad. En realidad, estaremos acelerando todo, por eso, mientras más lento filmemos al objeto fijo, mejor.
  • Si vas a acelerar el video, asegurate de grabar una buena cantidad de minutos. La misma aplicación te informa, mientras estás grabando, cuál será la duración final a 6x.
  • Existen tres formas de lograr los mejores efectos: Primero, filmando un punto fijo, con la cámara quieta. Segundo, filmando un punto fijo, moviendo la cámara y siguiéndolo. Tercero, siguiendo un objeto en movimiento.
  • No abuses de la función de estabilización, o sea, tratá de estabilizar lo más posible con la mano.

Para finalizar, les dejo dos videos que hice con la app Hyperlapse.

El primero consiste en una filmación alrededor de una estatua. La hice caminando, lentamente, y tratando de mantener siempre la estatua lo más en el centro posible.

El segundo es otra escultura pero, a diferencia de la anterior, en esta se ve movimiento del entorno a alta velocidad.

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.