Introducción a ASP.NET MVC 5

 Introducción a ASP.NET MVC 5

Microsoft ha lanzado Visual Studio 2013 Preview. Hay muchas nuevas características introducidas con esta versión de Visual Studio. Una de ellas es MVC 5, es la última versión de MVC. Me gustaría contarles algo sobre el MVC. MVC es un patrón arquitectónico que separa una aplicación en tres partes principales llamadas Modelo, Vista y Controlador. MVC es una forma reconocida de desarrollar aplicaciones

Hay algunas características importantes en MVC 5 como se indica a continuación:

  1. Un ASP.NET
  2. Identidad ASP.NET
  3. Bootstrap
  4. Filtros de autenticación
  5. Anulación de filtros

Un ASP.NET
Como sabes, hay muchas plantillas de proyectos disponibles para desarrollar aplicaciones web. Una de ellas es el proyecto MVC de proyecto MVC. Se coordina perfectamente con la nueva experiencia One ASP.NET. Utilizando el asistente de creación de proyectos One ASP.NET puedes personalizar tu aplicación MVC y también puedes configurar tu autenticación. Las aplicaciones MVC son ahora aplicaciones web estándar y no utilizan su propio proyecto GUID (Globally Unique Identifier). Esto le ayuda a mezclar y combinar varias tecnologías de su aplicación preferida. Cualquier desarrollador amaría ASP.NET ahora porque One ASP.NET hace las cosas muy fáciles y útiles en ASP.NET.

Identidad ASP.NET
Hay una nueva característica utilizada para construir aplicaciones web ASP.NET llamada ASP.NET Identity. Ahora, cuando usted crear una aplicación utilizando una plantilla de proyecto MVC, puede utilizar un ASP.NET Identity para la autenticación y la de identidad. Le ayuda a integrar los datos del perfil individual del usuario con los datos de la aplicación. También puede almacenar los datos en la base de datos de SQL Server o en otro almacén de persistencia.

Hay las siguientes dos características principales que podemos utilizar en él:
  • Autenticación basada en reclamaciones
ASP.NET Identity admite la autenticación basada en reclamaciones en la que la identidad de cualquier usuario se define como un conjunto de reclamaciones de un emisor de confianza. El usuario necesita ser autenticado con sus credenciales de acceso y puede iniciar sesión con sus proveedores de identidad social, como Facebook, Google, Twitter o pueden iniciar sesión con una cuenta de organización como Windows Azure Active Directory.
  • OAuth 2.0
Si desea autorizar las solicitudes de las aplicaciones de los clientes a su API web, ahora se puede hacer por OAuth 2.0 bearer tokens. Las autorizaciones de los clientes también se realizan mediante servidores de autorización de la organización como Windows Azure Active Directory o mediante una autorización personalizada.
  • Uso de WAAD y WSAD 
Ahora puede crear su proyecto ASP.NET con las ventajas de Windows Azure Active Directory (WAAD) y Windows Server Active Directory (WSAD) para la autenticación

  • Filtros de autenticación
Como el nombre de Filtros de Autenticación indica, es un tipo de filtro en ASP.NET MVC que se ejecuta antes de los filtros de autorización 
en el pipeline de ASP.NET MVC y también permite determinar la lógica de autenticación por acción, por controlador o globalmente para todos los controladores. También puede añadir desafíos de autenticación en respuesta a solicitudes no autorizadas.
  • Anulación de filtros
Los filtros de anulación determinan un conjunto de tipos de filtro que no deben ejecutarse para un ámbito determinado. Con esto se puede permitir configuración de filtros que se aplican globalmente pero luego excluir ciertos filtros globales para que no se apliquen a acciones o controladores.

Error: Failed to create Anaconda menus, Abort Retry Ignore

nombre error:  Failed to create Anaconda menus, Abort Retry Ignore

entrar a:  https://repo.anaconda.com/archive/


Bajar algunas de estas opciones según SO.

