domingo, 15 de noviembre de 2015

ZX Spectrum: El lápiz óptico

Cuando hace unos años empecé a ver cómo proliferaban los dispositivos táctiles recordé cuando de niño tenía mi Spectrum y en todas las revistas te enseñaban la maravilla del lápiz óptico, hace ya treinta años...

Cómo pasa el tiempo... Y ese dispositivo era para un televisor, y ese dibujo impreso en la pantalla lo podías grabar en una cinta de cassette y luego recuperarlo. Esas imágenes fueron usadas para diseñar objetos, para construir piezas...

Con el tiempo incluso se usaba para elegir opciones en los menús... Y al evolucionar los ordenadores estos dispositivos mucho más desarrollados se usaron en estudios de arquitectura y de diseño par crear cosas más complejas. Mientras se usaban los plotters para imprimir esos dibujos y los diseños.


Eran un momento en que con 48k se podían hacer tantas cosas como ahora con millones de k´s algo asombroso.

La principal diferencia era la calidad de los gráficos y la velocidad con la que se guardaban los datos, ahora casi instantáneo antes cosa de minutos. La vida era mucho más tranquila y más barata, aunque ahora no nos quejaremos, si tienes internet hay mucho contenido gratuito.

Pero lo que no vemos es lo que pagamos por esa internet...

Sigamos de todas formas con lo que andábamos, con nuestros móviles y portátiles táctiles, y empecemos a darnos cuenta de que lo único que antes hacíamos sin el ordenador, es decir, escribir en papel, ahora ya no necesitamos hacerlo ya que podemos tomar notas a mano en papel.

El papel, ese bien escaso que tiene el tiempo contado, pero lo que tiene aún más contado el tiempo es la escritura manuscrita, ya  que ahora lo que hacemos es escribir con los dedos en la pantalla, y al ritmo que vamos, lo siguiente será no escribir, sino solo teclear,,,

Ahora ponte a pensar un poco, es mucho más sencillo controlar todo lo que tiene bits que tener que digitalizar las hojas escritas en papel, es decir, la idea brillante para este nuevo siglo es intentar que no escribamos con puño y letra, sino solo con caracteres de bits, y esto significará un nuevo cambio en la forma de ser y de transmitir la información.

El hombre que ahora es niño y que en lugar de escribir o pintar solo usa la tablet, cuando sea adulto si nada falla, solo lo hará sobre dispositivos táctiles.

O si tenéis en cuenta lo nuevo las hololens y todo lo que son las gafas de realidad virtual, a lo mejor vemos a algún humano con un lápiz virtual sobre un papel virtual escribiendo en una sala virtual, y recuperando así las habilidades perdidas en un siglo.

La evolución lleva por caminos extraños y esperamos que esto no nos lleve por caminos poco buenos para seguir evolucionando.

viernes, 14 de agosto de 2015

WINDOWS 10:La instalación.

Bueno ya os he contado un poco las cosas que más me gustan de este nuevo sistema de Microsoft, y ya es hora de empezar a ver como ha sido el proceso de instalación para, en capítulos posteriores ir viendo cada cosa nueva que vayamos encontrando en el sistema.

Lo cierto es que el proceso ha sido muy bien estudiado y muy tipo "americano", es decir, muy del estilo a los grandes eventos que organizan las compañías americanas cuando tienen algo muy importante que comunicar.



Es decir, lo que han hecho es crear espectativa, es hacer que todo el mundo que tuviera un ordenador compatible con Windows 10, estuviera esperando el día 29 de julio, para ver como su viejo ordenador, que a lo mejor estaba trabajando con Windows 7, pasaba a tener el nuevo y tan publicitado Windows 10.

Pero Microsoft ya sabe lo que pasa cuando pones una fecha y dices, descargarlo todos: Los servidores se bloquean, las actualizaciones no llegan, los problemas son tantos que mejor hacerlo de otra forma. Por eso el mensaje decía que a patir del día 29 de julio de 2015 estaría disponible.

Así ha sido y el día 29 nos llegó a todos un mensaje diciendo que en cuanto estuviera disponible la actualización para tu equipo te lo iban a notificar, es decir, te saldría un mensaje diciendo ya lo tienes lo quieres descargar ahora o más tarde: y así empieza la magia.

Una vez que aceptas el nuevo contrato para la descarga y  la instalación del sistema operativo, la cosa empieza a andar, y aparece una pantalla en azul con tres zonas: Descarga, instalación y configuración. Cada parte tiene que ir terminándose para pasar a la siguiente.

De esta manera, en la parte inferior de cada parte hay una barra de progreso que te indica cuanto llevas en porcentaje de lo que tienes que descargar, instalar o configurar. Mucho a cambiado todo desde aquellos tiempos en los que Microsoft intentó hacer estas barras en función del tiempo que faltaba para terminar la operación (Los famosos relojes de Microsoft).

Y además en la zona central en grande te da un mensaje que te dice en la fase que estás y el porcentaje total que llevas del proceso, es ahí donde te haces una idea de lo que te falta.

En mi caso no he tenido ningún problema ya que he ido intentando bajar todas las últimas versiones de los drivers del ordenador, las últimas versiones de los programas que tenía instalados, y las actualizaciones de Windows update que iban saliendo.

Os puse que el sistema es sólido en el artículo anterior, y es así: en algún momento en la instalación debió haber algo que retrasó el proceso y el sistema no paró hasta recuperarse, y como bien han aprendido en Microsoft, hay que informar hasta de lo malo, y te sale un mensaje parecido a:"Algo no salió del todo bien, y está tardando un poco más de lo normal".

Pero hay más, el primer día que quise hacer funcionar OneDrive, el sistema lo rechazaba, y no daba con la solución, de modo que aparcaba el programa, y te daba la opción de intentarlo más tarde. Hoy tres días después de la instalación ya tengo mi disco virtual funcionando.

Una vez alcanzado el cien por cien te aparece la nueva pantalla de Windows 10 pidiendo la clave para el usuario como en la versión anterior y finito, ya has empezado a usar el nuevo sistema de Microsoft.



