martes, 22 de febrero de 2011

Text macros en XCode

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).

Ir al final del archivo, y agregar lo siguiente:
{
    Identifier = objc.singleton;
    BasedOn = objc;
    IsMenuItem = NO;
    Name = "Singleton Pattern";
    TextString = "#pragma mark -\n#pragma mark Singleton pattern\nstatic <#class#> *instance = nil;\n+ (<#class#> *) shared {\n @synchronized(self)\n {\n if (instance == nil) {\n instance = [[self alloc] init];\n }\n }\n return instance;\n}";
    CompletionPrefix = singleton;
    OnlyAtBOL = YES;
},
Esto agrega un nuevo text macro, que se activa escribiendo "singleton" seguido de Ctrl-. o de la tecla Escape, y que se expande a
#pragma mark -
#pragma mark Singleton pattern
static <#class#> *instance = nil;
+ (<#class#> *) shared {
    @synchronized(self)
    {
        if (instance == nil) {
            instance = [[self alloc] init];
        }
    }
    return instance;
}

Una explicación de los campos que se deben configurar en el archivo xctxtmacro:
  • Identifier: el identificador del macro
  • BasedOn: por lo que vi, vale siempre "objc"
  • IsMenuItem: si debe aparecer en el menú Edit -> Insert Text Macro en XCode
  • Name: nombre del macro
  • TextString: el texto que se va a expandir cuando se ejecute el macro, se pueden agregar "placeholders" encerrándolos entre <# y #>
  • CompletionPrefix: el texto que se tiene que digitar para que se dispar el macro
  • OnlyAtBOL: si solo es válido en una linea vacía o no (BOL = begin of line)

Eso es todo. Una vez agregados los nuevos macros, hay que reiniciar XCode y ya quedan disponibles.

viernes, 11 de febrero de 2011

Blocks en Objective-C (iOS 4)

Me acabo de enterar, que a partir de iOS 4, el lenguaje Objective-C soporta blocks. ¡Espectacular!

Les recomiendo que lean:

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:
[someObject someMethodWithBlock:^ (int num) {return num * 3;}];
Los blocks no están tan integrados al lenguaje como lo están por ejemplo en Ruby, pero es bueno ver que en iOS 4 Apple agregó a varias clases la posibilidad de pasarles blocks cuando resulta útil. Citando lo que dice la documentación oficial:
One obvious motivation for using blocks is that an increasing number of the methods and functions of the system frameworks take blocks as parameters. One can discern a half-dozen or so use cases for blocks in framework methods:
  • Completion handlers
  • Notification handlers
  • Error handlers
  • Enumeration
  • View animation and transitions
  • Sorting

jueves, 10 de febrero de 2011

DGI, facturación y declaraciones juradas

En Uruguay, la DGI (Dirección General de Impositiva), es quien se encarga de recaudar los impuestos de las empresas y las personas físicas.

Existe una modalidad, que es la que usamos los profesionales, que se llama Empresa Unipersonal, para las cuales el flujo de trabajo es el siguiente (no conozco como funcionan las demás, pienso que deben ser más complicadas):

  1. La empresa hace facturas a sus clientes, sin que la DGI se entere
  2. Una vez por mes o cada dos meses (depende de la modalidad de la empresa) se pagan los impuestos: IVA, IRAE, IRPF o lo que corresponda. Para el pago la empresa tiene que imprimir un boleto de pago en blanco, lo llena con los importes que correspondan, y paga eso. Todo esto sin intervención de la DGI, o sea, cada uno paga "como quiere".
  3. Una vez al año o cada 6 meses (depende de la modalidad de la empresa), se hace una declaración jurada donde uno declara lo que facturó, lo que compró y los pagos que hizo. Esto es un papel que es totalmente independiente de las facturas y de los pagos. Con los pagos, la DGI puede cruzar la información, pero con las facturas en principio no.
No se a ustedes que les parece, pero a mi me suena un tanto arcaico todo el proceso. Es de una época cuando la contabilidad se llevaba en libros, y por lo tanto no había una forma fácil de hacer algo determinístico, y lo mejor que se podía hacer era presentar una declaración jurada para asegurarse que la empresa pague lo que le corresponde.

El problema con esto es que implica que uno debe saber muchas cosas: que impuestos debe pagar y como calcularlos, qué declaraciones juradas debe presentar y como hacerlas. En general no son cosas triviales, y creo que generan bastante inseguridad porque no es algo en lo que quiera tener errores.

Creo que hoy en día se podría hacer mejor... Alguno me va a odiar por plantear algo así (los contadores por ejemplo... o alguno que quiera estafar a la DGI), pero a mi solo me interesa simplificarme el proceso.

No deberían existir las declaraciones juradas. La DGI debería tener toda la información disponible, verificable y segura. No tiene sentido que cada uno tenga que hacer las cosas por su cuenta sin que la DGI pueda verificarlo (salvo con una inspección).

Para eso, se debería poder generar la factura mediante el uso de un servicio brindado por la DGI. Yo hoy tengo una libreta de facturas, pero en realidad, eso tampoco tiene razón de ser así. Si yo pudiera entrar al sitio web de DGI, autenticarme de alguna forma (hoy ya hay usuarios que se autentican con una contraseña, podría ser eso), ingresar la factura que quiero hacer y mandarla automáticamente a mi cliente, quedaría toda la información registrada. Es más, la factura ni siquiera tendría que estar en papel, sería un link al sitio de la DGI... Si alguien la quiere en papel, la puede imprimir desde ahí.

Ahora, si la DGI tiene toda la información de las facturas que hago y de las facturas de las compras que hice (o las debería poder ingresar al sitio durante la transición), me podría decir exactamente cuanto tengo que pagar de cada impuesto, y me podría generar el boleto de pago con toda la información.

Si existiera un servicio así, yo sería más feliz.

A propósito... si alguien está en una situación similar y tiene un contador o contadora que le haga los cálculos de impuestos y declaraciones juradas, que me pueda recomendar, que me mande un mail a marcos arroba crispino punto info...