OpenSource en Clojure

Run Loop invita a aquellos que hacen productos geniales con sus propias manos. Nikita Prokopov ( tonsky ), un hombre y un barco, logró hacer varios proyectos OpenSource que otras personas disfrutan usando.

En primer lugar, hablemos sobre la fuente FiraCode, Clojure y proyectos completamente diferentes, por ejemplo, el contenedor ClojureScript para React. Y luego pasemos a discusiones más generales sobre buenas interfaces, sentido común y modelos de capacitación para programadores.



Sobre el invitado : Nikita Prokopov es notable por el hecho de que creó FiraCode, hizo una contribución significativa al desarrollo de la comunidad Clojure y publicó proyectos como Datascript y Rum en OpenSource. Además, escribe en Objective-C bajo macOS: el programa AnyBar le informará sobre la ocurrencia de un evento en la barra de estado, oh, barra de menú de su computadora.

Presentadores : Roman Busygin (desarrollador de Yandex.Music para iOS) y Alexey Mileev (aplicación en el aire).

Nikita : Soy programadora de Novosibirsk, pero ahora vivo en Moscú. Estaba involucrado en proyectos web principalmente, soy aficionado a las interfaces. Recientemente he estado programando en Clojure.

Roman : Propongo construir la conversación de hoy en torno a su Código Abierto y proyectos públicos. Quiero comenzar con lo primero y más interesante para mí: es la fuente FiraCode . Es utilizado por muchos de mis colegas y yo. Siempre me interesó cómo hacer mi propia fuente, cómo sucede, si hay un programa especial, qué conocimiento necesitas tener para hacer tu propia fuente. Por favor cuenta sobre esto.

Firacode


Nikita : No es del todo correcto decir que esta es mi fuente. Tomé la fuente monoespacio terminada y terminé las ligaduras, no dibujé letras yo mismo. Para hacer las propias letras, necesita mucha experiencia y perseverancia. Es muy difícil, hay un millón de sutilezas sutiles. Hay fuentes de aficionados y siempre se puede ver que son torpes, pero no siempre está claro qué es esta cosa torpe.

Tomé una buena fuente FiraMono de Mozilla y dibujé ligaduras allí, hay varios programas para esto. Usé el programa Glyphs bastante popular. No soy un experto en diseño de fuentes, así que miré lo que otros están usando, y también lo usé. Puede sorprender que sea bastante costoso, pero me dieron una licencia para desarrollar FiraCode. Glifos es como un editor de gráficos vectoriales. Abres, hay letras, encuentras celdas y dibujas. Además, todo tipo de sutilezas asociadas con las fuentes, por ejemplo, que las letras tienen un tamaño, puntos de anclaje, transiciones de negrita a no negrita. Todo es bastante simple.

Curiosamente, dentro de la fuente OpenType hay un lenguaje de programación en base al cual se realiza este reemplazo de ligaduras. Inicialmente, se creó como un medio para la implementación de todo tipo de trucos en las fuentes. Por ejemplo, las ligaduras, cuando fi, ffi y similares en fuentes regulares se reemplazan por ligaduras. Además, hay variabilidad, estilos finales de letras: si una letra está al principio y al final de una palabra, se le agrega un poco de cola. Todo esto se puede programar utilizando patrones complicados, y también las ligaduras que hizo.

Roman : ¿Cuánto tiempo se tardó en finalizar el FiraMono al tipo de FiraCode que todos usan ahora?

Nikita : Será difícil de calcular. La primera versión no fue muy difícil. Como siempre, todo comenzó bastante rápido, pero llevó algo de tiempo descubrir qué estaba pasando y cómo implementarlo: no había muchos ejemplos.

Roman : Es decir, también hubo varias versiones. ¿Cómo se diferenciaron?

Nikita : Sí, y las versiones se están actualizando. En primer lugar, termino nuevas ligaduras, a veces elimino las viejas si entran en conflicto. En algún momento, el mecanismo para dibujar ligaduras cambió allí. En el interior hay un problema algorítmico muy interesante: hay una larga secuencia de caracteres, a partir de ella debes aislar esas combinaciones que forman las ligaduras, pero si se cruzan, entonces debe haber otro reemplazo. Incluso tengo un programa Clojure que genera un conjunto de reglas que luego se insertan en la fuente, bastante difícil. Esto ha cambiado, el método de renderizar ligaduras ha cambiado. Anteriormente, fueron reemplazados por un personaje, ahora son reemplazados por tres. De hecho, para el usuario está mejorando, menos errores, más ligaduras.

