Windows: asignar una letra de unidad a cualquier carpeta

05/08/2021
Artículo original

Vale, este truco es un poco friki en el sentido de que no es una necesidad muy habitual. Sin embargo, en algunas ocasiones puede ser un salvavidas. Me explico...

No es algo muy conocido, pero Windows te permite asignar letras, como si fueran unidades de disco independientes, a ciertas rutas que te puedan interesar. Si por ejemplo trabajas habitualmente en una carpeta que está muy anidada, puedes simplemente asignarle la letra H: (o la que sea) y así tienes un acceso mucho más directo. Y lo que es más interesante: una ruta mucho más corta. Tanto que tiene solo 3 caracteres (H:\ en nuestro ejemplo). Y este es el quid de la cuestión: nos permite obtener rutas muy cortas.

Esto es muy importante por una cuestión: Windows limita tradicionalmente la longitud de las rutas a 260 caracteres como máximo. Esto es porque las APIs de bajo nivel de Windows tienen unos 30 años y siguen teniendo ciertas limitaciones para algunas cosas, como esta.

En versiones recientes del sistema, en Windows 10 de 64 bits, se puede ampliar este límite con un ajuste del registro. Pero, aún haciéndolo, hay muchos programas que no son capaces de gestionar esas rutas con corrección, por lo que sigue siendo un problema.

Lo anterior significa que si tienes una carpeta muy anidada o con un nombre muy largo, y metes en ella un archivo con nombre muy largo y en total suman más de 260 caracteres de longitud para la ruta, seguro que vas a tener problemas para abrirlo con el software que utilices. Esto es muy típico en dos situaciones comunes (o al menos a mi me ha pasado varias veces así):

  1. Mueves o copias una carpeta con muchas subcarpetas y muchos archivos a otra ubicación que tiene una ruta de partida más larga. Es muy habitual que archivos que funcionaban sin problemas en la original, de repente, superen ese límite en la nueva ubicación y tengas problemas para acceder a ellos.
  2. Tienes un disco cloud que usas para sincronizar tus archivos a la nube y entre varios de tus equipos. Uno de tus ordenadores es macOS o Linux, que no tienen estas limitaciones, y se sincroniza con Windows también. En Windows, las rutas largas que en macOS o Linux no te daban problemas, ahora no te dejan abrir o editar tus archivos.

Con el truco que te cuento hoy, se acabó el problema: le asignas una ruta larga a la unidad problemática y listo: ya podrás acceder a ella, crear archivos con nombres más largos en su interior, etc... Y te puede sacar de algún apuro.

Es muy sencillo: tan solo copia la ruta larga de la carpeta que desees al portapapeles (recuerda que debes meterla entre comillas en caso de que lleve algún espacio), y abre una línea de comandos (cmd.exe). En la terminal escribe:

subst H: "C:\Ruta-larga"

o sea, indicando la letra que le quieres asignar (debe estar libre, obviamente) y la ruta a la carpeta. Le das a ENTER y ¡listo! Ya tienes una nueva letra de unidad apuntando a donde querías (quizá tengas que darle a F5 para refrescar el listado de unidades y que aparezca):

La imagen muestra la nueva unidad virtual H: apuntando a la nueva ruta

Ahora puedes acceder a esa ubicación como si fuese un disco duro normal, y con una ruta mucho más corta.

Cuando quieras deshacerte de ella solo tienes que usar el modificador /D indicando la letra de la unidad:

subst /D H:

de forma que desaparece inmediatamente.

Estas unidades no son permanentes, por lo que la próxima vez que reinicies el sistema desaparecerán y tendrás que volver a crearlas (o crear un .bat muy simple para hacerlo automáticamente). Tampoco te permiten "mapear" a letras carpetas de red.

Si estas limitaciones son importantes para ti, existe una utilidad Open Source llamada psubst que es igual a subst pero permite usar rutas remotas también y además crea unidades persistentes que siguen ahí cada vez que reinicias.

¡Espero que te resulte útil!

Los 4 mejores lenguajes de programación para Inteligencia Artificial / Machine Learning

05/08/2021
Artículo original

Imagen ornamentalCuando te planteas aprender Inteligencia Artificial o, hablando con más propiedad, aprendizaje automático, una de las preguntas que cualquier programador se va a hacer es ¿qué lenguajes existen para IA?, ¿qué lenguaje debo utilizar? ¿me vale alguno de los lenguajes que ya conozco?...

Lo primero que debemos tener claro es que la programación orientada a la inteligencia artificial es muy diferente a la programación convencional y, por lo tanto, los lenguajes de programación se emplean de una manera muy distinta. En programación convencional tú le dices a la máquina exactamente qué tiene que hacer, mientras que en Machine Learning le tienes que enseñar a la máquina a programarse sola, es decir, la entrenas para ello.

Se trata de un cambio de punto de vista muy radical, que se visualiza perfectamente con este gráfico:

Esquema que muestra las diferencias entre un programa clásico y uno orientado a aprendizaje automático

Como vemos, a un programa convencional le decimos exactamente qué hacer con la información que procesa de modo que se obtengan unos resultados concretos. Pero en Machine Learning es justo al contrario: partiendo de unos datos y de unos resultados previos ya conocidos, se entrena un modelo para que genere automáticamente las reglas para procesar nuevos datos y obtener resultados futuros.

Una consecuencia de esto es que el proceso de trabajo para Aprendizaje Automático es muy diferente a la construcción de una aplicación convencional y, por el mismo motivo, la manera de utilizar los lenguajes de programación es diferente, así como las características de estos que se utilizan, sus objetivos, etc...

Popularidad y ecosistema, los dos factores determinantes

