martes, 27 de octubre de 2015

ZFS


Sistema de archivos: ZFS


Autor: Bruno Binner Quiñones
Competencia: Gestion en TI (Nivel 2)
Asignatura: Mantencion de sistemas
Palabras Clave: Sistema de archivos, ZFS, SUN, Solaris, gestion TI

Descripción de la Actividad


La actividad consistia en investigar sobre algun sistema de archivos y destacar sus aspectos mas importantes. El sistema de archivos que nosotros escogimos fue ZFS.



¿Que es ZFS?


ZFS es un sistema de archivos revolucionario desarrollado por Sun Microsystems que fundamentalmente cambia la forma en que sistemas de archivos son administrados, con características y ventajas no encontradas en ningún otro sistema de archivos actual. Tales como protección contra archivos corruptos, soporte de grandes cantidades de almacenamiento, compresión de información eficiente, entre otras que se verán a continuación.



¿Que es un sistema de archivos?


Sistema de archivos: Un sistema de archivos son los métodos y estructuras de datos que un sistema operativo utiliza para seguir la pista de los archivos de un disco o partición; es decir, es la manera en la que se organizan los archivos en el disco.



Características


Integridad de datos comprobable: Esto permite que los datos en el archivo se mantengan siempre correctamente, siendo capaz de detectar datos corruptos y repararlos automáticamente. Esto se logra gracias a un modelo transaccional de archivos.

Modelo transaccional: Implica el almacenamiento de eventos o transacciones. Para esto se utiliza la técnica conocida como copy-on-write, de forma que cuando se modifican datos en el disco, estos no son sobrescritos, para lo que se crean nuevos bloques donde estos datos son grabados y luego se modifican las estructuras correspondientes para que apunten a estos nuevos bloques.
Snapshots: Corresponden a copias del sistema de archivos en algún determinado momento. Son de creación muy rápida, permitiendo hacer respaldos o copias de seguridad de forma casi inmediata, con la salvedad que estas copias son de sólo lectura.
Clones: De forma similar a los snapshots, los clones son copias del sistema de archivos en algún determinado momento, pero en los cuales se permite realizar escritura.
Espacios de almacenamiento (zpool): ZFS hace uso de espacios de almacenamiento virtual (o virtual storage pool, o zpools), a diferencia de los sistemas de archivo tradicionales que se encuentran en un solo dispositivo y requieren un gestor de volúmenes. Un zpool se construye a partir de dispositivos virtuales (o conocidos como vdevs) que a su vez se construyen a partir de bloques de dispositivos (particiones de disco duro, o discos completos). Además, la capacidad de almacenamiento de todos los vdevs se encuentra disponible para todas las instancias del sistema de archivos en el zpool.


SO compatibles.


Solaris
OpenSolaris
Oracle Solaris
OpenIndiana
Nexenta Core
NexentaStor
BeleniX
Schillix
StormOS
Jaris
MilaX
FreeNAS
NAS4Free
Korona
EON NAS
napp-it
OmniOS
SmartOS
NetBSD
MidnightBSD
OS X
DogeOS
FreeBSD
Debian GNU/kFreeBSD
Linux
IllumOS


Capacidades de almacenamiento


Algunos límites teóricos de ZFS son:
  • Número de snapshots en cualquier sistema de archivos: 281.474.976.710.656 (281 trillones)
  • Número de archivos en un sistema de archivos: 281.474.976.710.656
  • Tamaño máximo de:
  1. Sistema de archivos: 16 EB (Exabytes)
  2. Fichero: 16 EB (Exabytes)
  3. Atributos: 16 EB (Exabytes)

  • Tamaño máximo de un zpool: 3 ×10^23 petabytes 
  • Número de atributos de un fichero (realmente limitado a 248 que es el número de archivos que puede contener un sistema de archivos ZFS): 2^56 = 72.057.594.037.927.936 (72 Quintillones) 
  • Número de archivos en un directorio (realmente limitado a 248 que es el número de archivos que puede contener un sistema de archivos ZFS): 2^56 
  • Número de dispositivos en cualquier zpool: 2^64 = 18.446.744.073.709.551.616 (18 hexallones) 
  • Número de zpools en un sistema: 2^64 
  • Número de sistemas de archivos en un zpool: 2^64

Conclusion


