@ agnasg

agnasg


¿Cuál instalador para Windows es mejor?

18-10-2022 9:06 AM

He estado actualizando Saeta un programa que permite distribuir archivos a una lista de correos. El mismo se encuentra disponible en mi sitio de productos y servicios macronosis.com.

Algo que nunca le había agregado es un instalador, actualmente solamente se puede descargar un .zip. El instalador tiene la ventaja de que permite instalar el programa siguiendo las mejores prácticas para Windows, ofrece la instalación en la carpeta de programas, la opción para desinstalar, soporte multilenguage en el instalador, etc.

Yo tenía un instalador hace décadas que venía con Borland (el compilador de C/C++) pero ni se me ocurrió buscarlo porque seguramente está desactualizado.

Así que me fuí a google e hice mi primera pregunta: “which windows installer is the best?”. Eso no arrojó buenos resultados, la mitad era propaganda y el único resultado de stackoverflow era una respuesta “cerrada” que no tenía buenas respuestas, según mi parecer.

Al final de leer un poco me pareció que las opciones eran las siguientes:

NSIS, ofrece todo lo que se necesita para generar un .exe. El problema es que luego de 30 minutos descubres que estás aprendiendo un nuevo lenguaje (algunos dicen que es casi assembler), y comienzan a aparecer muchas preguntas: ¿cómo manejo el tema de las versiones? ¿dónde se definen ese poco de variables? ¿$INSTDIR? ¿pero acabo de definir arriba InstallDir?

wix es una solución empresarial, produce instaladores tipo .msi que es lo más cercano a Microsoft que se puede estar. Todo el mundo dice que la curva de aprendizaje es algo fuerte. Paso.

InnoSetup, es del estilo NSIS, pero el lenguaje de definición es más parecido a un .ini file. Si quieres customizar más tu paquete de instalación puedes hacerlo con un lenguaje parecido a Pascal, pero la buena noticia es que para un instalador sencillito no necesitas codificar ni aprender gran cosa. Varios puntos a favor aquí.

Otro detalle con InnoSetup es el primer ejemplo que aparece en la sección de ejemplos:

[Setup]
AppName=My Program
AppVersion=1.5

Listo ahí está cómo se manejan las versiones, no hay variables indefinidas, no tengo que leer el manual (me estoy ahorrando tiempo y confusión). Además, cuando regresé a google porque en el manual de NSIS aparece una sección de preguntas de stackoverflow sobre instaladores, encontré esta respuesta que es sencillamente genial (se parece a la que yo encontré en google, pero esta es mejor, ¿por qué google no la muestra?)

Entre las respuestas está este comentario que es magistral:

Si quieres hacerlo antes del almuerzo, usa InnoSetup … en su lugar – de esta manera no necesitas usar un lenguaje de programación tipo ensamblador que es el que usa NSIS. – Roman Starkov

Eso es exactamente lo que quiero hacer, yo no quiero pasar mi tiempo buscando en un manual cómo se definen variables, o cómo se manejan las versiones, quiero un instalador sencillito que instale mi programa y que los usuarios lo puedan usar.

Así que mi voto es por InnoSetup.

Nota: puntos negativos para google, últimamente se está volviendo una ciencia arcana buscar cosas ahí. Es increíble: prueba varias combinaciones de “best windows installers stackoverflow” y la respuesta perfecta no sale en ninguna. Quizás lo de NSIS vs Wix lo echa a perder, pero, está raro. Sabemos que el algoritmo de google debe tomar en cuenta que cuando un usuario está buscando un tema y deja de buscar probablemente la última busqueda le dió el resultado correcto. Se supone. No sé, creo yo.

Nota 2: se puede crear una instalador con cero conocimientos de InnoSetup en cuestión de 45 minutos, incluyendo cosas básicas como instalar en una carpeta específica (por defecto guarda el instalador en la carpeta de documentos).

Port of call

15-10-2022 6:23 PM

“Ningún precio es demasiado alto
por el privilegio de ser dueño de sí mismo”
Friedrich Nietzsche

Este es un juego clásico de simulación que he estado jugando desde 1988 en mi Amiga 500 (no soy el único que lo jugó en esa época y lo recuerda, por supuesto). Se puede conseguir en diversos sitios en internet, por ejemplo últimamente lo estoy jugando en PlayClassicGames, pero también está en archive.org. Se puede encontrar en Steam, publicado por uno de sus autores, tiene un costo de $4,95

El juego simula la gestión de una empresa global de transporte de mercancías, en la que el jugador contrata el transporte de cargas en diversos puertos del mundo. Los beneficios le permite comprar nuevos y más poderosos barcos. Los minijuegos incluyen pilotar manualmente el barco hasta un amarre determinado en el puerto, recoger sobrevivientes en el mar, esquivar obstáculos en alta mar, etc. (editado y corregido de wikipedia)