Romano : Interesante. Nunca pensé que podría haber errores en las fuentes. ¿Las reglas por las cuales el pintor decide cuándo insertar ligaduras y cuándo no, se describen en un lenguaje de programación especial o simplemente de forma declarativa?

Nikita : Declarativamente, y luego traducido internamente de manera bastante eficiente en la tabla de reemplazo.

Set para la primera versión de las ligaduras


Roman : Dime, ¿cuándo se te ocurrió un conjunto de ligaduras, buscaste en algún lenguaje de programación específico o hay una lista más o menos general de lo que la gente necesita en la vida cotidiana?

Nikita : No se me ocurrió esta idea. Vi que hay una fuente Hasklig hecha específicamente para Haskell. Pero no necesitaba a Haskell, así que pensé que necesitaba hacer la misma fuente, pero, en primer lugar, en función de la fuente que me gusta, y en segundo lugar, para cualquier idioma. Luego tomé todo lo que se me ocurrió . Lo primero es obvio: <=,> =, ->, <-. Escribe como en C, pero se reemplaza por una flecha. En mi opinión, todo esto comenzó.

Clojure


Alexei : Al principio, mencionaste que estás escribiendo en Clojure ahora. Dime cómo llegaste a Clojure, cómo empezó todo, cómo llegaste a este idioma.

Nikita : Vi algunas conferencias de Rich Hickey (recomiendo, por ejemplo, esto y esto ). Son geniales y versátiles sobre el tema de cómo funciona la cabeza de un programador, en términos generales, cómo diseñar sistemas. Las conferencias me abrieron una gran cantidad de información importante nueva y concentrada, y yo era fanático de Rich Hickey. Luego se interesó en lo que había hecho. Resultó que hizo el lenguaje Clojure. Fui a leerlo, lo descubrí todo y nos vamos.

Roman : También puedo ser grabado como fanático de Rich Hickey. Vi sus actuaciones: ambas son largas y, lo más importante, interesantes. Es decir, se las arregla para mantener la atención de los oyentes durante mucho tiempo.

Alexei : ¿Qué es exactamente lo que te gusta de Clojure?

Nikita : En la última conferencia, Rich Hickey hizo el siguiente comentario:

Clojure es un lenguaje para programadores mayores y cansados.

No acuden a él al comienzo de una carrera, pero se vuelve interesante después de 10-15 años. En primer lugar, tienes absoluta libertad. Todo lo que necesitas, lo haces tú mismo o lo sacas de las bibliotecas. En el lenguaje mismo, se cosen un mínimo de cosas . Todo lo demás que diseñe, haga exactamente lo que necesita. Todo es casero y se puede cambiar. Esto es peligroso cuando eres un principiante, pero útil si ya eres un experto y sabes lo que necesitas.

En este lenguaje, el pensamiento se expresa de la manera más clara y compacta posible. Es decir, la brecha mínima entre la complejidad de lo que está tratando de expresar y la complejidad de cómo está escrito. En Java, por ejemplo, puedes hacer algo completamente trivial, pero se extenderá por 10 líneas y te cansarás. En Clojure, si una cosa es trivial, entonces está escrita, muy probablemente, trivialmente, en una o dos líneas.

Roman : Me di cuenta de que respondiste mi pregunta. Cuando escuché que Clojure no te impone ninguna restricción, por alguna razón recordé de inmediato a C, que también se puso de pie de alguna manera. Pero luego escuché la respuesta de que, después de todo, no es solo el azúcar sintáctico, sino también un lenguaje conveniente y compacto que le permite expresar sus pensamientos con menos código.

Nikita : Sí, es de muy alto nivel y C es de bajo nivel.

Alexei : Me pregunto si esa libertad de lenguaje no interfiere con el trabajo en grandes proyectos con una gran cantidad de personas. ¿O en OpenSource, donde necesita monitorear cuidadosamente cada cambio? Hasta donde oí, las cosas están permitidas en Clojure hasta cambiar la sintaxis del lenguaje . ¿Eso no te molesta?

