oxidante Fedora: Pruebe Rust y sus aplicaciones hoy

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 Rust lenguaje y ecosistema que 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 Rust ofrece 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 es cajas.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

ripgrep es 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, es má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 la tabla 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

ejemplo es 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

Tokei es 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

terminal es 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 es el código fuente (bien comentado) y algunos 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
                    

Fedora SIG de óxido

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. los Fedora SIG de óxido es 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 de Magia y abrirSUSE para 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 por james sutton en Unsplash .

Related Posts