@ agnasg

Lo más simple posible

19-05-2016 3:40 AM

“Most macros only serve to show how clever the programmer thinks he is; the community encourages this behavior. Now, the 5% of the time when you do need them, they’re indispensable.” (“La mayoría de los macros sólo sirven para mostrar lo inteligente que el programador cree que es; la comunidad alienta este comportamiento. Ahora, el 5% de las veces cuando se los necesita, ellos son indispensables.”)– Joe Pepersack
Why didn’t Common Lisp fix the world?

Esta es una interesante discusión sobre C++ Moderno, y por qué no deberíamos preocuparnos por las nuevas versiones y acontecimientos en el proceso de modernización de C++. Yo estoy de acuerdo con la premisa básica del artículo, pero no con las conclusiones. Como quiera que sea y con el objetivo de no entrar en una discusión medieval  (¿cuántos ángeles caben en la punta de un alfiler) el objetivo debe ser mantenerse en lo fundamental, en la esencia, el objetivo. Para ello cabe la pregunta (lo cual nos ayudará a mantenernos en la esencia): ¿para qué voy a usar esto? ¿contribuye esta herramienta a la solución o es el camino largo? Están muy interesantes y divertidas las nuevas adiciones de C++11, C++14, C++17, pero, en realidad, nosotros no necesariamente necesitamos todo ese poder para programar nuestro próximo juego. La clave está en utilizar lo esencial, lo que realmente es útil. Lamentablemente el C++ moderno tiene conceptos que más que ayudarnos son una distracción, o generan un código que después va a ser difícil de mantener. Cuando estoy programando psyblast mi primer pensamiento en todo momento es mantener el código lo más eficiente y elegante pero sobretodo, lo más simple posible.

¿Cuántos programadores se necesitan para modelar una silla alienígena?

05-05-2016 4:50 PM

He estado tratando de mejorar las visuales de los objetos en psyblast. Se me ocurrió (estaba distraído) que el addon que hace el export desde Blender a Irrlicht debería traer las luces de la misma forma que trae los demás meshes. Esto no es posible porque el loader de irrlicht solamente maneja los meshes e ignora el resto. El punto es que estuve un rato peleando con python y el api de Blender. Es bien gracioso como ha ido evolucionando, y cómo van cambiando los nombres de los atributos de las luces. Por ejemplo obj.getData() ahora es obj.data, obj.data.spotSize cambió a data.spot_size y luego a data.spotsize. obj.data.b pasó a obj.data.colour.b y luego simplemente obj.data.color.b. Y así sucesivamente. Otros atributos cambiaron de nombre también, por ejemplo obj.getMatrix(“worldspace”) pasó a obj.matrix_world, matrix.to_translation()  es el nuevo nombre de matrix.translation_part(). Aquí está el api actual para el que esté interesado en echarle una mirada.

Como dije deseché la idea de importar las luces junto con el nivel, así que regresé al truco de trabajar las texturas. Irrlicht tiene gráficos tipo Doom o quake, así que en ciertas áreas no me quiero preocupar mucho por la iluminación. psyblast además se desarrolla en un planeta alienígena que es bien iluminado por una estrella tipo Antares, o algo así. Por eso hay luz de sobra. Abajo quedó el resultado. La silla es bien rara porque se supone que no se debe parecer a como luce una silla en otras partes del universo:

alien-chair
El btra está realmente perplejo por el tiempo que le dediqué a esto. Todo un día.

Mi destino

28-04-2016 5:44 PM

Todos, tú, yo, tu pareja, mi gato Mirriango, tu mamá también, todos, tenemos una cita con el destino. Es… ineludible. A veces, porque hay veces, aquí, sentado aquí en mi lugar en el universo contemplo mi destino como diciendo: ¿me esperas? ya voy, ahí voy,  aquí estoy para ti, estoy preparado, nunca he estado más preparado para nada sino para ti, tú, mi destino.

¿En qué consiste el verdadero valor? En decir “estoy preparado”. No hay nada más que decir.

World War Bee, la diáspora y las “peculiaridades” de los muds

25-04-2016 12:58 PM

Ya he mencionado que Gevlon  abandonó Eve (Syncaine dice que “con su airada salida, su único logro en EVE es ser reconocido por todo el mundo, incluyendo CCP, como el loco del pueblo que es” (“with his rage-quit, his solo ‘accomplishment’ in EVE was being recognized by everyone, including CCP, as the village lunatic that he is.”)). Este artículo en Rock Paper Shotgun es una extensa narración/descripción de los sucesos de estos últimos meses en Eve, incluyendo la más grande batalla en los últimos años, World War Bee. Las razones de Gevlon para abandonar Eve parecen tener que ver más por su participación (o falta de ella) en esta guerra. Como en todas las guerras, hay quienes ganan, hay quienes pierden y hay quienes se hacen ricos. Y finalmente los que dicen “¡No vale!, ¡No juego más!”.