Me recuerda la situación con Scala, cuando el idioma sabe muchas cosas, y en cada gran proyecto todos están envueltos en algún tipo de rastrillo propio. Como resultado, llegan a una práctica común, que la usamos, y esto no. Como resultado, Scala en un proyecto y Scala en otro son dos Scala diferentes . ¿Existe tal problema en Clojure?

Nikita : No trabajé en proyectos particularmente grandes. En aquellos en los que trabajó, hubo ligeras variaciones. De hecho, por alguna razón, tal confusión directa no ocurre. Me parece que esto se debe a que en Scala, digamos, hay fanáticos que teorizan y especulan sobre cómo hacer algo de la manera más correcta. Como dijiste, hay mucho de todo: puedes elegir no eso. En Clojure, por el contrario, no hay mucho, no puedes elegir lo incorrecto. Este es un lenguaje muy práctico. A Clojure no le gusta hacer abstracciones para el futuro. Si necesita imprimir algo, por ejemplo, simplemente imprima lo más práctico posible y no se preocupe por el origen de la impresora, qué interfaz, protocolo está implementando. Haces exactamente lo que necesitas. Por lo tanto, esta practicidad es probablemente un denominador común.

Proyectos en Clojure


Roman : Hasta donde puedo ver, tienes varios proyectos en Clojure en GitHub. Cuéntanos más sobre ellos.

Datascript


Nikita : Mi primer proyecto OpenSource relativamente exitoso es Datascript . Este es el almacenamiento del cliente para el navegador. Esto probablemente no sea muy útil para el sitio, y si está escribiendo algún tipo de aplicación interactiva en el navegador, entonces necesita almacenar los estados en algún lugar. Datascript es solo un repositorio de estados. Sus chips:

  • El es inmutable . Es decir, no destruye las versiones anteriores, solo crea una nueva copia de almacenamiento de manera bastante eficiente.
  • El está ordenado . Admite automáticamente índices en atributos, en cualquier entidad_id, etc. Le permite encontrar rápidamente todo lo que necesita. todo lo que necesitas
  • Es plano . Si realmente no ha pensado cómo implementar el almacenamiento en el cliente, lo primero que hará es la estructura de JSON anidado. En Datascript el almacenamiento es plano, en cualquier momento puede ir a cualquier lugar y encontrar lo que necesita.

En general, este es un acceso relativamente conveniente a los datos, de dos vías: puede ir de padre a hijo, o también puede ir de niño a padre.

Para la comunidad Clojure, tiene una ventaja más: está hecho con la misma API que Datomic. Datomic es una base de datos Clojure. Como tienen la misma interfaz, si conoces Datomic, conoces Datascript. También hay consultas allí, puede escribir consultas de datos en el lenguaje Datalog. No encontré esta característica particularmente útil para la interfaz, pero hay personas que la encuentran útil. Esto es similar a SQL, puede allanar las condiciones y obtener resultados del repositorio del cliente.

Roman : Por favor dinos por qué Datascript es único. La tarea de almacenar el estado en el cliente en una aplicación interactiva es bastante común. Parece que ya debería estar incrustado en algún lugar, ya sea en el lenguaje mismo o en algún tipo de marco. Sin embargo, decidió tomar su decisión. ¿Qué te incitó?

Nikita : Me preguntaba si podría hacer pequeñas herramientas Datomic. Era interesante repetir un sistema existente. Luego resultó que esta es realmente una buena idea, y es muy conveniente organizar y acceder al estado de esta manera. Probablemente hay soluciones similares en el mundo de JavaScript. Existe tal cosa como el relé. Por lo que recuerdo, resuelve el problema de sincronización y almacenamiento de datos. Ella es algo similar, pero, en mi opinión, apareció más tarde.

Ron


Alexey : Hay una más en tu biblioteca de ron . Cuéntame sobre ella, por favor.

Nikita : Rum es solo un contenedor de React para ClojureScript. Reaccionar es genial, genial, y a todos les gusta. Quiero usarlo b en ClojureScript para usar. Él es un script Java, pero quiero usarlo en Clojurescript. Había varias soluciones en el mundo de ClojureScript, pero todas eran demasiado conceptuales. Ofrecieron su modelo, que internamente usaba React. Es decir, no puro, sino su propio concepto, que utiliza React.

