torneo hackaton Code 2022 (delicious edition)

96 messages, 4 pages:  1 23 4 ↖ Go back to topic list

Score: +0

61. Rayo,

Pancho.

¿Qué es pancho?

Pancho, es... es, bueno. Es Muchas cosas. Pero lo que nos interesa ahora, es su funcionalidad. De este script, claro está.
Desarrollado en autohotkey (lenguaje de scriptinn) Pancho es una funcionalidad estilo agenda que nos permite:

  • Editar un archivo txt.
  • Cargar un archivo txt.
  • Añadirle una línea al archivo txt.
  • Si quieres hacer un diario? Olvídate de colocar la fecha de forma manual, este script ya lo hace por ti.
    Cuenta con atajos de teclado, es open zource y tiene una documentación completa sobre su funcionamiento y ejecución.
    Aquí el repo de Pancho
    Aquí última versión
    Más software

¡Vamos pancho!

Score: +0

62. Franco-Escamilla ,

Holi, acá yo.
El... ¿Programa? Si se puede llamar así consiste en algo simple:
En la página principal (index) hay un pequeño formulario en el que se puede elegir un archivo mp3 para subir.
Tiene que ser mp3 y no pesar más de 100 mb sí o sí, pues si no lo es el servidor devuelve un error.
Esto es para evitar algunos problemas tanto de seguridad como de almacenamiento, en el caso de que se tenga poco espacio disponible.
Si el archivo se logró subir exitosamente el servidor devolverá un mensaje diciendo aquello y un link en el cual podrás ver en una tabla todos los archivos subidos, donde se mostrará lo siguiente:

  1. El nombre del archivo.
  2. Un enlace a él para reproducirlo.
  3. Para más info, el código está aquí:
    https://github.com/Reyes2005/Reyes-Productions

Score: +0

63. el_pichon,

Me ha gustado mucho lo que he visto, pero también hay cositas que me llaman la atención y que voy a compartir con vosotros. Conste que ya no podéis hacer cambios, y que si los hacéis quedan en los commits, cuya fecha será posterior a la de este mensaje, así que nada de travesuras.
Rayo, una pregunta: ¿qué sucede si se apilan las llamadas a la función crear tras cometer muchísimos errores, uno detrás de otro? ¿Es una llamada recursiva, o ya se encarga el propio lenguaje de que no sea así?
Samael: te he visto empezar estupendamente bien, pero no usas etiquetas th en las cabeceras de la tabla, y empleas elementos y atributos obsoletos en HTML5, tales como center, bgcolor, b, etc. No obstante, también tengo una pregunta maliciosa que te puede hacer subir nota si la respondes bien: ¿cuál es la diferencia entre require e include?

Score: +0

64. kamilo10,

buenas, mi proyecto es sobre un OCR echo en C# con la librería IronOcr.
para hacerla funcionar deben abrirla desde el proyecto raíz y dar intro sobre el archivo WindowsFormsApp4.sln.
sin mas, acá está mi proyecto
https://drive.google.com/file/d/1nazBHNh_bspw90POUcOtuYTp_t2HQKn-/view?usp=sharing

Score: +0

65. Franco-Escamilla ,

Holis.
Lo de la etiqueta th y las otras obsoletas realmente sí fue cosa de no investigar mucho más allá de HTML, porque realmente quería usarlo más como esqueleto para mantener el sistemita en pie y pues aparte eran cosas que se me quedaron grabadas de hace aprox 5 años, culpa totalmente mía.
Investigaré de esas etiquetas para en un futuro ir haciendo algo mejor, aunque supongo que por el lado del estilo de la página se usa más css.
Respecto a require e include…
Require es para incluir en el proyecto cosas importantes relacionadas a él, algo imprecindible/necesario.
Include es más para algo sin tanta importancia véase el pie de página, por ejemplo.

Score: +0

66. Rayo,

Sí, mala mía.
Al dejar en blanco el cuadro del nombre, se llama a si misma para seleccionar si se quiere usar nombre personalizado, o la fecha. Sin dejar salir de allí.

Score: +0

67. el_pichon,

Desarróllame mejor eso de la importancia. El proyecto funcionaría exactamente igual si uso require o include. ¿Qué los diferencia?