Ahora Gevlon está buscando un nuevo proyecto. Lo cual me parece una interesante idea porque yo abandoné wow hace varias semanas y he estado buscando algo nuevo que hacer. He estado jugando psyblast claro, pero todavía está en pañales e inevitablemente quiero agregar y modificar contenido/características mientras juego, pero cuando estoy trabajando realmente lo que quiero hacer es distraerme, no trabajar más. Y las últimas dos semanas el trabajo ha estado intenso.

Wizard 101 siempre ha sido una posibilidad pero el “101” siempre me ha molestado , demasiado bajo nivel. Eve como ya he dicho ni siquiera lo tengo en alguna lista. Y regresar a wow ni hablar. He considerado tratar de terminar algunos logros que tengo pendientes o lograr el cap de oro pero la pregunta es para qué, y si eso va a ser divertido.

Ahora el punto es que esto no es inusual. Luego de revisar los blogueros más tradicionales la situación es la misma, estamos buscando una nueva casa ya que actual no es atractiva por múltiples motivos y la oferta actual no nos interesa. Así que creo que voy a seguir con los muds. He estado jugando ZombieMud, tiene cosas estupidícimas, pero, ¿qué mud no tiene cosas estupidícimas? ¿Por ejemplo? ZombieMud requiere que guardes tu equipo en el banco o un baúl en tu castillo. Así que tienes que quitarte todo, guardarlo en los baúles, (tú equipo no cabe en uno solo), cerrar los baúles, etc. Y el día siguiente hacer lo mismo. Si se te olvida hacerlo lo puedes perder todo si hacen un reboot. Divertido, ¿verdad?

Don’t play EVE Online!

18-04-2016 6:38 AM

Gevlon, un interesante bloguero, a quien he venido siguiendo desde hace años, acaba de cambiar su página Ven y juega Eve Online, por una nueva página: No juegue Eve Online (Don’t play EVE Online!). Las razones son múltiples pero la principal es que si de alguna forma llegas a sobresalir como jugador te arriesgas a ser maltratado y eliminado por el grupo de jugadores dominante, y esto con el permiso y el apoyo de CCP, la propietaria de Eve. Es bien sabido que en Eve suceden cosas que en ningún otro juego son permitidas, pero al parecer, si a un grupo de personas se les da la oportunidad de hacer lo que les dé la gana y si tienen el suficiente poder terminarán torturando y maltratando a los que se atrevan a desafiar su autoridad. Gevlon propone como ejemplo de esto el experimento Zimbardo (Stanford prison experiment), yo agregaría quizás a Lynndie England y el abuso de los prisioneros de Abu Ghraib. Yo he visto esta conducta en innumerables grupos de discusión donde alguna persona adquiere el suficiente poder para acallar cualquier crítica e imponer su criterio y opinión. En los grupos de discusión esto no es particularmente grave pues al fin y al cabo se puede simplemente huir por la derecha. El problema es que en Eve, como en todo mmo, los jugadores invierten una cantidad considerable de dinero y tiempo al que no pueden o quieren renunciar fácilmente, y mucho menos porque otro jugador te quiere acosar y fastidiar la vida.

Yo jugué Eve hace algunos años pero lo abandoné porque me parece un juego estúpido. Así que, simplemente No juegue Eve Online. Ud. ha sido advertido.

Bug 1369: psyblast/Irrlicht/Blender/B3DExport.py

07-04-2016 12:35 PM

Mi juego psyblast utiliza modelos y niveles (the levels) diseñados y desarrrollados en Blender. El motor gráfico es Irrlicht y utiliza b3d (obj) como formato de los modelos. Para pasar de Blender a este formato utilizo el addon B3DExport desarrollado por Diego ‘GaNDaLDF’ Parisi y otros. Irrlicht lee este formato y despliega los niveles y modelos, incluyendo las animaciones. Ayer hice algo que generó que el juego se quedó trabado en la última animación, y arbitrariamente algunas veces las mostraba todas y otras veces solamente la última. Esta imágen muestra el modelo, y el timeline de la animación (abajo) mostrando que la animación incluye frames del 1 al 39:

psyblast-irrlicht-blender

Ok el dato interesante que omití es que la última animación corresponde a los frames 26-39
¿Se ve el problema? ¿No? Aquí hay un acercamiento:

psyblast-irrlicht-blender-closeup

Claro, ahora que suministré estos datos es obvio, el addon B3DExport.py está tomando como la totalidad de la animación el rango seleccionado, es decir, desde el 26 al 39, que blender gentilmente está resaltando con un gris más claro. ¿Cómo es posible que teniendo esto frente a los ojos no lo vea?. Esta una característica interesante, quizás pueda ser útil en ciertos casos pero si la ignoras te puede generar un verdadero dolor de cabeza porque no sabes porqué está pasando algo inesperado, y peor aún, no sabes quién es el culpable (psyblast/Irrlicht/Blender/B3DExport.py)

Yo no sé si yo sabía todo esto o no, debido a que estoy trabajando múltiples áreas del juego a veces paso semanas y meses sin tocar Blender y es posible que se me olviden detalles de su funcionamiento e integración con Irrlicht.

¿Moraleja? Olvídalo, inclusive si eres cuidadoso un error o bug puede salir hasta por desconocimiento de cómo funcionan las cosas.

Y aquí les presento, una vez más, a Java

05-04-2016 5:26 AM

Si tú tienes que escribir lo siguiente para explicar cualquier cosa del funcionamiento de un lenguaje simplemente ese lenguaje dejó de ser una lenguaje: un sistema que sirve para comunicarse.

“Con el ejemplo de List, es necesario recordar que los genéricos no son ni covariante ni contravariante. Esto significa que si X es un subtipo de Y, List <X>  ni un subtipo ni un supertipo de Lista <Y>. Dado que Integer no implementa CharSequence, no se puede utilizar la List<Integer> en su método doCharSequence .”

(“With the List example, you need to remember that generics are neither covariant nor contravariant. This means that if X is a subtype of Y, List<X> is neither a subtype nor a supertype of List<Y>. Since Integer does not implement CharSequence, you cannot use List<Integer> in your doCharSequence method.”)

El punto no es que requieres aclarar varios detalles para que esto se entienda cabalmente, sino que bien el programador o alguno de los programadores que le hagan mantenimiento al código que se genera basado en esta explicación va a cometer un error en un 99.7% de los casos.

Tomado de esta respuesta en StackOverflow, con comentarios de reddit, donde se indica como algo impresionante, sin aclarar si es bueno o malo.

De las vacaciones altamente productivas

02-04-2016 5:54 AM

El problema de las vacaciones es que son extremadamente efectivas. Si fuera tan efectivo en mi trabajo como lo soy dedicándome a las vacaciones mi productividad tendería a ser infinita. ¿Y cuál es el objetivo de las vacaciones? Muchos pero principalmente distraernos de nuestro trabajo. Y he estado distraído. Muy distraído  luego del receso de la semana pasada. Poco a poco luego de una semana estoy comenzando a regresar al planeta tierra. Hoy. Sábado. Son las 6:30 am. Ouch

Desde hace 4 años llevo una cuidadosa contabilidad de mis ingresos. Así que puede decir que esta semana de retorno de las vacaciones me costó (o dejé de ganar, o mis ingresos fueron impactados en) un 15% de mis ingresos mensuales. Un 2.5% de mis ingresos anuales. Luce poco. No lo es.
Hay un componente adicional. Yo trabajo como freelancer que a veces  no es percibido como un trabajo de verdad. Ya he dicho otras veces que trabajo es trabajo, llámalo como quieras. Pero hay gente que trabaja como freelancer como un medio de ingresos adicionales. Mis ingresos por este concepto no son adicionales, son mi ingreso.

Yo no tengo, en consecuencia ingresos adicionales por ahora, se supone que eso va a venir de mi side project, que es la programación de juegos, es decir, psyblast. Así que esta semana realmente no trabajé trabajo, sino trabajé mi side project. Tampoco fue mucho, el documento que registra el tiempo trabajado no parece indicar más de 10 horas esta semana. Así que las vacaciones realmente cumplieron su cometido.

¿Cómo se revierte esta tendencia? Pues este blog habla de muchas cosas, pero principalmente este es un blog sobre la procrastinación, sobre lo cual tengo un doctorado.

Estaba leyendo hace un rato en mi diario personal (que es otro mecanismo de procrastinación, casi) algunas ideas para combatir el efecto pernicioso de las vacaciones. Son ideas, una receta general de cómo comenzar a trabajar. Si no en tu trabajo de verdad, al menos en tu trabajo de mentira. En otras palabras esta lista se refiere a mi proyecto personal, pero aplica a cualquier otra cosa.

