martes, 24 de febrero de 2015

Guia de Estilo AngularJS

Version original: https://github.com/johnpapa/angularjs-styleguide

Responsabilidad Única:
Regla de 1

Definir un componente por archivo.
Los siguientes ejemplos definen el modulo "app" y sus dependencias, define el controlador y un "factory", todo en el mismo archivo:


/* Evitar */
angular
    .module('app', ['ngRoute'])
    .controller('SomeController', SomeController)
    .factory('someFactory', someFactory);

function SomeController() { }

function someFactory() { }

El mismo componente, ahora separado en archivos

Archivo: app.module.js

/* recommended */

// app.module.js
angular
    .module('app', ['ngRoute']);

Archivo: controlador1.js
/* recommended */
angular
    .module('app')
    .controller('SomeController', SomeController);

function SomeController() { }


Archivo factory1.js
// factory1.js
angular
    .module('app')
    .factory('someFactory', someFactory);

function someFactory() { }
D

IIFE (Invoked Function Expression - Expresión de Invocación de Funcion)
JavaScript Closures

Envuelve los componentes de AngularJS en una IIFE.

Porque?: un IIFE remueve las variables del alcance global. Esto ayuda a prevenir que las variables y las declaraciones de funciones vivan mas de los esperado en el alcance global, lo cual también ayuda a prevenir colisiones entre nombres.

Porque?: Cuando comprimas y reduzcas tu código para colocar en producción, podrías tener muchas colisiones de variables si tienes muchas globales declaradas. Una IIFE te protege contra esto encapsulando las variables en el alcance de cada archivo.

Evitar!!!
// logger.js
angular
    .module('app')
    .factory('logger', logger);

// logger function is added as a global variable
function logger() { }

// storage.js
angular
    .module('app')
    .factory('storage', storage);

// storage function is added as a global variable
function storage() { 

}


Recomendado!!

// logger.js
(function() {
    'use strict';

    angular
        .module('app')
        .factory('logger', logger);

    function logger() { }
})();

// storage.js
(function() {
    'use strict';

    angular
        .module('app')
        .factory('storage', storage);

    function storage() { }
})();


Nota: Solo por brevedad omitiremos la sintaxis IIFE para el resto de la guía

Nota: IIFE's evita las pruebas del código limitando el alcance a los miembros privados con expresiones regulares o funciones de ayuda; las cuales pueden ser lo suficientemente buenas para las pruebas unitarias directamente sobre el mismo objeto, mas no externamente. Sin embargo usted puede probar a través de miembros accesibles o exponiéndolos a través de su propio componente. Por ejemplo, colocando funciones de ayuda, expresiones regulares o constantes en sus propias Factory.








lunes, 23 de febrero de 2015

Outlook no encuentra correos

Hola, este es un caso típico de las locura de Outlook. Estuve durante varios meses buscando la forma de que Outlook me busque correos, incluso teniendo las opciones de indexación de los PST los OST activas, nunca me encontraba correos, ni recién recibidos ni los mas antiguos. El problema se presenta con mayor incidencia con las cuentas relacionadas con Exchange, y todos los tutoriales o soluciones dicen que debe tener activa la opcion de "Intercambio de Cache" pero en mi caso esto no funcionó, fue todo lo contrario. Cuando desactivé la función "Intercambio de cache" empezó a buscar algunos correos, y cuando le quite la indexacion con el windows search, ahí empezó a buscar todos los correos. Se demoraba mas pero los encontraba, cosa que no pasaba con la indexacion normal.
Mi plataforma es windows 7 con Office 2010.
PD: Probé con office 2013 y tiene el mismo inconveniente. No he probado si la solución también aplica, pero debería. 

jueves, 5 de febrero de 2015

Leer cantidad paginas - imagenes TIFF en C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Data;


namespace ContadorPaginasTIFF
{
    class Program
    {
        static void Main(string[] args)
        {
            string ruta1 = "F:\\archivosTIFF\\";
            string[] archivos1 = Directory.GetFiles(ruta1);

            long cantidad_imagenes = 0;
            Image tiffImage;
            Guid objGuid;
            FrameDimension dimension;

            Console.WriteLine("cantidad archivos: " + archivos1.Length);

            foreach (string archivo in archivos1)
            {
                Console.WriteLine("Imagenes: " + cantidad_imagenes);
                tiffImage = Image.FromFile(archivo);
                objGuid = tiffImage.FrameDimensionsList[0];
                dimension = new FrameDimension(objGuid);
                int NumberOfPages = tiffImage.GetFrameCount(dimension);
                cantidad_imagenes += NumberOfPages;
                tiffImage.Dispose(); // Importante para evitar out of memory

                dimension = null;
                tiffImage = null;
                Console.Clear();
            }
            Console.WriteLine("carpeta 1: " + cantidad_imagenes);

         }
    }
}