No hay muchos análisis sobre este tema que estén orientados específicamente a IA/ML, pero en 2019, GitHub analizó todos los proyectos de Machine Learning que había en su ingente colección de repositorios, clasificando los lenguajes más populares así como los paquetes más utilizados entre otras cosas. Así que, dado su tamaño e importancia, aunque ya ha pasado tiempo, sigue siendo una fotografía muy relevante que nos ayuda a entender las preferencias del mundillo y a orientarnos sobre qué elegir.

Más recientemente, la popular herramienta de Machine Learning Anaconda, hizo una encuesta global a sus usuarios sobre los lenguajes de programación que utilizaban, que seguramente está mucho más sesgada dado el enfoque de la herramienta, pero que es una buena representación de lo que usan los profesionales.

Gráfica con los lenguajes por popularidad del estudio de Anaconda

La popularidad de un lenguaje importa porque es una señal del tamaño de su comunidad, de la ayuda que puedes recibir, de qué pedirán en las empresas... Pero, su ecosistema es tanto o más importante ya que te indica si dispones de las herramientas necesarias para llevar a cabo el trabajo y tener mayor productividad. Finalmente, la idoneidad del lenguaje para el trabajo es otro factor relevante, ya que si un lenguaje está diseñado con una determinada tarea o propósito en mente, hará que esta sea mucho más eficiente y productiva.

Basándonos en popularidad, uso en proyectos, ecosistema y utilidad real, esta es nuestra elección de lenguajes para Inteligencia Artificial:

#1: Python para Inteligencia Artificial / Machine Learning / Ciencia de Datos

Logo de Python

Una de los principales motivos por los que Python se está convirtiendo en el lenguaje de programación más popular del mundo es por su sencillez unida a una gran versatilidad. Lo puedes aprender rápido y luego utilizarlo para casi todo: desde desarrollo web hasta inteligencia artificial, pasando por el desarrollo de juegos. Pero, de hecho, su gran crecimiento en los últimos años viene de la mano de la inteligencia artificial, a pesar de no ser el más rápido o el más potente.

Aparte de su popularidad, el principal motivo para aprender Python para machine learning es, sin duda, el enorme ecosistema de cosas ya hechas que existen alrededor del lenguaje. Los paquetes de aprendizaje automático y deep learning más conocidos y utilizados del mundo, como Pandas, NumPy, TensorFlow, Keras, Scikit-learn... y miles más, están todos escritos en Python.

Python te da un soporte sobresaliente para cada uno de los pasos del proceso de aprendizaje automático. Por ejemplo, con Pandas podrás importar y manipular los datos casi de cualquier manera que puedas imaginar, algo crucial para esta disciplina, y con TensorFlow podrás crear los modelos más potentes basados en redes neuronales. ¿Necesitas automatizar alguna tarea? Con Python lo tienes hecho en unos minutos... Elige cualquier paso o disciplina que quieras y lo tienes Python, te lo da solucionado (o casi).

El lenguaje ha evolucionado en paralelo a la disciplina de inteligencia artificial y ello hace que sea casi indispensable conocerlo si vas a trabajar en este campo. Aunque luego uses también otros.

Además, nos proporciona un código muy claro y por tanto fácil de entender, flexibilidad, capacidades de prototipado rápido y colaboración con otros gracias a cuadernos Jupyter y muchas cosas más.

Su mayor "pega": que no es tan rápido como otros lenguajes, aunque en la actualidad existen proyectos como Cinder, PyPy y otros similares que lo compilan y aceleran su rendimiento muchísimo si fuese necesario.

Para no darle más vueltas: en la actualidad si vas a trabajar en este campo, Python es un lenguaje que debes aprender sí o sí. Por eso lo incluimos de primero de la lista.

#2: Lenguaje R para Inteligencia Artificial / Machine Learning / Ciencia de Datos

Logotipo del lenguaje R

R es otro lenguaje de programación popular en esta disciplina. Si bien en los rankings aparece debajo de otros y se ha relacionado tradicionalmente con entornos más académicos, es nuestro número 2 por una razón muy importante: se trata de un lenguaje específico para trabajar en análisis de datos y aprendizaje automático, lo cual lo dota de una gran ventaja frente a otros lenguajes de propósito general.

Está diseñado desde el primer momento para orientarlo a este tipo de trabajos. Por eso, incluso muchos programadores acostumbrados a lenguajes convencionales, lo acaban adoptando como lenguaje principal. También lo utilizan muchas personas que no tienen un perfil de programador, como analistas de datos, financieros o especialistas en estadística. No tiene la misma flexibilidad para hacer otras cosas fuera del ámbito de la IA, pero está diseñado para moverse en él como pez en el agua.

Es un lenguaje open source, multiplataforma, funcional y también orientado a objetos, y fácil de aprender. Dispone de un entorno de desarrollo muy popular que es específico para el lenguaje (R-Studio, que también soporta Python).

Al igual que Python dispone de una cantidad increíble de paquetes listos para ser utilizados para casi cualquier cosa que necesites en ciencia de datos: carga y procesado de datos, visualización de datos, regresión no lineal, algoritmos genéticos, redes neuronales... También facilita mucho el hacer cosas muy rápido y compartir la información y trabajar en equipo a través de cuadernos Jupyter, como con Python.

Su mayor inconveniente es, seguramente, que no se parece a los lenguajes convencionales que tienes costumbre de ver. Sin embargo, su simbiosis con la materia y su amplio uso en el mundillo hacen que sea un lenguaje que toda persona que se dedique a ciencia de datos debería conocer, al menos en sus fundamentos.

3: Lenguaje SQL para Inteligencia Artificial / Machine Learning / Ciencia de Datos

Un icono de base de datos con la palabra SQL

El lenguaje SQL (Structured Query Language) lleva con nosotros desde hace muchas décadas. Es un lenguaje declarativo pensado para facilitar la consulta de datos de forma parecida al habla natural (en inglés) y es la manera principal de comunicarse con cualquier gestor de datos relacional.

