3ENGINE

Programación y otros cachivaches

Categoría: Tecnologia

Página 3/42

Tecnologia

Validar un XML mediante Notepad++


Para validar un XML con el Notepad++ primero necesitamos instalar el plugin «XML Tools». Que se puede instalar desde el plugin manager.

El XML necesita de dos tags para indicar el XSD requerido para la validación.



  
    ford
    red
  
  
    seat
    green
  

Una vez abierto el XML podemos validar haciendo click en «plugins->XML Tools->validate now»

Validar un XML mediante Notepad++

Si la validación es exitosa aparecerá un mensaje como este o en su defecto un mensaje con los errores detectados:

Validar un XML mediante Notepad++

Si el validador no encuentra el XSD especificado en xsi:schemaLocation apacerá un mensaje de este estilo:

Validar un XML mediante Notepad++

Si sucede esto o bien corregimos la ruta o bien eliminamos xsi:schemaLocation. Ahora el validador nos preguntará la localización del XSD:



  
    ford
    red
  
  
    seat
    green
  

Validar un XML mediante Notepad++




Tecnologia

Acceso a IIS Express desde un equipo remoto


IIS Express es el servidor de desarrollo de ASP.NET que viene incorporado en Visual Studio y que también está disponible de manera gratuita para su descarga.

Esta versión recortada de IIS es perfectamente válida para desarrollos aunque esto no quita que al final para entornos de producción debas hacer el deploy en un IIS real.

Acceso desde un equipo remoto

A veces necesitamos hacer público el acceso al IIS Express para hacer pública nuestra aplicación. Por ejemplo para comprobar que la aplicación funciona en otros navegadores no disponibles en el entorno de producción, para que otras personas del equipo validen los desarrollos o simplemente porque no disponemos de un IIS real, etc..

Pasos

  1. Permitir conexiones de entrada
  2. * En Windows casi todas la conexiones de entrada están bloqueadas. Para comprobar conexiones de entrada permitidas ejecuta:

    > netsh http show urlacl
    

    * Para permitir conexiones ejecuta:

    > netsh http add urlacl url=http://08APC0501:61277/ user=todos
    

    donde url es la IP o nombre de máquina + puerto a publicar y user el nombre de usuario o grupo de usuarios (‘todos’ es ‘everyone’ si el S.O está en inglés)

  3. Añadir un regla al Firewall de Windows
  4. > netsh advfirewall firewall add rule name="IISExpressWeb" dir=in protocol=tcp localport=61277 profile=private remoteip=localsubnet action=allow
    
  5. Modificar applicationhost.config
  6. Es posible que necesites modificar el archivo de configuración de IIS Express.
    Normalmente se encuentra en C:\Users\TuUsuario\Documents\IISExpress\config\applicationhost.config

    
    
       
    
    [....]
    
    
    
    
    
    



Tecnologia

Python y PyQt: cómo implementar un selector de color


A continuación muestro como implementar en Qt y Python un selector de color (color picker) que hereda de un QFrame.

Al hacer clic en el botón izquierdo aparece un cuadro de diálogo estandar (QColorDialog) para seleccionar un color y se actualiza el color del widget al color seleccionado. También incluye la opción de hacer clic en el botón derecho que deja un color por defecto.

cómo implementar un selector de color

Código

from PyQt4.QtGui import *
from PyQt4.QtCore import *

class QColorBox(QFrame):

    colorChanged = pyqtSignal()

    def __init__(self, parent=None, defaultColor=Qt.white):
        super(QColorBox,self).__init__(parent)

        self.setStyleSheet("border-color: rgba(0,0,0,0);")
        self.__color = None
        self.__defaultColor = QColor(defaultColor)
        self.setColor(self.__defaultColor)
        self.setFixedHeight(20)
        self.setFrameStyle(1)

    def setColor(self, color):
        if color != self.__color:
            self.__color = QColor(color)
            self.setStyleSheet("background-color: %s;" % self.__color.name())
            self.colorChanged.emit()

    def color(self):
        return self.__color

    def mousePressEvent(self, e):
        if e.buttons() == Qt.LeftButton:
            color = QColorDialog.getColor(self.__color)
            if color.isValid():
                self.setColor(color)
                self.colorChanged.emit()
        elif e.button() == Qt.RightButton:
            self.setColor(self.__defaultColor)

#
# test
#

if __name__ == "__main__":
    app = QApplication([])
    c = QColorBox(defaultColor=Qt.red)
    c.show()
    app.exec_()



Tecnologia

Cómo preparar y distribuir un paquete Python


Supongamos que después de un laborioso esfuerzo has terminado una aplicación o módulo en Python y quieres compartirlo. En este artículo intento explicar cómo preparar y distribuir un paquete Python.
packpy

Preparación básica de tu paquete

Normalmente yo me organizo el código así pero por supuesto eres libre de hacer lo que quieras 🙂

/demo
/test
/[src]
LICENSE
README.rst
MANIFEST.in
setup.py

carpetas

  • /[src] con el nombre de tu proyecto de la que cuelga todo el código fuente y ficheros relacionados
  • /demo con una o varias demos de mi aplicación o módulo
  • /test donde mediante test unitarios, técnicas de mocking y code coverage me aseguro que mi código es indestructible X-) y así garantizo que la víctima persona que haga uso de mi código no se lleve sorpresas.

