Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Aplicaciones de consola fáciles? Más quisieramos

32 visualizaciones

Publicado el

Charla en la NetCoreConf de Barcelona (Enero 2019) donde conté como desarrollar aplicaciones de consola avanzadas cross-platform. Expliqué las diferencias entre el terminal *NIX (Linux/MacOS) y la consola de Windows. Comenté termcap/terminfo, códigos de escape, modelos de color y novedades de Windows 10 como conpty.

Publicado en: Tecnología
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Aplicaciones de consola fáciles? Más quisieramos

  1. 1. 2019 Netcoreconf Aplicaciones de consola fáciles? Más quisiéramos! Eduard Tomàs i Avellana Compulsive Developer @ Plain Concepts @eiximenis
  2. 2. Aplicaciones de consola fáciles? Más quisiéramos 
  3. 3. Sponsors
  4. 4. Quién soy yo? • Desarrollador @ PlainConcepts • Cervecero aficionado • Padre orgulloso • Speaker donde me dejen • Empecé a programar en una Odissey… ¡y hasta ahora! • Microsoft MVP desde 2012
  5. 5. ¿Por qué de esa charla?
  6. 6. ¿Pero… eso todavía existe? • Dwarf fortress - http://www.bay12games.com/dwarves/ • Actualmente en desarrollo (desde 2006) • Jugadores estimados: ~150K
  7. 7. ¿Qué vamos a ver? • El terminal en el mundo *NIX • El terminal en el mundo Windows • Novedades de Windows 10 • Desarrollando en cross-platform con netstandard
  8. 8. El terminal en *NIX
  9. 9. Terminales • *NIX es compatible con gran cantidad de terminales • Dispositivos terminal válidos van desde el teletipo hasta un monitor 8K
  10. 10. Arquitectura del terminal
  11. 11. Arquitectura del terminal
  12. 12. En *NIX todo es un fichero • No existe concepto de pantalla • No existe concepto de cursor • No existe concepto de colores • No existe concepto de teclado • Y por supuesto... No existe concepto de ratón
  13. 13. Solución: carácteres especiales • ASCII: 7 bits • 128 caracteres • 95 caracteres imprimibles (letras, números, símbolos) • 33 caracteres especiales y de control
  14. 14. Vienes usándolos toda tu vida
  15. 15. Secuencias de carácteres • Los fabricantes de terminales introdujeron secuencias de carácteres propias para realizar ciertas tareas • Sin ninguna estandarización
  16. 16. Termcap / Terminfo • “BBDD” incluída en *NIX que contiene • Una lista de terminales “conocidos” • Capacidades de cada terminal • Secuencia de control que debe mandarse para dicha capacidad en cada terminal
  17. 17. Termcap / Terminfo vs ANSI • En los 1976 se creó un estándard ANSI para poner orden • Secuencias de escape ANSI • A no ser que quieras soportar terminals MUY antiguos no debes preocuparte de termcap/terminfo • Adhiérete a los códigos ANSI y vas sobrado. • MS-DOS: Soporta parcialmente códigos ANSI • Atari ST: Soporta ANSI aunqué con extensions propias  • AmigaOS: Soporta ANSI, tanto en pantalla como en impresora • Windows: ejem, ejem, ejem…
  18. 18. Entrada (teclado y ratón) • Recuerda: solo puedes leer carácteres • Ciertas combinaciones de carácteres indicarán teclas pulsadas • Algunas teclas son complicadas/imposibles de detectar (ALT) • No existen eventos tipo “OnKeyDown/OnKeyUp”
  19. 19. El terminal en Windows
  20. 20. En Windows todo es un objeto • API específica para pantalla • API específica para cursor • Soporte específico para colores • Soporte específico para teclado • Y sí: soporte de ratón (aunque lo veas poco)
  21. 21. Win32 Console API • API de Consola nativa de Windows • Sin apenas cambios desde Windows 2000 • La consola existe como concepto en Windows y la API llega mucho más lejos de lo que llega la contraparte *NIX • Win32 también soporta ver el terminal como un fichero, aunque eso está muy limitado.
  22. 22. Colores
  23. 23. Modos de color • ANSI (8*2 colores) • 256 colors (xterm-256) • True color (16M). • Win32: Soporte para 8*2 colores
  24. 24. Soporte de modos de color • *NIX: Out of the box usando la secuencia correcta • Win32: Limitado a 8*2 colores • ¿Puedo soportar +16 colores en Windows? • Respuesta corta: NO • Respuesta larga: Depende…
  25. 25. Modos de color avanzados en Win32 • Windows 10 soporta secuencias de escape ANSI • https://docs.microsoft.com/en-us/windows/console/console- virtual-terminal-sequences • Basta con usar secuencias de escape xterm-256 para tener 256 colores en Windows • Aunque para ello la consola debe tener el modo ENABLE_VIRTUAL_TERMINAL_PROCESSING • ¡La API de Consola NO LO SOPORTA!
  26. 26. Novedades de Windows 10
  27. 27. *NIX vs Win • En *NIX el usuario lanza un terminal y desde el terminal una app • En Windows el usuario nunca lanza la consola (conhost). La consola la crea la app • Sí: cmd.exe no es una consola. Cmd.exe es una app que lee desde conhost.exe y escribe a conhost.exe
  28. 28. *NIX vs Win • Tanto en Win como en *NIX la app y la consola son procesos separados  • En *NIX se comunican vía texto. En Win via IOCTL • En Windows la consola es siempre conhost.exe. • Windows controla la creación de pipes mediante los que se comunican la consola y la app • De verdad, que cosas como ConEmu, Console2 y similares funcionen en Windows es casi un milagro del desarollo.
  29. 29. Windows 10 ConPTY • Windows 10 introduce por primera vez una arquitectura PTY • PTY: Pseudo terminal. S/W que parece a un terminal físico (tty) pero que en lugar de comunicarse con un terminal físico real lo hace con otro programa • Eso abre la puerta a multiplexar aplicaciones de consola y a poder (¡por fin!) reemplazar conhost y simplifica el remoting de apps Windows 10
  30. 30. Arquitectura consola Win10 - 1803
  31. 31. Windows 10 ConPTY
  32. 32. Windows 10 ConPTY • El uso de PTY simplifica enormemente el remoting de aplicaciones de línea de comandos
  33. 33. Remoting usando ConPTY • El uso de PTY simplifica enormemente el remoting de aplicaciones de línea de comandos
  34. 34. Aplicaciones cross-platform con netstandard
  35. 35. Consola en netstandard • En consola netstandard soporta: • 8*2 colores • Lectura/escritura desde y a consola • Abstrae parcialmente el teclado • Cursor • No soporta / abstrae • Ratón • Modos avanzados de color • Teclado al 100%
  36. 36. System. Console Aplicaciones cross-platform: win +16 colores? Ratón? Secuenci as ANSI Win32 Console API Win < Win10? NONO SÍ SÍ Win32 Console API
  37. 37. System. Console Aplicaciones cross-platform: *NIX +16 colores? Ratón? Secuenci as ANSI Terminfo Terminal es antiguos ? NONO SÍ SÍ Terminal es antiguos ? Secuenci as ANSI TerminfoSÍ
  38. 38. Aplicaciones cross-platform • Para usar Win32 Console API o terminfo necesitas usar p/invoke • El uso de terminfo directamente es muy pesado así que en *NIX se desarrolló una librería que se ha convertido es standard de facto
  39. 39. (n)curses • ncurses es una librería que se encarga de gestionar el terminal en *NIX • Usa termcap/terminfo por lo que soporta cualquier terminal • Unifica el tratamiento de terminales, pero a cambio viene con sus propias abstracciones (p. ej. Color Pairs).
  40. 40. Una aproximación hoy en día • Para realizar una app cross-platform con netstandard hay que separar el modulo que interacciona con el terminal y ofrecer varias implementaciones: • Ncurses: Para *NIX usando ncurses. • Win32 API: Para Windows 7 y anteriores • VT-ANSI + Win32 API: Para Windows 10 • System.Console: Para cualquier plataforma. Limitado
  41. 41. Librerías cross-platform • Gui.cs (Miguel De Icaza) • https://github.com/migueldeicaza/gui.cs • Drivers de System.Console, Win32, ncurses • Console framework • http://elw00d.github.io/consoleframework/ • Drivers de Win32, ncurses • TVision2 (mía, eso es puro autobombo xD) • https://github.com/eiximenis/tvision2 • Drivers de System.Console, Win32, ncurses, VT-ANSI, termcap
  42. 42. Sponsors
  43. 43. Más información: info@netcoreconf.com @Netcoreconf Visítanos en: 2019.Netcoreconf.com

×