domingo, 23 de febrero de 2014

Crisis

Tomado del diario chileno "El Definido" http://www.eldefinido.cl/actualidad/plazapublica/1863/Por_que_Venezuela_no_tiene_papel_higienico/


Hace un tiempo, recién asumido el Sr. Maduro como reemplazante del malogrado Hugo Chávez a la cabeza de Venezuela, el país tropical hizo noticia por un hecho bastante poco glamoroso: sus habitantes hacían largas filas para conseguir un bien que no solemos considerar un lujo: el papel higiénico.

Hace unos días, Venezuela volvió a las noticias producto de las manifestaciones de algunos  estudiantes hastiados de la inseguridad, que ha escalado a un movimiento nacional, que ahora reclama además por la alta inflación (56%) y la escasez de productos básicos, entre otros problemas.

No sé ustedes, pero al escuchar esas noticias, no pude evitar preguntarme: ¿Cómo llega uno de los mayores productores de petróleo del mundo, a quedarse sin un insumo tan básico como el papel higiénico?

Una historia que se repite


La verdad es que no se necesitaba una bola de cristal para predecir que esto ocurriría. De hecho, ha ocurrido incontables veces en la historia del mundo, casi siempre igual, pero por algún motivo, aún no aprendemos la lección. 

Lo ocurrido sigue un patrón que se repite una y otra vez de manera casi idéntica cada vez que se sigue una cierta lógica económica poco prudente. Y no tiene nada que ver con los supuestos complots de empresarios ni intentos golpistas organizados por potencias extranjeras. Es, simplemente, un problema de economía básica.

La intención de este artículo no es criticar a nadie, ni a Chávez ni a Maduro ni a ninguno de los que ha intentado lo mismo en la historia del mundo, sino simplemente, explicar por qué ocurre lo que ocurre, cosa que seamos capaces de reconocer estas situaciones a tiempo y no nos termine pasando a nosotros también (otra vez).

CRÓNICA DE UNA CRISIS ANUNCIADA


Para entender bien el problema, pongamos un ejemplo.

Digamos que usted es una persona con el corazón bien puesto, genuinamente preocupado por sus semejantes y llega a la presidencia de un país con mucha pobreza y desigualdad. Usted, naturalmente, quiere ayudar al pobre y para eso existen dos caminos: 

El primero, es seguir el camino tradicional, el camino largo, de intentar hacer crecer la economía, de mejorar la educación y la capacitación laboral, de fomentar el empleo y el emprendimiento, hasta alcanzar niveles de empleo pleno y, con ello, que suban los sueldos. Acompañar eso, además, con políticas sociales que aseguren igualdad de oportunidades a todos y que garanticen los derechos básicos de todos los ciudadanos.

Este camino no le convence.

Paso 1: El camino "fácil" 


Usted sabe que si se limita a hacer crecer la economía, la riqueza se quedará en los bolsillos de los grandes empresarios. Ya lo ha visto pasar suficiente. Además, el proceso es demasiado lento, no piensa esperar una década o dos para ver algo de justicia social. 

Usted está seguro que hay otro camino, uno más rápido, más directo: Su país tiene la billetera llena y no hay tiempo que perder, así que se lanza a repartir subsidios, bonos y beneficios sociales gratuitos a manos llenas, para llevar esa riqueza rápidamente a la gente. Esto, más allá del balance fiscal (es decir, gasta más de lo que recauda)

Para hacer sostenible el mayor gasto, sube fuertemente los impuestos a empresas y grandes fortunas. Puede que incluso, para hacer caja rápido, ordene imprimir más dinero.

Paso 2: Dinero fácil = Inflación


En un primer momento todo anda bien, la gente lo adora y su situación parece ir mejorando... Pero un problema empieza a emerger: los precios están subiendo casi a la par con su generosa ayuda, anulando el esfuerzo. 