Anaconda2-5.3.1-Linux-x86.sh507.6M2018-11-19 13:37:355685ac1d4a14c4c254cbafc612c77e77
Anaconda2-5.3.1-Linux-x86_64.sh617.8M2018-11-19 13:37:314da47b83b1eeac1ca8df0a43f6f580c8
Anaconda2-5.3.1-MacOSX-x86_64.pkg628.4M2018-11-19 13:37:38d6139f371aa6cf81c3f002ecdd09b748
Anaconda2-5.3.1-MacOSX-x86_64.sh539.0M2018-11-19 13:37:43559606f0dda021daa1afd612b2e3e37c
Anaconda2-5.3.1-Windows-x86.exe458.1M2018-11-19 13:38:327286587bcfb6a5a164d70fe02c1968d5
Anaconda2-5.3.1-Windows-x86_64.exe580.1M2018-11-19 13:37:47ff29ffcd1f767cde91bab71110c00294

01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


Error 0x800B010C - Tratando de instalar SQL Server management studio

Paso 0: Descargar e instalar como administrador el siguiente programa:

http://media.kaspersky.com/utilities/CorporateUtilities/rootsupd.zip 


Paso 1:Ejecutar el siguiente comando

 c: \rootsupd.exe /c /t:C:\rootsupd


Paso 2:Usar el siguiente comando para instalar el certificado necesario

c: \rootsupd.exe authroots.sst "(NOMBRE DE DE LA CERTIFICACION SIN COMILLAS)"


Paso 3(OPCIONAL):Comando para eliminar certificado 

c: \rootsupd.exe authroots.sst


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


TDD o Test-Driven Development (desarrollo dirigido por tests)

 TDD o Test-Driven Development (desarrollo dirigido por tests) es una práctica de programación que consiste en escribir primero las pruebas (generalmente unitarias), después escribir el código fuente que pase la prueba satisfactoriamente y, por último, refactorizar el código escrito.


Con esta práctica se consigue entre otras cosas: un código más robusto, más seguro, más mantenible y una mayor rapidez en el desarrollo.



fuente de interes: https://www.paradigmadigital.com/dev/tdd-como-metodologia-de-diseno-de-software/




01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


Diferencias MVC y WebForms

MVC

Es un patrón arquitectural que describe una forma de desarrollar aplicaciones software separando los componentes en tres grupos (o capas):


El Modelo que contiene una representación de los datos que maneja el sistema, su lógica de negocio, y sus mecanismos de persistencia.


La Vista, o interfaz de usuario, que compone la información que se envía al cliente y los mecanismos interacción con éste.


El Controlador, que actúa como intermediario entre el Modelo y la Vista, gestionando el flujo de información entre ellos y las transformaciones para adaptar los datos a las necesidades de cada uno.


MVC son las siglas de Modelo-Vista-Controlador, y se trata de un modelo muy maduro y que ha demostrado su validez a lo largo de los años en todo tipo de aplicaciones, y sobre multitud de lenguajes y plataformas de desarrollo.


Ventajas MVC

· Clara separación de responsabilidades entre interfaz, lógica de negocio y de control, que además provoca parte de las ventajas siguientes.


· Produce un código más limpio y estructurado, independizando totalmente la interfaz de la lógica de navegación y, por supuesto, de la de negocio.


· Facilidad para la realización de pruebas unitarias de los componentes, así como de aplicar desarrollo guiado por pruebas (TDD) y técnicas avanzadas de mocking.


· Simplicidad en el desarrollo y mantenimiento de los sistemas: el conjunto de convenciones en cuanto a la estructura de proyectos y de nombrado y disposición de elementos facilita el desarrollo una vez son asimiladas.


· Reutilización de los componentes.


· Facilidad para desarrollar prototipos rápidos.


· Sencillez para crear distintas representaciones de los mismos datos.


· Los sistemas son muy eficientes, y a la postre más escalables.


· Fácilmente se puede utilizar DI (dependency injection): es una técnica que permite realizar aplicaciones cuyos componentes se encuentran muy desacoplados entre sí, lo que flexibiliza el diseño y, por ejemplo, facilita la realización de pruebas unitarias.


· Se trata de un patrón muy fácilmente implementable y que nos puede aportar muchos beneficios.


· Integración sencilla del framework MVC con soluciones basadas en cliente, como jQuery y su interminable colección de plugins, en los que podemos encontrar elementos de interfaz para prácticamente cualquier necesidad.


