Diferencia entre un contador y un acumulador

agosto 19, 2017

En programación es común el uso de contadores y acumuladores, en este post explico la diferencia porque frecuentemente quienes están aprendiendo a programar confunden unos con otros.

Un contador es una variable que se utiliza para contar algo. Normalmente usamos un contador dentro de un ciclo y cambiamos su valor sumándole o restándole una constante, es decir, siempre se le suma o resta la misma cantidad. El caso más utilizado es incrementar la variable en uno.

En el siguiente programa en C se tiene un arreglo de 10 números enteros y se utiliza un ciclo con un contador para ver cuántas veces aparece el número 3.

Programa contador.c
#include <stdio.h>

int main()
{
 int numero = 3;
 int x=0, contador=0;
 int arreglo[10]={3,7,1,2,7,3,5,6,-2,7};
 
 // Recorre el arreglo y cuenta cuántas veces aparece el valor que contiene la variable numero 
 for (x=0; x<10; ++x)
     {
      if (arreglo[x] == numero)
          /* El nuevo valor de la variable contador va a ser igual a su valor actual más uno
             Se puede escribir como preincremento ( ++contador ) o como postincremento ( contador++ )
             pero para que sea bastante evidente, lo escribí de forma explícita ( contador = contador+1 )
          */
          contador = contador+1; 
     }
 
 printf("\n");
 printf("El número %d aparece %d veces en el arreglo\n", numero, contador);
 
 return 0;
}

El siguiente programa en C es un ejemplo de un contador que se va decrementando en uno; simula una cuenta regresiva.

Programa cuenta_regresiva.c
#include <stdio.h>

int main()
{
 int contador=10;
 
 // Imprime los números del 10 al cero
 while (contador >= 0)
       {
        printf("Despegue en %d\n", contador);
        contador = contador-1;
       }
 
 return 0;
}

Un acumulador es una variable que se utiliza para sumar valores. Al igual que el contador, se utiliza normalmente dentro de un ciclo pero cambiamos su valor sumándole una variable, es decir, no siempre se le suma la misma cantidad.

En el siguiente programa, utilizamos el mismo arreglo del programa contador.c, pero ahora no vamos a contar cuántas veces aparece un número x, sino que vamos a sumar todos los valores que aparezcan en el arreglo y que sean mayores a un número determinado.

Programa acumulador.c
#include <stdio.h>

int main()
{
 int mayores_que = 3;
 int x=0, suma=0;
 int arreglo[10]={3,7,1,2,7,3,5,6,-2,7};
 
 // Recorre el arreglo y suma todos los números mayores al valor que contiene la variable mayores_que 
 for (x=0; x<10; ++x)
     {
      if (arreglo[x] > mayores_que)
          /* El nuevo valor de la variable suma va a ser igual a su valor actual más el número 
             que se encuentra en la posición actual del arreglo
          */
          suma = suma+arreglo[x]; 
     }
 
 printf("Todos los números mayores a %d en el arreglo suman %d\n", mayores_que, suma);
 
 return 0;
}
Anuncios

¿Usas software libre (conscientemente)?

agosto 17, 2017

Muchas personas no saben qué es el software libre (piensan que significa software grátis), otros no han escuchado ese término y algunos lo han escuchado pero dicen que no usan software libre.

Sin importar en cuál de los grupos anteriores te encuentras, lo más probable es que si hayas usado software libre alguna vez, o incluso actualmente lo estés usando sin saberlo. Por ejemplo, si usas algún dispositivo (tablet, smartphone, etc.) que funciona con sistema operativo Android, entonces estás usando software libre ya que el sistema operativo Android se distribuye bajo la licencia Apache versión 2.0 y algunas otras partes del código bajo licencia LGPL, GPL versión 2.0 o algunas otras licencias de software libre.

A los escépticos les dejo este enlace https://www.android.com/everyone/facts/ en donde pueden verificar el Android Fact #18 que dice:

“The Android Open-Source Project (AOSP) is the core software stack behind the Android OS and consists of the operating system, middleware, and open-source apps like a phone dialer, email, and messaging. Mobile operators, device makers, and developers can use this to build devices and apps.”