Score: +0

68. Franco-Escamilla ,

En este caso el require es más para el código importante y reutilizable pero vital, vaya.
Variables globales, a lo mejor alguna función (no hay pero podría implementarse), cosas por el estilo.
Un ejemplo podría ser la variable path que se usa para el directorio a donde van los archivos, eso se ocupa en files y list_files.php.
El include se va más para el lado de las cabeceras o pies de página HTML, algo sí reutilizable pero tampoco tan importante como funciones o variables así.
No sé, no encuentro bien la forma para explicarlo aahhh.

Score: +0

69. el_pichon,

@rayoh qué harías para evitar un desbordamiento de pila en esas llamadas recursivas? ¿Se te ocurre con qué podrías sustituirlas?

Score: +0

70. Rayo,

Sí. podría solo tirar el msgbox del error, para que retorne al menú principal. O, bien, una ventana que pregunte si quiere seguir creando el archivo. Si se responde que sí, llama la función crear, si no. Hace lo anteriormente dicho.

Score: +0

71. el_pichon,

Vale. Pues yo lo que haría sería sustituir las llamadas recursivas por ciclos iterativos. Puedes meter un while que no se rompa hasta que no tenga la información correcta. Consigues lo mismo, pero evitas un posible desbordamiento.

Score: +0

72. Rayo,

¡Gracias! Lo tendré en cuenta.

Score: +0

73. Dherhion,

Algunos comentarios a falta de que el último postee:
Rayo: Tu código me obliga a leerlo para saber qué hace. Odio los códigos que me obligan a leerlos para saber qué hacen, y hace un par de días me llevé un tirón de orejas y dos collejas justo por eso, lo que me concienció aún más. A no es un nombre descriptivo para una variable.
Sammael: Bien pensado, pero te falta un detallito de organización.
Actualmente el código mezcla mucho php y HTML, hay cosas que se podrían meter en funciones que devolvieran cosas, como el listado de archivos, haciendo el código más legible. Usas html4.x, lo que me da grima, la tabla no cumple con los criterios de accesibilidad y los errores que generas con php no generan un árbol dom completo. Por otro lado, no indentas el código, lo que lo hace un pelín engorroso de leer.
Camilo¨: Fácil de leer, se entiende bien, no necesito leer el código para saber qué hace un método... Simplemente, lo mejor que he visto.

Score: +0

Last edited by Dherhion, Jul 31 2022 21:16:07

74. Symbian,

bien, revisé el proyecto de @samael! Las principales faltas que le veo es que, aunque es deducible por alguien que sabe del tema, no tiene comentarios, pero al ser un proyecto tan simple no le daría mucha importancia a eso. Por otro lado, tiene etiquetas obsoletas como se dijo, y aquí ofrezco formas de repararlo.
En lugar de usar la etiqueta center, que está obsoleta, aquí doy posibilidades, aunque eso depende de lo que uno quiera:
para alinear el texto del encabezado (entiendo que es eso lo que se pretendía) se puede hacer algo como esto:
<h1 style="text-align:center;">
aunque, podrías haberte creado una clase center y desde un archivo css la gestionas. Otra posibilidad, si lo que quieres es centrar los elementos como tal, es usar margin: auto;
-bueno, miremos el resto de proyectos.

Score: +0

75. Rayo,

Gracias, derion. Si, me toca trabajar más en la descripción de lo que hace cada cosa, o el como lo hago.

Score: +0

76. Franco-Escamilla ,

Gracias por los comentarios y sugerencias, siempre son bien recibidos.
Estaré echándole un ojo más a la organización y a actualizarme con etiquetas para no quedarme tan atrás.
Ah, y sorry por no indentar, costumbres malas.

Score: +0

77. Symbian,

