lunes, 4 de mayo de 2020

Finalmente, el paso a wx3 y unicode en Zinjai y PSeInt

Hace años que me quejo de mí mismo por estar atado a la versión 2.8.12 en modo ansi de wxWidgets. Siempre decía que el cambio a las versiones 3.x, junto con el paso al modo unicode, requería muuucho trabajo. Necesario, sí, pero demasiado para el poco tiempo que disponía. El problema de macOS y los 64bits me obligó a concretar en parte la tan postergada migración de PSeInt. Quedaron conviviendo ambas versiones, y de a poco la versión 3 fue ganando terreno. Sin embargo, culpa de estos cambios aparecieron errores nuevos, algunos bastante notorios.


MacOS me obligó a publicar su versión basada en wxWidgets 3 y, ya que estaba en el baile, en modo unicode (a partir de ahora, wx3 a secas). Pero para evitar muchos problemas todavía no detectados, al principio para GNU/Linux y Windows mantuve como preferencia a wx2. El código, mediante montones de #ifdefs y macros (buuu!), permitía compilar con ambas. Mientras tanto, yo en mi notebook donde daba clases y desarrollaba, usaba wx3, como para ir probándola. Como parecía andar bastante bien (después de ajustados unos cuantos detalles), en algún punto publiqué una actualización que usaba wx3 también en Windows y GNU/Linux de 64bits.

Eso fue algo prematuro. De a poco fui encontrando más problemas ocultos en la migración; y especialmente en Windows, donde hay más usuarios, pero menos lo había probado, ya que en mi notebook uso GNU/Linux. Por ejemplo, había un error que hacía inusable en muchos casos la funcionalidad de ejercicios autocontenidos en GNU/Linux, y otro peor que hacía desastres con los caracteres de fin de linea en Windows. Cosas como la 2da no las esperaba, ya que ni siquiera dependen de ansi vs. unicode (que es la raiz del 99% de los nuevos problemas).

Y hay que agregar a la bolsa que wx2 en GNU/Linux funcionaba sobre gtk2, pero hoy en día sería más lógico compilar wx3 contra gtk3, que es bastante diferente, así que a los cambios propios y genéricos de wx hay que agregarles los específicos de gtk. Por ejemplo, la última versión estable de wx3, si se compila sobre gtk3, no aplica bien el escalado de fuentes que ofrecen algunos escritorios para pantallas hidpi. Como en la máquina virtual donde pruebo no uso escalado, y en la mía que sí, usaba gtk2, no me había dado cuenta. Encontré la solución en la versión trunk de wx y me pasé varias horas identificando el commit responsable en el git (la bisección no fue tan simple porque en el repo hay muchísimas versiones que no compilan porque alguien se olvidó de agregar algún fuente nuevo).

La diferencia en el tamaño del texto entre los botones del cuadro "Buscar" 
y los de los paneles apareció al pasar de gtk2 a gtk3.

Y el problema de estos problemas, es que el código compila. Si al cambiar el funcionamiento de una api, el código no compila, es bueno porque nos permite detectar el cambio. Pero si compila igual, el bug puede quedar escondido un buen rato y saltar en el peor momento. Y dado que no tengo un departamento de control de calidad, casi seguro que les salta a ustedes, usuarios, que son mi equipo de testing trabajando en negro y sin saberlo :). Sobre todo en los casos de Windows y macOS.

Y por este camino probar se hace cada vez más difícil. Si con andar teniendo que tener cuidado con las diferencias entre los 3 sistemas operativos no es suficiente; encima hay que agregar ambas versiones de wx, ambas versiones de gtk, etc. Sumando además que los compiladores que uso para las versiones 2.x en GNU/Linux y macOS, me atan a C++98. Creo que ha llegado el momento de abandonar por completo la versión 2, y simplificar el código y el desarrollo.


A la par, y aprovechando la primera experiencia con PSeInt, comencé a migrar ZinjaI, donde el cambio es mucho más grande y delicado. Lograr que compile no fue tan difícil como esperaba. Pero una vez compilado casi nada funcionaba bien. Ahora lo básico está migrado y parece funcionar, pero sigo encontrando errores ocultos todos los días. Sin embargo, dado que en ZinjaI el cambio en el código es más grande, y que le puedo sacar mucho más provecho a C++14, opté por cambiar drásticamente a wx3/C++14 y ni intentar mantener ambas versiones.

En conclusión, les pido disculpas por las "molestias ocasionadas" por los errores de las últimas versiones de PSeInt. Hace unos días publiqué una actualización con muuchas correcciones, y espero que a partir de ahora volvamos de a poco a la estabilidad. El cambio era necesario, y además de dolores de cabeza, trae sus muchas ventajas. Pero dejo las cosas buenas y funcionalidades nuevas para otros posts.

6 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Qué tal Pablo! Llegué de casualidad a vos y al blog a través de las clases de informática de mi hija. Me contó que le habían pedido instalar el PSeint, y lo estuve chusmeando un poco, y me pareció genial.
    Ojalá hubiéramos tenido en la escuela algo así!
    Te dejo este comentario nomás para darte las gracias por tan lindo trabajo que hiciste con esta IDE pedagógica. Un abrazo!

    Mario

    ResponderEliminar
  3. Solo para felicitarle y agradecer por su trabajo. Llevo dos meses usándolo lo cual ha implicado aumentar mi aprendizaje de programación en forma exponencial.

    ResponderEliminar
  4. Tienes un virus en el foro para reporté de errores pues escribo algo y esto es duplicado lo elimino y se vuelve a duplicar indefinidamente

    ResponderEliminar
  5. HOla Pablo, mi hija empezó este año Sistemas en la UTN FRSF, usan Zinjai. Lo quise instalar en una NB vieja que le pusimos linux porque con Win era un carretón, el problema es que me dice que faltan dos librerias, las quiero instalar, pero linux (Ubuntu) no las encuentra. Las librerias son:
    libgtk-x11-2 y libgdk-x11-2
    Si me podrías tirar una ayuda, porque estaría bueno que mi hija pueda llevar esta NB a la facu porque no hay tantas PCs para todos. y de paso quiero que empiece a ver linux, pero no quiero tirarle de entrada un problemón y que ya se frustre

    ResponderEliminar