jueves, 25 de junio de 2015

¿Cómo tu código fuente podría salvar el mundo?

El camino por convertirse en un buen desarrollador nunca termina, recuerdo cuando apenas veía introducción a la programación, no importaba realmente cómo codificaba, el objetivo era un solo: ¡Que compilara! (...) Y sí, teníamos unos pequeños engendros en archivos de texto que con dificultad luego podríamos reconocer como propios.

Luego nos preocupamos por que el código hiciera lo que tenía que hacer, resultó ser el mismo engendro pero compilando y funcionando correctamente... Seguramente quienes no tomaron el camino del desarrollo hasta aquí llegaron. Sin embargo, quienes optamos por procesar el café para convertirlo en código seguimos avanzando, prontamente aprendimos mejores prácticas de programación, cómo nombrar adecuadamente nuestras variables, algunos frameworks que facilitaron nuestra vida y de repente nuestro trabajo drásticamente artístico pasó a hacer toda una pieza de ingeniería de software, cuyo diseño y funcionamiento impecable quizá contrastaban contra la poca documentación... ¡Pero es que ese código habla por sí mismo! No necesita más documentación.

 
Finalmente nos enseñaron algo de eficiencia, no lo explicaron en términos de "Complejidad algorítmica" y lo entendimos como "Si está lento, necesitas un mejor PC". Y así fue como toda una teoría de la computación pasó a segundo plano. Hoy no es raro encontrarnos con código productivo cuyos algoritmos están hechos, digamos, "A lo maldita sea", quizá por el empeño de dar una solución rápida a los proyectos, falta de experticia o quizá por nuestra falta de imaginación y no pensar un poco más allá.

Pero ¿Por qué es importante la eficiencia? Quizá debí empezar por aquí, pues un software diseñado con buenas prácticas y los mejores algoritmos no necesariamente sea el más rápido para procesar una acción, sino el que mejor administra los recursos que tiene para hacerlo... ¿Y qué es administrar mejor los recursos? ¿Es usar toda la RAM? ¡Para eso está! ¿Usar toda la CPU? ¡Para eso Intel/AMD lo construyó así! ¿Será acaso usar todo el disco duro? Pues para eso compramos discos ya en terminos de terabytes.

La respuesta es depende porque cada sistema y el negocio que está soportando tiene sus particularidades... Pero vayamos a un software que per se está poco o nulo optimizado ¿Qué pasaría si lo mejoramos en pro de la eficiencia? Mi respuesta es una teoría tan inquietante como sorprendente: ¡Podría salvar el mundo!. Tener código estructurado eficientemente necesariamente tendría un impacto positivo en el uso de los recursos, como comenté antes, esto no quiere decir que el usuario vea que ahora funciona más rápido aunque puede que sí, sino que reduciríamos, por ejemplo, la carga de uso media de CPU, quizá también liberemos algo memoria y por lo pronto también, quizá nos ahorremos un par de llamadas extras a los discos duros.

"Source Code" es una película por allá de 2011, no tiene nada que ver con el post pero me pareció graciosa la imagen para ambientar mi teoría.

¿Y cómo eso podría salvar el mundo? Bueno, alguna vez notaste que al exigir tu PC o portátil ¿Este se calienta más? Esto sucede porque de la misma forma, requiere más energía para responder a tus exigencias... Así las cosas, el primer paradigma a quitarnos de la mente es que sí se puede ahorrar energía eléctrica aún cuando el servidor esté encendido toda la noche. En Internet hay varias herramientas que puedes usar para calcular el uso de energía de un equipo de cómputo en ciertas circustancias. Para soportar mi teoría, encontré un interesante estudio de la Universidad de Pensilvania en el que tenemos el consumo en watts de varios equipos de cómputo sometidos a prueba:


Make & Model Basic Specifications Off (plugged in) Boot (peak) Moderate Use (range) Quiescent (5 minutes of no activity) Sleep
Apple iMac/Intel
21.5-inch
(purchased late 2012)
Core i5, 8.0 GB RAM,
1.0 TB hard drive,
OS X 10.8.2 (clean)
1 60 52-56 44
(18 w/ LCD in sleep)
1
Apple iMac/Intel
21.5-inch
(purchased late 2011)
Core i5, 4.0 GB RAM,
500 GB hard drive,
OS X 10.7.4 (clean)
1 105
92-96 88
(38 w/ LCD in sleep)
1
Apple iMac/Intel
27-inch
(purchased late 2009)
Core i5, 4.0 GB RAM,
1.0 TB hard drive,
OS X 10.7.4 (clean)
1 177 141-147 130
(73 w/ LCD in sleep)
1
Apple iMac/Intel
24-inch
(purchased early 2009)
Core 2 Duo, 4.0 GB RAM,
640 GB hard drive,
OS X 10.6.2 (clean)
1 141 146-154 88
(42 w/ LCD in sleep)
1
Dell Optiplex 9010 All-in-One
23-inch
(purchased late 2012)
Core i7, 8.0 GB RAM,
500 GB hard drive,
Windows 8 Pro (clean)
1 61 43-45 43-44 1
Dell Optiplex 9010
w/ Dell LCD
(purchased mid 2012)
Core i7, 8.0 GB RAM,
Windows 7 Ultimate (clean)
1 48 66 20-22 1
Dell Optiplex 990
w/ Dell LCD
(purchased mid 2011)
Core i7, 8.0 GB RAM,
Windows 7 Professional (clean)
1 86 33-37 28 1
Dell Optiplex 980
w/ Dell LCD
(purchased mid 2010)
Core i7, 4.0 GB RAM,
Windows 7 Professional (clean)
1 66 64-71 46-61 1
Dell Optiplex 780
w/ Dell LCD
(purchased late 2009)
Core 2 Duo, 4.0 GB RAM,
Windows 7 Professional (clean)
2 108 not tested not tested 1
Dell Optiplex 760
w/ 19-inch Dell LCD
(purchased late 2008)
Core 2 Duo, 2.0 GB RAM,
160 GB/7200 RPM hard drive,
UltraSharp 1907FPV display,
Windows 7 Ultimate (clean)
1 116 95-111 81-83
(50-52 w/ LCD off)
1
Lenovo ThinkCentre M91
w/ Lenovo LCD
(purchased early 2012)
Core i7, 8.0 GB RAM,
Windows 7 Professional (clean)
1 88 50-68 40 1

Computer Power Usage
https://secure.www.upenn.edu/computing/resources/category/hardware/article/computer-power-usage

Como podemos notar, un computador exigido al máximo está consumiendo hasta 40% más energía (Dependiendo del modelo) que el mismo equipo en un uso calificado como moderado. Claro, si hablamos de optimizar un algoritmo que se lleva el 100% de la CPU para que solo lo haga 60% no es una tarea fácil (Empezando porque en lo primero que pensaríamos es en comprar un nuevo servidor de acuerdo a nuestros fundamentos en optimización de algoritmos que mencioné antes), aunque he de decir también, que he visto casos en los que en verdad, hay soluciones supremamente sencillas para evitar esos picos de uso de hardware sin sacrificar considerablemente el estado del algoritmo.

Pero eso es un mundo ideal de unicornios y hadas madrinas, seamos incrédulos, supongamos que solo optimizamos con dificultad nada más que un 10% (...) Vienen entonces las siguientes preguntas a mi teoría ¿No se ahorrarán unos pocos watts al año? ¿Y si nuestro sistema corre sobre varios servidores?, ¿Por varios años?... Pues mi percepción es que en el estado en que tenemos a nuestro planeta, cada watt ahorrado, por ínfimo que parezca cuenta. La diferencia es la que haríamos todos si codificamos con la eficiencia en mente.