Yo rara vez hablo sobre juegos de simulación, porque en realidad son pocos los que juego. De hecho de los pocos que recuerdo haber mencionado alguna vez está el simulador de controlador de tráfico aéreo, mencionado aquí cuando llegué al nivel 19. Pero en este caso como es una juego que tengo años jugando, quiero navegarlo en profundidad, pun intended.

La pantalla principal es nuestro centro de operaciones. El primer botón Globe nos permite ver el mundo y sus diversos puertos. En el segundo botón manejamos nuestra empresa naviera, vemos nuestras cuentas bancarias, el estado de ganancias y pérdidas, gráficos, etc. El tercer botón Ship Broker” nos permite comprar y vender barcos. Los barcos pueden ser usados en mal estado, usados pero en buen estado y barcos nuevos de alta tecnología.

Nuestra oficina que debemos visitar con frecuencia para vigilar nuestras finanzas.

Si no la visitamos perdemos dinero. Por ejemplo, en este caso persimos $115k

Antes de comenzar el juego te pregunta cuántos jugadores van a jugar, pueden ser hasta 4, competir entre ellos.

Lo primero que hay que hacer es comprar un barco. El banco te puede dar financiamiento. Para que los intereses no sean muy alto, siempre pido un 50% de financiamiento. Comenzamos con 4 millones de dólares, así que podemos pedir prestado 2.5 m y comprar un barco de 5 millones. Nos quedamos con 1.5 millones de efectivo para pagar los gastos.

Luego entramos en el lazo principal del juego, donde podemos seleccionar que carga transportar, cargar combustible, etc.

La pantalla que nos permite seleccionar el viaje indica el puerto de destino y la carga, y por supuesto cuánto vamos a ganar. Aquí está el truco para tener éxito.

Cargamos el barco, lo cual tiene un costo.

A veces tenemos que maniobrar el barco fuera del puerto a mano porque hay una huelga.

Nos pueden ofrecer negocios ilegales, para que llevemos contrabando o sustancias prohibidas. Hasta ahora, todas las veces que lo he intentado me atrapan.

EL pago por el contrabando puede ser sustancial.

Y si te niegas te pueden ofrecer el doble.

Pero si te atrapan, te hacen un interrogatorio.

Te retienen el barco y tienes que pagar una multa igualmente sustanciosa.

En alta mar durante el viaje pueden suceder muchas cosas.

Pasar a través de una tormenta puede dañar (o seguramente lo va a dañar). Pero si lo esquivas tardas mucho y es posible que pierdas dinero por entrega con retraso.

También te puedes encontrar con arrecifes, los cuales tienes que esquivar.

Al llegar al puerto puedes necesitar fumigar el barco porque está infectado de ratas, lo cual ocasiona más gastos.

Hay que echarle gasolina al barco lo cual es bastante costoso dependiendo de la longitud del viaje, y del puerto.

Finalmente el viaje nos produce alguna ganancia.

Pero tenemos que pagar nuestros gastos. En este caso la amortización del préstamo que pedimos para comprar el barco. Más gastos.

Revisar las cuentas, los gráficos, y descubrir que el negocio no va muy bien.

Conclusión. El juego es bien entretenido y puedes pasar varias horas en cada sesión tratando de sacar adelante tu compañía. Es, en resumen, un juego que puedes jugar muchas veces, en mi caso, años.

Por qué hacerlo fácil si lo podemos hacer difícil v 2.0

24-09-2022 7:06 PM

He estado viendo la forma como mis ingresos de mi actividad de freelancing se han ido transformando y mermando en cierta forma con el tiempo. La pandemia, el descubrimiento por parte de los freelancers que haciendo un plugin de WordPress puede generar $150 en una mañana, otras razones, ha generado este declive. Si tu colocas “quiero un sitio hecho en WordPress” en upwork, freelancer.com y otros sitios, te van a aparecer 80-120 ofertas al instante. Hace 10 años yo hacía 2-3 proyectos mensuales de web scrapping (extracción de datos de un sitio web). Hoy en día con 3-4 líneas de python eso lo puede hacer cualquiera. Tengo 5-6 años que no hago un proyecto de este tipo.

Otro detalle que he notado es que la cantidad de ciertos proyectos varía a lo largo del año. Generé una hipótesis y me propuse comprobarla. Si los resultados son los que sospecho los próximos dos meses hay ciertas actividades que debería hacer, o quizás mejor no. Así que me dispose a analizar los correos con “You have been paid by” que tengo en mi cuenta, agregarles la fecha, pasarlos a un .csv y hacer un analítico. google gmail tiene una herramienta para bajar todos los correos, o, en este caso, los que tienen una etiqueta en particular. Los correos que me interesan ya están. etiquetados. La herramienta se llama Takeout y se puede acceder dentro de tu cuenta google. La ejecuté y me generó un archivo _Work.mbox de 300 mb con datos desde el 2004. En google “convertir mbox to csv” está lleno de herramientas, no un procedimiento. Abrí el archivo con vim y es un simple archivo de texto con los correos uno detrás de otro en cualquier orden.