analizando el código, aunque falten cosillas sí noté que @Rayo puso comentarios de lo que hace cada cosa y considero que hay variables que no están bien nombradas como se dijo, también es cierto que y cosillas que se podrían optimizar con el uso de bucles, él fue el único que puso un detallado readme de la ejecución y compilación del código y creo que eso hay que valorarlo positivamente, pues, si analizamos los otros proyectos, samael no puso en su repositorio dicho archivo, y aunque se ve que es php y php es asociado a páginas web, en teoría hay aplicaciones de escritorio echas en php. Por otro lado, del proyecto de Kamilo10 no puedo hacer una valoración pues no he tocado Visual Studio lo suficiente (solo para hacer ciertas pruebas pequeñas) y menos aún C# aunque haya visto Java que en teoría es parecido.

Score: +0

78. Dherhion,

con lo que sabes de java te da para entender qué hace. Está muy bien hecho y el código es descriptivo.

Score: +0

79. Symbian,

le doy la razón a @dherion, aunque ese código parece algo complejo por la cantidad de librerías y cosas que tiene, si te pones a buscar y encuentras el código al final se ve claramente lo que hace y todo. También, aunque se han puesto comentarios, considero algo escasa la documentación del proyecto. Respecto al tema del formato, a nivel de indentación está muy bien!

Score: +0

Last edited by Symbian, Jul 31 2022 23:22:31

80. rmcpantoja,

¡Hola a todos!
Sigo yo, con mi proyecto, sin antes aclarar unas cosas:

Tanto este mensaje como enlaces estarán en markdown, por lo que para una mejor experiencia se recomienda visualizar desde el navegador o, en caso de enlaces, hacer la selección necesaria y adecuada.

proyecto: universal calculator (calculadora universal):

descripción:

Si bien hay mucho material en el sentido de programas de calculadora o software para ello, suelen no ser suficientes o no suelen ser tan adaptables para la gente, es por ello que he pensado en hacer algo diferente, con una interfaz distinta a las demás. Esta es una pequeña gran herramienta donde puedes interactuar con las matemáticas, desde operaciones tan sencillas hata fórmulas y funciones ya más complejas.

requerimientos:

Para ejecutar, necesitaremos el lenguaje AutoIt (última versión aquí)

uso:

Simplemente ejecuta calculator-gui.au3

  • para mayor comodidad, si es la primera vez que instalas AutoIt es recomendable que en la página para la acción predeterminada para abrir scripts se mantenga en ejecutar. Caso contrario, ejecuta autoit3.exe donde tengas instalado junto a la ruta del ejecutable entre comillas.
  • este código es una edición especial para este torneo, basado en el original.
  • * En esta edición hay un tutorial integrado acerca del uso del programa, por lo que al abrirlo te preguntará si deseas mostrarlo, así que queda a tu elección. En él se te explicará de una forma detallada cada una de las funciones, así como también diferentes puntos y alternativas para el correcto funcionamiento.

notas finales:

  1. Es posible que se encuentre algún error tanto en el funcionamiento como en el código, aunque es menos provable ya que lo programé lo más óptimo posible en cuanto a condiciones, errores y tal.
  2. Hay partes donde necesito reducir el código, así que me disculpo desde ya en estos casos.
  3. Por ejemplo, en la parte de los comandos hay mucho que decir, ya que hay algo de spam cuando queremos saber si hay menos o más elementos en una función x (ver código más avajo).

descargar:

Descarga aquí el código fuente

¡Gracias! Agradezco desde ya ante cualquier comentario o sugerencia.

Score: +0

Last edited by rmcpantoja, Aug 1 2022 00:21:50

81. kamilo10,

Gracias dherion.

Score: +0

Last edited by kamilo10, Aug 1 2022 00:37:24

82. sukil,

Para no tener que repetir lo que ya han dicho los compañeros, diré que estoy de acuerdo con todo lo que han dicho. Me centraré en otro aspecto, las funciones.

Aquí el que destaca es Camilo10, sin duda. Ha dividido el código correctamente de tal manera que sea fácil de seguir. Siendo muy críticos se podría decir que faltaba documentación en las funciones, pero para algo tan pequeño no importa mucho. Sí que estaría bien, si es posible (que no lo sé), cambiar el nombre de los controles de la ventana y de la aplicación (button1, form1, etc.).

El resto: Samael no tiene ninguna, aunque como su aplicación es pequeñita puede que no hagan falta.