La idea de Rum surgió del hecho de que no se podía usar Datascript con estas carpetas anteriores, pero quería usarlo. Como resultado, llegué a un diseño en el que Rum es el enlace más transparente y trivial para React. Ofrecemos todo lo mismo que en React, solo envuelto en una interfaz conveniente para usar ClojureScript. No oculta nada, puedes acceder a los componentes nativos de React. Es agnóstico, como a usted le gusta, y organiza la aplicación y la arquitectura.

Roman : De acuerdo con las historias de los compositores familiares, y en general, mirando en la dirección de React and React Native, veo cuán loco está ganando popularidad su proyecto. Dijiste que era una envoltura alrededor de React. Pero React es un gran proyecto, y lograste hacer que Rum sea muy pequeño sin estudiar toneladas de fuentes de React. Como lo hiciste

Nikita : React no es un proyecto tan grande en realidad. Todos los elementos esenciales que se encuentran en React están en la biblioteca Preact, que ocupa solo 3 KB. React tiene una API bastante pequeña más un montón de hacks para nuevos navegadores, tiene poco sentido aprender hacks, todos están dentro de React.

Romano : ¿G6 es parte de React o no?

Nikita : Oficialmente, no, este es un componente separado.

Roman : ¿Lo has portado o lo has dejado a un lado?

Nikita : No, no lo he portado; no lo usas en ClojureScript. En ClojureScript, el código son datos y todo eso, ni siquiera necesita algo como G6, ya tiene su propia sintaxis basada en vectores, que es aceptada en la comunidad de Clojure. Usando los datos, presentamos lo mismo que se hace en G6 por la macro y el preprocesamiento de las fuentes.

Roman : Wow! Ahora propongo cambiar al próximo proyecto. Estaba muy sorprendido y encantado cuando vi que usted, Nikita, escribió el proyecto AnyBar , una aplicación de barra de menú que muestra diferentes indicadores cerca del reloj. Sorprendentemente, mi primer proyecto de MacOS también fue una aplicación de barra de menú que mostraba notificaciones de nuevas cartas de Yandex.Mail. Miré la fuente y volví directamente a los últimos 8 años atrás.

El proyecto es muy simple y popular. Seguramente, lo usan para algunas tareas aplicadas. Por favor, dígame cómo apareció el proyecto, cómo lo usa usted mismo o, tal vez, ¿sabe cómo alguien lo usa?

Anybar


Nikita : El proyecto apareció por casualidad. Ya sabes, a los programadores les encanta escribir algo, y aquí. El código Clojure no necesita ser compilado; el código ClojureScript sí. Cada vez que cambia la fuente, se vuelve a compilar. Esto lleva algo de tiempo: un arranque en frío tarda 30-40 segundos, por ejemplo, y una construcción incremental de un segundo a diez segundos. Cambiaste la fuente, cambiaste al navegador y aún no sabes si ya puedes mirar o si necesitas esperar, porque la fuente no se ha compilado. Para saber esto, se me ocurrió un indicador.

Todos funcionan principalmente en computadoras portátiles, no hay mucho espacio, dónde conseguirlo. Debe cambiar al terminal y esperar hasta que todo esté compilado en el terminal, y luego cambiar al navegador. Para no volver a la terminal nuevamente, me hice un indicador en la barra de menú, que mostraba el estado de la compilación: compila, compila y compila con un error. Si ocurre un error, entonces no necesita actualizar la página cien veces, aún no se aplicará nada.

No lo hice de una manera específica, pero lo hice de la manera más universal posible. Para cambiar el color del indicador en AnyBar, solo necesita enviar un paquete UDP, esta es la forma más simple de comunicación cruzada. Resulta que esto es algo súper flexible, que es trivial para el script. Utilicé principalmente solo para el estado de compilación.

Alguien, por ejemplo, tuiteó recientemente que había hecho un indicador del estado de los asientos vacíos en la embajada. Para que pueda hacer una cita de inmediato, cuando hay un asiento vacío. También se mostró en AnyBar.