Espero que os haya sido de utilidad.

jueves, 13 de agosto de 2015

WINDOWS 10: Vista previa

No lo pienses, si estas pensando en quedarte con tu sistema Windows anterior a Windows 10, la decisión debe ser rápida y directa: en cuanto te llegue la notificación de que puedes actualizar hazlo.

Estamos, y llevo muchos años con mirando los diferentes productos de Microsoft, ante el mejor y el mayor cambio desde el cambio de MSDOS a Windows.


Si habéis soñado con un Windows estable, con un sistema que no se cuelgue aunque le pase cualquier cosa, aunque uno de sus programas principales se cuelgue, estáis ante lo que soñabais, aunque se cuelgue la parte que se cuelgue puedes seguir trabajando en otras cosas y mientras el sistema buscará una solución.

Es decir, irá a internet y contará por ti el problema para ver cómo puede solucionarse ese programa que se ha venido abajo para que puedas usarlo en cuanto se pueda.

Pero el cambio es también para los desarrolladores, si has estado haciendo programas para Windows 8 o 8.1, será mejor que vayas olvidando lo aprendido, ya que volvemos a las ventanas, el nuevo mundo es un mundo de programas abiertos en ventanas, con iconos más bonitos, pero volvemos a desarrollar las cosas como en Windows 7.

Sin embargo, hay muchas cosas nuevas, por ejemplo, el antiguo menú de inicio es ahora un lugar donde se han colocado los iconos grandes de Windows 8, allí está el correo, allí están tus juegos, twitter... Allí tienes todo lo que tenías en el menú principal de Windows 8.

Pero el mayor cambio viene de lo que el señor Bill Gates deseó hace muchos años: la integración.

Integrar la navegación Web con el sistema operativo era el plan original cuando se creó Windows Me, era la idea que cierto juicio antimonopolio le hizo desechar. Pero le ha costado cambiar el nombre de Internet Explorer para no volver a caer en la misma trampa.

Porque el nuevo navegador de Microsoft se llama Edge, y tiene un lugar en la parte inferior  al lado del logo de Windows para que busques en tu sistema y busques en internet, es decir, para que a menos que lo cambies busques en Bing.



Otro punto para Microsoft que intenta a marchas forzadas recuperar todo lo que ha perdido en estos años frente a Android, porque Google sigue adelante y sigue siendo la primera en el ranking de Alexa en búsquedas, y no solo eso, sigue teniendo miles de programas y juegos gratis en su tienda online, con lo que el que tiene un Android no se aburre y encima no paga.

Pero eso es parte de una guerra que irá haciendo que mejore la vida de la gente, ya que los sistemas operativos así orientados (orientados a publicidad) están generando un cambio en los hábitos de las personas que solo en las próximas décadas lograremos comprender. No es gratis lo que te dan gratis, tu tienes que consumir anuncios para usar esa aplicación.

Y aunque hay cosas que aún no funcionan del todo bien, de momento lo dicho, espero que os encante como a mi.

viernes, 26 de junio de 2015

PROGRAMAR EN C#: Matrices

Muchos programas se pueden hacer solo con los tipos que hemos mostrado en el artículo anterior, pero hay casos que no es suficiente con las variables para resolver algunos problemas con datos.

