En los últimos años, se ha vuelto cada vez más importante desarrollar software que minimice las vulnerabilidades de seguridad. Los errores de administración de memoria son una causa común de estas vulnerabilidades. Con ese fin, la comunidad de Mozilla ha pasado los últimos años construyendo el Rustlenguaje y ecosistemaque se enfoca principalmente en eliminar esos errores. Y Rust está disponible en Fedora hoy, junto con algunas aplicaciones en Fedora 27 y superior, como se ve a continuación.
Presentamos óxido
El lenguaje de programación Rust se anuncia a sí mismo como “un lenguaje de programación de sistemas que se ejecuta increíblemente rápido, evita errores de segmento y garantiza la seguridad de los subprocesos”. Pero ¿qué significa eso?
A diferencia de los lenguajes de programación más populares como Python, Ruby y Java, Rust se compila en código de máquina en lugar de ejecutarse en un entorno de tiempo de ejecución. Esto significa que todo el código escrito en Rust debe procesarse mucho antes de la ejecución. El compilador de Rust verifica el código a medida que se compila para garantizar que se eliminen los problemas en el código compilado. Ejemplos de tales problemas son:
- Carreras de datos: contención entre subprocesos que acceden a la misma ubicación de memoria mientras uno intenta escribir allí
- Violaciones de acceso a la memoria: intentos de acceder/manipular datos en la memoria que no están permitidos o que ya no existen
Por supuesto, los cheques por sí solos no son suficientes para que esto funcione. Rust presenta una larga lista de mejoras de lenguaje diseñadas específicamente para desarrollar código “seguro” en primer lugar.
Si desea obtener más información sobre el idioma, el sitio web de Rustofrece excelente documentación. También puede leer sobre Rust en este artículo anterior de la revista.
Cajas de óxido
Los módulos de óxido también se conocen como cajas. El índice principal de cajas escajas.io. Los desarrolladores administran las cajas y sus dependencias de compilación y tiempo de ejecución mediante la herramienta de carga.
Hoy dia, Fedora incluye más de 300 cajas de óxido en cuero crudo, que en el momento de escribir este artículo se convertirán Fedora 28. Se incluyen más de 120 cajas de óxido en Fedora 27. Esta selección incluye casi todas las cajas populares que funcionan con el compilador estable Rust en Linux. E incluso más cajas estarán disponibles en Fedora ¡tiempo extraordinario!
Aplicaciones de óxido
Hoy dia, Fedora incluye algunas aplicaciones interesantes basadas en Rust. Todos estos están disponibles en Fedora 27 y posteriores y se pueden instalar a través de DNF. Aquí hay unos ejemplos:
ripgrep
ripgrepes una herramienta de línea de comandos en la tradición de grep. Está optimizado para buscar grandes directorios de archivos usando paralelismo listo para usar. Busca recursivamente su directorio actual por defecto. Esta utilidad omite automáticamente los archivos que coinciden con un patrón en sus archivos .gitignore (esta opción se puede desactivar). ripgrep admite el filtrado de tipos de archivos y la gama completa de Unicode, sin dejar de ser rápido. Incluso puede buscar automáticamente archivos comprimidos. En la mayoría de los casos, esmás rápido que grep, ag, git grep, ucg, pt y shift.
Para exampleuna comparación simple de buscar en un archivo de 8GB con ripgrep y luego GNU grep:
$ /tmp env LC_ALL=C time rg -n -w 'Sherlock [A-Z]w+' OpenSubtitles2018.raw.en | wc -l 2.16user 0.33system 0:02.50elapsed 99%CPU (0avgtext+0avgdata 8151736maxresident)k 0inputs+0outputs (0major+127911minor)pagefaults 0swaps 4148 $ /tmp env LC_ALL=C time egrep -n -w 'Sherlock [A-Z]w+' OpenSubtitles2018.raw.en | wc -l 7.98user 1.21system 0:09.21elapsed 99%CPU (0avgtext+0avgdata 2624maxresident)k 752inputs+0outputs (3major+223minor)pagefaults 0swaps 4148
GNU grep tarda 9,2 segundos, mientras que ripgrep tarda solo 2,5 segundos. Impresionante, ¿no? Si es usuario de alguna de las herramientas mencionadas, puede consultar latabla de comparación de características de ack, ag, git-grep, GNU grep y ripgrep. Para instalar ripgrep, ejecute este comando usando sudo:
sudo dnf install ripgrep
ejemplo
ejemploes un reemplazo moderno para ls. Utiliza colores para la información de forma predeterminada, lo que le ayuda a distinguir propiedades como el tipo de archivo y la propiedad. También tiene características adicionales que no están presentes en el ls original, como ver el estado de git para un directorio o enumerar recursivamente los archivos a través de subdirectorios con una vista de árbol.
Para instalar la utilidad exa, use este comando:
sudo dnf install exa
tokei
tokioes una herramienta que analiza el código de un proyecto y ofrece estadísticas del proyecto. Le muestra exactamente cuántos códigos, comentarios o líneas en blanco tiene. Originalmente se inspiró en el script cloc de Perl. Sin embargo, cloc es más lento y más propenso a errores, ya que encuentra casos que hacen que el código se cuente incorrectamente como comentarios y viceversa. Uno de los mayores puntos de venta de Tokei es la velocidad. La siguiente example muestra cómo se desempeña Tokei en Fedorala fuente de Firefox 58. Esta base de código tiene más de 175 000 archivos que contienen más de 26 millones de líneas de código.
$ time tokei firefox-58.0.1/ ------------------------------------------------------------------------------- Language Files Lines Code Comments Blanks ------------------------------------------------------------------------------- Ada 10 2840 1681 560 599 Assembly 497 281559 235805 15038 30716 Autoconf 417 59137 43862 7533 7742 BASH 3 342 257 43 42 Batch 48 4005 3380 101 524 C 3761 2567794 1864710 402801 300283 C Header 14258 3034649 1830164 782437 422048 CMake 72 10811 7263 2009 1539 C# 9 1615 879 506 230 C Shell 2 72 34 14 24 CoffeeScript 4 64 34 12 18 C++ 11055 5812950 4449843 607276 755831 C++ Header 92 41014 32622 4627 3765 CSS 1401 123014 95702 8047 19265 D 1 34 8 22 4 Dockerfile 76 1983 1290 320 373 Emacs Lisp 2 338 258 38 42 Elm 2 542 399 29 114 Fish 2 152 94 26 32 GLSL 2952 144792 57711 68029 19052 Go 2 485 314 101 70 Handlebars 17 212 211 0 1 Happy 3 2008 2008 0 0 HTML 62132 3479735 2955995 140901 382839 Java 2872 511312 324521 120016 66775 JavaScript 55028 5576166 3572186 1199464 804516 JSON 1078 803571 803571 0 0 JSX 6 886 706 62 118 Makefile 723 46698 25789 12197 8712 Markdown 572 62395 62395 0 0 Module-Definition 52 5118 3865 1173 80 MSBuild 3 223 165 48 10 Objective C 60 4055 2889 527 639 Objective C++ 238 73816 54479 8071 11266 Org 2 54 42 0 12 Pascal 5 1569 1122 210 237 Perl 96 21520 15188 2987 3345 PHP 2 864 440 284 140 Prolog 1 17 15 0 2 Protocol Buffers 24 5184 1988 2466 730 Python 4165 787017 592691 66138 128188 R 1 38 12 18 8 Rakefile 1 11 9 0 2 ReStructuredText 388 51423 51423 0 0 Ruby 4 181 153 5 23 Rust 3250 1095452 833476 163020 98956 Sass 6 215 157 16 42 Scala 1 195 164 2 29 Scons 1 25 18 1 6 Shell 652 91256 64023 15520 11713 SVG 3885 152642 126545 18540 7557 Swift 1 9 7 0 2 TeX 2 11081 6860 3236 985 Plain Text 2992 1444524 1444524 0 0 TOML 445 10738 8291 1102 1345 TypeScript 21 32983 28256 4544 183 Vim Script 5 5 5 0 0 XML 2259 225666 204439 6691 14536 YAML 154 34415 31155 560 2700 ------------------------------------------------------------------------------- Total 175813 26621471 19846093 3667368 3108010 ------------------------------------------------------------------------------- 22.36user 4.79system 0:07.61elapsed 356%CPU (0avgtext+0avgdata 136184maxresident)k 1864920inputs+0outputs (0major+48004minor)pagefaults 0swaps
Aquí está el mismo ejercicio usando la utilidad cloc original:
$ time cloc firefox-58.0.1/ 220532 text files. 209900 unique files. Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/^(.*?){ <-- HERE [^$]/ at /usr/bin/cloc line 4850. Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by <-- HERE in m/^(.*?){ <-- HERE [^$]/ at /usr/bin/cloc line 4850. 49681 files ignored. github.com/AlDanial/cloc v 1.72 T=627.95 s (276.9 files/s, 40329.3 lines/s) --------------------------------------------------------------------------------------- Language files blank comment code --------------------------------------------------------------------------------------- C++ 10964 755278 602036 4450883 JavaScript 52752 795983 1200658 3557155 HTML 58973 374714 133514 2819513 C 3684 299543 406289 1857360 C/C++ Header 14119 415207 776222 1805495 Rust 3145 97425 160172 822947 JSON 1228 516 0 802139 Python 3886 124724 142265 495765 Java 2866 66713 120321 323965 Assembly 469 30686 32627 217460 XML 2190 14459 6621 202914 INI 8252 53608 159 202694 Bourne Shell 672 24242 26559 151447 IDL 1295 15749 0 119280 XHTML 2399 10646 4857 100383 CSS 1053 18805 7891 92729 Objective C++ 222 11245 8032 54356 NAnt script 1378 8371 0 48827 Markdown 569 17225 4 44998 MSBuild script 28 1 0 44320 GLSL 1827 12943 42011 42461 m4 77 4151 827 35890 YAML 296 3082 703 34810 make 634 7630 10330 27522 Perl 103 3632 3690 16208 DTD 176 3698 4696 14297 CMake 72 1539 2009 7263 TeX 2 985 3236 6860 Windows Module Definition 48 54 1161 3617 DOS Batch 44 492 87 3200 SKILL 4 68 2 2419 HLSL 33 409 285 2045 Protocol Buffers 24 730 2472 1982 Windows Resource File 48 442 575 1864 Objective C 37 459 514 1823 yacc 3 173 85 1750 Ada 10 599 560 1681 XSLT 26 168 142 1437 Pascal 8 260 504 1405 Cython 1 59 158 1310 Dockerfile 74 367 315 1266 Groovy 14 249 316 1194 lex 4 237 82 1074 diff 14 530 2038 963 C# 9 230 506 879 MATLAB 11 162 147 874 JSX 6 118 62 706 Bourne Again Shell 22 126 196 676 Jam 27 170 379 586 Korn Shell 5 83 165 526 Expect 6 105 164 506 PHP 2 140 288 436 Elm 2 114 29 399 Ant 2 27 107 389 Go 2 70 101 314 TypeScript 13 73 72 268 Lisp 2 42 38 258 Handlebars 12 1 0 199 Mako 3 14 0 168 Scala 1 29 2 164 Ruby 4 25 4 163 awk 2 41 8 154 Sass 4 36 15 144 Haxe 2 25 5 137 Vuejs Component 2 6 0 122 Visual Basic 1 17 15 84 sed 7 16 27 73 PowerShell 2 17 110 46 SAS 1 14 22 32 C Shell 2 13 7 28 CoffeeScript 3 13 8 25 Prolog 1 2 0 15 R 1 8 18 12 MUMPS 3 2 0 9 D 1 4 22 8 Mathematica 2 1 0 7 Swift 1 2 0 7 Freemarker Template 3 0 0 6 Stylus 1 2 0 5 vim script 1 0 0 1 --------------------------------------------------------------------------------------- SUM: 173892 3179844 3707542 18437397 --------------------------------------------------------------------------------------- 266.51user 306.34system 10:28.37elapsed 91%CPU (0avgtext+0avgdata 446552maxresident)k 6704096inputs+0outputs (12major+44888834minor)pagefaults 0swaps
En promedio, tokei tarda 8 segundos mientras que cloc tarda 12 minutos. Para instalar tokei, usa este comando:
sudo dnf install tokei
Terminal
Terminales un programa que dibuja una forma de vida animada y brillante en la terminal utilizando símbolos de bloque Unicode. No es una utilidad típica de Linux sino algo así como un experimento en arte digital. Tiene aplicaciones de nicho como la evaluación comparativa de emuladores de terminales o la creación de mensajes de saludo SSH geniales o aterradores al combinarlos con el tiempo de espera.
Puede personalizar casi todos los aspectos del “animal” renderizado con argumentos de línea de comandos. Actualmente, la única documentación disponible para ellos esel código fuente (bien comentado)yalgunos ejemplos. Ternimal está escrito en Rust puro y cuidadosamente perfilado y optimizado. Es bastante eficiente en recursos y puede generar animaciones fluidas y complejas con un uso mínimo de CPU.
Para instalar Ternimal, ejecute este comando:
sudo dnf install ternimal
SIG de óxido de Fedora
Durante el último año, se ha trabajado mucho para integrar sin problemas el ecosistema de Rust en Fedora. Fedora ahora tiene un grupo de interés especial (SIG) para apoyar el ecosistema Rust. losSIG de óxido de Fedoraes el administrador general de Rust en Fedoraincluidas las cajas y el embalaje de la aplicación.
El enfoque de Rust SIG hacia el empaquetado y soporte del ecosistema Rust es diferente de algunos SIG en Fedora. Como Rust era un ecosistema completamente nuevo, Rust SIG estaba pisando un nuevo terreno. Los miembros decidieron desde el principio hacer de esto un verdadero esfuerzo de distribución cruzada y armonizar el empaquetado del código Rust en todas las distribuciones de Linux utilizando el administrador de paquetes RPM. El SIG trabajó en estrecha colaboración con los miembros demagiayabrirSUSEpara garantizar que las herramientas funcionaran para todos. Como consecuencia, hoy puedes hacer FedoraMageia y empaques compatibles con openSUSE de Rust crates y aplicaciones que usan rust2rpm en cualquiera de esas distribuciones.
Agradecimientos
Por supuesto, nada de esto hubiera sido posible sin el esfuerzo de varias personas:
- Sin la ayuda de Michael Schröder de openSUSE, muchas de las piezas fundamentales que necesitábamos en la pila de resolución de dependencias no serían posibles. Florian Festi del equipo de RPM merece un agradecimiento especial por revisar todo este trabajo y asegurarse de que todo esté en orden en RPM.
- Gran parte del refinamiento del paquete del compilador de Rust y la búsqueda/corrección de errores extraños relacionados con eso se puede atribuir a Josh Stone de Red Hat y Rémi Verschelde de Mageia. Ambos mantienen la pila principal de Rust en sus respectivas distribuciones (Fedora/EPEL y Mageia, respectivamente) y comparten trabajo regularmente para garantizar que Rust y Cargo estén disponibles en la mejor forma posible.
- Adán Miller (Fedora Release Engineering), Dusty Mabe (Proyecto Atómico), Kushal Das (Fedora Cloud), Patrick Uiterwijk (Fedora Ingeniería de lanzamiento) y Randy Barlow (Fedora Release Engineering) merecen mucho crédito por renovar la infraestructura para ayudar a admitir las nuevas funciones que se necesitaban para brindar una experiencia de primera clase con el ecosistema Rust para Fedora.
- Por último, pero no menos importante, la comunidad de Rust ha sido fantástica. Comprometerse con ellos es una gran experiencia y Rust y su ecosistema existen gracias a ellos y sus esfuerzos.
Foto porjames suttonenUnsplash.