El código ASCII

enero 19, 2016

Si estás en el área de las tecnologías de la información, debes conocer el código ASCII. ASCII es la abreviación de American Standard Code for Information Interchange (código estándar americano para el intercambio de información) .

El código ASCII contiene 128 caracteres (numerados del 0 al 127) que están codificados utilizando números enteros, los cuales se obtienen utilizando 7 bits. Recordemos que las computadoras sólo entienden binario (ceros y unos). En ASCII, el número cero está representado por el código 48, la letra A por el código 65, que utilizando 7 bits en binario es 1000001.

Para los que no sepan binario… aprendan, jeje. No, aquí un breve repaso, pero si les recomiendo aprender.

En este caso nos dicen que sólo debemos usar 7 bits, así que ponemos 7 casillas (una para cada bit).

[ ][ ][ ][ ][ ][ ][ ]

Cada bit sólo puede estar prendido o apagado, utilizamos uno para indicar que está prendido y cero para indicar que está apagado. El bit menos significativo es el que está en la extrema derecha y el más significativo es el que está en la extrema izquierda. El valor que representa cualquier bit cuando está apagado es cero.

Para determinar el valor de un bit cuando está prendido, debemos seguir la siguiente regla:

El valor del bit menos significativo cuando está prendido es uno. El valor de cada bit siguiente (de derecha a izquierda) cuando está prendido es el doble del valor del bit anterior. Esto significa que el bit menos signifcativo representa uno si está prendido, el siguiente bit representa dos si está prendido, el siguiente representa 4 si está prendido, y así sucesivamente.

[ ]   [ ]   [ ]   [ ]   [ ]   [ ]   [ ]

64  32  16    8     4     2     1

Para obtener el 65 prendemos el bit más significativo y el menos significativo y dejamos todos los demás apagados, al sumar los valores que representan cuando están prendidos, obtenemos 64 + 1 = 65

[1]   [0]   [0]   [0]   [0]   [0]   [1]

64   32    16      8      4       2     1

Así que podemos obtener los números del 1 al 10 en binario utilizando sólo 4 bits:

1 = 0001

2 = 0010

3 = 0011

4 = 0100

5 = 0101

6 = 0110

7 = 0111

8 = 1000

9 = 1001

10 = 1010

Dentro de los 128 caracteres del código ASCII, además de las letras del alfabeto en inglés (no incluye la ñ) se encuentran los números y otros caracteres como el espacio (código ASCII = 32), el tabulador horizontal (código ASCII = 9), etc. Existe una tabla conocida como el código ASCII extendido que contiene otros caracteres (como la ñ, vocales con acento, entre otros) numerados del 128 al 255.

La tabla completa del código ASCII y ASCII extendido se puede encontrar en internet sin problemas. Hay otras codificaciones que contienen muchos más caracteres, la más usada actualmente es el código UTF-8 (de hecho ASCII viene siendo un subconjunto de UTF-8), pero de UTF-8 probablemente escribiré en otro post.

La verdadera Free Beer

noviembre 19, 2015

En la página de GNU http://www.gnu.org/home.en.html, en la parte que dice What is Free Software? se puede leer:

Free software is a matter of liberty, not price. To understand the concept, you should think of “free” as in “free speech”, not as in “free beer”.

Esto es para evitar la confusión que puede darse debido a que en inglés “free” puede significar libre, pero también puede significar gratis.

El párrafo en inglés se puede interpretar como:

El Software Libre es una cuestión de libertad, no de precio. Para entender el concepto, debes usar la palabra “free” pensando en libertad de expresión, no en cerveza gratis.

En la página https://www.gnu.org/philosophy/free-sw.es.html lo ponen así:

El «software libre» es una cuestión de libertad, no de precio. Para entender el concepto, piense en «libre» como en «libre expresión», no como en «barra libre»

Muchos entusiastas del Software Libre sin duda saben eso, lo que creo que algunos no saben es que existe una cerveza open source, y se llama precisamente FREE BEER http://freebeer.org/blog/, y la receta está publicada bajo una licencia creative commons que permite a quien quiera fabricar su cerveza, incluso hacer derivadas.

De hecho, en un párrafo de la página de freebeer.org se puede leer “You can make money on FREE BEER”