Por ejemplo, si queremos representar una lista de 100 números necesitaríamos 100 variables para representarlos, pero esto sería muy complicado de manejar, si quisieras añadir 1000 números más necesitarías 1000 variables más (mira todo esto en http://joscarmartom.blogspot.com.es/2015/06/variables-tercera-parte-arrays.html).

Por esto se recurre a una representación matemática muy usada las matrices o Arrays. Esto va a dar una gran potencia a nuestros programas ya que solo tenemos que aumentar el número de 100 a 1100 y tentemos todo el espacio que necesitamos.





La matriz más básica es unidimensional, y en matemáticas a éstas se les llama vectores, un vector es una colección de elementos dispuestos uno al lado de otro.

Estas matrices unidimensionales nos valen por ejemplo para modelar el ejemplo anterior en C#:

int [] mimatriznumerica= new int [100];

Con esto hemos reservado 100 espacios int en memoria a nombre de mimatiznumerica, y si quisiéramos ahora 1000:

int [] mimatriznumerica= new int [1000];

Ahora que tenemos el espacio reservado podemos empezar a darles valor a cada uno de ellos:

mimatriznumerica[0]=100;
mimatriznumerica[1]=10;
...

Es decir, se coloca el nombre de la matriz, se pone el indice entre corchetes y después del igual se coloca el valor que queremos asignar:

nombrematriz [indice] = valor;

Esto puede resultar muy difícil de entender, pero es lo mismo que cuando asignamos un valor a una variable.

Como podéis entender introducir los 100 o los 1000 campos de esta forma puede resultar muy tedioso y para solucionar esto veremos en próximos capítulos las iteraciones y los bucles que nos permitirán repetir una cosa una y otra vez.

Tenéis que comprender otra cosa importante, estos arrays se pueden declarar de cualquier tipo incluidas matrices, o tipos más complejos, de esta manera se puede reservar espacio para diferentes clases de cosas.

La declaración será siempre igual:

tipo [] nombrematriz = new tipo [dimensión];

Si queremos recuperar el valor de alguna posición lo único que tenemos que hacer es llamar al indice que queramos:
 
  mimatriznumerica[2]=100;
  Console.WriteLine(mimatriznumérica[2]);


Esto mostraría en pantalla el valor 100.


Es importante que os fijéis que la colocación de los valores es desde cero, es decir, el primer indice no es el 1 sino el cero, de manera que el objeto que ocupa la posición 3 en una matriz tiene el valor de indice 2, es decir, es en base al cero y no al uno como funciona esto:


Veamos ahora algunos ejemplos:

Ejemplo 1:

            byte[] matrizbyte;
            matrizbyte = new byte[] { 2, 3 };

En este caso hemos definido una matriz sin decir el tamaño pero al asignar los valores {2,3} le decimos al compilador que la matriz será de una dimensión (vector) y tendrá dos valores.

Esta forma de inicializar valores será muy útil si tenemos una gran lista:

int [] mimatriz=new int[]{1,2,3,4,5,6,7};

Ejemplo 2:


            int[,] matrizdosdimensiones = new int[,] { { 1, 2 }, { 1, 2 } };


Este ejemplo declara una matriz de 2 por 2 y le asigna los valores 1,2 a cada fila:

1 2
1 2

Y recuperar un valor sería de la siguiente forma:

            Console.WriteLine(matrizdosdimensiones[0, 1]);

Mostraría el valor 2 en pantalla.

Ejemplo 3:


Y este es para nota, ya que definimos una matriz que contiene dos matrices de rango 1. Primero le damos unos valores y luego cambiamos algunos de ellos:

   int[][,] matrizdematrices = new int[][,] {new int[,]{{1,1},{2,2}}};

            matrizdematrices[1][1, 2] = 100;
            matrizdematrices[0][1, 2] = 100;


Espero que os haya gustado, iré añadiendo más ejemplos más adelante, cuando vemos los bucles...


jueves, 25 de junio de 2015

MICROSOFT VISUAL STUDIO 4: Proyectos

PROGRAMAR EN C#: Variables

Si alguno habéis visto la serie de artículos que tengo sobre las variables ya sabréis porqué es tan importante saber qué son y para que se usan las variables.

Una variable es un lugar de memoria, es decir, es un espacio de memoria donde se almacena un dato determinado y al que se le asigna un nombre. Esto es fundamental pues no se puede interactuar sin memoria, es decir, sin memoria no hay programas.



Las variables en C# son de diferentes tipos y las podemos ver todas representadas en el siguiente programa:

using System;

namespace Primerprograma
{
    class Program
    {
        static void Main(string[] args)
        {
            //tipos enteros

            byte mibyte;
            sbyte mibyteconsigno;

            short mishort;
            ushort mishortsinsigno;

            int miint;
            uint miintsinsigno;

            long milong;
            ulong milongsinsigno;

            decimal midecimal;


            //tipos decimales

            float mifloat;
            double midouble;

            //tipos caracter

            char michar;
            string mistring;

            //tipo booleano

            bool mibool;

        }
    }
}

En este programa como veis lo que hacemos es definir diferentes tipos de variables y les damos un nombre, la estructura es siempre la misma:

tipovariable nombrevariable;

Los tipos se catalogan en diferentes tipos:

Enteros con y sin signo (byte 8bits , short 16 bits, int  32 bits , long)

Decimales de diferente precisión (float para poca, decimal para gran precisión, double para numeros con muchos decimales)

Caracters (char, un solo caracter; string, cadeanas de caracteres)

Bool (booleanos, true or false)


Si queréis ver el valor máximo que tiene cada tipo podéis añadir al programa las siguientes lineas:


            // maximo número

            Console.WriteLine("Tipos enteros:");
            Console.WriteLine("byte: " + byte.MaxValue);
            Console.WriteLine("sbyte: " + sbyte.MaxValue);
            Console.WriteLine("short: " + short.MaxValue);
            Console.WriteLine("ushort: " + ushort.MaxValue);
            Console.WriteLine("int: " + int.MaxValue);
            Console.WriteLine("uint: " + uint.MaxValue);
            Console.WriteLine("decimal: " +decimal.MaxValue);
            Console.WriteLine("long: " + long.MaxValue);
            Console.WriteLine();


            Console.WriteLine("Tipos decimales");
            Console.WriteLine("float: " + float.MaxValue);
            Console.WriteLine("double: " + double.MaxValue);
      
            Console.WriteLine();

            Console.WriteLine("Tipos caracter:");
            Console.WriteLine("char: " + char.MaxValue);

De esta manera lo que obtenemos es el tipo de variable y el valor máximo que se le puede asignar a cada tipo de dato. Esto además nos da un ejemplo del tipo de definición que tiene cada uno.

Y os dará como resultado lo siguiente:

Tipos enteros:
byte: 255
sbyte: 127
short: 32767
ushort: 65535
int: 2147483647
uint: 4294967295
long: 9223372036854775807


decimal: 79228162514264337593543950335

Tipos decimales
float: 3,402823E+38
double: 1,79769313486232E+308

Tipos caracter:
char: ?


Esta es una forma rápida de ver los límites en los que nos estamos moviendo...




Visual Studio 3

Visual Studio 2

MICROSOFT VISUAL STUDIO 1: Descargar

domingo, 21 de junio de 2015

PROGRAMAR EN C#: Primer programa.

Cómo vimos en el capitulo anterior el primer programa que hemos sacado del horno tiene la sigueinte forma:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Aplicacionvacia
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }


}




Si sabes un poco de inglés estarás traduciendo lo que pone:



Usando sistema
Usando sistema.colecciones.genericas
Usando sistema.Linq
Usando sistema.texto
Usando sistema.threading.tarea


espaciodenombres Apicacionvacia

{
    clase program
          {
                  estatica vacia Principal (cadena[] argumentos)

                         {
                          }
          }
}


Vayamos por partes. La traducción si nos da grandes pistas de lo que está pasando.




El comando using, lo que nos permite es importar clases desde el fichero System, y este concepto de clases lo vamos a ver en el siguiente capítulo porque es el concepto fundamental de la programación en C#.

Este fichero System es lo que se llama una biblioteca, y al igual que en una biblioteca hay libros, lo que tenemos allí almacenados son clases, y en cada clase tenemos unos métodos que podemos llamar desde nuestro programa.

Cuando decimos using System.Linq lo que hacemos es acceder a las clases que dependen de Linq es decir, si ahora necesitamos alguna cosa de Linq la podemos usar directamente sin poner System.Linq.loquesea...

Esto lo vamos a ver un poco después con nuestro segundo programa en este mismo blog...

De momento seguimos adelante, namespace nos define el lugar donde vamos a trabajar, es decir, define un espacio de nombres que va a ser compartido por todas las clases que uses en tu programa, por ello ya verás lo sencillo que es usar otros ficheros con clases para tu programa.


