¿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 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

Eventos de Software Libre para Abril y Mayo de 2014

marzo 31, 2014

Si eres entusiasta del Software Libre, sabrás que el 26 de Abril se llevará acabo el FLISoL (Festival Latinoamericano de Instalación de Sofware Libre). Para quienes nunca hayan asistido, les comento que es un evento para difusión del Software Libre y es totalmente gratuito.

Este año la sede del FLISoL en la ciudad de Puebla es la UVP (Universidad del Valle de Puebla), yo estaré participando como ponente con la conferencia “RIA con Sinatra y Knockout”.

Los días 8 y 9 de Mayo se realizará el VIII Simposium de Software Libre de la Mixteca en la UTM (Universidad Tecnológica de la Mixteca), que se encuentra en la ciudad de Huajuapan de León, Oaxaca. En este simposio estaré participando como ponente con la conferencia “Desarrollo Web con Ruby sin Rails”.

Es la primera ocasión en que voy a asistir a este simposium de la UTM pero se ve que es un evento de calidad. Quienes deseen más información al respecto pueden escribir a simposio@mixteco.utm.mx

 

Presentaciones comerciales de tecnología: Mentiras incluidas

marzo 14, 2014

Las personas que están en contacto con fabricantes, mayoristas o distribuidores de tecnología (hardware y software) seguramente han asistido alguna vez a alguna presentación comercial de alguna de estas empresas.

Normalmente son para promover la venta de algún producto o servicio y es común que hablen maravillas de sus productos y servicios y pestes de los de la competencia, a veces sin mencionar directamente el nombre del competidor pero asegurandose de que todos los asistentes “adivinen” a quien se refieren. Esto no implica mayor problema y muchos de los asistentes saben que algo de la información recibida no es del todo imparcial y alguna otra es exagerada.

El problema viene cuando se pasan estos límites y lo que se empieza a difundir descaradamente son mentiras, no importa si dichas mentiras se dicen por ignorancia o a sabiendas de que son mentiras. En mi opinión, cualquiera de los dos casos demuestra poco profesionalismo (está mal si los representantes comerciales de la marca son ignorantes y también está mal si no son éticos y difunden mentiras con tal de influenciar en la opinión de los asistentes a favor de su marca, es decir, la filosofía de “se vale de todo para vender”).

Hoy es Viernes, el Martes fui a una presentación comercial de Intel (tengo que decirlo porque no estoy de acuerdo con que se de información incorrecta y se manipule a la gente). La presentación era para hablar de la cuarta generación de los procesadores de Intel, de su sistema NUC (Next Unit of Computing) y sobre todo para promocionar la línea de tablets con procesador Intel Atom.

La persona que hizo la presentación dijo por lo menos un par de cosas que me dejaron impactado. Aquí les van:

1. El primer navegador web fue Internet Explorer

2. HTML5 está basado en Internet Explorer

Ambas aseveraciones son mentira, no podía quedarme callado y sobre todo cuando vi que todos los asistentes parecían estar tomando esto como una verdad absoluta. Quiero pensar que no dijo estas dos grandes mentiras intencionalmente, sino porque esa información le dijeron que diera cuando lo “capacitaron”. Le aclaré que eso que decía no era cierto; respecto al punto uno, le hablé un poquito acerca de Mosaic, Netscape, etc. y sobre el punto dos le dije que hay algo que se llama World Wide Web Consortium (W3C) que es el organismo que dicta los estándares de HTML, CSS, etc. y que no se basan en un navegador en específico. Hay navegadores que respetan los estándares y otros que no, y precisamente Internet Explorer es uno de los que históricamente se ha destacado por no respetar los estándares, hasta la versión 9 empezaron a tratar de respetar el estándar.

Finalmente le dije que si continuamos repitiendo mitos y difundiendo mentiras, estás nunca se van a acabar y habrá personas que crean que son verdades.

Yo espero que cualquier persona involucrada en el área de tecnologías de la información sepa que mucho antes que existiera Internet Explorer existió Netscape y otros navegadores antes que el. Y si son demasiado jóvenes y no les tocó vivirlo (yo lo viví, por eso lo recuerdo), lean este artículo http://arstechnica.com/business/2011/10/before-netscape-forgotten-web-browsers-of-the-early-1990s/ o vean un documental de Discovery Channel llamado la guerra de los navegadores http://www.youtube.com/watch?v=n1TcL4qItVo

Otra cosa que noté es que insistía en que las tablets con Windows son mejores que las tablets con Android y no daba argumentos que así lo demostraran.

Así que cuidado con lo que escuchan en las presentaciones comerciales (de quien sea), y si van a una presentación comercial de Intel y escuchan estas mentiras, no se queden callados, sean contundentes en hacer notar que eso es mentira y divulguen la verdad, basta de que quieran manipularnos.

Linux en todas partes

febrero 12, 2014

He estado ocupado desarrollando un sistema Cliente/Servidor para control de inventarios, ventas, etc. con Sinatra y Knockout JS, por lo que no he tenido tiempo de escribir nuevos artículos.

Como ya es Febrero y no quiero que llegue marzo sin haber escrito el primer artículo del año en el blog, aquí les dejo un enlace a un artículo interesante publicado en Network World http://www.networkworld.com/slideshow/139614/16-weirdest-places-youll-find-linux.html, esto me recuerda cuando hicieron que una tostadora de pan funcionara con NetBSD http://www.embeddedarm.com/software/arm-netbsd-toaster.php, todo porque alguien dijo algo asi como “NetBSD funciona en cualquier máquina, talvez excepto en una tostadora de pan”

Espero les guste

Migrar base de datos Firebird de 32 bits a 64 bits

diciembre 10, 2013

Si tenemos una base de datos Firebird funcionando en un sistema de 32 bits y queremos utilizar esa base de datos en un sistema con la versión de Firebird de 64 bits simplemente copiando el archivo .fdb de un sistema a otro, eso no va a funcionar.

Al intentar accesar a la base de datos obtendremos un mensaje de error diciendo que el archivo .fdb seleccionado no es una base de datos válida.

Lo que demos hacer es un respaldo de la base de datos en el sistema de 32 bits con la opción -t (transportable)

gbak -b -v -t -user sysdba -password masterkey basededatos.fdb respaldo.fbk

Ya que tenemos nuestro respaldo, hacemos el restore en el sistema de 64 bits

gbak -r -v  -user sysdba -password masterkey respaldo.fbk basededatos.fdb

Ahora debemos de poder accesar a nuestra base de datos con nuestra versión de 64 bits de Firebird


Seguir

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

Únete a otros 27 seguidores