freebeerSalud

Evento de la comunidad de software libre de Puebla

noviembre 12, 2015

Unos amigos y yo formamos un grupo llamado Software Libre Puebla (pueden visitar la página en www.softwarelibrepuebla.org, sigue en construcción pero ya hay algo de información). Para este 5 de Diciembre (año 2015) vamos a realizar una seria de conferencias, demos y talleres en la ciudad de Puebla; la entrada es gratuita y para todo público.

Gracias a los amigos de Inventoteca por el apoyo que nos han dado para realizar este evento

Preposada geek 2015

Preposada geek 2015

Pueden registrarse en boletia https://preposadageek.boletia.com/

Diseño de bases de datos relacionales con Software Libre

noviembre 9, 2015

Para hacer el diagrama Entidad-Relación de una base de datos relacional es recomendable contar con una aplicación que nos permita (además de hacer el diagrama) generar un script de sql que podamos ejecutar en nuestro RDBMS para crear la base de datos.

La herramienta que yo uso se llama Power Architect, utilizo la versión Community Edition que se distribuye bajo una licencia GPL3 y además de forma gratuita. Cuenta con versión para Windows, OS X y para GNU/Linux (esta versión en la página aparece como Unix/Generic, supongo que significa que también funciona en algún sistema operativo Unix como FreeBSD, etc.)

Una vez que hemos creado el diagrama Entidad-Relación, la aplicación nos permite generar un script que contenga las instrucciones SQL necesarias para crear la base de datos en el RDBMS que seleccionemos (soporta MySQL, PostgreSQL, entre otros).

Necesitamos tener instalada una JVM (Java Virtual Machine) para poder ejecutar la aplicación

¿Realmente sabes cómo funciona el ciclo for en C?

julio 3, 2015

El ciclo for en C está compuesto de tres instrucciones: for (instrucción uno; instrucción dos; instrucción tres).

Las instrucciones uno y tres son opcionales, es decir, podemos ponerlas o no; pero la instrucción dos no la podemos omitir y además debe ser una condición que pueda evaluarse como verdadera o falsa. Esto significa que podemos tener un ciclo for de la forma: for ( ; condición; ).

Muchos programadores creen que la única forma de utilizar un ciclo for en C es la clásica forma: for (iniciar variable; condición de paro; incrementar variable) y están equivocados.

El ciclo for en C funciona siguiendo los siguientes pasos:

1. Realiza las operaciones de la instrucción uno (si la hay), estas operaciones sólo se ejecutan una vez

2. Evalúa la condición (la instrucción dos)

3. Si la condición es verdadera, ejecuta el cuerpo del ciclo for

4. Ejecuta la instrucción tres (si la hay)

Después de ejecutar el cuerpo del ciclo (el cual se ejecuta sólo si la condición es verdadera) se realiza el paso 4 y se repiten los pasos 2 y 3

 Podemos tener un ciclo for en donde el cuerpo del ciclo esté vacío, por ejemplo:

int main()
{
 int i;
 for (printf( "ejemplo for vacío\n"), i=0; i<5; printf("i: %d\n", i++))
      ;
 return 0;
}

En la primera instrucción, estamos haciendo dos cosas: 1. Imprimiendo el texto “ejemplo for vacío” y 2. inicializando la variable i con el valor cero.

La condición (instrucción dos) es que el cuerpo del ciclo se va a ejecutar mientras el valor de la variable i sea menor que 5

La instrucción 3 imprime el texto “i: ” seguido del valor de la variable i, y después incrementa el valor de la variable i en uno

También podemos hacer que un ciclo for funcione como un ciclo while:

int main()
{
 int i=0;
 for (; i<5; )
      printf("i: %d\n", i++);

 return 0;
}

Presentación de la categoría “Entrenamiento Padawan”

julio 3, 2015

Decidí abrir esta categoría para publicar aquí posts dirigidos a aquellas personas que son principiantes en esto de la programación, y aunque voy a tratar temas básicos, tampoco voy a empezar con cosas tipo “¿cómo prender la computadora?” o “¿qué es una variable?”.

Aclaro, no voy a resolver tareas.

Espero que los posts que publique aquí sean de utilidad para alguien

Saludos

¿Te preparas para aprender o sólo para hacer dinero?