¿Cómo optimizar nuestro código para salvar al mundo? 


Mi recomendación básica, es ser muy aplicado con las buenas prácticas de programación, esto incluye:

  1. Usar los tipos de datos adecuados para nuestra aplicación. Ej. no usar integer si voy a guardar solo 1 y 0, en ese caso usar boolean ahorraría algo de memoria. 
  2. Analizar detenidamente las consultas a fuentes de datos de tal forma que solo se cargue la información necesaria y haciendo uso de las facultades del motor (Caché, llaves primarias, por ejemplo). 
  3. Arquitecta tu aplicación, diseños modulares y funciones centralizadas permitirán enfocarte mejor en la solución y eventuales inconvenientes de rendimiento. 
  4. Utiliza herramientas de análisis estático de código. Por ejemplo, en Java utilizo Sonar, que da muy buenos tips acerca de la codificación del software.
  5. Reduce al mínimo el nivel de verbosidad de logs de la aplicación y auditoría.
  6. Mientras tu software está en producción ¡Mide su rendimiento! 
  7. Y más importante, nunca dejes de pensar en cómo podrías hacer tu software mejor.
Puede que mi teoria resulte aún un poco fantasiosa y distante para nuestra realidad allá frente al código, pero sigo pensando que en nuestro que hacer diario, siempre podemos hacer algo para que nuestro mundo sea un mejor lugar, por ser más amigables con el medio ambiente... Si pensar desde el código fuente definitivamente no es una opción, seguro estarás pensando de qué otra pequeña forma, podemos salvar el mundo.

martes, 23 de junio de 2015

Compras en línea ¿Realmente confiables?

Antes hablábamos de un futuro, luego de una tendencia y ahora son una realidad al alcance de todos: Las transacciones bancarias a través de Internet están aquí para quedarse, ya no representan toda una novedad pero sí cada día son más evidentes sus ventajas al ahorrarnos tiempo, dinero e incluso siendo más amigables con el medio ambiente evitando el uso de papel.

Otra realidad distinta quizá ocurre en Colombia, partiendo de los pobres niveles de bancarización del país que suponen el mayor obstáculo a vencer por el comercio electrónico. En la práctica es muy poca la gente que tiene acceso a servicios bancarios, ¿Razones? Muchas pero podríamos mencionar aquí brevemente costos, inconveniencia, políticas o ignorancia, lo cierto es que el efectivo sigue siendo el rey.