A continuación declaramos la clase Programa, es el lugar donde vamos a crear nuestro programa, es el sitio donde va a ir toda la magia que vamos a poner en cada linea de código que vayamos poniendo.


Por último aparece la linea " static void Main(string[] args)" que es la declaración de nuestra función principal, y es la parte donde ponemos el programa principal. y es desde aquí donde se llamarán a las clases previamente definidas.


Main, es principal, porque es donde pondremos lo principal del programa. Por último lo que va entre paréntesis, son los parámetros que podríamos pasar a nuestro programa desde la linea de comando, es decir, podríamos lanzar el programa desde c:

C:>miprograma argumento1 argumento2

Y podríamos recuperar dentro del cuerpo del programa esos parámetros para tomar diferentes decisiones en base a ellos.

Pero ahora si vamos a añadir dos lineas entre las llaves que hay debajo de Main:

     Console.WriteLine("Mi primer programa");
      Console.ReadLine();

Estas dos lineas van a llamar a la clase Console a la función WriteLine primero, que va a sacar por pantalla nuestro mensaje Mi primer programa, y luego al llamar a ReadLine el programa va a esperar a que pulsemos una tecla para finalizar a continuación.



Otra manera de hacer lo mismo es recurrir al uso de using, para que no tengamos que escribir todo el rato la palabra Console:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Console;
namespace Aplicacionvacia
{
    class Program
    {
        static void Main(string[] args)
        {

                 WriteLine("Mi primer programa");
                 ReadLine();
        }
    }


}

Con esto lo que hacemos es decirle al compilador que cuando escribo WriteLine mire en la biblioteca Console, y allí la encontrará. Esto viene muy bien para no escribir tanto pero tiene una pega y es que usáramos dos cosas con el mismo nombre, es decir, que existiera una clase con el mismo nombre en dos bibliotecas.

Si esto sucede tendrías que llamar a ambas con todo el nombre porque en caso contrario se generaría un error de compilación puesto que el compilador no sabría a que estás haciendo referencia.

Espero que os haya gustado...

sábado, 20 de junio de 2015

PROGRAMANDO EN C#: Eligiendo las herramientas

En la primera entrada del blog os he señalado las razones por las que he elegido estudiar C#, y ahora voy a mostraros la herramienta que voy a utilizar.

Evidentemente ya sabemos todos que detrás de este lenguaje está Microsoft, de manera que para empezar vamos a descargar el Visual Studio que está ahora mismo como gratuito en la página de Microsoft.

Podéis elegir entre la versión Express para windows Desktop o la Community. Lo bueno de la Community es que os permitirá más adelante crear programas para la web y para la tienda windows. A cambio el peso, es decir, el tamaño del archivo será mucho mayor y os llevará más tiempo la descarga.

Una vez descargado, lo único que tenéis que hacer es arrancarlo, y darle a crear un nuevo proyecto. Este nuevo proyecto lo vais a elegir dentro de visual C#, en windows desktop, una Console Aplication, y le vais a poner un nombre, el que queráis, por ejemplo proyectoconsola1, o lo que más os guste.

Esto os va a generar el primer programa de vuestra carrera de programadores, el programa más sencillo de todos, y el que menos hace pero el más interesante:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Aplicacionvacia
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}


Ahora solo tenéis que darle a empezar o Start y se lanza vuestro primer programa... ¿Y qué hace? Abre un segundo una ventana y la cierra, es decir, no hace nada... ¿O hace algo?

Este programa hace muchas cosas que no veis, este programa se compila y se crea un ejecutable, un fichero que luego se puede volver a usar en cualquier máquina con Windows que tengáis, este programa que no es el que se suele mostrar como primer programa tiene muchas lineas que en próximas entregas os iré explicando....

Si no sabes nada de programación estarás deseando pasar a la siguiente entrega del blog para saber que es ese nada que son muchas cosas, pero lo que tienes que saber de momento es que el programa crea un proceso, es decir, abre un hueco en la zona de memoria donde se pueden ejecutar los programas y le dice al controlador de programas que el existe.

Además le dice al sistema que es un programa de consola y que prepare una ventana de consola para la ejecución...


Como ves si hace muchas cosas... Ahora veremos lo que hace cada línea...



viernes, 19 de junio de 2015

PROGRAMANDO EN C#: Presentación

¿Por qué C#?

Hace no mucho he leído un artículo sobre los lenguajes de programación y los programas, y en él se ponía en relación los diferentes lenguajes y sus estructuras unos con otros. Y lo cierto es, cómo decía el autor del mismo, que todos los lenguajes de programación al final manejan las mismas cosas aunque si que es cierto que dependiendo de para qué tarea puede ser que uno sea más apropiado para una determinada tarea.

Cuando yo empecé a programar esto estaba muy definido, si querías hacer solo un programa normal usabas Basic, si querías hacer un programa que manejara matemáticas usabas Fortan o Pascal, si ibas a hace algo relacionado con datos, usabas Cobol... Y querías estudiar otros lenguajes podías irte al Ada o Lisp.

En estos momentos lo que más fuerte pega en programación son el Java, el C++, el JavaSript,y otros muchos. Si sabes un poco de cada uno puedes empezar a darte cuenta de la complejidad de cada caso.

Yo soy de los que en su momento aprendieron mucho Basic, luego mucho Pascal y el lenguaje de Dbase iii, luego me dio por el C y por último me encantó el C++ y sus clases.


Todo esto quedó en el pasado, y mis sueños se fueron diluyendo cómo cubos de hielo en agua, despacio pero se fuero iéndo.

El año pasado por una serie de circunstancias dispuse de algo de tiempo y me pude dedicar a seguir muchos de los cursos que están disponibles en la Microsoft Virtual Academy (microsoftvirtualacademy.com), y empecé a estudiar el C# y poco a poco me di cuenta de lo sencillo que resultaba de entender y lo fácil que resultaba crear programas en él.