· Las direcciones amigables, es un beneficio directo del uso del framework de Microsoft, estrictamente hablando no es mérito de la plataforma MVC, sino del juego de clases presentes en el espacio de nombres System.Web.Routing, incluidas en .NET , con las ventajas que ello conlleva (SEO, REST, claridad en direcciones, etc.).


· La ausencia de automatismos y persistencia de estado aligera en gran medida el peso y complejidad de las páginas, lo cual redunda en el rendimiento del sistema.


· Existen multitud de frameworks MVC para ASP.Net, como MonoRail, Maverick.Net, FubuMVC y muchos otros.


· Es un framework con licencia MS-PL (Microsoft Public License), por tanto es libre, y permite su uso en aplicaciones comerciales.


· Flexibilidad de la arquitectura de ASP.NET MVC framework en la utilización de motores de vistas distintos al estándar.


Inconvenientes MVC

· Tener que ceñirse a una estructura predefinida, lo que a veces puede incrementar la complejidad del proyecto. De hecho, hay problemas que son más difíciles de resolver.


· Al principio cuesta cierto esfuerzo adaptarse a esta filosofía, sobre todo a desarrolladores acostumbrados a otros modelos más cercanos al escritorio, como Winforms.


· La distribución de componentes obliga a crear y mantener un mayor número de ficheros.


· En general requiere de más código que WebForms.


· Existe un número ingente de componentes y controles reutilizables disponibles para Webforms. Dado que no son compatibles con el framework MVC, se parte de una situación de clara desventaja frente a estos, aunque esto está ya cambiando y seguro que con el tiempo mejorará.


· Requiere un conocimiento más profundo del entorno web y sus tecnologías subyacentes, puesto que a la vez que ofrece un control mucho más riguroso sobre los datos que se envían y reciben desde el cliente, exige una mayor responsabilidad por parte del desarrollador, ya que deberá encargarse él mismo de mantener el estado entre peticiones, maquetar las vistas, crear las hojas de estilo apropiadas, e incluso los scripts.


Ventajas WebForms

· La tecnología de formularios web permite el desarrollo rápido de aplicaciones (RAD) a través de diseñadores visuales con los que es posible componer una página compleja y definir el comportamiento del interfaz a golpe de ratón, puesto que el framework se encarga de realizar parte del trabajo duro, como el mantenimiento del estado entre peticiones, convertir propiedades de controles en código HTML y CSS, o incluso generar scripts que realicen determinadas tareas en cliente.


· Es posible crear aplicaciones para Internet sin tener apenas idea de las particularidades inherentes al desarrollo web, lo que permite que muchos programadores procedentes del mundo del escritorio puedan ser productivos muy rápidamente, aunque sea a costa de generar páginas mucho más pesadas y con un código de marcado complejo.


· Si el equipo de desarrollo tiene ya experiencia creando aplicaciones con WinForms y no posee grandes conocimientos sobre programación web de más bajo nivel ni experiencia previa trabajando con el patrón MVC, esta tecnología va a permitir una mayor productividad del equipo.


· La última versión del framework ya permite direcciones amigables.


Inconvenientes WebForms

· Problemas en la separación de código e interfaz.


· Dificultad para realización de pruebas unitarias.


· Podemos decir, que todas las ventajas de MVC, no se producen en WebForms, con todos los inconvenientes que esto conlleva.


· Puede producir comportamientos extraños cuando intentamos intervenir en el ciclo de vida de las páginas, por ejemplo para la carga y descarga de controles dinámicos.


· No hay control sobre el código HTML generado si se utilizan controles de servidor, por lo que a veces, es difícil conseguir el resultado deseado.


· Las páginas son mucho más pesadas debido al viewstate.


Principales diferencias

MVC es radicalmente distinto al uso de formularios web, algunas de las principales características que destacaría son:


· No existe el postback.


· No hay viewstate.


· No hay eventos.


· El diseñador visual deja de tener sentido.


· No hay controles de servidor, al menos en la forma en que los conocemos en WebForms.


· No es necesario utilizar los archivos code-behind de las páginas .aspx.