¿Qué está pasando? Que el exceso de dinero circulante está generando inflación. Lógico: si hay más plata circulando, esa plata “es menos valiosa” por decirlo así. Para que lo entienda, imagínese que los diamantes empezaran a crecer en los árboles ¿Seguiríamos considerándolos tan valiosos? Lo que da valor a los diamantes es su escasez y el costo de extraerlos. Así mismo,

lo que le da valor al dinero, es que haya que trabajar para ganarlo.

 Cuando a todos les empieza a llegar gratis, pierde su valor. Por lo tanto, como la plata “vale menos”, los precios de los productos y servicios suben.

El segundo factor que influye en el problema, es que esos impuestos que aplicó a las empresas, son traspasados (parcial o totalmente) al usuario.

Paso 3: Fijación de precios = Desabastecimiento y desempleo.


Al ver esto, usted se enfurece ¡Esos empresarios inescrupulosos están echando por tierra todo su esfuerzo con su avaricia! Así que decide tomar cartas en el asunto: Llegó la hora de fijar precios. Eso sí, usted es una persona justa, así que fija un precio “justo” para las cosas. Suficiente para que el negocio marche, pero que nadie se haga rico a costa de otros.

El problema, claro, es que usted sigue regalando dinero y el dinero sigue perdiendo su valor, así que ese precio “justo” rápidamente pasa a ser insuficiente para las empresas, que no logran cubrir sus costos u obtienen márgenes tan bajos, que el negocio pierde el atractivo.

Además, muchos de sus insumos vienen del exterior o no están dentro de su política de fijación de precios, así que esos insumos siguen subiendo, mientras que los productos que se fabrican con ellos, no se pueden vender más caros. Usted ajusta el precio cada cierto tiempo, pero siempre llega demasiado tarde, así que varias empresas, simplemente, paran las máquinas o dejan de importar. Obvio, 

nadie monta una empresa para dedicarse a perder plata.


Producto de la paralización de la industria, mucha gente pierde el trabajo, por lo que se ve en la obligación de implementar más programas de empleo y bonos a costa del Estado, para contener la situación.

Paso 4: Racionamiento = Mercado Negro


Ahora usted tiene otro problema, porque producto de la paralización de las importaciones y producción nacional, empieza el desabastecimiento. Las góndolas de los supermercados empiezan a vaciarse y algunos productos comienzan a escasear. La gente acapara todo lo que puede.

Para intentar frenar el problema, usted empieza a racionar la venta de los productos e insumos esenciales. Fija cuotas máximas para cada familia y empresa. 

El problema es que hacerlo es bastante engorroso y costoso, le obliga a desviar mucho dinero y personal a la tarea y la cosa se presta para todo tipo de arbitrariedades, amiguismos y actos de corrupción.

Como a alguna gente las cuotas asignadas por el gobierno le resultan insuficientes y a otros les queda de sobra, comienza a formarse un mercado negro, en que estos productos se venden de manera informal a precios mucho más altos que los que usted fijó. 

Así, empieza a existir una inflación “oficial”, considerando los precios de las tiendas y una inflación “real” que considera los precios del mercado negro. En cualquier caso, la inflación empieza a escapársele de las manos.

Paso 5: Expropiaciones = Fuga de capitales


Usted empieza a sospechar que muchas empresas están vendiendo directo al mercado negro para obtener mejores márgenes. Y aunque no fuese así, no puede permitir que las empresas sigan deteniendo la producción, así que llega a la determinación de que el Estado debe hacerse cargo. Comienzan las expropiaciones.

Gran parte del valor bursatil de las empresas se va al suelo, pues el temor de los inversionistas a que sean expropiadas, les hace vender a cualquier precio.

Los empresarios y grandes fortunas del país ponen el grito en el cielo y muchos empiezan a hacer sus maletas y a trasladar sus riquezas fuera del país. Otros, producto de la alta inflación, ya se habían refugiado en monedas más seguras para transar sus productos.

La compra masiva de dólares, para sacar el dinero al extranjero, hace perder aún más valor a su moneda nacional. Esto encarece aún más las importaciones.

Paso 6: Fijación de cambio = Más desabastecimiento y mercado negro


La fuga de capitales es preocupante, si la cosa sigue así, pronto no habrán grandes fortunas que paguen impuestos millonarios, así que decide limitar el intercambio de divisas, por la vía de fijar el cambio y, por qué no, imponer cuotas al uso del dólar.

Esto, nuevamente, tiene un impacto en la industria y el comercio, que ahora debe justificar cada pago que envía al extranjero y ajustarse a las cuotas que usted ha asignado. La mayoría de los productos importados, que ayudaban a contener un poco el problema del desabastecimiento, empiezan también a escasear. 