julio 3, 2015

En varios de los diferentes cursos que he impartido en diferentes universidades les he comentado a los alumnos que su motivación principal para estudiar una carrera universitaria debe ser su deseo de aprender. Lo más lógico es que quien estudia Leyes piensa ganarse la vida como abogado una vez que se titule, de igual forma, podríamos asumir que quien estudia informática, computación, etc. piensa trabajar en alguna área relacionada con esa disciplina.

Si eliges estudiar una determinada carrera universitaria porque es la que está de moda, es la que tiene más demanda en estos momentos, o los profesionales de esa carrera son muy bien pagados, etc. pero no es algo que te guste, estas cometiendo una equivocación. Debes pensar que eso es a lo que te vas a dedicar el resto de tu vida (en teoría); ¿te imaginas pasar toda tu vida haciendo algo que no te gusta?, y no estoy diciendo que te desagrade, pero simplemente no es algo que te apasiona, no te interesa aprender más sobre el área, lo harías si sabes que eso va a traerte un beneficio económico pero sólo por eso, no por un interés personal.

Muchos estudiantes creen que el obtener un título universitario les garantiza un bienestar económico, muchos otros creen que al otro día de haber obtenido su título, les van a llover ofertas de empresas ofreciéndoles una gerencia y eso no es cierto (al menos en la mayoría de los casos).

Hay alumnos a los que después de 15 días de clase se les nota que no tienen ni las habilidades ni el interés por la materia, lo único que les interesa es la calificación, no aprender. Yo les comento que si el objetivo principal de que estén estudiando en la universidad es hacer dinero; probablemente deberían evaluar otras alternativas, porque hay personas que no tienen ni la primaria terminada y tienen mucho más dinero que personas con maestría o doctorado. Y existen personas que se preparan sólo para aprender, para adquirir conocimientos, y no les interesa el dinero.

Para demostrarles a los alumnos que es cierto lo que les digo, les platico el caso de Grigory Perelman que tiene un doctorado en matemáticas y ha rechazado muchos premios, probablemente el caso más llamativo fue cuando se hizo acreedor a un premio de un millón de dólares por haber resuelto un problema formulado en 1904 conocido como la conjetura de Poincaré y lo rechazó, al igual que la medalla Fields (muchos consideran la medalla Fields el Nobel de matemáticas).

Por si les interesa, aquí están las notas relacionadas (la primers es de USA TODAY y la última fue publicada en The New York Times)

 

 

 

No estoy diciendo que está mal que quieran prepararse para obtener un trabajo con un buen sueldo, lo que digo es que debes estudiar para aprender y dedicarte a lo que te gusta, seguramente harás bien tu trabajo, seguirás preparándote por interés propio y como consecuencia, muy probablemente obtendrás un buen sueldo. Si sólo te interesa el dinero no es necesario que tengas un título universitario, hay muchos que no terminaron la universidad y están en la lista de los más ricos del mundo, lamentablemente para muchos, esos personajes son sus héroes, su modelo a seguir, y su aspiración es ser como ellos; qué triste.

Pero lo más triste es que además de que muchos estudiantes no lo comprenden, al parecer muchas instituciones educativas tampoco, y para ambos (estudiantes e instituciones) los buenos profesores son aquellos que no son muy exigentes y con los cuales la mayoría de alumnos aprueba la materia. Con esto tanto alumnos como instituciones educativas están contentos, no importa si los alumnos aprenden o no, lo importante es que se titulen.

Restaurar el MBR (Master Boot Record) de Windows desde GNU/Linux

diciembre 6, 2014

Un amigo mio acudió a mi con un “problema”, en su trabajo le dieron una netbook Asus Eee PC que viene con Windows 7 Starter, la máquina trae una partición oculta en la que viene una imagen de la instalación de fábrica, dicha imagen sirve para reinstalar Windows en la computadora y que quede como si se fuera a usar por primera vez.

Mi amigo le instaló una distribución de GNU/Linux (sin borrar Windows) y rara vez utilizaba Windows, de hecho yo creo que si fuera por el lo hubiera borrado, pero no puede hacerlo ya que la computadora pertenece a la empresa y en cualquier momento pueden solicitarle que la regrese en las condiciones en las que se la entregaron (ya sea porque le van a dar otra y esa se la van a asignar a alguien más, o si renuncia o lo despiden, etc.). En fin, el caso es que la última vez que intentó entrar a Windows, le apareció el mensaje “Bootmgr is missing Press Ctrl+Alt+Del to restart”.