Una de las características que más llamó la atención en éste trabajo de investigación es el hecho de poder adicionar en cualquier momento diversos medios de almacenamientos masivo al pool de almacenamiento siendo capaz de poder trabajar con cada uno de ellos independiente de sus características y manteniendo su integridad.

lunes, 26 de octubre de 2015

Bases de datos y python

Trabajando con base de datos en python



Autor: Bruno Binner Quiñones
Competencia: Desarrollo de Software (Nivel 2)
Asignatura: Programación II
Palabras Clave: Base de datos, Python, sql, sqlite3, archivos


Descripción de la Actividad


La finalidad de la actividad era demostrar que tan útil, eficiente, y practico puede ser el uso de programas en python para desglosar archivos y llenar datos en una base de datos.
El ejercicio consistía en llenar, con el uso de python, la tabla ‘ventas’, de una base de datos llamada ‘datos.db’, tabla la cual poseía la siguiente estructura:
{id: ipka, p: real, q: integer, v: real, f: ’dd-mm-yyyy’, t: varchar(1)}


Siendo:
p : Precio.
q : Cantidad vendida.
v : Venta, que es igual a la cantidad vendida multiplicada por el precio.
f : Fecha de la venta.
t : Es el tipo de pago. Dentro de los tipo de pago esta efectivo(e), visa(v), master(m) y cheque(c).


Los datos para llenar esta tabla están contenidos en un archivo de texto llamado ‘movi.txt’. Que contiene lo siguiente:



El archivo tiene un total de 100000 líneas.


Solución

Antes de empezar con el código hay que analizar la tabla y el archivo que contiene los datos para saber a que campo corresponde cada dato. Para esto hay que fijarse en el tipo de dato que soporta cada campo.
Como se puede apreciar en la siguiente imagen.
Lo encerrado en el cuadrilátero azul representa el tipo de dato de cada campo. Siendo 'integer' para guardar valores/números enteros, 'real' para números reales, y finalmente el 'varchar' que se usa para almacenar cualquier carácter (letras, números, símbolos, etc). Por ejemplo en el campo 'id' se podrían almacenar números tales como 10; 0; 331 o cualquier otro que no contenga números decimales. En 'p' se podrían poner números como 1.23; 0.2443;1323.2344 etc. Y en 'f' se podrían guardar cosas como palabras, números u otras cosas, cabe destacar que los números ingresados en un campo 'varchar' serán tomados como una cadena (string).
Bueno, ya analizados los datos sabemos que 'id' y 'q' contendrán números enteros, 'p' y 'v' almacenaran valores reales, y 'f' con 't' guardaran strings de texto.

Ahora iremos al archivo movi.txt para ver que datos corresponde a cada campo. Para esto nos centraremos en una de linea al azar del archivo que sera la siguiente.

Usando los '&' como referencia separaremos los datos de la siguiente forma.
En la imagen anterior se puede ver la linea separada por tipos de dato y también a que campos correspondería cada dato. Si se preguntan el por que el campo 'id' no esta en la imagen, es porque 'id' es un campo con autoincrement. Que quiere decir esto, significa que cada vez que se ingrese una linea en la tabla, los valores que tome 'id' serán generados automáticamente, haciendo que por cada linea el numero aumente en 1.

Ya con esto identificado pasamos al código.

