IIC2233 / Syllabus-2023-1

75 stars 44 forks source link

Librerías permitidas, no permitidas y malas prácticas T3 #423

Open matiasmasjuan opened 1 year ago

matiasmasjuan commented 1 year ago

Para consultar sobre una librería deben responder esta issue con una pregunta de la siguiente forma:

¿Puedo usar la librería nombre_librería para hacer explicación_de_lo_que_quiero_hacer?

¡Recuerden especificar en su README qué librerías utilizan!


Librerías Permitidas

Librerías Prohibidas

☠️ Built-ins Prohibidos

El uso de alguna de las siguiente funciones es automáticamente un 1,0 sin discusión: 😭

Malas prácticas

El uso de las siguientes prácticas será considerado una mala práctica:

Éxito en la tarea, programadores avanzados! 🎲🃏

d-i-n-b commented 1 year ago

Hola, ¿Se pueden ocupar las librerías math y typing? Quiero ocupar math para crear dinámicamente un círculo de jugadores en la ventana de juego dependiendo de la cantidad de jugadores, y typing para agregar type hints a mis variables, atributos, funciones y métodos

matiasmasjuan commented 1 year ago

Hola @d-i-n-b !

Recuerda especificar siempre para qué quieres usar las librerías.

ooscarr commented 1 year ago

Hola, quiero usar la librería sys.argv para saber el puerto que envían como argumento en la consola py main.py 3333

matiasmasjuan commented 1 year ago

Hola @ooscarr !

, puedes usar sys.argv para recibir argumentos por consola.

Saludos!

d-i-n-b commented 1 year ago

Hola, ¿Se pueden ocupar las librerías math y typing? Quiero ocupar math para crear dinámicamente un círculo de jugadores en la ventana de juego dependiendo de la cantidad de jugadores, y typing para agregar type hints a mis variables, atributos, funciones y métodos

matiasmasjuan commented 1 year ago

Hola @d-i-n-b !

, puedes usar math u typing para lo que mencionas.

FelipeIGS commented 1 year ago

se puede ocupar beautifultable para el tema del log?

matiasmasjuan commented 1 year ago

Hola @FelipeIGS:

No, no puedes. Librerías como beatifultable, prettytable, o tabulate requieren ser instaladas para usarse, por lo que podrían generar problemas o errores al momento de la corrección.

Saludos!

StefanoBrunel commented 1 year ago

Hola, se puede ocupar la libreria "copy" ? para poder hacer copias de bytearrays que puedan modificarse sin modificar la original.

matiasmasjuan commented 1 year ago

Hola @StefanoBrunel : , si puedes usar la librería copy para eso. Saludos!

tomastrivino commented 1 year ago

Hola, se puede usar filter()? Lo quiero usar para obtener clientes cuyo ID no ha sido aún ocupado por un socket dentro de un diccionario de nombre self.clientes, que contiene 4 llaves inicialmente seteadas a "Undefined". I.e. usuarios_disponibles = list(filter(lambda x: self.clientes[x] == "Undefined", self.clientes)), que me retornará los usuarios que se encuentran disponibles para ser asignados a un socket, y, por ende, aceptar la conexión inmediatamente (y no dejarlo en lista de espera).

Gracias

tremendapithon commented 1 year ago

Hola buenas se puede usar subprocess para volver a cargar el programa otra vez, estuve viendo y parece que no es necesario instalarlo/

matiasmasjuan commented 1 year ago

Hola @tomastrivino: , puedes usar map, filtery reduce, junto a las funciones lambda:ok_hand: Hola @tremendapithon : No, no puedes usar subprocess. Esto debido a que no necesitan tener distintos subprocesos dentro de la ejecución del programa para acceder a distintos archivos/programas a la vez. Si bien lo mencionas para cargar nuevamente el programa, no debería ser necesario dado los requerimientos de la tarea, y podría dificultar la corrección.

tremendapithon commented 1 year ago

@matiasmasjuan En realidad, ni tanto, solo facilita que un cliente que no pueda acceder a la sala lo pueda volver a intentar, sin tener que abrir la terminar o volver a iniciar al main.py, en ese caso se podria justificar o no?

tremendapithon commented 1 year ago

tipo, cuando la sala se llena o existe una partida en curso, lo que hace es cerrar mi programa y volver a cargar otro desde el mismo programa cerrado, y en ese procedimiento el usuario se podra conectar cuando exista un cupo en el servidor.