Pronto, emerge un mercado negro de dólares, que una vez más, se transan a valores muy superiores del cambio oficial.

Paso 7: Déficit fiscal = Endeudamiento


Por otro lado, sus asistentes le informan de algo preocupante: Sus empresas expropiadas están funcionando a pérdida y ya no es posible pagarle a sus proveedores y empleados. Consciente que, producto de la alta inflación, subir los precios de los productos para impedir las pérdidas empeoraría aún más las cosas, decide que el Estado se hará cargo de las pérdidas de sus empresas. 

Por otro lado, sus programas sociales están saliéndole un ojo de la cara. La paralización de las empresas y el desempleo que han generado, han obligado a sumar cada vez más gente a sus beneficios. Por otro lado, las pérdidas de las empresas y la fuga de capitales, hacen que logre recaudar cada vez menos impuestos.

Además, producto de la inflación disparada, el dinero cada día vale menos y sus fondos, otrora tan abundantes, empiezan a verse preocupantemente escasos. 

No queda otra que endeudarse con acreedores internacionales, a pesar de que su riesgo país está por las nubes y, por lo tanto, las tasas de interés son altísimas. El dinero fresco al principio es muy bienvenido y le permite salir del paso, pero a falta de modificaciones estructurales a su nivel de gasto, terminan volviéndose otra carga más en su pesada mochila de deudas.

Paso 8: Crisis


Esta última parte puede posponerse por muchos años (dependiendo de qué tan grandes son los bolsillos del país involucrado) y adoptar las más diversas formas. 

Puede, por ejemplo, ocurrir que venga un frenazo económico mundial y estancarse la venta de su producto estrella (petróleo, cobre, lo que sea) y encontrarse repentinamente con gastos gigantescos y bolsillos vacíos. Sin poder pedir más préstamos internacionales, no le queda otra que empezar a recortar programas sociales y entrar en un programa de austeridad, lo que genera un fuerte malestar en la gente.

Puede también que decida devaluar la moneda, con lo que dinero y ahorros de las personas pierden gran parte de su valor, lo que crea gran malestar. Puede que incluso decida usar los ahorros y pensiones de sus ciudadanos para pagar sus deudas. Esto genera que la gente corra a sacar su dinero de los bancos, haciéndolos colapsar o que usted se vea obligado a bloquear el retiro del dinero (un "corralito" bancario).

Otra posibilidad es que, fruto de lo anterior o del desabastecimiento o del desempleo o de la inflación… o de todo esto junto, el pueblo, que tanto lo amaba al principio de su mandato, ahora salga a la calle a protestar y termine reemplazando a su gobierno, ya sea democráticamente en las urnas o por la fuerza.

O quizás, si usted ha sido precavido y ha mantenido generosamente bien abastecidas a las fuerzas armadas, pueda aferrarse al poder por la fuerza, dando paso a una dictadura de facto, a lo largo de la cual continuará haciendo ajuste tras ajuste para intentar revertir el inevitable declive de su economía y progresivo empobrecimiento de su población.

Sea cual sea el desenlace, es claro que sus buenas intenciones no dieron el resultado esperado y que, lejos de ayudar a quienes quería apoyar, ha terminado perjudicándolos.

¿Y cuál sería el camino, entonces?


Lamentablemente, 

no existe una "varita mágica" que cure la pobreza de un solo toque.

 Es un problema grande, complejo y que es fruto de incontables variables. Por lo mismo, requiere también de soluciones complejas: mejorar la educación (acceso y calidad), mejorar la capacitación laboral, fomentar el emprendimiento, mejorar la competencia de las empresas, promover el empleo, mejorar la recaudación del fisco para entregar programas sociales de manera responsable, etc.  Todo ello, en un contexto de estabilidad y seguridad económica y social.

No es "Estado o Mercado", ambos caminos no son necesariamente incompatibles. Por el contrario, parecen necesitarse mutuamente y es el camino que han seguido la mayoría de las economías desarrolladas: potenciar un fuerte y sólido crecimiento económico y un mercado competitivo, pero asegurar una buena distribución de la riqueza con políticas económicas y sociales progresivas. 