Esta es la primera razón, la segunda es que recientemente he empezado a tomar contacto con Xamarin, que te permite crear aplicaciones con C# para Windows, Windows Phone, Android y IOs(Apple), y esto me ha acabado de convencer de que este es el camino que quiero seguir.


Mucho del camino yo ya lo he recorrido pero hay otro mucho camino que quiero recorrer con vosotros, y por ello voy a empezar desde el principio.

Lo básico, desde lo más fundamental, y para ello hay que empezar por los proyectos en Consola, ya que son los más rápidos de crear y entendiendo esto serás capaz de entender todo lo que ha venido después, las aplicaciones en ventana y las aplicaciones para la tienda Windows.

De esta manera el esquema será de menor dificultad a mayor dificultad, y llegará un momento en que empezaremos a hacer programas para la tienda windows.

Pero para eso primero hay que ver muchos conceptos y poco a poco iremos viendo cada uno de los que nos serán necesarios...



De momento un saludo y espero que os guste.

miércoles, 17 de junio de 2015

BUCLES Y BUCLES INFINITOS

Cuando aprendes a programar en cualquier lenguaje de programación lo más normal es cometer muchos errores, los más normales al principio son los errores de sintaxis, cómo escribir Pirnt en lugar de Print.

Conforme va uno controlando la sintaxis se empiezan a producir otro tipo de errores, errores que podríamos llamar errores lógicos, como por ejemplo querer usar dos variables de tipo carácter para hacer una suma decimal o querer comparar un numeral con un decimal.

Estos errores pueden llegar a volverte loco si el programa es largo, y si tiene muchas líneas. Pero desde el principio cuando uno aprende un poco de programación quiere probar cosas divertidas e interesantes aunque esto suponga quebrantar esa lógica.







El bucle:

Un bucle es una parte de un programa que se repite una serie de veces. Estas veces pueden estar determinadas (tipo FOR) o indeterminadas (tipo WHILE), es decir se hace 5 veces o n, donde n viene de alguna condición.

FOR I =1 TO 100
PRINT "HOLA"
NEXT I



Imprime cien veces la palabra HOLA en la pantalla

X=0
WHILE X<=100
PRINT "HOLA"
X=X+1;
RETURN

Imprime 101 un veces HOLA en pantalla, es decir hasta que la condición de WHILE se cumpla.

Estos ejemplos realizados en Basic de la vieja escuela nos muestran de una manera muy sencilla lo que es un bucle.

El bucle infinito:

Pero he aquí que podemos hacer en el WHILE que la condición nunca se cumpla, por ejemplo:


X=0
WHILE X<=100
PRINT "HOLA"
RETURN

X siempre vale 0, con lo cual el programa se queda siempre imprimiendo HOLA.

A ver, y esto es lo sorprendente de entender, en condiciones ideales con un ordenador siempre conectado y que nunca fallara, esto sucedería infinitas veces, es decir, sería un bucle infinito.

Pero en aquellos tiempos la preocupación era otra ya que parecía como si se hubiera roto el ordenador y más de uno cruzamos los dedos cuando apagamos y volvimos a encender el ordenador esperando que esto hubiera finalizado.

Y esto era así porque no era verdaderamente infinito, aunque si podía crear más de un dolor de cabeza cuando estábamos ejecutando una aplicación larga y de pronto obteníamos la nada por respuesta, ya que estos bucles aparecían de la manera más insospechada y en los lugares donde menos te lo esperabas.

El más conocido de los bucles infinitos:

Si preguntáis a la gente de mi generación cual era el bucle infinito por excelencia os mostrarán algo así:

10 GOTO 10

Es decir, la más sencilla de todas las sentencias, vete a la linea 10 siempre, y así era en el Spectrum y el Amstrad y en los programas compilados de PC. Menos mal que a alguien se le ocurrió introducir una combinación de teclas que rompían el bucle: Control + C.

De otra manera solo cabía volver cargar el ordenador al reiniciarlo....

Un bucle infinito en C#:

Tan sencillo como un par de lineas y llenamos mientras dure su ejecución de "hola" la pantalla del ordenador:

   while (true )
            {
                Console.Write("hola");
            }
Si lo arrancas verás que la ventana de la consola se llena de holaholaholahola... y no parará hasta que cierres la ventana.

En otro momento, cuando no había tanta memoria del ordenador, lo que se producía al cabo de un rato es un stack overflow, ya que el número de llamadas era demasiado grande para que el ordenador lo soportara.

Un recuerdo curioso:

Cuando el Basic se fue haciendo más popular y los compiladores eran mejores se empezaron a introducir nuevos comandos.

Uno de los que metieron era ONBREAKCONT, es decir, en caso de break continua ejecutando. Con lo que al realizar un bucle infinito solo te quedaba la posibilidad de apagar el ordenador para salir del mismo ( el break era Control + tecla C).

Esto dice mucho de lo que era estabilidad en aquella época y lo que es ahora...


Espero que os haya gustado....

sábado, 13 de junio de 2015

BASES DE DATOS: ¿Qué son?

De nuevo volvemos a la historia para contaros un poco lo que es una base de datos. Cómo ya os he mostrado en otros artículos sobre las variables, una parte importante de la programación es el trato que se dan a los datos, y como vais viendo en los mismos la cosa no es nada sencilla.

Es a veces más complicado comprender los datos y organizarlos que crear la aplicación. Necesitamos ver todos los datos que están en juego, lo que queremos hacer con ellos, las relaciones que existen, si dependen unos de otros...




Por ello es tan importante conocer las bases de datos.

Definición:

Una base de datos es un lugar donde se almacenan los datos de alguna manera lógica, pero una base de datos también es la aplicación que nos permite usar esos datos, contrastarlos, ordenarlos, compactarlos...

Mi primer contacto con una base de datos fue con el ya legendario Dbase, un programa creado para MsDos que permitía la creación y gestión de las bases de datos.

Antes de estos programas los datos se guardaban en cintas o en discos, de una manera secuencial, es decir, directamente uno al lado de o detrás de otro, normalmente separados por comas, lo cual nos permitía después recuperarlos a memoria, modificarlos y volver a reescribirlos.