Esto es una tarea para awk. Luego de 15 minutos mi script de awk lucía así:

awk -F, 'BEGIN {prev = ""} index(prev, "Date: ") != 0 && index($0, "You have been paid by") != 0 {print prev, $0 }  {prev = $0}' OFS=', ' _Work.mbox

¿Por qué estoy usando awk si con PHP esto se puede hacer mucho más fácil? Hace 15 años procesar un archivo de texto y tomar acciones basado en el contenido de cada línea se resolvía con awk. Pues ya no, con PHP o python esto se hace rápidamente. Fue una reacción instintiva de mi parte. supongo

5 minutos después este es el script PHP resultante:

$fin = fopen("_Work.mbox", "r");
$fout = fopen("result.csv", "w");
$prev = "";
if ($fin) {
    while (($line = fgets($fin)) !== false) {
        if (strstr ($prev, "Date: ") !== false &&
	     strstr ($line, "You have been paid by") !== false) {
                $date = substr ($prev, 5, 26);
		$end = strpos ($date, "-0");
		if ($end !== false) {
			$date = substr ($date, 0, $end);
		}
		$begin = strpos ($line, " by ") + 4;
		$end = 	strpos ($line, " on ");
		if ($end === false) {
			$end = 	strpos ($line, " at ");
		}
		$by = substr ($line, $begin, $end - $begin);
		fwrite ($fout, "$date;$by\n");
	}
	$prev = $line;
    }

    fclose($fout);
    fclose($fin);
}

Tuve que hacer algunas manipulaciones para eliminar texto inútil y otros maquillajes. El resultado fue desalentador porque solo obtuve 200 registros, y estaba esperando más de 1000, tuve que regresar a Takeout repetir el proceso, blah, blah. Cuando el .csv se parecía a lo que esperaba comencé a batallar con excel. 45 minutos después el resultado fue una gráfica que confirmó que mi sospecha era correcta: los dos próximos meses debe haber una actividad significativa. Me quedé sospechando que había perdido el tiempo, pero también que quizas todo este ejercicio tiene una utilidad que todavía no he descubierto. Es como cuando estás haciendo una demostración matemática y llegas a que 1 == 2. Obviamente estás haciendo algo mal, lo que hay que descubrir es qué.

Wizard 101: Death Whirlwind

09-09-2022 6:21 PM

Este es un post solamente para reportar algunas estadísticas de uno de los farming más largos que he hecho en mi vida, la Mote of Transport (Mota de Transporte) necesaria para crear la montura Death Whirlwind (Torbellino de Muerte).

El farming es una de las actividades que debemos hacer en los MMO (juegos en línea masivamente multijugador). Consiste en matar jefes hasta que suelten algún tesoro específico que nos gusta o que necesitamos como ingrediente para alguna receta de una montura o algo más. En este caso, es la mota de transporte, un ingrediente para la montura Death Whirlwind .

Aquí está:

La mejor estrategia es farmear algún jefe fácil, para mí, fue Ra (Krokotopia), pero para acceder a él necesitamos Wooden Skeleton Keys (Llaves Esqueleto de Madera). Nuevamente uso un jefe fácil para farmear: Bastilla Gravewind (Firecat Alley).

Además de esto, ejecuté las tareas diarias (daily assignments) durante 173 semanas. Todo el mundo dice que después de un año (lo que significa 54 semanas) debería salir. Por desgracia, no tuve suerte.

Finalmente, hoy Ra lo soltó.

Las estadísticas:

Muertes de Bastilla Gravewind:

74, 11, 30, 65, 9, 29, 121, 19, 116, 78,

98, 88, 10, 25, 34, 36, 1, 15, 24, 13,

20, 64, 19, 122, 126, 106, 20, 2, 4, 68,

12, 37, 5, 71, 135, 95, 102, 64, 1, 128

5, 19 ,11, 64, 36, 3, 19 , 106, 16, 99

Cada número representa el número de muertes para conseguir una Wooden Skeleton Keys (Llaves Esqueleto de Madera) .

Total: 2391 muertes

Cuenta: 50 + 2 (obtenidas del propio Ra)

El promedio de muertes para conseguir una Wooden Skeleton Keys (Llaves Esqueleto de Madera) es de 47,82

Resumen: Maté a Bastilla Gravewind 2391 y a Ra 52 veces para conseguir una Mote of Transport (Mota de Transporte) . Bastilla Gravewind está muerta en 90 segundos con mi Wizard nivel 75, Ra está liquidado en 3 minutos. Eso significa que el tiempo nominal empleado fue ~60 horas reales. Eso es nada. Yo jugue wow más de 8000 horas según mi último conteo.

Fue una aventura que duró 3 años y pico, el farmeo más largo que he hecho en mi vida.

Nota: para alguien que no ha jugado jamás un MMO esto parece una locura. En realidad es algo absolutamente normal, y esos números son +/- normales.