Rayo y Mateo: creáis funciones solo por exigencias de los lenguajes, y puede que alguna más. Por dios, dividid el código algo más. De paso, haced funciones que dependan solo de los parámetros de entrada para devolver lo que tengan que devolver (funciones "puras", que se llaman), si acaso con los efectos colaterales de crear archivos y estas cosas. Pero... pasadles cosas a las funciones, y no hagáis un main de 100 líneas.

Score: +0

83. Dherhion,

Voy con la calculadora:
Así para empezar... Funciones. De verdad. ¿Qué teneis contra el uso de las pobres funciones? ¡Usadlas para que devuelvan cosas!

Score: +0

84. Symbian,

muy de acuerdo con @dherion y @sukil, faltan funciones. Por otro lado, respecto al script de Mateo, también considero que, ciertas variables no se nombraron bien, haciendo un poco confusas algunos trozos de código. Como dijo @dherion, dividiendo el código en funciones se resolverían muchas de esas cuestiones. Algo bueno que debo reseñar es el tema de la indentación del código y la documentación, considero que están muy bien.

Score: +0

85. kamilo10,

gracias sukil. Si exactamente no coloqué comentarios, porque como es un proyecto pequeño entonces no lo vi tan necesario, y por parte de los controles si se puede modificar.

Score: +0

86. rmcpantoja,

@sukil @dherion @freddy_krueger Gracias por ese detalle. Efectivamente tienen razón, especialmente la función main tiene mucho código que dicho sea de paso combiene que sea separado, pero paso a explicar el por qué no lo he hecho. Lo mejor de todo es que hay una solución:
En AutoIt existen dos tipos de obtención de mensajes de la GUI, es decir, eventos, parámetros y demás ya sea en una ventana o control x. Estos dos modos son el GUI message loop (que es el que uso actualmente y usa la gran mayoría). Este modo consiste en que se usa la función GuiGetMsg() durante un único loop y dentro de un switch exclusibamente para la GUI (aunque se pueden hacer más cosas aparte de la GUI fuera de ese switch) Pero como su nombre lo indica en inglés, obtiene los mensajes de la GUI durante o en un loop. En este caso usamos un switch, por lo que dentro especificamos el evento y en ello, seguidamente, escribimos las llamadas o lo que sea que se quiera que se haga al realizar ese evento.
El segundo modo es el GuiOnEventMode y esta sería una solución a lo de dividir el código en funciones para una mejor organización, como lo han dicho. ¿Por qué? Porque este modo consiste en que, los eventos no se registrarán en un bucle como lo hace el Gui message loop, sino que al crear un control GUI o un evento establecemos una opción especial para ello, y esta función especial se encarga de registrar ese control o evento y cuando este haya sido manipulado, llamar a la función que queramos, tengamos en cuenta que es como el modo anterior con el
switch GuiGetMsg()
case $idBoton1
; acción:
EndSwitch
En cambio, en este modo, después de crear el control:
$idBotonIgual GuiCtrlCreateButton("igual", 10, 10, 100, 30)
Debemos establecer la función para que establezca el evento, algo como:
GuiCtrlSetOnEvent($idBotonIgual, "mifuncion")
Aunque podemos usar el -1 como primer parámetro, pero el -1 es para establecer a un evento con el control recién creado. Es decir, creamos el control y establecemos el evento pero ponemos 1 como primer parámetro si es que queremos que se establezca en el control más reciente. Yo recomiendo establecer los eventos de todos los controles en -1.
Prueba:
$idBotonIgual GuiCtrlCreateButton("igual", 10, 10, 100, 30)
GuiCtrlSetOnEvent(-1, "mifuncion")
El segundo parámetro "mifuncion", si este evento ocurre, la llama.
OK, creo que lo expliqué ya. Esto no solo es en controles, sino también en eventos del sistema y más.
Como lo he dicho, he usado el primer modo, pues muchos incluso en la ayuda de autoit se usa así que... la costumbre, creo.
¿Por qué la solución es el GuiOnEventMode? Porque hay dos ventajas

  1. porque en lugar del switch y del contenedor que lleba las funciones de cada uno de los controles, se podría crear una función para uno solo o más eventos. Para establecer más de un evento llamando a una misma función pero queremos que en esa función x se tomen en cuenta los controles o eventos que se están usando, hay una macro especial para ello, el @GuiCtrlid.
  2. Accesibilidad: se ha descubierto que desactivando el silencio del script en el bucle vacío la navegación de los controles con el teclado funciona más fluida, normal y corriente como cualquier programa, por lo que no hay lentitud. ¿La desventaja? No es muy recomendable porque consume CPU.
  3. Perdón por lo extenso del mensaje, la verdad que es que he tratado de explicar lo más claro posible hasta con ejemplos si ubiese sido necesario...