Pero esto tenía un coste importante en tiempo, ya que había que primero guardarlo y luego volver a cargarlo en memoria varias veces en el mismo ciclo de vida de la aplicación. Y los discos no eran precisamente rápidos como ahora que parece todo instantáneo...

Con la creación de Dbase y programas similares se permitió que el acceso fuera más rápido, los datos no se guardaban como un fichero puramente secuencial sino que se guardaban preórdenes que permitían una gestión más rápida de los mismos, se guardaban en bloques más pequeños y se podían estar cargando unos pocos mientras el resto se mantenían a la espera.

Dbase III y IV permitieron la indexación, es decir, un orden de los datos según una clave determinada pero que no alteraba los datos en sí, de forma que si la clave de indexación se usaba cómo principal la localización de un dato en milésimas de segundo.



Este programa y otros como FoxPro nos daban la posibilidad de manejar los datos de una manera rápida y si conocías los comandos de manera sencilla. Y creabas aplicaciones muy rápidamente con el asistente que tenía.

Con el paso de los años y la irrupción de Windows, la cosa se volvió visual y apenas tenías que saber muy poco para crear tu base de datos y gestionarla y luego usarla para crear tus cartas personalizadas para los clientes o consultarla para ver si tu visitante de la web estaba o no registrado.

Con todo esto se han ido buscando siempre la forma de que sean cada vez más rápidas y eficientes, y más aún desde la creación de las web, ya que las cargas en los servidores son cada vez mayores, y los datos más y más grandes y complejos...

Imaginar lo importante que es la optimización de estos datos, pensar en un banco que recibe miles de transacciones por segundo de sus clientes comprando en miles de establecimientos a lo largo del planeta y  tiene que responder sí o no a la petición de dinero, y tiene que sacarlo de su fichero y mandarlo al del vendedor...

Por eso es tan importante el curso que estamos haciendo sobre las variables, porque es en los datos donde está la respuesta, en su análisis donde está el futuro...

Si queréis ver como se usa una base de datos y como se crea desde cero y otro montón de conceptos podéis ver este vídeo sobre OpenOffice Base:


Definición de campo:

Campo es cada una de los datos que forman parte de una base de datos, estos campos son los contenedores de los datos, los que reciben los nombres, las direcciones, los teléfonos.

Son de diferente tipo y se organizan de una forma lógica para que resulten más fácil de usar y de rellenar.

Definición de registro:

Es cada una de las soluciones de los campos y están unidas por la lógica que se estableció en los campos. De esta manera, cada registro es un relleno de todos los campos definidos. 

Si seguimos el ejemplo de un fichero de fichas, los campos son lo que aparece a la izquierda, y son comunes a todas las fichas, mientras cada ficha está rellenada con una serie de datos. Estas fichas son los registros (records).

Acumulando datos:


Cuando ya hemos definido la estructura de nuestros datos lo siguiente que tenemos que hacer es empezar a rellenar los campos y los registros para poder tener cuanto antes todo relleno.

Si nos juntamos con miles o cientos de miles de datos lo importante de una base de datos será la velocidad de búsqueda, y cada vez que vayamos a hacer una consulta tendrá que estar lo más ordenada posible.

Esto significa que si pudiéramos tener todas las consultas hechas antes de hacerlas el tiempo de reacción sería mínimo. Por eso es tan importante decidir cuál será la llave de ordenación, es decir, el campo o campos que van a dar las claves de ordenación de nuestra base de datos.

VARIABLES 4: TIPOS COMPLEJOS. ESTRUCTURAS

En el capítulo anterior hemos creado una agenda con 100 nombres y 100 teléfonos, los primeros son de tipo string y los segundos son de tipo int, Al crear dos arrays hemos creado una relación lógica entre ambos a partir del indice que va a correlaccionar cada nombre con cada teléfono.

De esta forma, en la posición "indice=10", estará en nombre 10 y el teléfono 10.

Con estos datos puede mover los datos de posición, intercambiarlos, ordenarlos alfabéticamente según el campo nombre o numéricamente según el número de teléfono sin olvidar que al mover el teléfono x a la posición y tengo que mover el nombre x a la posición y.


Estructuras:

Pero se puede ir un poco más allá, partiendo de cómo grabábamos los datos en los primeros ordenadores: estos grababan los datos en cinta o en disco como si fueran registros, es decir, como si fueran fichas.

nombre juan 
apellido pedro
teléfono 91000000
dirección Teresitas 10
.
nombre pedro
apellido elias
.......

Así lo grababan y se indicaba que cada retorno de carro (fin de linea) era el final de un campo y en este caso el punto era un final de registro.

Si os fijáis, lo que se ha hecho es estructurar los datos, es decir, tenemos un cliente, que va a tener un nombre, un apellido, un teléfono y una dirección pero es un cliente.

Que sucede si ahora lo que creo es un tipo nuevo, que no es numérico ni de letras, es un conjunto ordenado de ambos tipos:

Struct cliente
{
string nombre;
string apellido;
int teléfono;
string dirección;
}


Y luego es sencillo pensar que podríamos crear un array de esta estructura cliente y poder ir dando a cada campo valor, y luego añadiendo registros:

array cliente [100];

cliente[0].nombre="jose carlos";
cliente[0].apellido="martín";
cliente[0].teléfono=9100000000;
cliente[0].dirección="Alcalá";


Con esto hemos ganado claridad a la hora de declarar los datos y hemos ganado en facilidad a la hora de operar ya que es fácil pensar que con esto podríamos crear nuestras funciones para esta estructura:

introducirdatos (cliente[i]);
imprimirdatos (cliente[i]);
cambiardatos (cliente[i],clienten[j]);
borrardatos (cliente[i]);

Nuestros programas ganan aún más en claridad y no solo eso en facilidad a la hora de cambiar algo, ya que podemos aumentar el número de registros solo modificando el indice máximo, o podemos añadir nuevos campos modificando la estructura inicial:

Añadimos un teléfono2:


Struct cliente
{
string nombre;
string apellido;
int teléfono;
int teléfono2;
string dirección;
}

Y las modificaciones en las funciones de la estructura son menores en comparación con lo que tendríamos que hacer si solo tuvieramos la unión lógica que habíamos descrito entre las variables de los arrays.

Por eso esto fue un gran avance aunque todavía se podía mejorar, en rendimiento y sobre todo en lógica...

[Continuará]


jueves, 11 de junio de 2015

VARIABLES tercera parte: ARRAYS

Con los tipos vistos anteriormente prácticamente se podían realizar todas las operaciones del mundo dentro de unos margenes que venían de la limitación de la memoria de los ordenadores y de la capacidad de los microprocesadores de procesar dicha información.

Pero se daba el caso de que había problemas que con estos tipos solamente no podíamos solucionar. 

El ejemplo más sencillo lo tenemos en una agenda: si queremos crear una agenda con cien entradas lo podemos hacer de una manera un poco bruta creando 100 variables de tipo string y cada una de ellas guardará un nombre de la agenda. Pero además necesitamos 100 variables de tipo int para que almacenen los 100 números de teléfono de las cien personas.

Imagina cómo queda el programa de farragoso y los problemas que se generan al querer buscar algo en esa agenda ya que habría que ir variable por variable comparándolo con nuestra busqueda:

buscar "jose"

es var1="jose" 
 si final
 no es var2="jose"
  si final
   no es var3="jose"... 
    hasta var100 o final

Por eso se recurrió a un recurso que se usa en matemáticas para colocar un punto en dos ejes o en tres coordenadas: Los vectores.



