Entradas

Mostrando las entradas con la etiqueta útiles

Finanzas.app

Imagen
Como comentaba Rodrigo en su blog Neurona Financiera , el registro de nuestros gastos es fundamental si queremos tener controladas nuestras finanzas. Yo también pasé como él por varias etapas: una planilla Excel, un programa Visual Fox Pro hecho con GeneXus 9.0 que después migró a .Net, una aplicación web en Google App Engine. Finanzas.app es la siguiente iteración en este ciclo, está desarrollada en GeneXus Tilo B3 , y es una aplicación que funciona completamente desconectada. El hecho de que sea Offline es el punto fuerte de la aplicación. Seguramente no se compara en funcionalidad con las alternativas (por ejemplo ZetaCuentas por nombrar otra hecha con GeneXus), pero me permite tener los datos locales sin que intervenga un tercero. No me considero extremadamente paranoico, pero cuando hablamos de dinero, prefiero no darle la información a otros... Cómo obtener la aplicación La aplicación la estoy desarrollando para uso personal, por lo que no me interesa distribuirla en fo...

Respaldo de la base de datos Offline en iTunes

Imagen
El escenario principal para las aplicaciones Offline que generamos con GeneXus, se tiene un componente en el servidor donde se centralizan los datos ingresados en cada uno de los dispositivos. En este escenario no es imprescindible hacer un respaldo de la base de datos Offline, ya que la misma siempre se puede volver a construir a partir de los datos del servidor. Sin embargo, el generador Offline permite otro escenario donde sí puede ser importante tener respaldo de los datos: cuando la aplicación es completamente Offline y no tiene componente en el servidor. Si bien acceder al sistema de archivos del iPhone se puede, no hay una forma "nativa" de hacerlo. Hay aplicaciones que exponen dicho sistema de archivos a la Mac o al PC, pero en general tienen algún costo. En particular para la base de datos Offline, como se almacena en la carpeta Documents que es una carpeta especial dentro de la aplicación, es posible copiar el archivo desde iTunes como se explica en este ...

Xcode: debug de aplicaciones que usan localización

Imagen
Para la versión Beta 3 de GeneXus Tilo (a liberarse cerca de fin de año...), estuve trabajando en una funcionalidad que llamamos Proximity Alerts, que es parte de la Geolocation API . No es el objetivo de esta nota explicar la funcionalidad, pero merece por lo menos un comentario. Consiste básicamente en definir regiones dadas por un punto geográfico y un radio en metros, y cuando el dispositivo ingresa a una de estas regiones se dispara un evento en la aplicación. La funcionalidad en sí no es difícil de implementar, pero es bastante difícil hacer debug... Por suerte y gracias a Fabián , aprendí algunas cosas de Xcode y del simulador de iOS que facilitan un poco la tarea. Xcode En Xcode, en el Scheme de la aplicación (Product > Scheme > Edit Scheme... > tab Options) tenemos la opción de decirle a la aplicación que inice en una ubicación determinada, y también tenemos la posibilidad de pasarle un archivo GPX para que el simulador vaya cambiando de ubicación siguiendo...

Consultar la base de datos offline en iOS

Imagen
Hace unos días se liberó la versión Beta 1 de GeneXus Tilo , que tiene como una de sus características principales la posibilidad de generar aplicaciones Offline para Smart Devices . Algo que puede resultar útil, sobre todo cuando estamos diagnosticando algún problema, es poder consultar directamente la base de datos. En iOS no es algo evidente como hacer esto, por lo que lo dejo escrito acá por si alguien lo precisa. Esto sirve para el Simulator, no en un dispositivo... Lo primero que debemos hacer es obtener la ruta al archivo SQLite. Para eso, debemos ejecutar la aplicación desde Xcode en el Simualtor. Debemos ejecutarla desde Xcode y no desde GeneXus, para así tener la opción de hacer debug . Ponemos un breakpoint en algún punto por el que sepamos que va a pasar la aplicación (puede ser un procedure o el data provider asociado a un panel), y cuando se detiene, en la consola, escribimos: po [[GXDBManager sharedInstance] databasePath] Ese comando nos va a dar la ruta d...

