Worst than have nothing, is get something broke.
And this is very true when coding. With the intention to avoid “make the wheel, again” is common the use of system functions included in the programing language or framework, with the assumption that the code reused is best than anything you can make alone — something that is almost always true-.
For BestSeller, I use the Sqlite database, because is the perfect choice in the iPhone. However, Sqlite have as a feature & limitation that everything is stored as string or integers. Not exists dates, booleans, decimals, etc. like in almost any other database like FireBird or Sql Server.
This pose a challenge when is need store dates. The ObjC developers commonly choose between:
-
Store the date with
[NSDate timeIntervalSinceDate :], that is the same as aDouble, with the problem that is not compatible with the Sqlite datetime functions & is not user-readable at all or: - Store the date as a string, something readable & compatible with the functions of Sqlite.
So, I choose the second (who not?) and for avoid ambiguity (something that happen a lot with date manipulations) I use the ISO standard with the format: YYYY-MM-DDTHH:MM:SS.
And how get this with Obj-C? Super-easy, using this code:
:::Objective-C
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
strValue = [NSString stringWithFormat:@"'%@'",[dateFormatter stringFromDate: date]];
[dateFormatter release];
A pice of cake, no? That is what say the official documentation, that is what you found in the examples, the books and that is what work… Until I found a nasty bug that is only visible if the user set their iPhone with the 12 hours format][3]!. This could lead to different nasty problems detailed here.
By fortune, I detect the problem (by mistake!) while doing testing. And the solution? What I found in internet, not elegant! (in the last link the author suggest parse the string & patch the result with a hack) so I have no other option that “fix” it myself. The solution was not obvious to me, but here is it(implemented as a category of NSDate):
:::Objective-C
@implementation NSDate (DateFunctions)
— (NSString *) formatAsISODate {
NSDateComponents *dateComp;
NSCalendar *cal = [NSCalendar currentCalendar];
dateComp = [cal
components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
| NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit)
fromDate:self];
return [NSString stringWithFormat:@"%02d-%02d-%02dT%02d:%02d:%02d",dateComp.year,
dateComp.month,dateComp.day,dateComp.hour,dateComp.minute,dateComp.second];
}
So, the next time you use code that mess with internationalization, be sure you have something broke.
0 comments | 0 pingbacks | tags: iphone, objective-c, rant
Is in use right now in a few wholesale distributors but is time to make a international beta. I’m recruiting beta testers for this application.
In the first stage, I need developers with the knowledge in how make a integration with ERPs/Accounting/Financial software for validate the synchronization interface.
If you have this profile, want collaborate & release as open source your code, I invite you to subscribe here.
0 comments | 0 pingbacks | tags: bestseller, beta, delphi, python
Por fin aceptado en Apple Dev Program para el iPhone
Luego de un (mas que deseado) largo proceso -que increiblemente requirio enviar faxes varias veces, llamadas telefonicas y correos- por fin recibi el acceso al Developer Program para el iPhone, que permitira publicar aplicaciones de El mlabarista en el AppStore y ser accesibles a mas de 30 millones de usuarios de iPhone & iPod touch en el mundo.
Pronto estare actualizando con mas noticias.
0 comments | 0 pingbacks | tags: apple, iphone
Portando de FreePascal a Delphi (facilitar multi-plataforma)
Estoy en la fase de crear un mini-servidor de aplicaciones que se ejecutará en Windows & Linux.
He elegido a FreePascal como la herramienta para realizar la labor de portar el código de Delphi (Windows) a esta plataforma. Ya tengo resuelto los problemas mayores y el hecho de que librerias como la de RemObjects este ya portada a FreePascal es un gran alivio.
Sin embargo, siempre en el camino se van encontrando pequeños inconvenientes.
Una función importante del sistema, es su mecanismo de plugins, los cuales por múltiples razones (técnicas & aburridas) decidi invocarlos usando la tecnica “antigua” pero probada de encadenamiento de comandos y por ello necesito invocar de forma transparente scripts & ejecutables redireccionando la salida y los errores (stdin, stderror) de los comandos. Para los que no entiendan, es similar a abrir la consola del DOS y ejecutar “dir .” y capturar el resultado de pantalla, pero todo sin intervencion del usuario y sin que aparezca la ventana del DOS.
Hacer esto es muy simple. El ejemplo clasico se puede ver en este link. Y bueno, como hacerlo multiplataforma?
Se me ocurrio que ya que voy a portar el programa a FreePascal de todas maneras, pues mirar como lo hacen alli. Y encontre la informacion sobre la clase TProcess. Muy bueno y todo, pero ya que el IDE del FreePascal (lazarus) no es tan productivo como el de Delphi y que igual no he terminado el proceso de preparar el sistema para Freepascal me pregunte que tan viable era hacer una transferencia de codigo a la inversa: Del FreePascal al Delphi.
Y resulto ser mas fácil de lo que esperaba!.
- Bueno, primero se instala Lazarus desde la página oficial, el cual incluye el compilador FreePascal y el código fuente.
- El archivo que contiene la clases _TProcess _ esta en ´DIRECTORIO INSTALACION LAZARUS\lazarus\fpc\2.2.5\source\packages\fcl-process\src\process.pp´. (NOTA: La extensión .pp es la por defecto en freepascal).
- Copie el archivo process.pp & pipes.pp & la carpeta windows al directorio de la aplicación. Dentro de esta carpeta hay unos archivos .inc que son los que contienen el código especifico de cada plataforma, en este caso el windows.
- Ahora renombre los archivos .pp a .pas. Y copie el contenido de los archivos .inc dentro de cada .pas (por pura conveniencia).
- Ahora, borre la directiva {$mode objfpc} del inicio de cada .pas.
- Por último compilar y ver errores. Te saca que no encuentra unos tipos de datos (eje: DWORD), el cual se arregla fácil haciendo click derecho sobre el tipo, menu refactoring/Find Unit.
- Se corrige este código:
(Ubicado en pipes.pas):
Function CreatePipeHandles (Var Inhandle,OutHandle : THandle) : Boolean; begin Result := CreatePipe (@Inhandle,@OutHandle,@piInheritablePipe,PipeBufSize); end;
por:
Function CreatePipeHandles (Var Inhandle,OutHandle : THandle) : Boolean; begin Result := CreatePipe (Inhandle,OutHandle,@piInheritablePipe,0); end;
Y listo!
0 comments | 0 pingbacks | tags: delphi, freepascal
Crear una mejor experiencia para el usuario: Guia del Logo para Windows
No hay nada mas frustrante que cuando estas con el computador y todo sale mal.
La experiencia del usuario es la combinacion del Hardware + Sistema Operativo + Resto del software. Muchas veces se le hecha la culpa a los 2 primeros pero de forma frequente el problema real esta en el ultimo.
Son incontables las veces que frente a un problema con el computador la solución haya sido “Reformatear el equipo” debido a que el software en cuestion hace algo mal hecho.
Como desarrolladores tenemos la responsabilidad de hacer aplicaciones funcionales y que no frusten a la gente. Solo que muchas veces desconocemos que existen guias & buenas practicas a seguir para tal fin.
Estas operan bajo el umbral del “Windows Logo Program” que es una certificacion que da Microsoft a los productores de software (es cuando encontramos esas etiquetas que dicen “Certificado para Windows Vista” & similares) que delinea buenas practicas a seguir. Aunque la certificacion oficial tiene un coste elevado, nada impide el seguir las pautas que se delinean.
Entre ellas se encuentran:
- Forma correcta de instalar aplicaciones que funcionen sin permisos de administrador y no muestren el molesto aviso del UAC en Vista
- Como hacer apliaciones que operen de forma segura
El documento se puede descargar de aquí.
0 comments | 0 pingbacks | tags: delphi, programacion, windows
Como ser un programador contratable…
Aunque parezca que estoy con un trauma creativo con la poca actualización de este blog, la verdad es que…si, es asi. No! Realmente trabajando duro y conversando con la gente de los foros de www.clubdelphi.com . Esta conversación si fue bien interesante, trata sobre como aumentar las probabilidades de ser contratado en una empresa de software, asi que denle una mirada.
0 comments | 0 pingbacks | tags: programacion
Ganador 7o concurso de planes de negocios
Durante al año pasado inscribi uno de los proyectos en los que estoy trabajando en el 7o concurso de planes de negocios, proyecto el cual salio premiado en el cluster de tecnología.