setup.py

setuptools deja tu aplicación o módulo preparado para distribuirlo. Es un módulo incorporado en Python que permite descargar, construir, instalar, actualizar y desinstalar paquetes de Python. Necesitarás crear un setup.py.

Veamos un ejemplo y luego comento:

from setuptools import setup, find_packages

setup(
name = 'iniconfig.py',
version = ‘1.0.0’,
author = 'David Miro',
author_email = 'lite.3engine@gmail.com',
description = 'A more convenient and practical approach to manage .ini files',
long_description = open('README.rst').read(),
license = open('LICENSE').read(),
url = 'https://github.com/dmiro/iniconfig',
packages = find_packages(),
test_suite = 'tests',
classifiers = [
    'Development Status :: 5 - Production/Stable',
    'Intended Audience :: Developers',
    'Intended Audience :: Information Technology',
    'Programming Language :: Python',
    'Programming Language :: Python :: 2.6',
    'Programming Language :: Python :: 2.7',
    'Programming Language :: Python :: 3.2',
    'Programming Language :: Python :: 3.3',
    'Programming Language :: Python :: 3.4',
    'Programming Language :: Python :: 3.5',
    'Topic :: Software Development :: Libraries :: Python Modules',
    'License :: OSI Approved :: MIT License'
    ]
)
  • name: es el nombre de tu paquete, si tienes pensado subirlo a PyPi comprueba antes que el nombre no exista.
  • long_description: descripción detallada de lo que hace el paquete, en texto plano o en formato reStructuredText (.rst). Si la documentación la tienes en otro formato prueba pandoc para convertila a .rst
  • license: es el texto con describe el tipo de licencia que has elegido.
  • url: la web del autor o en este caso donde reside el código
  • packages: son las dependencias a otros paquetes que necesita para funcionar. Puedes añadirlo manualmente o dejar que find_packages() busque las dependencias en tu código automáticamente por ti.
  • test_suite: opcional, nombre de la carpeta que contiene los tests unitarios. Para que todo funcione automáticamente se tienen que cumplir algunas convenciones de nomenclatura. (1) los archivos que contiene los test deben acabar en _text.py (2) dentro de cada archivo los test deben heredar de la clase unittest.TestCase (3) dentro cada clase los test a ejecutar debe empezar por def test_. También es importante que la carpeta /tests contenga un __init__.py. Para saber mas lee unittest

    ejemplo:

    /tests
    /tests/__init__.py
    /tests/textcase_test.py
    

    testcase_test.py

    import unittest
    
    class Test(unittest.TestCase):
    
        def test_upper(self):
            self.assertEqual('foo'.upper(), 'FOO')
    
  • classifiers: sirve para clasificar tu paquete, imprescindible si tienes pensado subir tu paquete a PyPi.

otros ficheros

  • LICENSE: contiene el texto de la licencia. Lo que hacemos es leer su contenido desde setup.py.
  • README.rst: contiene la descripción detallada de lo que hace el paquete. Al igual que el fichero de licencia, leemos el contenido desde setup.py
  • MANIFEST.in: setuptools incluye todos los archivos referenciados en setup.py – modulos, paquetes, readme.txt y todo lo que cuelga de /test. Si deseas incluir algún otro archivo, entonces debes incluir la referencia en el archivo manifest.in.

    ejemplo:

    include LICENSE
    include README.rst
    

Generar y distribuir tu paquete con PyPi

Esta chuleta (cheat sheet) resume los comandos básicos para preparar y distribuir tu paquete, así como los comandos básicos para instalar paquetes de terceros.

Cómo preparar y distribuir un paquete Python

Siempre y cuando tu paquete sea de código abierto, la manera oficial es subirlo a PyPi. De este modo tu aplicación o módulo estará disponible a través de la herramienta de administración pip que Python 2.7.9 y Python 3.4 incorporan. Si tu versión Python es anterior averigua cómo instalar pip.

Algunas de las ventajas de pip es que antes de instalar descarga todos los paquetes ahorrando problemas a mitad de instalación, tiene un mecanismo de desinstalación de paquetes y además ofrece soporte para instalar directamente de git, mercurial o bazaar.

Pasos

  1. Date de alta en PyPi
  2. Registra tu paquete en PyPi
    python setup.py register
    
  3. Subelo a PyPi

    Esto lo puedes hacer en un paso:

    python setup.py sdist upload
    

    o en dos pasos:

    python setup.py sdist
    twine upload dist/*
    

    La ventaja de twine es que utiliza seguridad en la capa de transporte (TLS) para proteger tu subida.

Otros comandos básicos

  • testear tu paquete:

    python setup.py test
    
  • lista de paquetes instalados:

    pip freeze
    
  • desinstalar un paquete:

    pip uninstall 
    

    Curiosamente, setuptools no provee un comando para desinstalar un paquete, aunque siempre puedes ir a /site-packages y borrar a mano las carpetas, si te atreves. Para obtener la lista de paquetes instalados:

    python setup.py install --record files.txt
    
  • instalar directamente de github

    pip install