Y este otro https://source.android.com/source/licenses en donde pueden ver la licencia del Android Open-Source Project (AOSP)

Me propuse hacer una encuesta para saber cuántas de las personas que leen mi blog saben lo que es el software libre, si lo usan o no y ¿por qué?.

Si usas software libre, no importa si es todo un sistema operativo como alguna distribución GNU/Linux, o algún otro software libre funcionando sobre un sistema operativo privativo, puede ser una suite de oficina como LibreOffice o sólo una aplicación como el VLC media player por favor deja tus comentarios. Y si no usas software libre, también me interesa mucho escuchar las razones, puede ser simplemente por desconocimiento, de cualquier forma agradezco el tiempo que te tomes para contestar la encuesta, sobra decir que puedes expresar libremente tu opinión siempre que lo hagas de manera respetuosa.

¿Cómo identificar un sistema de videovigilancia confiable?

agosto 15, 2017

Últimamente la demanda por los sistemas de videovigilancia ha crecido y cada vez es más frecuente ver personas y/o empresas que venden e instalan estos equipos. Hay una gran variedad de marcas y la clave para elegir el sistema de videovigilancia con el que obtengamos el mejor costo-beneficio es tomar en cuenta los siguientes puntos:

  1. Determinar cuál es la información que más me interesa obtener de las imágenes que capture el sistema de videovigilancia que quiero instalar, ya que de esto dependerá el sistema de grabación y el tipo de cámaras. ¿Me interesa únicamente poder determinar cuántas personas o vehículos hay en el área de cobertura de la cámara?, ¿Es importante para mi poder identificar a las personas cuando están a cierta distancia de la cámara?, etc.
  2. Lo barato puede salir caro. No tiene caso comprar el sistema de videovigilancia más económico que encuentre en el mercado si no va ser el que satisfaga mis necesidades, que falle después de unos cuantos meses, que la calidad del video sea mala, etc. Por eso debe considerar lo siguiente:
  • Aunque los equipos de grabación utilizados en los sistemas de videovigilancia (ya sea DVR o NVR) utilizan un disco duro como medio de almacenamiento, se debe utilizar un disco duro especialmente diseñado para ser utilizado en un sistema de videovigilancia. Estos discos duros son idénticos en apariencia a los discos duros utilizados en las computadoras de escritorio, la diferencia radica en que los discos duros especiales para videovigilancia están diseñados para funcioanr 24/7 (las 24 horas los 7 días de la semana) y alcanzar altas temperaturas. Desde luego un disco duro diseñado específicamente para ser utilizado en un sistema de videovigilancia es más caro que un disco duro estándar, aún cuando ambos sean de la misma capacidad.
  • Que el cable que van a utilizar para la instalación sea 100% cobre, no es recomendable usar cable CCA (Copper Clad Aluminum) ya que aunque es mucho más barato, se corre el riesgo de que el video no sea de la mejor calidad que los equipos (el DVR o NVR y las cámaras) pueden alcanzar debido a que la red experimentará una mayor pérdida de paquetes (entre otras cosas). Si están interesados en más de los detalles técnicos vayan a este enlace What CCA Wire Can Do To Your Network
  • Debe utilizarse cable especialmente diseñado para intemperie cuando se instalan cámaras en el exterior (obviamente la cámara también debe estar diseñada para poder instalarse en exteriores). He visto infinidad de instalaciones en las que se instalaron cámaras en exteriores y a pesar de que la cámara si es para exteriores, se utilizó cable que no es para exteriores. Recién instalado funciona bien, pero eso puede durar unos meses o poco más de un año dependiendo de las condiciones ambientales del lugar de la instalación, ya que el cable que no está diseñado para exterior no soporta el sol y la lluvia por mucho tiempo. Personalmente he hecho instalaciones ya sea de enlaces punto a punto, punto-multipunto o de sistemas de videovigilancia que llevan más de 5 años y el cable para exteriores instalado no ha causado problema alguno. Al igual que en el caso de los discos duros especiales para videovigilancia y el cable 100% cobre vs cable CCA, el cable para exteriores cuesta más que el cable que no es para exteriores, pero se debe considerar que es más caro volver a cablear cada año (además del costo del nuevo cable, hay que tomar en cuenta el costo de la mano de obra) que invertir al principio de la instalación para no tener problemas después.
  • Cuando compare el costo de las cámaras, no sólo tome en cuenta la resolución de las mismas, sino además la tecnología y funciones extra que incorporan, como DNR (Digital Noise Reduction), WDR (Wide Dynamic Range), etc. ¿Por qué esto es importante?, vea la diferencia de la imágen en una cámara con el WDR encendido y apagado https://www.youtube.com/watch?v=sYLc6U4X8PU