tremendapithon commented 1 year ago

incluso lo puedo hacer con os.system()

matiasmasjuan commented 1 year ago

Ahora entiendo un poco más lo que intentas hacer. Si lo puedes realizar con os.system, entonces estaría bien. Recuerda mencionar en tu readme el proceso que haces para manejar este tipo de casos 👌.

Saludos!

FelipeIGS commented 1 year ago

Hola! se puede ocupar la funcion math para ocupar facilitar el mod matematico de la codificacion

tremendapithon commented 1 year ago

@matiasmasjuan Al final lo hice con os.system(), obtuve el mismo resultado y no me ha generado problemas.

matiasmasjuan commented 1 year ago

@FelipeIGS : , puedes usar math para eso.

NewtonCultist commented 1 year ago

@matiasmasjuan Hola!, se puede usar el Qtimer de pyqt.core para ayudar al cliente a cargar la informacion que recibe del servidor

Gracias :)

matiasmasjuan commented 1 year ago

Hola @TVMerlo : No sé si entendí muy bien tu pregunta, pero no encuentro mucho sentido de tener que usar Qtimers para cargar la información del cliente que recibe del servidor, a menos que quisieras implementar el bonus del turno con tiempo. Dado que los mensajes entre cliente y servidor se transmiten de forma casi instantánea, sería innecesario tener que implementar timers para enviar la información, y eso solo entorpecería y haría más lento la corrección, debido a la demora en actualizar la interfaz. Sin embargo, si planeas utilizarlos porque tienes problemas en que se mezcla la información, te recomendaría usar locks al momento de recibir o enviar dicha información 👀

Saludos!

BenzoylMorexide commented 1 year ago

Hola @matiasmasjuan. ¿Es posible ocupar la librería select para ocuparlo de tal forma que pueda cerrar el listening del server pasado cierto límite de sockets aceptados? Dejo un snippet:

while True:
    readable, writable, exceptional = select.select(conns, [], [])
    if sock in readable: # new connection on the listening socket
        conn, caddr = sock.accept()
        conns.add(conn)
        if len(conns) > LIMIT: # ">" because "sock" is also in there
            conns.remove(sock)
            sock.close()
    else: # reading from an established connection
        for c in readable:
            buf = c.recv(4096)
            if not buf:
                conns.remove(c)
                sock = get_listening_socket()
                conns.add(sock)
            else:
                print("received: %s" % buf) 
matiasmasjuan commented 1 year ago

Hola @BenzoylMorexide !

No, no puedes utilizar select para esta tarea. Esto debido a dos razones. La primera se debe a que en esta tarea no hay que limitar la cantidad o límite de sockets que puede aceptar el servidor, sino que este debe aceptar todas las conexiones posibles y redirige a los clientes a la sala de espera. En ese sentido, hacer uso de select para lo que mencionas estaría contradiciendo el enunciado y conllevaría un descuento según la distribución de puntajes.

En segundo lugar, no es necesario requerir de una librería para lograr esto. Simplemente se podría cerrar el listening del server pasado un límite de sockets aceptados.

PD: puedes usar

```python # todo tu codigo ```

Para hacer snippet bonitos.

Algo del siguiente estilo:

while True:
    readable, writable, exceptional = select.select(conns, [], [])
    if sock in readable: # new connection on the listening socket
        conn, caddr = sock.accept()
        conns.add(conn)
        if len(conns) > LIMIT: # ">" because "sock" is also in there
            conns.remove(sock)
            sock.close()
# etc

Saludos!

c4ebt commented 1 year ago

Hola! Se puede usar la función copy de la librería copy para crear copias de listas/diccionarios y poder modificarlas sin modificar la original?

Se que ya se permitió el uso de copy arriba, pero se preguntó específicamente para bytearrays y me han bajado por no preguntar cosas que consideré obvias ._. así que decidí preguntar igual.

matiasmasjuan commented 1 year ago

Hola @c4ebt : , puedes usar copy para eso. Saludos!

StefanoBrunel commented 1 year ago

Hola! se puede ocupar exec()?? quiero ocuparlo para poder mostrar un mensaje popup, el cual lo estaba implementando con QMessageBox(). el uso seria : QMessageBox().exec()

matiasmasjuan commented 1 year ago

Hola @StefanoBrunel : , puedes usar exec_() para eso. Recuerda que ese método no tiene nada que ver con built-in prohibido exec.

Saludos!