Literales de tipo Date y DateTime en GeneXus

Imagen
Cuando programamos, ya sea en GeneXus o en cualquier otro lenguaje, es muy común usar literales en el código, para valores conocidos o especiales de la aplicación. Por ejemplo, si voy a hacer una suma de varios registros, inicializo la variable en cero: &suma = 0 O si estoy por ejemplo en una transacción y quiero saber si estoy en modo Insert, puedo preguntar if &Mode = 'INS'     ... endif (nota: es un ejemplo... lo recomendable en este caso es usar el dominio enumerado TrnMode) En GeneXus hay unos cuantos tipos de datos, pero podríamos decir que los principales son cuatro: números, strings, booleanos y fechas (o fecha-hora para ser más precisos). Para los tres primeros, es bien sabido como expresar literales, ¿pero para las fechas? Esta funcionalidad creo que no es muy conocida, pero en GeneXus también se pueden escribir literales de fechas, utilizando el caracter # como delimitador (así como usamos las comillas simples o dobles para los strings). ...

Comandos útiles de Google Search

Imagen
Hace ya bastante tiempo que la página de búsqueda de Google dejó de ser un simple buscador de páginas web, y ha pasado a ser más una especie de aplicación de línea de comandos, que brinda información de contexto y no solo una lista de resultados. Lo que sigue son algunos comandos útiles que se pueden usar en Google Search. No pretende ser una lista exhaustiva, son los que conosco y uso con cierta frecuencia. Calculadora Si en vez de ingresar un texto a buscar, ingresamos una operación aritmética como por ejemplo " 2+3 ", Google nos devuelve el resultado, y muestra una calculadora como para poder seguir haciendo operaciones. También permite usar funciones trigonométricas, logaritmos, exponenciales, factoriales, etc. Es bastante completa. Gráfica de funciones Si uno escribe una función, por ejemplo " x^2+1 ", el resultado que obtiene es la gráfica de la misma. No es que use mucho esta funcionalidad, pero me hubiera servido en otro momento :) Conversión de monedas...

Optimizaciones del compilador en Objective-C

