Juanma, una vez más, lo que sucede es que utilizar "tecnologías web para escritorio" está muy cogido por los pelos, cuando lo que se quiere decir es que se utiliza sólo JavaScript para escribir una app; y, por lo tanto, se está hablando de nodejs/electron exclusivamente.
Sucede, además, que el submundo JavaScript reune las peores derivadas del software libre: muchísimo contenido incompleto, duplicado, no mantenido, volátil... Viniendo del hardware, y de proyectos más o menos estructurados, a mí también me costó entender el porqué de tanto gestor de paquetes. De hecho, todavía pienso que es "mejor" una lista de repositorios de git + curl/wget en un script en shell. Pero, no estamos aquí para explicar el contexto que nos ha llevado a esta situación. Intentemos entender qué hacen las herramientas y por qué lo hacen, sin meternos en por qué se hace de esa forma en concreto.
Olvídemonos de icestudio, inbit, y de nodejs/electron. Pensemos en una aplicación web "de verdad", de hace 10 años, con partes claramente diferenciadas:
- Frontend, que se ejecuta en el navegador del usuario, el cliente: HTML, CSS, JS...
- Backend, que se ejecuta en la máquina que contiene el servicio, el servidor: PHP, C, Java, Python, Golang...
- Comunicación frontend-backend: AJAX.
Para cada una de las partes de la app hace falta diferentes librerías. Cada librería hay que descargarla de la página que corresponda. Cuando el desarrollador de la librería publica una nueva versión, hay que enterarse de ello, volver a descargarla y comprobar que nada se rompa (es decir, revisar el changelog para ver si es una actualización menor o mayor -con breaking changes-). En ese contexto digamos que a los desarrolladores de npm se les ocurrió lo siguiente:
NOTA: no, no se les ocurrió a ellos, sino que se basaron en CPAN o CTAN. Mas, asumamos este discurso en aras de facilitar el seguimiento de la historieta.
- Crear un servidor centralizado al que cualquiera puede añadir un paquete/librería.
- Crear un formato de archivo en el que defines el nombre de una librería y defines también qué versión o qué rango de versiones de la misma quieres utilizar.
- Una aplicación cli que mira tu fichero, comprueba el servidor central y actualiza tu copia local de la librería, si procede.
La ventaja principal, en principio, es que todas las actualizaciones sin breaking changes se pueden aplicar automáticamente. Lo cual es decir mucho, porque presupone que te fías del buen criterio de todos los mantenedores de todas las librerías a la hora de cambiar los números de versión. En cualquier caso, cuando las librerías estaban publicadas cada una de forma diferente, el servidor central cumplía su función. Hoy día, que la inmensa mayoría (por no decir todas) las librerías están en GitHub, el servidor central deja de tener sentido. De hecho, tanto npm como yarn admiten hoy en día la utilización de repos de github en lugar del registro central de npm. Por ejemplo, ver angular-google-analytics, splitargs o toastr en https://github.com/portainer/portainer/blob/develop/package.json
NOTA: algunas versiones de npm no permiten mezclar el formato de repo de github con los "filtros" de versión (~, ^, etc.).
Si no me equivoco, npm es totalmente jerárquico y duplica las dependencias aunque sean compartidas. Por eso surgió bower y seguramente esto es lo que has leído sobre "flat": bower comprueba si varias librerías tienen dependencias comunes e intenta averiguar si son necesarias varias versiones diferentes de las dependencias comunes o si puede descargar una sola. Por ejemplo, supongamos que la librería A depende de JQuary 3.2.1 y la librería B depende de JQuery 3.2.2. En principio, las dos funcionarán con una sola copia de cualquier versión 3.2.x (sea .1, .2 o .9), por lo que bower sólo decarga una.
Por otro lado, en lo que respecta al frontend, más tarde se extendieron conceptos como minification, uglification, transcoders, etc. No voy a entrar en detalles. Sólo explicar que el objetivo es coger todos los ficheros que componen el frontend (tu código y todas las librerías) y empaquetarlo en uno sólo. Las razones son varias:
- Reducir el peso del contenido que el usuario/cliente/navegador tiene que descargar para ver la página/app.
- Simplificar la lógica para acelerar la ejecución.
- Facilitar el uso en múltiples navegadores, con diferentes niveles de soporte de los estándares.
Nótese que estos pasos requieren modificar el código fuente de nuestra app hasta dejarlo irreconocible. Este proceso es, en mi opinión, una de las razones por las que los autores de bower han "matado" el proyecto. ¿Qué sentido tiene preocuparse por mantener una esctructura "sencilla" de ficheros si al final se van a coger sólo los que hacen falta y se van a juntar/empaquetar en uno? Total, a los desarrolladores JavaScript, en general, no les preocupa mucho tener el equipo lleno de basura de dudosa utilidad.
Esta es la razón también por la cual inicialmente npm se utilizaba para gestionar las dependencias del backend y bower para las del frontend, pero ya no. Si la única ventaja de bower deja de tener sentido ¿por qué no utilizar npm para ambos grupos? En el package.json de portainer puedes ver cómo "dependencies" son las librerías que hasta hace un mes se gestionaban con bower (las del frontend) y "devdependencies" son las que no son del frontend.
A partir de aquí, ¿qué aporta yarn? La verdad es que "poco" con respecto a npm, pero muy importante. Principalmente que gestiona los repo git sin problemas (incluso aplicando los filtros de versión a tags/branches) y que asegura que todos los desarrolladores/colaboradores van a utilizar exactamente la misma versión de cada librería. Con npm las versiones utilizadas son equivalentes o compatibles, pero no hay un mecanismo que garantice que son exactamente las mismas fuentes. Esto naturalmente sólo es relevante en proyectos con más de un desarollador activo. Tiene poca o ninguna utilidad en proyectos individuales que se hacen públicos.
Y, ¿qué aporta webpack? Es un empaquetador, no un gestor de librerías. Es una de las herramientas que se puede utilizar la minification, uglification, transcoding, etc. Es decir, npm + webpack o yarn + webpack.
Fíjate que hasta hora me he centrado en el frontend. ¿Por qué? Porque JavaScript es un lenguaje de scripting para frontends web, así se diseñó y para eso es "bueno". Cuando Google publicó su JavaScript engine (aka V8) y basado en ello se publicó nodejs, se rompieron un poco los esquemas:
Por un lado surgieron herramientas escritas en JavaScript que no eran para el frontend, sino para gestionar/automatizar el desarrollo. Algunos nombres conocidos son grunt o gulp. ¿Qué diferencia hay entre estos y un conjunto de scripts en shell? Absolutamente nada. Bueno, sí, que para usar una shell hay que saber usar una shell. De hecho, los desarolladores web con cierta experiencia tienen suficiente con npm/yarn y scripts. Más aún, casi todos los gruntfile que he visto por ahí tienen alguna parte en shell.
Por otro lado, V8 y nodejs incluyen librerías escritas en JavaScript que permiten ignorar la característica principal que diferencia el frontend del backend: el backend puede acceder al sistema de ficheros en el que se está ejecutando, el frontend no. Como derivada, no hay que saber cómo se transmite la información en la web, sino que son llamadas a funciones sin más.
Para rizar más el rizo, todas las librerías JS, ya sean para frontend, backend, comunicación o automatización, se gestionan de forma idéntica. No hay siquiera alguna etiqueta orientativa para nuevos usuarios.
La caja de pandora ya está abierta y el marketing es impecable: escribe un programa completo en JS sin saber nada en absoluto sobre arquitectura de aplicaciones ni sobre qué es una comunicación entre dos aplicaciones. De hecho, sin tener ni idea de las muchas capas que hay desde tu script hasta el código máquina. Va a ser pesado, ineficiente, y habrá bugs imposibles de depurar, pero como el target es quien sabe poco o nada de programación, tampoco va a saber apreciarlo. Si una librería no funciona, cambiará a otra o copiará algún otro snippet que encuentre por ahí.
En conclusión, si quieres aprender "tecnologías web", huye de nodejs/electron como plataforma. Escribe un frontend en HTML/CSS/JS y escoge el lenguaje que más te guste para el backend (yo voto por golang porque es estúpidamente sencillo, pero te sirven Python, Java...). Hazlo a mano, es decir, sin grunt ni gulp ni similares. Cuando hayas entendido qué gestores y empaquetadores necesitas para el frontend, cuáles para el backend y cómo puedes comunicar ambas partes, sólo entonces, y sólo si lo necesitas, cambia a nodejs/electron. ¿Para qué necesitas nodejs/electron en este caso? En realidad para nada, porque ya tienes un navegador en cualquier equipo que utilices. Pero puede que quieras ponerte "elegante" y querer que tu app esté empaquetada en su propia ventana y con su propio ejecutable, además de no tener que preocuparte por el soporte en navegadores diferentes de Chrome. Ver, por ejemplo, Syncthing y Synctrayzor.
¿Por qué te recomiendo este camino y no el sugerido en Inbit? Para tratar de evitar que llegues a la situación de icestudio: una aplicación escrita con tecnologías web que no puede utilizarse en la web sin reescribirse prácticamente por completo (porque quién sabe dónde está la línea entre el frontend y el backend). El hecho de que se utilicen uno o varios gestores de paquetes y el cacao mental que eso te pueda producir es más o menos irrelevante en comparación con este hecho. Léase: dejar de utilizar bower es trivial, hacer un icestudio cliente-servidor no. Estudiar tecnologías web para al final darte cuenta de que no vas a poder hacer una web (single page application) es un chasco.
Ahora bien, si no tienes inconveniente en que tu aplicación esté limitada a su uso en el escritorio y si realmente tienes claro en qué parte estás trabajando en cada momento, a pesar de hacerlo todo en JavaScript, adelante. Aún así, si estas en esta situación, ¿estás seguro de querer utilizar tecnologías web? ¿Por qué no gtk/Qt/QML con los bindings que más te gusten (digamos Python)? Conozco la respuesta, sólo son preguntas retóricas para dar a entender que HTML/CSS/JS son una alternativa razonable a Qt/QML, no a C++. Donde "alternativa razonable" incluye tanto rendimiento/eficiencia como tiempo de desarrollo.
Saludos
Buenas Unai, como siempre encantado de leer un post tuyo.
Sí, tienes razón... me surgen muchas dudas de conceptos a los que no les veo lógica ninguna (la pregunta de mi post anterior es solo una de ellas).Ahora estoy investigando el código más reciente de icestudio y, por lo poco que llevo visto, creo entender que usa el dúo nodejs/angular en lugar de nodejs/electron. Además de, por supuesto, Grunt para la automatización de tareas y Bower como gestor de paquetes del frontend. (Cuando tenga claro este punto del dúo de actores lo confirmo... por ahora tengo los pies de barro en este tema... es solo una creencia mezclada con especulación... :))) ).
Un ejemplo muy claro de otra de las dudas que tenía.... ¿Por qué un servidor central "exclusivo" para el código JavaScript? :))
¡Pues otra duda más resuelta!. :))))Una duda que me surgió investigando las herramientas que usa icestudio... ¿Para qué se usa Grunt si simplemente realiza tareas de shell cuando se podrían usar los scripts desde la línea de comandos directamente? Según tu párrafo anterior...está claro, realmente no sería necesario. Es una carga más de código de biblioteca, con una dependencia más de versiones que, además, se podría evitar si se quisiera. :(
De acuerdo en todo, la sensación de modificar algo para probar (hablo ahora de Icestudio), echar a ejecutar la tarea con Grunt y ver en consola "grunt serve" sin ningún mensaje más.... y dos minutos después aparece una ventana y al otro minuto aparece por fin el título de la misma, el menú y el entorno... no tienes más que pensar y preguntarte,... "¿Por qué tarda tanto? (Esto es pesado... ), ¿Y todo esto para mostrar una ventana y un menú? (Ineficiente...) y sin saber qué está pasando mientras tanto... ¿Qué pasa si hay un bug?¿Cómo sé en que punto encontrarlo?... Por si acaso hago pruebas de poco a poco...y entre prueba y prueba me da tiempo a apuntar mis ideas... por si acaso y por aprovechar los tiempos muertos..." :))
El problema y la cuestión es que realmente no quiero aprender "tecnologías web" porque sí,... no es que las vaya a utilizar en mi día a día... si por algo me interesan es porque son estas tecnologías las que utiliza icestudio y solo me interesan por eso (a día de hoy)... porque me gustaría poder modificar y ampliar icestudio para intentar plasmar alguna de mis ideas con las FPGA y eliminar así parte de las limitaciones que le veo a la herramienta aprovechando las virtudes que tiene (que son muchas)... y por lo que veo y a la conclusión que he llegado durante estos dos años es que la única forma de hacerlo es "empaparme" de estas tecnologías por mi cuenta y desentrañar el código fichero a fichero, para poder modificar mínimamente el sistema, que el sistema haga lo que me interesa que haga y todo esto sin que se "desmorone" por completo al primer intento... ;)))
Esa es otra duda que se me planteó... Si esto son tecnologías web... ¿Para qué necesito pasar por Electron para las pruebas?¿No podría hacer las pruebas con un navegador y luego, si quiero "ponerme elegante" como dices, utilizar Electron o similar?Incluso más allá... ¿Podría separar el código de icestudio para ejecutar el backend en una máquina separada y distinta de la que corre el frontend? Esto último estaría muy interesante... :)))
A parte de esto...¿Se te ocurre otra forma de poder modificar y añadir una funcionalidad (aunque sea mínima) a icestudio sin morir en el intento, sin necesitar "empaparse" en estas tecnologías hasta el detalle y sin tener que reescribir el código en un programa distinto? :)))
Sinceramente creo que no... bueno, de hecho estoy convencido de que las barreras las voy a tener que bajar yo solo, por mi cuenta y a cabezazos... jajajajajajajaja
Vale, ya no tengo que esperar a tu siguiente post... ya me has contestado... jejejejejeje
Por lo que leo... No es trivial convertir icestudio en un cliente-servidor porque está todo mezclado... frontend y backend. ¿Qué solución existe? ¿Tan complicado sería tomar el código JavaScript y reordenarlo para poner los paquetes de npm en el backend (y solo en el servidor) y los de bower en el frontend? ¿Qué paquetes son los que hacen tan difícil esta separación si en principio están separados conceptualmente desde el inicio?
Sé que es un poco recurrente todo esto y te pido disculpas... pero debe haber alguna forma de "reciclar" el código...¿No? :(((¿O cúal es tu consejo? ¿Que directamente ni lo intente? ¿No tiene solución icestudio? ¿No podré sentirme nunca verdaderamente libre con icestudio por mucho que me esfuerce en intentar comprenderlo y asimilarlo, aunque sea desde el propio código, para finalmente poder y tener la capacidad de modificarlo? :(((
Me lo pones muy mal si es así... :_(((
Muchas gracias como siempre por tus posts. Se aprende mucho. ;)
Fileteado:
Juanma Rico escribió:Buenas Unai, como siempre encantado de leer un post tuyo.Un placer. Me viene muy bien para afianzar conceptos y ver si soy capaz de explicarlo tan claro como parezco tenerlo.
Sí, tienes razón... me surgen muchas dudas de conceptos a los que no les veo lógica ninguna (la pregunta de mi post anterior es solo una de ellas).Ahora estoy investigando el código más reciente de icestudio y, por lo poco que llevo visto, creo entender que usa el dúo nodejs/angular en lugar de nodejs/electron. Además de, por supuesto, Grunt para la automatización de tareas y Bower como gestor de paquetes del frontend. (Cuando tenga claro este punto del dúo de actores lo confirmo... por ahora tengo los pies de barro en este tema... es solo una creencia mezclada con especulación... :))) ).Cuando escribo nodejs/electron me refiero a usar uno o el otro. De hecho, en la práctica, me refiero sólo a electron, siendo el prefijo nodejs sólo para subrayar que electron utiliza nodejs por debajo: https://github.com/electron/electron/blob/master/docs/development/atom-shell-vs-node-webkit.md
AngularJS es una librería para frontend. Concretamente, para crear single-page applications (SPAs). Otras librerías/framework similares son Vue.js, React, Ember... El objetivo de estas librerías es facilitar la descripción de múltiples páginas HTML, sin tener que crear cada una por separado. No tienen nada que ver con nodejs/electron. Por ejemplo, en el caso de portainer puedes ver que hay una carpeta "app" con todas las fuentes referentes al frontend angular, y otra carpeta separada llamada "api" que contiene el backend en golang. Se podría reescribir "api" en JS y utilizar electron para empaquetarlo, sin cambiar el frontend (angular).Por lo tanto, icestudio utiliza electron para el "backend" y angular para el "frontend". Mi recomendación anterior sobre analizar las tecnologías web por separado va en esta línea. En principio, no necesitas saber sobre electron para trabajar en el frontend, y tampoco necesitas saber sobre angular para trabajar en el backend.
Un ejemplo muy claro de otra de las dudas que tenía.... ¿Por qué un servidor central "exclusivo" para el código JavaScript? :))Creo que la pregunta sería, ¿por qué más de un servidor central "exclusivo"? Que haya uno no es tan raro. He ahí CPAN o CTAN, proyectos muy exitosos y longevos ya. Lo extraordinario era que bower tuviera el suyo y npm otro diferente. ¿Podríamos vivir sin CPAN, CTAN y npmjs? Por supuesto. Pero no creo que esté de más un espacio independiente de servicios de hosting con características específicas (como GitHub).
¡Pues otra duda más resuelta!. :))))Una duda que me surgió investigando las herramientas que usa icestudio... ¿Para qué se usa Grunt si simplemente realiza tareas de shell cuando se podrían usar los scripts desde la línea de comandos directamente? Según tu párrafo anterior...está claro, realmente no sería necesario. Es una carga más de código de biblioteca, con una dependencia más de versiones que, además, se podría evitar si se quisiera. :(Si, pero no XD. Para la complejidad que estamos tratando en este hilo, es como dices. Pero, para ser sinceros, hay ciertos plugins de grunt que hacen cosas no tan directas. Más concretamente hay proyectos que no utilizan webpack, por lo que las tareas de concatenación/merge de ficheros + renombrar los paquetes resultantes para que tenga un nombre único (filerev) + reemplazar las líneas de tipo include en el HTML... se hacen en grunt. Todo esto podría hacerse mediante scripts, pero no conozco ninguna alternativa escrita en un lenguaje que no sea JS.Por lo tanto, así como quitar bower es sencillo y directo, dependiendo de la complejidad del proyecto dejar de usar grunt puede no serlo tanto. Por otro lado, si necesitas instalar nodejs porque vas a utilizar npm o yarn como gestor de paquetes, ¿qué más da instalar otro paquete más? Dejar de usar grunt sólo tendría sentido si descargas los paquetes mediante scripts y si tu aplicación no utiliza nodejs.
De acuerdo en todo, la sensación de modificar algo para probar (hablo ahora de Icestudio), echar a ejecutar la tarea con Grunt y ver en consola "grunt serve" sin ningún mensaje más.... y dos minutos después aparece una ventana y al otro minuto aparece por fin el título de la misma, el menú y el entorno... no tienes más que pensar y preguntarte,... "¿Por qué tarda tanto? (Esto es pesado... ), ¿Y todo esto para mostrar una ventana y un menú? (Ineficiente...) y sin saber qué está pasando mientras tanto... ¿Qué pasa si hay un bug?¿Cómo sé en que punto encontrarlo?... Por si acaso hago pruebas de poco a poco...y entre prueba y prueba me da tiempo a apuntar mis ideas... por si acaso y por aprovechar los tiempos muertos..." :))En realidad, que sea pesado y/o ineficiente no creo que sea lo peor. Demostrado está que para el nivel de exigencia de los usuarios de icestudio es suficiente. La eficiencia sería relevante para trabajar en proyectos medianamente reales, pero parece ser que ese no es el target de icestudio ni está en el roadmap.Lo "peor" de Grunt es que se lo come todo sin rechistar. Es decir, tú le dices que quieres concatenar diez ficheros, y si no existen simplemente los ignora y junta los que si haya. De esto no te das cuenta hasta que no lanzas la app y ves que sólo aparece una página en blanco. Te vas a la consola del navegador y empiezas a ver errores (de carga de librerías) por todas partes. Es un "bug" muy entretenido para perder un par de tardes, porque funcione bien o funcione mal el proceso de build siempre acaba sin errores.
El problema y la cuestión es que realmente no quiero aprender "tecnologías web" porque sí,... no es que las vaya a utilizar en mi día a día... si por algo me interesan es porque son estas tecnologías las que utiliza icestudio y solo me interesan por eso (a día de hoy)... porque me gustaría poder modificar y ampliar icestudio para intentar plasmar alguna de mis ideas con las FPGA y eliminar así parte de las limitaciones que le veo a la herramienta aprovechando las virtudes que tiene (que son muchas)... y por lo que veo y a la conclusión que he llegado durante estos dos años es que la única forma de hacerlo es "empaparme" de estas tecnologías por mi cuenta y desentrañar el código fichero a fichero, para poder modificar mínimamente el sistema, que el sistema haga lo que me interesa que haga y todo esto sin que se "desmorone" por completo al primer intento... ;)))Por supuesto. No me refería a hacer una app de verdad completa. Sino a uno o varios juguetes, como inbit, en los que analices cada cosa por separado. Por ejemplo, una app en angular (utilizando como backend Apache o cualquier otro servidor web). El objetivo final es que tengas claro cuales son las "trampas" que hacen nodejs/electron antes de entrar en un proyecto que parece ser monolítico. No importa que icestudio tenga el frontend y el backend mezclados, si tú eres capaz de saber qué estás haciendo en cada momento. Pero es difícil que seas capaz si no tienes claro cómo se haría por separado.
BTW, aguita con AngularJS. Tienes que hacer las cosas "al estilo angular". Una vez que lo pillas, está bastante bien. Hasta que lo haces, te pegas continuamente cabezazos contra la pared. Es muy muy muy poco intuitivo para alguien que venga de hacer webs a mano o en PHP. En este sentido Vue.js o Ember son menos invasivos (también son más a bajo nivel). Una vez más, no sugiero que reescribas icestudio con uno de estos frameworks. Simplemente creo que el camino natural es empezar por un juguete en HTML + CSS, después meter algo de JS vanilla, luego utilizar jQuery, probar algún framework no invasivo y finalmente pasar a AngularJS. Yo hice este "recorrido" en un par de tardes (una para documentarme y otra para cacharrear) y tengo que admitir que es bastante satisfactorio, en el sentido en que ves tu progresión muy claramente, en vez de desesperarte porque no "entiendes" el paso final sin haber dado los anteriores.NOTA: me refiero en todo momento a Angular 1.x, AngularJS o como quiera que se llame la versión vieja escrita en JS, que es la que he utilizado y la que creo que utiliza icestudio. La versión actual (Angular, Angular 2.x, Angular 2+...) está escrita en TypeScript. Resumamoslo en que no queremos meternos en el fregado de ECMAScript 5, ECMAScript 6 y el soporte desigual de los navegadores. Si quieres remangarte y meterte en ello, esto es a lo que me referia con transcoding/transcompilation y la posibilidad de utilizar webpack.
Esa es otra duda que se me planteó... Si esto son tecnologías web... ¿Para qué necesito pasar por Electron para las pruebas?¿No podría hacer las pruebas con un navegador y luego, si quiero "ponerme elegante" como dices, utilizar Electron o similar?Incluso más allá... ¿Podría separar el código de icestudio para ejecutar el backend en una máquina separada y distinta de la que corre el frontend? Esto último estaría muy interesante... :)))Respondo debajo.A parte de esto...¿Se te ocurre otra forma de poder modificar y añadir una funcionalidad (aunque sea mínima) a icestudio sin morir en el intento, sin necesitar "empaparse" en estas tecnologías hasta el detalle y sin tener que reescribir el código en un programa distinto? :)))Aquí tengo una limitación personal. Tengo cierta necesidad vital por entender lo que hago, por lo que casi nunca meto mano a algo sin haberme "empapado" antes. Necesito interiorizar la tecnología que estoy utilizando para no tener cierta ansiedad por sentir que me estoy dejando algo o que voy a atascarme en un bug estúpido por no tener claro el marco en el que estoy. Así que, en este sentido, poco puedo ayudarte, salvo en facilitarte los recursos y explicaciones que me ayudaron a empaparme.
En cuanto a reescribir el código en un programa distinto, como he comentado, me refería a juguetes para tu proceso de aprendizaje. Entiendo que, una vez que hayas aprendido por separado, podrás ir al código de icestudio y estudiar su estructura lógica que es lo que te interesa. Necesitas educar el ojo y la cabeza primero, para quitar la paja al mirar el código, es decir, para no desviar tu atención en cuestiones de sintaxis o detalles de uso de librerías.Sinceramente creo que no... bueno, de hecho estoy convencido de que las barreras las voy a tener que bajar yo solo, por mi cuenta y a cabezazos... jajajajajajajajaBásicamente. Es cierto que para aprender a utilizar electron, angular, bower, npm, yarn, grunt... te darás cabezazos, pero tienes muchísima información y ejemplos en internet, libros sobre ello, videotutoriales... Algo bueno tiene que tener tanto hype.
Sin embargo, aunque consigas dominar todas esas herramientas, seguiras sin saber cómo está estructurada la aplicación, qué funciones hay, cuáles son los puntos de entrada, cuáles las auxiliares, por qué hay algunas directivas y no otras, qué funcionalidades deben ir en icestudio y cuáles en apio... Facilitar toda o parte de esta información depende del arquitecto de la aplicación. Ojo, que no estoy exigiendo nada. De hecho, es posible que haya herramientas para obtener información automáticamente. Simplemente creo que es la clave entre un proyecto que busca proactivamente la colaboración y uno que no.
Vale, ya no tengo que esperar a tu siguiente post... ya me has contestado... jejejejejeje
Por lo que leo... No es trivial convertir icestudio en un cliente-servidor porque está todo mezclado... frontend y backend. ¿Qué solución existe? ¿Tan complicado sería tomar el código JavaScript y reordenarlo para poner los paquetes de npm en el backend (y solo en el servidor) y los de bower en el frontend? ¿Qué paquetes son los que hacen tan difícil esta separación si en principio están separados conceptualmente desde el inicio?Sinceramente, es un brindis al sol. No he analizado icestudio con suficiente detalle como para evaluar cómo de fácil o difícil es la conversión. Mi afirmación viene motivada por las respuestas que ha dado Jesús cuando se le ha preguntado por ello: de memoria, algo así como "icestudio está hecho con tecnologías web, por lo que podría convertirse" e "icestudio es un proyecto abierto y cualquier colaboración es bienvenida". Yo lo interpreto como "no lo pensé cuando empecé a escribir icestudio y no voy a ponerme a pensar en ello ahora".
¿Sería complicado reordenar el código para tener las tareas/funciones relativas al frontend por un lado y las del backend por otro? En principio, no.¿Qué paquetes son los que lo hacen difícil? Ninguno.¿Cuál es el problema entonces? El acceso a disco y, por consiguiente, a los ejecutables disponibles nativamente. En otras palabras, si a icestudio le quitas "el enlace" a apio, yosys, icestorm, etc. ya puedes utilizar icestudio como una app cliente sólo (angular), y servirla desde cualquier servidor web. Esto responde a cómo puedes probar icestudio sin electron. Desde mi punto de vista seguiría siendo útil, porque utilizaría icestudio para cargar un fichero ICE, editarlo y guardar el resultado (exportado a verilog). Después, en local, ejecutaría las herramientas adecuadas con el resultado descargado. Sin embargo, entiendo que tener opciones en el menú para sintetizar y programar las placas directamente es una de las características principales de icestudio, teniendo en cuenta el público objetivo.Pongamos un ejemplo sencillo. Tenemos un formulario web con un botón y dos campos de texto: uno contiene "Hello world" y el otro contiene la ruta absoluta o relativa a un fichero (pongamos que es /home/user/hello_world.txt). Queremos que al pulsar el botón el fichero se guarde en el disco. Nótese que, aunque sea sintácticamente diferente, es irrelevante hacerlo con JS vanilla, angular o cualquier otro framework frontend. Tres formas de guardar el fichero:- Sin backend. Cuando le doy al botón, el navegador descarga el fichero. Depende de cómo esté configurado el navegador, irá directamente a Descargas o me preguntará dónde quiero guardarlo. En cualquier caso el segundo campo de texto (la path) no sirve para nada, porque el usuario lo decide al "guardar como". No es posible que una aplicación cliente guarde ficheros sin intervención del usuario. Bueno, estrictamente se puede guardar información en las cookies y en la caché del navegador, pero no en una path arbitraria del disco del usuario. Es fácil entender que esto es una limitación inherente a todos los navegadores web para evitar que cualquier página web pueda instalar malware sin más.- Con "backend" nodejs/electron. Cuando le doy al botón, el pseudo-navegador (JS engine) utiliza una función equivalente a printf para guardar el fichero directamente en la path indicada. Como el backend se ejecuta en la misma máquina que el frontend, esa path corresponde al disco del usuario.- Con un "backend" real. Cuando le doy al botón, la aplicación cliente (el frontend) crea una estructura con al menos dos campos (el texto y la path) y hace una llamada POST mediante AJAX (jQuery) a una URL (e.g. localhost/guardarfichero o miapp.com/guardarfichero). El backend está "escuchando" en esa URL, y cuando recibe el POST, extrae el texto y utiliza printf (o equivalente) para guardarlo. Como el backend no tiene por qué estar ejecutándose en la misma máquina que el frontend, el fichero no se guarda en el disco del usuario, sino en el servidor. Evidentemente, si lanzas el backend en tu misma máquina, el resultado es equivalente al caso anterior.Las opciones 1 y 3 se pueden combinar. A veces queremos que el usuario se descargue un fichero a su equipo. Otras veces queremos que se guarde en el servidor. ¿Cuándo queremos que se guarde en el servidor? Cuando el paso inmediatamente posterior es hacer otra llamada POST o GET que ejecute por ejemplo yosys (teniendo yosys instalado en el servidor, y no en el cliente). ¿Cuándo queremos que se lo descargue el usuario? Cuando el fichero es un producto/resultado, por ejemplo, el resultado de la ejecución de yosys.Esto tiene un poco más de miga, porque por un lado las llamadas AJAX son, en principio, asíncronas. Esto quiere decir que el fichero no se guarda exactamente cuando hago la llamada AJAX (POST) desde el cliente. Cuándo se ejecute la instrucción realmente depende de cuánto tarde el backend en responder. No es que el tiempo sea apreciable por el usuario, sino que a nivel de ejecución secuencial del código tu cliente va a seguir ejecutando pasos posteriores antes de que se haya terminado de escribir el fichero. Si el paso posterior necesita el fichero, fallará. Por lo tanto, es necesario pensar la lógica del cliente para que espere, si tiene que esperar, o que hagas otras cosas mientras tanto.Por otro lado, POST y GET no son las únicas formas de pasar información. También se puede hacer a través de la URL, por ejemplo, localhost/guardarfichero?text='hello world'&path='/home/user/hello_world.txt'. Nota, no estoy seguro del uso de las comillas aqui, pero creo que se entiende la idea.En cualquier caso, la idea básica es que hay que añadir un paso/función para transmitir la información del frontend al backend, considerando que cada parte puede estar escrita en un lenguaje totalmente diferente.
Sé que es un poco recurrente todo esto y te pido disculpas... pero debe haber alguna forma de "reciclar" el código...¿No? :(((¿O cúal es tu consejo? ¿Que directamente ni lo intente? ¿No tiene solución icestudio? ¿No podré sentirme nunca verdaderamente libre con icestudio por mucho que me esfuerce en intentar comprenderlo y asimilarlo, aunque sea desde el propio código, para finalmente poder y tener la capacidad de modificarlo? :(((
Me lo pones muy mal si es así... :_(((No me seas agorero, hombre. Icestudio tiene solución, puedes reciclar todo lo que quieras, y podrás sentirte libre con esfuerzo. Lo que tienes que tener claro son las limitaciones inherentes a las decisiones tecnológicas que ya se han tomado y el esfuerzo necesario para entender la arquitectura indocumentada. Por ejemplo, para convertirla en cliente-servidor, tendrías que:- Revisar todo el código para identificar todos los puntos en los que se accede a disco (manipulación de ficheros o llamadas a herramientas).- Cambiar todas las llamadas directas (e.g. printf) por dos funciones intermedias. Inicialmente, pueden ser funciones dummy, es decir, reemplazar printf por mi_printf, que mi_printf sólo contenga una llamada a mi_backend_printf y que ésta sólo llame a printf.- Mover la definición de todas esas funciones intermedias a un mismo directorio, o a un grupo de directorios, para tenerlas localizadas.A partir de ahí, reemplazar el contenido de mi_printf por una llamada AJAX, e implementar mi_backend_printf como la rutina de respuesta a la llamada. Este paso en concreto no sé si puedes hacerlo con nodejs/electron o si necesitas un backend de verdad. Si fuera así, debería haber dos versiones de las funciones, una para utilizar cuando se compile en eletron y otra para un supuesto backend de verdad. Grunt se podría utilizar para decidir cuándo usar unas y cuándo otras.Por lo tanto, mi consejo es que ni intentes esto ahora. Vas a tener que hacer suficientes modificaciones como para agarrarte un buen cabreo si luego no se incluye en el repositorio oficial, y será pesado de mantener forkeado. Si estás trabajando solo, ponte metas más asequibles. Lo ideal sería que tuvieras una lista de cosas que te gustaría cambiar, y que Jesús, que conoce el código, pudiera recomendarte por cuál(es) empezar y qué ficheros empezar a mirar.
Si aun así quieres intentarlo, yo también estoy muy interesado en una solución cliente-servidor. Creo que en algún hilo (no sé si de Lorea) ya comenté que sería muy interesante tener icestudio, apio y el resto de herramientas instaladas en un solo ordenador de un aula/centro educativo y que el alumnado pueda utilizarlo desde tablets o desde sus propios móviles. Lo que sucede es que no tengo la motivación para empollarme la app entera. Sin embargo, si hubiera un listado de funciones/tareas que deba soportar un backend para funcionar con icestudio (lo que se denomina comunmente API, ver swagger.io), me gustaría intentar implementar un backend alternativo para que nodejs/electron sea una opción, pero no la única.
Sólo por exponer la imagen completa, mi objetivo final es poder quitar apio de la ecuación también, y quedarme "solo" con el frontend de icestudio. Así, la alternativa a nodejs/electron sería una única imagen docker que ya incluya todas las herramientas precompiladas. Esa imagen sería única por arquitectura (x86_64, arm...) pero independiente del sistema operativo.
Muchas gracias como siempre por tus posts. Se aprende mucho. ;)A ver si saco tiempo un día de estos para implementar inbit sin nodejs/electron. Tengo un par de demos muy similares, pero están adaptadas para ciertos contenidos que no son públicos, por lo que tengo que "limpiarlas". Estoy convencido de que puede resultarte muy didáctico para "ver" los detalles expuestos en estos mensajes.
Saludos
Investigando en el enlace veo que Electron y NW.js hacen lo mismo, llevar al escritorio la tecnología web. Pues bien, he buscado las dependencias en icestudio y no he encontrado ninguna dependencia con Electron, pero sí con NW.js, lo que me ha hecho recordar algún post antiguo en el que se hablaba del tema y estoy por afirmar (casi con rotundidad... o no... que sé yo... :) ) que icestudio no usa Electron, sino NW.js.
jejejejejeje, ya estoy recuperando mi servidor olvidado de Apache en Debian... a mi seguramente me lleve más de dos tardes... posiblemente dos meses... jejejeje, pero haré el recorrido ese... al final me va a gustar y todo .... :))
Me seduce la idea de tener centralizado en un equipo el sintetizado con yosys y demás... se me está ocurriendo una posibilidad futura de levantar un servidor para el grupo FPGAwars... con todos los proyectos y las herramientas centralizadas... :)))
Incluso creo recordar que tú propusiste también en algún post centralizar las herramientas en un aula... lo buscaré... Abriría muchas posibilidades de colaboración. :)))
Bueno... esto ya sería la "repanocha".... ¡A por ello! (fréname, fréname que me lanzo....jajajajajaja)
Perfecto, muchas gracias, te lo agradezco.
git clone -v golang-backend https://github.com/1138-4EB/InBit
cd InBit
go get ./...
go build
Mientras tanto yo seguiré estos días investigando el código (sin profundizar demasiado para no ofuscarme) e intentaré hacer el recorrido que me has propuesto con el frontend y el backend, haciendo esos ejemplos sencillos para amueblar la cabeza... a ver cuanto tardo en llegar al final de este recorrido. :)))
Veo que voy a tener que aprender otro idioma (no tengo ni idea de Golang)... jejejejejeje
me apunto para cuando vaya al laboratorio la prueba de la imagen de Docker (necesito mi Debian de 64bits... :))) )
docker run --rm -it 11384eb/elide:alpine-run sh -l
apk update
apk add git
git clone https://github.com/juanmard/screen-logo
cd screen-logo
yosys -o output.blif -S *.v
docker run --rm -dv $(pwd):/srv -p 80:80 hacdias/filemanager --no-auth -s /srv -p 80
docker run --rm -itv $(pwd):/work 11384eb/elide:alpine-run sh -l
...
./docker_guiapp.sh --rm -it 11384eb/elide:alpine-run sh -l
Ya lo tengo funcionando... :))
No dispongo de tiempo para hacer un vídeo... pero este es el navegador en Windows7, al pulsar el interruptor los mensajes aparecen en la consola del equipo con Debian.
He tenido que establecer la variable de entorno GOPATH al directorio de InBit. Si no se establece, por omisión busca los ficheros en /home/go (sería interesante quizás se añadiera al README.md si siempre es necesario), no entiendo bien el comando "go get ./..." (¿Son tres puntos finales o dos?) , sé que se usa para las dependencias e imagino que los puntos y la barra nada tienen que ver con "subdirectorio anterior o actual"... pero bueno... ya lo averiguaremos.... :)))
export GOPATH=$(pwd)
go get github.com/gorilla/mux
go get github.com/ogier/pflag
go install github.com/1138-4EB/InBit
cd InBit
go get ./...
go run main.go -v
Pero bueno... imagino que es cuestión de leerse la ayuda con calma... :))
No me ha dado tiempo a más...
Mañana seguiremos.
Saludos
Juan Manuel Rico