Score: +0

Last edited by rmcpantoja, Aug 2 2022 00:49:43

87. sukil,

Vale, de acuerdo. Pero aun así, creo que podrías hacer algo como esto: en la función main llamas a una función que cree la interfaz y que la muestre. En la interfaz tienes el switch, de acuerdo, pero en cada case llamas a una función distinta (una que limpie la pantalla, una que introduzca los números, una que haga lo de las funciones de la calculadora, etc). Por ejemplo, te reescribo la parte de los números ("" en los parámetros title y text indican ventana activa):


Func agregar_caracter($control, $caracter)
; Agrega un caracter a un control de la ventana activa.
ControlSetText(";";, ";";, $control, ControlGetText(";";, ";";, $control) &; $caracter)
EndFunc

Vale, estupendo, tenemos una función para agregar un caracter, y ahora cómo usamos el array $Anums para añadir el caracter al cuadro? Así:


Case $aNums[0] To $aNums[17]
For $I = 0 To UBound($aNums)
If $idMsg = $aNums[$I] Then
agregar_caracter(";Edit1";, ControlGetText($hGUI, ";";, $aNums[$I]))
EndIf
Next

Y ya. De hecho, ya que sabemos (por el case) que $IdMSG es un número, no nos podríamos ahorrar un for y un if? No he probado esto, pero... igual funciona y todo.


Case $aNums[0] To $aNums[17]
agregar_caracter(";Edit1";, ControlGetText($hGUI, ";";, $idMsg))

Yo creo que así queda más limpio y más explicativo.

Score: +0

Last edited by sukil, Aug 2 2022 13:23:31

88. rmcpantoja,

Gracias, me has dado una buena idea en la que me ubicaré para hacer este tipo de organización, sin embargo cave aclarar cositas:
En realidad el $idMsg es el controlador o handle del control, ya que recordemos que establecimos la variable $idMsg llamando a la función GuiGetMSG(), lo que significa que esta función no retorna el nombre del control en sí, sino el ID o el handle del control que ha sido manipulado/pulsado etcétera.
A pesar de todo, está claro lo que intentas ver como una solución y de hecho ya tengo una idea para aplicar en el proyecto en estos días. Vaya, aunque lo de AgregarCaracter no se me había ocurrido. De hecho, algo que aconsejo y no solo yo sino en la comunidad de Au3 incluso en el mismo tutorial, las funciones de usuario pueden comenzar con subrayado, aunque también funcionan sin él, además de usar los prefijos para las variables, por ejemplo: s para string, a para array, v value, i integer, n number... De hecho, por eso es que en el comienzo de las variables en el proyecto tienen el prefijo y el nombre de la variable, para que pueda ser más entendible al leer y también más fácil que AutoIt lo interprete.

Score: +0

Last edited by rmcpantoja, Aug 3 2022 01:54:02

89. sukil,

Hola:
Sí, entiendo lo que el $idMsg devuelve. Lo que hago es simplemente: si el botón pulsado es un número, utilizo el texto del control al que apunta y lo añado al cuadro de edición (de ahí la llamada a ControlGetText en la llamada a agregar_caracter en el parámetro $texto).
De hecho, mi código (el más corto, no he probado el primero con el for y el if) funciona, poniendo signos de dólar donde toca y cambiando edit1 por Edit1. Edito el mensaje de arriba.

Score: +0

Last edited by sukil, Aug 3 2022 08:17:22

90. Rayo,

quién ganó? XD

Score: +0

96 messages, 4 pages:  1 23 4 ↖ Go back to topic list

Answer to topic

You must be connected in order to be allowed to post.

Lost password ? Create account