Si usamos un vector para modelar la agenda creamos un vector de tamaño 100 para los nombres y otro vector de tamaño 100 para los teléfonos (c#):

            string[] nombre= new string [100];
            int[] teléfono=new int[100];
De esta manera nuestro código se simplifica bastante ya que ahora para recorrer todos los campos y comparar podemos usar un bucle, que vaya 1 por uno por todos nuestros datos hasta encontrar el que buscamos:

            for (int indice=0;indice<100;indice++)
                {
                if (nombre[indice]=="jose" )
                    {
                        Console.WriteLine("jose encontrado en posición "+indice);
                        break;
                    }
                }


Es decir, hemos reducido más de 100 lineas de código a menos de 10. Y no solo eso.

En nuestra primera versión del programa si queríamos aumentar en 100 más los datos de nuestra agenda teníamos que crear otras 100 variables más y de esta forma cada vez que fuéramos a hacer algo con ellos necesitaríamos otras 100 lineas más de código.

Sin embargo con un vector es tan sencillo como cambiar el valor del indice(c#):

            //Versión con indicemaximo variable más compacta y más útil
            const int indicemaximo=200;
            string[] nombres = new string[indicemaximo ];
            int[] teléfonos = new int[indicemaximo ];

            for (int indice = 0; indice < indicemaximo ; indice++)
            {
                if (nombres[indice] == "jose")
                {
                    Console.WriteLine("jose encontrado en posición " + indice);
                    break;
                }
            }

Con este avance lo siguiente era fácil de entender, por qué no usar las matrices para modelar los datos que sean iguales y funcionen juntos...


Dicho y hecho: en nuestro ejemplo en lugar de introducir solo el nombre podría darse el caso de que quisiéramos los apellidos y la dirección también, con lo cual nuestro modelo podría ser así:

string nombreapellidodirecion[indicemáximo,3];

Con lo cuál nuestro programa accedería directamente a estos tres datos de cada entrada de una vez y dispondrá de ellos solamente con una llamada a esa matriz:

nombreapellidodirecion [1,0] devuelve el nombre de la entrada 1
nombreapellidodirecion [1,1] devuelve el nombre de la entrada 2
nombreapellidodirecion [1,2] devuelve el nombre de la entrada 3

Con todo esto aumentaba en gran medida la velocidad con la que se podía acceder a los datos y además de esto disminuía el número de lineas necesarias para programar...
Pero como veremos más adelante esto acababa siendo ineficaz ya que la memoria se usaba con demasiada frecuencia y se acababa llenando... 

Con lo cual hubo que explorar otras vías...

[Continuará]


miércoles, 10 de junio de 2015

PROCESADORES DE TEXTOS: MODIFICANDO CARACTERES

A la hora de escribir un texto en una hoja a mano hay cosas que hacemos de manera que parece instintiva pero que son  fruto de un proceso de aprendizaje y nos ha llevado mucho tiempo llegar hasta ese punto.

Al proliferar las máquinas de escribir y posteriormente los ordenadores, el proceso de estos textos se ha hecho cada vez más imprescindible, y muchas veces hacemos cosas sin saber qué es lo que estamos haciendo simplemente por imitación.



Empezando por las letras:




Con los procesadores de texto se pueden hacer muchas cosas y vamos a empezar por lo que se puede hacer sobre una letra o como se les llama en informática los caracteres.

En primer lugar hay que saber lo que es un caracter, y cómo se representa en tu pantalla ese caracter. Se trata de un mapa de bits, es decir, cada caracter que sale representado mientras escribo estas líneas es un mapa de bits que se representa en la pantalla y se muestra para que tu lo veas.

Cuando yo programaba en Basic para el Zx Spectrum esto era muy fácil de entender, ya que si querías crear algún dibujo para un juego necesitabas primero una matriz de 8 x 8 y poner sobre ella el dibujo que querías construir, luego le dabas el valor 0 si querías que fuera blanco y el 1 si era negro:

00111000
01011000
10011000
00011000
00011000
00011000
00011000

De esta forma tenías la representación de un 1, y podías simular cualquier caracter que te hiciera falta.

Al pasar los años, y llegar los procesadores de textos, se empezó a ver lo ventajoso que era el tener varios tipos de letra diferentes para conseguir que los documentos fueran personalizables en un grado mayor.

Por ello siempre puedes elegir lo primero el tipo de letra que vas a usar, desde Sans Serif a Italica, y dependiendo del proveedor tendrás fuentes propias del fabricante.


Lo siguiente que puedes elegir es el tamaño de la fuente, es decir, lo grande o pequeña que será la letra que vas a usar. Un tamaño muy usado el 12, que está calculado para ser agradable a la vista y es un poco más grande que lo que se usaba en los viejos tiempos con las máquinas de escribir.

Seguidamente se puede elegir el efecto, es decir, si quieres que a tus letras les pase algo, como por ejemplo los tres efectos más usados:

B (bold) negrita
I (Italica) cursiva
U (Underline) subrayado

Otro muy usado, sobre todo en cartas y documentos no oficiales es el efecto tachado  que nos da la opción de parecer que hemos cambiado de opinión o que eso no estaba correcto.

Lo bueno de todos estos efectos es que se pueden usar juntos o por separado dandote la libertad de tener una gran variedad a la hora de escribir. Si estos efectos los combinas con el cambio de tamaño de la fuente tienes la opción de crear títulos o incluso diferenciar capítulos.



Pero hay más aún, según el procesador de textos que uséis podréis usar colores tanto para el fondo del caracter cómo para el propio caracter, de manera que se enriquece mucho la experiencia del lector... Pero hay más también podrás usar sombras para las letras y crear efectos en 3D, que serán muy agradecidos por tus lectores.

De nuevo según el programa que uses puedes tener  incluso opciones para girar el texto o incluso superrayarlo es decir ponerle una raya por encima igual que hiciste por debajo...

Pero aún hay más, podría ser que quisieras escribir una formula matemática y poner subíndices o superíndices, de nuevo en la mayoría de los casos lo podrás hacer de un forma sencilla, incluso solo pulsando solo un botón.

En algunos editores o procesadores de texto incluso podrás crear tus letras en 3D usando alguna utilidad. Por ejemplo en OpenOffice y LibreOffice existe FontWork, que te permite jugar con los textos y hacer cosas expectaculares...



De esta forma se abren muchos más caminos a la hora de por ejemplo crear un texto creativo para publicar o para crear un página web, sin saber nada más que lo básico.

Con los caracteres ya habéis visto la cantidad de cosas que se pueden hacer, en la siguiente entrega nos enfrentaremos a lo que se puede hacer jugando con los párrafos y veréis que la cosa mejora...

LibreOffice Writer 1

domingo, 7 de junio de 2015

OpenOffice Base

VARIABLES 2: Tipos Básicos (INTEGER,CHAR...)

Podríamos decir que la importancia de las variables es tal, que sin ellas nos sería imposible hacer más que programas del tipo imprime un mensaje o pinta esto... Es decir, podríamos decir que son tan importantes como los ingredientes en una ensalada...

En nuestro caso tenemos ya dos tipos de variables simples que hemos conocido en el primer artículo sobre el tema: numéricas y alfanuméricas, es decir, variables de tipo número y variables de tipo letra, pero vamos a meternos en profundidad en el tema...



Alguien podría pensar que sería útil definir las variables número con el máximo rango posible, es decir, que se pudiera representar cualquier número de cualquier tamaño en cualquier caso... Y ya puestos sería deseable que pudiéramos poner los números con tantos decimales como necesitáramos y porque no, estos números podrían ser positivos o negativos...

Es decir, lo deseable sería que el tipo número fuera de rango infinito, y que fuera infinitamente divisible y que recorriera también los negativos... Es decir, lo deseable sería un número Real para poder hacer todas las operaciones que hacemos con los número reales...

Pero he aquí un problema: para representar cada número en memoria necesitamos una cantidad infinita de memoria, cosa que no tenemos, así que de momento nos olvidamos de infinitos números y de infinitos decimales.

Tenemos otro problema: por un lado cada dígito de un número entero se representa en base 2 en el ordenador, y cada dígito en base 2 se almacena en una posición de memoria y la memoria es limitada.

Cuando los ordenadores tenían hasta 16k, esto era un gran problema, ya que si usabas toda la memoria se producía un Overflow, es decir, un desbordamiento de memoria... Y se acababa el programa.



Con lo cual, teníamos que tener unos tipos de dato, unas variables de tamaño reducido para poder usar el resto de la memoria para programar. Por ello en aquellos ordenadores solo había los tipos número y alfanumérico, y además de tamaño reducido.

Con la mejora del tamaño de la memoria, los tipos se amplían, pero una preocupación fundamental sigue siendo el uso de esa memoria, es decir, si el campo al que va a representar esa variable no usa números muy grandes se usará un tipo de variable que use números pequeños.

En estos momentos, de lo que se trataba era de usar el mínimo de memoria para que nuestro programa fuera eficiente,y siempre intentar no llevarlo al máximo para evitar desbordamientos.

Siendo así llegamos al momento actual en el que podemos ver si queréis los tipos básicos, de un lenguaje al que tengo cariño, el C#:

De -128 a 127
Entero de 8 bits con signo
De 0 a 255
Entero de 8 bits sin signo
U+0000 a U+ffff
Carácter Unicode de 16 bits
De -32.768 a 32.767
Entero de 16 bits con signo
De 0 a 65.535
Entero de 16 bits sin signo
De -2.147.483.648 a 2.147.483.647
Entero de 32 bits con signo
De 0 a 4.294.967.295
Entero de 32 bits sin signo
De -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807
Entero de 64 bits con signo
De 0 a 18,446,744,073,709,551,615
Entero de 64 bits sin signo
(Fuente Microsoft.com)

Cuanto más grande es el número mayor bloque de memoria estamos usando. El signo, va a usar otro byte más por eso los tipos sin signo, uint, ulong, son el doble de grande que el de los tipos con signo int y Long.

De echo, hoy en día sigue siendo importante esto, ya que al usar los dispositivos móviles, es necesario que no llevemos al límite nuestros recursos...

El tipo que se usa como short en c# durante muchos años fue considerado como el tipo numérico por excelencia, usada en el spectrum, el amstrada cpc e incluso en los primeros pc...

Actualmente si usamos otros lenguajes de programación o si usamos c# pero ampliado, podemos manejar números todavía más grandes...

[Continuará]