No se deje engañar con el argumento que le dan los vendedores de los tianguis en donde comercializan tecnología “es lo mismo pero más barato” y también tome en cuenta lo aquí expuesto antes de comprar su sistema de videovigilancia en el club de precios en donde compra su despensa.

Les dejo otros enlaces de interés:

http://www.topsystems.com.mx/Videovigilancia/

https://www.facebook.com/Top-Systems-570057519841810

Libre no significa “gratis” ni “sin licencia”

junio 1, 2017

Es asombrosa la cantidad de personas relacionadas con el área de tecnologías de la información (ya sea estudiantes, profesionales y académicos) que aún piensan que “Software Libre” es sinónimo de software gratis o que el software libre no tiene licencia.

Ya comenté en uno de los primeros post que escribí en este blog (Software Libre, Open Source, Freeware) las características que debe cumplir cualquier software para ser considerado software libre, y entre esas características no se incluye el que tenga que ser gratis o que tenga que distribuirse sin licencia.

Hay muchas licencias bajo las que se puede distribuir software libre, probablemente la más conocida es la GPL (General Public License). Las licencias de software libre se pueden clasificar en dos tipos: con copyleft y sin copyleft.

Un software que tiene licencia con copyleft obliga a que las modificaciones o trabajos derivados del mismo se distribuyan bajo la misma licencia y por lo tanto sean también software libre (una vez más, esto no implica que se distribuya de forma gratuita).

Un software que tiene licencia sin copyleft permite que las modificaciones o trabajos derivados del mismo se distribuyan bajo una licencia diferente, incluso bajo una licencia que haga que dicho trabajo derivado ya no sea software libre (no cumpla con las 4 libertades del software libre) como el caso de las licencias tipo BSD por ejemplo.

