{"id":5211,"date":"2018-11-09T14:30:03","date_gmt":"2018-11-09T20:30:03","guid":{"rendered":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/?p=5211"},"modified":"2018-11-09T14:30:03","modified_gmt":"2018-11-09T20:30:03","slug":"estructuras-de-datos-con-java-moderno","status":"publish","type":"post","link":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/2018\/11\/09\/estructuras-de-datos-con-java-moderno\/","title":{"rendered":"Estructuras de Datos con Java moderno"},"content":{"rendered":"<p>Me gusta pensar que soy altamente funcional (me parece que hay evidencia suficiente de que esto es cierto); y yo supongo que esto es en gran medida porque me conozco y s\u00e9 qu\u00e9 es en general lo que me define como persona. Y como siempre he estado en gran medida de acuerdo con la teor\u00eda del conductismo, tiendo a definirme a m\u00ed mismo en t\u00e9rminos de lo que hago y a lo que me dedico. Mucha gente (probablemente la mayor\u00eda) separan de manera expl\u00edcita su identidad de a lo que se dedican; se asumen como rockeros, cin\u00e9filos o <em>gamers<\/em>, pero esta identidad es independiente (a veces incluso contraria) a lo que hacen para ganarse la vida; su trabajo es \u00fanicamente lo que hacen para pagar la renta. Yo no (y esto me parece es muy com\u00fan en la academia); y sinceramente es parte de los motivos por los que me parece que soy altamente funcional: me <em>encanta<\/em> lo que hago, que repito considero es lo que me define.<\/p>\n<p>Podr\u00eda reducirlo a una \u00fanica cosa, pero para que esta entrada tenga sentido tengo que usar tres:<\/p>\n<ol>\n<li>Soy profesor. Literalmente es lo que mi puesto oficial de trabajo dice en mi contrato, pero me parece que a un nivel m\u00e1s profundo es lo que soy: maestro, mentor, educador. Dar clases es b\u00e1sicamente alrededor de lo que gira mi vida y aunque creo que pude haberme dedicado (como trabajo principal) a otras cosas, jam\u00e1s hubiera dejado de dar clases por completo. Adem\u00e1s creo que soy bastante bueno como profesor; ciertamente es lo que me dicen la mayor parte de mis estudiantes y no voy a caer en una falsa modestia al respecto, cuando me encanta y es de las cosas que m\u00e1s tiempo y esfuerzo le dedico.<\/li>\n<li>Soy programador. Que por supuesto es a lo que probablemente me hubiera dedicado si no hubiera conseguido mi plaza. Programar es con casi toda certeza a lo que m\u00e1s tiempo le dedico cuando no estoy ocupado con mis clases o prepar\u00e1ndolas, aunque hay una intersecci\u00f3n importante dado que normalmente en mis clases ense\u00f1o a programar. Me considero tambi\u00e9n muy buen programador y de nuevo es b\u00e1sicamente porque me encanta y porque de una manera u otra llevo casi treinta a\u00f1os programando sin interrupci\u00f3n. A\u00fan sin talento innato tanto tiempo dedic\u00e1ndole a algo hace que <em>cualquiera<\/em> se vuelva razonablemente bueno.<\/li>\n<li>Soy escritor. Contrario a dar clases y programar, escribir es algo que nunca me plante\u00e9 seriamente como forma de vida. Igual y lo hubiera conseguido, pero la verdad jam\u00e1s lo intent\u00e9. De hecho, ni siquiera pens\u00e9 en intentarlo. Tambi\u00e9n debo hacer notar que <em>nunca<\/em> tom\u00e9 un curso de escritura creativa ni nada por el estilo; despu\u00e9s de mis clases de redacci\u00f3n en el CCH, nunca estudi\u00e9 las letras en un entorno acad\u00e9mico. Pero s\u00ed he le\u00eddo bastante y gracias al blog (y otras cosas) tambi\u00e9n es algo que b\u00e1sicamente no he dejado de hacer desde hace a\u00f1os. Pero con mi escritura s\u00ed soy m\u00e1s humilde; me parece que mi redacci\u00f3n est\u00e1 bien, pero nada para pegar de brincos. Escrib\u00ed una novela y a m\u00ed me gusta mucho, pero me queda clar\u00edsimo que no es una joya de la literatura latinoamericana: especialmente con lo <em>espectacular<\/em> que es la literatura latinoamericana. Pero s\u00ed me considero escritor y una de las cosas que me definen.<\/li>\n<\/ol>\n<p>De esta tercera caracter\u00edstica definitoria de mi persona es de lo que trata esta entrada. Ayer en la tarde, despu\u00e9s de m\u00e1s tr\u00e1mites de los que jam\u00e1s hubiera imaginado eran necesarios, sali\u00f3 publicado mi tercer libro: <em>Estructuras de Datos con Java moderno<\/em>.<\/p>\n<div class=\"thumb\">\n<a href=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/posts-images\/2018\/11\/estructuras.jpg\"><img decoding=\"async\" src=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/posts-images\/2018\/11\/thumb-estructuras.jpg\" alt=\"Estructuras de Datos con Java moderno\" title=\"Estructuras de Datos con Java moderno\" \/><\/a><\/p>\n<div class=\"caption\">Estructuras de Datos con Java moderno<\/div>\n<\/div>\n<p>Es mi tercer libro publicado, pero para m\u00ed es especial porque es el <em>primero<\/em> que escribo yo solo (y que me publican, no como mi novelita).<\/p>\n<p>Todo el proceso de escribir el libro fue muy divertido (los tr\u00e1mites para publicarlo no tanto) y en particular todo el aspecto t\u00e9cnico tambi\u00e9n. Por supuesto el libro est\u00e1 escrito en <img src='\/pensadero\/latexrender\/pictures\/c51d7e23458ca0e7373a8ed6ab56b2b9.png' title='\\LaTeX' alt='\\LaTeX' align='middle' class='tex_image' \/>; yo nunca he sido un experto en <img src='\/pensadero\/latexrender\/pictures\/c51d7e23458ca0e7373a8ed6ab56b2b9.png' title='\\LaTeX' alt='\\LaTeX' align='middle' class='tex_image' \/> pero me defiendo us\u00e1ndolo y para este libro aprend\u00ed (o record\u00e9) un mont\u00f3n de cosas. En particular <em>todas<\/em> las figuras del libro est\u00e1n escritas en <a href=\"https:\/\/en.wikibooks.org\/wiki\/LaTeX\/PGF\/TikZ\">TikZ<\/a> (excepto una) y todo el c\u00f3digo est\u00e1 resaltado (<em>highlighted<\/em>) y coloreado (al menos en la versi\u00f3n electr\u00f3nica) usando <a href=\"https:\/\/en.wikibooks.org\/wiki\/LaTeX\/Source_Code_Listings\">listings<\/a>. Me gusta mucho c\u00f3mo qued\u00f3 el dise\u00f1o interno del libro, que es 100% m\u00edo.<\/p>\n<p>Adem\u00e1s del gusto de que saliera publicado, s\u00ed <em>necesitaba<\/em> este libro. Mi curso de Estructuras de Datos en la Facultad de Ciencias lo doy de tal manera que la mayor parte del material que existe es sencillamente insuficiente de manera individual; la definici\u00f3n de las estructuras y los algoritmos correspondientes suelen estar cubiertos en un mont\u00f3n de libros, pero la implementaci\u00f3n utilizando las caracter\u00edsticas modernas del lenguaje de programaci\u00f3n Java es normalmente omitida. Y s\u00ed es fundamental que los estudiantes implementen las estructuras, no nada m\u00e1s que las estudien. Como sea de ese \u00faltimo punto es que sale lo de <em>&#8220;con Java Moderno&#8221;<\/em> del t\u00edtulo.<\/p>\n<p>A mis estudiantes en semestres anteriores les pas\u00e9 versiones preliminares del manuscrito, y en general me han dicho que s\u00ed les sirvieron mucho, as\u00ed que espero que les sea \u00fatil a los que vengan. Y a m\u00ed me facilita mucho dar mi clase, porque puedo basar las clases en los cap\u00edtulos; pedirles a los chavos que lean un tema en particular antes de una clase; o si un tema no me da tiempo de cubrirlo completamente en el pizarr\u00f3n, puedo dirigirlos a los cap\u00edtulos correspondientes. Tambi\u00e9n le facilita la vida a los alumnos, porque el curso es pr\u00e1ctico (tienen que implementar las estructuras) y me parece (y me han dicho) que con el libro disponible pueden terminar las cosas de manera m\u00e1s sencilla.<\/p>\n<p>Otra cosa que hubo con el proceso de escribir el libro en <img src='\/pensadero\/latexrender\/pictures\/c51d7e23458ca0e7373a8ed6ab56b2b9.png' title='\\LaTeX' alt='\\LaTeX' align='middle' class='tex_image' \/> es que yo sab\u00eda que me iban a pedir una versi\u00f3n electr\u00f3nica del libro; de hecho es uno de los requerimientos del proyecto PAPIME con los que financi\u00e9 su publicaci\u00f3n (por cierto, <a href=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/2018\/08\/12\/tenochtitlan\/\">la nueva encarnaci\u00f3n de Tenochtitl\u00e1n<\/a> sali\u00f3 del mismo proyecto). Mis experiencias transformando <img src='\/pensadero\/latexrender\/pictures\/c51d7e23458ca0e7373a8ed6ab56b2b9.png' title='\\LaTeX' alt='\\LaTeX' align='middle' class='tex_image' \/> a HMTL (porque los libros electr\u00f3nicos usan una versi\u00f3n simplificada de HTML) hab\u00edan sido bastante decepcionantes hasta ese momento (es un  problema complicado); m\u00e1s a\u00fan porque hago cosas en mi libro que <em>definitivamente<\/em> no son est\u00e1ndar.<\/p>\n<p>Pero entonces Omar me platic\u00f3 de <a href=\"https:\/\/pandoc.org\/\">Pandoc<\/a> y as\u00ed fue como perd\u00ed varias semanas de mi vida. Pandoc (debo aclarar) no resuelve el problema, pero s\u00ed resuelve un subconjunto importante y dado que es un traductor de muchos lenguajes de marcado a muchos otros lenguajes de marcado y que ofrece la posibilidad de insertar un filtro personalizado en medio de dicha traducci\u00f3n, yo me puse mi gorro de programador y escrib\u00ed un filtro. Deb\u00ed hacerlo en Haskell, porque Pandoc mismo est\u00e1 escrito en Haskell; pero supuse que no ser\u00eda tan complicado y me siento mucho m\u00e1s c\u00f3modo con Python, as\u00ed que me puse a escribir mi filtro en Python.<\/p>\n<p>Termin\u00e9 escribiendo 3,269 l\u00edneas de c\u00f3digo divididas en 7 m\u00f3dulos, porque aunque en su forma m\u00e1s simple un filtro s\u00f3lo toma la representaci\u00f3n interna del documento <img src='\/pensadero\/latexrender\/pictures\/c51d7e23458ca0e7373a8ed6ab56b2b9.png' title='\\LaTeX' alt='\\LaTeX' align='middle' class='tex_image' \/> (incluyendo bloques enteros sin traducir, si no los entiende) y regresa modificaciones a dicha representaci\u00f3n interna (por ejemplo, traducir en el filtro los bloques que Pandoc no entiende), mi caso de uso era mucho m\u00e1s complejo. Mi &#8220;filtro&#8221; (que creo que merece el nombre de &#8220;sistema&#8221; en este punto) hace toneladas de cosas m\u00e1s, como tener una base de datos de las referencias a etiquetas; contar los cap\u00edtulos, secciones, subsecciones, teoremas, lemas, figuras, listados de c\u00f3digo, etc.; llevar el \u00edndice alfab\u00e9tico (que es una <em>pesadilla<\/em>); generar encabezados y pies de p\u00e1gina para ligas de navegaci\u00f3n; etc., etc., etc.<\/p>\n<p>Y deb\u00ed hacerlo en Haskell porque evidentemente el filtro es recursivo; la mayor parte de las veces cuando Pandoc no entiende un bloque yo s\u00f3lo debo traducir el inicio y final del mismo e invocar recursivamente el filtro en los contenidos al interior del bloque. Esto puede repetirse a m\u00faltiples niveles, obviamente. En Python funciona (no habr\u00eda raz\u00f3n para que no funcionara), pero entonces implica ejecutar de nuevo Pandoc pas\u00e1ndole mi filtro una vez m\u00e1s. Python, adem\u00e1s siendo no particularmente r\u00e1pido, hace que todo el proceso sea mucho m\u00e1s lento de lo que ser\u00eda si hubiera escrito mi filtro en Haskell en primer lugar (en cuyo caso s\u00f3lo se invoca como biblioteca dentro del proceso principal de Pandoc). La nueva encarnaci\u00f3n de Aztl\u00e1n toma cerca de un minuto convertir todo el libro a su versi\u00f3n electr\u00f3nica; no es lo peor que ha ocurrido en el mundo, pero podr\u00eda ser m\u00e1s r\u00e1pido.<\/p>\n<p>Como sea, la versi\u00f3n electr\u00f3nica queda bastante chida; y al menos en mi tel\u00e9fono y tableta se ve incre\u00edble (aunque obviamente prefiero c\u00f3mo se ve impreso).<\/p>\n<p>Teniendo ya el libro (incluyendo su versi\u00f3n electr\u00f3nica), lo que sigui\u00f3 fueron los tr\u00e1mites para que me lo publicaran, que incluyeron que fuera aprobado para su publicaci\u00f3n por el comit\u00e9 editorial de la Facultad de Ciencias. El proceso fue sencillo en el sentido administrativo; le di al comit\u00e9 copias impresas del manuscrito (matando qui\u00e9n sabe cu\u00e1ntos arbolitos en el proceso); el comit\u00e9 seleccion\u00f3 \u00e1rbitros que leyeran el libro; los \u00e1rbitros lo leyeron y entregaron al comit\u00e9 correcciones y sugerencias para mi libro; yo hice algunas correcciones o sugerencias y expliqu\u00e9 por qu\u00e9 no estaba de acuerdo con otras que no hice; y por \u00faltimo se aprob\u00f3 la publicaci\u00f3n del libro. Es la mec\u00e1nica est\u00e1ndar en la academia, me parece.<\/p>\n<p>Lo \u00fanico es que entre que di mi manuscrito y que los \u00e1rbitros me dieron sus correcciones y sugerencias, pas\u00f3 m\u00e1s de un a\u00f1o. No ayud\u00f3 que en medio de ese a\u00f1o hubo un cambio en la comisi\u00f3n editorial. Pero bueno, hoy por fin sali\u00f3 mi libro; entre que el comit\u00e9 me dio su carta de que el libro estaba aprobado para publicar y que lo publicaran, pasaron poco m\u00e1s de dos meses. As\u00ed que en la pr\u00e1ctica, me tard\u00e9 m\u00e1s tratando de publicar el libro que en escribirlo.<\/p>\n<p>Lo primero que hice cuando me dieron un ejemplar del libro (ya sin pl\u00e1stico protector), fue abrirlo y olerlo. Y huele a lo que suelen oler los libros nuevos; papel y tinta. Me gust\u00f3 mucho c\u00f3mo sali\u00f3 la impresi\u00f3n; no es una edici\u00f3n <em>fina<\/em>, pero es una edici\u00f3n buena y competente.<\/p>\n<p>Como dec\u00eda arriba, este no es mi primer libro; pero m\u00e1s importante que eso, es que espero no sea el \u00faltimo. Tengo varios libros planeados a corto y largo plazo, as\u00ed que espero ir sac\u00e1ndolos dentro de los siguientes a\u00f1os (o d\u00e9cadas, si se tardan igual que \u00e9ste). Es de las razones por las que ya no escribo tanto en el blog; mi energ\u00eda creativa escribiendo suelo gastarla en los m\u00faltiples libros que tengo en distintos grados de avance. Y no me molesta para nada la idea de que mi principal legado (adem\u00e1s de los alumnos que formo) sean varios libros de texto para materias de programaci\u00f3n&#8230; que probablemente se vuelvan obsoletos a los pocos a\u00f1os, porque la computaci\u00f3n avanza a una velocidad vertiginosa.<\/p>\n<span style=\"font-size:small\"><a href=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/2018\/11\/09\/estructuras-de-datos-con-java-moderno\/print\/\" title=\"Imprimir entrada\" rel=\"nofollow\"><img decoding=\"async\" class=\"WP-PrintIcon\" src=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-content\/plugins\/wp-print\/images\/printer_famfamfam.gif\" alt=\"Imprimir entrada\" title=\"Imprimir entrada\" style=\"border: 0px;\" \/><\/a>&nbsp;<a href=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/2018\/11\/09\/estructuras-de-datos-con-java-moderno\/print\/\" title=\"Imprimir entrada\" rel=\"nofollow\">Imprimir entrada<\/a><\/span>","protected":false},"excerpt":{"rendered":"<p>Me gusta pensar que soy altamente funcional (me parece que hay evidencia suficiente de que esto es cierto); y yo supongo que esto es en gran medida porque me conozco y s\u00e9 qu\u00e9 es en general lo que me define como persona. Y como siempre he estado en gran medida de acuerdo con la teor\u00eda &hellip; <a href=\"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/2018\/11\/09\/estructuras-de-datos-con-java-moderno\/\" class=\"more-link\">Sigue leyendo <span class=\"screen-reader-text\">Estructuras de Datos con Java moderno<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-5211","post","type-post","status-publish","format-standard","hentry","category-academia"],"_links":{"self":[{"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/posts\/5211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/comments?post=5211"}],"version-history":[{"count":23,"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/posts\/5211\/revisions"}],"predecessor-version":[{"id":5685,"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/posts\/5211\/revisions\/5685"}],"wp:attachment":[{"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/media?parent=5211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/categories?post=5211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aztlan.fciencias.unam.mx\/pensadero\/wp-json\/wp\/v2\/tags?post=5211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}