· Las páginas no siguen complejos ciclos de vida, el proceso de una petición es infinitamente más simple que en WebForms.


· Control total del código de marcado generado.


· Podemos sustituir componentes internos del framework para adaptarlo a nuestras preferencias.


· Se integra con Ajax de forma natural, sin artificios como los UpdatePanels y similares.


· Favorece la introducción de buenas prácticas como la inversión de control o inyección de dependencias.


· Diferencias entre code-behind y MVC controllers: aparentemente hay similitudes entre ambos, ya que estos contienen la lógica de la aplicación, sin embargo la página aspx no se puede separar del code-behind, ambas trabajan unidas para implementar la lógica de la aplicación y la lógica de presentación, pero en MVC es diferente, hay una clara separación entre la vista (UI) y los controladores, que son una representación abstracta de la interacción con el usuario. Esto permite un código más simple, por lo que la aplicación es más fácil de entender y mantener.


fuente: https://pdcuevas.wordpress.com/2012/05/10/diferencias-mvc-y-webforms/


Conclusion:

Si se cuenta con poco personal y experiencia es conveniente arrancar con WebForm pero luego MVC presenta un mejor modelo a seguir para trabajos grandes y organizados.



01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN



EXISTS

para averiguar si existe un registro 

select EXISTS (SELECT titulo from TablaProducto where titulo='adwd');

entrega 1 si existe o 0 si no existe


Extraer un registro si existe

SELECT titulo from TablaProducto WHERE titulo='awd' and EXISTS(SELECT titulo from TablaProducto where titulo='awd');

entrega el registro, para este caso 'awd' si existe



ejemplos prácticos usando pyqt5

luego de hacer el cursor con su respectiva conexión

cursor.execute("SELECT * FROM db_auto WHERE id_auto=(?) and EXISTS (SELECT * FROM db_auto WHERE id_auto=(?))",
(idBuscarAuto, idBuscarAuto))

luego de hacer el cursor con su respectiva conexión


Otro ejemplo...

def YaExiste(titulo):
conn = conexion()
cursor = conn.cursor()
return cursor.execute('SELECT EXISTS (SELECT titulo from TablaProducto WHERE titulo=(?));', (titulo,)).fetchall()[0][0]

importante usar  fetchall()[0][0] para limpiar el dato

 01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

usos de QDialog - ejemplo útil

import sys

from PyQt5.QtWidgets import QApplication, QDialogButtonBox, QLabel, QMainWindow, QPushButton, QDialog, QVBoxLayout


class MainWindow(QMainWindow):
def __init__(self):
super().__init__()

button = QPushButton("clic para un cuadro de dialogo")
button.clicked.connect(self.button_clicked)
self.setCentralWidget(button)

def button_clicked(self, s):
print("click", s)

dlg = NuevoDialog()
if dlg.exec():
print("Aceptar!")
else:
print("Cancelar!")

class NuevoDialog(QDialog):
def __init__(self):
super().__init__()

QBtn = QDialogButtonBox.Ok | QDialogButtonBox.Cancel

self.buttonBox = QDialogButtonBox(QBtn)
self.buttonBox.accepted.connect(self.accept) #funciones por defecto del QDialog
self.buttonBox.rejected.connect(self.reject) #funciones por defecto del QDialog

self.layout = QVBoxLayout()
message = QLabel("Cuadro de dialogo")
self.layout.addWidget(message)
self.layout.addWidget(self.buttonBox)
self.setLayout(self.layout)
app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec() 

 01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

sql error sql logic error or missing database

si este problema aparece sobre una tabla al hacer un insert, puede que se trate de los parametros de los campos, mas especificamente en el siguiente ejemplo...

CREATE TABLE IF NOT EXISTS[TablaConfiguracion] (
[idConfig] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[primeraVez] VARCHAR(4) NOT NULL,
[idUsuarioActual] INTEGER NOT NULL,
FOREIGN KEY(idUsuarioActual) REFERENCES TablaCajeros(idCajero));

para esta tabla se arreglo el problema sacando el NOT en el segundo y tercer campo.

 01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


PyQt5 - datos sobre ingreso de datos.