Como realmente en la partición de Windows no tenía información que le interesara respaldar, le sugerí que desde GRUB seleccionáramos la partición de recuperación de Windows (la imagen que permite reinstalar Windows en la computadora y que quede como si se fuera a usar por primera vez), el dijo que estaba bien y me preguntó si era posible también instalarle otra distribución de GNU/Linux en lugar de la que tenía; ya que al parecer, esa distribución iba a dejar de ser soportada por sus desarrolladores.

Arrancamos entonces desde su distribución de GNU/Linux que tenía instalada, respaldamos en una memora USB la información que quería respaldar y reiniciamos la computadora.

Al arrancar con la partición de recuperación de Windows, la aplicación te da la opción de hacer la recuperación o crear un respaldo, después de indicar que deseábamos hacer la recuperación, la computadora se reiniciaba y volvía a aparecer el menú de GRUB. Para que esto funcionara debíamos eliminar GRUB del sector de arranque.

Arrancamos nuevamente desde su distribución de GNU/Linux para restaurar el MBR de Windows y así eliminar GRUB del sector de arranque.

Lo que hay que hacer es instalar el paquete syslinux

sudo apt-get install syslinux

y después copiar el archivo mbr.bin al disco duro con el comando dd

sudo dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sda

Una vez hecho esto, reiniciamos la PC y ya no aparecía el menú de GRUB, sólo el mensaje “Bootmgr is missing Press Ctrl+Alt+Del to restart”. Para entrar a la partición oculta (ya sin GRUB); en el momento en que está arrancando la computadora hay que pulsar la tecla F9 (esto es en el caso específico de la netbook Asus Eee PC, en otras marcas y modelos puede ser con otra tecla o combinación de teclas).

Reiniciamos la computadora, entramos a la partición de recuperación de Windows pulsando F9, indicamos que deseábamos hacer la recuperación y no un respaldo y esta vez la aplicación para restaurar la imagen de Windows y dejar la instalación como cuando se compró la computadora, funcionó. Acto seguido procedimos a instalar una nueva distribución de GNU/Linux en la computadora.

Uso de Knockout para crear aplicaciones de internet enriquecidas

agosto 18, 2014

Knockout es una biblioteca JavaScript que sirve muy bien para crear aplicaciones de internet enriquecidas (Rich Internet Applications) ya que permite el desarrollo de interfaces de usuario utilizando programación dirigida por eventos en aplicaciones Web.

A continuación pongo un ejemplo sencillo que podría ser parte de un sistema más grande como una aplicación de control escolar, la página muestra una lista desplegable con los nombres de los alumnos y al seleccionar uno, se muestra su matrícula en el campo del lado izquierdo; también funciona en sentido inverso, es decir, si el usuario teclea la matrícula correspondiente a un alumno, la lista desplegable muestra el nombre del alumno al que le corresponde esa matrícula.

ejemplo_knockout

Adicionalmente, el usuario tiene opción para agregar más alumnos a la lista, indicando su matricula y su nombre. Para el ejemplo utilizo JQuery 1.11 y Knockout 3.0.

El archivo html quedaría de la siguiente forma

Archivo ejemplo_ko.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Sistema de control escolar KO</title>

<script type='text/javascript' src='jquery-1.11.0.min.js'></script>
<script type='text/javascript' src='knockout-3.0.0.js'></script>
<script type='text/javascript' src="ejemplo.js"></script>

</head>
<body>
     <input maxlength=5 size=5 data-bind="value: busca_matricula">
     <select maxlength=30 data-bind="options: alumnos, optionsText: 'nombre', optionsValue: 'matricula', value: busca_matricula, optionsCaption: 'Seleccione alumno'">
     </select>
     <br><br>
     Matricula <input maxlength=5 size=5 data-bind="value: nueva_matricula">
     Nombre <input maxlength=30 size=30 data-bind="value: nuevo_nombre">
     <input type="button" value="Agregar Alumno" data-bind="click: agregaAlumno">
