jueves, 19 de abril de 2018

Trabajo de bases de datos

Herramienta PIP Python

Pip es una herramienta escrita en Python para instalar y administrar paquetes de software escritos en Python. Muchos paquetes pueden ser encontrados en el Python Package Index (PyPI). Python 2.7.9 y posteriores (en la serie Python2), Python 3.4 y posteriores incluyen pip (pip3 para Python3) por defecto. La manera más sencilla de instalar pip en Windows es utilizando el programa de Python llamado get-pip.py, que puedes descargar aquí. Usa tu navegador para guardar esta página con su nombre por defecto, que es get-pip.py. Guarda el archivo en tu directorio de Python para que sepas dónde encontrarlo.

Una vez guardes el archivo, necesitas ejecutarlo, lo cual puedes hacer de dos maneras. Si prefieres utilizar tu intérprete de Python, solamente haz clic con el botón derecho sobre el archivo get-pip.py y selecciona “abrir con” y luego selecciona el intérprete de Python que suelas utilizar.

Si prefieres instalar pip utilizando la terminal de línea de comandos, navega al directorio en el que pusiste Python y obtén get-pip.py. Para este ejemplo asumimos el directorio python27, así que usa el comando C:\>cd python27. Una vez que estés en este directorio, ejecuta el comando:





Una ventaja importante de pip es la facilidad de su interfaz de línea de comandos, el cual permite instalar paquetes de software de Python fácilmente desde solo una orden:


Los usuarios también pueden fácilmente desinstalar algún paquete:


Otra característica particular de pip es que permite gestionar listas de paquetes y sus números de versión correspondientes a través de un archivo de requisitos. Esto nos permite una recreación eficaz de un conjunto de paquetes en un entorno separado (p. ej. otro ordenador) o entorno virtual. Esto se puede conseguir con un archivo correctamente formateado requisitos.txt y la siguiente orden:


Con pip es posible instalar un paquete para una versión concreta de Python, sólo es necesario reemplazar ${versión} por la versión de Python que queramos: 2, 3, 3.4, etc:





Librerías para manejar bases de datos en Python


En Python, el acceso a bases de datos se encuentra definido a modo de estándar en las especificaciones de DB-API, que puedes leer en la PEP 249. Esto, significa que independientemente de la base de datos que utilicemos, los métodos y procesos de conexión, lectura y escritura de datos, desde Python, siempre serán los mismos, más allá del conector.

En el siguiente ejemplo instalaremos la libreria directamente del instalador de MySQL.
  • Se selecciona la opción "Add" y buscamos aquella que diga "Connector/Python (3.6) 8.0.11"


  • Le damos clic a la opcion "Connector/Python" y seleccionamos la versión que tengamos instalada de Python en nuestro sistema, hecho esto nos apareceran dos opciones, una para equipos con sistema operativo de 32 bits, y otra para equipos con sistema operativo de 64 bits, seleccionaremos la opción que corresponda a la arquitectura de nuestra computadora, con esto hecho procederemos a darle clic a la flecha verde que va hacía su derecha "=>" para agregar la libreria a la lista de herramientas para instalar, después de hacerlo le daremos clic a "Next", se comenzará a descargar la libreria.


  • Libreria ya instalada



PyMySQL

Otra libreria que nos sirve para realizar la conexión de MySQL con Python es  PyMySQL, dicha libreria se puede instalar mediante la consola de comandos o CMD, a continuación se muestra como instalar la libreria PyMySQL (En este ejemplo ya se tiene Python en la variable de entorno):



Conexión

Para conectarnos a la base de datos y ejecutar cualquier consulta, el procedimiento consiste en:
  • Abrir la conexión y crear un puntero
  • Ejecutar la consulta
  • Traer los resultados (si de una selección se trata) o hacer efectiva la escritura (cuando se inserta, actualiza o eliminan datos)
  • Cerrar el puntero y la conexión

import MySQLdb