Antes de pasar a la lista un comentario adicional. Ayer estuve en el médico. Yo no sé en otros países pero aquí en mi país hay que esperar bastante para que te atiendan. 4 horas en mi caso, ayer. Como cualquier otra persona con un nivel intelectual elevado (no voy a ser presuntuoso y pecar de falsa modestia, en estos tiempos en que la promoción personal o el auto alabamiento es tan común) yo me dedico a la lectura. Y una cita médica es ideal para esto. El tiempo muerto bien empleado deja de ser muerto. No leí ni una oración y estuve las 4 horas babeandome como un pobre de espíritu. Literalmente. Yo no sé si es efecto de las vacaciones, si mi mente se está adormeciendo o qué. Pero las vacaciones tienen algún rol en esto. Más de esto pronto.

Pues bien, aquí, sin más preámbulos, la lista de herramientas para salir del estancamiento procrastinador, o cómo volver al trabajo productivo sin más lamentaciones.

  1. Enciende la música. Esto es efectivo el 99% de las veces.
  2. Lee la lista (cosas por hacer). Si no funciona (a veces tiene el efecto contrario) comienza a hacer una nueva lista.Listas, listas, listas. Son infalibles.
  3. Atado a lo anterior, escribe en ProjectSpecifications.txt la fecha del día de hoy y anota un task. Si no es el correspondiente o el que dejaste pendiente, no importa. Algo siempre desde el comienzo de los tiempos es algo.
  4. Revisa la lista o busca en términos de algo divertido de hacer, algo interesante. No necesariamente lo “siguiente” que hay que hacer, porque probablemente es algo aburrido y es lo que te detiene desde el primer momento.
  5. Ven aquí a tu diario personal (o a tu blog) y escribe un razonamiento de por qué debes continuar trabajando en tu proyecto.
  6. Si todo lo anterior no funciona es mejor que pongas a trabajar en algún proyecto real life. Estás perdiendo el tiempo.

Cambiar la carpeta donde el explorador de Windows comienza

13-03-2016 1:40 PM

¿Quieres ahorrarte unos segundos? ¿Quieres dejar de realizar actividades repetitivas? O al menos ahorrarte una actividad repetitiva. Si Ud. es como yo, llega un momento en que repetir un paso inncesario una y otra vez se hace fastidioso. Aquí hay una oportunidad para eso. Al abrir el explorador de windows, este por defecto despliega una carpeta que un programador jamás utiliza (la carpeta de bibliotecas). Yo no estoy seguro cuántas veces, pero al menos 10 veces al día tengo que abrir el explorador y moverme a la carpeta del proyecto actual en el que estoy trabajando. ¿Por qué no saltar este paso?
Para ello colocamos el mouse sobre el icono del explorador en la barra de tareas:
expwin-1
Presionamos mayúsculas y al mismo tiempo el botón derecho y seleccionamos propiedades:
expwin-2
Insertamos en “Destino” la nueva carpeta por defecto que queremos:
expwin-3
Por ejemplo yo quiero que abra ahora en C:\grg\test_w32\php
Y listo, Usted se va a ahorrar al menos 1-2 segundos diarios que puede emplear en otra cosa.

Joomla: Cómo resolver problemas con “required” en un field definido en xml

10-03-2016 10:14 AM

La respuesta corta es con suerte. Como el componente com_user y el plugin user-profile trabajando en conjunto es difícil descubrir dónde está el problema. Usualmente al definir en plugins/user/profile/profiles/profile.xml  los fields correctamente todo debe funcionar bien, pero hay veces que un campo que no está declarado como “required” insiste en aparecer como tal en la forma. Por qué es un misterio para mi por ahora. En google hay varios hacks para solucionarlo, pero en resumen:

  • En template/html/com_users/profile/edit.php coloca explicitamente el field como no requerido usando
    $this->setFieldAttribute('address2', 'required', 'false', 'profile');
  • En libraries/joomla/form/form.php debes atrapar el campo y retornar con “continue” para evitar la validación del lado del server
    // Validate the fields.
    foreach ($fields as $field)
    {
    $value = null;
    $name = (string) $field['name'];
    if ($name === "address2") {
    continue;
    }
    

Mi experiencia es que hay un bug en alguna parte pero todavía no he descubierto dónde. El problema es que este bug se presenta normalmente en medio de proyectos en los que no tengo tiempo para realizar búsquedas por el amor al arte. Y luego de que termina el proyecto estos horribles “hacks” se quedan así. Nada profesional, pero no hay forma de explicar esto a un cliente que quiere ver su sitio listo y funcionando lo antes posible. Terrible por decir lo menos.