Datos a tener en cuenta en la forma de ingresar datos...


def insertar_base_empleado(conn, dato):

    datoNuevo = [dato[0], dato[1], dato[2], dato[3], "$%.2f" % float(list(dato).pop(4))]

    cursor = conn.cursor()

    cursor.execute("INSERT INTO db_empleado(id_empleado,nombre,apellido,domicilio,sueldo) VALUES (?,?,?,?,?)",

                   datoNuevo)

    conn.commit()



def borrar_base_empleado(conn, idBorrar):

    if idBorrar != '':

        cursor = conn.cursor()

        cursor.execute("DELETE FROM db_empleado WHERE id_empleado=(?);", (idBorrar,))

        cursor.execute("UPDATE db_empleado SET id_empleado=id_empleado-1 WHERE id_empleado>(?);", (idBorrar,))

        conn.commit()

    else:

        print("No se a borrado ningun registro")

nothing to show

 Pycharm no realiza sugerencias del codigo.

Solucion: Salir del proyecto, borrar .idea del archivo del programa  y volver a abrir el proyecto, ahora podrá ajustar el interprete abajo a la derecha de la pantalla.



01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

metodos python y ejemplos

Métodos 















































import random


def generar_licencia():
cantidad = 5
lista = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
'r', 's', 't', 'u', 'v', 'k', 'x', 'y', 'z']
for i in range(cantidad):
codigo = ''
variable = random.choices(lista, None, k=16)
for i in variable:
try:
codigo += i.upper()
except:
codigo += i
print(codigo)


if __name__ == '__main__':
generar_licencia()
terminal>
YA0Y6EIXH7QPAZG6
KHZSNOTMKB8VJ259
B772SCL3UEINVPCK
DSDZGG8IBTV8J7KK
UIM5BQPQT63036UN







webs

 asd

SQLite3 .help

 (base) C:\Users\Gaston>SQLite3

SQLite version 3.35.4 2021-04-02 15:20:15

Enter ".help" for usage hints.

Connected to a transient in-memory database.

Use ".open FILENAME" to reopen on a persistent database.

sqlite> .help

.auth ON|OFF             Mostrar las devoluciones de llamada del autorizador

.backup ?DB? FILE        Copia de seguridad de la base de datos (por defecto "principal") a FILE

.bail on|off             Se detiene después de encontrar un error.  Por defecto OFF

.binary on|off           Activa o desactiva la salida binaria.  Por defecto OFF

.cd DIRECTORY            Cambiar el directorio de trabajo a DIRECTORY

.changes on|off          Mostrar el número de filas modificadas por SQL

.check GLOB              Fallo si la salida desde .testcase no coincide

.clone NEWDB             Clonar datos en NEWDB desde la base de datos existente

.databases               Lista de nombres y archivos de las bases de datos adjuntas

.dbconfig ?op? ?val?     Listar o cambiar las opciones de sqlite3_db_config()

.dbinfo ?DB?             Mostrar información de estado sobre la base de datos

.dump ?OBJECTS?          Renderizar el contenido de la base de datos como SQL

.echo on|off             Activar o desactivar el eco de los comandos

.eqp on|off|full|...     Habilitar o deshabilitar el EXPLAIN QUERY PLAN automático

.excel                   Mostrar la salida del siguiente comando en la hoja de cálculo

.exit ?CODE?             Salir de este programa con el código de retorno CODE

.expert                  EXPERIMENTAL. Sugerir índices para las consultas

.explain ?on|off|auto?   Cambia el modo de formato de EXPLAIN.  Por defecto: auto

.filectrl CMD ...        Ejecutar varias operaciones sqlite3_file_control()

.fullschema ?--indent?   Mostrar el esquema y el contenido de las tablas sqlite_stat

.headers on|off          Activar o desactivar la visualización de las cabeceras

.help ?-all? ?PATTERN?   Show help text for PATTERN

.import FILE TABLE       Importar datos de FILE a TABLE

.imposter INDEX TABLE    Crear tabla impostora TABLE sobre índice INDEX

.indexes ?TABLE?         Mostrar los nombres de los índices