DB_HOST = 'localhost' 
DB_USER = 'root' 
DB_PASS = 'tecnologico' 
DB_NAME = 'Biblioteca' 

def run_query(query=''): 
    datos = [DB_HOST, DB_USER, DB_PASS, DB_NAME] 

    conn = MySQLdb.connect(*datos) # Conectar a la base de datos 
    cursor = conn.cursor()         # Crear un cursor 
    cursor.execute(query)          # Ejecutar una consulta 

    if query.upper().startswith('SELECT'): 
        data = cursor.fetchall()   # Traer los resultados de un select 
    else: 
        conn.commit()              # Hacer efectiva la escritura de datos 
        data = None 

    cursor.close()                 # Cerrar el cursor 
    conn.close()                   # Cerrar la conexión 

    return data





Prodecimientos MySQL

Procedimientos almacenados y funciones

Los procedimientos almacenados y funciones son nuevas funcionalidades de la versión de MySQL 5.0. Un procedimiento almacenado es un conjunto de comandos SQL que pueden almacenarse en el servidor. Una vez que se hace, los clientes no necesitan relanzar los comandos individuales pero pueden en su lugar referirse al procedimiento almacenado.

Algunas situaciones en que los procedimientos almacenados pueden ser particularmente útiles:

  • Cuando múltiples aplicaciones cliente se escriben en distintos lenguajes o funcionan en distintas plataformas, pero necesitan realizar la misma operación en la base de datos.
  • Cuando la seguridad es muy importante. Los bancos, por ejemplo, usan procedimientos almacenados para todas las oparaciones comunes. Esto proporciona un entorno seguro y consistente, y los procedimientos pueden asegurar que cada operación se loguea apropiadamente. En tal entorno, las aplicaciones y los usuarios no obtendrían ningún acceso directo a las tablas de la base de datos, sólo pueden ejectuar algunos procedimientos almacenados.

Los procedimientos almacenados pueden mejorar el rendimiento ya que se necesita enviar menos información entre el servidor y el cliente. El intercambio que hay es que aumenta la carga del servidor de la base de datos ya que la mayoría del trabajo se realiza en la parte del servidor y no en el cliente. Considere esto si muchas máquinas cliente (como servidores Web) se sirven a sólo uno o pocos servidores de bases de datos.

Los procedimientos almacenados le permiten tener bibliotecas o funciones en el servidor de base de datos. Esta característica es compartida por los lenguajes de programación modernos que permiten este diseño interno, por ejemplo, usando clases. Usando estas características del lenguaje de programación cliente es beneficioso para el programador incluso fuera del entorno de la base de datos.

Procedimientos almacenados y las tablas de permisos

Los procedimientos almacenados requieren la tabla proc en la base de datos mysql. Esta tabla se crea durante la isntalación de MySQL 5.0. Si está actualizando a MySQL 5.0 desde una versión anterior, asegúrese de actualizar sus tablas de permisos para asegurar que la tabla proc existe. 

Desde MySQL 5.0.3, el sistema de permisos se ha modificado para tener en cuenta los procedimientos almacenados como sigue:

El permiso CREATE ROUTINE se necesita para crear procedimientos almacenados.

El permiso ALTER ROUTINE se necesita para alterar o borrar procedimientos almacenados. Este permiso se da automáticamente al creador de una rutina.

El permiso EXECUTE se requiere para ejectuar procedimientos almacenados. Sin embargo, este permiso se da automáticamente al creador de la rutina. También, la característica SQL SECURITY por defecto para una rutina es DEFINER, lo que permite a los usuarios que tienen acceso a la base de datos ejecutar la rutina asociada.

Sintaxis de procedimientos almacenados

Los procedimientos almacenados y rutinas se crean con comandos CREATE PROCEDURE y CREATE FUNCTION . Una rutina es un procedimiento o una función. Un procedimiento se invoca usando un comando CALL , y sólo puede pasar valores usando variables de salida. Una función puede llamarse desde dentro de un comando como cualquier otra función (esto es, invocando el nombre de la función), y puede retornar un valor escalar. Las rutinas almacenadas pueden llamar otras rutinas almacenadas.