Este trata sobre un sistema de toma de pedidos para el iPhone — el cual es una versión mejorada del software del Vendedor Portátil para la plataforma PocketPC — que llevo más de un año implementando en varias distribuidoras del departamento de Antioquia.
El proyecto ya esta en marcha & prontamente estare posteando más información, y pretendo que sea mucho más accecible y funcional incluso para freelancers & pequeñas empresas.
0 comments | 0 pingbacks | tags: anuncios
Mejorando los colores al editor de Delphi
Esta es la historia de como se amaestra a un elefante:
- Se captura de pequeño, y se ata a un arbol o poste con una cadena o cuerda. El elefantito ve que no se puede soltar.
- El elefante crece. Sigue atado al mismo poste o cadena. Pero ya dejo de intentar safarse…
Con las herramientas pasa lo mismo. Muchas veces uno asume que las cosas no se pueden cambiar, porque antes no se podia… o no se sabia como.
Una de las cosas que muchos programadores no se toman el trabajo de mejorar es el aspecto del editor de código. Lo cual es extraño, igual uno estara trabajando sobre el todo el tiempo.
Hace mucho salio este sitio:
que muestra diversos esquemas de colores para todos los gustos, optimizados para una mejor lectura… o solo porque a alguien le parece lindo ;).
El punto es que también se puede personalizar el editor de código de Delphi, solo que desafortunadamente no es tan intuitivo como parece, principalmente, porque el control que se utiliza en el dialogo de opciones para seleccionar los colores es una reliquia del windows 3.11 en cuanto a funcionalidad, lo cual seguro desanima a más de uno. Es su cadena que lo ata al arbol.
Pero hace mucho descubri como hacer el cambio — no proclamo ser el primero, sino más bien que algún día se me prendio el bombillito — y hoy quiero compartir el truco.
Primero, es necesario abrir el regedit y viajar a la carpeta:
HKEY_CURRENT_USER\Software\*CODEGEAR*\BDS\*VERSION*\Editor\Highlight
Nota: Reemplazar a Codegear por Borland y a Version por la versión interna del IDE de Delphi para ubicar la carpeta exacta. Si no sabe como, busque en el regedit por Assembler o Attribute Names que son nombres de las opciones en las opciones del Delphi para los colores del editor.
Allí se encuentran todas las opciones del editor de código y se pueden cambiar. Es importante notar que es mejor sacar un backup por si acaso (click derecho sobre HighlightExport), luego hay que buscar un esquema que te guste.
Para el mío, me baje a Intype que es un editor minimalista para programadores. En la carpeta donde se instala, en el directorio themes hay unos archivos con unos esquema muy buenos. Utilizando de referencia a pastels_on_dark.itTheme* y con la información descriptiva (pues, para un programador quiero decir!) que hay en esos archivos, emepza a modificar asi:
- En Delphi, elegi al esquema de color Twilight que es el único de fondo oscuro, y que sirve de base.
- Miro en el archivo *.itTheme el código hexadecimal del color (ej: background : ‘#211E1E’) y le cambio el simbolo # por $.
- Ahora, y esta es la parte molesta del proceso, es necesario ir a cada sub-rama de Highlight dentro del regedit y cambiar la opción Background Color New por el código hexadecimal $211E1E. IMPORTANTE solo hacerlo para los que estan preestablecidos como clBlack.
- Seguir ajustando las demás propiedades. Es casi obvio.
- Reiniciar el Delphi y ver que tal quedo todo. Igual por las opciones del Delphi se pueden hacer ajustes de ser necesario.
De esa manera, asi queda:

Espero que esto los anime a desatarse del arbol ;).
0 comments | 0 pingbacks | tags: delphi
Migrando a un nuevo servidor.
Dentro de las próximas 2 semanas estare haciendo una migración de servidor a una versión más actualizada.
Durante ese tiempo, es posible que tenga momentos fuera de línea o que ciertas cosas no funcionen por momentos.
Quizas si me siento aventurero cambie apache modpython por otra cosa ;).