Roman : Nikita, ¿funciona esto solo en Localhost, o mi máquina virtual en Holanda puede hacer ping a mi computadora portátil y mostrar algo en la barra de menú?

Nikita : Si puede enviar un paquete UDP desde su máquina virtual para una computadora portátil, entonces sí.

Alexei : Habiendo escuchado sobre el tiempo de construcción en frío de 30-40 segundos y luego la recarga en caliente durante un segundo o dos, por supuesto, solo puedo envidiar al mundo de Android. Pero aquí tengo esta pregunta: ¿todo esto ha sido cubierto con un conjunto de scripts de shell listos para usar, complementos listos que ni siquiera puedes escribir, sino que simplemente los enchufaste para que todo funcione de inmediato?

Nikita : No está demasiado grande, porque no lo hice mucho. Incluso me sorprende que alguien más esté interesado. Hay muchas cosas: muchas ideas, incluso muchos clones. La gente quiere mostrar texto o varios indicadores, etc. Iba a hacer todo esto, pero mis manos no llegaron.

sitio web gruñón


Alexei : Pasemos a su próximo proyecto. Dime qué es el gruñón.

Nikita : grumpy.website es un blog sobre ejemplos de malas interfaces. Recopilamos cualquier jambas en las interfaces de computadora y no computadora, discutimos, nos quejamos.

Alexey : ¿Cuánto tiempo ha aparecido este sitio?

Nikita : Hace aproximadamente un año.

Alexei : ¿Cuántas personas publican algo allí?

Nikita : Este es un proyecto de autor, ahora tenemos cuatro autores. Publicamos principalmente, pero otras cinco personas envían periódicamente sus sugerencias. Este es un motor completamente personalizado escrito en Clojure live en mi canal de YouTube . Tomó en el aire los números 13-14, cuyas descripciones completas se encuentran en Gist . Si está interesado en cómo crear una aplicación web en Clojure desde cero, puede ver

Romano : ¿Ya se ha completado este curso o todavía se está finalizando el proyecto y publica las notas a medida que se está finalizando?

Nikita: Es más un video blog. Terminó en el estado en el que ahora se encuentra el sitio web gruñón , en tiempo real. Lo que está ahora en el sitio, luego en el blog.

Diseño y usabilidad


Roman : Usted, como la persona que planteó el proyecto sobre las estupideces del diseño de la interfaz, probablemente esté versado en diseño y usabilidad. ¿Cómo llegaste a esta área? ¿Cómo te interesaste en esto?

Nikita : Sucedió bastante temprano, al comienzo de una carrera. Estuve involucrado en proyectos web, y me pareció que para hacer bien las interfaces, necesitaba entender lo que estábamos haciendo. Había una sensación de que no todo estaba bien con las interfaces de la computadora.

Leí varios libros famosos y todo sonó muy razonable. Por un lado, debe estar atento a las buenas interfaces. Sentido común, por otro lado. Para leer grumpy.website , no necesita ser un experto en la interfaz, el sentido común es suficiente para comprender que esto es horror-horror.

Roman : Recuerdo que después de leer el libro "Diseño de cosas familiares" de Donald Norman, realmente comencé a ver más. Pero antes de eso, usé estas tonterías, estos defectos y mis ojos no se aferraron.

Informe AppsConf


Alexey : Nikita hablará en la AppsConf con el informe " Adquisición de habilidades ". Nikita, dime cómo apareció ese informe.

Nikita : Vi un informe sobre el modelo driftfus. Este es un modelo para adquirir habilidades, según el cual cada persona, al estudiar un nuevo campo, pasa por diferentes etapas: principiante, competente, especialista, experto, maestro. Fui a leer, descubrí cuáles son estos niveles, en qué se diferencian, descubrí cómo recae en la programación y todo lo que veo alrededor de la programación: cursos, libros, debates en Internet, el diseño de lenguajes de programación. Es decir, es con respecto a diferentes niveles de programador o programación. Resultó que este es un modelo interesante que explica muchas cosas. , , .

, : , . — , — . . , , , .

: , , , , , . , . , .
AppsConf — 8 9 . . ( : , ), .

YouTube- , .

Source: https://habr.com/ru/post/es420147/


All Articles