Desde MySQL 5.0.1, los procedimientos almacenados o funciones se asocian con una base de datos. Esto tiene varias implicaciones:

  • Cuando se invoca la rutina, se realiza implícitamente USE db_name ( y se deshace cuando acaba la rutina). Los comandos USE dentro de procedimientos almacenados no se permiten.
  • Puede calificar los nombres de rutina con el nombre de la base de datos. Esto puede usarse para referirse a una rutina que no esté en la base de datos actual. Por ejemplo, para invocar procedimientos almacenados p o funciones f esto se asocia con la base de datos test , puede decir CALL test.p() o test.f().
  • Cuando se borra una base de datos, todos los procedimientos almacenados asociados con ella también se borran.
MySQL soporta la extensión muy útil que permite el uso de comandos regulares SELECT dentro de los procedimientos almacenados. El conjunto de resultados de estas consultas se envía diractamente al cliente. Comandos SELECT múltiples generan varios conjuntos de resultados, así que el cliente debe usar una biblioteca cliente de MySQL que soporte conjuntos de resultados múltiples. Esto significa que el cliente debe usar una biblioteca cliente de MySQL como mínimos desde 4.1.

CREATE PROCEDURE y CREATE FUNCTION












Estos comandos crean una rutina almacenada. Desde MySQL 5.0.3, para crear una rutina, 
es necesario tener el permiso CREATE ROUTINE, y los permisos ALTER ROUTINE y EXECUTE se asignan automáticamente a su creador.

Por defecto, la rutina se asocia con la base de datos actual. Para asociar la rutina explícitamente con una base de datos, especifique el nombre como db_name.sp_name al crearlo.


Si el nombre de rutina es el mismo que el nombre de una función de SQL, necesita usar un espacio entre el nombre y el siguiente paréntesis al definir la rutina, o hay un error de sintaxis. Esto también es cierto cuando invoca la rutina posteriormente.



La cláusula RETURNS puede especificarse sólo con FUNCTION, donde es obligatorio. Se usa para indicar el tipo de retorno de la función, y el cuerpo de la función debe contener un comando RETURN value.


La lista de parámetros entre paréntesis debe estar siempre presente. Si no hay parámetros, se debe usar una lista de parámetros vacía () . Cada parámetro es un parámetro IN por defecto. Para especificar otro tipo de parámetro, use la palabra clave OUT o INOUT antes del nombre del parámetro. Especificando IN, OUT, o INOUT sólo es valido para una PROCEDURE.

Un procedimiento o función se considera “determinista” si siempre produce el mismo resultado para los mismos parámetros de entrada, y “no determinista” en cualquier otro caso. Si no se da ni DETERMINISTIC ni NOT DETERMINISTIC por defecto es NOT DETERMINISTIC.

Varias características proporcionan información sobre la naturaleza de los datos usados por la rutina. CONTAINS SQL indica que la rutina no contiene comandos que leen o escriben datos. NO SQL indica que la rutina no contiene comandos SQL. READS SQL DATA indica que la rutina contiene comandos que leen datos, pero no comandos que escriben datos. MODIFIES SQL DATA indica que la rutina contiene comandos que pueden escribir datos. CONTAINS SQL es el valor por defecto si no se dan explícitamente ninguna de estas características.

MySQL almacena la variable de sistema sql_mode que está en efecto cuando se crea la rutina, y siempre ejecuta la rutina con esta inicialización.

La cláusula COMMENT es una extensión de MySQL, y puede usarse para describir el procedimiento almacenado. Esta información se muestra con los comandos SHOW CREATE PROCEDURE y SHOW CREATE FUNCTION.

MySQL permite a las rutinas que contengan comandos DDL (tales como CREATE y DROP) y comandos de transacción SQL (como COMMIT). Esto no lo requiere el estándar, y por lo tanto, es específico de la implementación.


Los procedimientos almacenados no pueden usar LOAD DATA INFILE.