.limit ?LIMIT? ?VAL?     Mostrar o cambiar el valor de un SQLITE_LIMIT

.lint OPTIONS            Informar de posibles problemas con el esquema.

.load FILE ?ENTRY?       Cargar una biblioteca de extensión

.log FILE|off            Activa o desactiva el registro.  FILE puede ser stderr/stdout

.mode MODE ?TABLE?       Establecer el modo de salida

.nullvalue STRING        Utilizar STRING en lugar de valores NULL

.once ?OPTIONS? ?FILE?   Salida para el siguiente comando SQL sólo a FILE

.open ?OPTIONS? ?FILE?   Cerrar la base de datos existente y reabrir FILE

.output ?FILE?           Enviar la salida a FILE o a stdout si se omite FILE

.parameter CMD ...       Gestionar los enlaces de los parámetros SQL

.print STRING...         Imprimir literal STRING

.progress N              Invocar el manejador de progreso después de cada N opcodes

.prompt MAIN CONTINUE    Sustituir las indicaciones estándar

.quit                    Salir de este programa

.read FILE               Leer la entrada del FILE

.restore ?DB? FILE       Restaurar el contenido de la BD (por defecto "main") desde FILE

.save FILE               Escribir la base de datos en memoria en FILE

.scanstats on|off        Activar o desactivar las métricas de sqlite3_stmt_scanstatus()

.schema ?PATTERN?        Mostrar las sentencias CREATE que coincidan con PATTERN

.selftest ?OPTIONS?      Ejecutar las pruebas definidas en la tabla SELFTEST

.separator COL ?ROW?     Cambiar los separadores de columnas y filas

.sha3sum ...             Calcular un hash SHA3 del contenido de la base de datos

.shell CMD ARGS...       Ejecutar CMD ARGS... en un shell del sistema

.show                    Mostrar los valores actuales de varios ajustes

.stats ?ARG?             Mostrar estadísticas o activar o desactivar las estadísticas

.system CMD ARGS...      Ejecutar CMD ARGS... en un shell del sistema

.tables ?TABLE?          Lista de nombres de tablas que coinciden con el patrón LIKE TABLE

.testcase NAME           Comienza a redirigir la salida a 'testcase-out.txt'

.testctrl CMD ...        Ejecutar varias operaciones de sqlite3_test_control()

.timeout MS              Intenta abrir las tablas bloqueadas para MS milisegundos

.timer on|off            Activar o desactivar el temporizador SQL

.trace ?OPTIONS?         Salida de cada sentencia SQL a medida que se ejecuta

.vfsinfo ?AUX?           Información sobre el VFS de nivel superior

.vfslist                 Lista de todos los VFS disponibles

.vfsname ?AUX?           Imprime el nombre de la pila VFS

.width NUM1 NUM2 ...     Establecer la anchura mínima de las columnas para la salida de las mismas

sqlite>


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

Clave foránea en SQLite3

SQLite3

SQLite version 3.35.4 2021-04-02 15:20:15

Enter ".help" for usage hints.

Connected to a transient in-memory database.

Use ".open FILENAME" to reopen on a persistent database.


sqlite> PRAGMA foreign_keys = ON


sqlite> CREATE TABLE IF NOT EXISTS "Grupo_Proveedor" (

   ...>         id_grupo_proveedor INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,

   ...>         nombre_grupo_proveedor VARCHAR(55)  NULL);


sqlite> CREATE TABLE IF NOT EXISTS "Proveedor" (

   ...>         id_proveedor INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,

   ...>         nombre_proveedor VARCHAR(55)  NOT NULL,

   ...>         id_grupo_proveedor INTEGER NOT NULL,

   ...>             FOREIGN KEY(id_grupo_proveedor) REFERENCES Grupo_Proveedor(id_grupo_proveedor));


sqlite> .table

Grupo_Proveedor  Proveedor


sqlite> insert into Grupo_proveedor VALUES (1,'panaderia');

sqlite> insert into Grupo_proveedor VALUES (2,'ferreteria');


sqlite> INSERT INTO Proveedor VALUES (1,'jacinto pancito',1);


sqlite> SELECT Proveedor.id_proveedor,