Ya hemos comentado en este blog que SQL es quizá uno de los conocimientos más valiosos a largo plazo que puedes adquirir. Y si haces cualquier cosa relacionada con ciencia de datos o IA, sin duda esto aplica...

¿Entrenarás modelos con él? Pues seguramente no o no a menudo. ¿Hay un ecosistema de paquetes con algoritmos ya implementados? Tampoco. Pero si trabajas en ciencia de datos el 80% de tu tiempo o más lo vas a dedicar a interactuar con información. Así que, SQL va a ser una de las herramientas más valiosas de tu arsenal. Lo usarás para leer y guardar datos, limpiar y transformar información, exportarla, hacer scripts que la actualicen periódicamente...

Además, la mayor parte de los gestores de datos relacionales como SQL Server, Oracle o PostgreSQL incorporan ya capacidades de entrenamiento de modelos en sus productos, de modo que puedes llevar a cabo gran parte del workflow de aprendizaje automático sin salir de la base de datos.

No se concibe trabajar con datos y no conocer SQL, así que es otro lenguaje indispensable que deberás aprender.

#4: JavaScript para Inteligencia Artificial / Machine Learning / Ciencia de Datos

Logo de JavaScript

¿Cómo? ¿JavaScript, el lenguaje de la Web? Pue sí. No hay ranking de lenguajes que no tenga a JavaScript en los primeros lugares en cuanto a uso y no hay programador en el mundo que no chapurree al menos en este lenguaje de programación. Y, además, es un lenguaje pensado para crear scripts, macros y cosas por el estilo, algo muy apropiado para la Web de mediados de los años '90.

La principal ventaja de JavaScript es su sencillez de aprendizaje para las cosas comunes (luego se vuelve endemoniado si quieres meterte a fondo, pero eso es otra cuestión) y que funciona tanto en los navegadores como en el servidor (a través de plataformas como Node.js).

Y además, muchas veces es necesario llevar a la Web los resultados de los algoritmos de aprendizaje automático e, incluso, por qué no, aplicarlos en tiempo real en el navegador (o en el servidor).

Pero ¿qué pasa con el ecosistema? ¿Hay paquetes/librerías enfocadas a ciencia de datos que trabajen con JavaScript? Pues sí, y cada vez más, y también APIs de todo tipo que se pueden llamar desde un navegador aunque el procesamiento se haga en otro lado. Por ejemplo, TensorFlow.js es la versión para JavaScript de la archiconocida biblioteca de aprendizaje automático y te permite implementarla en el navegador. ¿Que necesitas hacer procesamiento de imágenes con IA en el navegador? pues OpenCV.js al rescate. ¿Redes neuronales avanzadas? Ningún problema con Synaptic.js. ¿Visualización de resultados? Pues Chart.js es una gran opción. Es evidente que no tiene tanta oferta como otros Python o R, pero cada día hay más, y la oferta actual no es nada desdeñable.

De todos modos hay que ser realista: JavaScript no será tu lenguaje principal para desarrollo en Inteligencia Artificial, pero sí que es un gran complemento para hacer muchas cosas, especialmente visualización, y conviene aprenderlo porque te va a servir para todo un poco. Y, si quieres exponer tus modelos hacia el exterior, seguramente lo acabarás haciendo a través de alguna interfaz web.

En conclusión

Hay muchos lenguajes que se pueden utilizar en Machine Learning para alguno de los pasos de su flujo o para alguna de sus facetas. Sin embargo, a la hora de aprender el tiempo es escaso y hay que decidirse por aquellos que te permitan obtener el mayor beneficio con el menor esfuerzo. En este artículo hemos listado 4 lenguajes de programación que te permiten precisamente eso, y nos hemos basado en su popularidad/demanda, su ecosistema que permite obtener resultados rápidos, y las facetas que cubren.

Con los 4 elegidos cubres la mayor parte de los aspectos que puedas necesitar. Si solo te quieres quedar con uno, seguramente sería Python, ya que es el más completo y que más "checks" marca. SQL Sería otra recomendación casi indispensable, ya que gran parte del trabajo de ciencia de datos implica la interacción con datos, algo para lo que SQL está especialmente diseñado.

 

80.000 desarrolladores responden: lenguajes de programación más queridos y temidos y qué paga mejor en 2021

04/08/2021
Artículo original

80.000 desarrolladores responden:  lenguajes de programación más queridos y temidos y qué paga mejor en 2021

Stack Overflow ha realizado un año más su encuesta mundial para conocer los lenguajes de programación favoritos de los desarrolladores. Como ya sucedió en la encuesta de 2020, Rust vuelve a triunfar e incluso ha sido aún más valorado que en 2020, con un 86,69% de desarrolladores que eligieron Rust como el lenguaje que más "aman".

Ahora bien, aunque Rust sea el lenguaje más "amado", hay otros dos en los que los programadores prefieren trabajar y son Python y Typescript. Esto tiene una sencilla explicación: aunque este 2021 haya sido un gran año para Rust, aún no es tan conocido.

Este ha sido un buen año para Rust. Destaca la creación de la Rust Foundation que busca apoyar el desarrollo del lenguaje de programación y su ecosistema y de la que forman parte directores provenientes de cada una de las empresas fundadoras de Rust (gigantes como Google, Microsoft, Amazon Web Services, Huawei y Mozilla).

Más adelante, Facebook que lleva años usando Rust, se subió al carro de esta Fundación. Aún así le falta popularidad aunque más programadores lo conocen este año, si nos fijamos en las cifras de 2020 en donde solo el 5,11% de los desarrolladores entrevistados decía haber usado Rust y este año esta cifra es del 7,03%.