</body>
</html>]

En el archivo ejemplo.js pondremos el código correspondiente a la función agregaAlumno, que deseamos que se ejecute cuando el usuario haga click en el botón con la leyenda Agregar Alumno, así como un arreglo con una lista de alumnos inicial.
Deseamos que el código de JavaScript se ejecute hasta que el documento html esté cargado por completo, por lo que todo nuestro código irá dentro de la función $(document).ready
Vamos a utilizar “objetos” de un tipo llamado Alumno, cada objeto de este tipo, tendrá dos atributos: matrícula y nombre. Los objetos los crearemos mediante una función que recibirá como parámetros la matrícula y el nombre del alumno.

function Alumno(matricula, nombre) {
    this.matricula = matricula;
    this.nombre = nombre;
}

Después definimos nuestro modelo de vista (ViewModel) en donde declaramos un arreglo que utilizaremos para almacenar los objetos del tipo Alumno; de entrada agregamos 3 alummnos al arreglo

self.alumnos = ko.observableArray([
            new Alumno(100, "FERNANDA"),
            new Alumno(175, "ANTONIO"),
            new Alumno(203, "JOSE LUIS")
        ]);

Después declaramos en nuestro modelo una propiedad de tipo observable, y la ligaremos al campo que el usuario utilizará en nuestro archivo html para buscar un alumno por su matrícula.
self.busca_matricula = ko.observable();

El que una propiedad de nuestro modelo de vista sea observable significa que knockout estará “monitoreando” esta propiedad y actualizará nuestro archivo html cada vez que el valor de dicha propiedad cambie.

Declaramos una propiedad más, que utilizaremos para indicar qué matrícula tendrá un alumno nuevo que deseemos agregar al arreglo alumnos
self.nueva_matricula = ko.observable();

La última propiedad que declararemos es para indicar el nombre de un alumno nuevo que deseemos agregar al arreglo alumnos
self.nuevo_nombre = ko.observable();

Por último, creamos la función agregaAlumno que nos sirve para agregar alumnos al arreglo alumnos.

self.agregaAlumno = function() {
         nuevoAlumno = new Alumno(
                                  parseFloat(this.nueva_matricula()),
                                  this.nuevo_nombre()
                                 );
         self.alumnos.push(nuevoAlumno);
    };

El archivo ejemplo.js completo queda así

$(document).ready(function() {

function Alumno(matricula, nombre) {
    this.matricula = matricula;
    this.nombre = nombre;
}

function AlumnosViewModel() {
    var self = this;
    self.alumnos = ko.observableArray([
            new Alumno(100, "FERNANDA"),
            new Alumno(175, "ANTONIO"),
            new Alumno(203, "JOSE LUIS")
        ]);
    self.busca_matricula = ko.observable();
    self.nueva_matricula = ko.observable();
    self.nuevo_nombre = ko.observable();
    
    self.agregaAlumno = function() {
         nuevoAlumno = new Alumno(
                                  parseFloat(this.nueva_matricula()),
                                   this.nuevo_nombre()
                                 );
         self.alumnos.push(nuevoAlumno);
    };
}

ko.applyBindings(new AlumnosViewModel());

});

Obviamente en una aplicación real los datos para el arreglo se llenarían desde una tabla de la base de datos de la aplicación, faltaría hacer varias validaciones como no dejar que agregue un alumno si no ha indicado la matrícula y el nombre, etc. este es un ejemplo para que se den una idea de lo que se puede hacer con Knockout

Curso gratuito de introducción a Linux

junio 4, 2014

Para quienes no conozcan el sitio www.edx.org, les comento que es una página web en donde pueden encontrar cursos grátis en linea de varias de las mejores universidades del mundo como el MIT, Harvard, etc. En esta ocasión, les comento que hay un curso de introducción a Linux que organiza la Linux Foundation, empieza en Agosto de 2014 y sólo tienen que crear una cuenta en http://www.edx.org e inscribirse en el curso.

Aquí está el enlace directo a la información del curso

https://www.edx.org/course/linuxfoundationx/linuxfoundationx-lfs101x-introduction-1621#.U48nUSg0zJZ

Ya hay mas de 140,000 personas inscritas al curso


Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 30 seguidores