Imagen cortesía de Marketing Land (http://marketingland.com/survey-82-percent-mobile-users-consult-circulars-store-shopping-103942)

Pero ¿Estamos preparados para las transacciones por Internet? Bueno probablemente la respuesta sea un despreocupado y contundente sí, pero no debemos descuidar entonces la seguridad. A continuación me voy a centrar en el pago "punto a punto". El objetivo es hacer un análisis de las plataformas de cómo funcionan los pagos en sí mismas (El primer punto o extremo) y también desde donde se ejecutan estos pagos, que seguramente será nuestro PC (El segundo punto u otro extremo). Si bien es un problema inherente al comercio electrónico, no voy a profundizar sobre la reputación y diligencia o no de sitios Web de comercio electrónico entendiendo que nuestro primer requisito es asegurarnos que con quien vayamos a hacer una operación bancaria es una entidad o persona reconocida en el mercado.

Básicamente tenemos varias formas de pagar un algo a través de Internet, estos pueden ser:

Nuestro banco

La mayoría de los bancos ofrecen realizar ciertos pagos a terceros a través de su propia página Web. En su forma más simple de entenderlo, ofrece la posibilidad de realizar pagos (Entendido como transferencias) de dinero entre las cuentas de los clientes naturales y empresariales del mismo banco, por lo que de alguna forma el pago es "Directo". Aquí partimos de una premisa importante: Todos los bancos se "Blindan" de puertas para adentro, es decir, tecnológicamente su plataforma generalmente cuenta con estándares muy elevados de seguridad en los que básicamente si algo desafortunado ocurre, es por responsabilidad del cliente. Por lo que enumeramos:

Ventajas
  1. Tecnológicamente avanzado, generalmente los más altos estándares de seguridad. 
  2. En cualquier caso, tienes un doliente directo a quien realizar un reclamo, bien sea por el cumplimiento de la transacción o por alguna inconsistencia. 
  3. Dado que es un "Plus" que ofrecen los bancos, los cargos o comisiones tienden a ser muy bajos o gratuitos. 
  4. Si nunca has realizado pagos por Internet, esta podría ser la primera opción más confiable.
Desventajas
  1. No es muy amplio el abanico de servicios o pagos o terceros que podemos realizar. 
  2. Si la transacción resulta fraudulenta, resulta muy complicado hallar responsabilidad en el banco, son procesos muy largos y generalmente terminan por culpar al cliente alegando poca dligencia del usuario respecto a su equipo de cómputo o descuido de sus credenciales y/o contraseñas. 

Sitios de comercio electrónico

También podemos realizar compras en muchos sitios de Internet en Colombia y el mundo. Generalmente las transacciones se realizan a través de lo que llamamos una "Pasarela de pago" que no es más que un intermediario entre nosotros y el comerciante para procesar el pago. En Colombia podríamos mencionar a Payu Latam y Avisor como dos ejemplos de las pasarelas de pago más populares, pero si hacemos transacciones en sitios internacionales probablemente sea Paypal el primer referente que se nos venga a la cabeza.

Las pasarelas de pago, exponen servicios a través de Internet que los comercios deben implementar en su sitio Web para enviar un pago, estos servicios en sí mismos son incluso más confiables que los que podría ofrecer nuestro mismo banco, pero quizá podría haber un vacío en el cómo el comercio realiza la implementación de dicho servicio, por ejemplo, almacenando de manera inadecuada la información, dejando posibles puertas abiertas a potenciales atacantes.

El caso típico es aquel en el que comercio dice que no recibió el pago, uno verifica en su cuenta y sí se hizo, se llama a la pasarela y dice que procesó el pago correctamente, pero el comercio insiste que todavía no registra el pago, por lo que encontrar una solución en una compra puede ser una tarea dispendiosa. Eso sí, el consumidor ya no está solo, las pasarelas de pago usualmente ofrecen garantías a los usuarios y además cada vez exigen mayores estándares para que su integración con los vendedores sea más coordinada y confiable.

Ventajas

  1. Tecnológicamente muy avanzado, cumplen con estándares de seguridad. 
  2. Puedes comprar virtualmente cualquier cosa. 
  3. Dado que ocurre directamente con un comercio, podrías obtener interesantes descuentos en compras por fidelidad. 
Desventajas
  1. Depende de la fiabilidad del comercio, la implementación segura del sitio Web y la reputación del vendedor.
  2. Dependiendo del vendedor y la pasarela, puedes pagar un cargo adicional por la transacción en Internet y/o el recargo del transporte.
  3. Si la transacción resulta fraudulenta, hay otro más a quien involucrar en la investigación (La pasarela), es posible que también terminen por culpar al cliente alegando poca diligencia del usuario respecto a su equipo de cómputo o descuido de sus credenciales y/o contraseñas. 

El fraude por Internet, una amenaza creciente

Es claro que, también como los comercios ven una oportunidad en vender más y mejores productos a sus clientes, dándoles la posibilidad de comprar personalizadamente y desde la comodidad de su casa, también los amigos de la ajeno ven la oportunidad de sacar provecho a la excesiva confianza de los usuarios.

Puedo afirmar incluso con mi experiencia personal que el procesamiento de pagos por Internet se encuentra tecnológicamente hablando en un nivel de seguridad excepcional... pero entonces ¿Porqué el fraude por Internet es un delito creciente? Bueno, el problema más persistente en efecto radica en el usuario y por ello me refiero a la no cultura que tenemos para resguardar la información. Por ello preparé un pequeño listado de los aspectos más importantes para mejorar nuestra seguridad en la red.

Consejos para comprar por Internet 

  1. Es claro que deberemos comprar solo en sitios Web confiables y con reputación. Sitios Web de almacenes de cadena y marcas reconocidas de tecnología y accesorios hacen parte ya de este catálogo.
  2. Realiza únicamente transacciones en línea desde un equipo confiable. Esto incluye tu sistema operativo debidamente actualizado, con software antivirus vigente y ojalá una buena herramienta anti-malware instalada. 
  3. Nunca utilices redes públicas como el Internet de un restaurante o cafetería para realizar transacciones en línea. Por más que lleves tu PC de confianza, usar redes abiertas expone tu información y tu seguridad. 
  4. Todo sitio que ofrezca transacciones en línea debe tener un certificado SSL. Esto significa que, la dirección URL debe comenzar con https:// y el navegador en ningún momento debe advertirnos de problemas de confianza con el sitio Web.
  5. Yo recomiendo contar con una tarjeta de crédito (No débito) específica para las compras en línea. Las tarjetas de crédito usualmente incluyen seguros de compra antifraude así como otros servicios adicionales que pueden complementar la experiencia de compra.
  6. Evita los sitios que almacenan indefinidamente tu información bancaria, por ejemplo, realizando un solo pago en lugar de realizar varios pagos recurrentes. 
  7. Protege celosamente tu información. Eso incluye guardar en un lugar seguro tus tarjetas, fuera del alcance de desconocidos. 
  8. Desconfía de todo. Suena obvio pero evita suministrar cualquier tipo de información personal o financiera a través de Internet. Por regla general, ningún banco o entidad seria te solicita información a través de Internet o el celular, desconfíe de todo correo electrónico, mensaje de texto, publicación en redes sociales o incluso llamada telefónica que invite a cambiar, modificar o actualizar por ejemplo, tus contraseñas bancarias. En caso de persistir la duda, comunícate con tu entidad a través de sus canales oficiales (Por ej. vía telefónica) para certificar la credibilidad de una comunicación. 
  9. Activa todas las opciones de seguridad que te ofrezca tu banco, segunda clave, doble autenticación a través del celular, mensajes de texto de alerta de transacciones, todo suma a la hora de prevenir o minimizar un fraude. 
 ¿Qué tal ha sido tu experiencia realizando compras a través de Internet? Los comentarios están abiertos.

martes, 2 de junio de 2015

Lo nuevo en Fedora 22 y primeras impresiones


fedora22

El pasado 26 de mayo llegó a nuestros escritorios la versión más reciente de Fedora con importantes novedades... Entre ellas, salta a la vista que es la primera versión que llega realmente la fecha pactada en el cronograma... ¡Todo un hito para un proyecto de software!

Pero bueno, ya hablando un poco más en serio, evidentemente hay componentes destacables en esta versión que tienen más relevancia o menos de acuerdo al sabor de la distribución escojamos:

Workstation


Nuestra versión de escritorio estrena un nuevo componente de notificaciones que le sienta bastante bien, en mi concepto, es una especie de híbrido entre las notificaciones que esperaríamos en un PC y la forma en que las visualizaríamos en un teléfono Android. Esto está apoyado en un nuevo tema (Apariencia) de Gnome que se destaca nuevamente porque reafirma el compromiso de Fedora en traernos una distribución más atractiva y pulida visualmente... Bastante lejos del empaquetamiento "Vanilla" por defecto.

new-notifications-notification.png

También encontramos una mejora en la aplicación "Software App" haciendo más fácil encontrar nuevo software y mantener al día nuestro sistema, pero este cambio tiene, bajo el capó, otra mejora más significativa: Le decimos adiós a YUM, sí señores, el comando yum es parte ya del pasado dando lugar a DNF (dnf). Para los comandos básicos, dnf usa la misma sintaxis de yum (dnf update, dnf install, dnf remove, dnf upgrade) pero para los más avanzados y hay una buena cantidad de comandos adicionales.

¿Por qué se cambió Yum? Bueno, la verdad es que DNF originalmente nació como un fork de Yum pero se modernizó... Es decir, Yum ya tenía sus años pesándole sobre su espalda y era necesario una herramienta actualizada, con API, documentación y bases tecnologícas (Python 2 y 3) más sólidas. Vale la pena aclarar que este cambio aplica también a los sabores Server y Cloud de Fedora 22. La teoría nos dice que dnf debe ser más rápida que Yum en tareas como, por ejemplo, resolver las dependencias pero mi sensación es que es poco perceptible este tipo de beneficios... Incluso por momentos lo he notado (Irónicamente) más lento que lo que podría hacer Yum, algo atribuible a que es "Su primera vez" oficialmente en Fedora.

The Software Application in Fedora 22 Workstation

También tenemos buenos retoques en la aplicación "Files" (El explorador de archivos) dando una mejor vista de archivos y carpetas, así como un rediseño al visualizador de imágenes que da, entre otras cosas, más espacio en pantalla a su razón de ser: Imágenes.

En el caso del escritorio KDE, Fedora 22 incluye ya KDE Plasma 5 como espacio de trabajo por defecto en la distribución, con todas las mejoras a nivel de apariencia y funcionamiento que ello conlleva.

Server 


Por el lado de la edición de los servidores se destaca particularmente que esta edición usará el sistema de archivos XFS por defecto excepto para la partición /boot (Que siempre nos da problemas por el cargador de archivos). Mención aparte merece Cockpit que se ha actualizado para administrar desde el navegador de Internet tus servidores GNU/Linux. Los administradores lo agradecerán.

Cloud


No menos importante, la edición diseñada para la nube estrena nuevas "Vagrant Boxes", que son básicamente, ambientes de desarrollo portables, fáciles de configurar y reproducir.

Paquetería actualizada


Como es usual, Fedora trae a nuestro PC las últimas versiones de los componentes más relevantes del mundo libre, destacamos:

  • Kernel Linux 4.0 
  • GNOME 3.16 
  • KDE 5 
  • XFCE 4.12 
  • LXQt 0.9.0
  • BIND 9.10 
  • Unicode 7.0 
  • Perl 5.20 
  • Ruby 2.2 
  • Python 2.4 Incluye wxPython 3 
  • Gradle 2.2 
  • Git 2.4.1 
  • GCC 5 
  • GHC Haskell compiler 7.8 
  • Django 1.8 

Primeras impresiones


Tal y como comenté al inicio, me sorprendió la puntualidad con que fue publicada esta versión, lo primero que me saltó a la cabeza es que quizá no sería muy estable pero me llevé una grata sorpresa. Si actualizas con FedUp es una de las actualizaciones más "Transparentes" si cabe el término, que he de realizar, cero inconvenientes de dependencias, un reinicio y todo funcionando clara y fluidamente.

Con una distribución sólida pero a su vez moderna, se va quitando ése paradigma que Fedora es el "Beta" de Red-Hat y nos encontramos con un producto y un equipo de trabajo comprometido con el usuario, con un nivel de madurez distinta, estable, bien por la comunidad Fedora.

¿Vale la pena actualizar?


Es una pregunta complicada de hacer y mi percepción personal es que si estás cómodo con Fedora 21 quizá deberías esperar. Fedora 22 trae, sí, mejoras importantes que presentan una clara evolución pero no algo así como un "Debes tenerlo hoy mismo instalado". Ah, pero si estás aún en Fedora 20 (O incluso antes) ahí si te garantizo una experiencia completamente distinta en donde el salto funcional, de apariencia y actualidad de los paquetes harán que valga la pena.