Firefox Tz1byznq44

Otros de los lenguajes más amados son Clojure, TypeScript, Elixir, Julia y Python, en este orden, como se puede ver en el gráfico realizado por Stack Overflow tras la encuesta a 80.000 desarrolladores de 181 países (unos 1.500 fueron encuestados en España).

Javascript, HTML/CSS y Python son los más utilizados

Firefox K9lg0rfwqy

Si nos fijamos en los lenguajes de programación más usados nos encontramos con que por noveno año consecutivo, Javascript vuelve a ser el más utilizado por los programadores. "Para la mayoría de los desarrolladores, programar es programar en la web", dicen los creadores de este estudio. Python ha superado a SQL para llegar a ser el tercer lenguaje más usado del momento, tras HTML/CSS. Java, Node.js y TypeScript también encabezan la lista de los lenguajes de programación más usados por los desarrolladores.

Con todo esto, cabe destacar que, una vez más, Javascript se encuentra entre los lenguajes más "temidos" a pesar de su gran cuota de mercado. Casi el 40% de los programadores que han participado de este estudio dicen no querer usarlo. Aunque la cifra es mala, Javascript no tiene tan mala fama como Java, PowerShell o Groovy, por mencionar algunos de los lenguajes menos queridos. También destaca que aunque C sigue siendo un lenguaje muy utilizado, hay más desarrolladores que lo temen (66%) que los que lo aman (39,56%).

Clojure destaca como la tecnología que más paga

lenguaje de programación

Ahora si hablamos de beneficios económicos para los programadores, encontramos a Clojure como "la que más paga" a los profesionales de este lenguaje, mientras que Dart es la que menos paga, con una gran diferencia.

El pasado año, las más pagadas eran Perl, Scala, Go, Rust y Ruby. En este 2021, encontramos que tras Clojure están F#, Elixir, Erlang y Perl. Rust se ubica en el puesto octavo y Phyton se ubica muy por detrás, en el 19º. Este es un dato muy importante para los profesionales del sector que siempre buscan ir aprendiendo para conseguir mayores beneficios con sus labores.

