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.

Dando mantenimiento al ventilador de la fuente de poder de una PC de escritorio

junio 12, 2016

En ocasiones las PC de escritorio hacen un ruido que proviene de la fuente de poder, generalmente el problema es el ventilador, les comparto un video que hice en donde muestro como darle mantenimiento para deshacernos de ese molesto ruido.

Honor a quien honor merece

mayo 23, 2016

Me asombra lo fácil que la mayoría de las personas sobrevaloran lo hecho por ciertos personajes en un área que desconocen; específicamente me refiero al campo de las tecnologías de la información. Pero más que asombro siento decepción al ver que incluso personas que tienen estudios en dicha área (computación, informática, etc.), estén titulados o no, no den la justa dimensión a los aportes hechos por estos personajes.

La mayoría de las personas vinculadas al área de TI han escuchado de Steve Jobs, pero son pocos los que saben quién fue Dennis Ritchie. Menciono específicamente a estas dos personas porque Steve Jobs murió el 5 de Octubre de 2011 y Dennis Ritchie murió tan sólo 7 días después, el 12 de Octubre de 2011. A pesar de que es mucho más importante y trascendente para el campo de las tecnologías de la información lo que hizo Dennis Ritchie que lo que hizo Steve Jobs, muchos medios hicieron muchos homenajes y destacaron lo que hizo Steve Jobs y casi ninguno habló sobre Dennis Ritchie.

Para empezar, Steve Jobs no fue un “genio de la computación” como algunos ignorantes lo han llamado, el cerebro en cuanto electrónica, computación, etc. en Apple era Steve Wozniak. Jobs tenía una gran habilidad para detectar necesidades no satisfechas en los consumidores principalmente de tecnología y también tenía buen gusto en cuanto a diseño. Pero eso desde luego no lo hace un “genio de la computación”, de hecho dudo mucho que supiera de programación de computadoras.

Muchos creen (erróneamente) que el ipod fue el primer reproductor de MP3 cuando lo cierto es que los reproductores de MP3 de marcas como Creative-Labs ya existían mucho antes (más de un año antes) de que existiera el ipod. Lo que Steve Jobs detectó es que había que pulsar muchas veces el botón + (más) o – (menos) para empezar a escuchar una canción específica, así que se le ocurrió que un reproductor de MP3 en donde pudieras empezar a escuchar la canción deseada de una forma más rápida tendría mejor aceptación y dejó a los ingenieros esa tarea (no fue a él a quien se le ocurrió la interfaz).

Como no faltan los fan boys de Apple o de Steve Jobs que para este punto estén enojados y asegurando que miento, dejo sólo algunos enlaces para que lean

http://ipod.about.com/od/understandingipodmodels/a/invented-ipod.htm

http://www.macworld.com/article/1163181/ipods/the-birth-of-the-ipod.html

Y así básicamente sucede con todas las cosas que muchos creen que “inventó” Steve Jobs. Debo aclarar que no tengo nada en contra de Steve Jobs y que reconozco (como ya mencioné) el talento que tenía para identificar si un producto iba a tener aceptación entre los consumidores (aunque también tuvo equivocaciones como con la computadora Lisa)

Para quienes no sepan qué hizo Dennis Ritchie, sólo les diré que fue quien creó el lenguaje de programación C y junto con Ken Thompson fue uno de los principales creadores del sistema operativo Unix.

Hoy en día muchos jóvenes admiran a ciertas personas sólo porque tienen mucho dinero y son “famosas”, yo prefiero admirar a las personas por la importancia de sus contribuciones a la humanidad, eso incluye no sólo el conocimiento que aportan sino también el ejemplo de vida que dan

Taller de redes de área local

mayo 20, 2016

En colaboración con http://www.softwarelibrepuebla.org/ estoy promocionando un curso/taller sobre redes de área local que voy a impartir en la ciudad de Puebla.

slack-imgs.comEsta es un breve desglose de lo que se tratará en el curso:

Capítulo 1

Veremos qué es una red informática y su clasificación de acuerdo con la distribución geográfica de la misma

Capítulo 2

Se describen los diferentes medios de transmisión que se utilizan en una red informática

Capítulos 3 y 4

Explicamos los estándares que existen para el armado de cables UTP y las reglas que se deben seguir para el cableado de una red informática. Aquí se incluye la primera práctica (armar cables de red)

Capítulo 5

Identificaremos los principales componentes de una red de área local a nivel de hardware

Capítulos 6 al 12

Hablaremos sobre las direcciones IP, qué son, las dos principales versiones de IP que existen, clases de direcciones IP, etc.

Capítulos 13 y 14

En estos capítulos se tratan las subredes

Capítulos 15 al 17

Explicamos que son y para que sirven TCP, DNS y DHCP

Capítulo 18

Finalizamos con redes inalámbricas, los diferentes estándares, seguridad y se hace la segunda práctica