Codigo sin comentarios:
  1. import sqlite3 as sq3

  2. con = sq3.connect('.\Base Datos\datos.db')
  3. cur = con.cursor()
  4. insert='insert into ventas(p,q,v,f,t) values(?,?,?,?,?);'

  5. f=open('movi.txt')
  6. d=f.readlines()

  7. for e in d:
  8. t=e[:-1].split('&')
  9. con.execute(insert ,((float(t[0]),int(t[1]),float(t[2]),t[3],t[4]))

  10. con.commit()


Codigo con comentarios:

import sqlite3 as sq3  
#Se importa el modulo de sqlite3 para poder trabajar con bases de datos.

con = sq3.connect('.\Base Datos\datos.db')  
#Se establece conexion con la base de datos hubicada en este caso en una carpeta llamada 
#'Base Datos' que esta en el mismo directorio donde se #encuentra el programa python.

cur = con.cursor() #Se crea un objeto cursor para poder hacer consultas sql a la base de datos.
insert='insert into ventas(p,q,v,f,t) values(?,?,?,?,?);'
# Se guarda en una variable, un string que contiene una orden para sql.

f=open('movi.txt') # Se abre el archivo movi.txt
d=f.readlines() # Se guarda en un arreglo las lineas del archivo

for e in d:
t=e[:-1].split('&')
con.execute(insert ,(float(t[0]),int(t[1]),float(t[2]),t[3],t[4]))
# Para cada linea se aplicara un split que separara los datos por cada & que encuentre, y se #guardaran en un arreglo, para luego ser insertados en la base de datos mediante el metodo #execute()

con.commit() # Se confirman los cambios realizados durante el codigo

En la linea 1 se importa el modulo sqlite3 para trabajar con la base de datos. Luego en la linea 3 se establece conexión con la base de datos, usando con = sq3.connect('.\Base Datos\datos.db'), ubicada en esta caso en una carpeta llamada 'Base Datos' que esta en el mismo directorio que el programa de python que estamos usando.
En la linea 4 con cur = con.cursor() se crea un objeto cursor para poder hacer consultas sql a la base de datos.
Se crea en la linea 5 una variable que contendrá un strin que sera el siguiente 'insert into ventas(p,q,v,f,t) values(?,?,?,?,?);' que explicaremos su propósito un poco mas adelante.
Luego abrimos el archivo movi.txt con f=open('movi.txt') y guardamos en un arreglo todas las lineas que este contiene, haciendo uso de f.readlines(). Por ejemplo lo que debería contener el primer elemento del arreglo es un string que seria el siguiente: 403.704218057&78&33733.1335705&08-5-2003&E\n
Si se fijan bien el salto de linea '\n' va incluido al final de cada cadena.

Luego en el siguiente segmento de código:
for e in d:
t=e[:-1].split('&')
con.execute(insert ,(float(t[0]),int(t[1]),float(t[2]),t[3],t[4]))

Se recorre el arreglo que contiene las lineas de movi.txt y en cada linea se aplica un t=e[:-1].split('&') que guardara en el arreglo t algo como esto:[403.704218057,78,33733.1335705,08-5-2003,E]
.split('&') Sirve para separar un string por cada & que encuentre y es para sacar el '\n' al final de cada linea.
Después con execute() insertamos los datos obtenidos en t en la tabla 'ventas'. La forma que funciona execute(orden_sql,valores) es que donde dice orden_sql se pone la orden o consulta que se hara a la base de datos en lenguaje sql, en nuestro caso 'insert into ventas(p,q,v,f,t) values(?,?,?,?,?);' y en valores se colocan los valores que reemplazaran los '?' que hay en orden_sql. O sea que lo que enrealidad esta escrito en execute() es
con.execute('insert into ventas(p,q,v,f,t) values(?,?,?,?,?);',(float(t[0]),int(t[1]),float(t[2]),t[3],t[4]))

Finalmente se confirman los cambios realizados en la tabla con con.commit() y se llena la tabla de los datos que habían en movi.txt. Quedando algo como en la siguiente imagen:

En qué me ayudó esta actividad

Una tarea que puede parecer extremadamente tediosa como lo seria llenar una tabla de una base de datos con 100000 lineas se puede realizar de forma sencilla con tan solo 10 lineas de un programa en python. Demostrando lo útil que es ocupar diferentes recursos para dar soluciones a diversas problemáticas, así como usar archivos de texto, desglosar la información que contienen y utilizarla.
Con este trabajo también aprendí lo versátil que puede ser el uso de archivos a momento de crear soluciones.


lunes, 5 de octubre de 2015

Laboratorio diagramas de flujo

Comprendiendo diagramas de flujo

Autor: Bruno Binner Quiñones
Competencia: Desarrollo de Software (Nivel 1)
Asignatura: Programación I
Palabras Clave: Diagrama de flujo, Python, if, else, condicionales

Descripción de la Actividad
La finalidad de la actividad era demostrarnos el uso de los diagramas de flujos para ordenar ideas, resolver problemas de programación y estructurar de una mejor forma los códigos creados. Ademas de reforzar lógica de condicionales.
Esta actividad consistía en analizar un diagrama de flujo, entregado por la profesora, y traspasarlo a lenguaje python para que fuera funcional. El diagrama de flujo que se entrego pedía un numero que representaba una edad y lo clasificaba en 3 grupos dependiendo del valor ingresado: adulto mayor, adulto o menor de edad. Paralelamente a lo anterior se tenia un valor con un valor inicial que, dependiendo de lo que lo que ocurriera durante la ejecución del programa, iba a tomar distintos valores para que al finalizar la ejecución, se imprimiera por pantalla. 
Solución
Diagrama de flujo
Un diagrama de flujo es una representación gráfica de un proceso o programa. Cada paso del proceso es representado por un símbolo diferente que contiene una breve descripción de la etapa de proceso. Los símbolos gráficos del flujo del proceso están unidos entre sí con flechas que indican la dirección de flujo del proceso.
El diagrama de flujo que se nos presento fue el siguiente:
La forma en que funciona este diagrama es que cada cuadro representa una acción especifica, siendo las siguientes:
Nota: Los valores que se pueden ver en la esquina superior derecha son solo valores que dio la profesora para que probáramos en el programa, no tienen nada que ver en la estructuración del diagrama ni tampoco del código.
Primero se inicia el diagrama  con la circunferencia que se ve en la parte superior de la imagen. Aquí nos encontramos con el primer cuadro que tiene forma de romboide.

 Estos cuadros quieren decir que lo que contengan en el interior, en este caso "n", es un valor ingresado por teclado, o sea, que el valor de "n" va a depender de lo que ingrese el usuario al momento de ejecutar el programa. Los romboides también representan cosas que se imprimen por pantalla, como se puede observar al final del diagrama donde se muestra por pantalla el valor de "a".
 Para diferenciar si el se pide un valor por teclado o si se imprime por pantalla hay que tomar en cuenta el contexto de la problemática.
Luego de eso pasamos al siguiente cuadro que tiene forma de rectángulo.

Estos cuadros representan operaciones con variables que no se muestran por pantalla, como por ejemplo creación y asignación de variables, operaciones entre variables como suma, resta, multiplicación, etc. En este caso se crea una variable "a" y se le asigna un valor de 100.  
Finalmente nos encontramos con el ultimo tipo de cuadrilátero en este diagrama que es el que representa condicionales, el rombo.
El rombo establece una condición y dependiendo de sí se cumple o no, el programa ejecutara diferentes acciones. En este caso la condición es que sí "n" es mayor o igual a 60, el programa seguirá por la rama que nace por la derecha del rombo, la con una "V" encima, y ejecutara todo lo que de ahí en adelante hay, ignorando todo lo que esta en la rama de la izquierda.
Con eso explicado ya se puede tener un mejor entendimiento de lo que hace este diagrama de flujo, por lo que ya podemos proceder a hacer el código.
El código resultante del laboratorio fue el siguiente:
  1. n=input("Ingrese edad ")
  2. a=100
  3. if(n>=60):
  4.     print"Adulto mayor"
  5.     a+=1
  6. else:
  7.     if(n>18):
  8.         print"Adulto"
  9.         a-=1
  10.     else:
  11.         print"Menor de edad"
  12.         a-=50
  13.     print n,",",a
  14. print a
La primera linea del código representaría el romboide del diagrama de flujo. Con input("texto que se muestra en pantalla") le decimos a la maquina que pida al usuario que ingrese un valor o texto por el teclado, y al anteponer n= hacemos que el valor que se ingrese en el input se le asigne a una variable llamada n. Luego en la linea 2 se crea una variable 'a' que se le asigna un valor de 100.
En la linea 3 aparece la primera condicional 'if(condición):'. Lo que hace esta parte del código es verificar si es que n es mayor o igual a 60. Sí lo es, va a mostrar por pantalla "Adulto mayor" con uso del comando print"texto" y le va a restar 1 a la variable 'a'. Es importante destacar que para poner acciones dentro de un if es necesario tabular las partes del código que se desea encerrar en el.
Por otra parte, sí la condición anterior no se cumplió, se va a ejecutar todo lo que este al interior del siguiente else: que en este caso es otra condicional.
Así el programa efectúa diferentes procesos dependiendo del valor que se haya ingresado al principio de va a determinar en que grupo se clasifica ese valor y al final mostrara por pantalla el valor final de 'a'.
En qué me ayudó esta actividad
Esta actividad me ayudo a comprender mejor la utilidad de los diagramas de flujo, ya que facilita la organización de códigos y también me ayudo a reforzar el uso de condicionales if-else.