{"videoId":"x812d1v","autoplay":true,"title":"Devbook: un motor de búsqueda para programadores"}
(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

Cómo depurar aplicaciones .NET para Linux con Visual Studio desde Windows

02/08/2021
Artículo original

Imagen ornamentalUna de las mejores características de .NET Core cuando salió (y ahora de .NET) es que permite crear aplicaciones multiplataforma. Esto significa que podemos crear aplicaciones para Windows, Linux o macOS con la misma base de código y, si usamos .NET Maui o Uno Platform, podemos crear también aplicaciones móviles para Android o iOS, lo cual es genial.

Aunque se pueden utilizar otro tipo de editores, como Visual Studio Code o Jetbrains Rider, lo cierto es que la mayoría de los desarrolladores utilizan Visual Studio. Lo malo de Visual Studio es que solamente funciona en Windows y en macOS, por lo que si quieres depurar aplicaciones Linux solo te queda la opción de usar un depurador remoto ¿verdad?

Pues no. Lo cierto es que desde Visual Studio puedes depurar aplicaciones Linux directamente en Windows gracias a la magia del subsistema Linux de Windows.

Para ello hay que habilitar algunas opciones y hacer algunos ajustes en Visual Studio.

Antes de nada, asegúrate de que tienes instalado WSL2 en tu Windows y luego mira el vídeo que te pongo a continuación para ver paso a paso cómo lograrlo. Aunque esta característica está pensada para depurar sobre todo aplicaciones Web ejecutándose en Linux, también funciona con aplicaciones de consola, que es lo que muestro en el vídeo, pero tienen una pequeña limitación:

[youtube:bMKKsaWjt3s]

Otra cosa interesante: aunque, como se explica en el vídeo, en el caso de las aplicaciones de consola no puedes responder a las peticiones de datos que se muestren por la consola, lo que sí puedes conseguir de manera sencilla es pasarle parámetros al ejecutable cuando se vaya a lanzar para depurar.

Para ello debes abrir el archivo launchSettings.json de la carpeta Properties y añadir la siguiente propiedad a la definición del nodo de depuración con Linux:

"commandLineArgs": "tuApp.dll <parametros>"

Es decir, obviamente hay que sustituir el nombre de tu aplicación y los parámetros que quieras. Solo un detalle importante: debes poner la extensión .dll y no .exe, aunque sea un programa de línea de comandos. El motivo es que en .NET el .exe en realidad es un lanzador para el verdadero ensamblado que es la DLL y, por lo tanto, lo que se lanza y se depura es este último archivo.

¡Espero que te resulte útil!

Antes de que se impusiera Python, estos fueron los lenguajes con los que se desarrollaba inteligencia artificial

01/08/2021
Artículo original

Antes de que se impusiera Python, estos fueron los lenguajes con los que se desarrollaba inteligencia artificial

Hoy en día, aprender inteligencia artificial casi se ha convertido en sinónimo de aprender a programar en Python. Este lenguaje de programación creado por Guido Van Rossum en 1991 es, con diferencia, el más usado hoy en día en proyectos de inteligencia artificial, sobre todo en el campo del 'machine learning'.

Ayuda a ello, además de su popularidad como lenguaje de programación generalista (y también en campos relacionados, como el análisis de datos) que todas las grandes bibliotecas de IA (Keras, TensorFlow, SciPy, Pandas, Scikit-learn, etc) estén diseñadas para trabajar con Python.

Sin embargo, la inteligencia artificial es mucho más antigua que Python, y hubo otros lenguajes que destacaron en este campo durante décadas antes de su desembarco. Echemos un vistazo a los mismos:

IPL

El Information Processing Language (IPL) es un lenguaje de bajo nivel (casi tanto como el ensamblador) que fue creado en 1956 con el fin de demostrar que los teoremas expresador en el 'Principia Mathematica' por los matemáticos y filósofos Bertrand Russell y Alfred North Whitehead podían ser probados recurriendo a la computación.

IPL introdujo en la programación características que hoy siguen plenamente vigentes como los símbolos, la recursividad o el uso de listas. Este último, un tipo de dato tan flexible que permitía a su vez introducir una lista como elemento de otra lista (que a su vez podía introducir otra lista como elemento, etc.) resultó fundamental a la hora de usarlo para desarrollar los primeros programas de IA, como Logic Theorist (1956) o el programa de ajedrez NSS (1958).

Pese a su importancia en la historia de la IA, varios factores (el primero de ellos, lo complejo de su sintaxis) hizo que fuera rápidamente sustituido por el siguiente lenguaje de la lista.

LISP

LISP es el más antiguo de los lenguajes de programación dedicados a la inteligencia artificial entre aquellos que aún siguen en uso; y también es el segundo lenguaje de programación de alto nivel de la historia: fue creado en 1958 (un año después que FORTRAN y uno antes que COBOL) por John McCarthy, quien dos años antes ya había sido responsable de acuñar el término 'inteligencia artificial'.

McCarthy había desarrollado poco antes un lenguaje denominado FLPL (FORTRAN List Processing Language) una extensión de FORTRAN, y decidió recopilar en un mismo lenguaje la naturaleza de alto nivel de FLPL, todas las novedades aportadas por IPL, y el sistema formal conocido como cálculo lambda. El resultado fue bautizado como LISP (de 'LISt Processor').

Al mismo tiempo que desarrollaba FLPL, McCarthy también formulaba la llamada 'poda alfa-beta', una técnica de búsqueda que reduce el número de nodos evaluados en un árbol de juego. Y, para implementarla, introdujo un elemento tan fundamental en la programación como son las estructuras if-then-else.

Rápidamente, los programadores se enamoraron de la libertad que les ofrecía la flexibilidad de este lenguaje, y de su faceta como herramienta de prototipado. Así, durante el siguiente cuarto de siglo, LISP se convirtió en el lenguaje de referencia en el ámbito de la IA. Con el tiempo, LISP se fragmentó en toda una serie de 'dialectos' aún vigentes en varios ámbitos de la computación, como Common LISP, EMACS LISP, Clojure, Scheme o Racket.

Lisp
Ejemplo de código Common LISP.

PROLOG

El lenguaje PROLOG (del francés 'programmation en logique'), del que ya os hemos hablado en otras ocasiones, nació en un momento duro para el desarrollo de la inteligencia artificial, a las puertas del primer 'Invierno de la IA', cuando el furor inicial por las aplicaciones de esta tecnología se estrellaron contra el escepticismo provocado por la ausencia de avances, lo que generó desinversión pública y privada en su desarrollo.

Concretamente, fue creado en 1972 por el profesor de ingeniería informática francés Alain Colmeraurer, con el objetivo de introducir en el desarrollo de software el uso de las cláusulas de Horn, una fórmula de la lógica proposicional. Aunque globalmente nunca llegó a ser tan usado como LISP, sí se convirtió en el principal lenguaje de desarrollo de IA en su continente de origen (así como en Japón).

{"videoId":"x7ziu8u","autoplay":true,"title":"Las matemáticas no se me dan mal, quiero aprender a programar"}

Al ser un lenguaje basado en el paradigma de programación declarativa —como LISP, por otra parte—, su sintaxis es muy diferente de la de los típicos lenguajes de programación imperativa como Python, Java o C++.

La facilidad que PROLOG proporciona a la hora de gestionar métodos recursivos y las coincidencias de patrones provocaron que IBM apostara por implementar PROLOG en su IBM Watson para tareas de procesamiento de lenguaje natural.

Prolog
Ejemplo de código PROLOG en la IDE SWI-Prolog.
(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

Los números de tarjeta de los desarrolladores de Python, amenazados por paquetes de malware subidos al repositorio PyPI

30/07/2021
Artículo original

Los números de tarjeta de los desarrolladores de Python, amenazados por paquetes de malware subidos al repositorio PyPI

Cada vez más, los desarrolladores recurren a repositorios y gestores de paquetes para gestionar las dependencias de muchos de sus proyectos de programación. Así, los usuarios de NodeJS cuentan con NPM (siglas de 'Node Package Manager'), y los de Python cuentan con varios repositorios, como Conda o PyPI (Python Package Index).

Por desgracia, además de facilitar enormemente la vida a muchos desarrolladores, esta clase de plataformas ofrecen también destacadas puertas de entrada al malware. En palabras del CTO de JFrog, Asaf Karas,

"El descubrimiento continuo de paquetes de software malicioso en repositorios populares como PyPI es una tendencia alarmante que puede conducir a ataques generalizados en la cadena de suministro. […] Estamos ante una amenaza sistémica".

Ocho bibliotecas retiradas de PyPI

En este caso, de hecho, han sido los administradores de PyPI quienes han tenido que eliminar, a lo largo de esta semana, hasta ocho bibliotecas tras serles notificado por el equipo de seguridad de JFrog que contenían código malicioso.

Dos de los paquetes (pytagora y pytagora2, subidos por el usuario 'leonora123') permitían ataques RCE (de ejecución de código remoto) conectando el equipo de la víctima al puerto TCP 9009 y facilitando la ejecución de comandos maliciosos en el mismo.

Otros seis paquetes (noblesse, genesisbot, are, suffer, noblesse2 y noblessev2, desarrollados por los usuarios 'xin1111' y 'suffer') actuaban como ladrones de datos: una vez instalados, recopilaban datos del equipo buscando desde tokens de Discord a información general del sistema (dirección IP, nombre del equipo y el usuario, clave de licencia, versión de Windows, etc)…

…pero también han estado recopilando información sobre nuestras tarjetas de crédito, extraída de los datos guardados para 'autcompletar' en los navegadores que tengamos instalados.

La mayoría de los paquetes de este segundo grupo se 'venden' ante el resto de usuarios como "optimizadores", aunque no queda muy claro de qué: en el caso de 'Noblesse' (ver imagen inferior), los desarrolladores de este paquete afirman que es tan capaz de optimizar nuestro código Python como de optimizar nuestro PC para ejecutar Python.

Noblesse

Además, gran parte de su código real se muestra ofuscado ante el usuario que indague en el mismo: se ha encriptado en base64 haciendo uso de herramientas como PyArmor. Según Karas,

"La capacidad de los atacantes de utilizar técnicas de ofuscación simples para introducir malware significa que [tanto los mantenedores de los repositorios de software como] los desarrolladores deben estar vigilantes".

Ejemplo

Globalmente, los 8 paquetes maliciosos se descargaron 30.000 veces antes de verse eliminados del portal PyPI. Y, por desgracia, no es la primera vez que ocurre: en el pasado ya ha habido ataques similares que buscaba robar claves SSH y GPG, o instalar puertas traseras ocultas en sistemas Linux.

{"videoId":"x80tm6d","autoplay":true,"title":"Ransomware: qué es, cómo infecta y cómo protegerse"}

Vía | Catalin Cimpanu & The Hacker News

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

Código CSS anidado: la W3C aprueba un borrador que introduciría en el lenguaje CSS nativo esta funcionalidad

28/07/2021
Artículo original

Código CSS anidado: la W3C aprueba un borrador que introduciría en el lenguaje CSS nativo esta funcionalidad

Las hojas de estilo en cascada (más conocidas como CSS) son el lenguaje de diseño (y una de las tres grandes bases, junto a HTML y JavaScript) de la World Wide Web, el lenguaje que permite a los desarrolladores dar formato a las páginas web aplicándoles estilos que alteran aspectos como colores, tipografías o espaciados.

Y ahora, este lenguaje nacido en 1996 está quizá a punto de experimentar uno de los mayores cambios de su historia. Según publica Miriam Suzanne, miembro del CSS Working Group del W3C (el organismo encargado de establecer los estándares de las tecnologías web), se ha aprobado el paso de la especificación de CSS Nesting de la actual fase de 'borrador para editores' a la de 'primer borrador de trabajo público'.

Esto lo introduce en el proceso de revisión de propuestas conocido como 'Recommendation Track', lo que puede desembocar en su inclusión en la versión estándar del lenguaje CSS. La versión online, aún clasificada como 'borrador para editores', especifica que la propuesta estaba disponible "únicamente para su debate" y que "su publicación aquí no implica la aprobación de su contenido por parte del W3C".

Pero, ¿qué es 'CSS Nesting' (literalmente, 'anidamiento CSS')? Fundamentalmente, se trata de permitir que las reglas CSS puedan expresarse de forma anidada, incluyendo bloques de código unos dentro de otros, una opción no disponible por ahora de manera nativa.

Todo esto con el fin de:

  1. Hacer el código más legible.
  2. Aumentar su modularidad y la facilidad de mantenimiento de las hojas de estilo.
  3. Reducir la duplicación de código.

Veamos un ejemplo:

Css Anidado

Hoy en día, cuando escribimos CSS, nos vemos obligados a dominar los 'selectores CSS' para definir las reglas aplicables a nuestro sitio y precisar a qué elementos queremos aplicar determinado estilo. El objetivo del anidamiento CSS es que tengamos que utilizarlos mucho menos a menudo, porque usando el indentado ya estaremos supliendo su labor (de una manera, además, mucho más legible para humanos).

Esto conllevará algunos cambios de sintaxis. Por ejemplo, '&' pasará a convertirse en el selector de anidamiento para establecer reglas condicionales. Así en

.ejemplo { background: grey;

&:hover { background: red; } }

En este ejemplo, el selector &:hover está haciendo referencia, realmente, a .ejemplo:hover; es decir, a aquellos casos en que tengamos el ratón sobre el elemento 'ejemplo'.

Trabajar desde ya con el nuevo borrador

Pero, ¿qué hacer si nos ha gustado la idea y queremos empezar a trabajar con CSS siguiendo las recomendaciones del borrador? Fácil: los navegadores no entenderían la nueva sintaxis y la web resultante no podría visualizarse correctamente.

A no ser, claro, que recurriéramos a una herramienta de transformación de CSS como PostCSS, que ya cuenta con un plug-in (postcss-nesting) para transformar CSS anidado en el CSS ajustado al actual estándar…

… así, utilizando herramientas de terminal como npm y npx, podremos instalar PostCSS y usarlo luego para transformar ficheros .pcss (anidados) en .css.

Tanto esta opción como una futura oficialización del 'CSS Nesting' constituyen alternativas al uso de preprocesadores CSS tan populares como SASS (aunque éstos cuentan con otros atractivos además del uso del anidamiento).

{"videoId":"x80zb8m","autoplay":true,"title":"INTERNET MÁS RÁPIDO: Todo lo que tienes que saber sobre HTTP 3"}
(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

Estos son los siete consejos para programadores open source publicados por el creador de SumatraPDF en el 15º aniversario de su app

27/07/2021
Artículo original

Estos son los siete consejos para programadores open source publicados por el creador de SumatraPDF en el 15º aniversario de su app

Krysztof Kowalczyk es programador: ha escrito varios libros de programación que están accesibles en formato web y, sobre todo, es conocido por haber creado y seguir desarrollando uno de los lectores de PDF más populares después de Adobe Acrobat: SumatraPDF.

Y da la casualidad de que SumatraPDF acaba de cumplir 15 años desde su primer lanzamiento, por lo que Kowalczyk ha decidido escribir un extenso post en el que hace dos cosas: repasar datos curiosos sobre su lector de PDFs… y lanzar una serie de utilísimos consejos para el resto de programadores que trabajan con código abierto.

Entre las curiosidades, cabe destacar el hecho de que SumatraPDF es un software que consta de 127.000 líneas de código, escrito mayoritariamente por dos personas. Que nació como consecuencia de que Palm le encargara crear un lector de PDFs para Foleo, una minicomputadora portátil como ARM y Linux que nunca llegó a salir a la luz.

Pero, ¿qué ha aprendido en la década y media que ha pasado programándolo?

Es mi proyecto y me lo codifico como quiero

Kowalczyk afirma que uno de los grandes atractivos de trabajar en código por el que no te pagan por escribir es que nadie puede decirte qué hacer o cómo hacerlo. Nada de codificar a gusto de otros:

"Mi código no pasaría una revisión de código en Google y no porque sea malo, sino porque a menudo es poco ortodoxo. Fuera del dogma aceptado".

"Implementé un sistema de interfaz de usuario inspirado en CSS: no es genial, pero es mío. Y planeo reemplazarlo con uno diferente. Porque puedo".

No comiences un proyecto open source pensando en ganar dinero…

Rara vez podrás tener libertad para hacer lo que quieras y ganar dinero por ello, así que elige lo más importante para ti, explica. Afirma ganar poco más de 100 dólares al mes gracias a Patreon y a las donaciones vía PayPal, pero poco más:

"El código abierto no es un buen modelo de negocio. Si quieres ganar dinero, haz literalmente cualquier otra cosa: intenta vender software, sé consultor, desarrolla un SAAS y cobrar mensualmente por ello, roba un banco…".

…pero trata tu proyecto open source como si fuera software comercial

Lo anterior no está reñido con su convicción de que si deseas que tu software 'open source' sea lo más exitoso posible, debes tratarlo como si fuera un producto comercial. Pero, ¿qué significa eso en la práctica?

"Desde el primer día creé un sitio web para la aplicación. Tenía capturas de pantalla, tenía documentación, era fácil de descargar e instalar. Por supuesto, un alma amable en Reddit lo llamó "un sitio web hecho por un niño de 6 años". La lección aquí es doble: 1) ignorar a haters y gilip*llas, 2) un sitio web construido por un niño de 6 años es mejor que ningún sitio web. No tiene que ser bonito, tiene que ser funcional".

"Todo lo que es una buena idea para promover el software comercial también es una buena idea para el proyecto de código abierto".

Por eso también recomienda emprender otras medidas, como la obtención de usuarios tempranos, descubrir qué funcionalidades quieren, e implementar un montón de éstas antes de saber si a alguien le importa lo que estamos haciendo.

Ser pequeño y rápido siempre será una ventaja

Kowalczyk afirma que nunca llegará el momento en el que los usuarios pidan aplicaciones "hinchadas y lentas" por lo que "ser pequeño y rápido siempre será una ventaja". Y SumatraPDF, con su instalador de menos de 10 MB y su inicio cuasi instantáneo, cumple de sobra con tal objetivo.

"La simplicidad vende […] eso lo aprendí de la historia de Mozilla Firefox. Antes de Firefox existía Netscape Navigator. Era una bestia de una aplicación, que combinaba el navegador web con el cliente de correo electrónico. El más sencillo Firefox se terminó comiendo por completo a Navigator".

"Desde el principio mi objetivo fue mantener la interfaz de usuario de SumatraPDF lo más sencilla posible, como una aplicación 80/20: 80% de la funcionalidad con el 20% de la interfaz de usuario".

Pero, ¿cómo logra mantener así de ligera su aplicación (además de rechazando constantemente las peticiones de añadir nuevas funcionalidades o nuevos iconos a la interfaz)?

"Evito las abstracciones innecesarias. […] Podría usar envoltorios como Qt, WxWindows o Gtk; son más fáciles de usar, pero causan un hinchamiento desmesurado [de la app]".

"No tengo miedo de escribir mi propia implementación de las cosas. […] Digamos que necesito hacer una solicitud de red: tengo la opción de incluir una biblioteca monstruosa Como curl o de escribir 300 líneas de código usando las API de Win32. Yo opté por escribir las 300 líneas de código".

La multiplataforma está sobrevalorada

Kowalczyk califica SumatraPDF como una aplicación "descaradamente sólo-para-Windows". Las peticiones de soporte a otras plataformas son frecuentes, pero él las descarta de plano. Y dejando de lado la falta de tiempo, enarbola otro argumento más:

"Creo que una excelente aplicación para una plataforma puede llegar a ser más popular que una aplicación mediocre para tres plataformas".

'Be water, my friend'

Kowalczyk cita al gran Bruce Lee y nos recomienda 'ser agua', "adaptarnos a los cambios del mundo". ¿Qué tipo de cambios?

  • De repositorio: "Empecé con Sourceforge, cambié a code.google.com y luego a github.com".
  • De CMS para el foro: "He cambiado el software del foro ya tres veces".
  • De Windows: Antes sólo existía SumatraPDF para 32 bits y ahora, aunque sigue existiendo, hace hincapié en la de 64 bits; al mismo tiempo, Windows XP pasó de ser la versión más usada por los usuarios de su programa a dejar de ser compatible con éste.

"SumatraPDF no fue la primera aplicación de lector de PDF jamás escrita… pero la mayoría de los lectores de PDF no se convierten en lectores multiformato. [Era] una idea obvia, pero me llevó 5 años darme cuenta. […] Creo que ser multiformato ayudó a SumatraPDF a ser popular".

{"videoId":"x80kt27","autoplay":true,"title":"La carrera de programador en 2017 y en el futuro (con Javier Santana)"}

Haz código de calidad

Como decía más arriba, que el código no sea ortodoxo no significa que tenga que ser de baja calidad, pero

"¿cómo mantener un código de alta calidad mientras trabajas en su mayor parte en solitario, sin que nadie haga revisiones de código, sin un equipo de control de calidad?".

Kowalczyk propone varias opciones: "usa mucho tu propia aplicación… prueba el código tú mismo"; apostar por los informes automatizados de fallos, las pruebas de esfuerzo, las unitarias y los análisis de código estático:

"Pon al máximo el nivel de advertencias en el compilador de C++, convierte las advertencias en errores, activa la opción /analyze de Visual Studio, etc.".

Imagen | OpenSource.com

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

La ausencia de un simple "&" en el código ha causado un fallo masivo en Chrome OS que impide volver a acceder a los ficheros locales

27/07/2021
Artículo original

La ausencia de un simple

El pasado lunes 19 de julio, Google lanzó una actualización de su sistema operativo Chrome OS, la 91.0.4472.165, que rápidamente empezó a dar problemas a los usuarios: les impedía iniciar sesión en sus sistemas. Google detuvo inmediatamente el despligue de la misma, cuando sólo había afectado a los usuarios que habían reiniciado sus equipos tras la descarga de la nueva versión.

A estos últimos sólo se les pudo ofrecer soluciones para recuperar el acceso a su sistema que pasaban, inevitablemente, por borrar los datos locales del dispositivo (revertir el dispositivo a una versión anterior vía USB, restaurar estado de fábrica, o borrar y recrear la cuenta de usuario).

Un sencillo —casi imperceptible— error tipográfico ha provocado que miles de Chromebooks hayan perdido el acceso a sus datos.

Sin embargo, lo interesante de esta actualización fallida (y, por supuesto, ya parcheada), tiene que ver con la razón de dicho fallo. ¿Quizá una corrupción de algún fichero del sistema? ¿Quizá —qué sé yo— alguna extraña y compleja vulnerabilidad del kernel? Para nada: el problema residía en un "&".

Lo extraño del error no es que se cometiera, es que no se detectaran sus efectos

Sí, el carácter conocido en inglés como 'ampersand', usado como sustituto de la palabra 'and', es también un operador fundamental en la mayoría de los lenguajes de programación. El problema de esta actualización vino generado por una revisión del código que, inadvertidamente, eliminó uno de estos operadores en el siguiente fragmento de código C++:

if (key_data_.has_value() && !key_data_->label().empty())

Nada impedía que el código compilase, pues el código sigue teniendo sentido aun cambiando "&&" por "&"… sencillamente, el comportamiento del software varía totalmente.

Así, donde "&&" es un operador AND lógico que actúa como una forma de indicar que deben cumplirse simultáneamente dos o más condiciones para realizar una opción, "&" se convierte en un operador AND de bit a bit: compara los bits uno a uno, si ambos son "1" el resultado es "1", en caso contrario "0".

Esto significa que "&" evalúa ambos lados de la operación, mientras que "&&" evalúa el primer elemento de la operación, y sólo si es 'true' continúa y evalúa el segundo elemento.

Debido a este error, el Chrome OS actualizado nunca llegaba a verificar correctamente las contraseñas de los usuarios comparándolas con las claves almacenadas, por lo que incluso cuando se introducían las contraseñas correctas, el SO devolvía el mensaje de "Lo siento, no se pudo verificar su contraseña".

Queda la duda de cómo un error cómo éste se le pudo pasar a Google: Chrome OS, al igual que el navegador Chrome, cuenta con tres canales de pruebas ('canary', 'dev' y 'beta') con semanas de pruebas de diferencia entre lanzamientos, lo que debería servir para cazar bugs tan obvios como éste antes de pasar al canal estable. De hecho, una prueba unitaria automatizada debería haberlo detectado también.

En cualquier caso, éste constituye un ejemplo magnífico de cómo los peores errores de programación pueden depender de algo tan simple como un carácter.

{"videoId":"x7ziu8u","autoplay":true,"title":"Las matemáticas no se me dan mal, quiero aprender a programar CAPTCHA 2x04"}

Vía | The Register

(function() { window._JS_MODULES = window._JS_MODULES || {}; var headElement = document.getElementsByTagName('head')[0]; if (_JS_MODULES.instagram) { var instagramScript = document.createElement('script'); instagramScript.src = 'https://platform.instagram.com/en_US/embeds.js'; instagramScript.async = true; instagramScript.defer = true; headElement.appendChild(instagramScript); } })();

Como descargar videos y fotos de Instagram

25/07/2021
Artículo original

Sois muchos los lectores que nos habéis pedido un tutorial de cómo descargar videos y fotos de Instragram de una manera fácil y rápida.

Pues bien, desde Linea de código hemos analizado varias herramientas de descarga de material multimedia desde Instagram y otras redes sociales.

Finalmente hemos optado por iGram, una herramienta web en línea para ayudarlo a descargar videos de Instagram. iGram está diseñado para ser fácil de usar en cualquier dispositivo, como móvil, tableta o computadora. demás también puedes descargar fotos y videos de IGTV.

¿Cómo descargar fotos y videos de instagram?

Para ello solo hay que seguir los siguientes pasos:

Copiar el enlace de descarga desde Instagram

Abrimos la aplicación o el sitio web de Instagram, copiamos la URL de la foto, video, carrusel o IGTV.

Pegar el enlace en iGram

Desde iGram pegamos el enlace y presionamos el botón descargar

Descargar

iGram te ofrecerá varias opciones de calidad, descarga lo que se ajuste a tus necesidades.

Página Siguiente