No importa si son gobiernos de izquierda, de centro o de derecha, la gran mayoría de los países desarrollados ha encontrado un equilibrio entre ambas fuerzas. Algunos se cargan más al estado, otros se inclinan a la provisión de servicios privados. Sea cual sea el camino, ninguno es perfecto, pero es lo mejor que hemos encontrado hasta el momento.

Los atajos temerarios podrán sonar tentadores e incluso, en un primero momento, parecer más efectivos, pero en el largo plazo, terminan perjudicando a quienes más buscaban ayudar.

viernes, 1 de noviembre de 2013

Conectar Nodejs y Django u otro backend

Hola, Encontré la forma de conectar un servidor hecho en Node.js con algún backend que nos devuelva cualquier tipo de datos. Para mi proyecto necesitaba que Django me devolviera Json a Node.js para poder realizar tiempo real con Socket.io y el cliente; asi que despues de mucho buscar (pasando incluso por jsonp callback) encontré una libreria de mikeal que esta especializada en eso: traer datos de otro servidor por medio de la url:


var request = require('request');
request('http://IP:PUERTO/ecg/pacientes', function (error, response, body) {
if (!error && response.statusCode == 200) {
hacerLoQueSeaConLaRespuesta( body );
}
});

La libreria esta en https://github.com/mikeal/request se llama request y se instala en node con npm install request

Saludos

viernes, 25 de enero de 2013

Trucos Android Eclipse


Hola, en esta entrega les cuento que he estado tocando el tema de desarrollo de móviles con Android; y aunque los IDE's ayudan mucho, todavía tienen ciertos bugs que obligan a realizar ciertos movimientos para que la cosa funcione. Eclipse es el que mejor ha manejado el workflow del desarrollo sobre móviles, pero aun asi, tiene unos trucos que cuando se esta empezando, es complicado adivinar que se tiene que hacer para que funcione, aun cuando aparentemente no hay error alguno.


  • Clean: el comando clean es necesario para volver a realizar una compilación limpia del proyecto y empaquetar todo de nuevo en un apk. Eclipse muestra la carpeta bin que es donde pone el resultado del build; esta se borra en su totalidad con clean y se llena de nuevo con el comando build proyect o si esta activado automáticamente lo hará. 


Cada vez que modifiques una clase o una configuración en xml de los layouts o widgets, es mejor hacer un clean.

  • Build: es común que cuando uno realiza el build, aparezca un archivo activity_main_out.xml estando el activity_main.xml bien sintácticamente, esto es porque al realizar el build no teníamos seleccionado en el árbol del proyecto el elemento raíz (este es el nombre del proyecto, del cual se derivan todas las carpetas y recursos). Es aconsejable que cuando se realiza el clean o el build seleccionar el elemento raíz. 


  • Emuladores: Recuerda que para probarlo en emuladores es mejor arrancar primero el emulador y después seleccionar al ejecutar en la configuración que seleccionaremos el emulador en ejecución.

viernes, 19 de octubre de 2012

Lógica de negocio en Base de datos o Java

 

En el desarrollo de software surgen muchas dudas, una de ellas me hizo reflexionar el siguiente planteamiento:

  1. Lógica de negocio en la base de datos: por lógica de negocio se entiende las reglas y la manipulación de los datos para proveer un resultado esperado. La ubicación de esta lógica supone varias ventajas:
    1. Lógica centralizada: la lógica esta centralizada y no importa el cliente que intente accederla, siempre va a ser la misma, con un mismo lenguaje SQL.
    2. Velocidad: al tener los datos en el mismo motor que ejecuta los procedimientos, se evita el ir y venir entre el servidor web o cliente y la base de datos por datos a procesar.
    3. Actualización: al estar centralizada, un cambio en la lógica actualiza todos los clientes que la utilicen, sin importar la plataforma.

También supone ciertas desventajas:

  1. Difícil de mantener: Trabajar con SQL es como trabajar con Cobol, es programación procedimental en su gran mayoría; agregar una nueva funcionalidad podría suponer revisar muy bien en que parte va y rezar para que nada se dañe.
  2. No hay buenas practicas: no hay test eficientes, no hay metodología orientada a objetos, no hay herencia ni interfaces que podría ahorrar bastante código y simplificar la lógica.
  3. Velocidad: el rendimiento podría llegar a verse comprometido al procesar todo en la base de datos, en vez de ser utilizada solo como repositorio de datos.
  4. Dependencia del proveedor: el software queda atado al SGBD que se utilizo para su desarrollo. Cambiar de motor implica volver a hacer todo de nuevo.

Que opinan ustedes?