Hoy os traigo un ejemplo de la potencia que tiene HTML y cómo hay muchas cosas que podemos hacerlas simplemente utilizando este lenguaje. Para ello os voy a enseñar a hacer un autocompletable.
Os dejo el enlace a GitHub: Autocompletable
Hoy os traigo un ejemplo de la potencia que tiene HTML y cómo hay muchas cosas que podemos hacerlas simplemente utilizando este lenguaje. Para ello os voy a enseñar a hacer un autocompletable.
Os dejo el enlace a GitHub: Autocompletable
Hoy os traigo una serie de repositorios de GitHub que os permitirán aprender más sobre JavaScript y profundizar más en las curiosidades del leguaje.
⭐ 178k+
Una serie de libros que profundizan en los mecanismos fundamentales del lenguaje JavaScript.
Enlace: https://github.com/getify/You-Dont-Know-JS
⭐ 34k+
Una lista de ejemplos curiosos y difíciles de JavaScript.
Enlace: https://github.com/denysdovhan/wtfjs
⭐ 8k+
Una referencia rápida sobre buenas prácticas y estándares aceptados de código JavaScript.
Enlace: https://github.com/jstherightway/js-the-right-way
⭐ 90k+
Principios de ingeniería de software del libro Clean Code, adaptados para JavaScript.
Enlace: https://github.com/ryanmcdermott/clean-code-javascript
⭐ 62k+
Una guía de 33 conceptos modernos de JavaScript que todo desarrollador debería conocer.
Enlace: https://github.com/leonardomso/33-js-concepts
⭐ 7k+
Una guía explicativa para comenzar a escribir ES6 de manera clara y comprensible.
Enlace: https://github.com/metagrover/ES6-for-humans
⭐ 187k+
Este repositorio contiene ejemplos basados en JavaScript de muchos algoritmos y estructuras de datos populares.
Enlace: https://github.com/trekhleb/javascript-algorithms/blob/master/README.es-ES.md
Hoy os traigo Roadmap.sh, una plataforma en línea que ofrece guías detalladas y bien organizadas para ayudar a los desarrolladores y profesionales de la tecnología en su proceso de aprendizaje y en el desarrollo de habilidades clave. Estas guías, conocidas como «mapas de ruta», son representaciones visuales que indican las tecnologías, herramientas y conceptos necesarios para avanzar en una carrera tecnológica específica.
Roadmap.sh es una herramienta útil para quienes están comenzando en un área tecnológica nueva o desean profundizar sus conocimientos en un campo específico. Los mapas de ruta ayudan a:
En resumen, Roadmap.sh es una herramienta valiosa para quienes buscan un enfoque claro y organizado para avanzar en su carrera tecnológica.
Para obtener un tutorial más detallado sobre cómo iniciar Windows 10 en modo seguro, os dejo este tutorial en inglés: How to Start Windows 10 in Safe Mode with Networking
Básicamente los pasos a seguir son los siguientes:
Bash (Bourne Again Shell) es un lenguaje de shell basado en el Bourne Shell original, que fue distribuido con el V7 Unix en 1979 y se convirtió en el estándar para escribir scripts de shell.
En la actualidad, es el shell principal en la mayoría de las distribuciones de Linux, en macOS y, recientemente, ha sido habilitado para ejecutarse en Windows a través del WSL (Subsistema de Windows para Linux).
CARÁCTER | DESCRIPCIÓN |
---|---|
= | es igual a |
== | es igual a |
!= | no es igual a |
< | es mayor que el orden alfabético ASCII |
> | es mayor que el orden alfabético ASCII |
-z | la cadena es nula (es decir, de longitud cero) |
-norte | la cadena no es nula (es decir, de longitud cero) |
CARÁCTER | DESCRIPCIÓN |
---|---|
-eq | es igual a |
-ne | no es igual a |
-gt | es mayor que |
-ge | es mayor o igual a |
-lt | es menor que |
-le | es menor o igual a |
< | es menor que – colocar entre paréntesis dobles |
<= | es menor o igual que (misma regla que la fila anterior) |
> | es mayor que (misma regla que la fila anterior) |
>= | es mayor o igual que (misma regla que la fila anterior) |
CÓDIGO DE SALIDA NO. | DESCRIPCIÓN |
---|---|
1 | Catchall para errores generales |
2 | Mal uso de las funciones integradas del shell |
126 | El comando invocado no puede ejecutarse |
127 | Comando no encontrado |
128 | Argumento no válido para salir |
128+n | Señal de error fatal «n» |
130 | Script terminado por Control-C |
COMBINACIÓN DE TECLAS | DESCRIPCIÓN |
---|---|
Ctrl+C | La señal de interrupción envía SIGINT al trabajo que se ejecuta en primer plano. |
Ctrl+Y | El carácter de suspensión retrasada. Provoca la detención de un proceso en ejecución cuando intenta leer la entrada del terminal. El control se devuelve al shell, el usuario puede poner en primer plano, en segundo plano o finalizar el proceso. La suspensión retrasada solo está disponible en sistemas operativos que admiten esta función. |
Ctrl+Z | La señal de suspensión envía un SIGTSTP a un programa en ejecución, deteniéndolo y devolviendo el control al shell. |
NOMBRE | NÚMERO | ACCIÓN | DESCRIPCIÓN |
---|---|---|---|
SIGHUP | 1 | salida | Cuelga |
SIGINT | 2 | salida | Interrumpe. |
SIGQUIT | 3 | volcado de memoria | En paz. |
SIGILL | 4 | volcado de memoria | Instrucción ilegal. |
SIGTRAP | 5 | volcado de memoria | Trampa de rastro. |
SIGIOT | 6 | volcado de memoria | Instrucción IOT. |
SIGEMT | 7 | volcado de memoria | Instrucción MT. |
SIGFPE | 8 | volcado de memoria | Excepción de punto flotante. |
SIGKILL | 9 | exit | Muertes (no se pueden atrapar ni ignorar). |
SIGBUS | 10 | core dump | Error de autobús. |
SIGSEGV | 11 | core dump | Violación de segmentación. |
SIGSYS | 12 | core dump | Mal argumento para la llamada al sistema. |
SIGPIPE | 13 | salida | Escribe en una pipa sin que nadie pueda leerlo. |
SIGALRM | 14 | salida | Despertador. |
SIGTERM | 15 | salida | Señal de terminación del software. |
CÓDIGO | DESCRIPCIÓN |
---|---|
s | setuid cuando está en la columna de usuario |
s | setgid cuando está en la columna del grupo |
t | sticky bit |
0—— | El derecho de acceso que debería tener este lugar no está concedido. |
4—–r | Se concede acceso de lectura a la categoría de usuario definida en este lugar. |
2—–w | Se concede permiso de escritura a la categoría de usuario definida en este lugar. |
1—–x | El permiso de ejecución se otorga a la categoría de usuario definida en este lugar. |
u | Permisos de usuario |
g | permisos de grupo |
oh | otros permisos |
ARCHIVO | INFORMACIÓN |
---|---|
/etc/profile | Ejecutado automáticamente al iniciar sesión |
~.bash_profile ——————— ~/.bash_login ——————— ~.profile |
Lo que se encuentre primero se ejecuta al iniciar sesión. |
~/.bashrc | Es leído por todos los shells sin inicio de sesión. |
OPERADOR | EFECTO |
---|---|
. | Coincide con cualquier carácter individual. |
? | El ítem anterior es opcional y se igualará, como máximo, una vez. |
* | El elemento anterior coincidirá cero o más veces. |
+ | El elemento anterior coincidirá una o más veces |
{N} | El elemento anterior coincide exactamente N veces. |
{N,} | El elemento anterior coincide N o más veces. |
{N,M} | El elemento anterior coincide al menos N veces, pero no más de M veces. |
– | Representa el rango si no es el primero o el último en una lista o el punto final de un rango en una lista. |
^ | Coincide con la cadena vacía al principio de una línea; también representa los caracteres que no están en el rango de una lista. |
$ | Coincide con la cadena vacía al final de una línea. |
[aoeiAOEI] | Coincide con 1 carácter cualquiera de la lista. |
[^AOEIaoei] | ¡Coincide con 1 carácter cualquiera, que no está en la lista! |
[af] | Coincide con 1 carácter cualquiera en el rango af |
BUILTIN | DESCRIPCIÓN |
: | Equivalente a verdadero. |
. | Lee y ejecuta comandos desde un archivo designado en el shell actual. |
[ | Es sinónimo de prueba pero requiere un argumento final de ]. |
alias | Define un alias para el comando especificado. |
bg | Reanuda un trabajo en modo de fondo. |
bind | Vincula una secuencia de teclado a una función o macro de línea de lectura. |
break | Sale de un bucle for, while, select o Until. |
builtin | Ejecuta el comando integrado del shell especificado. |
caller | Devuelve el contexto de cualquier llamada de subrutina activa. |
case | |
cd | Cambia el directorio actual al directorio especificado. |
command | Ejecuta el comando especificado sin la búsqueda normal del shell. |
compgen | Genera posibles coincidencias de finalización para la palabra especificada. |
complete | Muestra cómo se completarían las palabras especificadas. |
comopt | |
continue | Reanuda la siguiente iteración de un bucle for, while, select o Until. |
declare | Declara una variable o tipo de variable. |
dirs | Muestra una lista de los directorios recordados actualmente. |
disown | Elimina los trabajos especificados de la tabla de trabajos para el proceso. |
echo | Muestra la cadena especificada en STDOUT. |
enable | Habilita o deshabilita el comando de shell integrado especificado. |
eval | Concatena los argumentos especificados en un solo comando y ejecuta el comando. |
exec | Reemplaza el proceso de shell con el comando especificado. |
exit | Obliga al shell a salir con el estado de salida especificado. |
export | Establece las variables especificadas para que estén disponibles para los procesos de shell secundarios. |
fc | Selecciona una lista de comandos de la lista del historial. |
fg | Reanuda un trabajo en modo de primer plano. |
getopts | Analiza los parámetros posicionales especificados. |
hash | Encuentra y recuerda la ruta completa del comando especificado. |
help | Muestra un archivo de ayuda. |
history | Muestra el historial de comandos. |
if | Utilizado para ramificación. |
jobs | Enumera los trabajos activos. |
kill | Envía una señal del sistema al ID de proceso especificado (PID). |
let | Evalúa cada argumento en una expresión matemática. |
local | Crea una variable de alcance limitado en una función. |
logout | Sale de un shell de inicio de sesión. |
mapfile | |
popd | Elimina entradas de la pila de directorios. |
printf | Muestra texto usando cadenas formateadas. |
pushd | Agrega un directorio a la pila de directorios. |
pwd | Muestra el nombre de ruta del directorio de trabajo actual. |
read | Lee una línea de datos de STDIN y la asigna a una variable. |
readonly | Lee una línea de datos de STDIN y la asigna a una variable que no se puede cambiar. |
return | Obliga a una función a salir con un valor que puede ser recuperado por el script que la llama. |
set | Establece y muestra valores de variables de entorno y atributos de shell. |
shift | Gira los parámetros posicionales una posición hacia abajo. |
shopt | Alterna los valores de las variables que controlan el comportamiento opcional del shell. |
source | Lee y ejecuta comandos desde un archivo designado en el shell actual. |
suspend | Suspende la ejecución del shell hasta que se reciba una señal SIGCONT. |
test | Devuelve un estado de salida de 0 o 1 según la condición especificada. |
times | Muestra el tiempo acumulado de shell del sistema y del usuario. |
trap | Ejecuta el comando especificado si se recibe la señal del sistema especificada. |
type | Muestra cómo se interpretarían las palabras especificadas si se usaran como un comando. |
typeset | Declara una variable o tipo de variable. |
ulimit | Establece un límite en el recurso específico para los usuarios del sistema. |
umask | Establece permisos predeterminados para archivos y directorios recién creados. |
unalias | Elimina el alias especificado. |
unset | Elimina la variable de entorno o el atributo de shell especificado. |
until | Bucle que es muy similar al bucle while excepto que se ejecuta hasta que el comando de prueba se ejecuta con éxito. Mientras el comando de prueba falle, el ciclo hasta continúa. |
wait | Haga que el shell espere a que termine un trabajo. |
while | Espera a que se complete el proceso especificado y devuelve el estado de salida. |
Hoy os traigo una pregunta muy popular en una entrevista: ¿Cuál es la diferencia entre un Proceso y un Hilo?
Para entender bien la distinción, lo primero que tenemos que definir es lo que es un Programa. Un programa es un archivo ejecutable que contiene un conjunto de instrucciones que se almacenan en el disco. Un solo programa puede tener múltiples procesos asociados a él. Por ejemplo, Chrome crea procesos separados para cada pestaña abierta del navegador, pero todos y cada uno de los procesos pertenecen a Chrome.
Cuando un programa se carga en la memoria de un ordenador y comienza a ejecutarse, se convierte en un Proceso. El proceso recién activado requiere acceso a recursos esenciales como registros, un contador de programa y una pila de llamadas para operar.
En el contexto de un proceso en ejecución, un hilo representa la secuencia más pequeña de instrucciones que puede ser gestionada independientemente por el planificador del sistema operativo.
La relación entre un programa, un proceso y un hilo puede resumirse en tres pasos:
Existen varias diferencias clave entre los procesos y los hilos:
Fuente: ByteByteGo
¿Te has preguntado alguna vez cómo se ejecuta realmente tu código? ¿Te gustaría ver visualmente cómo cambian las variables y estructuras de datos a medida que avanzas línea por línea? Python Tutor es la herramienta perfecta para ti.
Python Tutor es una plataforma educativa gratuita que te permite visualizar la ejecución de tu código Python (y otros lenguajes) de manera interactiva, facilitando la comprensión de conceptos complejos y el seguimiento del flujo de tu programa.
Entrando en su web, puedes encontrar un ejemplo de como funciona para que veas lo útil que puede llegar a ser. Este es el ejemplo:
Enlace: https://pythontutor.com/
Tercera entrega de este grupo de artículos en el que os hablo de la ingeniería social, que es una de las amenazas más insidiosas en el ámbito de la ciberseguridad, explotando la confianza y la manipulación psicológica para acceder a información confidencial. Es crucial estar siempre alerta y educarnos sobre estas tácticas para no caer en sus trampas. Podéis leer antes la parte 1 (Enlace) y la parte 2 (Enlace).
Hoy os traigo una herramienta muy interesante para poder realizar este tipo de ataques.
El Social Engineer Toolkit (SET) es una suite diseñada para la ingeniería social que permite automatizar diversas tareas. Con SET, puedes clonar cualquier página web y lanzar un servidor para hacer phishing en segundos, o generar un código QR que dirija a una URL específica o ejecute una applet maliciosa cuando se escanee.
SET integra muchas funciones de Metasploit, por lo que es necesario tener Metasploit instalado para usar SET. Utilizaremos la distribución Kali Linux, que viene con SET y Metasploit preinstalados. Para ejecutarlo, búscalo en el menú de Aplicaciones o escribe setoolkit en la línea de comandos.
Aquí os muestro un ejemplo de la herramienta en un terminal KALI. La pantalla principal nos proporciona diversas opciones para ejecutar: la primera consiste en diferentes ataques de ingeniería social, la segunda ataques de exploit como inyecciones de SQL, entre otros…. y la tercera módulos de ataque de terceras partes. El resto son opciones para actualizar la herramienta, ayuda, créditos…
Os voy a explicar algunos de los ataques de ingeniería social que nos ofrece la herramienta:
Ofrece muchas más funciones (QRCode Generator Attack Vector, Website Attack Vectors, Third Party Modules, etc.) pero estas son las que me han parecido más interesantes.
Os dejo un vídeo, que aunque es antiguo y está algo desactualizado, nos sirve para entender SET. Enlace al vídeo
El Social Engineer Toolkit (SET) es una herramienta poderosa y versátil para llevar a cabo ataques de ingeniería social de manera eficiente. Su capacidad para automatizar tareas como la clonación de páginas web y la generación de códigos QR maliciosos lo convierte en un recurso valioso tanto para profesionales de la ciberseguridad como para aquellos que buscan comprender y mitigar este tipo de amenazas. Sin embargo, es crucial utilizarlo de manera ética y responsable, siempre con el objetivo de mejorar la seguridad y proteger la información. Con la distribución Kali Linux, que incluye ambas herramientas, SET se consolida como una herramienta esencial en el arsenal de ciberseguridad.
Hace un tiempo os traje una publicación en la que os mostraba algunas cosas curiosas que tiene el lenguaje JavaScript. Lo puedes ver en este enlace: «Rarezas y cosas que no sabías de JavaScript«.
Vamos a comenzar hablando de algunos secretos en las expresiones regulares. Este en concreto, apareció en la versión 1.3.
El uso que se le suele dar a la función «replace()» suele ser algo de este estilo: alert('10 13 21 48 52'.replace(/d+/g, '*')); //reemplaza todos los números por *
. Se trata de una forma simple de usarlo, pero ¿qué pasaría si quisiéramos tener más control? ¿Qué pasaría si, por ejemplo, quisiéramos reemplazar solo los números menores de 20? Necesitamos saltar a una función de devolución de llamada para evaluar cada coincidencia.
alert('10 13 21 48 52'.replace(/d+/g, function(match) { return parseInt(match) 20 ? '*' : match;}));
Para cada coincidencia realizada, JavaScript llama a nuestra función y pasa la coincidencia a nuestro argumento de coincidencia. Luego, devolvemos el asterisco (si el número coincidente es inferior a 20) o la coincidencia misma (es decir, no debería realizarse ninguna coincidencia).
Otra función que es desconocida por mucha gente es la función «test()». Seguro que has usado expresiones regulares para buscar coincidencias en cadenas de texto. Y seguro que las funciones que has utilizado son «match» y «replace«, ya que solo con esas dos ya resuelves una gran parte de tus problemas. La función «test» funciona igual que «match» pero en lugar de devolver la coincidencia, devuelve true o false en caso de que el patrón coincida o no lo haga. Ejemplo: /w{3,}/.test('Hello')
–> devuelve ‘true’.
Finalmente destacar la función «RegExp» que permite utilizar expresiones regulares de forma dinámica, es decir, permite pasar una variable que contenga la expresión regular, en lugar de tener que declararla con la forma corta (entre barras diagonales, como en el ejemplo anterior).
function findWord(word, string) { var instancesOfWord = string.match(new RegExp('b'+word+'b', 'ig')); alert(instancesOfWord);}findWord('car', 'Carl went to buy a car but had forgotten his credit card.');
Debido a que se especifican como cadenas, no mediante sintaxis de barra diagonal, podemos usar variables para crear el patrón. Sin embargo, esto también significa que debemos aplicar doble escape a cualquier carácter especial, como hicimos con el carácter de límite de palabra.
Este problema no es exclusivo de JavaScript; de hecho, es una peculiaridad común en la informática que afecta a muchos lenguajes. La salida que obtienes al hacer esto 0.1 + 0.2
es 0.30000000000000004
.
Esto está relacionado con lo que se conoce como la precisión de las máquinas. Cuando JavaScript intenta ejecutar la operación anterior, convierte los valores a sus equivalentes binarios.
Aquí es donde surge el problema: el valor 0.1
no es exactamente 0.1
, sino una aproximación binaria cercana. En resumen, tan pronto como ingresas estos valores, ya están destinados a perder algo de precisión. Quizás esperabas dos decimales simples, pero lo que obtienes es el resultado de una aritmética binaria de punto flotante. Es como intentar traducir tu texto al ruso pero recibirlo en bielorruso: parecidos, pero no iguales.
Hay más aspectos técnicos aquí, pero son complejos y exceden el alcance de este artículo.
Las soluciones a este problema son un tema frecuente en los foros de desarrollo. La elección de una solución depende del tipo de cálculos que estés realizando. Aunque no entraremos en detalle sobre los pros y contras de cada método, las opciones comunes incluyen:
Es decir, en lugar de hacer:
var num1 = 0.1, num2 = 0.2, shouldEqual = 0.3;
alert(num1 + num2 == shouldEqual); // false
Podías hacer:
alert(num1 + num2 > shouldEqual - 0.001 && num1 + num2 < shouldEqual + 0.001); // true
En esencia, estás verificando si la suma de 0.1 + 0.2
es aproximadamente 0.3
, dentro de un margen de error de 0.001
a cada lado. El inconveniente es que, para cálculos que requieren alta precisión, esta aproximación podría no ser adecuada.
Vamos a terminar con un caso curioso y aparentemente inofensivo. Aunque undefined
tiene un significado especial en JavaScript y se utiliza para determinar si una variable no está definida, sorprendentemente, no es una palabra reservada. Esto significa que puedes reasignarla, lo cual puede llevar a comportamientos inesperados. Por ejemplo:
var someVar;
alert(someVar == undefined); // evalúa como true
Hasta aquí todo parece normal. Sin embargo, considera lo siguiente:
undefined = "¡Ya no soy undefined!";
var someVar;
alert(someVar == undefined); // evalúa como false
WhatsApp se ha convertido en una de las aplicaciones de mensajería más populares del mundo, utilizada por millones de personas para comunicarse a diario. Aunque la mayoría de nosotros utilizamos sus funciones básicas, WhatsApp ofrece una variedad de trucos y características ocultas que pueden mejorar tu experiencia de usuario. En este artículo, te presentamos algunos de los trucos más útiles y menos conocidos para convertirte en un experto de WhatsApp.
¡No dudes en compartir estos trucos con tus amigos y familiares para que todos puedan disfrutar de una mejor experiencia en WhatsApp!