Es importante respetar la licencia del software libre que usamos (sobre todo si haces modificaciones o trabajos derivados), sin importar si lo obtuvimos de forma gratuita o no. Desafortunadamente hay personas y empresas que por ignorancia o deliberadamente ignoran las licencias con copyleft y esto puede hacerlos acreedores a una demanda, como un caso reciente en donde la empresa CoKinetic Systems, Corp. demandó a Panasonic Avionics Corporation por $100 millones de dólares (http://www.4-traders.com/PANASONIC-CORPORATION-6492473/news/Panasonic-CoKinetic-Systems-Corp-files-Monopolization-Claim-Against-Panasonic-Avionics-Corporati-23976492/) por violar deliberadamente la licencia GPL.

Para más información sobre licencias bajo las que se puede distribuir software libre, consulten https://www.gnu.org/licenses/license-list

Una licencia sin copyleft aún más permisiva que las tipo BSD es la licencia “Do What The Fuck You Want To Public License (WTFPL)” que aunque si califica como una licencia de software libre, no es recomendable.

Uno de los objetivos del proyecto gpl-violations.org  es hacer del conocimiento público los casos de usuarios que violan la licencia GPL específicamente, pero el objetivo más importante es  sin duda hacer que las empresas que distribuyen trabajos derivados de software libre que tiene licencia GPL entiendan que dicho software no es del dominio público y que deben cumplir los términos de la licencia. Afortunadamente varias demandas interpuestas por esta organización han tenido éxito y los infractores han tenido que pagar multas más los costos del juicio.

El Software Freedom Law Center proporciona asesoría legal a la comunidad de desarrolladores de software libre y open source.

¿Son buenos los hackathones?

mayo 6, 2017

Tiene algún tiempo que los hackathones están de moda, les recomiendo que lean WTF is a hackathon?

En mi opinión los hackathones aportan diversión a los asistentes y una forma de socializar y conocer a otras personas con interéses comunes pero tienen muchas cosas negativas.

El desarrollar un proyecto de TI de mediana calidad (ya sea desarrollar una aplicación web, una aplicación móvil, una aplicación de escritorio, un gadget, o cualquier hardware) es imposible en 48 horas o un fin de semana y menos si no duermes (si tu mente y tu cuerpo están cansados, no tienen un rendimiento óptimo).

Un hackathon fomenta el escribir código de mala calidad, malos hábitos alimenticios, malos hábitos de trabajo (no descansar lo suficiente) y trabajar bajo presión. No dudo que muchos de los jóvenes que asisten a un hackathon crean que están aprendiendo mucho, ya sea de tecnología o de cómo es la vida laboral de alguien que se dedica a desarrollar software, pues dejenme decirles que están equivocados, un buen proyecto de desarrollo de software implica hacer el análisis y diseño del sistema antes de teclear una sola línea de código, hacer un buen diseño de base de datos y seleccionar la plataforma y herramientas de desarrollo que ayuden a obtener un software de buena calidad al final.

Se deben hacer pruebas conforme se va avanzando en el desarrollo del sistema y no sólo hasta el final, además de que se debe ir documentando el código.

Hackathon 2013 taking place at Politehnica University of Bucharest

Exsiten muchas personas que desarrollan software como se hace en un hackathon, pero ese software está muy lejos de ser algo de buena calidad.

No falta quien argumente “pero la app x o z salió de un hackathon” (reemplazar x o z con el nombre de cualquier app muy popular y mayormente usada por jóvenes). El hecho de que un software sea muy popular no significa que sea de calidad, un caso muy concreto es el sistema operativo Windows, que es el sistema operativo más usado en el escritorio y todos sabemos que es de pésima “calidad”, el que en pleno año 2017 crea que Windows es un software de buena calidad tiene un concepto muy equivocado de lo que es la calidad.

Si asisten a un hackathon no imiten las malas prácticas que ahí verán, la mejor forma de aprender es adquiriendo conocimento formal (generalmente en la Universidad) y llevándolo a la práctica (adquirir experiencia laboral, no necesariamente trabajando en una empresa o para alguien más).

Si quieren ser ricos y famosos probablemente lo logren asistiendo a un hackathon y desarrollando la próxima killer app, pero si quieren aprender realmente, no pierdan su tiempo asistiendo a esos eventos.

Si su interés es pasar un fin de semana con algunos de sus amigos programadores tomando cerveza, comiendo comida chatarra y develarse mientras programan sin preocuparse por hacerlo bien y de paso tener la posibilidad de conocer a otras personas, entónces asistir a un hackathon puede ser una buena opción.

¿Cómo diferenciar un buen desarrollador de software en Ruby del resto?

abril 11, 2017

Rails != Ruby

La primer diferencia entre un buen desarrollador de software en Ruby de uno malo no tan bueno es que el primero sabe que una cosa es Ruby y otra cosa es Rails. Ruby es un lenguaje de programación y Rails es sólo un framework para desarrollo web con Ruby.

Si alguien usa indistintamente (como si fueran sinónimos) Ruby y Rails (o RoR) ya sabemos que no es un buen desarrollador de software en Ruby y desafortunadamente hay muchos. Si tú quieres ser un buen desarrollador de software en Ruby lo primero que debes tener claro es que Ruby existe sin Rails pero Rails no existe sin Ruby, es decir, puedes desarrollar software usando Ruby sin usar Rails (incluso puedes desarrollar una aplicación web usando Ruby sin usar Rails) pero no puedes usar Rails con un lenguaje de programación que no sea Ruby.

Sólo usa Rails para desarrollo de aplicaciones web si te ves obligado

Rails es sin duda el framework más famoso para desarrollo de aplicaciones web con Ruby pero eso no significa que sea el mejor, de hecho es un framework que definitivamente yo no recomiendo si se trata de hacer una aplicación web profesional y robusta

Si alguien quiere aprender Ruby, lo peor que puede hacer es empezar con Rails. ¿Por qué opino que Rails es tan malo?; voy a exponer sólo algunos puntos y se que a quienes son fans de Rails estos puntos (ni cualquier otro argumento) los va a convencer, pero este post no está dirigido a ellos, como dice el dicho “No hay peor ciego que el que no quiere ver”.

Muchos de los que usan Rails creen saber Ruby y en la mayoría de los casos no es así, ejemplo: en muchas aplicaciones desarrolladas con Rails encontrarán en el código el uso de blank?. Abran una sesión de Ruby y tecleen algo como “prueba”.blank? y verán algo como NoMethodError: undefined method `blank’ for “prueba”:String. Eso es porque blank? no existe en Ruby, es una extensión de Rails. Pero muchos de los que usan Rails no saben eso, porque creen que blank? es una instrucción válida en Ruby.

Otra de las cosas por las que Rails no es un framework recomendable es porque está muy ligado a un ORM llamado Active Record y es uno de los peores ORM que existen para Ruby, el mejor ORM para Ruby que yo he usado es Sequel, seguido de DataMapper.

Active Record no soporta llaves primarias compuestas, el default es que la llave primaria de las tablas en la base de datos este formada por un solo campo llamado id, de tipo entero y además autoincrementable. Si en la Universidad tuviste un profesor(a) de Bases de Datos que más o menos supiera de lo que estaba hablando sabrás que una base de datos en la cual la llave primaria de todas sus tablas esté formada por un solo campo que además se llame igual en todas y tenga que ser de tipo entero es una base de datos que no te encontrarás en producción en el mundo real; a menos que esa base de datos la haya creado alguien que no tiene idea de lo que es el diseño de base de datos, o que sea una base de datos que usa una aplicación hecha en Rails.

Supongamos que tienes que desarrollar una aplicación web para el área de control escolar de una institución educativa. Tienes una tabla de asignaturas en donde cada asignatura tiene una clave que es un campo alfanumérico, tienes otra tabla de estudiantes en donde cada estudiante tiene una matrícula que también es un campo alfanumérico. Lo lógico es que no existan dos asignaturas con la misma clave y tampoco existan dos estudiantes con la misma matrícula. ¿No sería razonable que la llave primaria en la tabla de asignaturas fuera la clave de asignatura y en la tabla estudiantes la llave primaria fuera la matrícula?. Aquí hay un post que ejemplifica lo que hay que hacer en Rails para usar una llave primaria que no sea de tipo entero Non-Integer primary keys in Rails

Y dado que la relación entre estudiantes y asignaturas es del tipo muchos a muchos, tendremos una tabla para saber qué estudiantes están inscritos en una asignatura o visto de otra forma, todas las asignaturas en las que está inscrito un estudiante; ¿no sería lo mejor que la llave primaria de esta tabla estuviera formada por los campos clave de asignatura y matrícula? y además esos campos serían también llaves foráneas ya que son heredados de las tablas de asignaturas y estudiantes respectivamente. Para cualquiera que sepa lo básico de bases de datos relacionales esto es obvio.

Aquí están los diagramas Entidad-Relación (obvio las tablas tendrían más campos además de los que se muestran en el ejemplo y la base de datos contendría otras tablas además de estas)

Base de datos bien diseñada

Base de datos estilo Rails

Hay una gema llamada composite_primary_keys cuyo propósito es solucionar esta situación, pero no funciona 100% como debería.

El argumento de los fans de Rails es que no “luches” en contra de las “convenciones” de Rails, el problema aquí es que esas “convenciones” están mal diseñadas, si para desarrollar una aplicación web usando rails tengo que seguir sus “convenciones”, lo que implica que haga un mal diseño de base de datos (entre otras malas prácticas) o si intento hacer un diseño de base de datos decente tengo que estarme peleando con la herramienta y “parches” para hacer que las cosas funcionen como deben entonces lo mejor es no usar Rails.

Existen otros frameworks para desarrollo web en Ruby, Sinatra por ejemplo es un framework que a diferencia de Rails, no se interpone en tu camino. Eso si, Rails puede hacer algunas cosas automáticamente por ti y en Sinatra tu tienes que programar todo, así que podemos elegir entre usar un framework con el que desarrollemos una aplicación en la que escribamos menos código pero muy probablemente esté mal hecha (si seguimos sus “convenciones”) o usar un framework en el que todo el código lo hayamos tecleado nosotros pero las cosas pueden estar bien hechas (si nosotros las hacemos bien).

Si eres flojo, no te gusta mucho programar, o si no te importa que la aplicación que vas a desarrollar utilice una base de datos mal diseñada por ejemplo, puedes usar Rails, o si en tu trabajo te obligan a usarlo porque son de los que se van con lo que la mayoría usa sin conocer realmente las implicaciones de esa decisión.

Otra muestra de porque en mi opinión Rails no es un buen framework: Estos son los archivos y directorios que tendrías si usas Rails para desarrollar una aplicación web que lo único que haga sea mostrar la hora actual

Para desarrollar la misma aplicación web usando Sinatra sólo necesitamos un archivo con el siguiente código

require 'sinatra'

get '/' do
“La hora acutal es: #{Time.now}”
end

Si usas Sinatra es más fácil que sepas exactamente qué código es Ruby y qué codigo pertenece a instrucciones del ORM (sin importar si el ORM que usas es Active Record, DataMapper, Sequel, etc.), un buen desarrollador de software en Ruby jamás intentará usar blank? si no está desarrollando en Rails; pero ningún buen desarrollador de software en Ruby usaría Rails, a menos que en su trabajo se vea obligado desde luego.

Si tú eres un buen desarrollador de software en Ruby pero te obligan a usar Rails en tu trabajo te aconsejo que busques otro trabajo o que trates de convencer a tus jefes de que usen otro framework, aunque eso muchas veces es más difícil.

Si tú eres un buen desarrollador de software en Ruby y por lo tanto no usas Rails, te felicito, no conozco a muchos

Si programas en Ruby y hasta ahora has estado usando Rails cuando necesitas desarrollar una aplicación web, espero que esta información te ayude a empezar a usar otro framework, yo uso Sinatra pero existen otros como Cuba, Padrino, etc. Te invito a que investigues y encontrarás muchas más buenas razones para no seguir usando Rails

Para algunos existen buenas razones para usar Rails, aunque esas razones para mi no son suficientes, algunas de estas razones son que hay mucha más documentación para Rails que para otros frameworks, la mayoría de las ofertas de trabajo para desarrolladores de software en Ruby son usando Rails, etc. Estos argumentos son ciertos, y el último de ellos de hecho es lamentable, pero si tu objetivo es aprender y ser un buen desarrollador de software en Ruby y no tanto usar x framework porque es el que la mayoría usa o porque con eso te será más fácil encontrar un trabajo, entónces probablemte tampoco para ti esos argumentos sean suficientes.

Motivos para seleccionar PostgreSQL en lugar de MySQL

febrero 14, 2017

MySQL es un RDBMS muy popular y como seres humanos tendemos a aplicar la política del menor esfuerzo, así que cuando se requiere desarrollar una aplicación en donde es necesario utilizar una base de datos, la mayoría piensa inmediatamente en MySQL.

Yo siempre he preferido PostgreSQL sobre MySQL, a continuación expongo algunos de los motivos

La configuración por defecto de PostgreSQL respeta todas las restricciones y validaciones que se indican en el diseño de la base de datos, MySQL no, uno debe configurar el servidor en modo “Strict SQL”, de lo contrario, se insertarán valores “ajustados”.

Por ejemplo, no importa si una tabla se creó con un campo numérico con una restricción de NOT NULL, la configuración por defecto de MySQL permitirá insertar registros en esa tabla aún cuando no se especifique un valor para ese campo, almacenando un cero como valor. Aún seleccionando el modo “Strict SQL”, MySQL no soporta check constraints.

El único de los nueve motores de almacenamiento de MySQL que soporta integridad referencial y transacciones es InnoDB (MyISAM no soporta integridad referencial ni transacciones), PostgreSQL sólo trae un motor de almacenamiento y soporta integridad referencial y transacciones.

PostgreSQL cumple con ACID (Atomicity, Consistency, Isolation, Durability) al 100%, MySQL no, el mismo manual de MySQL no indica “full ACID complaint” sólo dice “follows ACID”

PostgreSQL soporta más tipos de datos y estructuras que MySQL

El tamaño máximo por renglón en una tabla de PostgreSQL es de 1.6TB mientras que en MySQL es de 65,535 bytes

Algunas cosas que MySQL no soporta y PostgreSQL si:

  • Full Outer Joins

  • Window Functions

  • CTE (Common Table Expressions) para SQL recursivo

  • Table functions

  • JSON (JavaScript Object Notation)

Para extender el servidor, MySQL cuanta con un plugin para C/C++, PostgreSQL soporta C/C++, Java, .Net, Perl, Python, Ruby, Tcl, ODBC y otros más

PostgreSQL es mejor que MySQL en cuanto a consistencia de datos, estabilidad, mantenimiento y recuperación de datos.

Algunas lecturas recomendadas:

http://www.slideshare.net/anandology/ten-reasons-to-prefer-postgresql-to-mysql

https://www.compose.io/articles/what-postgresql-has-over-other-open-source-sql-databases/

Procesamiento de archivos con Ruby

febrero 1, 2017

En este post voy a mostrar un ejemplo de procesamiento de archivos con Ruby haciendo referencia a un caso real que se me presentó.

Se tiene un archivo csv llamado datos_clientes.csv y un archivo txt llamado solo_correos.txt; el archivo csv contiene una lista de clientes con datos como nombre, correo electrónico, teléfono, etc. y el archivo txt sólo contiene direcciones de correo electrónico.

El contenido del archivo datos_clientes.csv puede ser algo como esto:

NAME,E-MAIL
SALOMON RINCON TORRES,rtmex@yahoo.com
TOP SYSTEMS S.A DE C.V.,ventas@topsystems.com.mx
SALOMON RINCON TORRES,salomonrincon@softwarelibrepuebla.org
JOHN DOE,ejemplo@gmail.com

y el contenido del archivo solo_correos.txt podría parecerse a esto:

ventas@topsystems.com.mx
ejemplo@gmail.com
rtmex@yahoo.com

Imaginemos que ambos registros tienen cientos o miles de líneas

El objetivo es leer cada uno de los correos del archivo solo_correos.txt y buscarlo en el archivo datos_clientes.csv, si se encuentra, guardar el correo y el nombre del cliente al que pertenece dicho correo en un nuevo archivo csv (en este caso el archivo se llamará resultado.csv).

Aquí el código

require 'csv'

# Declara el encabezado para el archivo que se creará
encabezado = ['correo', 'nombre']
correo = nil
nombre = nil
num_linea = 0

CSV.open('resultado.csv', 'w', write_headers: true, headers: encabezado) do |archivo_nuevo|
    # Abre el archivo que contiene cada una de las líneas que se van a buscar en otro archivo
    File.open("solo_correos.txt") do |archivo|
         archivo.each do |linea|
             num_linea += 1
             puts "Linea #{num_linea} del archivo solo_correoa.txt = "+linea.strip
             # Abre un archivo delimitado por comas
             # En la segunda columna de este archivo, se busca la línea que se leyó del primer archivo
             CSV.foreach('datos_clientes.csv', headers: true) do |linea2|
                 if linea2[1].strip == linea.strip
                    puts "El correo "+linea.strip+" pertenece a "+linea2[0].strip
                    correo = linea.strip
                    nombre = linea2[0].strip
                    archivo_nuevo << [correo, nombre]
                    break
                 end
             end
         end
    end
end

El programa va mostrando el número de línea y su contenido conforme va procesando el archivo solo_correos.txt. Cada vez que en el archivo datos_clientes.csv encuentra el correo que leyó del archivo solo_correos.txt, muestra a que cliente pertenece dicho correo.

Lo que iría mostrando el programa mientras va procesando el archivo solo_correos.txt sería algo como esto:

Linea 3 del archivo solo_correos.txt = rtmex@yahoo.com
El correo rtmex@yahoo.com pertenece a SALOMON RINCON TORRES

Cuando el programa termina, tenemos un archivo csv llamado resultado.csv con 2 columnas, la primera contiene el correo electrónico y la segunda el nombre del cliente al que pertenece dicho correo.

Películas que recomiendo a mis estudiantes

diciembre 12, 2016

Estudiar una carrera universitaria relacionada con las tecnologías de la información implica retos que en ocasiones pueden causar frustración en algunas personas.

Además de temas relacionados con computación, tecnología, etc. soy aficionado a ver buenas películas (no necesariamente en el cine), así que para animarlos a superar esta frustración y como una forma de motivarlos, les recomiendo a los estudiantes ver las siguientes películas, todas basadas en casos de la vida real (dejo un enlace a la reseña de Rotten Tomatoes para que sepan más de que se trata la película y puedan ver un trailer)

The Man Who Knew Infinity (2016)

Es la historia del genio matemático Srinivasa Ramanujan

Homeless to Harvard: The Liz Murray Story (2003)

El caso de Liz Murray es una historia de superación personal increible

The Imitation Game (2014)

Todo el que en la universidad llevó la asignatura de automatas recuerda la máquina de Turing, y en inteligencia artificial el test de Turing. Esta película es la historia de Alan Turing

A Beautiful Mind (2001)

La historia del matemático John Nash, conocido principalmente por sus contribuciones a la teoría de juegos

La siguiente película no está basada en un caso de la vida real pero también sirve como motivación para buscar la superación académica

Good Will Hunting (1997)

Si ya las han visto todas, los felicito, tienen buen gusto cinematográfico, y si no las han visto, creo que no se arrepentirán si lo hacen

Software para music scheduling

agosto 12, 2016

Hace ya varios años, cuando estudiaba los últimos semestres de la licenciatura, recibí en la noche (como a las 11:00 p.m., yo ya me encontraba durmiendo) una llamada de un amigo mio que estudiaba los últimos semestres de ciencias de la comunicación y era el responsable de la programación de una estación de radio; la llamada era para pedirme ayuda porque tenía problemas con el software que tenían en esa estación para hacer el music scheduling. Pasó por mi y fuimos a la estación de radio, recuerdo que si tenía un bug el software, pero no tenían el código fuente, así que no me era posible arreglarlo.

Recuerdo que le comenté que además estaba muy mal diseñado, la interfaz de usuario era pésima y en tono de broma le dije que era mejor hacer uno nuevo que arreglar ese. No se si el lo tomó como broma o no pero me dijo que no era mala idea, a lo que yo contesté que el problema era que yo no sabía acerca de cómo programar una estación de radio; inmediatamente el replicó “pero yo si”. Así que el me explicó que es lo que hacía el software que tenían en esa estación, pero también me dijo qué cosas consideraba que le hacían falta o funciones que serían de gran ayuda.

Para cuando terminé de desarrollar la aplicación, aunque sólo fueron unos cuantos meses por las clases, etc. el ya no trabajaba en esa estación de radio. El sistema estaba terminado y el pensó que sería muy útil para cualquiera que estuviera a cargo de la programación de una estación de radio, así que empezó a ofrecerlo entre sus colegas. El software tuvo buena aceptación; incluso una estación en Nueva York compró una licencia.

Fui mejorando el software con la retroalimentación de los usuarios. Veinte años después, he desarrollado otro software para music scheduling que supera desde luego al de aquel entonces.

Es una aplicación web que desarrollé utilizando Ruby y Sinatra. Aquí les dejo una captura de pantalla, pero para más información pueden ir a la página http://www.topsystems.com.mx/SGP

playlist

La aplicación permite registrar varios usuarios para que hagan uso del sistema, cada uno con su propia contraseña. Si el servidor en el que se instala la aplicación tiene acceso a internet, cualquier usuario puede usar la aplicación desde cualquier lugar en donde se encuentre si cuenta con una computadora y conexión a internet.

Las máquinas cliente no requieren tener muchos recursos, puse un servidor de prueba (con 600 registros) y un amigo me hizo favor de probar remotamente la aplicación utilizando una raspberry pi y me comentó que funcionaba bastante rápido.