Proveedor.nombre_proveedor, 

Grupo_Proveedor.nombre_grupo_proveedor 

FROM Proveedor INNER JOIN Grupo_Proveedor 

ON Proveedor.id_grupo_proveedor == Grupo_Proveedor.id_grupo_proveedor;

1|jacinto pancito|panaderia


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN






LISTA DE USER AGENTS

 WINDOWS + GOOGLE CHROME


Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36


MAC SAFARI 11.1

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15


WINDOWS INTERNET EXPLORER

Mozilla/5.0 CK={} (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko


LINUX CHROME 44

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36


ANDROID CHROME 70

Mozilla/5.0 (Linux; Android 7.1.2; AFTMM Build/NS6265; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN

TypeError: 'Rule' object is not iterable

Este error ocurre porque falta una coma en el parametro rule de de la clase que hereda CrawlSpider

así se puede encontrar

rules = ( 

Rule(
LinkExtractor(
allow = r'/Hotel_Review'
), follow=True
, callback= "parce_hotel"
)
)


así se debe ver

rules = ( 

Rule(
LinkExtractor(
allow = r'/Hotel_Review'
), follow=True
, callback= "parce_hotel"
),
)

sino no lo toma como un objeto iterable

pequeños detalles, grandes errores


01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


QT Designer - aplicacion comentada PyQt5

Link al repositorio acá 

import sys
from PyQt5 import uic, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication


class MainWindow(QMainWindow): #nota7: cuando llama a la clase, viene por aca

def __init__(self): #nota8: el __init__ de initialized, es el codigo que SIEMPRE se ejecuta, el def ventanaNueva no se ejecuta porque esta fuera de aca, aca se conectan botones, los eventos que vayan a pasar, las restricciones, etc...
super().__init__() #superposiciona el init, siempre va.
uic.loadUi('gui_1.ui', self) #aca se carga la gui
self.pushButton.clicked.connect(self.ventanaNueva) #aca conecta el boton de nombre pushButton que nos da el designer y lo conectamos a la funcion ventanaNueva

def ventanaNueva(self):
gui2.show() #y aca muestra la ventana y nada mas
#gui2.showMaximized() #esto esta para que prueven cambiando y viendo como cambia
#gui2.showMinimized() #esto esta para que prueven cambiando y viendo como cambia

class Window2(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('gui_2.ui', self)

if __name__ == '__main__': #nota1: esto siempre va, es para que el programa siempre ejecute esta parte
app = QApplication(sys.argv) #Nota2: aca crea un objeto para hacer las aplicaciones
gui = MainWindow() #Nota3: todas las ventanas tendran su armado mediante esto, un objeto del tipo variable=Clase_del_objeto()
gui2= Window2() #Nota4: para la gui2
gui.show() #Nota5: aca muestra la gui principal la main, como ya la tiene armada(en Nota3) ahora la muestra mediante el metodo .show(), hay varias maneras, showMaximiced() la muestra maximixada por ej
sys.exit(app.exec_()) #Nota6: esto es para que quede abierto, sino se cierra el programa, queda ejecutandose



Haciendo el ejecutable

asta acá puedes hacer tu programa y ejecutarlo a medida que vas modificando y agregando interfaces pero a la hora de hacer el ejecutable es necesario hacer cambios...

al momento de usar auto-py-to-exe, muy práctico a la hora de exportar me encontré con algunos problemas, pero recurrí a usar pyuic5 para transformar los .ui a .py y así usar todos los .py en el programa de auto-py-to-exe (donde encontrarlo

hay que instalar las librerías necesarias

pip install pyqt5-sip
pip install pyqt5

con la terminal abierta en la ubicación donde estan los .ui se ingresa el siguiente codigo, usando pycharm puedes usar ALT+F12 y se abre abajo.

pyuic5 -x gui_1.ui -o gui_1_ui.py

la forma es: pyuic5 -x <archivo .ui> -o <nuevo_archivo .py>
el nombre de archivo.ui pasa a archivo_ui.py

para nuestro programa usamos...

>pyuic5 -x gui_1.ui -o gui_1_ui.py

>pyuic5 -x gui_2.ui -o gui_2_ui.py

Esto amerita unos cambios en el codigo...

import sys
from PyQt5 import uic, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtWidgets

#####
from gui_1_ui import * # NUEVO
from gui_2_ui import * # NUEVO


#####

# class MainWindow(QMainWindow): #nota7: cuando llama a la clase, viene por aca
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): # NUEVO

def __init__(
self): # nota8: el __init__ de initialized, es el codigo que SIEMPRE se ejecuta, el def ventanaNueva no se ejecuta porque esta fuera de aca, aca se conectan botones, los eventos que vayan a pasar, las restricciones, etc...
# super().__init__() # superposiciona el init, siempre va.
# uic.loadUi('gui_1.ui', self) # aca se carga la gui
QtWidgets.QMainWindow.__init__(self) # NUEVO
self.setupUi(self) # NUEVO
self.pushButton.clicked.connect(
self.ventanaNueva) # aca conecta el boton de nombre pushButton que nos da el designer y lo conectamos a la funcion ventanaNueva

def ventanaNueva(self):
gui2.show() # y aca muestra la ventana y nada mas
# gui2.showMaximized() #esto esta para que prueven cambiando y viendo como cambia
# gui2.showMinimized() #esto esta para que prueven cambiando y viendo como cambia


# class Window2(QMainWindow):
class Window2(QtWidgets.QWidget, Ui_Form): # NUEVO
def __init__(self):
QtWidgets.QMainWindow.__init__(self) # NUEVO
self.setupUi(self) # NUEVO
# super().__init__()
# uic.loadUi('gui_2.ui', self)


# if __name__ == '__main__': # nota1: esto siempre va, es para que el programa siempre ejecute esta parte
# app = QApplication(sys.argv) # Nota2: aca crea un objeto para hacer las aplicaciones
# gui = MainWindow() # Nota3: todas las ventanas tendran su armado mediante esto, un objeto del tipo variable=Clase_del_objeto()
# gui2 = Window2() # Nota4: para la gui2
# gui.show() # Nota5: aca muestra la gui principal la main, como ya la tiene armada(en Nota3) ahora la muestra mediante el metodo .show(), hay varias maneras, showMaximiced() la muestra maximixada por ej
# sys.exit(app.exec_()) # Nota6: esto es para que quede abierto, sino se cierra el programa, queda ejecutandose

app = QApplication([]) # NUEVO
gui = MainWindow() # NUEVO
gui2 = Window2() # NUEVO
gui.show() # NUEVO
app.exec_() # NUEVO

luego en una terminal de anaconda, ejecutamos Auto-py-to-exe


en Additional Files, agregamos los .py nuevos



pyinstaller --noconfirm --onefile --console --name "ejemplo4" --add-data "C:/Users/Gaston/PycharmProjects/ejemplo/gui_1_ui.py;." --add-data "C:/Users/Gaston/PycharmProjects/ejemplo/gui_2_ui.py;."  "C:/Users/Gaston/PycharmProjects/ejemplo/main.py"

el programa funciona pero se habre una terminal, con cambiarlo en  Console Window es suficiente


pyinstaller --noconfirm --onefile --windowed --name "ejemplo5" --add-data "C:/Users/Gaston/PycharmProjects/ejemplo/gui_1_ui.py;." --add-data "C:/Users/Gaston/PycharmProjects/ejemplo/gui_2_ui.py;."  "C:/Users/Gaston/PycharmProjects/ejemplo/main.py"


el codigo limpio queda asi...

import sys
from PyQt5 import uic, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtWidgets
from gui_1_ui import *
from gui_2_ui import *


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

def __init__(
self):
QtWidgets.QMainWindow.__init__(self)
self.setupUi(self)
self.pushButton.clicked.connect(
self.ventanaNueva)

def ventanaNueva(self):
gui2.show()


class Window2(QtWidgets.QWidget, Ui_Form):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setupUi(self)


app = QApplication([])
gui = MainWindow()
gui2 = Window2()
gui.show()
app.exec_()

01100110 01101001 01101110 00100000 01100100 01100101 00100000 01100011 01101111 01100100 01101001 01100111 01101111

RETURN


INDICE