Imagen
Cuando se tiene un objeto que es inmutable, por ejemplo un string, es bastante útil contar con optimizaciones del compilador, para que no cree varias instancias idénticas. Por ejemplo, en Objective-C si hacemos NSString *a = @"hola"; NSString *b = @"hola"; el compilador se da cuenta que son referencias a la misma instancia, y crea el string @"hola" una sola vez en memoria, por lo que a y b quedan apuntando al mismo objeto. Lo mismo pasa si se usan objetos de tipo NSNumber. Si tengo por ejemplo NSNumber *c = @1; NSNumber *d = @1; el objeto @1 queda una sola vez en memoria y las variables c y d referencian la misma instancia. Hasta acá no hay mucha sorpresa. Son objetos inmutables, por lo que no importa mucho que sean la misma instancia... salvo en lo que se puede ahorrar de memoria. Una curiosidad si se quiere, es que los constructores no siempre pueden ser optimizados. Por ejemplo NSString *e = [@"h" stringByAppendingSt...

Smart App Banners en Mobile Safari

Imagen
Esta no la sabía, me pareció interesante como para compartirlo. Aparentemente desde iOS 6, Safari tiene una funcionalidad llamada Smart App Banners , que permite que la página web muestre un banner con un link para bajar o abrir una determinada aplicación. Del anuncio de Apple: With Safari’s new Smart App Banner feature in iOS 6, you can display a banner that provides a direct link to your app on the App Store, or opens the app if the user already has it installed. Smart App Banners integrate seamlessly, have the same look and feel users know from the App Store, and are easy to implement. Agregarlo en una página web cualquiera es muy fácil. Alcanza con agregar un meta-tag en el HTML: <meta name="apple-itunes-app" content="app-id=529888450"> En ejecución se ve así: Agregar esto en GeneXus también es muy fácil, alcanza con poner lo siguiente en el evento Start del Web Panel: Form.Meta.AddItem("apple-itunes-app", "app-id=5298884...

Script Bash para sincronizar cambios entre repositorios SVN

Creo que es algo bastente común, cuando se está trabajando con distintas versiones del mismo producto, tener que sincronizar cambios de una versión a otra. En particular en Artech tenemos el código en un repositorio SVN, y en este momento tengo cuatro versiones del cliente de iOS en las que estoy trabajando: la versión prácticamente cerrada del Upgrade 2 de la Evolution 2 la rama de upgrades (Upgrade 3 y posteriores) de la Evolution 2 la versión oficial de Tilo (nombre código de la próxima versión de GeneXus)  una versión inestable de Tilo donde estoy haciendo cambios que no quiero hacer commit porque están "atados con alambre" Llevar los cambios de una versión a otra puede ser bastante complicado, si se trata de un fuente que tiene cambios en más de una versión. Es un proceso bastante manual. Para facilitar este proceso hice un script Bash que se fija los cambios en la versión de origen y muestra el comparador (File Merge, viene con Xcode) para los archivos modifi...

Comparación de strings por aproximación

Imagen
Para una aplicación que estoy haciendo con GeneXus (después cuento de que se trata...), necesitaba poder comparar dos strings, pero no necesito que sean exáctamente iguales, me alcanza con que sean aproximados. El primer intento fue hacer que uno de los dos strings fuera por lo menos la mitad del largo del otro y que estuviera contenido. Como aproximación está bien, pero si por ejemplo uno de los dos tiene un tilde y el otro no, da que son diferentes. Gracias a Matías me enteré que existe un algoritmo, llamado Distancia de Levenshtein , que se usa justamente para esto. Según Wikipedia: En Teoría de la información y Ciencias de la Computación se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter. Esta distancia recibe ese nombre en honor al científico ruso Vladimir L...

Desbloqueo oficial de iPhone

Imagen
Hasta hace poco, pensaba que el desbloquear un iPhone era un proceso no aprobado por Apple, casi que ilegal digamos. Pero resulta que no, que hay una forma de desbloquear un iPhone de forma totalmente legal, aunque no hay mucha información al respecto. Para eso, el operador tiene que ofrecer el desbloqueo ( ver lista de operadores ), que en el caso de Uruguay está disponible tanto en Movistar como en Claro. Les cuento como fue el proceso, por si alguien más necesita hacerlo... Mi experiencia con Movistar En mi caso, tengo un iPhone 3Gs de Movistar, que se venció el contrato original a fines de 2011. Cuando me enteré que se podía desbloquear, pregunté en Movistar como tenía que hacer, y me dijeron que tenía que ir simplemente al local que está en Soca y Rivera, que ahí lo hacen. Después alguien que comentó que en el Palacio Salvo también se puede, pero no tuve la oportunidad de confirmarlo. Fui un día al local de Movistar indicado, y me dijeron que sí lo podían desbloque...

Administrando el correo con GMail

Imagen
Si hay algo que me gusta tener ordenado es el correo. No sigo la filosofía de inbox zero (ni soy experto en el tema), pero me gusta tener la bandeja de entrada limpia en todo momento. La idea de esta nota es contar como me organizo, ya que creo haber encontrado una metodología que me convence, y capaz que le puede servir a alguien más. Obviamente si alguien piensa que se puede mejorar, escucho los comentarios. Para el correo, tanto personal como laboral, uso Gmail. En algún momento probé algún otro cliente (Thunderbird y Sparrow), pero no lograron convencerme del todo. Gmail tiene el Priority Inbox, que facilita bastante la organización. El Priority Inbox de Gmail permite definir hasta cuatro secciones, que en mi caso son: Important and unread Starred etiqueta Follow up Everything else En Important and unread  va eso, mensajes que Gmail etiqueta como importantes y que todavía no leí. Hay que entrenar un poco a Gmail para que sepa que cosas tienen que estar marcadas...

Música para correr

Imagen
Hace un tiempo encontré el sitio jog.fm , que permite buscar música para correr, con la particularidad que busca la música más adecuada para el ritmo que uno elige. Por ejemplo, se puede buscar música para correr a 6 minutos por km, y encuentra canciones que sirven para correr a ese ritmo. También sirve para buscar música para otras actividades, como caminar o andar en bicicleta. En el sitio se pueden escuchar las canciones, comprarlas en Amazon o iTunes, armar listas de reproducción (que no se como la escucho mientras voy corriendo...), escuchar listas de otros usuarios, etc. Además tienen una aplicación para el iPhone, pero no me convenció demasiado. La aplicación procesa toda la biblioteca, y cuando uno va a hacer ejercicio puede decirle a que ritmo quiere correr o que detecte el ritmo automáticamente. Supuestamente se van a reproducir las canciones adecuadas. Digo supuestamente porque hice una prueba y me parece que no me funcionó muy bien. Algunas mejoras que le haría:...

fbcmd: listar los próximos cumpleaños

Imagen
Hace unos días escribí sobre fbcmd , como forma de consultar la actividad de los amigos en Facebook. Lo que no encontré, fue una forma de ver cuales son los próximos cumpleaños, así que hice mi propio comando :) Este es el código del nuevo comando: Para usarlo, hay que seguir los siguientes pasos: Bajar el archivo Copiarlo a  /usr/local/lib/fbcmd/support (en Mac OS X, no se en otros sistemas) Ejecutar php /usr/local/lib/fbcmd/support/birthdays_fbcmd.php BIRTHDAYS Se le puede pasar una lista de amigos y la cantidad de items a mostrar. Por ejemplo, php /usr/local/lib/fbcmd/support/birthdays_fbcmd.php BIRTHDAYS _familia 5 lista los 5 primeros cumpleaños de los amigos que estén en la lista "familia".

Sobre el uso de Facebook

Imagen
Soy usuario de Facebook desde hace tiempo, pero nunca lo llegué a usar "de verdad". Hay varias cosas que no me convencen del todo... Para publicar contenido, me gusta más Twitter. En alguna ocasión use Facebook para compartir algo semi-privado, solo con la gente que me interesaba (fotos de algún viaje, por ejemplo), pero no es algo a lo que me acostumbre. Lo que sí quiero usarlo es para consumir contenido. Hay gente que usa Facebook para publicar, que sí me interesa saber lo que están diciendo. El problema con Facebook, es que trata a todos los amigos por igual, y esa no es la mejor forma de encarar el tema, porque en realidad hay amigos que me interesan más que otros. Muchas veces lo que publican estos amigos (los que quiero saber en que andan), queda perdido entre lo que publican otros tantos, que si tengo tiempo los leo, pero si no, quiero poder acceder rápido a lo que me interesa. Además Facebook en su página web me muestra cosas que en general no me interesan, co...

Text macros en XCode

Imagen
Acabo de "descubrir" una funcionalidad de XCode que no sabía que existía: text macros. En realidad es algo que sí sabía que estaba, porque muchas veces cuando uno empieza a escribir algo, le aparece código automáticamente para completar. Por ejemplo, si uno escribe "if", aparece if (<#condition#>) {     <#statements#> } y apretando Enter o Space se agrega el código permitiendo completar las cosas que faltan. Lo que no sabía, es que podía definir mis propios macros y como usarlos... Hay una explicación muy completa de como hacerlo en esta nota , pero a mi me gusta más editarlo en modo texto que usando el editor de propiedades, así que acá va como lo hice yo... En una ventana del Terminal.app: cd /Developer/Applications/Xcode.app/Contents cd PlugIns/TextMacros.xctxtmacro/Contents/Resources edit ObjectiveC.xctxtmacro donde "edit" se puede cambiar por cualquier editor de texto de su agrado (en mi caso en particular abre TextWrangler...

Blocks en Objective-C (iOS 4)

Imagen
Me acabo de enterar, que a partir de iOS 4, el lenguaje Objective-C soporta blocks . ¡Espectacular! Les recomiendo que lean: The Pragmatic Studio: Using Blocks in iOS 4: The Basics The Pragmatic Studio: Using Blocks in iOS 4: Designing with Blocks  (ver también al final del artículo que tiene otros links interesantes) Programming with C Blocks (On Apple Devices) iOS Reference Library: A Short Practical Guide to Blocks La sintaxis para declarar un block , es un tanto extraña... Por ejemplo, si queremos declarar un block que recibe un número entero y devuelve otro número entero, por ejemplo multiplicando el parámetro por 3, se declara así: ^ (int num) {     return num * 3; } Este block se puede asignar a una variable, por ejemplo con (int)(^por3)(int) = ^ (int num) {return num * 3;}; y luego invocarlo con: int result = por3(7);  // result = 21 o se puede pasar como parámetro a algún método que reciba un block con el tipo dado: [some...

GeneXus en StackExchange: Commitment

Imagen
Hace unos minutos la propuesta para crear un foro de GeneXus en StackEchange superó la etapa de "definition", y ahora está en la etapa de "commitment". En esta etapa es necesario que las personas se registren y se comprometan a usar el sitio de preguntas y respuestas. El único requisito es registrarse con el nombre completo... Por lo que vi de otras propuestas, se precisan unas 200 personas anotadas. Los invito a que se anoten siguiendo este link . Por más información, pueden ver la nota anterior en el blog , y también las transparencias de la charla que di en el XX Encuentro GeneXus sobre el tema.

GeneXus en StackExchange

Imagen
StackExchange es un sitio que permite crear comunidades para preguntas y respuestas. Está basado en el popular sitio para desarrolladores, StackOverflow . Tiene varias ventajas sobre un foro común, lo cual explica muy bien Joel Spolsky ... Hace un tiempo Enrique había pedido tener algo de esto para discutir sobre GeneXus , y lo volvió a sugerir en Twitter . Así que bueno, acá está hecho el pedido para tener un sitio dedicado a GeneXus en StackExchange. Lo que hay que hacer ahora es: Registrarse en el sitio de Area 51 (es donde se proponen nuevos sitios) Ir a  http://area51.stackexchange.com/proposals/19860/genexus y hacer un "follow" (se precisa 60 personas en esta primer etapa) Proponer alguna pregunta de ejemplo, que puede ser on-topic u off-topic (se precisan 5 de cada una) Marcar las preguntas que ya están como on-topic u off-topic. Así que, a participar, a ver si podemos crear el sitio :)

Uso básico de Git

Imagen
Git es un sistema de control de versiones distribuido. Un sistema de control de versiones , es un software que administra los cambios realizados en un conjunto de archivos, pudiendo ver el estado de cualquier elemento en cualquier momento dado, combinar cambios realizados por otros, ver las diferencias, etc. Al ser distribuido, cada "clon" del repositorio tiene toda la información necesaria así como la historia completa, pudiendo realizar todas las operaciones sin necesidad de estar conectado al servidor centralizado (en caso que exista). No es el único producto que hace esto, existen muchos más, como por ejemplo Mercurial o SubVersion (este último es centralizado). Git se usa para el trabajo en equipo (generalmente para el desarrollo de software), ya que permite que cada uno de los integrantes del equipo tenga su propia versión, realiza sus propios cambios, y luego combina las modificaciones realizadas (merge). Pero en realidad, Git también sirve para equipos de ...