Los comandos que retornan un conjunto de resultados no pueden usarse desde una función almacenada. Esto incluye comandos SELECT que no usan INTO para tratar valores de columnas en variables, comandos SHOW y otros comandos como EXPLAIN. Para comandos que pueden determinarse al definir la función para que retornen un conjunto de resultados, aparece un mensaje de error Not allowed to return a result set from a function (ER_SP_NO_RETSET_IN_FUNC). Para comandos que puede determinarse sólo en tiempo de ejecución si retornan un conjunto de resultados, aparece el error PROCEDURE %s can't return a result set in the given context (ER_SP_BADSELECT).

Ejemplo de un procedimiento almacenado que use un parámetro OUT . El ejemplo usa el cliente mysql y el comando delimiter para cambiar el delimitador del comando de ; a // mientras se define el procedimiento . Esto permite pasar el delimitador ; usado en el cuerpo del procedimiento a través del servidor en lugar de ser interpretado por el mismo mysql.



Al usar el comando delimiter, debe evitar el uso de la antibarra ('\') ya que es el carácter de escape de MySQL.

El siguiente es un ejemplo de función que toma un parámetro, realiza una operación con una función SQL, y retorna el resultado:



Si el comando RETURN en un procedimiento almacenado retorna un valor con un tipo distinto al especificado en la cláusula RETURNS de la función, el valor de retorno se coherciona al tipo apropiado. Por ejemplo, si una función retorna un valor ENUM o SET, pero el comando RETURN retorna un entero, el valor retornado por la función es la cadena para el miembro de ENUM correspondiente de un conjunto de miembros SET .

miércoles, 18 de abril de 2018

Uso de Macro del programa de los colores en Emu8086

bucle1 macro tama,x,y
mov CX, tama 
BUCLE:
MOV DX, SI
ADD DX, x
MOV DH, y
coloca ;este es el macro para colocar en la posicion la letra
;se guarda letra por letra
MOV AL, [SI+OFFSET TITULO]
;guarda color por color
MOV BL, [SI+OFFSET COLORES]
color ;este es el macro que selecciona un color
INC SI
LOOPNZ BUCLE
endm 

color macro ;macro que selecciona el color
MOV AH, 9
INT BIOS
endm 

coloca macro;macro que selecciona una posicion
MOV AH, 2
INT BIOS
endm

.STACK 64
.MODEL SMALL

CR EQU 13
LF EQU 10
BIOS EQU 10H
DOS EQU 21H
TEXTO EQU 3
FIN EQU 4C00H

.DATA
;ponemos el texto que querramos mostrar
TITULO DB 'Agnax & Alizz Y pedrito',
;aqui va la lista de los colores
;del texto
colores DB 50H
DB 5fH
DB 50H
DB 5fH
DB 50H
DB 00H
DB 0f0H
DB 00h
DB 20H
DB 20H
DB 20H
DB 20H
DB 20H 
DB 00H
DB 0fH 
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH

.CODE
;esta zona es para poner el texto
COLO PROC FAR
MOV AX, @DATA
MOV DS, AX 
;Aquí se pone el macro del bucle
bucle1 25,30,12

MOV AH, 8
INT DOS 

coloca ;este es el macro para colocar en la posicion la letra
MOV AX, FIN

INT DOS 
COLO ENDP
RET


Macro - Programa que muestra un mensaje utilizando una macro

ensamblador macro msg ; Declaracion de nuestra macro ensamblador
mov ah, 09h ; Imprime la cadena en pantalla
mov dx, offset msg ; Se ingresan los valores en nuestro registro DX
int 21h ; Interrupcion del DOS
ENDM


.DATA
msg DB 'Programa utilizando una macro. $'  ; Mensaje
.CODE

inicio:
mov ax, @Data       ; Asignacion de datos en el registro AX
mov ds, ax          ; Asignacion de datos al registro de segmento de datos

ensamblador msg     ; Aqui se llama a la macro con el nombre ENSAMBLADOR con el parametro MSG

mov ah, 08h
int 21h             ; Interrupcion del DOS

mov ax, 4c00h       ; Complemento de la interrupcion 21h para finalizar el programa
int 21h             ; Interrupcion del DOS
end inicio

miércoles, 11 de abril de 2018

Macros - Ensamblador

; Programa que posiciona un caracter en cierta parte de la pantalla

gotoxy macro fila,col    
    mov ah,02h    ; Se encarga de posicionar el cursor en pantalla
    mov dh,fila   ; Valor de la fila en la parte alta                                                   
    mov dl,col    ; Valor de la columna parte baja
    mov bh,0h
    int 10h       ; Interrupcion para ejecutar los cambios en modo video  
endm  ; Finalizacion del macro
      ; Todo el bloque anterior de codigo funciona para posicionar el cursor en una fila y una columna
      
      ; La interrupcion int 10h es utilizada para despliegue en video, acepta el numero de funciones en el AH para el modo de pantalla     
        
pantalla macro letra
    mov ah,02h      ; Posicionamos el caracter
    mov dl,letra
    int 21h         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm

;La interrupcion 21h tiene varias funciones, para accesar a cada una de ellas es necesario que en el registro AH se encuentre el numero de funcion que se requiera
;Cuando tenemos el parametro 02H en nuestro registro AH la interrupcion 21h exhibe la salida
;Cuando tenemos el parametro 09H en nuestro registro AH la interrupcion 21h imprime la cadena (video)
;Cuando tenemos el parametro 40H en nuestro registro AH la interrupcion 21h despliega la escritura en dispositivo/archivo           
           
.model small
.data
.code
startup:
    mov ax,@data
    mov ds,ax
    mov ax,0003h
    int 10h
    gotoxy 10,10    ; Aqui se le asigna a nuestra macro el valor de la fila y columna donde se posicionara el cursor
    pantalla 41h    
    mov ah,01h
    int 21h         ; Cierre del programa
    mov ax,4c00h    ; Cierre del programa
    int 21h         ; Cierre del programa
end startup


; Programa que coloca un caracter en la posicion dada de acuerdo a parámetros ingresados por teclado 

gotoxy macro fila,col ; Delaracion de nuestro primer macro GOTOXY
    mov ah,02h ; Se encarga de posicionar el cursor en pantalla
    mov dh,fila  ; Valor de la fila en la parte alta            
    mov dl,col   ; Valor de la columna parte baja
    mov bh,0h
    int 10h        ; Interrupcion para ejecutar los cambios en modo video  
endm              ; Finalizacion de la macro

                 ; La interrupcion int 10h es utilizada para despliegue en video, acepta el numero de funciones en el AH para el modo de pantalla     

pantalla macro que  ; Declaracion de nuestro segundo macro PANTALLA
    mov ah,02h      ; Posicionamos el caracter
    mov dl,que
    int 21h         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm                ; Finalizacion de la macro

;La interrupcion 21h tiene varias funciones, para accesar a cada una de ellas es necesario que en el registro AH se encuentre el numero de funcion  que se requiera
;Cuando tenemos el parametro 02H en nuestro registro AH la interrupcion 21h exhibe la salida
;Cuando tenemos el parametro 09H en nuestro registro AH la interrupcion 21h imprime la cadena (video)
;Cuando tenemos el parametro 40H en nuestro registro AH la interrupcion 21h despliega la escritura en dispositivo/archivo           

imprime macro eztryng      ; Declaracion de nuestro tercer macro IMPRIME
    mov dx,offset eztryng  ; Se ingresan los valores en nuestro registro DX
    mov ah,9                     ; Imprime la cadena
    int 21h                         ; Utilizamos esta interrupcion para mostrar el caracter que esta almacenado en el registro AH
endm                              ; Finalizacion del macro

.data                               ; Variables
    mensaje DB "Ingrese un caracter: $"             ; Primer mensaje que nos pedira el caracter que se mostrara en pantalla    
    mensaje2 DB "Ingrese X del 0 al 9: $"           ; Segundo mensaje que nos pedira ingresar un valor del 0 al 9 para la posicion en el eje X donde se desplegara nuestro caracter
    mensaje3 DB ,13,10,"Ingrese Y del 0 al 9: $"    ; Tercer mensaje que nos pedira ingresar un valor del 0 al 9 para la posicion en el eje Y donde se desplegara nuestro caracter
    caracter DB 40
    varx DB ?
    vary DB ?

vtext db 100 dup('$')

.code

startup:
    mov ax,@data    ; Asignacion de datos en el registro AX
    mov ds,ax       ; Asignacion de datos al registro de segmento de datos
    
    imprime mensaje ; Aqui se llama a la macro con el nombre IMPRIME con el parametro MENSAJE
    mov si,00h      ; Limpia el apuntador del registro indice fuente


 leer:              ; Comienzo de la declaracion del metodo leer
    mov ax,0000     ; Aqui se realiza limpieza al registro AX
    mov ah,01h      ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h         ; Interrupcion del DOS

    mov caracter[si],al ; Guarda el dato capturado en la parte baja del registro AX en el registro indice fuente
    inc si                      ; Incrementa el registro indice fuente
    cmp al,0dh             ; Hace una comparacion para saber si la tecla introducida fue ENTER
    ja XY                     ; En caso de que se haya presionado ENTER, saldra el siguiente mensaje que pedira las coordenadas en X
    jb leer                    ; En caso de que no se haya presionado ENTER se volvera a ejecutar el metodo LEER

    XY:                     ; Declaracion del metodo XY
    mov dx,offset caracte; Coloca en el registro el caracter ingresado previamente
    mov ah,0ah              ; Complemento de la interrupcion 21h para leer caracteres del teclado y almacenarlos en un buffer
    int 21h                 ; Interrupcion DOS

    imprime caracter        ; Llama a nuestra macro con el nombre IMPRIME con el parametro CARACTER
    imprime mensaje2        ; Llama a nuestro macro con el nombre IMPRIME con el parametro MENSAJE2

    mov ah,01h              ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo 
    int 21h                 ; Interrupcion DOS

 sub al,30h                 ; Se le resta 30h a la parte baja de nuestro registro AX para convertirlo a valor numerico
    mov bl,al               ; Se le asigna a la parte baja de nuestro registo BX el valor de la parte baja del registro AX

    mov varx,al             ; Se le asigna a nuestra variable de la coordenada X el valor almacenado en la parte baja del registro AX

    imprime mensaje3        ; Llama a nuestro macro con el nombre IMPRIME con el parametro MENSAJE3

    mov ah,01h              ; Complemento para la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h                 ; Interrupcion DOS

 sub al,30h                 ; Se le resta 30h a la parte baja de nuestro registo AX para convertirlo a valor numerico
    mov bl,al               ; Se le asigna a la parte baja de nuestro registo BX el valor de la parte baja del registro AX
    mov vary,al             ; Se le asigna a nuestra variable de la coordenada Y el valor almacenado en la parte baja del registro AX
    
    mov ax,0003h            ; Complemento de la interrupcion 10h
    int 10h                        ; Interrupcion para ejecutar los cambios en modo video  
    gotoxy vary,varx        ; Llama a la macro GOTOXY con los parametros VARX y VARY  como fila y columna
    pantalla caracter[0]    ; Llama a la macro PANTALLA con el caracter capturado previamente como parametro

    mov ah,01h               ; Complemento de la interrupcion 21h que se utiliza para leer un caracter del teclado y desplegarlo
    int 21h                       ; Interrupcion del DOS
    mov ax,4c00h           ; Complemento de la interrupcion 21h para finalizar el programa
    int 21h                       ; Interrupcion del DOS
                
end startup                  ; Fin del programa

Exposiciones - Lenguajes de interfaz

Equipo # 1 - Programación del puerto paralelo Un puerto paralelo es una interfaz entre un computador y un periférico, cuya principal carac...